/ Hex Artifact Content
Login

Artifact 0cdbfd79dc896ef6ae15bf3220b9edc87e06d510:


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 30 0a  LOCKING_STYLE 0.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
0c30: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0c40: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0c50: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0c60: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0c70: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0c90: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0ca0: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0cb0: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0cc0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0cd0: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0ce0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0cf0: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d00: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0d10: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0d20: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0d30: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0d40: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0d50: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0d60: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0d70: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0d80: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0d90: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0da0: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0db0: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0dc0: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0dd0: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0de0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0df0: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e00: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0e10: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0e20: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0e30: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0e40: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0e50: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0e60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0e70: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0e80: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0e90: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0ea0: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0ec0: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0ed0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0ee0: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0ef0: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f00: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0f10: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0f20: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0f30: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0f40: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0f50: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0f60: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
0f70: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
0f80: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
0f90: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
0fa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
0fb0: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
0fc0: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
0fd0: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
0fe0: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1010: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
1020: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
1040: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
1050: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
1060: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1070: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1090: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
10a0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
10b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
10c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
10d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
10e0: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
10f0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1100: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1110: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
1130: 6e 6f 2e 68 3e 0a 0a 23 69 66 20 53 51 4c 49 54  no.h>..#if SQLIT
1140: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1150: 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64 65  _STYLE.# include
1160: 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23   <sys/ioctl.h>.#
1170: 20 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23   if OS_VXWORKS.#
1180: 20 20 69 6e 63 6c 75 64 65 20 3c 73 65 6d 61 70    include <semap
1190: 68 6f 72 65 2e 68 3e 0a 23 20 20 69 6e 63 6c 75  hore.h>.#  inclu
11a0: 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a 23 20  de <limits.h>.# 
11b0: 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75 64 65 20  else.#  include 
11c0: 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a 23 20 20  <sys/file.h>.#  
11d0: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70 61 72  include <sys/par
11e0: 61 6d 2e 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65  am.h>.#  include
11f0: 20 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23   <sys/mount.h>.#
1200: 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a   endif.#endif /*
1210: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1220: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
1230: 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f  .#ifdef __APPLE_
1240: 5f 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  _.# include <sys
1250: 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66  /mount.h>.#endif
1260: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20  ../*.** Allowed 
1270: 76 61 6c 75 65 73 20 6f 66 20 75 6e 69 78 46 69  values of unixFi
1280: 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a 23 64  le.fsFlags.*/.#d
1290: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 53 46  efine SQLITE_FSF
12a0: 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20 20 20  LAGS_IS_MSDOS   
12b0: 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    0x1../*.** If 
12c0: 77 65 20 61 72 65 20 74 6f 20 62 65 20 74 68 72  we are to be thr
12d0: 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75 64  ead-safe, includ
12e0: 65 20 74 68 65 20 70 74 68 72 65 61 64 73 20 68  e the pthreads h
12f0: 65 61 64 65 72 20 61 6e 64 20 64 65 66 69 6e 65  eader and define
1300: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 55  .** the SQLITE_U
1310: 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61 63 72  NIX_THREADS macr
1320: 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  o..*/.#if SQLITE
1330: 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e  _THREADSAFE.# in
1340: 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68  clude <pthread.h
1350: 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  >.# define SQLIT
1360: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 31  E_UNIX_THREADS 1
1370: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
1380: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
1390: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
13a0: 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23   a new file.*/.#
13b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
13c0: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
13d0: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
13e0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
13f0: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  ILE_PERMISSIONS 
1400: 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0644.#endif../*.
1410: 20 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d   ** Default perm
1420: 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65  issions when cre
1430: 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f 78 79  ating auto proxy
1440: 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e 64 65 66   dir. */.#ifndef
1450: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1460: 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
1470: 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51  IONS.# define SQ
1480: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
1490: 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
14a0: 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f  S 0755.#endif../
14b0: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70  *.** Maximum sup
14c0: 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67  ported path-leng
14d0: 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  th..*/.#define M
14e0: 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a  AX_PATHNAME 512.
14f0: 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20  ./*.** Only set 
1500: 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66  the lastErrno if
1510: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
1520: 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20  is a real error 
1530: 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f  and not .** a no
1540: 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72 65  rmal expected re
1550: 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c  turn code of SQL
1560: 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49  ITE_BUSY or SQLI
1570: 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65  TE_OK.*/.#define
1580: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78   IS_LOCK_ERROR(x
1590: 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45  )  ((x != SQLITE
15a0: 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51  _OK) && (x != SQ
15b0: 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 0a 2f 2a  LITE_BUSY)).../*
15c0: 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61  .** Sometimes, a
15d0: 66 74 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64  fter a file hand
15e0: 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20  le is closed by 
15f0: 53 51 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65  SQLite, the file
1600: 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63   descriptor.** c
1610: 61 6e 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20  annot be closed 
1620: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20  immediately. In 
1630: 74 68 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73  these cases, ins
1640: 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f  tances of the fo
1650: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63  llowing.** struc
1660: 74 75 72 65 20 61 72 65 20 75 73 65 64 20 74 6f  ture are used to
1670: 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20   store the file 
1680: 64 65 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65  descriptor while
1690: 20 77 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a   waiting for an.
16a0: 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  ** opportunity t
16b0: 6f 20 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f  o either close o
16c0: 72 20 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 74  r reuse it..*/.t
16d0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 55 6e  ypedef struct Un
16e0: 69 78 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55  ixUnusedFd UnixU
16f0: 6e 75 73 65 64 46 64 3b 0a 73 74 72 75 63 74 20  nusedFd;.struct 
1700: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 7b 0a 20  UnixUnusedFd {. 
1710: 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20   int fd;        
1720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1730: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
1740: 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e 74 20   close */.  int 
1750: 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  flags;          
1760: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
1770: 68 69 73 20 66 69 6c 65 20 64 65 73 63 72 69 70  his file descrip
1780: 74 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 77  tor was opened w
1790: 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75  ith */.  UnixUnu
17a0: 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 20 20 20  sedFd *pNext;   
17b0: 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75 73 65     /* Next unuse
17c0: 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
17d0: 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c 65 20 2a  r on same file *
17e0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  /.};../*.** The 
17f0: 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
1800: 72 65 20 69 73 20 73 75 62 63 6c 61 73 73 20 6f  re is subclass o
1810: 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  f sqlite3_file s
1820: 70 65 63 69 66 69 63 20 74 6f 20 74 68 65 20 75  pecific to the u
1830: 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d 70 6c 65  nix.** VFS imple
1840: 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 74  mentations..*/.t
1850: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
1860: 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c 65 3b  ixFile unixFile;
1870: 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65  .struct unixFile
1880: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f   {.  sqlite3_io_
1890: 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70  methods const *p
18a0: 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c 77 61  Method;  /* Alwa
18b0: 79 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  ys the first ent
18c0: 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  ry */.  struct u
18d0: 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65  nixOpenCnt *pOpe
18e0: 6e 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f  n;       /* Info
18f0: 20 61 62 6f 75 74 20 61 6c 6c 20 6f 70 65 6e 20   about all open 
1900: 66 64 27 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f  fd's on this ino
1910: 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  de */.  struct u
1920: 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f  nixLockInfo *pLo
1930: 63 6b 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f  ck;      /* Info
1940: 20 61 62 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e 20   about locks on 
1950: 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20  this inode */.  
1960: 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20 20  int h;          
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1980: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
1990: 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  criptor */.  int
19a0: 20 64 69 72 66 64 3b 20 20 20 20 20 20 20 20 20   dirfd;         
19b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19c0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
19d0: 20 66 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f   for the directo
19e0: 72 79 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ry */.  unsigned
19f0: 20 63 68 61 72 20 6c 6f 63 6b 74 79 70 65 3b 20   char locktype; 
1a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1a10: 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c  type of lock hel
1a20: 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a  d on this fd */.
1a30: 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b    int lastErrno;
1a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a50: 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20 65     /* The unix e
1a60: 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61  rrno from the la
1a70: 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a  st I/O error */.
1a80: 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43    void *lockingC
1a90: 6f 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20  ontext;         
1aa0: 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74     /* Locking st
1ab0: 79 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61  yle specific sta
1ac0: 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  te */.  UnixUnus
1ad0: 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20  edFd *pUnused;  
1ae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 2d           /* Pre-
1af0: 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69 78 55 6e  allocated UnixUn
1b00: 75 73 65 64 46 64 20 2a 2f 0a 20 20 69 6e 74 20  usedFd */.  int 
1b10: 66 69 6c 65 46 6c 61 67 73 3b 20 20 20 20 20 20  fileFlags;      
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b30: 4d 69 73 63 65 6c 6c 61 6e 6f 75 73 20 66 6c 61  Miscellanous fla
1b40: 67 73 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  gs */.#if SQLITE
1b50: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1b60: 53 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e  STYLE.  int open
1b70: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
1b80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1b90: 66 6c 61 67 73 20 73 70 65 63 69 66 69 65 64 20  flags specified 
1ba0: 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65 6e  at open() */.#en
1bb0: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
1bc0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1bd0: 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  YLE || defined(_
1be0: 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e 73 69  _APPLE__).  unsi
1bf0: 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20 20 20  gned fsFlags;   
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c10: 20 63 61 63 68 65 64 20 64 65 74 61 69 6c 73 20   cached details 
1c20: 66 72 6f 6d 20 73 74 61 74 66 73 28 29 20 2a 2f  from statfs() */
1c30: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
1c40: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
1c50: 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78   defined(__linux
1c60: 5f 5f 29 0a 20 20 70 74 68 72 65 61 64 5f 74 20  __).  pthread_t 
1c70: 74 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  tid;            
1c80: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 68         /* The th
1c90: 72 65 61 64 20 74 68 61 74 20 22 6f 77 6e 73 22  read that "owns"
1ca0: 20 74 68 69 73 20 75 6e 69 78 46 69 6c 65 20 2a   this unixFile *
1cb0: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f  /.#endif.#if OS_
1cc0: 56 58 57 4f 52 4b 53 0a 20 20 69 6e 74 20 69 73  VXWORKS.  int is
1cd0: 44 65 6c 65 74 65 3b 20 20 20 20 20 20 20 20 20  Delete;         
1ce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1cf0: 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 69 66  lete on close if
1d00: 20 74 72 75 65 20 2a 2f 0a 20 20 73 74 72 75 63   true */.  struc
1d10: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
1d20: 2a 70 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 55  *pId;       /* U
1d30: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 2a 2f  nique file ID */
1d40: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
1d50: 4e 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  NDEBUG.  /* The 
1d60: 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61  next group of va
1d70: 72 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64  riables are used
1d80: 20 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65   to track whethe
1d90: 72 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a  r or not the.  *
1da0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
1db0: 75 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32  unter in bytes 2
1dc0: 34 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65  4-27 of database
1dd0: 20 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74   files are updat
1de0: 65 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72  ed.  ** whenever
1df0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
1e00: 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
1e10: 73 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e  s.  An assertion
1e20: 20 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a   fault will.  **
1e30: 20 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65   occur if a file
1e40: 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68   is updated with
1e50: 6f 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e  out also updatin
1e60: 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  g the transactio
1e70: 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20  n.  ** counter. 
1e80: 20 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61   This test is ma
1e90: 64 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20  de to avoid new 
1ea0: 70 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72  problems similar
1eb0: 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65   to the.  ** one
1ec0: 20 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69   described by ti
1ed0: 63 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a  cket #3584. .  *
1ee0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1ef0: 72 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b  r transCntrChng;
1f00: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1f10: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
1f20: 75 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f  unter changed */
1f30: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1f40: 20 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20   dbUpdate;      
1f50: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79    /* True if any
1f60: 20 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73   part of databas
1f70: 65 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a  e file changed *
1f80: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1f90: 72 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b  r inNormalWrite;
1fa0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e     /* True if in
1fb0: 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20   a normal write 
1fc0: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 23 65 6e  operation */.#en
1fd0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
1fe0: 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74  E_TEST.  /* In t
1ff0: 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61  est mode, increa
2000: 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
2010: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61 20  his structure a 
2020: 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20 2a  bit so that .  *
2030: 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20 74  * it is larger t
2040: 68 61 6e 20 74 68 65 20 73 74 72 75 63 74 20 43  han the struct C
2050: 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65 64  rashFile defined
2060: 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a   in test6.c..  *
2070: 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64 69 6e  /.  char aPaddin
2080: 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b  g[32];.#endif.};
2090: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
20a0: 6f 77 69 6e 67 20 6d 61 63 72 6f 73 20 64 65 66  owing macros def
20b0: 69 6e 65 20 62 69 74 73 20 69 6e 20 75 6e 69 78  ine bits in unix
20c0: 46 69 6c 65 2e 66 69 6c 65 46 6c 61 67 73 0a 2a  File.fileFlags.*
20d0: 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  /.#define SQLITE
20e0: 5f 57 48 4f 4c 45 5f 46 49 4c 45 5f 4c 4f 43 4b  _WHOLE_FILE_LOCK
20f0: 49 4e 47 20 20 30 78 30 30 30 31 20 20 20 2f 2a  ING  0x0001   /*
2100: 20 55 73 65 20 77 68 6f 6c 65 2d 66 69 6c 65 20   Use whole-file 
2110: 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a  locking */../*.*
2120: 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74  * Include code t
2130: 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  hat is common to
2140: 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65   all os_*.c file
2150: 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f  s.*/.#include "o
2160: 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a  s_common.h"../*.
2170: 2a 2a 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75  ** Define variou
2180: 73 20 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72  s macros that ar
2190: 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73  e missing from s
21a0: 6f 6d 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a  ome systems..*/.
21b0: 23 69 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46  #ifndef O_LARGEF
21c0: 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c  ILE.# define O_L
21d0: 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69  ARGEFILE 0.#endi
21e0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
21f0: 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e  DISABLE_LFS.# un
2200: 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a  def O_LARGEFILE.
2210: 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45  # define O_LARGE
2220: 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69  FILE 0.#endif.#i
2230: 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57  fndef O_NOFOLLOW
2240: 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f  .# define O_NOFO
2250: 4c 4c 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69  LLOW 0.#endif.#i
2260: 66 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23  fndef O_BINARY.#
2270: 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59   define O_BINARY
2280: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
2290: 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69   The DJGPP compi
22a0: 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  ler environment 
22b0: 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b  looks mostly lik
22c0: 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a  e Unix, but it.*
22d0: 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74  * lacks the fcnt
22e0: 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  l() system call.
22f0: 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63    So redefine fc
2300: 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65  ntl() to be some
2310: 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c  thing.** that al
2320: 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 20  ways succeeds.  
2330: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
2340: 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74  locking does not
2350: 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20   occur under.** 
2360: 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20 69  DJGPP.  But it i
2370: 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64  s DOS - what did
2380: 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a   you expect?.*/.
2390: 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f  #ifdef __DJGPP__
23a0: 0a 23 20 64 65 66 69 6e 65 20 66 63 6e 74 6c 28  .# define fcntl(
23b0: 41 2c 42 2c 43 29 20 30 0a 23 65 6e 64 69 66 0a  A,B,C) 0.#endif.
23c0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61  ./*.** The threa
23d0: 64 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76  did macro resolv
23e0: 65 73 20 74 6f 20 74 68 65 20 74 68 72 65 61 64  es to the thread
23f0: 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73  -id or to 0.  Us
2400: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
2410: 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
2420: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  only..*/.#if SQL
2430: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23  ITE_THREADSAFE.#
2440: 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20  define threadid 
2450: 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23  pthread_self().#
2460: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72  else.#define thr
2470: 65 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a  eadid 0.#endif..
2480: 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
2490: 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69  nctions to obtai
24a0: 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68  n and relinquish
24b0: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
24c0: 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c  x. The.** global
24d0: 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74   mutex is used t
24e0: 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e  o protect the un
24f0: 69 78 4f 70 65 6e 43 6e 74 2c 20 75 6e 69 78 4c  ixOpenCnt, unixL
2500: 6f 63 6b 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76  ockInfo and.** v
2510: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
2520: 65 63 74 73 20 75 73 65 64 20 62 79 20 74 68 69  ects used by thi
2530: 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77  s file, all of w
2540: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
2550: 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70  shared by multip
2560: 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a  le threads..**.*
2570: 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d  * Function unixM
2580: 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73  utexHeld() is us
2590: 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  ed to assert() t
25a0: 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  hat the global m
25b0: 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64  utex .** is held
25c0: 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20   when required. 
25d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
25e0: 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61   only used as pa
25f0: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a  rt of assert() .
2600: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65  ** statements. e
2610: 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78  .g..**.**   unix
2620: 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20  EnterMutex().** 
2630: 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 78      assert( unix
2640: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a  MutexHeld() );.*
2650: 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4c 65 61  *   unixEnterLea
2660: 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ve().*/.static v
2670: 6f 69 64 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  oid unixEnterMut
2680: 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
2690: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
26a0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
26b0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
26c0: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
26d0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  }.static void un
26e0: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69  ixLeaveMutex(voi
26f0: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
2700: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
2710: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
2720: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
2730: 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64  MASTER));.}.#ifd
2740: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2750: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d  static int unixM
2760: 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b  utexHeld(void) {
2770: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2780: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c  3_mutex_held(sql
2790: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
27a0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
27b0: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23  IC_MASTER));.}.#
27c0: 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53  endif...#ifdef S
27d0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
27e0: 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
27f0: 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f  n for printing o
2800: 75 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61  ut trace informa
2810: 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67  tion from debugg
2820: 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e  ing.** binaries.
2830: 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68   This returns th
2840: 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  e string represe
2850: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  tation of the su
2860: 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65  pplied.** intege
2870: 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a  r lock-type..*/.
2880: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
2890: 72 20 2a 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28  r *locktypeName(
28a0: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
28b0: 20 73 77 69 74 63 68 28 20 6c 6f 63 6b 74 79 70   switch( locktyp
28c0: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f  e ){.    case NO
28d0: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e  _LOCK: return "N
28e0: 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53  ONE";.    case S
28f0: 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75  HARED_LOCK: retu
2900: 72 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20  rn "SHARED";.   
2910: 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c   case RESERVED_L
2920: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53  OCK: return "RES
2930: 45 52 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65  ERVED";.    case
2940: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72   PENDING_LOCK: r
2950: 65 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b  eturn "PENDING";
2960: 0a 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53  .    case EXCLUS
2970: 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  IVE_LOCK: return
2980: 20 22 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20   "EXCLUSIVE";.  
2990: 7d 0a 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f  }.  return "ERRO
29a0: 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  R";.}.#endif..#i
29b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  fdef SQLITE_LOCK
29c0: 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69  _TRACE./*.** Pri
29d0: 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69  nt out informati
29e0: 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63  on about all loc
29f0: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e  king operations.
2a00: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2a10: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
2a20: 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20  troubleshooting 
2a30: 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68  locks on multith
2a40: 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f  readed.** platfo
2a50: 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20  rms.  Enable by 
2a60: 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74  compiling with t
2a70: 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b  he -DSQLITE_LOCK
2a80: 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e  _TRACE.** comman
2a90: 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e  d-line option on
2aa0: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20   the compiler.  
2ab0: 54 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72  This code is nor
2ac0: 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20  mally.** turned 
2ad0: 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  off..*/.static i
2ae0: 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74  nt lockTrace(int
2af0: 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72   fd, int op, str
2b00: 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20  uct flock *p){. 
2b10: 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20   char *zOpName, 
2b20: 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b  *zType;.  int s;
2b30: 0a 20 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e  .  int savedErrn
2b40: 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47  o;.  if( op==F_G
2b50: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
2b60: 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20  ame = "GETLK";. 
2b70: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46   }else if( op==F
2b80: 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f  _SETLK ){.    zO
2b90: 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b  pName = "SETLK";
2ba0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20  .  }else{.    s 
2bb0: 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20  = fcntl(fd, op, 
2bc0: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
2bd0: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
2be0: 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20  l unknown %d %d 
2bf0: 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73  %d\n", fd, op, s
2c00: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b  );.    return s;
2c10: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f  .  }.  if( p->l_
2c20: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  type==F_RDLCK ){
2c30: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44  .    zType = "RD
2c40: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  LCK";.  }else if
2c50: 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57  ( p->l_type==F_W
2c60: 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70  RLCK ){.    zTyp
2c70: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d  e = "WRLCK";.  }
2c80: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79  else if( p->l_ty
2c90: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
2ca0: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
2cb0: 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K";.  }else{.   
2cc0: 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20   assert( 0 );.  
2cd0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  }.  assert( p->l
2ce0: 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45  _whence==SEEK_SE
2cf0: 54 20 29 3b 0a 20 20 73 20 3d 20 66 63 6e 74 6c  T );.  s = fcntl
2d00: 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73  (fd, op, p);.  s
2d10: 61 76 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e  avedErrno = errn
2d20: 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  o;.  sqlite3Debu
2d30: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25  gPrintf("fcntl %
2d40: 64 20 25 64 20 25 73 20 25 73 20 25 64 20 25 64  d %d %s %s %d %d
2d50: 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20   %d %d\n",.     
2d60: 74 68 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f  threadid, fd, zO
2d70: 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69  pName, zType, (i
2d80: 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28  nt)p->l_start, (
2d90: 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20  int)p->l_len,.  
2da0: 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64     (int)p->l_pid
2db0: 2c 20 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28  , s);.  if( s==(
2dc0: 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54  -1) && op==F_SET
2dd0: 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65  LK && (p->l_type
2de0: 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e  ==F_RDLCK || p->
2df0: 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29  l_type==F_WRLCK)
2e00: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66   ){.    struct f
2e10: 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20  lock l2;.    l2 
2e20: 3d 20 2a 70 3b 0a 20 20 20 20 66 63 6e 74 6c 28  = *p;.    fcntl(
2e30: 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32  fd, F_GETLK, &l2
2e40: 29 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f  );.    if( l2.l_
2e50: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  type==F_RDLCK ){
2e60: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
2e70: 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  RDLCK";.    }els
2e80: 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d  e if( l2.l_type=
2e90: 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_WRLCK ){.    
2ea0: 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b    zType = "WRLCK
2eb0: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ";.    }else if(
2ec0: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e   l2.l_type==F_UN
2ed0: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
2ee0: 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20  pe = "UNLCK";.  
2ef0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
2f00: 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20  ssert( 0 );.    
2f10: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
2f20: 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d  ugPrintf("fcntl-
2f30: 66 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20  failure-reason: 
2f40: 25 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a  %s %d %d %d\n",.
2f50: 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69         zType, (i
2f60: 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28  nt)l2.l_start, (
2f70: 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69  int)l2.l_len, (i
2f80: 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20  nt)l2.l_pid);.  
2f90: 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65  }.  errno = save
2fa0: 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e  dErrno;.  return
2fb0: 20 73 3b 0a 7d 0a 23 64 65 66 69 6e 65 20 66 63   s;.}.#define fc
2fc0: 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65  ntl lockTrace.#e
2fd0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c  ndif /* SQLITE_L
2fe0: 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 0a 0a  OCK_TRACE */....
2ff0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
3000: 6e 65 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20  ne translates a 
3010: 73 74 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65  standard POSIX e
3020: 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73  rrno code into s
3030: 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66  omething.** usef
3040: 75 6c 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74  ul to the client
3050: 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  s of the sqlite3
3060: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65   functions.  Spe
3070: 63 69 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73  cifically, it is
3080: 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20  .** intended to 
3090: 74 72 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69  translate a vari
30a0: 65 74 79 20 6f 66 20 22 74 72 79 20 61 67 61 69  ety of "try agai
30b0: 6e 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53  n" errors into S
30c0: 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e  QLITE_BUSY.** an
30d0: 64 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22  d a variety of "
30e0: 70 6c 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65  please close the
30f0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
3100: 20 4e 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74   NOW" errors int
3110: 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45  o .** SQLITE_IOE
3120: 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73  RR.** .** Errors
3130: 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69   during initiali
3140: 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c  zation of locks,
3150: 20 6f 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20   or file system 
3160: 73 75 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b  support for lock
3170: 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e  s,.** should han
3180: 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54  dle ENOLCK, ENOT
3190: 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20  SUP, EOPNOTSUPP 
31a0: 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73  separately..*/.s
31b0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
31c0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
31d0: 72 6f 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72  ror(int posixErr
31e0: 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f  or, int sqliteIO
31f0: 45 72 72 29 20 7b 0a 20 20 73 77 69 74 63 68 20  Err) {.  switch 
3200: 28 70 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a 20  (posixError) {. 
3210: 20 63 61 73 65 20 30 3a 20 0a 20 20 20 20 72 65   case 0: .    re
3220: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
3230: 20 20 20 20 0a 20 20 63 61 73 65 20 45 41 47 41      .  case EAGA
3240: 49 4e 3a 0a 20 20 63 61 73 65 20 45 54 49 4d 45  IN:.  case ETIME
3250: 44 4f 55 54 3a 0a 20 20 63 61 73 65 20 45 42 55  DOUT:.  case EBU
3260: 53 59 3a 0a 20 20 63 61 73 65 20 45 49 4e 54 52  SY:.  case EINTR
3270: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a  :.  case ENOLCK:
3280: 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d    .    /* random
3290: 20 4e 46 53 20 72 65 74 72 79 20 65 72 72 6f 72   NFS retry error
32a0: 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20  , unless during 
32b0: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
32c0: 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72  ort .     * intr
32d0: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
32e0: 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20  ich it actually 
32f0: 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61  means what it sa
3300: 79 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ys */.    return
3310: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
3320: 20 20 0a 20 20 63 61 73 65 20 45 41 43 43 45 53    .  case EACCES
3330: 3a 20 0a 20 20 20 20 2f 2a 20 45 41 43 43 45 53  : .    /* EACCES
3340: 20 69 73 20 6c 69 6b 65 20 45 41 47 41 49 4e 20   is like EAGAIN 
3350: 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f  during locking o
3360: 70 65 72 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e  perations, but n
3370: 6f 74 20 61 6e 79 20 6f 74 68 65 72 20 74 69 6d  ot any other tim
3380: 65 2a 2f 0a 20 20 20 20 69 66 28 20 28 73 71 6c  e*/.    if( (sql
3390: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
33a0: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c  TE_IOERR_LOCK) |
33b0: 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72  | ..(sqliteIOErr
33c0: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
33d0: 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73  _UNLOCK) || ..(s
33e0: 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51  qliteIOErr == SQ
33f0: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
3400: 4b 29 20 7c 7c 0a 09 28 73 71 6c 69 74 65 49 4f  K) ||..(sqliteIO
3410: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
3420: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
3430: 44 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20  DLOCK) ){.      
3440: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
3450: 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  SY;.    }.    /*
3460: 20 65 6c 73 65 20 66 61 6c 6c 20 74 68 72 6f 75   else fall throu
3470: 67 68 20 2a 2f 0a 20 20 63 61 73 65 20 45 50 45  gh */.  case EPE
3480: 52 4d 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20  RM: .    return 
3490: 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20  SQLITE_PERM;.   
34a0: 20 0a 20 20 63 61 73 65 20 45 44 45 41 44 4c 4b   .  case EDEADLK
34b0: 3a 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  :.    return SQL
34c0: 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
34d0: 44 3b 0a 20 20 20 20 0a 23 69 66 20 45 4f 50 4e  D;.    .#if EOPN
34e0: 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53 55 50 0a  OTSUPP!=ENOTSUP.
34f0: 20 20 63 61 73 65 20 45 4f 50 4e 4f 54 53 55 50    case EOPNOTSUP
3500: 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f 6d 65 74  P: .    /* somet
3510: 68 69 6e 67 20 77 65 6e 74 20 74 65 72 72 69 62  hing went terrib
3520: 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65 73 73 20  ly awry, unless 
3530: 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74  during file syst
3540: 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20  em support .    
3550: 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e   * introspection
3560: 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63  , in which it ac
3570: 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61  tually means wha
3580: 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e  t it says */.#en
3590: 64 69 66 0a 23 69 66 64 65 66 20 45 4e 4f 54 53  dif.#ifdef ENOTS
35a0: 55 50 0a 20 20 63 61 73 65 20 45 4e 4f 54 53 55  UP.  case ENOTSU
35b0: 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e 76 61 6c  P: .    /* inval
35c0: 69 64 20 66 64 2c 20 75 6e 6c 65 73 73 20 64 75  id fd, unless du
35d0: 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d  ring file system
35e0: 20 73 75 70 70 6f 72 74 20 69 6e 74 72 6f 73 70   support introsp
35f0: 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68  ection, in which
3600: 20 0a 20 20 20 20 20 2a 20 69 74 20 61 63 74 75   .     * it actu
3610: 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20  ally means what 
3620: 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69  it says */.#endi
3630: 66 0a 20 20 63 61 73 65 20 45 49 4f 3a 0a 20 20  f.  case EIO:.  
3640: 63 61 73 65 20 45 42 41 44 46 3a 0a 20 20 63 61  case EBADF:.  ca
3650: 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20 63 61 73  se EINVAL:.  cas
3660: 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20 20 63 61  e ENOTCONN:.  ca
3670: 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20 63 61 73  se ENODEV:.  cas
3680: 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61 73 65 20  e ENXIO:.  case 
3690: 45 4e 4f 45 4e 54 3a 0a 20 20 63 61 73 65 20 45  ENOENT:.  case E
36a0: 53 54 41 4c 45 3a 0a 20 20 63 61 73 65 20 45 4e  STALE:.  case EN
36b0: 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65  OSYS:.    /* the
36c0: 73 65 20 73 68 6f 75 6c 64 20 66 6f 72 63 65 20  se should force 
36d0: 74 68 65 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c  the client to cl
36e0: 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61 6e 64  ose the file and
36f0: 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20   reconnect */.  
3700: 20 20 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a 20    .  default: . 
3710: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
3720: 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a  IOErr;.  }.}....
3730: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
3740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
3780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3790: 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71 75 65 20  ** Begin Unique 
37a0: 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20  File ID Utility 
37b0: 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20  Used By VxWorks 
37c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
37d0: 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65  **.** On most ve
37e0: 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20  rsions of unix, 
37f0: 77 65 20 63 61 6e 20 67 65 74 20 61 20 75 6e 69  we can get a uni
3800: 71 75 65 20 49 44 20 66 6f 72 20 61 20 66 69 6c  que ID for a fil
3810: 65 20 62 79 20 63 6f 6e 63 61 74 65 6e 61 74 69  e by concatenati
3820: 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76 69 63 65  ng.** the device
3830: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
3840: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 42  inode number.  B
3850: 75 74 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  ut this does not
3860: 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73   work on VxWorks
3870: 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c  ..** On VxWorks,
3880: 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 69   a unique file i
3890: 64 20 6d 75 73 74 20 62 65 20 62 61 73 65 64 20  d must be based 
38a0: 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  on the canonical
38b0: 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a   filename..**.**
38c0: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   A pointer to an
38d0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
38e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
38f0: 74 75 72 65 20 63 61 6e 20 62 65 20 75 73 65 64  ture can be used
3900: 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20   as a.** unique 
3910: 66 69 6c 65 20 49 44 20 69 6e 20 56 78 57 6f 72  file ID in VxWor
3920: 6b 73 2e 20 20 45 61 63 68 20 69 6e 73 74 61 6e  ks.  Each instan
3930: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
3940: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  ture contains.**
3950: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
3960: 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d  anonical filenam
3970: 65 2e 20 20 54 68 65 72 65 20 69 73 20 61 6c 73  e.  There is als
3980: 6f 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f  o a reference co
3990: 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74  unt.  .** The st
39a0: 72 75 63 74 75 72 65 20 69 73 20 72 65 63 6c 61  ructure is recla
39b0: 69 6d 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75  imed when the nu
39c0: 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73  mber of pointers
39d0: 20 74 6f 20 69 74 20 64 72 6f 70 73 20 74 6f 0a   to it drops to.
39e0: 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54  ** zero..**.** T
39f0: 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20 76  here are never v
3a00: 65 72 79 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f  ery many files o
3a10: 70 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65 20  pen at one time 
3a20: 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20  and lookups are 
3a30: 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d  not.** a perform
3a40: 61 6e 63 65 2d 63 72 69 74 69 63 61 6c 20 70 61  ance-critical pa
3a50: 74 68 2c 20 73 6f 20 69 74 20 69 73 20 73 75 66  th, so it is suf
3a60: 66 69 63 69 65 6e 74 20 74 6f 20 70 75 74 20 74  ficient to put t
3a70: 68 65 73 65 0a 2a 2a 20 73 74 72 75 63 74 75 72  hese.** structur
3a80: 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c  es on a linked l
3a90: 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76  ist..*/.struct v
3aa0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20  xworksFileId {. 
3ab0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
3ac0: 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f  ileId *pNext;  /
3ad0: 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c 69 73 74  * Next in a list
3ae0: 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a   of them all */.
3af0: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
3b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b10: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66  /* Number of ref
3b20: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20  erences to this 
3b30: 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  one */.  int nNa
3b40: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
3b50: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
3b60: 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63   of the zCanonic
3b70: 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20  alName[] string 
3b80: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f  */.  char *zCano
3b90: 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20  nicalName;      
3ba0: 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20     /* Canonical 
3bb0: 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a  filename */.};..
3bc0: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f  #if OS_VXWORKS./
3bd0: 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65  * .** All unique
3be0: 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 68   filenames are h
3bf0: 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20  eld on a linked 
3c00: 6c 69 73 74 20 68 65 61 64 65 64 20 62 79 20 74  list headed by t
3c10: 68 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a  his.** variable:
3c20: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
3c30: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
3c40: 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74  *vxworksFileList
3c50: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d   = 0;../*.** Sim
3c60: 70 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d 65  plify a filename
3c70: 20 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69   into its canoni
3c80: 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d  cal form.** by m
3c90: 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  aking the follow
3ca0: 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a  ing changes:.**.
3cb0: 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61  **  * removing a
3cc0: 6e 79 20 74 72 61 69 6c 69 6e 67 20 61 6e 64 20  ny trailing and 
3cd0: 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20  duplicate /.**  
3ce0: 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e  * convert /./ in
3cf0: 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20  to just /.**  * 
3d00: 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77  convert /A/../ w
3d10: 68 65 72 65 20 41 20 69 73 20 61 6e 79 20 73 69  here A is any si
3d20: 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a  mple name into j
3d30: 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e  ust /.**.** Chan
3d40: 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 6e 2d  ges are made in-
3d50: 70 6c 61 63 65 2e 20 20 52 65 74 75 72 6e 20 74  place.  Return t
3d60: 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67  he new name leng
3d70: 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72  th..**.** The or
3d80: 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  iginal filename 
3d90: 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e  is in z[0..n-1].
3da0: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
3db0: 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63  ber of.** charac
3dc0: 74 65 72 73 20 69 6e 20 74 68 65 20 73 69 6d 70  ters in the simp
3dd0: 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a  lified name..*/.
3de0: 73 74 61 74 69 63 20 69 6e 74 20 76 78 77 6f 72  static int vxwor
3df0: 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63  ksSimplifyName(c
3e00: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
3e10: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68    int i, j;.  wh
3e20: 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d  ile( n>1 && z[n-
3e30: 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20  1]=='/' ){ n--; 
3e40: 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  }.  for(i=j=0; i
3e50: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <n; i++){.    if
3e60: 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20  ( z[i]=='/' ){. 
3e70: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
3e80: 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ='/' ) continue;
3e90: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31  .      if( z[i+1
3ea0: 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20  ]=='.' && i+2<n 
3eb0: 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29  && z[i+2]=='/' )
3ec0: 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 31  {.        i += 1
3ed0: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
3ee0: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
3ef0: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e    if( z[i+1]=='.
3f00: 27 20 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b  ' && i+3<n && z[
3f10: 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69  i+2]=='.' && z[i
3f20: 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  +3]=='/' ){.    
3f30: 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26      while( j>0 &
3f40: 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b  & z[j-1]!='/' ){
3f50: 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20   j--; }.        
3f60: 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20  if( j>0 ){ j--; 
3f70: 7d 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32  }.        i += 2
3f80: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
3f90: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
3fa0: 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a  }.    z[j++] = z
3fb0: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20  [i];.  }.  z[j] 
3fc0: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b  = 0;.  return j;
3fd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
3fe0: 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   unique file ID 
3ff0: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 61 62  for the given ab
4000: 73 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65 2e  solute pathname.
4010: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f    Return.** a po
4020: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 76 78 77  inter to the vxw
4030: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
4040: 74 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 65 72  t.  This pointer
4050: 20 69 73 20 74 68 65 20 75 6e 69 71 75 65 0a 2a   is the unique.*
4060: 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a  * file ID..**.**
4070: 20 54 68 65 20 6e 52 65 66 20 66 69 65 6c 64 20   The nRef field 
4080: 6f 66 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69  of the vxworksFi
4090: 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 69  leId object is i
40a0: 6e 63 72 65 6d 65 6e 74 65 64 20 62 65 66 6f 72  ncremented befor
40b0: 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20  e.** the object 
40c0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20  is returned.  A 
40d0: 6e 65 77 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  new vxworksFileI
40e0: 64 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  d object is crea
40f0: 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64  ted.** and added
4100: 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c   to the global l
4110: 69 73 74 20 69 66 20 6e 65 63 65 73 73 61 72 79  ist if necessary
4120: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
4130: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
4140: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
4150: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
4160: 74 69 63 20 73 74 72 75 63 74 20 76 78 77 6f 72  tic struct vxwor
4170: 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b  ksFileId *vxwork
4180: 73 46 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73  sFindFileId(cons
4190: 74 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74  t char *zAbsolut
41a0: 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75 63 74  eName){.  struct
41b0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
41c0: 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 2f 2a  pNew;         /*
41d0: 20 73 65 61 72 63 68 20 6b 65 79 20 61 6e 64 20   search key and 
41e0: 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20  new file ID */. 
41f0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
4200: 69 6c 65 49 64 20 2a 70 43 61 6e 64 69 64 61 74  ileId *pCandidat
4210: 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  e;   /* For loop
4220: 69 6e 67 20 6f 76 65 72 20 65 78 69 73 74 69 6e  ing over existin
4230: 67 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20  g file IDs */.  
4240: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
4250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4260: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
4270: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73   zAbsoluteName s
4280: 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65  tring */..  asse
4290: 72 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  rt( zAbsoluteNam
42a0: 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e  e[0]=='/' );.  n
42b0: 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
42c0: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20  AbsoluteName);. 
42d0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   pNew = sqlite3_
42e0: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
42f0: 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b  pNew) + (n+1) );
4300: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
4310: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
4320: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
4330: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  e = (char*)&pNew
4340: 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e  [1];.  memcpy(pN
4350: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
4360: 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  me, zAbsoluteNam
4370: 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76  e, n+1);.  n = v
4380: 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61  xworksSimplifyNa
4390: 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  me(pNew->zCanoni
43a0: 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20  calName, n);..  
43b0: 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e  /* Search for an
43c0: 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20   existing entry 
43d0: 74 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74 68  that matching th
43e0: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65  e canonical name
43f0: 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c  ..  ** If found,
4400: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   increment the r
4410: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 61  eference count a
4420: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
4430: 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ter to.  ** the 
4440: 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44  existing file ID
4450: 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  ..  */.  unixEnt
4460: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72  erMutex();.  for
4470: 28 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77 6f  (pCandidate=vxwo
4480: 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43 61  rksFileList; pCa
4490: 6e 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69 64  ndidate; pCandid
44a0: 61 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e  ate=pCandidate->
44b0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
44c0: 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d  pCandidate->nNam
44d0: 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d 65  e==n .     && me
44e0: 6d 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65 2d  mcmp(pCandidate-
44f0: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
4500: 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61   pNew->zCanonica
4510: 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20  lName, n)==0.   
4520: 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74   ){.       sqlit
4530: 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
4540: 20 20 20 20 20 20 70 43 61 6e 64 69 64 61 74 65        pCandidate
4550: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
4560: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
4570: 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e  );.       return
4580: 20 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20 20   pCandidate;.   
4590: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20   }.  }..  /* No 
45a0: 6d 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64 2e  match was found.
45b0: 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61    We will make a
45c0: 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a   new file ID */.
45d0: 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31    pNew->nRef = 1
45e0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20  ;.  pNew->nName 
45f0: 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65  = n;.  pNew->pNe
4600: 78 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65  xt = vxworksFile
4610: 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46  List;.  vxworksF
4620: 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  ileList = pNew;.
4630: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
4640: 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  ();.  return pNe
4650: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72  w;.}../*.** Decr
4660: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
4670: 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76  nce count on a v
4680: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
4690: 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68  ect.  Free.** th
46a0: 65 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74 68  e object when th
46b0: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
46c0: 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a  t reaches zero..
46d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
46e0: 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c  xworksReleaseFil
46f0: 65 49 64 28 73 74 72 75 63 74 20 76 78 77 6f 72  eId(struct vxwor
4700: 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a  ksFileId *pId){.
4710: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
4720: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  ();.  assert( pI
4730: 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  d->nRef>0 );.  p
4740: 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  Id->nRef--;.  if
4750: 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pId->nRef==0 )
4760: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 76 78 77  {.    struct vxw
4770: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b  orksFileId **pp;
4780: 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78 77  .    for(pp=&vxw
4790: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70  orksFileList; *p
47a0: 70 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20 70  p && *pp!=pId; p
47b0: 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65  p = &((*pp)->pNe
47c0: 78 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65 72  xt)){}.    asser
47d0: 74 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20  t( *pp==pId );. 
47e0: 20 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e     *pp = pId->pN
47f0: 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ext;.    sqlite3
4800: 5f 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a  _free(pId);.  }.
4810: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
4820: 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ();.}.#endif /* 
4830: 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a  OS_VXWORKS */./*
4840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
4850: 6e 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69 6c  nd of Unique Fil
4860: 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65  e ID Utility Use
4870: 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a  d By VxWorks ***
4880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
4890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a  ************/...
48e0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
48f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
4930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69  *********** Posi
4950: 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69  x Advisory Locki
4960: 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
4970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
4980: 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76 69  **.** POSIX advi
4990: 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20 62  sory locks are b
49a0: 72 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e 2e  roken by design.
49b0: 20 20 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e    ANSI STD 1003.
49c0: 31 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74  1 (1996).** sect
49d0: 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65  ion 6.5.2.2 line
49e0: 73 20 34 38 33 20 74 68 72 6f 75 67 68 20 34 39  s 483 through 49
49f0: 30 20 73 70 65 63 69 66 79 20 74 68 61 74 20 77  0 specify that w
4a00: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a  hen a process.**
4a10: 20 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20   sets or clears 
4a20: 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65  a lock, that ope
4a30: 72 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73  ration overrides
4a40: 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73   any prior locks
4a50: 20 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73   set.** by the s
4a60: 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74  ame process.  It
4a70: 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63   does not explic
4a80: 69 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74  itly say so, but
4a90: 20 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a   this implies.**
4aa0: 20 74 68 61 74 20 69 74 20 6f 76 65 72 72 69 64   that it overrid
4ab0: 65 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20  es locks set by 
4ac0: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
4ad0: 20 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65   using a differe
4ae0: 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  nt.** file descr
4af0: 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72  iptor.  Consider
4b00: 20 74 68 69 73 20 74 65 73 74 20 63 61 73 65 3a   this test case:
4b10: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74  .**.**       int
4b20: 20 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66   fd1 = open("./f
4b30: 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f  ile1", O_RDWR|O_
4b40: 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a  CREAT, 0644);.**
4b50: 20 20 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d         int fd2 =
4b60: 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c   open("./file2",
4b70: 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c   O_RDWR|O_CREAT,
4b80: 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75   0644);.**.** Su
4b90: 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e  ppose ./file1 an
4ba0: 64 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65  d ./file2 are re
4bb0: 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69  ally the same fi
4bc0: 6c 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f  le (because.** o
4bd0: 6e 65 20 69 73 20 61 20 68 61 72 64 20 6f 72 20  ne is a hard or 
4be0: 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f  symbolic link to
4bf0: 20 74 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e   the other) then
4c00: 20 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61   if you set.** a
4c10: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
4c20: 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72   on fd1, then tr
4c30: 79 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c  y to get an excl
4c40: 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e  usive lock.** on
4c50: 20 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20   fd2, it works. 
4c60: 20 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78   I would have ex
4c70: 70 65 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e  pected the secon
4c80: 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69  d lock to.** fai
4c90: 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 61  l since there wa
4ca0: 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
4cb0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65   on the file due
4cc0: 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20   to fd1..** But 
4cd0: 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62  not so.  Since b
4ce0: 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66  oth locks came f
4cf0: 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f  rom the same pro
4d00: 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63  cess, the.** sec
4d10: 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74 68  ond overrides th
4d20: 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68  e first, even th
4d30: 6f 75 67 68 20 74 68 65 79 20 77 65 72 65 20 6f  ough they were o
4d40: 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  n different.** f
4d50: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
4d60: 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72  opened on differ
4d70: 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a  ent file names..
4d80: 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73  **.** This means
4d90: 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20   that we cannot 
4da0: 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20  use POSIX locks 
4db0: 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66  to synchronize f
4dc0: 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d  ile access.** am
4dd0: 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74 68  ong competing th
4de0: 72 65 61 64 73 20 6f 66 20 74 68 65 20 73 61 6d  reads of the sam
4df0: 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53 49  e process.  POSI
4e00: 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72  X locks will wor
4e10: 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e  k fine.** to syn
4e20: 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73 20  chronize access 
4e30: 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20 73  for threads in s
4e40: 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65  eparate processe
4e50: 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68  s, but not.** th
4e60: 72 65 61 64 73 20 77 69 74 68 69 6e 20 74 68 65  reads within the
4e70: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a   same process..*
4e80: 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f  *.** To work aro
4e90: 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c  und the problem,
4ea0: 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20 6d   SQLite has to m
4eb0: 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73  anage file locks
4ec0: 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f   internally.** o
4ed0: 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e  n its own.  When
4ee0: 65 76 65 72 20 61 20 6e 65 77 20 64 61 74 61 62  ever a new datab
4ef0: 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 77  ase is opened, w
4f00: 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20 74  e have to find t
4f10: 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 69  he.** specific i
4f20: 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74 61  node of the data
4f30: 62 61 73 65 20 66 69 6c 65 20 28 74 68 65 20 69  base file (the i
4f40: 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69 6e  node is determin
4f50: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f  ed by the.** st_
4f60: 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66  dev and st_ino f
4f70: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74 61  ields of the sta
4f80: 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  t structure that
4f90: 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20 69   fstat() fills i
4fa0: 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20  n).** and check 
4fb0: 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64  for locks alread
4fc0: 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74 68  y existing on th
4fd0: 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20  at inode.  When 
4fe0: 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65  locks are.** cre
4ff0: 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c  ated or removed,
5000: 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b   we have to look
5010: 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65   at our own inte
5020: 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74  rnal record of t
5030: 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73  he.** locks to s
5040: 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74 68  ee if another th
5050: 72 65 61 64 20 68 61 73 20 70 72 65 76 69 6f 75  read has previou
5060: 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f  sly set a lock o
5070: 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69  n that same.** i
5080: 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69  node..**.** (Asi
5090: 64 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20 69  de: The use of i
50a0: 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73 20  node numbers as 
50b0: 75 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73 20  unique IDs does 
50c0: 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f  not work on VxWo
50d0: 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f  rks..** For VxWo
50e0: 72 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20  rks, we have to 
50f0: 75 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61 74  use the alternat
5100: 69 76 65 20 75 6e 69 71 75 65 20 49 44 20 73 79  ive unique ID sy
5110: 73 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  stem based on.**
5120: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   canonical filen
5130: 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e  ame and implemen
5140: 74 65 64 20 69 6e 20 74 68 65 20 70 72 65 76 69  ted in the previ
5150: 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a  ous division.).*
5160: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
5170: 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  _file structure 
5180: 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20  for POSIX is no 
5190: 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69  longer just an i
51a0: 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64  nteger file.** d
51b0: 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69  escriptor.  It i
51c0: 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72  s now a structur
51d0: 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  e that holds the
51e0: 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a   integer file.**
51f0: 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20   descriptor and 
5200: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
5210: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
5220: 73 63 72 69 62 65 73 20 74 68 65 20 69 6e 74 65  scribes the inte
5230: 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e  rnal.** locks on
5240: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
5250: 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65  ng inode.  There
5260: 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20   is one locking 
5270: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72  structure.** per
5280: 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68   inode, so if th
5290: 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20  e same inode is 
52a0: 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f  opened twice, bo
52b0: 74 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  th unixFile stru
52c0: 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20  ctures.** point 
52d0: 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b  to the same lock
52e0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20  ing structure.  
52f0: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  The locking stru
5300: 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61  cture keeps.** a
5310: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
5320: 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f   (so we will kno
5330: 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65  w when to delete
5340: 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22   it) and a "cnt"
5350: 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74  .** field that t
5360: 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65  ells us its inte
5370: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73  rnal lock status
5380: 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20  .  cnt==0 means 
5390: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75  the.** file is u
53a0: 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d  nlocked.  cnt==-
53b0: 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65  1 means the file
53c0: 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76   has an exclusiv
53d0: 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30  e lock..** cnt>0
53e0: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65   means there are
53f0: 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   cnt shared lock
5400: 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a  s on the file..*
5410: 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74  *.** Any attempt
5420: 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f   to lock or unlo
5430: 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20  ck a file first 
5440: 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69  checks the locki
5450: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  ng.** structure.
5460: 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79    The fcntl() sy
5470: 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c  stem call is onl
5480: 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74  y invoked to set
5490: 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63   a .** POSIX loc
54a0: 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61  k if the interna
54b0: 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65  l lock structure
54c0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74   transitions bet
54d0: 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64  ween.** a locked
54e0: 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64   and an unlocked
54f0: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75   state..**.** Bu
5500: 74 20 77 61 69 74 3a 20 20 74 68 65 72 65 20 61  t wait:  there a
5510: 72 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f 62  re yet more prob
5520: 6c 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58 20  lems with POSIX 
5530: 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a  advisory locks..
5540: 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f  **.** If you clo
5550: 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  se a file descri
5560: 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73  ptor that points
5570: 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20   to a file that 
5580: 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c  has locks,.** al
5590: 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20  l locks on that 
55a0: 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77  file that are ow
55b0: 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65  ned by the curre
55c0: 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a  nt process are.*
55d0: 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20  * released.  To 
55e0: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
55f0: 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75   problem, each u
5600: 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
5610: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20  e contains.** a 
5620: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 75 6e  pointer to an un
5630: 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  ixOpenCnt struct
5640: 75 72 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f  ure.  There is o
5650: 6e 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73  ne unixOpenCnt s
5660: 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20  tructure.** per 
5670: 6f 70 65 6e 20 69 6e 6f 64 65 2c 20 77 68 69 63  open inode, whic
5680: 68 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 75 6c  h means that mul
5690: 74 69 70 6c 65 20 75 6e 69 78 46 69 6c 65 20 63  tiple unixFile c
56a0: 61 6e 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69  an point to a si
56b0: 6e 67 6c 65 0a 2a 2a 20 75 6e 69 78 4f 70 65 6e  ngle.** unixOpen
56c0: 43 6e 74 2e 20 20 57 68 65 6e 20 61 6e 20 61 74  Cnt.  When an at
56d0: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
56e0: 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69   close an unixFi
56f0: 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  le, if there are
5700: 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69  .** other unixFi
5710: 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  le open on the s
5720: 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61  ame inode that a
5730: 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73  re holding locks
5740: 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f  , the call.** to
5750: 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c   close() the fil
5760: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
5770: 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61  deferred until a
5780: 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20  ll of the locks 
5790: 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e  clear..** The un
57a0: 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  ixOpenCnt struct
57b0: 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74  ure keeps a list
57c0: 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70   of file descrip
57d0: 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
57e0: 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61  o.** be closed a
57f0: 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69 73 20  nd that list is 
5800: 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61  walked (and clea
5810: 72 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61  red) when the la
5820: 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72  st lock.** clear
5830: 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f  s..**.** Yet ano
5840: 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c  ther problem:  L
5850: 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f 20 6e  inuxThreads do n
5860: 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69 74  ot play well wit
5870: 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a  h posix locks..*
5880: 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20  *.** Many older 
5890: 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75  versions of linu
58a0: 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75 78 54  x use the LinuxT
58b0: 68 72 65 61 64 73 20 6c 69 62 72 61 72 79 20 77  hreads library w
58c0: 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70  hich is.** not p
58d0: 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20  osix compliant. 
58e0: 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68 72 65   Under LinuxThre
58f0: 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61  ads, a lock crea
5900: 74 65 64 20 62 79 20 74 68 72 65 61 64 0a 2a 2a  ted by thread.**
5910: 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64   A cannot be mod
5920: 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72 69 64  ified or overrid
5930: 64 65 6e 20 62 79 20 61 20 64 69 66 66 65 72 65  den by a differe
5940: 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20  nt thread B..** 
5950: 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20 63 61  Only thread A ca
5960: 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f 63  n modify the loc
5970: 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61  k.  Locking beha
5980: 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63 74 0a  vior is correct.
5990: 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69 61  ** if the applia
59a0: 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e 65  tion uses the ne
59b0: 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69 78  wer Native Posix
59c0: 20 54 68 72 65 61 64 20 4c 69 62 72 61 72 79 20   Thread Library 
59d0: 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e  (NPTL).** on lin
59e0: 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20 61  ux - with NPTL a
59f0: 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79   lock created by
5a00: 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76   thread A can ov
5a10: 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20  erride locks.** 
5a20: 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42 75  in thread B.  Bu
5a30: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  t there is no wa
5a40: 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d  y to know at com
5a50: 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68 0a  pile-time which.
5a60: 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c 69 62  ** threading lib
5a70: 72 61 72 79 20 69 73 20 62 65 69 6e 67 20 75 73  rary is being us
5a80: 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73  ed.  So there is
5a90: 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20   no way to know 
5aa0: 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69  at.** compile-ti
5ab0: 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  me whether or no
5ac0: 74 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f  t thread A can o
5ad0: 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e  verride locks on
5ae0: 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 57 65   thread B..** We
5af0: 20 68 61 76 65 20 74 6f 20 64 6f 20 61 20 72 75   have to do a ru
5b00: 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74 6f 20  n-time check to 
5b10: 64 69 73 63 6f 76 65 72 20 74 68 65 20 62 65 68  discover the beh
5b20: 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20  avior of the.** 
5b30: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e  current process.
5b40: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 79 73 74 65 6d  .**.** On system
5b50: 73 20 77 68 65 72 65 20 74 68 72 65 61 64 20 41  s where thread A
5b60: 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6d 6f   is unable to mo
5b70: 64 69 66 79 20 6c 6f 63 6b 73 20 63 72 65 61 74  dify locks creat
5b80: 65 64 20 62 79 0a 2a 2a 20 74 68 72 65 61 64 20  ed by.** thread 
5b90: 42 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6b 65  B, we have to ke
5ba0: 65 70 20 74 72 61 63 6b 20 6f 66 20 77 68 69 63  ep track of whic
5bb0: 68 20 74 68 72 65 61 64 20 63 72 65 61 74 65 64  h thread created
5bc0: 20 65 61 63 68 0a 2a 2a 20 6c 6f 63 6b 2e 20 20   each.** lock.  
5bd0: 48 65 6e 63 65 20 74 68 65 72 65 20 69 73 20 61  Hence there is a
5be0: 6e 20 65 78 74 72 61 20 66 69 65 6c 64 20 69 6e  n extra field in
5bf0: 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20   the key to the 
5c00: 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 0a 2a 2a 20  unixLockInfo.** 
5c10: 73 74 72 75 63 74 75 72 65 20 74 6f 20 72 65 63  structure to rec
5c20: 6f 72 64 20 74 68 69 73 20 69 6e 66 6f 72 6d 61  ord this informa
5c30: 74 69 6f 6e 2e 20 20 41 6e 64 20 6f 6e 20 74 68  tion.  And on th
5c40: 6f 73 65 20 73 79 73 74 65 6d 73 20 69 74 0a 2a  ose systems it.*
5c50: 2a 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  * is illegal to 
5c60: 62 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74  begin a transact
5c70: 69 6f 6e 20 69 6e 20 6f 6e 65 20 74 68 72 65 61  ion in one threa
5c80: 64 20 61 6e 64 20 66 69 6e 69 73 68 20 69 74 0a  d and finish it.
5c90: 2a 2a 20 69 6e 20 61 6e 6f 74 68 65 72 2e 20 20  ** in another.  
5ca0: 46 6f 72 20 74 68 69 73 20 6c 61 74 74 65 72 20  For this latter 
5cb0: 72 65 73 74 72 69 63 74 69 6f 6e 2c 20 74 68 65  restriction, the
5cc0: 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 2d 61 72  re is no work-ar
5cd0: 6f 75 6e 64 2e 0a 2a 2a 20 49 74 20 69 73 20 61  ound..** It is a
5ce0: 20 6c 69 6d 69 74 61 74 69 6f 6e 20 6f 66 20 4c   limitation of L
5cf0: 69 6e 75 78 54 68 72 65 61 64 73 2e 0a 2a 2f 0a  inuxThreads..*/.
5d00: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63 68  ./*.** Set or ch
5d10: 65 63 6b 20 74 68 65 20 75 6e 69 78 46 69 6c 65  eck the unixFile
5d20: 2e 74 69 64 20 66 69 65 6c 64 2e 20 20 54 68 69  .tid field.  Thi
5d30: 73 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 77  s field is set w
5d40: 68 65 6e 20 61 6e 20 75 6e 69 78 46 69 6c 65 0a  hen an unixFile.
5d50: 2a 2a 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e  ** is first open
5d60: 65 64 2e 20 20 41 6c 6c 20 73 75 62 73 65 71 75  ed.  All subsequ
5d70: 65 6e 74 20 75 73 65 73 20 6f 66 20 74 68 65 20  ent uses of the 
5d80: 75 6e 69 78 46 69 6c 65 20 76 65 72 69 66 79 20  unixFile verify 
5d90: 74 68 61 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65  that the.** same
5da0: 20 74 68 72 65 61 64 20 69 73 20 6f 70 65 72 61   thread is opera
5db0: 74 69 6e 67 20 6f 6e 20 74 68 65 20 75 6e 69 78  ting on the unix
5dc0: 46 69 6c 65 2e 20 20 53 6f 6d 65 20 6f 70 65 72  File.  Some oper
5dd0: 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20 64 6f  ating systems do
5de0: 0a 2a 2a 20 6e 6f 74 20 61 6c 6c 6f 77 20 6c 6f  .** not allow lo
5df0: 63 6b 73 20 74 6f 20 62 65 20 6f 76 65 72 72 69  cks to be overri
5e00: 64 64 65 6e 20 62 79 20 6f 74 68 65 72 20 74 68  dden by other th
5e10: 72 65 61 64 73 20 61 6e 64 20 74 68 61 74 20 72  reads and that r
5e20: 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 6d 65  estriction.** me
5e30: 61 6e 73 20 74 68 61 74 20 73 71 6c 69 74 65 33  ans that sqlite3
5e40: 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
5e50: 65 73 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 76  es cannot be mov
5e60: 65 64 20 66 72 6f 6d 20 6f 6e 65 20 74 68 72 65  ed from one thre
5e70: 61 64 0a 2a 2a 20 74 6f 20 61 6e 6f 74 68 65 72  ad.** to another
5e80: 20 77 68 69 6c 65 20 6c 6f 63 6b 73 20 61 72 65   while locks are
5e90: 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 56 65 72   held..**.** Ver
5ea0: 73 69 6f 6e 20 33 2e 33 2e 31 20 28 32 30 30 36  sion 3.3.1 (2006
5eb0: 2d 30 31 2d 31 35 29 3a 20 20 75 6e 69 78 46 69  -01-15):  unixFi
5ec0: 6c 65 20 63 61 6e 20 62 65 20 6d 6f 76 65 64 20  le can be moved 
5ed0: 66 72 6f 6d 20 6f 6e 65 20 74 68 72 65 61 64 20  from one thread 
5ee0: 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 61 73  to.** another as
5ef0: 20 6c 6f 6e 67 20 61 73 20 77 65 20 61 72 65 20   long as we are 
5f00: 72 75 6e 6e 69 6e 67 20 6f 6e 20 61 20 73 79 73  running on a sys
5f10: 74 65 6d 20 74 68 61 74 20 73 75 70 70 6f 72 74  tem that support
5f20: 73 20 74 68 72 65 61 64 73 0a 2a 2a 20 6f 76 65  s threads.** ove
5f30: 72 72 69 64 69 6e 67 20 65 61 63 68 20 6f 74 68  rriding each oth
5f40: 65 72 73 20 6c 6f 63 6b 73 20 28 77 68 69 63 68  ers locks (which
5f50: 20 69 73 20 6e 6f 77 20 74 68 65 20 6d 6f 73 74   is now the most
5f60: 20 63 6f 6d 6d 6f 6e 20 62 65 68 61 76 69 6f 72   common behavior
5f70: 29 0a 2a 2a 20 6f 72 20 69 66 20 6e 6f 20 6c 6f  ).** or if no lo
5f80: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 42  cks are held.  B
5f90: 75 74 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e  ut the unixFile.
5fa0: 70 4c 6f 63 6b 20 66 69 65 6c 64 20 6e 65 65 64  pLock field need
5fb0: 73 20 74 6f 20 62 65 0a 2a 2a 20 72 65 63 6f 6d  s to be.** recom
5fc0: 70 75 74 65 64 20 62 65 63 61 75 73 65 20 69 74  puted because it
5fd0: 73 20 6b 65 79 20 69 6e 63 6c 75 64 65 73 20 74  s key includes t
5fe0: 68 65 20 74 68 72 65 61 64 2d 69 64 2e 20 20 53  he thread-id.  S
5ff0: 65 65 20 74 68 65 20 0a 2a 2a 20 74 72 61 6e 73  ee the .** trans
6000: 66 65 72 4f 77 6e 65 72 73 68 69 70 28 29 20 66  ferOwnership() f
6010: 75 6e 63 74 69 6f 6e 20 62 65 6c 6f 77 20 66 6f  unction below fo
6020: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
6030: 6f 72 6d 61 74 69 6f 6e 0a 2a 2f 0a 23 69 66 20  ormation.*/.#if 
6040: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
6050: 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c  E && defined(__l
6060: 69 6e 75 78 5f 5f 29 0a 23 20 64 65 66 69 6e 65  inux__).# define
6070: 20 53 45 54 5f 54 48 52 45 41 44 49 44 28 58 29   SET_THREADID(X)
6080: 20 20 20 28 58 29 2d 3e 74 69 64 20 3d 20 70 74     (X)->tid = pt
6090: 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 20 64  hread_self().# d
60a0: 65 66 69 6e 65 20 43 48 45 43 4b 5f 54 48 52 45  efine CHECK_THRE
60b0: 41 44 49 44 28 58 29 20 28 74 68 72 65 61 64 73  ADID(X) (threads
60c0: 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65  OverrideEachOthe
60d0: 72 73 4c 6f 63 6b 73 3d 3d 30 20 26 26 20 5c 0a  rsLocks==0 && \.
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 21 70 74 68              !pth
6100: 72 65 61 64 5f 65 71 75 61 6c 28 28 58 29 2d 3e  read_equal((X)->
6110: 74 69 64 2c 20 70 74 68 72 65 61 64 5f 73 65 6c  tid, pthread_sel
6120: 66 28 29 29 29 0a 23 65 6c 73 65 0a 23 20 64 65  f())).#else.# de
6130: 66 69 6e 65 20 53 45 54 5f 54 48 52 45 41 44 49  fine SET_THREADI
6140: 44 28 58 29 0a 23 20 64 65 66 69 6e 65 20 43 48  D(X).# define CH
6150: 45 43 4b 5f 54 48 52 45 41 44 49 44 28 58 29 20  ECK_THREADID(X) 
6160: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
6170: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
6180: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
6190: 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73  ucture serves as
61a0: 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a   the key used.**
61b0: 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72   to locate a par
61c0: 74 69 63 75 6c 61 72 20 75 6e 69 78 4f 70 65 6e  ticular unixOpen
61d0: 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 67 69  Cnt structure gi
61e0: 76 65 6e 20 69 74 73 20 69 6e 6f 64 65 2e 20 20  ven its inode.  
61f0: 54 68 69 73 0a 2a 2a 20 69 73 20 74 68 65 20 73  This.** is the s
6200: 61 6d 65 20 61 73 20 74 68 65 20 75 6e 69 78 4c  ame as the unixL
6210: 6f 63 6b 4b 65 79 20 65 78 63 65 70 74 20 74 68  ockKey except th
6220: 61 74 20 74 68 65 20 74 68 72 65 61 64 20 49 44  at the thread ID
6230: 20 69 73 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f 0a   is omitted..*/.
6240: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
6250: 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b  d {.  dev_t dev;
6260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6270: 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62    /* Device numb
6280: 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57  er */.#if OS_VXW
6290: 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78  ORKS.  struct vx
62a0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
62b0: 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c  ;  /* Unique fil
62c0: 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72 6b 73  e ID for vxworks
62d0: 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f  . */.#else.  ino
62e0: 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 20 20  _t ino;         
62f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64           /* Inod
6300: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64  e number */.#end
6310: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  if.};../*.** An 
6320: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
6330: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
6340: 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68  ure serves as th
6350: 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f  e key used.** to
6360: 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63   locate a partic
6370: 75 6c 61 72 20 75 6e 69 78 4c 6f 63 6b 49 6e 66  ular unixLockInf
6380: 6f 20 73 74 72 75 63 74 75 72 65 20 67 69 76 65  o structure give
6390: 6e 20 69 74 73 20 69 6e 6f 64 65 2e 0a 2a 2a 0a  n its inode..**.
63a0: 2a 2a 20 49 66 20 74 68 72 65 61 64 73 20 63 61  ** If threads ca
63b0: 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65 61  nnot override ea
63c0: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20  ch others locks 
63d0: 28 4c 69 6e 75 78 54 68 72 65 61 64 73 29 2c 20  (LinuxThreads), 
63e0: 74 68 65 6e 20 77 65 0a 2a 2a 20 73 65 74 20 74  then we.** set t
63f0: 68 65 20 75 6e 69 78 4c 6f 63 6b 4b 65 79 2e 74  he unixLockKey.t
6400: 69 64 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20  id field to the 
6410: 74 68 72 65 61 64 20 49 44 2e 20 20 49 66 20 74  thread ID.  If t
6420: 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72  hreads can overr
6430: 69 64 65 0a 2a 2a 20 65 61 63 68 20 6f 74 68 65  ide.** each othe
6440: 72 73 20 6c 6f 63 6b 73 20 28 50 6f 73 69 78 20  rs locks (Posix 
6450: 61 6e 64 20 4e 50 54 4c 29 20 74 68 65 6e 20 74  and NPTL) then t
6460: 69 64 20 69 73 20 61 6c 77 61 79 73 20 73 65 74  id is always set
6470: 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 74 69 64   to zero..** tid
6480: 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20 77   is omitted if w
6490: 65 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 6f 75  e compile withou
64a0: 74 20 74 68 72 65 61 64 69 6e 67 20 73 75 70 70  t threading supp
64b0: 6f 72 74 20 6f 72 20 6f 6e 20 61 6e 20 4f 53 0a  ort or on an OS.
64c0: 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 6c 69  ** other than li
64d0: 6e 75 78 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75  nux..*/.struct u
64e0: 6e 69 78 4c 6f 63 6b 4b 65 79 20 7b 0a 20 20 73  nixLockKey {.  s
64f0: 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64  truct unixFileId
6500: 20 66 69 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65   fid;  /* Unique
6510: 20 69 64 65 6e 74 69 66 69 65 72 20 66 6f 72 20   identifier for 
6520: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 23 69 66 20  the file */.#if 
6530: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
6540: 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c  E && defined(__l
6550: 69 6e 75 78 5f 5f 29 0a 20 20 70 74 68 72 65 61  inux__).  pthrea
6560: 64 5f 74 20 74 69 64 3b 20 20 2f 2a 20 54 68 72  d_t tid;  /* Thr
6570: 65 61 64 20 49 44 20 6f 66 20 6c 6f 63 6b 20 6f  ead ID of lock o
6580: 77 6e 65 72 2e 20 5a 65 72 6f 20 69 66 20 6e 6f  wner. Zero if no
6590: 74 20 75 73 69 6e 67 20 4c 69 6e 75 78 54 68 72  t using LinuxThr
65a0: 65 61 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  eads */.#endif.}
65b0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
65c0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
65d0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
65e0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  is allocated for
65f0: 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e   each open.** in
6600: 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e  ode.  Or, on Lin
6610: 75 78 54 68 72 65 61 64 73 2c 20 74 68 65 72 65  uxThreads, there
6620: 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73 65   is one of these
6630: 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 0a   structures for.
6640: 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65 20 6f 70  ** each inode op
6650: 65 6e 65 64 20 62 79 20 65 61 63 68 20 74 68 72  ened by each thr
6660: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e  ead..**.** A sin
6670: 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68 61  gle inode can ha
6680: 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65  ve multiple file
6690: 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73 6f   descriptors, so
66a0: 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a   each unixFile.*
66b0: 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  * structure cont
66c0: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
66d0: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
66e0: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64   this object and
66f0: 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20   this.** object 
6700: 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66  keeps a count of
6710: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75   the number of u
6720: 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67  nixFile pointing
6730: 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63   to it..*/.struc
6740: 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 7b  t unixLockInfo {
6750: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f  .  struct unixLo
6760: 63 6b 4b 65 79 20 6c 6f 63 6b 4b 65 79 3b 20 20  ckKey lockKey;  
6770: 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70     /* The lookup
6780: 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 63 6e   key */.  int cn
6790: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
67a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
67b0: 62 65 72 20 6f 66 20 53 48 41 52 45 44 20 6c 6f  ber of SHARED lo
67c0: 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e  cks held */.  in
67d0: 74 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20  t locktype;     
67e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
67f0: 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44 5f 4c   One of SHARED_L
6800: 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
6810: 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74  CK etc. */.  int
6820: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
6830: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6840: 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65  Number of pointe
6850: 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63  rs to this struc
6860: 74 75 72 65 20 2a 2f 0a 23 69 66 20 64 65 66 69  ture */.#if defi
6870: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
6880: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 29  E_LOCKING_STYLE)
6890: 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
68a0: 20 6c 6f 6e 67 20 73 68 61 72 65 64 42 79 74 65   long sharedByte
68b0: 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50 20 73 69  ;  /* for AFP si
68c0: 6d 75 6c 61 74 65 64 20 73 68 61 72 65 64 20 6c  mulated shared l
68d0: 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ock */.#endif.  
68e0: 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49  struct unixLockI
68f0: 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  nfo *pNext;     
6900: 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75  /* List of all u
6910: 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65  nixLockInfo obje
6920: 63 74 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  cts */.  struct 
6930: 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 50  unixLockInfo *pP
6940: 72 65 76 3b 20 20 20 20 20 2f 2a 20 20 20 20 2e  rev;     /*    .
6950: 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65  ... doubly linke
6960: 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  d */.};../*.** A
6970: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
6980: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
6990: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
69a0: 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e  ed for each open
69b0: 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 54 68 69 73  .** inode.  This
69c0: 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73   structure keeps
69d0: 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6e 75   track of the nu
69e0: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 6f 6e  mber of locks on
69f0: 20 74 68 61 74 0a 2a 2a 20 69 6e 6f 64 65 2e 20   that.** inode. 
6a00: 20 49 66 20 61 20 63 6c 6f 73 65 20 69 73 20 61   If a close is a
6a10: 74 74 65 6d 70 74 65 64 20 61 67 61 69 6e 73 74  ttempted against
6a20: 20 61 6e 20 69 6e 6f 64 65 20 74 68 61 74 20 69   an inode that i
6a30: 73 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6c 6f 63  s holding.** loc
6a40: 6b 73 2c 20 74 68 65 20 63 6c 6f 73 65 20 69 73  ks, the close is
6a50: 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
6a60: 61 6c 6c 20 6c 6f 63 6b 73 20 63 6c 65 61 72 20  all locks clear 
6a70: 62 79 20 61 64 64 69 6e 67 20 74 68 65 0a 2a 2a  by adding the.**
6a80: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
6a90: 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 74 6f   to be closed to
6aa0: 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 69 73   the pending lis
6ab0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 20  t..**.** TODO:  
6ac0: 43 6f 6e 73 69 64 65 72 20 63 68 61 6e 67 69 6e  Consider changin
6ad0: 67 20 74 68 69 73 20 73 6f 20 74 68 61 74 20 74  g this so that t
6ae0: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73  here is only a s
6af0: 69 6e 67 6c 65 20 66 69 6c 65 0a 2a 2a 20 64 65  ingle file.** de
6b00: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 65 61 63  scriptor for eac
6b10: 68 20 6f 70 65 6e 20 66 69 6c 65 2c 20 65 76 65  h open file, eve
6b20: 6e 20 77 68 65 6e 20 69 74 20 69 73 20 6f 70 65  n when it is ope
6b30: 6e 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  ned multiple tim
6b40: 65 73 2e 0a 2a 2a 20 54 68 65 20 63 6c 6f 73 65  es..** The close
6b50: 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77  () system call w
6b60: 6f 75 6c 64 20 6f 6e 6c 79 20 6f 63 63 75 72 20  ould only occur 
6b70: 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 64 61  when the last da
6b80: 74 61 62 61 73 65 0a 2a 2a 20 75 73 69 6e 67 20  tabase.** using 
6b90: 74 68 65 20 66 69 6c 65 20 63 6c 6f 73 65 73 2e  the file closes.
6ba0: 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 4f  .*/.struct unixO
6bb0: 70 65 6e 43 6e 74 20 7b 0a 20 20 73 74 72 75 63  penCnt {.  struc
6bc0: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c  t unixFileId fil
6bd0: 65 49 64 3b 20 20 20 2f 2a 20 54 68 65 20 6c 6f  eId;   /* The lo
6be0: 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  okup key */.  in
6bf0: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
6c00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6c10: 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ber of pointers 
6c20: 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72  to this structur
6c30: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b  e */.  int nLock
6c40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6c50: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6c60: 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
6c70: 73 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65  s */.  UnixUnuse
6c80: 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20  dFd *pUnused;   
6c90: 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c     /* Unused fil
6ca0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 6f  e descriptors to
6cb0: 20 63 6c 6f 73 65 20 2a 2f 0a 23 69 66 20 4f 53   close */.#if OS
6cc0: 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74  _VXWORKS.  sem_t
6cd0: 20 2a 70 53 65 6d 3b 20 20 20 20 20 20 20 20 20   *pSem;         
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6cf0: 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61 70  amed POSIX semap
6d00: 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 61  hore */.  char a
6d10: 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  SemName[MAX_PATH
6d20: 4e 41 4d 45 2b 32 5d 3b 20 20 20 2f 2a 20 4e 61  NAME+2];   /* Na
6d30: 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70  me of that semap
6d40: 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  hore */.#endif. 
6d50: 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e   struct unixOpen
6d60: 43 6e 74 20 2a 70 4e 65 78 74 2c 20 2a 70 50 72  Cnt *pNext, *pPr
6d70: 65 76 3b 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ev;   /* List of
6d80: 20 61 6c 6c 20 75 6e 69 78 4f 70 65 6e 43 6e 74   all unixOpenCnt
6d90: 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a   objects */.};..
6da0: 2f 2a 0a 2a 2a 20 4c 69 73 74 73 20 6f 66 20 61  /*.** Lists of a
6db0: 6c 6c 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20  ll unixLockInfo 
6dc0: 61 6e 64 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20  and unixOpenCnt 
6dd0: 6f 62 6a 65 63 74 73 2e 20 20 54 68 65 73 65 20  objects.  These 
6de0: 75 73 65 64 20 74 6f 20 62 65 20 68 61 73 68 0a  used to be hash.
6df0: 2a 2a 20 74 61 62 6c 65 73 2e 20 20 42 75 74 20  ** tables.  But 
6e00: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62  the number of ob
6e10: 6a 65 63 74 73 20 69 73 20 72 61 72 65 6c 79 20  jects is rarely 
6e20: 6d 6f 72 65 20 74 68 61 6e 20 61 20 64 6f 7a 65  more than a doze
6e30: 6e 20 61 6e 64 0a 2a 2a 20 6e 65 76 65 72 20 65  n and.** never e
6e40: 78 63 65 65 64 73 20 61 20 66 65 77 20 74 68 6f  xceeds a few tho
6e50: 75 73 61 6e 64 2e 20 20 41 6e 64 20 6c 6f 6f 6b  usand.  And look
6e60: 75 70 20 69 73 20 6e 6f 74 20 6f 6e 20 61 20 63  up is not on a c
6e70: 72 69 74 69 63 61 6c 0a 2a 2a 20 70 61 74 68 20  ritical.** path 
6e80: 73 6f 20 61 20 73 69 6d 70 6c 65 20 6c 69 6e 6b  so a simple link
6e90: 65 64 20 6c 69 73 74 20 77 69 6c 6c 20 73 75 66  ed list will suf
6ea0: 66 69 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fice..*/.static 
6eb0: 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49  struct unixLockI
6ec0: 6e 66 6f 20 2a 6c 6f 63 6b 4c 69 73 74 20 3d 20  nfo *lockList = 
6ed0: 30 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  0;.static struct
6ee0: 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 6f 70   unixOpenCnt *op
6ef0: 65 6e 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  enList = 0;../*.
6f00: 2a 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65  ** This variable
6f10: 20 72 65 6d 65 6d 62 65 72 73 20 77 68 65 74 68   remembers wheth
6f20: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
6f30: 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  s can override e
6f40: 61 63 68 20 6f 74 68 65 72 73 0a 2a 2a 20 6c 6f  ach others.** lo
6f50: 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a  cks..**.**    0:
6f60: 20 20 4e 6f 2e 20 20 54 68 72 65 61 64 73 20 63    No.  Threads c
6f70: 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65  annot override e
6f80: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
6f90: 2e 20 20 28 4c 69 6e 75 78 54 68 72 65 61 64 73  .  (LinuxThreads
6fa0: 29 0a 2a 2a 20 20 20 20 31 3a 20 20 59 65 73 2e  ).**    1:  Yes.
6fb0: 20 20 54 68 72 65 61 64 73 20 63 61 6e 20 6f 76    Threads can ov
6fc0: 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65  erride each othe
6fd0: 72 73 20 6c 6f 63 6b 73 2e 20 20 28 50 6f 73 69  rs locks.  (Posi
6fe0: 78 20 26 20 4e 4c 50 54 29 0a 2a 2a 20 20 20 2d  x & NLPT).**   -
6ff0: 31 3a 20 20 57 65 20 64 6f 6e 27 74 20 6b 6e 6f  1:  We don't kno
7000: 77 20 79 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  w yet..**.** On 
7010: 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 77 65  some systems, we
7020: 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65   know at compile
7030: 2d 74 69 6d 65 20 69 66 20 74 68 72 65 61 64 73  -time if threads
7040: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
7050: 63 68 0a 2a 2a 20 6f 74 68 65 72 73 20 6c 6f 63  ch.** others loc
7060: 6b 73 2e 20 20 4f 6e 20 74 68 6f 73 65 20 73 79  ks.  On those sy
7070: 73 74 65 6d 73 2c 20 74 68 65 20 53 51 4c 49 54  stems, the SQLIT
7080: 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44  E_THREAD_OVERRID
7090: 45 5f 4c 4f 43 4b 20 6d 61 63 72 6f 0a 2a 2a 20  E_LOCK macro.** 
70a0: 77 69 6c 6c 20 62 65 20 73 65 74 20 61 70 70 72  will be set appr
70b0: 6f 70 72 69 61 74 65 6c 79 2e 20 20 4f 6e 20 6f  opriately.  On o
70c0: 74 68 65 72 20 73 79 73 74 65 6d 73 2c 20 77 65  ther systems, we
70d0: 20 68 61 76 65 20 74 6f 20 63 68 65 63 6b 20 61   have to check a
70e0: 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2e 20 20 4f  t.** runtime.  O
70f0: 6e 20 74 68 65 73 65 20 6c 61 74 74 65 72 20 73  n these latter s
7100: 79 73 74 65 6d 73 2c 20 53 51 4c 54 49 45 5f 54  ystems, SQLTIE_T
7110: 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c  HREAD_OVERRIDE_L
7120: 4f 43 4b 20 69 73 0a 2a 2a 20 75 6e 64 65 66 69  OCK is.** undefi
7130: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ned..**.** This 
7140: 76 61 72 69 61 62 6c 65 20 6e 6f 72 6d 61 6c 6c  variable normall
7150: 79 20 68 61 73 20 66 69 6c 65 20 73 63 6f 70 65  y has file scope
7160: 20 6f 6e 6c 79 2e 20 20 42 75 74 20 64 75 72 69   only.  But duri
7170: 6e 67 20 74 65 73 74 69 6e 67 2c 20 77 65 20 6d  ng testing, we m
7180: 61 6b 65 0a 2a 2a 20 69 74 20 61 20 67 6c 6f 62  ake.** it a glob
7190: 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 74  al so that the t
71a0: 65 73 74 20 63 6f 64 65 20 63 61 6e 20 63 68 61  est code can cha
71b0: 6e 67 65 20 69 74 73 20 76 61 6c 75 65 20 69 6e  nge its value in
71c0: 20 6f 72 64 65 72 20 74 6f 20 76 65 72 69 66 79   order to verify
71d0: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 72 69 67  .** that the rig
71e0: 68 74 20 73 74 75 66 66 20 68 61 70 70 65 6e 73  ht stuff happens
71f0: 20 69 6e 20 65 69 74 68 65 72 20 63 61 73 65 2e   in either case.
7200: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  .*/.#if SQLITE_T
7210: 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66  HREADSAFE && def
7220: 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a  ined(__linux__).
7230: 23 20 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  #  ifndef SQLITE
7240: 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45  _THREAD_OVERRIDE
7250: 5f 4c 4f 43 4b 0a 23 20 20 20 20 64 65 66 69 6e  _LOCK.#    defin
7260: 65 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f  e SQLITE_THREAD_
7270: 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 2d 31  OVERRIDE_LOCK -1
7280: 0a 23 20 20 65 6e 64 69 66 0a 23 20 20 69 66 64  .#  endif.#  ifd
7290: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
72a0: 6e 74 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  nt threadsOverri
72b0: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
72c0: 73 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45 41  s = SQLITE_THREA
72d0: 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b  D_OVERRIDE_LOCK;
72e0: 0a 23 20 20 65 6c 73 65 0a 73 74 61 74 69 63 20  .#  else.static 
72f0: 69 6e 74 20 74 68 72 65 61 64 73 4f 76 65 72 72  int threadsOverr
7300: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
7310: 6b 73 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45  ks = SQLITE_THRE
7320: 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b  AD_OVERRIDE_LOCK
7330: 3b 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  ;.#  endif.#endi
7340: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 73 74  f../*.** This st
7350: 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 69 6e  ructure holds in
7360: 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64  formation passed
7370: 20 69 6e 74 6f 20 69 6e 64 69 76 69 64 75 61 6c   into individual
7380: 20 74 65 73 74 0a 2a 2a 20 74 68 72 65 61 64 73   test.** threads
7390: 20 62 79 20 74 68 65 20 74 65 73 74 54 68 72 65   by the testThre
73a0: 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f  adLockingBehavio
73b0: 72 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  r() routine..*/.
73c0: 73 74 72 75 63 74 20 74 68 72 65 61 64 54 65 73  struct threadTes
73d0: 74 44 61 74 61 20 7b 0a 20 20 69 6e 74 20 66 64  tData {.  int fd
73e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
73f0: 20 2f 2a 20 46 69 6c 65 20 74 6f 20 62 65 20 6c   /* File to be l
7400: 6f 63 6b 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  ocked */.  struc
7410: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 20 20 20  t flock lock;   
7420: 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67    /* The locking
7430: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
7440: 69 6e 74 20 72 65 73 75 6c 74 3b 20 20 20 20 20  int result;     
7450: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
7460: 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   of the locking 
7470: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a  operation */.};.
7480: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
7490: 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65  ADSAFE && define
74a0: 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 2f 2a 0a  d(__linux__)./*.
74b0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
74c0: 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20   is used as the 
74d0: 6d 61 69 6e 20 72 6f 75 74 69 6e 65 20 66 6f 72  main routine for
74e0: 20 61 20 74 68 72 65 61 64 20 6c 61 75 6e 63 68   a thread launch
74f0: 65 64 20 62 79 0a 2a 2a 20 74 65 73 74 54 68 72  ed by.** testThr
7500: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
7510: 6f 72 28 29 2e 20 49 74 20 74 65 73 74 73 20 77  or(). It tests w
7520: 68 65 74 68 65 72 20 74 68 65 20 73 68 61 72 65  hether the share
7530: 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a  d-lock obtained.
7540: 2a 2a 20 62 79 20 74 68 65 20 6d 61 69 6e 20 74  ** by the main t
7550: 68 72 65 61 64 20 69 6e 20 74 65 73 74 54 68 72  hread in testThr
7560: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
7570: 6f 72 28 29 20 63 6f 6e 66 6c 69 63 74 73 20 77  or() conflicts w
7580: 69 74 68 20 61 0a 2a 2a 20 68 79 70 6f 74 68 65  ith a.** hypothe
7590: 74 69 63 61 6c 20 77 72 69 74 65 2d 6c 6f 63 6b  tical write-lock
75a0: 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68 69   obtained by thi
75b0: 73 20 74 68 72 65 61 64 20 6f 6e 20 74 68 65 20  s thread on the 
75c0: 73 61 6d 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  same file..**.**
75d0: 20 54 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20   The write-lock 
75e0: 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
75f0: 61 63 71 75 69 72 65 64 2c 20 61 73 20 74 68 69  acquired, as thi
7600: 73 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  s is not possibl
7610: 65 20 69 66 20 0a 2a 2a 20 74 68 65 20 66 69 6c  e if .** the fil
7620: 65 20 69 73 20 6f 70 65 6e 20 69 6e 20 72 65 61  e is open in rea
7630: 64 2d 6f 6e 6c 79 20 6d 6f 64 65 20 28 73 65 65  d-only mode (see
7640: 20 74 69 63 6b 65 74 20 23 33 34 37 32 29 2e 0a   ticket #3472)..
7650: 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
7660: 2a 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65  *threadLockingTe
7670: 73 74 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  st(void *pArg){.
7680: 20 20 73 74 72 75 63 74 20 74 68 72 65 61 64 54    struct threadT
7690: 65 73 74 44 61 74 61 20 2a 70 44 61 74 61 20 3d  estData *pData =
76a0: 20 28 73 74 72 75 63 74 20 74 68 72 65 61 64 54   (struct threadT
76b0: 65 73 74 44 61 74 61 2a 29 70 41 72 67 3b 0a 20  estData*)pArg;. 
76c0: 20 70 44 61 74 61 2d 3e 72 65 73 75 6c 74 20 3d   pData->result =
76d0: 20 66 63 6e 74 6c 28 70 44 61 74 61 2d 3e 66 64   fcntl(pData->fd
76e0: 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 70 44 61 74  , F_GETLK, &pDat
76f0: 61 2d 3e 6c 6f 63 6b 29 3b 0a 20 20 72 65 74 75  a->lock);.  retu
7700: 72 6e 20 70 41 72 67 3b 0a 7d 0a 23 65 6e 64 69  rn pArg;.}.#endi
7710: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 48 52 45  f /* SQLITE_THRE
7720: 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65  ADSAFE && define
7730: 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 2a 2f 0a  d(__linux__) */.
7740: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  ..#if SQLITE_THR
7750: 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e  EADSAFE && defin
7760: 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 2f 2a  ed(__linux__)./*
7770: 0a 2a 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75  .** This procedu
7780: 72 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64  re attempts to d
7790: 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
77a0: 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73 0a   or not threads.
77b0: 2a 2a 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20  ** can override 
77c0: 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b  each others lock
77d0: 73 20 74 68 65 6e 20 73 65 74 73 20 74 68 65 20  s then sets the 
77e0: 0a 2a 2a 20 74 68 72 65 61 64 73 4f 76 65 72 72  .** threadsOverr
77f0: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
7800: 6b 73 20 76 61 72 69 61 62 6c 65 20 61 70 70 72  ks variable appr
7810: 6f 70 72 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74  opriately..*/.st
7820: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 54 68  atic void testTh
7830: 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76  readLockingBehav
7840: 69 6f 72 28 69 6e 74 20 66 64 5f 6f 72 69 67 29  ior(int fd_orig)
7850: 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 69 6e  {.  int fd;.  in
7860: 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 74  t rc;.  struct t
7870: 68 72 65 61 64 54 65 73 74 44 61 74 61 20 64 3b  hreadTestData d;
7880: 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
7890: 6c 3b 0a 20 20 70 74 68 72 65 61 64 5f 74 20 74  l;.  pthread_t t
78a0: 3b 0a 0a 20 20 66 64 20 3d 20 64 75 70 28 66 64  ;..  fd = dup(fd
78b0: 5f 6f 72 69 67 29 3b 0a 20 20 69 66 28 20 66 64  _orig);.  if( fd
78c0: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d  <0 ) return;.  m
78d0: 65 6d 73 65 74 28 26 6c 2c 20 30 2c 20 73 69 7a  emset(&l, 0, siz
78e0: 65 6f 66 28 6c 29 29 3b 0a 20 20 6c 2e 6c 5f 74  eof(l));.  l.l_t
78f0: 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
7900: 20 6c 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20   l.l_len = 1;.  
7910: 6c 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20  l.l_start = 0;. 
7920: 20 6c 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45   l.l_whence = SE
7930: 45 4b 5f 53 45 54 3b 0a 20 20 72 63 20 3d 20 66  EK_SET;.  rc = f
7940: 63 6e 74 6c 28 66 64 5f 6f 72 69 67 2c 20 46 5f  cntl(fd_orig, F_
7950: 53 45 54 4c 4b 2c 20 26 6c 29 3b 0a 20 20 69 66  SETLK, &l);.  if
7960: 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
7970: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 2c 20 30  ;.  memset(&d, 0
7980: 2c 20 73 69 7a 65 6f 66 28 64 29 29 3b 0a 20 20  , sizeof(d));.  
7990: 64 2e 66 64 20 3d 20 66 64 3b 0a 20 20 64 2e 6c  d.fd = fd;.  d.l
79a0: 6f 63 6b 20 3d 20 6c 3b 0a 20 20 64 2e 6c 6f 63  ock = l;.  d.loc
79b0: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
79c0: 43 4b 3b 0a 20 20 69 66 28 20 70 74 68 72 65 61  CK;.  if( pthrea
79d0: 64 5f 63 72 65 61 74 65 28 26 74 2c 20 30 2c 20  d_create(&t, 0, 
79e0: 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73  threadLockingTes
79f0: 74 2c 20 26 64 29 3d 3d 30 20 29 7b 0a 20 20 20  t, &d)==0 ){.   
7a00: 20 70 74 68 72 65 61 64 5f 6a 6f 69 6e 28 74 2c   pthread_join(t,
7a10: 20 30 29 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65   0);.  }.  close
7a20: 28 66 64 29 3b 0a 20 20 69 66 28 20 64 2e 72 65  (fd);.  if( d.re
7a30: 73 75 6c 74 21 3d 30 20 29 20 72 65 74 75 72 6e  sult!=0 ) return
7a40: 3b 0a 20 20 74 68 72 65 61 64 73 4f 76 65 72 72  ;.  threadsOverr
7a50: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
7a60: 6b 73 20 3d 20 28 64 2e 6c 6f 63 6b 2e 6c 5f 74  ks = (d.lock.l_t
7a70: 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 29 3b 0a 7d  ype==F_UNLCK);.}
7a80: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7a90: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
7aa0: 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f  defined(__linux_
7ab0: 5f 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  _) */../*.** Rel
7ac0: 65 61 73 65 20 61 20 75 6e 69 78 4c 6f 63 6b 49  ease a unixLockI
7ad0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 72  nfo structure pr
7ae0: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
7af0: 65 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e  ed by findLockIn
7b00: 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fo()..**.** The 
7b10: 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73  mutex entered us
7b20: 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65  ing the unixEnte
7b30: 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f  rMutex() functio
7b40: 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  n must be held.*
7b50: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
7b60: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
7b70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
7b80: 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 73  eleaseLockInfo(s
7b90: 74 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e  truct unixLockIn
7ba0: 66 6f 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 61 73  fo *pLock){.  as
7bb0: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
7bc0: 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70  eld() );.  if( p
7bd0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63  Lock ){.    pLoc
7be0: 6b 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69  k->nRef--;.    i
7bf0: 66 28 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 3d 3d  f( pLock->nRef==
7c00: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
7c10: 4c 6f 63 6b 2d 3e 70 50 72 65 76 20 29 7b 0a 20  Lock->pPrev ){. 
7c20: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
7c30: 4c 6f 63 6b 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  Lock->pPrev->pNe
7c40: 78 74 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20  xt==pLock );.   
7c50: 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 50 72 65       pLock->pPre
7c60: 76 2d 3e 70 4e 65 78 74 20 3d 20 70 4c 6f 63 6b  v->pNext = pLock
7c70: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
7c80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
7c90: 73 65 72 74 28 20 6c 6f 63 6b 4c 69 73 74 3d 3d  sert( lockList==
7ca0: 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 20  pLock );.       
7cb0: 20 6c 6f 63 6b 4c 69 73 74 20 3d 20 70 4c 6f 63   lockList = pLoc
7cc0: 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  k->pNext;.      
7cd0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  }.      if( pLoc
7ce0: 6b 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  k->pNext ){.    
7cf0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
7d00: 6b 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d  k->pNext->pPrev=
7d10: 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20  =pLock );.      
7d20: 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 2d 3e    pLock->pNext->
7d30: 70 50 72 65 76 20 3d 20 70 4c 6f 63 6b 2d 3e 70  pPrev = pLock->p
7d40: 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Prev;.      }.  
7d50: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
7d60: 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20  (pLock);.    }. 
7d70: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65   }.}../*.** Rele
7d80: 61 73 65 20 61 20 75 6e 69 78 4f 70 65 6e 43 6e  ase a unixOpenCn
7d90: 74 20 73 74 72 75 63 74 75 72 65 20 70 72 65 76  t structure prev
7da0: 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64  iously allocated
7db0: 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f   by findLockInfo
7dc0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75  ()..**.** The mu
7dd0: 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e  tex entered usin
7de0: 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d  g the unixEnterM
7df0: 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20  utex() function 
7e00: 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20  must be held.** 
7e10: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
7e20: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  on is called..*/
7e30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
7e40: 65 61 73 65 4f 70 65 6e 43 6e 74 28 73 74 72 75  easeOpenCnt(stru
7e50: 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a  ct unixOpenCnt *
7e60: 70 4f 70 65 6e 29 7b 0a 20 20 61 73 73 65 72 74  pOpen){.  assert
7e70: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
7e80: 29 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 65 6e  ) );.  if( pOpen
7e90: 20 29 7b 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e   ){.    pOpen->n
7ea0: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
7eb0: 4f 70 65 6e 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  Open->nRef==0 ){
7ec0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e  .      if( pOpen
7ed0: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
7ee0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 65 6e     assert( pOpen
7ef0: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d  ->pPrev->pNext==
7f00: 70 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 20  pOpen );.       
7f10: 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76 2d 3e 70   pOpen->pPrev->p
7f20: 4e 65 78 74 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e  Next = pOpen->pN
7f30: 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ext;.      }else
7f40: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
7f50: 28 20 6f 70 65 6e 4c 69 73 74 3d 3d 70 4f 70 65  ( openList==pOpe
7f60: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 65  n );.        ope
7f70: 6e 4c 69 73 74 20 3d 20 70 4f 70 65 6e 2d 3e 70  nList = pOpen->p
7f80: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
7f90: 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 70      if( pOpen->p
7fa0: 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
7fb0: 61 73 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e 70  assert( pOpen->p
7fc0: 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70 4f 70  Next->pPrev==pOp
7fd0: 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  en );.        pO
7fe0: 70 65 6e 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  pen->pNext->pPre
7ff0: 76 20 3d 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76  v = pOpen->pPrev
8000: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51  ;.      }.#if SQ
8010: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
8020: 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e  && defined(__lin
8030: 75 78 5f 5f 29 0a 20 20 20 20 20 20 61 73 73 65  ux__).      asse
8040: 72 74 28 20 21 70 4f 70 65 6e 2d 3e 70 55 6e 75  rt( !pOpen->pUnu
8050: 73 65 64 20 7c 7c 20 74 68 72 65 61 64 73 4f 76  sed || threadsOv
8060: 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73  errideEachOthers
8070: 4c 6f 63 6b 73 3d 3d 30 20 29 3b 0a 23 65 6e 64  Locks==0 );.#end
8080: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  if..      /* If 
8090: 70 4f 70 65 6e 2d 3e 70 55 6e 75 73 65 64 20 69  pOpen->pUnused i
80a0: 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 74 68 65 6e  s not null, then
80b0: 20 6d 65 6d 6f 72 79 20 61 6e 64 20 66 69 6c 65   memory and file
80c0: 2d 64 65 73 63 72 69 70 74 6f 72 73 0a 20 20 20  -descriptors.   
80d0: 20 20 20 2a 2a 20 61 72 65 20 6c 65 61 6b 65 64     ** are leaked
80e0: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
80f0: 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 6f 6e   ** This will on
8100: 6c 79 20 68 61 70 70 65 6e 20 69 66 2c 20 75 6e  ly happen if, un
8110: 64 65 72 20 4c 69 6e 75 78 74 68 72 65 61 64 73  der Linuxthreads
8120: 2c 20 74 68 65 20 75 73 65 72 20 68 61 73 20 6f  , the user has o
8130: 70 65 6e 65 64 0a 20 20 20 20 20 20 2a 2a 20 61  pened.      ** a
8140: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
8150: 6f 6e 65 20 74 68 72 65 61 64 2c 20 74 68 65 6e  one thread, then
8160: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c 6f   attempts to clo
8170: 73 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  se the database.
8180: 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20        ** handle 
8190: 66 72 6f 6d 20 61 6e 6f 74 68 65 72 20 74 68 72  from another thr
81a0: 65 61 64 20 28 77 69 74 68 6f 75 74 20 66 69 72  ead (without fir
81b0: 73 74 20 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65  st unlocking the
81c0: 20 64 62 20 66 69 6c 65 29 2e 0a 20 20 20 20 20   db file)..     
81d0: 20 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6d 69   ** This is a mi
81e0: 73 75 73 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  suse.  */.      
81f0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4f 70  sqlite3_free(pOp
8200: 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  en);.    }.  }.}
8210: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
8220: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c  file descriptor,
8230: 20 6c 6f 63 61 74 65 20 75 6e 69 78 4c 6f 63 6b   locate unixLock
8240: 49 6e 66 6f 20 61 6e 64 20 75 6e 69 78 4f 70 65  Info and unixOpe
8250: 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 73 20  nCnt structures 
8260: 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65  that.** describe
8270: 73 20 74 68 61 74 20 66 69 6c 65 20 64 65 73 63  s that file desc
8280: 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20  riptor.  Create 
8290: 6e 65 77 20 6f 6e 65 73 20 69 66 20 6e 65 63 65  new ones if nece
82a0: 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72  ssary.  The.** r
82b0: 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6d 69 67  eturn values mig
82c0: 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69  ht be uninitiali
82d0: 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20  zed if an error 
82e0: 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  occurs..**.** Th
82f0: 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20  e mutex entered 
8300: 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e  using the unixEn
8310: 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74  terMutex() funct
8320: 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ion must be held
8330: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75  .** when this fu
8340: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
8350: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
8360: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
8370: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
8380: 74 69 63 20 69 6e 74 20 66 69 6e 64 4c 6f 63 6b  tic int findLock
8390: 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65  Info(.  unixFile
83a0: 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20   *pFile,        
83b0: 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20 66         /* Unix f
83c0: 69 6c 65 20 77 69 74 68 20 66 69 6c 65 20 64 65  ile with file de
83d0: 73 63 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b  sc used in the k
83e0: 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  ey */.  struct u
83f0: 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 2a 70 70  nixLockInfo **pp
8400: 4c 6f 63 6b 2c 20 20 2f 2a 20 52 65 74 75 72 6e  Lock,  /* Return
8410: 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b 49 6e 66   the unixLockInf
8420: 6f 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  o structure here
8430: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69   */.  struct uni
8440: 78 4f 70 65 6e 43 6e 74 20 2a 2a 70 70 4f 70 65  xOpenCnt **ppOpe
8450: 6e 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74  n    /* Return t
8460: 68 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73  he unixOpenCnt s
8470: 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
8480: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
8490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84a0: 20 20 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 63       /* System c
84b0: 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20  all return code 
84c0: 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20  */.  int fd;    
84d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84e0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
84f0: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 70  descriptor for p
8500: 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  File */.  struct
8510: 20 75 6e 69 78 4c 6f 63 6b 4b 65 79 20 6c 6f 63   unixLockKey loc
8520: 6b 4b 65 79 3b 20 20 20 20 2f 2a 20 4c 6f 6f 6b  kKey;    /* Look
8530: 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75  up key for the u
8540: 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 73 74 72 75  nixLockInfo stru
8550: 63 74 75 72 65 20 2a 2f 0a 20 20 73 74 72 75 63  cture */.  struc
8560: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c  t unixFileId fil
8570: 65 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  eId;      /* Loo
8580: 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20  kup key for the 
8590: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72 75  unixOpenCnt stru
85a0: 63 74 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ct */.  struct s
85b0: 74 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20  tat statbuf;    
85c0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65         /* Low-le
85d0: 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61  vel file informa
85e0: 74 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74  tion */.  struct
85f0: 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70   unixLockInfo *p
8600: 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 43 61 6e 64  Lock = 0;/* Cand
8610: 69 64 61 74 65 20 75 6e 69 78 4c 6f 63 6b 49 6e  idate unixLockIn
8620: 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  fo object */.  s
8630: 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e  truct unixOpenCn
8640: 74 20 2a 70 4f 70 65 6e 3b 20 20 20 20 20 2f 2a  t *pOpen;     /*
8650: 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69 78 4f   Candidate unixO
8660: 70 65 6e 43 6e 74 20 6f 62 6a 65 63 74 20 2a 2f  penCnt object */
8670: 0a 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ..  assert( unix
8680: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 0a  MutexHeld() );..
8690: 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76    /* Get low-lev
86a0: 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  el information a
86b0: 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74 68  bout the file th
86c0: 61 74 20 77 65 20 63 61 6e 20 75 73 65 64 20 74  at we can used t
86d0: 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20  o.  ** create a 
86e0: 75 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f 72 20  unique name for 
86f0: 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  the file..  */. 
8700: 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a   fd = pFile->h;.
8710: 20 20 72 63 20 3d 20 66 73 74 61 74 28 66 64 2c    rc = fstat(fd,
8720: 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66   &statbuf);.  if
8730: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 70  ( rc!=0 ){.    p
8740: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
8750: 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 64 65 66 20  = errno;.#ifdef 
8760: 45 4f 56 45 52 46 4c 4f 57 0a 20 20 20 20 69 66  EOVERFLOW.    if
8770: 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  ( pFile->lastErr
8780: 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20  no==EOVERFLOW ) 
8790: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
87a0: 4c 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  LFS;.#endif.    
87b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
87c0: 45 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ERR;.  }..#ifdef
87d0: 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20   __APPLE__.  /* 
87e0: 4f 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73  On OS X on an ms
87f0: 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2c 20  dos filesystem, 
8800: 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72  the inode number
8810: 20 69 73 20 72 65 70 6f 72 74 65 64 0a 20 20 2a   is reported.  *
8820: 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f  * incorrectly fo
8830: 72 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65  r zero-size file
8840: 73 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23  s.  See ticket #
8850: 33 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20  3260.  To work. 
8860: 20 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69 73 20   ** around this 
8870: 70 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73  problem (we cons
8880: 69 64 65 72 20 69 74 20 61 20 62 75 67 20 69 6e  ider it a bug in
8890: 20 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74   OS X, not SQLit
88a0: 65 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61 79  e).  ** we alway
88b0: 73 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 66  s increase the f
88c0: 69 6c 65 20 73 69 7a 65 20 74 6f 20 31 20 62 79  ile size to 1 by
88d0: 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c   writing a singl
88e0: 65 20 62 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f  e byte.  ** prio
88f0: 72 20 74 6f 20 61 63 63 65 73 73 69 6e 67 20 74  r to accessing t
8900: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e  he inode number.
8910: 20 20 54 68 65 20 6f 6e 65 20 62 79 74 65 20 77    The one byte w
8920: 72 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61  ritten is.  ** a
8930: 6e 20 41 53 43 49 49 20 27 53 27 20 63 68 61 72  n ASCII 'S' char
8940: 61 63 74 65 72 20 77 68 69 63 68 20 61 6c 73 6f  acter which also
8950: 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74   happens to be t
8960: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20  he first byte.  
8970: 2a 2a 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ** in the header
8980: 20 6f 66 20 65 76 65 72 79 20 53 51 4c 69 74 65   of every SQLite
8990: 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e 20 74   database.  In t
89a0: 68 69 73 20 77 61 79 2c 20 69 66 20 74 68 65 72  his way, if ther
89b0: 65 0a 20 20 2a 2a 20 69 73 20 61 20 72 61 63 65  e.  ** is a race
89c0: 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68 20   condition such 
89d0: 74 68 61 74 20 61 6e 6f 74 68 65 72 20 74 68 72  that another thr
89e0: 65 61 64 20 68 61 73 20 61 6c 72 65 61 64 79 20  ead has already 
89f0: 70 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74  populated.  ** t
8a00: 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
8a10: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e   the database, n
8a20: 6f 20 64 61 6d 61 67 65 20 69 73 20 64 6f 6e 65  o damage is done
8a30: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 61  ..  */.  if( sta
8a40: 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20  tbuf.st_size==0 
8a50: 26 26 20 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61  && (pFile->fsFla
8a60: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 53 46 4c  gs & SQLITE_FSFL
8a70: 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30  AGS_IS_MSDOS)!=0
8a80: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 72 69   ){.    rc = wri
8a90: 74 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 0a  te(fd, "S", 1);.
8aa0: 20 20 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b      if( rc!=1 ){
8ab0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
8ac0: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
8ad0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
8ae0: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
8af0: 7d 0a 20 20 20 20 72 63 20 3d 20 66 73 74 61 74  }.    rc = fstat
8b00: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a  (fd, &statbuf);.
8b10: 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
8b20: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
8b30: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
8b40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
8b50: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
8b60: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
8b70: 6d 65 6d 73 65 74 28 26 6c 6f 63 6b 4b 65 79 2c  memset(&lockKey,
8b80: 20 30 2c 20 73 69 7a 65 6f 66 28 6c 6f 63 6b 4b   0, sizeof(lockK
8b90: 65 79 29 29 3b 0a 20 20 6c 6f 63 6b 4b 65 79 2e  ey));.  lockKey.
8ba0: 66 69 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75  fid.dev = statbu
8bb0: 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53  f.st_dev;.#if OS
8bc0: 5f 56 58 57 4f 52 4b 53 0a 20 20 6c 6f 63 6b 4b  _VXWORKS.  lockK
8bd0: 65 79 2e 66 69 64 2e 70 49 64 20 3d 20 70 46 69  ey.fid.pId = pFi
8be0: 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20  le->pId;.#else. 
8bf0: 20 6c 6f 63 6b 4b 65 79 2e 66 69 64 2e 69 6e 6f   lockKey.fid.ino
8c00: 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e   = statbuf.st_in
8c10: 6f 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  o;.#endif.#if SQ
8c20: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
8c30: 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e  && defined(__lin
8c40: 75 78 5f 5f 29 0a 20 20 69 66 28 20 74 68 72 65  ux__).  if( thre
8c50: 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f  adsOverrideEachO
8c60: 74 68 65 72 73 4c 6f 63 6b 73 3c 30 20 29 7b 0a  thersLocks<0 ){.
8c70: 20 20 20 20 74 65 73 74 54 68 72 65 61 64 4c 6f      testThreadLo
8c80: 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 66 64  ckingBehavior(fd
8c90: 29 3b 0a 20 20 7d 0a 20 20 6c 6f 63 6b 4b 65 79  );.  }.  lockKey
8ca0: 2e 74 69 64 20 3d 20 74 68 72 65 61 64 73 4f 76  .tid = threadsOv
8cb0: 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73  errideEachOthers
8cc0: 4c 6f 63 6b 73 20 3f 20 30 20 3a 20 70 74 68 72  Locks ? 0 : pthr
8cd0: 65 61 64 5f 73 65 6c 66 28 29 3b 0a 23 65 6e 64  ead_self();.#end
8ce0: 69 66 0a 20 20 66 69 6c 65 49 64 20 3d 20 6c 6f  if.  fileId = lo
8cf0: 63 6b 4b 65 79 2e 66 69 64 3b 0a 20 20 69 66 28  ckKey.fid;.  if(
8d00: 20 70 70 4c 6f 63 6b 21 3d 30 20 29 7b 0a 20 20   ppLock!=0 ){.  
8d10: 20 20 70 4c 6f 63 6b 20 3d 20 6c 6f 63 6b 4c 69    pLock = lockLi
8d20: 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  st;.    while( p
8d30: 4c 6f 63 6b 20 26 26 20 6d 65 6d 63 6d 70 28 26  Lock && memcmp(&
8d40: 6c 6f 63 6b 4b 65 79 2c 20 26 70 4c 6f 63 6b 2d  lockKey, &pLock-
8d50: 3e 6c 6f 63 6b 4b 65 79 2c 20 73 69 7a 65 6f 66  >lockKey, sizeof
8d60: 28 6c 6f 63 6b 4b 65 79 29 29 20 29 7b 0a 20 20  (lockKey)) ){.  
8d70: 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63      pLock = pLoc
8d80: 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  k->pNext;.    }.
8d90: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30      if( pLock==0
8da0: 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20   ){.      pLock 
8db0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
8dc0: 28 20 73 69 7a 65 6f 66 28 2a 70 4c 6f 63 6b 29  ( sizeof(*pLock)
8dd0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
8de0: 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
8df0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
8e00: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  MEM;.        got
8e10: 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69  o exit_findlocki
8e20: 6e 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nfo;.      }.   
8e30: 20 20 20 6d 65 6d 63 70 79 28 26 70 4c 6f 63 6b     memcpy(&pLock
8e40: 2d 3e 6c 6f 63 6b 4b 65 79 2c 26 6c 6f 63 6b 4b  ->lockKey,&lockK
8e50: 65 79 2c 73 69 7a 65 6f 66 28 6c 6f 63 6b 4b 65  ey,sizeof(lockKe
8e60: 79 29 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b  y));.      pLock
8e70: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
8e80: 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 30    pLock->cnt = 0
8e90: 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c  ;.      pLock->l
8ea0: 6f 63 6b 74 79 70 65 20 3d 20 30 3b 0a 23 69 66  ocktype = 0;.#if
8eb0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
8ec0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
8ed0: 54 59 4c 45 29 0a 20 20 20 20 20 20 70 4c 6f 63  TYLE).      pLoc
8ee0: 6b 2d 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20  k->sharedByte = 
8ef0: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  0;.#endif.      
8f00: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 6c  pLock->pNext = l
8f10: 6f 63 6b 4c 69 73 74 3b 0a 20 20 20 20 20 20 70  ockList;.      p
8f20: 4c 6f 63 6b 2d 3e 70 50 72 65 76 20 3d 20 30 3b  Lock->pPrev = 0;
8f30: 0a 20 20 20 20 20 20 69 66 28 20 6c 6f 63 6b 4c  .      if( lockL
8f40: 69 73 74 20 29 20 6c 6f 63 6b 4c 69 73 74 2d 3e  ist ) lockList->
8f50: 70 50 72 65 76 20 3d 20 70 4c 6f 63 6b 3b 0a 20  pPrev = pLock;. 
8f60: 20 20 20 20 20 6c 6f 63 6b 4c 69 73 74 20 3d 20       lockList = 
8f70: 70 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  pLock;.    }else
8f80: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e  {.      pLock->n
8f90: 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  Ref++;.    }.   
8fa0: 20 2a 70 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b   *ppLock = pLock
8fb0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 70 4f 70  ;.  }.  if( ppOp
8fc0: 65 6e 21 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70  en!=0 ){.    pOp
8fd0: 65 6e 20 3d 20 6f 70 65 6e 4c 69 73 74 3b 0a 20  en = openList;. 
8fe0: 20 20 20 77 68 69 6c 65 28 20 70 4f 70 65 6e 20     while( pOpen 
8ff0: 26 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49  && memcmp(&fileI
9000: 64 2c 20 26 70 4f 70 65 6e 2d 3e 66 69 6c 65 49  d, &pOpen->fileI
9010: 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64  d, sizeof(fileId
9020: 29 29 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 65  )) ){.      pOpe
9030: 6e 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74  n = pOpen->pNext
9040: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9050: 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  pOpen==0 ){.    
9060: 20 20 70 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65    pOpen = sqlite
9070: 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
9080: 28 2a 70 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20  (*pOpen) );.    
9090: 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30 20 29    if( pOpen==0 )
90a0: 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
90b0: 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29  eLockInfo(pLock)
90c0: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
90d0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
90e0: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 66       goto exit_f
90f0: 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20  indlockinfo;.   
9100: 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
9110: 74 28 70 4f 70 65 6e 2c 20 30 2c 20 73 69 7a 65  t(pOpen, 0, size
9120: 6f 66 28 2a 70 4f 70 65 6e 29 29 3b 0a 20 20 20  of(*pOpen));.   
9130: 20 20 20 70 4f 70 65 6e 2d 3e 66 69 6c 65 49 64     pOpen->fileId
9140: 20 3d 20 66 69 6c 65 49 64 3b 0a 20 20 20 20 20   = fileId;.     
9150: 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 20 3d 20 31   pOpen->nRef = 1
9160: 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 70  ;.      pOpen->p
9170: 4e 65 78 74 20 3d 20 6f 70 65 6e 4c 69 73 74 3b  Next = openList;
9180: 0a 20 20 20 20 20 20 69 66 28 20 6f 70 65 6e 4c  .      if( openL
9190: 69 73 74 20 29 20 6f 70 65 6e 4c 69 73 74 2d 3e  ist ) openList->
91a0: 70 50 72 65 76 20 3d 20 70 4f 70 65 6e 3b 0a 20  pPrev = pOpen;. 
91b0: 20 20 20 20 20 6f 70 65 6e 4c 69 73 74 20 3d 20       openList = 
91c0: 70 4f 70 65 6e 3b 0a 20 20 20 20 7d 65 6c 73 65  pOpen;.    }else
91d0: 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e  {.      pOpen->n
91e0: 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  Ref++;.    }.   
91f0: 20 2a 70 70 4f 70 65 6e 20 3d 20 70 4f 70 65 6e   *ppOpen = pOpen
9200: 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 66 69 6e 64  ;.  }..exit_find
9210: 6c 6f 63 6b 69 6e 66 6f 3a 0a 20 20 72 65 74 75  lockinfo:.  retu
9220: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
9230: 49 66 20 77 65 20 61 72 65 20 63 75 72 72 65 6e  If we are curren
9240: 74 6c 79 20 69 6e 20 61 20 64 69 66 66 65 72 65  tly in a differe
9250: 6e 74 20 74 68 72 65 61 64 20 74 68 61 6e 20 74  nt thread than t
9260: 68 65 20 74 68 72 65 61 64 20 74 68 61 74 20 74  he thread that t
9270: 68 65 0a 2a 2a 20 75 6e 69 78 46 69 6c 65 20 61  he.** unixFile a
9280: 72 67 75 6d 65 6e 74 20 62 65 6c 6f 6e 67 73 20  rgument belongs 
9290: 74 6f 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  to, then transfe
92a0: 72 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74  r ownership of t
92b0: 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 6f  he unixFile.** o
92c0: 76 65 72 20 74 6f 20 74 68 65 20 63 75 72 72 65  ver to the curre
92d0: 6e 74 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  nt thread..**.**
92e0: 20 41 20 75 6e 69 78 46 69 6c 65 20 69 73 20 6f   A unixFile is o
92f0: 6e 6c 79 20 6f 77 6e 65 64 20 62 79 20 61 20 74  nly owned by a t
9300: 68 72 65 61 64 20 6f 6e 20 73 79 73 74 65 6d 73  hread on systems
9310: 20 74 68 61 74 20 75 73 65 20 4c 69 6e 75 78 54   that use LinuxT
9320: 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 4f 77  hreads..**.** Ow
9330: 6e 65 72 73 68 69 70 20 74 72 61 6e 73 66 65 72  nership transfer
9340: 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64   is only allowed
9350: 20 69 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65   if the unixFile
9360: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e   is currently un
9370: 6c 6f 63 6b 65 64 2e 0a 2a 2a 20 49 66 20 74 68  locked..** If th
9380: 65 20 75 6e 69 78 46 69 6c 65 20 69 73 20 6c 6f  e unixFile is lo
9390: 63 6b 65 64 20 61 6e 64 20 61 6e 20 6f 77 6e 65  cked and an owne
93a0: 72 73 68 69 70 20 69 73 20 77 72 6f 6e 67 2c 20  rship is wrong, 
93b0: 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 53  then return.** S
93c0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e 20 20 53  QLITE_MISUSE.  S
93d0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
93e0: 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 69  rned if everythi
93f0: 6e 67 20 77 6f 72 6b 73 2e 0a 2a 2f 0a 23 69 66  ng works..*/.#if
9400: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
9410: 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  FE && defined(__
9420: 6c 69 6e 75 78 5f 5f 29 0a 73 74 61 74 69 63 20  linux__).static 
9430: 69 6e 74 20 74 72 61 6e 73 66 65 72 4f 77 6e 65  int transferOwne
9440: 72 73 68 69 70 28 75 6e 69 78 46 69 6c 65 20 2a  rship(unixFile *
9450: 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63  pFile){.  int rc
9460: 3b 0a 20 20 70 74 68 72 65 61 64 5f 74 20 68 53  ;.  pthread_t hS
9470: 65 6c 66 3b 0a 20 20 69 66 28 20 74 68 72 65 61  elf;.  if( threa
9480: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
9490: 68 65 72 73 4c 6f 63 6b 73 20 29 7b 0a 20 20 20  hersLocks ){.   
94a0: 20 2f 2a 20 4f 77 6e 65 72 73 68 69 70 20 74 72   /* Ownership tr
94b0: 61 6e 73 66 65 72 73 20 6e 6f 74 20 6e 65 65 64  ansfers not need
94c0: 65 64 20 6f 6e 20 74 68 69 73 20 73 79 73 74 65  ed on this syste
94d0: 6d 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  m */.    return 
94e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
94f0: 20 68 53 65 6c 66 20 3d 20 70 74 68 72 65 61 64   hSelf = pthread
9500: 5f 73 65 6c 66 28 29 3b 0a 20 20 69 66 28 20 70  _self();.  if( p
9510: 74 68 72 65 61 64 5f 65 71 75 61 6c 28 70 46 69  thread_equal(pFi
9520: 6c 65 2d 3e 74 69 64 2c 20 68 53 65 6c 66 29 20  le->tid, hSelf) 
9530: 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65  ){.    /* We are
9540: 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 73 61   still in the sa
9550: 6d 65 20 74 68 72 65 61 64 20 2a 2f 0a 20 20 20  me thread */.   
9560: 20 4f 53 54 52 41 43 45 31 28 22 4e 6f 2d 74 72   OSTRACE1("No-tr
9570: 61 6e 73 66 65 72 2c 20 73 61 6d 65 20 74 68 72  ansfer, same thr
9580: 65 61 64 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74  ead\n");.    ret
9590: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
95a0: 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e   }.  if( pFile->
95b0: 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43  locktype!=NO_LOC
95c0: 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 63  K ){.    /* We c
95d0: 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20 6f 77 6e  annot change own
95e0: 65 72 73 68 69 70 20 77 68 69 6c 65 20 77 65 20  ership while we 
95f0: 61 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f  are holding a lo
9600: 63 6b 21 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ck! */.    retur
9610: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
9620: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  BKPT;.  }.  OSTR
9630: 41 43 45 34 28 22 54 72 61 6e 73 66 65 72 20 6f  ACE4("Transfer o
9640: 77 6e 65 72 73 68 69 70 20 6f 66 20 25 64 20 66  wnership of %d f
9650: 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c  rom %d to %d\n",
9660: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69  .            pFi
9670: 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 74 69  le->h, pFile->ti
9680: 64 2c 20 68 53 65 6c 66 29 3b 0a 20 20 70 46 69  d, hSelf);.  pFi
9690: 6c 65 2d 3e 74 69 64 20 3d 20 68 53 65 6c 66 3b  le->tid = hSelf;
96a0: 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 70 4c  .  if (pFile->pL
96b0: 6f 63 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20  ock != NULL) {. 
96c0: 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e     releaseLockIn
96d0: 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29  fo(pFile->pLock)
96e0: 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c  ;.    rc = findL
96f0: 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2c 20 26  ockInfo(pFile, &
9700: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2c 20 30 29  pFile->pLock, 0)
9710: 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 35 28 22  ;.    OSTRACE5("
9720: 4c 4f 43 4b 20 20 20 20 25 64 20 69 73 20 6e 6f  LOCK    %d is no
9730: 77 20 25 73 28 25 73 2c 25 64 29 5c 6e 22 2c 20  w %s(%s,%d)\n", 
9740: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
9750: 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d       locktypeNam
9760: 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  e(pFile->locktyp
9770: 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c  e),.           l
9780: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c  ocktypeName(pFil
9790: 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  e->pLock->lockty
97a0: 70 65 29 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  pe), pFile->pLoc
97b0: 6b 2d 3e 63 6e 74 29 3b 0a 20 20 20 20 72 65 74  k->cnt);.    ret
97c0: 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65  urn rc;.  } else
97d0: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51   {.    return SQ
97e0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 23  LITE_OK;.  }.}.#
97f0: 65 6c 73 65 20 20 2f 2a 20 69 66 20 6e 6f 74 20  else  /* if not 
9800: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
9810: 45 20 2a 2f 0a 20 20 2f 2a 20 4f 6e 20 73 69 6e  E */.  /* On sin
9820: 67 6c 65 2d 74 68 72 65 61 64 65 64 20 62 75 69  gle-threaded bui
9830: 6c 64 73 2c 20 6f 77 6e 65 72 73 68 69 70 20 74  lds, ownership t
9840: 72 61 6e 73 66 65 72 20 69 73 20 61 20 6e 6f 2d  ransfer is a no-
9850: 6f 70 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 74  op */.# define t
9860: 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70  ransferOwnership
9870: 28 58 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (X) SQLITE_OK.#e
9880: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54  ndif /* SQLITE_T
9890: 48 52 45 41 44 53 41 46 45 20 2a 2f 0a 0a 0a 2f  HREADSAFE */.../
98a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
98b0: 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
98c0: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
98d0: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
98e0: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
98f0: 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
9900: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
9910: 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
9920: 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
9930: 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
9940: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
9950: 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
9960: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
9970: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
9980: 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
9990: 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
99a0: 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
99b0: 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
99c0: 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
99d0: 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63  tic int unixChec
99e0: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
99f0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
9a00: 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
9a10: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
9a20: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
9a30: 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
9a40: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
9a50: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
9a60: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
9a70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
9a80: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
9a90: 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73  DLOCK; );..  ass
9aa0: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
9ab0: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
9ac0: 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69  ; /* Because pFi
9ad0: 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61  le->pLock is sha
9ae0: 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
9af0: 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63  ds */..  /* Chec
9b00: 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
9b10: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
9b20: 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
9b30: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
9b40: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pLock->locktype>
9b50: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
9b60: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
9b70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72  .  }..  /* Other
9b80: 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
9b90: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
9ba0: 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69  olds it..  */.#i
9bb0: 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a  fndef __DJGPP__.
9bc0: 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
9bd0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c  ){.    struct fl
9be0: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f  ock lock;.    lo
9bf0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
9c00: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b  EK_SET;.    lock
9c10: 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52  .l_start = RESER
9c20: 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  VED_BYTE;.    lo
9c30: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  ck.l_len = 1;.  
9c40: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
9c50: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66 20  F_WRLCK;.    if 
9c60: 28 2d 31 20 3d 3d 20 66 63 6e 74 6c 28 70 46 69  (-1 == fcntl(pFi
9c70: 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  le->h, F_GETLK, 
9c80: 26 6c 6f 63 6b 29 29 20 7b 0a 20 20 20 20 20 20  &lock)) {.      
9c90: 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
9ca0: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
9cb0: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
9cc0: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
9cd0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
9ce0: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29  ECKRESERVEDLOCK)
9cf0: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
9d00: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
9d10: 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  o;.    } else if
9d20: 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46  ( lock.l_type!=F
9d30: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
9d40: 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
9d50: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
9d60: 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74   .  unixLeaveMut
9d70: 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 34  ex();.  OSTRACE4
9d80: 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
9d90: 64 20 25 64 20 25 64 20 28 75 6e 69 78 29 5c 6e  d %d %d (unix)\n
9da0: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
9db0: 20 72 65 73 65 72 76 65 64 29 3b 0a 0a 20 20 2a   reserved);..  *
9dc0: 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
9dd0: 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
9de0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
9df0: 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
9e00: 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
9e10: 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63  by parameter loc
9e20: 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  ktype - one.** o
9e30: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
9e40: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
9e50: 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
9e60: 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
9e70: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
9e80: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
9e90: 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
9ea0: 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
9eb0: 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
9ec0: 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
9ed0: 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
9ee0: 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
9ef0: 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
9f00: 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
9f10: 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
9f20: 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
9f30: 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
9f40: 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
9f50: 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
9f60: 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
9f70: 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
9f80: 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
9f90: 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
9fa0: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
9fb0: 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
9fc0: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
9fd0: 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
9fe0: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
9ff0: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
a000: 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
a010: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
a020: 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
a030: 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
a040: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
a050: 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
a060: 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
a070: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
a080: 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
a090: 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
a0a0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
a0b0: 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
a0c0: 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
a0d0: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
a0e0: 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
a0f0: 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
a100: 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
a110: 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74  t unixLock(sqlit
a120: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
a130: 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 2f 2a   locktype){.  /*
a140: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64   The following d
a150: 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6d 70  escribes the imp
a160: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
a170: 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73  he various locks
a180: 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74   and.  ** lock t
a190: 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65  ransitions in te
a1a0: 72 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58  rms of the POSIX
a1b0: 20 61 64 76 69 73 6f 72 79 20 73 68 61 72 65 64   advisory shared
a1c0: 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20   and exclusive. 
a1d0: 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69   ** lock primiti
a1e0: 76 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64  ves (called read
a1f0: 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65  -locks and write
a200: 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f  -locks below, to
a210: 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66   avoid.  ** conf
a220: 75 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74  usion with SQLit
a230: 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54  e lock names). T
a240: 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72  he algorithms ar
a250: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20  e complicated.  
a260: 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f  ** slightly in o
a270: 72 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61  rder to be compa
a280: 74 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64 6f  tible with windo
a290: 77 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c  ws systems simul
a2a0: 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61  taneously.  ** a
a2b0: 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d  ccessing the sam
a2c0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
a2d0: 20 69 6e 20 63 61 73 65 20 74 68 61 74 20 69 73   in case that is
a2e0: 20 65 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a   ever required..
a2f0: 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c    **.  ** Symbol
a300: 73 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e  s defined in os.
a310: 68 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20  h indentify the 
a320: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61  'pending byte' a
a330: 6e 64 20 74 68 65 20 27 72 65 73 65 72 76 65 64  nd the 'reserved
a340: 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63  .  ** byte', eac
a350: 68 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61  h single bytes a
a360: 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66  t well known off
a370: 73 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73  sets, and the 's
a380: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
a390: 72 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20  range', a range 
a3a0: 6f 66 20 35 31 30 20 62 79 74 65 73 20 61 74 20  of 510 bytes at 
a3b0: 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66  a well known off
a3c0: 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  set..  **.  ** T
a3d0: 6f 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45  o obtain a SHARE
a3e0: 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c  D lock, a read-l
a3f0: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
a400: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a  on the 'pending.
a410: 20 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20    ** byte'.  If 
a420: 74 68 69 73 20 69 73 20 73 75 63 63 65 73 73 66  this is successf
a430: 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79 74  ul, a random byt
a440: 65 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72  e from the 'shar
a450: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
a460: 67 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b  ge' is read-lock
a470: 65 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  ed and the lock 
a480: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
a490: 62 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 0a  byte' released..
a4a0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63    **.  ** A proc
a4b0: 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74  ess may only obt
a4c0: 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
a4d0: 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73  ock after it has
a4e0: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a   a SHARED lock..
a4f0: 20 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20    ** A RESERVED 
a500: 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e  lock is implemen
a510: 74 65 64 20 62 79 20 67 72 61 62 62 69 6e 67 20  ted by grabbing 
a520: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
a530: 74 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76  the.  ** 'reserv
a540: 65 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a  ed byte'. .  **.
a550: 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d    ** A process m
a560: 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61  ay only obtain a
a570: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66   PENDING lock af
a580: 74 65 72 20 69 74 20 68 61 73 20 6f 62 74 61 69  ter it has obtai
a590: 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45  ned a.  ** SHARE
a5a0: 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e  D lock. A PENDIN
a5b0: 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d  G lock is implem
a5c0: 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69  ented by obtaini
a5d0: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a  ng a write-lock.
a5e0: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e    ** on the 'pen
a5f0: 64 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73  ding byte'. This
a600: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f   ensures that no
a610: 20 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b   new SHARED lock
a620: 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62  s can be.  ** ob
a630: 74 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73  tained, but exis
a640: 74 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b  ting SHARED lock
a650: 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f  s are allowed to
a660: 20 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63   persist. A proc
a670: 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  ess.  ** does no
a680: 74 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e  t have to obtain
a690: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
a6a0: 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61   on the way to a
a6b0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20   PENDING lock.. 
a6c0: 20 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74   ** This propert
a6d0: 79 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  y is used by the
a6e0: 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72   algorithm for r
a6f0: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f  olling back a jo
a700: 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20  urnal file.  ** 
a710: 61 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20  after a crash.. 
a720: 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c   **.  ** An EXCL
a730: 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61  USIVE lock, obta
a740: 69 6e 65 64 20 61 66 74 65 72 20 61 20 50 45 4e  ined after a PEN
a750: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c  DING lock is hel
a760: 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65  d, is.  ** imple
a770: 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e  mented by obtain
a780: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
a790: 20 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27   on the entire '
a7a0: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
a7b0: 20 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61   range'. Since a
a7c0: 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72  ll other locks r
a7d0: 65 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f  equire a read-lo
a7e0: 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  ck on one of the
a7f0: 20 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68   bytes.  ** with
a800: 69 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74  in this range, t
a810: 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
a820: 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20   no other locks 
a830: 61 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a  are held on the.
a840: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a    ** database. .
a850: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65    **.  ** The re
a860: 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62 79  ason a single by
a870: 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  te cannot be use
a880: 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  d instead of the
a890: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
a8a0: 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68 61  ** range' is tha
a8b0: 74 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20  t some versions 
a8c0: 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f  of windows do no
a8d0: 74 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d 6c  t support read-l
a8e0: 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f  ocks. By.  ** lo
a8f0: 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62  cking a random b
a900: 79 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67 65  yte from a range
a910: 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48 41  , concurrent SHA
a920: 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78  RED locks may ex
a930: 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66  ist.  ** even if
a940: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69   the locking pri
a950: 6d 69 74 69 76 65 20 75 73 65 64 20 69 73 20 61  mitive used is a
a960: 6c 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c 6f  lways a write-lo
a970: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72  ck..  */.  int r
a980: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
a990: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
a9a0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
a9b0: 3b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c  ;.  struct unixL
a9c0: 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 20 3d  ockInfo *pLock =
a9d0: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20   pFile->pLock;. 
a9e0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
a9f0: 63 6b 3b 0a 20 20 69 6e 74 20 73 20 3d 20 30 3b  ck;.  int s = 0;
aa00: 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20  .  int tErrno = 
aa10: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  0;..  assert( pF
aa20: 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
aa30: 37 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  7("LOCK    %d %s
aa40: 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70   was %s(%s,%d) p
aa50: 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c  id=%d (unix)\n",
aa60: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
aa70: 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f   locktypeName(lo
aa80: 63 6b 74 79 70 65 29 2c 20 6c 6f 63 6b 74 79 70  cktype), locktyp
aa90: 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63  eName(pFile->loc
aaa0: 6b 74 79 70 65 29 2c 0a 20 20 20 20 20 20 6c 6f  ktype),.      lo
aab0: 63 6b 74 79 70 65 4e 61 6d 65 28 70 4c 6f 63 6b  cktypeName(pLock
aac0: 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 70 4c 6f  ->locktype), pLo
aad0: 63 6b 2d 3e 63 6e 74 20 2c 20 67 65 74 70 69 64  ck->cnt , getpid
aae0: 28 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ());..  /* If th
aaf0: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
ab00: 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
ab10: 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
ab20: 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
ab30: 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20  ** unixFile, do 
ab40: 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
ab50: 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a  se the end_lock:
ab60: 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
ab70: 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74   ** unixEnterMut
ab80: 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
ab90: 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
aba0: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
abb0: 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70  ocktype>=locktyp
abc0: 65 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  e ){.    OSTRACE
abd0: 33 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  3("LOCK    %d %s
abe0: 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c   ok (already hel
abf0: 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  d) (unix)\n", pF
ac00: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
ac10: 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65      locktypeName
ac20: 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 20  (locktype));.   
ac30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
ac40: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
ac50: 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
ac60: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
ac70: 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31  orrect..  **  (1
ac80: 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20  ) We never move 
ac90: 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f  from unlocked to
aca0: 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72   anything higher
acb0: 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63   than shared loc
acc0: 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c  k..  **  (2) SQL
acd0: 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63  ite never explic
ace0: 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20  itly requests a 
acf0: 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a  pendig lock..  *
ad00: 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64 20  *  (3) A shared 
ad10: 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68  lock is always h
ad20: 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 72  eld when a reser
ad30: 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ve lock is reque
ad40: 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sted..  */.  ass
ad50: 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
ad60: 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  type!=NO_LOCK ||
ad70: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
ad80: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
ad90: 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45  rt( locktype!=PE
ada0: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20  NDING_LOCK );.  
adb0: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
adc0: 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  !=RESERVED_LOCK 
add0: 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  || pFile->lockty
ade0: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
adf0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75  );..  /* This mu
ae00: 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62 65  tex is needed be
ae10: 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f  cause pFile->pLo
ae20: 63 6b 20 69 73 20 73 68 61 72 65 64 20 61 63 72  ck is shared acr
ae30: 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f  oss threads.  */
ae40: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
ae50: 78 28 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  x();..  /* Make 
ae60: 73 75 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  sure the current
ae70: 20 74 68 72 65 61 64 20 6f 77 6e 73 20 74 68 65   thread owns the
ae80: 20 70 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72   pFile..  */.  r
ae90: 63 20 3d 20 74 72 61 6e 73 66 65 72 4f 77 6e 65  c = transferOwne
aea0: 72 73 68 69 70 28 70 46 69 6c 65 29 3b 0a 20 20  rship(pFile);.  
aeb0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
aec0: 4b 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c 65 61  K ){.    unixLea
aed0: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  veMutex();.    r
aee0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
aef0: 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70  pLock = pFile->p
af00: 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 73  Lock;..  /* If s
af10: 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
af20: 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20   this PID has a 
af30: 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65  lock via a diffe
af40: 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20  rent unixFile*. 
af50: 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20   ** handle that 
af60: 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65  precludes the re
af70: 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65  quested lock, re
af80: 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a  turn BUSY..  */.
af90: 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 6c 6f    if( (pFile->lo
afa0: 63 6b 74 79 70 65 21 3d 70 4c 6f 63 6b 2d 3e 6c  cktype!=pLock->l
afb0: 6f 63 6b 74 79 70 65 20 26 26 20 0a 20 20 20 20  ocktype && .    
afc0: 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f        (pLock->lo
afd0: 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f  cktype>=PENDING_
afe0: 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65  LOCK || locktype
aff0: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20  >SHARED_LOCK)). 
b000: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
b010: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f  ITE_BUSY;.    go
b020: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  to end_lock;.  }
b030: 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52  ..  /* If a SHAR
b040: 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ED lock is reque
b050: 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74  sted, and some t
b060: 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
b070: 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a   PID already.  *
b080: 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f  * has a SHARED o
b090: 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  r RESERVED lock,
b0a0: 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   then increment 
b0b0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73  reference counts
b0c0: 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e   and.  ** return
b0d0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f   SQLITE_OK..  */
b0e0: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
b0f0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
b100: 0a 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c  .      (pLock->l
b110: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
b120: 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c  LOCK || pLock->l
b130: 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45  ocktype==RESERVE
b140: 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61  D_LOCK) ){.    a
b150: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3d  ssert( locktype=
b160: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
b170: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
b180: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29  e->locktype==0 )
b190: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
b1a0: 6f 63 6b 2d 3e 63 6e 74 3e 30 20 29 3b 0a 20 20  ock->cnt>0 );.  
b1b0: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
b1c0: 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  e = SHARED_LOCK;
b1d0: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2b  .    pLock->cnt+
b1e0: 2b 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f  +;.    pFile->pO
b1f0: 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  pen->nLock++;.  
b200: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
b210: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50 45  .  }...  /* A PE
b220: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65  NDING lock is ne
b230: 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75  eded before acqu
b240: 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
b250: 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20  ock and before. 
b260: 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e   ** acquiring an
b270: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
b280: 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44    For the SHARED
b290: 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49   lock, the PENDI
b2a0: 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  NG will.  ** be 
b2b0: 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20  released..  */. 
b2c0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
b2d0: 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63  ;.  lock.l_whenc
b2e0: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
b2f0: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
b300: 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20  ARED_LOCK .     
b310: 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45   || (locktype==E
b320: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
b330: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
b340: 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20  <PENDING_LOCK). 
b350: 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   ){.    lock.l_t
b360: 79 70 65 20 3d 20 28 6c 6f 63 6b 74 79 70 65 3d  ype = (locktype=
b370: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52  =SHARED_LOCK?F_R
b380: 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20  DLCK:F_WRLCK);. 
b390: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
b3a0: 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
b3b0: 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 70 46      s = fcntl(pF
b3c0: 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ile->h, F_SETLK,
b3d0: 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   &lock);.    if(
b3e0: 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20   s==(-1) ){.    
b3f0: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
b400: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
b410: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
b420: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
b430: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
b440: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f  );.      if( IS_
b450: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
b460: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
b470: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
b480: 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rno;.      }.   
b490: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
b4a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
b4b0: 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65  /* If control ge
b4c0: 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ts to this point
b4d0: 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20  , then actually 
b4e0: 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b  go ahead and mak
b4f0: 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67  e.  ** operating
b500: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f   system calls fo
b510: 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
b520: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lock..  */.  if(
b530: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
b540: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
b550: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74  sert( pLock->cnt
b560: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
b570: 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  t( pLock->lockty
b580: 70 65 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a  pe==0 );..    /*
b590: 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61   Now get the rea
b5a0: 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f  d-lock */.    lo
b5b0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
b5c0: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c  RED_FIRST;.    l
b5d0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
b5e0: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28  ED_SIZE;.    if(
b5f0: 20 28 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c   (s = fcntl(pFil
b600: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
b610: 6c 6f 63 6b 29 29 3d 3d 28 2d 31 29 20 29 7b 0a  lock))==(-1) ){.
b620: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
b630: 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
b640: 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70  /* Drop the temp
b650: 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f  orary PENDING lo
b660: 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c  ck */.    lock.l
b670: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
b680: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
b690: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20  l_len = 1L;.    
b6a0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
b6b0: 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 66  UNLCK;.    if( f
b6c0: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
b6d0: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d  _SETLK, &lock)!=
b6e0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  0 ){.      if( s
b6f0: 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20   != -1 ){.      
b700: 20 20 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64 20    /* This could 
b710: 68 61 70 70 65 6e 20 77 69 74 68 20 61 20 6e 65  happen with a ne
b720: 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20  twork mount */. 
b730: 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
b740: 65 72 72 6e 6f 3b 20 0a 20 20 20 20 20 20 20 20  errno; .        
b750: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
b760: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
b770: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
b780: 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20  ERR_UNLOCK); .  
b790: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
b7a0: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
b7b0: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
b7c0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
b7d0: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  no;.        }.  
b7e0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c        goto end_l
b7f0: 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ock;.      }.   
b800: 20 7d 0a 20 20 20 20 69 66 28 20 73 3d 3d 28 2d   }.    if( s==(-
b810: 31 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  1) ){.      rc =
b820: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
b830: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
b840: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
b850: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
b860: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
b870: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  c) ){.        pF
b880: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
b890: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d   tErrno;.      }
b8a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b8b0: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
b8c0: 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  e = SHARED_LOCK;
b8d0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f  .      pFile->pO
b8e0: 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  pen->nLock++;.  
b8f0: 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d      pLock->cnt =
b900: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
b910: 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d  e if( locktype==
b920: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
b930: 26 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31 20 29  & pLock->cnt>1 )
b940: 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20  {.    /* We are 
b950: 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78  trying for an ex
b960: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74  clusive lock but
b970: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
b980: 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73  in this.    ** s
b990: 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73  ame process is s
b9a0: 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73  till holding a s
b9b0: 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20  hared lock. */. 
b9c0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
b9d0: 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  USY;.  }else{.  
b9e0: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
b9f0: 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52   was for a RESER
ba00: 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
ba10: 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20   lock.  It is.  
ba20: 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61    ** assumed tha
ba30: 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41  t there is a SHA
ba40: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
ba50: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
ba60: 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a      ** already..
ba70: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
ba80: 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 6c 6f 63  t( 0!=pFile->loc
ba90: 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 6c 6f 63  ktype );.    loc
baa0: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
bab0: 43 4b 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  CK;.    switch( 
bac0: 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
bad0: 20 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f    case RESERVED_
bae0: 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f  LOCK:.        lo
baf0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53  ck.l_start = RES
bb00: 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20  ERVED_BYTE;.    
bb10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bb20: 20 63 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f   case EXCLUSIVE_
bb30: 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f  LOCK:.        lo
bb40: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
bb50: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
bb60: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
bb70: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
bb80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bb90: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
bba0: 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
bbb0: 20 20 7d 0a 20 20 20 20 73 20 3d 20 66 63 6e 74    }.    s = fcnt
bbc0: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45  l(pFile->h, F_SE
bbd0: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20  TLK, &lock);.   
bbe0: 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a   if( s==(-1) ){.
bbf0: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
bc00: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
bc10: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
bc20: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
bc30: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
bc40: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
bc50: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
bc60: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  c) ){.        pF
bc70: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
bc80: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d   tErrno;.      }
bc90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23  .    }.  }.  ..#
bca0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
bcb0: 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20 74 72  /* Set up the tr
bcc0: 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65  ansaction-counte
bcd0: 72 20 63 68 61 6e 67 65 20 63 68 65 63 6b 69 6e  r change checkin
bce0: 67 20 66 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a  g flags when.  *
bcf0: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20  * transitioning 
bd00: 66 72 6f 6d 20 61 20 53 48 41 52 45 44 20 74 6f  from a SHARED to
bd10: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
bd20: 2e 20 20 54 68 65 20 63 68 61 6e 67 65 0a 20 20  .  The change.  
bd30: 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74  ** from SHARED t
bd40: 6f 20 52 45 53 45 52 56 45 44 20 6d 61 72 6b 73  o RESERVED marks
bd50: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
bd60: 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20  f a normal.  ** 
bd70: 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  write operation 
bd80: 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e  (not a hot journ
bd90: 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20  al rollback)..  
bda0: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
bdb0: 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69  ITE_OK.   && pFi
bdc0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  le->locktype<=SH
bdd0: 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20  ARED_LOCK.   && 
bde0: 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56  locktype==RESERV
bdf0: 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20  ED_LOCK.  ){.   
be00: 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
be10: 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70  rChng = 0;.    p
be20: 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d  File->dbUpdate =
be30: 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69   0;.    pFile->i
be40: 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 31  nNormalWrite = 1
be50: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20  ;.  }.#endif... 
be60: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
be70: 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OK ){.    pFile-
be80: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
be90: 74 79 70 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  type;.    pLock-
bea0: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
beb0: 74 79 70 65 3b 0a 20 20 7d 65 6c 73 65 20 69 66  type;.  }else if
bec0: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  ( locktype==EXCL
bed0: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
bee0: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
bef0: 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  e = PENDING_LOCK
bf00: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  ;.    pLock->loc
bf10: 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f  ktype = PENDING_
bf20: 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c  LOCK;.  }..end_l
bf30: 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65  ock:.  unixLeave
bf40: 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
bf50: 43 45 34 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE4("LOCK    %d 
bf60: 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c  %s %s (unix)\n",
bf70: 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74   pFile->h, lockt
bf80: 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65  ypeName(locktype
bf90: 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51  ), .      rc==SQ
bfa0: 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
bfb0: 20 22 66 61 69 6c 65 64 22 29 3b 0a 20 20 72 65   "failed");.  re
bfc0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
bfd0: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  * Close all file
bfe0: 20 64 65 73 63 72 69 70 74 6f 72 73 20 61 63 63   descriptors acc
bff0: 75 6d 75 61 74 65 64 20 69 6e 20 74 68 65 20 75  umuated in the u
c000: 6e 69 78 4f 70 65 6e 43 6e 74 2d 3e 70 55 6e 75  nixOpenCnt->pUnu
c010: 73 65 64 20 6c 69 73 74 2e 0a 2a 2a 20 49 66 20  sed list..** If 
c020: 61 6c 6c 20 73 75 63 68 20 66 69 6c 65 20 64 65  all such file de
c030: 73 63 72 69 70 74 6f 72 73 20 61 72 65 20 63 6c  scriptors are cl
c040: 6f 73 65 64 20 77 69 74 68 6f 75 74 20 65 72 72  osed without err
c050: 6f 72 2c 20 74 68 65 20 6c 69 73 74 20 69 73 0a  or, the list is.
c060: 2a 2a 20 63 6c 65 61 72 65 64 20 61 6e 64 20 53  ** cleared and S
c070: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
c080: 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  d..**.** Otherwi
c090: 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  se, if an error 
c0a0: 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 73 75 63  occurs, then suc
c0b0: 63 65 73 73 66 75 6c 6c 79 20 63 6c 6f 73 65 64  cessfully closed
c0c0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
c0d0: 0a 2a 2a 20 65 6e 74 72 69 65 73 20 61 72 65 20  .** entries are 
c0e0: 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
c0f0: 20 6c 69 73 74 2c 20 61 6e 64 20 53 51 4c 49 54   list, and SQLIT
c100: 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 20 72 65  E_IOERR_CLOSE re
c110: 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 6e 6f 74 20  turned. .** not 
c120: 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49  deleted and SQLI
c130: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 20 72  TE_IOERR_CLOSE r
c140: 65 74 75 72 6e 65 64 2e 0a 2a 2f 20 0a 73 74 61  eturned..*/ .sta
c150: 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 50 65 6e  tic int closePen
c160: 64 69 6e 67 46 64 73 28 75 6e 69 78 46 69 6c 65  dingFds(unixFile
c170: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
c180: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c190: 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65    struct unixOpe
c1a0: 6e 43 6e 74 20 2a 70 4f 70 65 6e 20 3d 20 70 46  nCnt *pOpen = pF
c1b0: 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20 55 6e  ile->pOpen;.  Un
c1c0: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 45 72 72  ixUnusedFd *pErr
c1d0: 6f 72 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e  or = 0;.  UnixUn
c1e0: 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69  usedFd *p;.  Uni
c1f0: 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74  xUnusedFd *pNext
c200: 3b 0a 20 20 66 6f 72 28 70 3d 70 4f 70 65 6e 2d  ;.  for(p=pOpen-
c210: 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d 70  >pUnused; p; p=p
c220: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
c230: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   = p->pNext;.   
c240: 20 69 66 28 20 63 6c 6f 73 65 28 70 2d 3e 66 64   if( close(p->fd
c250: 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
c260: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
c270: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
c280: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
c290: 53 45 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65  SE;.      p->pNe
c2a0: 78 74 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20  xt = pError;.   
c2b0: 20 20 20 70 45 72 72 6f 72 20 3d 20 70 3b 0a 20     pError = p;. 
c2c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c2d0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
c2e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4f 70  .    }.  }.  pOp
c2f0: 65 6e 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 45  en->pUnused = pE
c300: 72 72 6f 72 3b 0a 20 20 72 65 74 75 72 6e 20 72  rror;.  return r
c310: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  c;.}../*.** Add 
c320: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
c330: 74 6f 72 20 75 73 65 64 20 62 79 20 66 69 6c 65  tor used by file
c340: 20 68 61 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f   handle pFile to
c350: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
c360: 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69  ng.** pUnused li
c370: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
c380: 69 64 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28  id setPendingFd(
c390: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
c3a0: 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f  {.  struct unixO
c3b0: 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 20 3d 20  penCnt *pOpen = 
c3c0: 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20  pFile->pOpen;.  
c3d0: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 20  UnixUnusedFd *p 
c3e0: 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64  = pFile->pUnused
c3f0: 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  ;.  p->pNext = p
c400: 4f 70 65 6e 2d 3e 70 55 6e 75 73 65 64 3b 0a 20  Open->pUnused;. 
c410: 20 70 4f 70 65 6e 2d 3e 70 55 6e 75 73 65 64 20   pOpen->pUnused 
c420: 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20  = p;.  pFile->h 
c430: 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d 3e 70  = -1;.  pFile->p
c440: 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f  Unused = 0;.}../
c450: 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
c460: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
c470: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
c480: 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70  pFile to locktyp
c490: 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20  e.  locktype.** 
c4a0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
c4b0: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
c4c0: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
c4d0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
c4e0: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
c4f0: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
c500: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
c510: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
c520: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
c530: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
c540: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20  a no-op..** .** 
c550: 49 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  If handleNFSUnlo
c560: 63 6b 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ck is true, then
c570: 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67 20   on downgrading 
c580: 61 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  an EXCLUSIVE_LOC
c590: 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74  K to SHARED.** t
c5a0: 68 65 20 62 79 74 65 20 72 61 6e 67 65 20 69 73  he byte range is
c5b0: 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 32 20   divided into 2 
c5c0: 70 61 72 74 73 20 61 6e 64 20 74 68 65 20 66 69  parts and the fi
c5d0: 72 73 74 20 70 61 72 74 20 69 73 20 75 6e 6c 6f  rst part is unlo
c5e0: 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74  cked then.** set
c5f0: 20 74 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c   to a read lock,
c600: 20 74 68 65 6e 20 74 68 65 20 6f 74 68 65 72 20   then the other 
c610: 70 61 72 74 20 69 73 20 73 69 6d 70 6c 79 20 75  part is simply u
c620: 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73 20 77  nlocked.  This w
c630: 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20  orks .** around 
c640: 61 20 62 75 67 20 69 6e 20 42 53 44 20 4e 46 53  a bug in BSD NFS
c650: 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65 65   lockd (also see
c660: 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33  n on MacOSX 10.3
c670: 2b 29 20 74 68 61 74 20 66 61 69 6c 73 20 74 6f  +) that fails to
c680: 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20   .** remove the 
c690: 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20  write lock on a 
c6a0: 72 65 67 69 6f 6e 20 77 68 65 6e 20 61 20 72 65  region when a re
c6b0: 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a  ad lock is set..
c6c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 70  */.static int _p
c6d0: 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  osixUnlock(sqlit
c6e0: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
c6f0: 20 6c 6f 63 6b 74 79 70 65 2c 20 69 6e 74 20 68   locktype, int h
c700: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b  andleNFSUnlock){
c710: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
c720: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
c730: 69 64 3b 0a 20 20 73 74 72 75 63 74 20 75 6e 69  id;.  struct uni
c740: 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b  xLockInfo *pLock
c750: 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
c760: 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20   lock;.  int rc 
c770: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
c780: 6e 74 20 68 3b 0a 20 20 69 6e 74 20 74 45 72 72  nt h;.  int tErr
c790: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
c7a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
c7b0: 72 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74  r code from syst
c7c0: 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a  em call errors *
c7d0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  /..  assert( pFi
c7e0: 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 37  le );.  OSTRACE7
c7f0: 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
c800: 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69  was %d(%d,%d) pi
c810: 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20  d=%d (unix)\n", 
c820: 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79  pFile->h, lockty
c830: 70 65 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  pe,.      pFile-
c840: 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65  >locktype, pFile
c850: 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70  ->pLock->locktyp
c860: 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d  e, pFile->pLock-
c870: 3e 63 6e 74 2c 20 67 65 74 70 69 64 28 29 29 3b  >cnt, getpid());
c880: 0a 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ..  assert( lock
c890: 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  type<=SHARED_LOC
c8a0: 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  K );.  if( pFile
c8b0: 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b  ->locktype<=lock
c8c0: 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75  type ){.    retu
c8d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
c8e0: 7d 0a 20 20 69 66 28 20 43 48 45 43 4b 5f 54 48  }.  if( CHECK_TH
c8f0: 52 45 41 44 49 44 28 70 46 69 6c 65 29 20 29 7b  READID(pFile) ){
c900: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c910: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
c920: 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d    }.  unixEnterM
c930: 75 74 65 78 28 29 3b 0a 20 20 68 20 3d 20 70 46  utex();.  h = pF
c940: 69 6c 65 2d 3e 68 3b 0a 20 20 70 4c 6f 63 6b 20  ile->h;.  pLock 
c950: 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a  = pFile->pLock;.
c960: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
c970: 3e 63 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66 28  >cnt!=0 );.  if(
c980: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
c990: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
c9a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
c9b0: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 70 46 69  k->locktype==pFi
c9c0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a  le->locktype );.
c9d0: 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
c9e0: 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
c9f0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
ca00: 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20  r( h=(-1) ).    
ca10: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
ca20: 65 6e 69 67 6e 28 30 29 3b 0a 0a 23 69 66 6e 64  enign(0);..#ifnd
ca30: 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a  ef NDEBUG.    /*
ca40: 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61   When reducing a
ca50: 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20   lock such that 
ca60: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
ca70: 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a  can start.    **
ca80: 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74   reading the dat
ca90: 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e  abase file again
caa0: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  , make sure that
cab0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
cac0: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
cad0: 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61  was updated if a
cae0: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ny part of the d
caf0: 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
cb00: 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66  ile changed.  If
cb10: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
cb20: 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20   counter is not 
cb30: 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20  updated,.    ** 
cb40: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
cb50: 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69  s to the same fi
cb60: 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61  le might not rea
cb70: 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  lize that.    **
cb80: 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68   the file has ch
cb90: 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20  anged and hence 
cba0: 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74  might not know t
cbb0: 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20  o flush their.  
cbc0: 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65    ** cache.  The
cbd0: 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20   use of a stale 
cbe0: 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74  cache can lead t
cbf0: 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
cc00: 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
cc10: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
cc20: 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d  >inNormalWrite==
cc30: 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46  0.         || pF
cc40: 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30  ile->dbUpdate==0
cc50: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69  .         || pFi
cc60: 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
cc70: 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46 69 6c  g==1 );.    pFil
cc80: 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
cc90: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
cca0: 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e 67    /* downgrading
ccb0: 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63   to a shared loc
ccc0: 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76 65  k on NFS involve
ccd0: 73 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 77  s clearing the w
cce0: 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a  rite lock.    **
ccf0: 20 62 65 66 6f 72 65 20 65 73 74 61 62 6c 69 73   before establis
cd00: 68 69 6e 67 20 74 68 65 20 72 65 61 64 6c 6f 63  hing the readloc
cd10: 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 72  k - to avoid a r
cd20: 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77 65  ace condition we
cd30: 20 64 6f 77 6e 67 72 61 64 65 0a 20 20 20 20 2a   downgrade.    *
cd40: 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32 20  * the lock in 2 
cd50: 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74 20  blocks, so that 
cd60: 70 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67  part of the rang
cd70: 65 20 77 69 6c 6c 20 62 65 20 63 6f 76 65 72 65  e will be covere
cd80: 64 20 62 79 20 61 20 0a 20 20 20 20 2a 2a 20 77  d by a .    ** w
cd90: 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c 20  rite lock until 
cda0: 74 68 65 20 72 65 73 74 20 69 73 20 63 6f 76 65  the rest is cove
cdb0: 72 65 64 20 62 79 20 61 20 72 65 61 64 20 6c 6f  red by a read lo
cdc0: 63 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20 20  ck:.    **  1:  
cdd0: 20 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a 20   [WWWWW].    ** 
cde0: 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20   2:   [....W].  
cdf0: 20 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52 52    **  3:   [RRRR
ce00: 57 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20 20  W].    **  4:   
ce10: 5b 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20  [RRRR.].    */. 
ce20: 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d     if( locktype=
ce30: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
ce40: 20 20 20 20 20 20 69 66 28 20 68 61 6e 64 6c 65        if( handle
ce50: 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20  NFSUnlock ){.   
ce60: 20 20 20 20 20 6f 66 66 5f 74 20 64 69 76 53 69       off_t divSi
ce70: 7a 65 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  ze = SHARED_SIZE
ce80: 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20   - 1;.        . 
ce90: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79         lock.l_ty
cea0: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
ceb0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
cec0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
ced0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
cee0: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
cef0: 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
cf00: 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a  k.l_len = divSiz
cf10: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  e;.        if( f
cf20: 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c  cntl(h, F_SETLK,
cf30: 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b   &lock)==(-1) ){
cf40: 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e  .          tErrn
cf50: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
cf60: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
cf70: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
cf80: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
cf90: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
cfa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
cfb0: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
cfc0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
cfd0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
cfe0: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
cff0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d000: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
d010: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
d020: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
d030: 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20   = F_RDLCK;.    
d040: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
d050: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
d060: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
d070: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
d080: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
d090: 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b  l_len = divSize;
d0a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 63 6e  .        if( fcn
d0b0: 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  tl(h, F_SETLK, &
d0c0: 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20  lock)==(-1) ){. 
d0d0: 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20           tErrno 
d0e0: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
d0f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
d100: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
d110: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
d120: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a  _IOERR_RDLOCK);.
d130: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53            if( IS
d140: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
d150: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
d160: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
d170: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
d180: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
d190: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
d1a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d1b0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
d1c0: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20   F_UNLCK;.      
d1d0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
d1e0: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
d1f0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
d200: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
d210: 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
d220: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
d230: 41 52 45 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a  ARED_SIZE-divSiz
d240: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  e;.        if( f
d250: 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c  cntl(h, F_SETLK,
d260: 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b   &lock)==(-1) ){
d270: 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e  .          tErrn
d280: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
d290: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d2a0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
d2b0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
d2c0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
d2d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
d2e0: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
d2f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
d300: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
d310: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
d320: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d330: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
d340: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
d350: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d360: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
d370: 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_RDLCK;.       
d380: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
d390: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
d3a0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
d3b0: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
d3c0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
d3d0: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
d3e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 63  ;.        if( fc
d3f0: 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  ntl(h, F_SETLK, 
d400: 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a  &lock)==(-1) ){.
d410: 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f            tErrno
d420: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
d430: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
d440: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
d450: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
d460: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b  E_IOERR_RDLOCK);
d470: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49  .          if( I
d480: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
d490: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d4a0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
d4b0: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
d4c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
d4d0: 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
d4e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d4f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f    }.    }.    lo
d500: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
d510: 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  LCK;.    lock.l_
d520: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
d530: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  T;.    lock.l_st
d540: 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  art = PENDING_BY
d550: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
d560: 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74  en = 2L;  assert
d570: 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31  ( PENDING_BYTE+1
d580: 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20  ==RESERVED_BYTE 
d590: 29 3b 0a 20 20 20 20 69 66 28 20 66 63 6e 74 6c  );.    if( fcntl
d5a0: 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  (h, F_SETLK, &lo
d5b0: 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ck)!=(-1) ){.   
d5c0: 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79     pLock->lockty
d5d0: 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  pe = SHARED_LOCK
d5e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d5f0: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
d600: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
d610: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
d620: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
d630: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
d640: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
d650: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
d660: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
d670: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
d680: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
d690: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
d6a0: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  nlock;.    }.  }
d6b0: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
d6c0: 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  =NO_LOCK ){.    
d6d0: 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43  struct unixOpenC
d6e0: 6e 74 20 2a 70 4f 70 65 6e 3b 0a 0a 20 20 20 20  nt *pOpen;..    
d6f0: 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
d700: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75   shared lock cou
d710: 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74  nter.  Release t
d720: 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e  he lock using an
d730: 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20  .    ** OS call 
d740: 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68  only when all th
d750: 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61  reads in this sa
d760: 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20  me process have 
d770: 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20  released.    ** 
d780: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f  the lock..    */
d790: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2d  .    pLock->cnt-
d7a0: 2d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  -;.    if( pLock
d7b0: 2d 3e 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->cnt==0 ){.    
d7c0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
d7d0: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c  F_UNLCK;.      l
d7e0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
d7f0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c  EEK_SET;.      l
d800: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f  ock.l_start = lo
d810: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20  ck.l_len = 0L;. 
d820: 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
d830: 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
d840: 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
d850: 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20  rror( h=(-1) ). 
d860: 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
d870: 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
d880: 20 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68       if( fcntl(h
d890: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
d8a0: 29 21 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )!=(-1) ){.     
d8b0: 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79     pLock->lockty
d8c0: 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  pe = NO_LOCK;.  
d8d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d8e0: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
d8f0: 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  o;.        rc = 
d900: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
d910: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
d920: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
d930: 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  NLOCK);.        
d940: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
d950: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
d960: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
d970: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
d980: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d990: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20  pLock->locktype 
d9a0: 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
d9b0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
d9c0: 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  pe = NO_LOCK;.  
d9d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
d9e0: 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
d9f0: 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b 73  e count of locks
da00: 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 73 61   against this sa
da10: 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20 74  me file.  When t
da20: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20  he.    ** count 
da30: 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63 6c  reaches zero, cl
da40: 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66 69  ose any other fi
da50: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 77  le descriptors w
da60: 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20 2a  hose close.    *
da70: 2a 20 77 61 73 20 64 65 66 65 72 72 65 64 20 62  * was deferred b
da80: 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74 61  ecause of outsta
da90: 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20 20  nding locks..   
daa0: 20 2a 2f 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20   */.    pOpen = 
dab0: 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20  pFile->pOpen;.  
dac0: 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d 2d    pOpen->nLock--
dad0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
dae0: 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  pen->nLock>=0 );
daf0: 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e  .    if( pOpen->
db00: 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  nLock==0 ){.    
db10: 20 20 69 6e 74 20 72 63 32 20 3d 20 63 6c 6f 73    int rc2 = clos
db20: 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
db30: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
db40: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
db50: 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b         rc = rc2;
db60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
db70: 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a   }...end_unlock:
db80: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
db90: 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  x();.  if( rc==S
dba0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65  QLITE_OK ) pFile
dbb0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
dbc0: 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20  ktype;.  return 
dbd0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
dbe0: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
dbf0: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
dc00: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
dc10: 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b   locktype.  lock
dc20: 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20  type.** must be 
dc30: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
dc40: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
dc50: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
dc60: 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
dc70: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
dc80: 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
dc90: 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
dca0: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
dcb0: 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
dcc0: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
dcd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
dce0: 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  nixUnlock(sqlite
dcf0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
dd00: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 72 65 74  locktype){.  ret
dd10: 75 72 6e 20 5f 70 6f 73 69 78 55 6e 6c 6f 63 6b  urn _posixUnlock
dd20: 28 69 64 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 30  (id, locktype, 0
dd30: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
dd40: 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72   function perfor
dd50: 6d 73 20 74 68 65 20 70 61 72 74 73 20 6f 66 20  ms the parts of 
dd60: 74 68 65 20 22 63 6c 6f 73 65 20 66 69 6c 65 22  the "close file"
dd70: 20 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63   operation .** c
dd80: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63  ommon to all loc
dd90: 6b 69 6e 67 20 73 63 68 65 6d 65 73 2e 20 49 74  king schemes. It
dda0: 20 63 6c 6f 73 65 73 20 74 68 65 20 64 69 72 65   closes the dire
ddb0: 63 74 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a  ctory and file.*
ddc0: 2a 20 68 61 6e 64 6c 65 73 2c 20 69 66 20 74 68  * handles, if th
ddd0: 65 79 20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e  ey are valid, an
dde0: 64 20 73 65 74 73 20 61 6c 6c 20 66 69 65 6c 64  d sets all field
ddf0: 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c  s of the unixFil
de00: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74  e.** structure t
de10: 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  o 0..**.** It is
de20: 20 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72 79   *not* necessary
de30: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74   to hold the mut
de40: 65 78 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ex when this rou
de50: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a  tine is called,.
de60: 2a 2a 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72  ** even on VxWor
de70: 6b 73 2e 20 20 41 20 6d 75 74 65 78 20 77 69 6c  ks.  A mutex wil
de80: 6c 20 62 65 20 61 63 71 75 69 72 65 64 20 6f 6e  l be acquired on
de90: 20 56 78 57 6f 72 6b 73 20 62 79 20 74 68 65 0a   VxWorks by the.
dea0: 2a 2a 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73  ** vxworksReleas
deb0: 65 46 69 6c 65 49 64 28 29 20 72 6f 75 74 69 6e  eFileId() routin
dec0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
ded0: 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 73   closeUnixFile(s
dee0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
def0: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
df00: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
df10: 29 69 64 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  )id;.  if( pFile
df20: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69 6c   ){.    if( pFil
df30: 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20  e->dirfd>=0 ){. 
df40: 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 63       int err = c
df50: 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66  lose(pFile->dirf
df60: 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72  d);.      if( er
df70: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  r ){.        pFi
df80: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
df90: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
dfa0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
dfb0: 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20  RR_DIR_CLOSE;.  
dfc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dfd0: 20 20 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3d     pFile->dirfd=
dfe0: 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
dff0: 7d 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  }.    if( pFile-
e000: 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  >h>=0 ){.      i
e010: 6e 74 20 65 72 72 20 3d 20 63 6c 6f 73 65 28 70  nt err = close(p
e020: 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20  File->h);.      
e030: 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20  if( err ){.     
e040: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
e050: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
e060: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e070: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a  TE_IOERR_CLOSE;.
e080: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
e090: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
e0a0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 64 20   if( pFile->pId 
e0b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69  ){.      if( pFi
e0c0: 6c 65 2d 3e 69 73 44 65 6c 65 74 65 20 29 7b 0a  le->isDelete ){.
e0d0: 20 20 20 20 20 20 20 20 75 6e 6c 69 6e 6b 28 70          unlink(p
e0e0: 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f  File->pId->zCano
e0f0: 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  nicalName);.    
e100: 20 20 7d 0a 20 20 20 20 20 20 76 78 77 6f 72 6b    }.      vxwork
e110: 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 70  sReleaseFileId(p
e120: 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20  File->pId);.    
e130: 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30    pFile->pId = 0
e140: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
e150: 20 20 20 4f 53 54 52 41 43 45 32 28 22 43 4c 4f     OSTRACE2("CLO
e160: 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46  SE   %-3d\n", pF
e170: 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 4f 70 65  ile->h);.    Ope
e180: 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20  nCounter(-1);.  
e190: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
e1a0: 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a  File->pUnused);.
e1b0: 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65      memset(pFile
e1c0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78  , 0, sizeof(unix
e1d0: 46 69 6c 65 29 29 3b 0a 20 20 7d 0a 20 20 72 65  File));.  }.  re
e1e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e1f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
e200: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
e210: 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73   int unixClose(s
e220: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
e230: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
e240: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64  ITE_OK;.  if( id
e250: 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   ){.    unixFile
e260: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
e270: 69 6c 65 20 2a 29 69 64 3b 0a 20 20 20 20 75 6e  ile *)id;.    un
e280: 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ixUnlock(id, NO_
e290: 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45  LOCK);.    unixE
e2a0: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
e2b0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4f 70 65   if( pFile->pOpe
e2c0: 6e 20 26 26 20 70 46 69 6c 65 2d 3e 70 4f 70 65  n && pFile->pOpe
e2d0: 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  n->nLock ){.    
e2e0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
e2f0: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  e outstanding lo
e300: 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75  cks, do not actu
e310: 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66  ally close the f
e320: 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20 2a  ile just.      *
e330: 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68  * yet because th
e340: 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74  at would clear t
e350: 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73  hose locks.  Ins
e360: 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69  tead, add the fi
e370: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63  le.      ** desc
e380: 72 69 70 74 6f 72 20 74 6f 20 70 4f 70 65 6e 2d  riptor to pOpen-
e390: 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20  >pUnused list.  
e3a0: 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
e3b0: 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
e3c0: 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74  .      ** when t
e3d0: 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20  he last lock is 
e3e0: 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a  cleared..      *
e3f0: 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64 69  /.      setPendi
e400: 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20  ngFd(pFile);.   
e410: 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f   }.    releaseLo
e420: 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c  ckInfo(pFile->pL
e430: 6f 63 6b 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ock);.    releas
e440: 65 4f 70 65 6e 43 6e 74 28 70 46 69 6c 65 2d 3e  eOpenCnt(pFile->
e450: 70 4f 70 65 6e 29 3b 0a 20 20 20 20 72 63 20 3d  pOpen);.    rc =
e460: 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
e470: 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76  d);.    unixLeav
e480: 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20  eMutex();.  }.  
e490: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
e4a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
e4b0: 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61  d of the posix a
e4c0: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70  dvisory lock imp
e4d0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
e4e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
e4f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
e540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
e590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e5a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f  ************* No
e5b0: 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  -op Locking ****
e5c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e5d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
e5e0: 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69  *.** Of the vari
e5f0: 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ous locking impl
e600: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69  ementations avai
e610: 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62  lable, this is b
e620: 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d  y far the.** sim
e630: 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20  plest:  locking 
e640: 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20  is ignored.  No 
e650: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
e660: 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61  to lock the data
e670: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72  base.** file for
e680: 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
e690: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
e6a0: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20  locking mode is 
e6b0: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
e6c0: 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  use on read-only
e6d0: 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65   databases.** (e
e6e0: 78 3a 20 64 61 74 61 62 61 73 65 73 20 74 68 61  x: databases tha
e6f0: 74 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74  t are burned int
e700: 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78  o CD-ROM, for ex
e710: 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a  ample.)  It can.
e720: 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20  ** also be used 
e730: 69 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  if the applicati
e740: 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20  on employs some 
e750: 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69  external mechani
e760: 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74  sm to.** prevent
e770: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63   simultaneous ac
e780: 63 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65  cess of the same
e790: 20 64 61 74 61 62 61 73 65 20 62 79 20 74 77 6f   database by two
e7a0: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61   or more.** data
e7b0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
e7c0: 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20  .  But there is 
e7d0: 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f  a serious risk o
e7e0: 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  f database.** co
e7f0: 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73  rruption if this
e800: 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73   locking mode is
e810: 20 75 73 65 64 20 69 6e 20 73 69 74 75 61 74 69   used in situati
e820: 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70  ons where multip
e830: 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  le.** database c
e840: 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61  onnections are a
e850: 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d  ccessing the sam
e860: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
e870: 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74  at the same.** t
e880: 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d  ime and one or m
e890: 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  ore of those con
e8a0: 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69  nections are wri
e8b0: 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63  ting..*/..static
e8c0: 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b   int nolockCheck
e8d0: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
e8e0: 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
e8f0: 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  ed, int *pResOut
e900: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
e910: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
e920: 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a    *pResOut = 0;.
e930: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e940: 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
e950: 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69   nolockLock(sqli
e960: 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
e970: 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29  d, int NotUsed2)
e980: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
e990: 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
e9a0: 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
e9b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
e9c0: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
e9d0: 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
e9e0: 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69  file *NotUsed, i
e9f0: 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  nt NotUsed2){.  
ea00: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
ea10: 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
ea20: 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ed2);.  return S
ea30: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
ea40: 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c  ** Close the fil
ea50: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
ea60: 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c   nolockClose(sql
ea70: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
ea80: 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55  .  return closeU
ea90: 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a  nixFile(id);.}..
eaa0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
eab0: 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
eac0: 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65  no-op lock imple
ead0: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
eae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
eaf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
eb40: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
eb50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb90: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
eba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
ebb0: 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e   dot-file Lockin
ebc0: 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
ebd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ebe0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69  .**.** The dotfi
ebf0: 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  le locking imple
ec00: 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74  mentation uses t
ec10: 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20  he existance of 
ec20: 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a  separate lock.**
ec30: 20 66 69 6c 65 73 20 69 6e 20 6f 72 64 65 72 20   files in order 
ec40: 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73  to control acces
ec50: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
ec60: 65 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 6f  e.  This works o
ec70: 6e 20 6a 75 73 74 0a 2a 2a 20 61 62 6f 75 74 20  n just.** about 
ec80: 65 76 65 72 79 20 66 69 6c 65 73 79 73 74 65 6d  every filesystem
ec90: 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42 75   imaginable.  Bu
eca0: 74 20 74 68 65 72 65 20 61 72 65 20 73 65 72 69  t there are seri
ecb0: 6f 75 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a  ous downsides:.*
ecc0: 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65  *.**    (1)  The
ecd0: 72 65 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75  re is zero concu
ece0: 72 72 65 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c  rrency.  A singl
ecf0: 65 20 72 65 61 64 65 72 20 62 6c 6f 63 6b 73 20  e reader blocks 
ed00: 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20  all other.**    
ed10: 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73       connections
ed20: 20 66 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72   from reading or
ed30: 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
ed40: 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  abase..**.**    
ed50: 28 32 29 20 20 41 6e 20 61 70 70 6c 69 63 61 74  (2)  An applicat
ed60: 69 6f 6e 20 63 72 61 73 68 20 6f 72 20 70 6f 77  ion crash or pow
ed70: 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76  er loss can leav
ed80: 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c  e stale lock fil
ed90: 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 69  es.**         si
eda0: 74 74 69 6e 67 20 61 72 6f 75 6e 64 20 74 68 61  tting around tha
edb0: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65  t need to be cle
edc0: 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a  ared manually..*
edd0: 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65 73  *.** Nevertheles
ede0: 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20  s, a dotlock is 
edf0: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6c  an appropriate l
ee00: 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20  ocking mode for 
ee10: 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68  use if no.** oth
ee20: 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  er locking strat
ee30: 65 67 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65  egy is available
ee40: 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20  ..**.** Dotfile 
ee50: 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79  locking works by
ee60: 20 63 72 65 61 74 69 6e 67 20 61 20 66 69 6c 65   creating a file
ee70: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72   in the same dir
ee80: 65 63 74 6f 72 79 20 61 73 20 74 68 65 0a 2a 2a  ectory as the.**
ee90: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 77 69   database and wi
eea0: 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
eeb0: 20 62 75 74 20 77 69 74 68 20 61 20 22 2e 6c 6f   but with a ".lo
eec0: 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20 61 64  ck" extension ad
eed0: 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69 73  ded..** The exis
eee0: 74 61 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b 20  tance of a lock 
eef0: 66 69 6c 65 20 69 6d 70 6c 69 65 73 20 61 6e 20  file implies an 
ef00: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
ef10: 20 41 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 0a   All other lock.
ef20: 2a 2a 20 74 79 70 65 73 20 28 53 48 41 52 45 44  ** types (SHARED
ef30: 2c 20 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44  , RESERVED, PEND
ef40: 49 4e 47 29 20 61 72 65 20 6d 61 70 70 65 64 20  ING) are mapped 
ef50: 69 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a  into EXCLUSIVE..
ef60: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  */../*.** The fi
ef70: 6c 65 20 73 75 66 66 69 78 20 61 64 64 65 64 20  le suffix added 
ef80: 74 6f 20 74 68 65 20 64 61 74 61 20 62 61 73 65  to the data base
ef90: 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64   filename in ord
efa0: 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  er to create the
efb0: 0a 2a 2a 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a  .** lock file..*
efc0: 2f 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43  /.#define DOTLOC
efd0: 4b 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22  K_SUFFIX ".lock"
efe0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
eff0: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
f000: 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
f010: 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
f020: 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
f030: 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
f040: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
f050: 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
f060: 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
f070: 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
f080: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
f090: 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
f0a0: 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
f0b0: 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
f0c0: 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
f0d0: 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
f0e0: 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
f0f0: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
f100: 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a  ck checking..**.
f110: 2a 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f  ** In dotfile lo
f120: 63 6b 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20  cking, either a 
f130: 6c 6f 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69  lock exists or i
f140: 74 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20  t does not.  So 
f150: 69 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61  in this.** varia
f160: 74 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73  tion of CheckRes
f170: 65 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52  ervedLock(), *pR
f180: 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
f190: 74 72 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b  true if any lock
f1a0: 0a 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  .** is held on t
f1b0: 68 65 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73  he file and fals
f1c0: 65 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  e if the file is
f1d0: 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74   unlocked..*/.st
f1e0: 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
f1f0: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
f200: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
f210: 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
f220: 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
f230: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
f240: 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
f250: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
f260: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
f270: 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
f280: 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
f290: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
f2a0: 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
f2b0: 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
f2c0: 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  e );..  /* Check
f2d0: 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
f2e0: 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
f2f0: 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
f300: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
f310: 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c  ocktype>SHARED_L
f320: 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69  OCK ){.    /* Ei
f330: 74 68 65 72 20 74 68 69 73 20 63 6f 6e 6e 65 63  ther this connec
f340: 74 69 6f 6e 20 6f 72 20 73 6f 6d 65 20 6f 74 68  tion or some oth
f350: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e  er connection in
f360: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
f370: 73 0a 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 61  s.    ** holds a
f380: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
f390: 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63  e.  No need to c
f3a0: 68 65 63 6b 20 66 75 72 74 68 65 72 2e 20 2a 2f  heck further. */
f3b0: 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
f3c0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
f3d0: 2f 2a 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 68  /* The lock is h
f3e0: 65 6c 64 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20  eld if and only 
f3f0: 69 66 20 74 68 65 20 6c 6f 63 6b 66 69 6c 65 20  if the lockfile 
f400: 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 63 6f  exists */.    co
f410: 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46  nst char *zLockF
f420: 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ile = (const cha
f430: 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  r*)pFile->lockin
f440: 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 72 65  gContext;.    re
f450: 73 65 72 76 65 64 20 3d 20 61 63 63 65 73 73 28  served = access(
f460: 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30  zLockFile, 0)==0
f470: 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 34  ;.  }.  OSTRACE4
f480: 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
f490: 64 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b  d %d %d (dotlock
f4a0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
f4b0: 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a 20  rc, reserved);. 
f4c0: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
f4d0: 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
f4e0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
f4f0: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
f500: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
f510: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c  d by parameter l
f520: 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a  ocktype - one.**
f530: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
f540: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
f550: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
f560: 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
f570: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
f580: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
f590: 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
f5a0: 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
f5b0: 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
f5c0: 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
f5d0: 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
f5e0: 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
f5f0: 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
f600: 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
f610: 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
f620: 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
f630: 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
f640: 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
f650: 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
f660: 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
f670: 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
f680: 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
f690: 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
f6a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
f6b0: 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
f6c0: 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
f6d0: 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
f6e0: 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
f6f0: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
f700: 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
f710: 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
f720: 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
f730: 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
f740: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
f750: 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
f760: 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
f770: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
f780: 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
f790: 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
f7a0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
f7b0: 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
f7c0: 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
f7d0: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
f7e0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
f7f0: 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
f800: 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  evel..**.** With
f810: 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
f820: 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79  , we really only
f830: 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28   support state (
f840: 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a  4): EXCLUSIVE..*
f850: 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74  * But we track t
f860: 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  he other locking
f870: 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c   levels internal
f880: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
f890: 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71  t dotlockLock(sq
f8a0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
f8b0: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a  int locktype) {.
f8c0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
f8d0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
f8e0: 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 63  d;.  int fd;.  c
f8f0: 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
f900: 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
f910: 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
f920: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
f930: 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20  E_OK;...  /* If 
f940: 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b  we have any lock
f950: 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20  , then the lock 
f960: 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  file already exi
f970: 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76  sts.  All we hav
f980: 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20  e.  ** to do is 
f990: 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72  adjust our inter
f9a0: 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
f9b0: 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20  e lock level..  
f9c0: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
f9d0: 6c 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f  locktype > NO_LO
f9e0: 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
f9f0: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
fa00: 74 79 70 65 3b 0a 23 69 66 20 21 4f 53 5f 56 58  type;.#if !OS_VX
fa10: 57 4f 52 4b 53 0a 20 20 20 20 2f 2a 20 41 6c 77  WORKS.    /* Alw
fa20: 61 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74  ays update the t
fa30: 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20  imestamp on the 
fa40: 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  old file */.    
fa50: 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65  utimes(zLockFile
fa60: 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a  , NULL);.#endif.
fa70: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fa80: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
fa90: 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73  * grab an exclus
faa0: 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 66 64  ive lock */.  fd
fab0: 20 3d 20 6f 70 65 6e 28 7a 4c 6f 63 6b 46 69 6c   = open(zLockFil
fac0: 65 2c 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 43 52 45  e,O_RDONLY|O_CRE
fad0: 41 54 7c 4f 5f 45 58 43 4c 2c 30 36 30 30 29 3b  AT|O_EXCL,0600);
fae0: 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
faf0: 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20     /* failed to 
fb00: 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20  open/create the 
fb10: 66 69 6c 65 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c  file, someone el
fb20: 73 65 20 6d 61 79 20 68 61 76 65 20 73 74 6f 6c  se may have stol
fb30: 65 6e 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20  en the lock */. 
fb40: 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
fb50: 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45  errno;.    if( E
fb60: 45 58 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20  EXIST == tErrno 
fb70: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
fb80: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
fb90: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63   else {.      rc
fba0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
fbb0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
fbc0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
fbd0: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
fbe0: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
fbf0: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
fc00: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
fc10: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
fc20: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
fc30: 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 69  urn rc;.  } .  i
fc40: 66 28 20 63 6c 6f 73 65 28 66 64 29 20 29 7b 0a  f( close(fd) ){.
fc50: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
fc60: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
fc70: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
fc80: 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 7d 0a 20  ERR_CLOSE;.  }. 
fc90: 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73   .  /* got it, s
fca0: 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  et the type and 
fcb0: 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70  return ok */.  p
fcc0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
fcd0: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74   locktype;.  ret
fce0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
fcf0: 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
fd00: 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
fd10: 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
fd20: 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20  e to locktype.  
fd30: 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74  locktype.** must
fd40: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
fd50: 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
fd60: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
fd70: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
fd80: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
fd90: 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
fda0: 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
fdb0: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
fdc0: 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
fdd0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
fde0: 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  -op..**.** When 
fdf0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
fe00: 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43  l reaches NO_LOC
fe10: 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f  K, delete the lo
fe20: 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ck file..*/.stat
fe30: 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e  ic int dotlockUn
fe40: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
fe50: 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
fe60: 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ype) {.  unixFil
fe70: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
fe80: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72  File*)id;.  char
fe90: 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63   *zLockFile = (c
fea0: 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
feb0: 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 20 20  kingContext;..  
fec0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
fed0: 0a 20 20 4f 53 54 52 41 43 45 35 28 22 55 4e 4c  .  OSTRACE5("UNL
fee0: 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
fef0: 64 20 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63  d pid=%d (dotloc
ff00: 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
ff10: 20 6c 6f 63 6b 74 79 70 65 2c 0a 09 20 20 20 70   locktype,..   p
ff20: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
ff30: 67 65 74 70 69 64 28 29 29 3b 0a 20 20 61 73 73  getpid());.  ass
ff40: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53  ert( locktype<=S
ff50: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
ff60: 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70  .  /* no-op if p
ff70: 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28  ossible */.  if(
ff80: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
ff90: 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  ==locktype ){.  
ffa0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ffb0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f  OK;.  }..  /* To
ffc0: 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68   downgrade to sh
ffd0: 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64  ared, simply upd
ffe0: 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
fff0: 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20   notion of the. 
10000 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20   ** lock state. 
10010 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73   No need to mess
10020 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f   with the file o
10030 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69  n disk..  */.  i
10040 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
10050 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
10060 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
10070 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
10080 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10090 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
100a0 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b   To fully unlock
100b0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 64   the database, d
100c0 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66  elete the lock f
100d0 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ile */.  assert(
100e0 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f   locktype==NO_LO
100f0 43 4b 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  CK );.  if( unli
10100 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29 20 29 7b  nk(zLockFile) ){
10110 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  .    int rc = 0;
10120 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
10130 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28  = errno;.    if(
10140 20 45 4e 4f 45 4e 54 20 21 3d 20 74 45 72 72 6e   ENOENT != tErrn
10150 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
10160 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
10170 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
10180 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
10190 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20  NLOCK);.    }.  
101a0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
101b0 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
101c0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
101d0 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
101e0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
101f0 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c   .  }.  pFile->l
10200 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43  ocktype = NO_LOC
10210 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  K;.  return SQLI
10220 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
10230 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20 20 4d  Close a file.  M
10240 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
10250 6b 20 68 61 73 20 62 65 65 6e 20 72 65 6c 65 61  k has been relea
10260 73 65 64 20 62 65 66 6f 72 65 20 63 6c 6f 73 69  sed before closi
10270 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
10280 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73  t dotlockClose(s
10290 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
102a0 20 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69   {.  int rc;.  i
102b0 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69  f( id ){.    uni
102c0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
102d0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
102e0 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28    dotlockUnlock(
102f0 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
10300 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10310 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
10320 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20  text);.  }.  rc 
10330 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  = closeUnixFile(
10340 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  id);.  return rc
10350 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}./***********
10360 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
10370 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  he dot-file lock
10380 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
10390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103a0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
103b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103f0 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
10400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10440 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
10450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
10460 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b  Begin flock Lock
10470 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
10480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10490 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ****.**.** Use t
104a0 68 65 20 66 6c 6f 63 6b 28 29 20 73 79 73 74 65  he flock() syste
104b0 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20 66 69 6c  m call to do fil
104c0 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a  e locking..**.**
104d0 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67   flock() locking
104e0 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 66 69 6c   is like dot-fil
104f0 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 61  e locking in tha
10500 74 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a  t the various.**
10510 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c 6f 63 6b   fine-grain lock
10520 69 6e 67 20 6c 65 76 65 6c 73 20 73 75 70 70 6f  ing levels suppo
10530 72 74 65 64 20 62 79 20 53 51 4c 69 74 65 20 61  rted by SQLite a
10540 72 65 20 63 6f 6c 6c 61 70 73 65 64 20 69 6e 74  re collapsed int
10550 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 65 78  o.** a single ex
10560 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49  clusive lock.  I
10570 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 53  n other words, S
10580 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c  HARED, RESERVED,
10590 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e 47 20   and.** PENDING 
105a0 6c 6f 63 6b 73 20 61 72 65 20 74 68 65 20 73 61  locks are the sa
105b0 6d 65 20 74 68 69 6e 67 20 61 73 20 61 6e 20 45  me thing as an E
105c0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
105d0 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69 6c 6c 20  SQLite.** still 
105e0 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f 75 20 64  works when you d
105f0 6f 20 74 68 69 73 2c 20 62 75 74 20 63 6f 6e 63  o this, but conc
10600 75 72 72 65 6e 63 79 20 69 73 20 72 65 64 75 63  urrency is reduc
10610 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79  ed since.** only
10620 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73   a single proces
10630 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67  s can be reading
10640 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74   the database at
10650 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f   a time..**.** O
10660 6d 69 74 20 74 68 69 73 20 73 65 63 74 69 6f 6e  mit this section
10670 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   if SQLITE_ENABL
10680 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
10690 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20 6f 72  is turned off or
106a0 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 69 6e 67   if.** compiling
106b0 20 66 6f 72 20 56 58 57 4f 52 4b 53 2e 0a 2a 2f   for VXWORKS..*/
106c0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
106d0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
106e0 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a   && !OS_VXWORKS.
106f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
10700 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
10710 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
10720 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
10730 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
10740 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
10750 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
10760 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
10770 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
10780 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
10790 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
107a0 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
107b0 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
107c0 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
107d0 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
107e0 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
107f0 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
10800 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
10810 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
10820 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43  tatic int flockC
10830 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
10840 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
10850 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
10860 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
10870 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
10880 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
10890 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
108a0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
108b0 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72   .  SimulateIOEr
108c0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
108d0 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
108e0 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
108f0 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
10900 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65  e );.  .  /* Che
10910 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
10920 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
10930 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
10940 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
10950 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44  >locktype>SHARED
10960 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
10970 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  erved = 1;.  }. 
10980 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65   .  /* Otherwise
10990 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
109a0 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
109b0 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72   it. */.  if( !r
109c0 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f  eserved ){.    /
109d0 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74  * attempt to get
109e0 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20   the lock */.   
109f0 20 69 6e 74 20 6c 72 63 20 3d 20 66 6c 6f 63 6b   int lrc = flock
10a00 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
10a10 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20  EX | LOCK_NB);. 
10a20 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20     if( !lrc ){. 
10a30 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20       /* got the 
10a40 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20  lock, unlock it 
10a50 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 66  */.      lrc = f
10a60 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
10a70 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69  OCK_UN);.      i
10a80 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20 20 20  f ( lrc ) {.    
10a90 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
10aa0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
10ab0 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64  /* unlock failed
10ac0 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 2a   with an error *
10ad0 2f 0a 20 20 20 20 20 20 20 20 6c 72 63 20 3d 20  /.        lrc = 
10ae0 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
10af0 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
10b00 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
10b10 4e 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 20  NLOCK); .       
10b20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
10b30 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20  OR(lrc) ){.     
10b40 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
10b50 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
10b60 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c            rc = l
10b70 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
10b80 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
10b90 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72   {.      int tEr
10ba0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
10bb0 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
10bc0 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e  .      /* someon
10bd0 65 20 65 6c 73 65 20 6d 69 67 68 74 20 68 61 76  e else might hav
10be0 65 20 69 74 20 72 65 73 65 72 76 65 64 20 2a 2f  e it reserved */
10bf0 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c  .      lrc = sql
10c00 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
10c10 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
10c20 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
10c30 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 49 53  ); .      if( IS
10c40 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29  _LOCK_ERROR(lrc)
10c50 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
10c60 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
10c70 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  Errno;.        r
10c80 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d  c = lrc;.      }
10c90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
10ca0 52 41 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c  RACE4("TEST WR-L
10cb0 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 66 6c  OCK %d %d %d (fl
10cc0 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
10cd0 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
10ce0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
10cf0 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
10d00 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20  CK_ERRORS.  if( 
10d10 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  (rc & SQLITE_IOE
10d20 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
10d30 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ERR ){.    rc = 
10d40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
10d50 65 73 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23  eserved=1;.  }.#
10d60 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
10d70 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
10d80 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70  K_ERRORS */.  *p
10d90 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
10da0 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
10db0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
10dc0 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
10dd0 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
10de0 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b  y parameter lock
10df0 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  type - one.** of
10e00 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
10e10 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
10e20 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
10e30 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
10e40 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
10e50 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
10e60 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
10e70 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
10e80 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
10e90 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
10ea0 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
10eb0 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
10ec0 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
10ed0 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
10ee0 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
10ef0 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
10f00 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
10f10 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
10f20 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
10f30 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
10f40 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
10f50 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
10f60 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
10f70 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
10f80 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
10f90 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
10fa0 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
10fb0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
10fc0 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
10fd0 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
10fe0 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
10ff0 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
11000 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
11010 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
11020 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
11030 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
11040 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
11050 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
11060 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b  SIVE.**.** flock
11070 28 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73  () only really s
11080 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45  upport EXCLUSIVE
11090 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63   locks.  We trac
110a0 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a  k intermediate.*
110b0 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e  * lock states in
110c0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
110d0 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74  e structure, but
110e0 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45   all locks SHARE
110f0 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72  D or.** above ar
11100 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49  e really EXCLUSI
11110 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63  VE locks and exc
11120 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70  lude all other p
11130 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a  rocesses from.**
11140 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65   access the file
11150 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
11160 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
11170 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
11180 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
11190 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
111a0 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
111b0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
111c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
111d0 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
111e0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
111f0 63 6b 74 79 70 65 29 20 7b 0a 20 20 69 6e 74 20  cktype) {.  int 
11200 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11210 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
11220 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
11230 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  d;..  assert( pF
11240 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20  ile );..  /* if 
11250 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
11260 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78  a lock, it is ex
11270 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20  clusive.  .  ** 
11280 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65  Just adjust leve
11290 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75  l and punt on ou
112a0 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69  tta here. */.  i
112b0 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f (pFile->lockty
112c0 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a  pe > NO_LOCK) {.
112d0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
112e0 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
112f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11300 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
11310 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73  * grab an exclus
11320 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20  ive lock */.  . 
11330 20 69 66 20 28 66 6c 6f 63 6b 28 70 46 69 6c 65   if (flock(pFile
11340 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c  ->h, LOCK_EX | L
11350 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69  OCK_NB)) {.    i
11360 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
11370 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74  o;.    /* didn't
11380 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75   get, must be bu
11390 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  sy */.    rc = s
113a0 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
113b0 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
113c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
113d0 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f  CK);.    if( IS_
113e0 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
113f0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
11400 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
11410 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73  o;.    }.  } els
11420 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69  e {.    /* got i
11430 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
11440 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
11450 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
11460 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
11470 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 34 28  .  }.  OSTRACE4(
11480 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
11490 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  s (flock)\n", pF
114a0 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
114b0 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20  Name(locktype), 
114c0 0a 20 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d  .           rc==
114d0 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
114e0 20 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a 23 69   : "failed");.#i
114f0 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
11500 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
11510 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26  RORS.  if( (rc &
11520 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d   SQLITE_IOERR) =
11530 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  = SQLITE_IOERR )
11540 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
11550 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64  E_BUSY;.  }.#end
11560 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
11570 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
11580 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75 72  RRORS */.  retur
11590 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
115a0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
115b0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
115c0 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
115d0 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c   to locktype.  l
115e0 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20  ocktype.** must 
115f0 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
11600 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
11610 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
11620 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
11630 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
11640 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
11650 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
11660 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
11670 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
11680 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
11690 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
116a0 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71  t flockUnlock(sq
116b0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
116c0 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a  int locktype) {.
116d0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
116e0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
116f0 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  d;.  .  assert( 
11700 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
11710 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE5("UNLOCK  %d 
11720 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
11730 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69   (flock)\n", pFi
11740 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c  le->h, locktype,
11750 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
11760 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 67 65 74  e->locktype, get
11770 70 69 64 28 29 29 3b 0a 20 20 61 73 73 65 72 74  pid());.  assert
11780 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52  ( locktype<=SHAR
11790 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
117a0 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73  /* no-op if poss
117b0 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46  ible */.  if( pF
117c0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c  ile->locktype==l
117d0 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
117e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
117f0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61  .  }.  .  /* sha
11800 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20  red can just be 
11810 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61  set because we a
11820 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78  lways have an ex
11830 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20  clusive */.  if 
11840 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  (locktype==SHARE
11850 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  D_LOCK) {.    pF
11860 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
11870 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 65  locktype;.    re
11880 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11890 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20    }.  .  /* no, 
118a0 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20  really, unlock. 
118b0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 66 6c  */.  int rc = fl
118c0 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
118d0 43 4b 5f 55 4e 29 3b 0a 20 20 69 66 20 28 72 63  CK_UN);.  if (rc
118e0 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 2c 20 74  ) {.    int r, t
118f0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
11900 20 20 20 72 20 3d 20 73 71 6c 69 74 65 45 72 72     r = sqliteErr
11910 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
11920 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
11930 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20  IOERR_UNLOCK);. 
11940 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
11950 52 52 4f 52 28 72 29 20 29 7b 0a 20 20 20 20 20  RROR(r) ){.     
11960 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
11970 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
11980 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
11990 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
119a0 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 69 66 28  K_ERRORS.    if(
119b0 20 28 72 20 26 20 53 51 4c 49 54 45 5f 49 4f 45   (r & SQLITE_IOE
119c0 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
119d0 45 52 52 20 29 7b 0a 20 20 20 20 20 20 72 20 3d  ERR ){.      r =
119e0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
119f0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
11a00 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
11a10 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f  K_LOCK_ERRORS */
11a20 0a 20 20 20 20 0a 20 20 20 20 72 65 74 75 72 6e  .    .    return
11a30 20 72 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20   r;.  } else {. 
11a40 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
11a50 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  pe = NO_LOCK;.  
11a60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11a70 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
11a80 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
11a90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
11aa0 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
11ab0 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66  file *id) {.  if
11ac0 28 20 69 64 20 29 7b 0a 20 20 20 20 66 6c 6f 63  ( id ){.    floc
11ad0 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  kUnlock(id, NO_L
11ae0 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OCK);.  }.  retu
11af0 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65  rn closeUnixFile
11b00 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  (id);.}..#endif 
11b10 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
11b20 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
11b30 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a  & !OS_VXWORK */.
11b40 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
11b50 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
11b60 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c   flock lock impl
11b70 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
11b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b90 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
11ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
11be0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
11bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c30 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
11c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
11c50 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65   Named Semaphore
11c60 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
11c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c80 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65  *.**.** Named se
11c90 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
11ca0 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65  is only supporte
11cb0 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  d on VxWorks..**
11cc0 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f  .** Semaphore lo
11cd0 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f  cking is like do
11ce0 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b  t-lock and flock
11cf0 20 69 6e 20 74 68 61 74 20 69 74 20 72 65 61 6c   in that it real
11d00 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f  ly only.** suppo
11d10 72 74 73 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  rts EXCLUSIVE lo
11d20 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73  cking.  Only a s
11d30 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61  ingle process ca
11d40 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a  n read or write.
11d50 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
11d60 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65 2e 20  file at a time. 
11d70 20 54 68 69 73 20 72 65 64 75 63 65 73 20 70 6f   This reduces po
11d80 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72 65  tential concurre
11d90 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65  ncy, but.** make
11da0 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65  s the lock imple
11db0 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20 65  mentation much e
11dc0 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53  asier..*/.#if OS
11dd0 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20  _VXWORKS../*.** 
11de0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
11df0 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
11e00 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
11e10 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
11e20 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
11e30 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
11e40 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
11e50 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
11e60 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
11e70 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
11e80 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
11e90 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
11ea0 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
11eb0 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
11ec0 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
11ed0 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
11ee0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
11ef0 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
11f00 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
11f10 6e 74 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72  nt semCheckReser
11f20 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
11f30 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
11f40 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20  ResOut) {.  int 
11f50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11f60 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
11f70 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
11f80 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
11f90 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
11fa0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
11fb0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
11fc0 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
11fd0 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
11fe0 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  ( pFile );..  /*
11ff0 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
12000 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
12010 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
12020 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
12030 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48  ile->locktype>SH
12040 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
12050 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
12060 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
12070 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
12080 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
12090 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66  olds it. */.  if
120a0 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
120b0 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d     sem_t *pSem =
120c0 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 70   pFile->pOpen->p
120d0 53 65 6d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  Sem;.    struct 
120e0 73 74 61 74 20 73 74 61 74 42 75 66 3b 0a 0a 20  stat statBuf;.. 
120f0 20 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61     if( sem_trywa
12100 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a  it(pSem)==-1 ){.
12110 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
12120 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
12130 69 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74 45  if( EAGAIN != tE
12140 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  rrno ){.        
12150 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
12160 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
12170 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
12180 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
12190 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  DLOCK);.        
121a0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
121b0 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
121c0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
121d0 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73    /* someone els
121e0 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77  e has the lock w
121f0 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f  hen we are in NO
12200 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20  _LOCK */.       
12210 20 72 65 73 65 72 76 65 64 20 3d 20 28 70 46 69   reserved = (pFi
12220 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3c 20 53  le->locktype < S
12230 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
12240 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
12250 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c        /* we coul
12260 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65 20  d have it if we 
12270 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20  want it */.     
12280 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b   sem_post(pSem);
12290 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
122a0 52 41 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c  RACE4("TEST WR-L
122b0 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 73 65  OCK %d %d %d (se
122c0 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  m)\n", pFile->h,
122d0 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a   rc, reserved);.
122e0 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
122f0 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
12300 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
12310 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
12320 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
12330 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
12340 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a   locktype - one.
12350 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
12360 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
12370 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
12380 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
12390 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
123a0 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
123b0 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
123c0 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
123d0 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
123e0 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
123f0 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
12400 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
12410 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
12420 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
12430 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
12440 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
12450 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
12460 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
12470 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
12480 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
12490 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
124a0 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
124b0 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
124c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
124d0 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
124e0 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
124f0 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
12500 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
12510 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
12520 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
12530 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
12540 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
12550 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
12560 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
12570 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
12580 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
12590 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
125a0 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
125b0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
125c0 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20  Semaphore locks 
125d0 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70  only really supp
125e0 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  ort EXCLUSIVE lo
125f0 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69  cks.  We track i
12600 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c  ntermediate.** l
12610 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68  ock states in th
12620 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  e sqlite3_file s
12630 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c  tructure, but al
12640 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f  l locks SHARED o
12650 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72  r.** above are r
12660 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20  eally EXCLUSIVE 
12670 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64  locks and exclud
12680 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63  e all other proc
12690 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63  esses from.** ac
126a0 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a  cess the file..*
126b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
126c0 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
126d0 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
126e0 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
126f0 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
12700 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
12710 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
12720 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 4c 6f  static int semLo
12730 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
12740 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
12750 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  e) {.  unixFile 
12760 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
12770 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66 64  le*)id;.  int fd
12780 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20  ;.  sem_t *pSem 
12790 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e  = pFile->pOpen->
127a0 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pSem;.  int rc =
127b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
127c0 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20  * if we already 
127d0 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20  have a lock, it 
127e0 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a  is exclusive.  .
127f0 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74    ** Just adjust
12800 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20   level and punt 
12810 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a  on outta here. *
12820 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c  /.  if (pFile->l
12830 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43  ocktype > NO_LOC
12840 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
12850 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
12860 79 70 65 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ype;.    rc = SQ
12870 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74  LITE_OK;.    got
12880 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o sem_end_lock;.
12890 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b    }.  .  /* lock
128a0 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62   semaphore now b
128b0 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65 6e  ut bail out when
128c0 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e   already locked.
128d0 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74 72   */.  if( sem_tr
128e0 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20  ywait(pSem)==-1 
128f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
12900 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74  TE_BUSY;.    got
12910 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o sem_end_lock;.
12920 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74    }..  /* got it
12930 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61  , set the type a
12940 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a  nd return ok */.
12950 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
12960 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 0a 20  e = locktype;.. 
12970 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20  sem_end_lock:.  
12980 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12990 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
129a0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
129b0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
129c0 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65  File to locktype
129d0 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d  .  locktype.** m
129e0 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
129f0 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
12a00 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
12a10 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
12a20 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
12a30 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
12a40 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
12a50 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
12a60 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
12a70 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
12a80 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
12a90 63 20 69 6e 74 20 73 65 6d 55 6e 6c 6f 63 6b 28  c int semUnlock(
12aa0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
12ab0 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20  , int locktype) 
12ac0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
12ad0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
12ae0 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53  )id;.  sem_t *pS
12af0 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65  em = pFile->pOpe
12b00 6e 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73 65  n->pSem;..  asse
12b10 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61  rt( pFile );.  a
12b20 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b 0a 20  ssert( pSem );. 
12b30 20 4f 53 54 52 41 43 45 35 28 22 55 4e 4c 4f 43   OSTRACE5("UNLOC
12b40 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20  K  %d %d was %d 
12b50 70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e 22 2c  pid=%d (sem)\n",
12b60 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74   pFile->h, lockt
12b70 79 70 65 2c 0a 09 20 20 20 70 46 69 6c 65 2d 3e  ype,..   pFile->
12b80 6c 6f 63 6b 74 79 70 65 2c 20 67 65 74 70 69 64  locktype, getpid
12b90 28 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  ());.  assert( l
12ba0 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
12bb0 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
12bc0 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
12bd0 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
12be0 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b  ->locktype==lock
12bf0 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75  type ){.    retu
12c00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12c10 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64  }.  .  /* shared
12c20 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74   can just be set
12c30 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61   because we alwa
12c40 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  ys have an exclu
12c50 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 6c 6f  sive */.  if (lo
12c60 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
12c70 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
12c80 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
12c90 6b 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72  ktype;.    retur
12ca0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
12cb0 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61  .  .  /* no, rea
12cc0 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20  lly unlock. */. 
12cd0 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70   if ( sem_post(p
12ce0 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20  Sem)==-1 ) {.   
12cf0 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20   int rc, tErrno 
12d00 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20  = errno;.    rc 
12d10 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
12d20 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
12d30 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
12d40 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  _UNLOCK);.    if
12d50 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
12d60 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  rc) ){.      pFi
12d70 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
12d80 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
12d90 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20    return rc; .  
12da0 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  }.  pFile->lockt
12db0 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ype = NO_LOCK;. 
12dc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12dd0 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f  K;.}../*. ** Clo
12de0 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73  se a file.. */.s
12df0 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 6c 6f  tatic int semClo
12e00 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
12e10 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20  *id) {.  if( id 
12e20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
12e30 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
12e40 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 55  le*)id;.    semU
12e50 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
12e60 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  K);.    assert( 
12e70 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69  pFile );.    uni
12e80 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
12e90 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e     releaseLockIn
12ea0 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29  fo(pFile->pLock)
12eb0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4f 70 65  ;.    releaseOpe
12ec0 6e 43 6e 74 28 70 46 69 6c 65 2d 3e 70 4f 70 65  nCnt(pFile->pOpe
12ed0 6e 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76  n);.    unixLeav
12ee0 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 63 6c  eMutex();.    cl
12ef0 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
12f00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
12f10 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64  LITE_OK;.}..#end
12f20 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
12f30 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20   */./*.** Named 
12f40 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
12f50 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  g is only availa
12f60 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ble on VxWorks..
12f70 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
12f80 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 61  ** End of the na
12f90 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
12fa0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
12fb0 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
12fc0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
12fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13010 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */.../**********
13020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13060 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
13070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13080 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b 69   Begin AFP Locki
13090 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
130a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130b0 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69  ****.**.** AFP i
130c0 73 20 74 68 65 20 41 70 70 6c 65 20 46 69 6c 69  s the Apple Fili
130d0 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41 46  ng Protocol.  AF
130e0 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b 20 66  P is a network f
130f0 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e 64 0a  ilesystem found.
13100 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63 69  ** on Apple Maci
13110 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72 73 20  ntosh computers 
13120 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64 20 4f  - both OS9 and O
13130 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d  SX..**.** Third-
13140 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74 61  party implementa
13150 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61 72 65  tions of AFP are
13160 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74   available.  But
13170 20 74 68 69 73 20 63 6f 64 65 20 68 65 72 65 0a   this code here.
13180 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e  ** only works on
13190 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65   OSX..*/..#if de
131a0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
131b0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
131c0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
131d0 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63  /*.** The afpLoc
131e0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75  kingContext stru
131f0 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61  cture contains a
13200 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70 65 63  ll afp lock spec
13210 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74 79  ific state.*/.ty
13220 70 65 64 65 66 20 73 74 72 75 63 74 20 61 66 70  pedef struct afp
13230 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61  LockingContext a
13240 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
13250 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b  ;.struct afpLock
13260 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69  ingContext {.  i
13270 6e 74 20 72 65 73 65 72 76 65 64 3b 0a 20 20 63  nt reserved;.  c
13280 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61 74  onst char *dbPat
13290 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  h;             /
132a0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70  * Name of the op
132b0 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73  en file */.};..s
132c0 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
132d0 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67  ockPB2.{.  unsig
132e0 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66  ned long long of
132f0 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
13300 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20  offset to first 
13310 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  byte to lock */.
13320 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
13330 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20 20  long length;    
13340 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79      /* nbr of by
13350 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20  tes to lock */. 
13360 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
13370 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74 61 72  ong retRangeStar
13380 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74  t; /* nbr of 1st
13390 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69 66 20   byte locked if 
133a0 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20  successful */.  
133b0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 6e  unsigned char un
133c0 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20 20 20  LockFlag;       
133d0 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c    /* 1 = unlock,
133e0 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75   0 = lock */.  u
133f0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 74 61  nsigned char sta
13400 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20 20 20  rtEndFlag;      
13410 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64   /* 1=rel to end
13420 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20   of fork, 0=rel 
13430 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e  to start */.  in
13440 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  t fd;           
13450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13460 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74 6f 20  /* file desc to 
13470 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20  assoc this lock 
13480 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66  with */.};..#def
13490 69 6e 65 20 61 66 70 66 73 42 79 74 65 52 61 6e  ine afpfsByteRan
134a0 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20 20  geLock2FSCTL    
134b0 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32      _IOWR('z', 2
134c0 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61  3, struct ByteRa
134d0 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a  ngeLockPB2)../*.
134e0 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75 74 69  ** This is a uti
134f0 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69 6e 67  lity for setting
13500 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61 20 62   or clearing a b
13510 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e  it-range lock on
13520 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65 73   an.** AFP files
13530 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65  ystem..** .** Re
13540 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
13550 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54  n success, SQLIT
13560 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c 75 72  E_BUSY on failur
13570 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
13580 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20 63   afpSetLock(.  c
13590 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
135a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
135b0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
135c0 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 6f  e to be locked o
135d0 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20  r unlocked */.  
135e0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
135f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13600 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  * Open file desc
13610 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68 20 2a  riptor on path *
13620 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
13630 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20 20  g long offset,  
13640 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
13650 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
13660 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
13670 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20 20   long length,   
13680 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
13690 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
136a0 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61    int setLockFla
136b0 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
136c0 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 74 20   /* True to set 
136d0 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f 20  lock.  False to 
136e0 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  clear lock */.){
136f0 0a 20 20 73 74 72 75 63 74 20 42 79 74 65 52 61  .  struct ByteRa
13700 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a 20  ngeLockPB2 pb;. 
13710 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20 70   int err;.  .  p
13720 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20 73  b.unLockFlag = s
13730 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20 3a  etLockFlag ? 0 :
13740 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74 45 6e   1;.  pb.startEn
13750 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62 2e  dFlag = 0;.  pb.
13760 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74 3b  offset = offset;
13770 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20 6c  .  pb.length = l
13780 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66 64 20  ength; .  pb.fd 
13790 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20  = pFile->h;.  . 
137a0 20 4f 53 54 52 41 43 45 36 28 22 41 46 50 53 45   OSTRACE6("AFPSE
137b0 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20 25  TLOCK [%s] for %
137c0 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c  d%s in range %ll
137d0 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20  x:%llx\n", .    
137e0 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e  (setLockFlag?"ON
137f0 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c 65 2d  ":"OFF"), pFile-
13800 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f 22  >h, (pb.fd==-1?"
13810 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22 29  [testval-1]":"")
13820 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20 6c 65  ,.    offset, le
13830 6e 67 74 68 29 3b 0a 20 20 65 72 72 20 3d 20 66  ngth);.  err = f
13840 73 63 74 6c 28 70 61 74 68 2c 20 61 66 70 66 73  sctl(path, afpfs
13850 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53  ByteRangeLock2FS
13860 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20  CTL, &pb, 0);.  
13870 69 66 20 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b  if ( err==-1 ) {
13880 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
13890 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
138a0 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  rno;.    OSTRACE
138b0 34 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 66 61  4("AFPSETLOCK fa
138c0 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29 20  iled to fsctl() 
138d0 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 0a 20  '%s' %d %s\n",. 
138e0 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68              path
138f0 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72 65 72 72  , tErrno, strerr
13900 6f 72 28 74 45 72 72 6e 6f 29 29 3b 0a 23 69 66  or(tErrno));.#if
13910 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
13920 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52  E_AFP_LOCK_ERROR
13930 53 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  S.    rc = SQLIT
13940 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20  E_BUSY;.#else.  
13950 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
13960 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
13970 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  (tErrno,.       
13980 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
13990 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54  LockFlag ? SQLIT
139a0 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53  E_IOERR_LOCK : S
139b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
139c0 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  CK);.#endif /* S
139d0 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50  QLITE_IGNORE_AFP
139e0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
139f0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
13a00 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
13a10 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
13a20 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
13a30 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
13a40 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  c;.  } else {.  
13a50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13a60 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
13a70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
13a80 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
13a90 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
13aa0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
13ab0 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
13ac0 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
13ad0 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
13ae0 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
13af0 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
13b00 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
13b10 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
13b20 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
13b30 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
13b40 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
13b50 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
13b60 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
13b70 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
13b80 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
13b90 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
13ba0 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65 73 65  int afpCheckRese
13bb0 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
13bc0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
13bd0 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
13be0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13bf0 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
13c00 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
13c10 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
13c20 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75  e*)id;.  .  Simu
13c30 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
13c40 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
13c50 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
13c60 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
13c70 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61  rt( pFile );.  a
13c80 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
13c90 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70   *context = (afp
13ca0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
13cb0 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  ) pFile->locking
13cc0 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28 20 63  Context;.  if( c
13cd0 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
13ce0 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74   ){.    *pResOut
13cf0 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
13d00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13d10 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
13d20 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70  (); /* Because p
13d30 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73  File->pLock is s
13d40 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
13d50 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20  eads */.  .  /* 
13d60 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
13d70 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
13d80 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
13d90 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
13da0 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  le->pLock->lockt
13db0 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ype>SHARED_LOCK 
13dc0 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
13dd0 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
13de0 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
13df0 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
13e00 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20  cess holds it.. 
13e10 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65    */.  if( !rese
13e20 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c  rved ){.    /* l
13e30 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56 45 44  ock the RESERVED
13e40 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74   byte */.    int
13e50 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63   lrc = afpSetLoc
13e60 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
13e70 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
13e80 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20  ED_BYTE, 1,1);  
13e90 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
13ea0 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20  OK==lrc ){.     
13eb0 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65 65   /* if we succee
13ec0 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68  ded in taking th
13ed0 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c  e reserved lock,
13ee0 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65   unlock it to re
13ef0 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74  store.      ** t
13f00 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  he original stat
13f10 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  e */.      lrc =
13f20 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
13f30 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
13f40 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
13f50 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20  E, 1, 0);.    } 
13f60 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20  else {.      /* 
13f70 69 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  if we failed to 
13f80 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65  get the lock the
13f90 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d  n someone else m
13fa0 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20  ust have it */. 
13fb0 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
13fc0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
13fd0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
13fe0 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d  rc) ){.      rc=
13ff0 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  lrc;.    }.  }. 
14000 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74   .  unixLeaveMut
14010 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 34  ex();.  OSTRACE4
14020 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
14030 64 20 25 64 20 25 64 20 28 61 66 70 29 5c 6e 22  d %d %d (afp)\n"
14040 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
14050 72 65 73 65 72 76 65 64 29 3b 0a 20 20 0a 20 20  reserved);.  .  
14060 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
14070 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
14080 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
14090 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
140a0 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
140b0 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f   by parameter lo
140c0 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20  cktype - one.** 
140d0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
140e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
140f0 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
14100 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
14110 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
14120 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
14130 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
14140 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
14150 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
14160 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
14170 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
14180 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
14190 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
141a0 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
141b0 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
141c0 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
141d0 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
141e0 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
141f0 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
14200 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
14210 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
14220 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
14230 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
14240 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
14250 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
14260 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
14270 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
14280 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
14290 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
142a0 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
142b0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
142c0 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
142d0 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
142e0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
142f0 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
14300 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
14310 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
14320 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
14330 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
14340 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
14350 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
14360 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
14370 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
14380 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
14390 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
143a0 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
143b0 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74  nt afpLock(sqlit
143c0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
143d0 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
143e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
143f0 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
14400 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
14410 29 69 64 3b 0a 20 20 73 74 72 75 63 74 20 75 6e  )id;.  struct un
14420 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63  ixLockInfo *pLoc
14430 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  k = pFile->pLock
14440 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
14450 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
14460 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
14470 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
14480 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
14490 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
144a0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 37 28 22   );.  OSTRACE7("
144b0 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61  LOCK    %d %s wa
144c0 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d  s %s(%s,%d) pid=
144d0 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %d (afp)\n", pFi
144e0 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
144f0 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c    locktypeName(l
14500 6f 63 6b 74 79 70 65 29 2c 20 6c 6f 63 6b 74 79  ocktype), lockty
14510 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f  peName(pFile->lo
14520 63 6b 74 79 70 65 29 2c 0a 20 20 20 20 20 20 20  cktype),.       
14530 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65      locktypeName
14540 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  (pLock->locktype
14550 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 2c 20  ), pLock->cnt , 
14560 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 2f 2a  getpid());..  /*
14570 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
14580 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
14590 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
145a0 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
145b0 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c  the.  ** unixFil
145c0 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
145d0 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61 66 70  on't use the afp
145e0 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20  _end_lock: exit 
145f0 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e  path, as.  ** un
14600 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  ixEnterMutex() h
14610 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
14620 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
14630 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
14640 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
14650 20 20 20 4f 53 54 52 41 43 45 33 28 22 4c 4f 43     OSTRACE3("LOC
14660 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61  K    %d %s ok (a
14670 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 61 66  lready held) (af
14680 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
14690 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b  .           lock
146a0 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70  typeName(locktyp
146b0 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e));.    return 
146c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
146d0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
146e0 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
146f0 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20  nce is correct. 
14700 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65   **  (1) We neve
14710 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f  r move from unlo
14720 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67  cked to anything
14730 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61   higher than sha
14740 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  red lock..  **  
14750 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72  (2) SQLite never
14760 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75   explicitly requ
14770 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f  ests a pendig lo
14780 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20  ck..  **  (3) A 
14790 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61  shared lock is a
147a0 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20  lways held when 
147b0 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69  a reserve lock i
147c0 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
147d0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
147e0 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f  e->locktype!=NO_
147f0 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65  LOCK || locktype
14800 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
14810 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
14820 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ype!=PENDING_LOC
14830 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  K );.  assert( l
14840 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45  ocktype!=RESERVE
14850 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d  D_LOCK || pFile-
14860 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  >locktype==SHARE
14870 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
14880 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20  * This mutex is 
14890 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70  needed because p
148a0 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73  File->pLock is s
148b0 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
148c0 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78  eads.  */.  unix
148d0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20  EnterMutex();.. 
148e0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
148f0 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
14900 20 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65 2e   owns the pFile.
14910 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61  .  */.  rc = tra
14920 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 70  nsferOwnership(p
14930 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21  File);.  if( rc!
14940 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14950 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
14960 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  ();.    return r
14970 63 3b 0a 20 20 7d 0a 20 20 70 4c 6f 63 6b 20 3d  c;.  }.  pLock =
14980 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 0a   pFile->pLock;..
14990 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72    /* If some thr
149a0 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
149b0 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69  ID has a lock vi
149c0 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e  a a different un
149d0 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e  ixFile*.  ** han
149e0 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64  dle that preclud
149f0 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64  es the requested
14a00 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55   lock, return BU
14a10 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  SY..  */.  if( (
14a20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21  pFile->locktype!
14a30 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  =pLock->locktype
14a40 20 26 26 20 0a 20 20 20 20 20 20 20 28 70 4c 6f   && .       (pLo
14a50 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45  ck->locktype>=PE
14a60 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f  NDING_LOCK || lo
14a70 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f  cktype>SHARED_LO
14a80 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20  CK)).     ){.   
14a90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
14aa0 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  Y;.    goto afp_
14ab0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  end_lock;.  }.  
14ac0 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45  .  /* If a SHARE
14ad0 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  D lock is reques
14ae0 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68  ted, and some th
14af0 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
14b00 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  PID already.  **
14b10 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72   has a SHARED or
14b20 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
14b30 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72  then increment r
14b40 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20  eference counts 
14b50 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  and.  ** return 
14b60 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a  SQLITE_OK..  */.
14b70 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
14b80 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
14b90 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63       (pLock->loc
14ba0 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
14bb0 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  CK || pLock->loc
14bc0 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f  ktype==RESERVED_
14bd0 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73  LOCK) ){.    ass
14be0 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  ert( locktype==S
14bf0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
14c00 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
14c10 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a  >locktype==0 );.
14c20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
14c30 6b 2d 3e 63 6e 74 3e 30 20 29 3b 0a 20 20 20 20  k->cnt>0 );.    
14c40 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
14c50 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
14c60 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b     pLock->cnt++;
14c70 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65  .    pFile->pOpe
14c80 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  n->nLock++;.    
14c90 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
14ca0 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a  k;.  }.    .  /*
14cb0 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
14cc0 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65  is needed before
14cd0 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
14ce0 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66  RED lock and bef
14cf0 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69  ore.  ** acquiri
14d00 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
14d10 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53  lock.  For the S
14d20 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
14d30 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a  PENDING will.  *
14d40 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20  * be released.. 
14d50 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
14d60 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
14d70 0a 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74  .      || (lockt
14d80 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
14d90 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f  OCK && pFile->lo
14da0 63 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c  cktype<PENDING_L
14db0 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e  OCK).  ){.    in
14dc0 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61  t failed;.    fa
14dd0 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
14de0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
14df0 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e  h, pFile, PENDIN
14e00 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20  G_BYTE, 1, 1);. 
14e10 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b     if (failed) {
14e20 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c  .      rc = fail
14e30 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  ed;.      goto a
14e40 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
14e50 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49   }.  }.  .  /* I
14e60 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74  f control gets t
14e70 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
14e80 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61  en actually go a
14e90 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20  head and make.  
14ea0 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
14eb0 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  tem calls for th
14ec0 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b  e specified lock
14ed0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  ..  */.  if( loc
14ee0 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
14ef0 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72  CK ){.    int lr
14f00 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72  c1, lrc2, lrc1Er
14f10 72 6e 6f 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b  rno;.    long lk
14f20 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20  , mask;.    .   
14f30 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
14f40 63 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  cnt==0 );.    as
14f50 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  sert( pLock->loc
14f60 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 20 20 20 20  ktype==0 );.    
14f70 20 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20      .    mask = 
14f80 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38  (sizeof(long)==8
14f90 29 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  ) ? LARGEST_INT6
14fa0 34 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a  4 : 0x7fffffff;.
14fb0 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
14fc0 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41  he read-lock SHA
14fd0 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20  RED_LOCK */.    
14fe0 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65  /* note that the
14ff0 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20   quality of the 
15000 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e  randomness doesn
15010 27 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d  't matter that m
15020 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20  uch */.    lk = 
15030 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70  random(); .    p
15040 4c 6f 63 6b 2d 3e 73 68 61 72 65 64 42 79 74 65  Lock->sharedByte
15050 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28   = (lk & mask)%(
15060 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29  SHARED_SIZE - 1)
15070 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70  ;.    lrc1 = afp
15080 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
15090 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
150a0 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45  .          SHARE
150b0 44 5f 46 49 52 53 54 2b 70 4c 6f 63 6b 2d 3e 73  D_FIRST+pLock->s
150c0 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29  haredByte, 1, 1)
150d0 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
150e0 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 7b  K_ERROR(lrc1) ){
150f0 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e 6f  .      lrc1Errno
15100 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   = pFile->lastEr
15110 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  rno;.    }.    /
15120 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f  * Drop the tempo
15130 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63  rary PENDING loc
15140 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20  k */.    lrc2 = 
15150 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
15160 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
15170 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
15180 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20   1, 0);.    .   
15190 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
151a0 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20  OR(lrc1) ) {.   
151b0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
151c0 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b  rno = lrc1Errno;
151d0 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
151e0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
151f0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
15200 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43   else if( IS_LOC
15210 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b  K_ERROR(lrc2) ){
15220 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32  .      rc = lrc2
15230 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
15240 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
15250 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21   else if( lrc1 !
15260 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a  = SQLITE_OK ) {.
15270 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
15280 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
15290 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
152a0 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ype = SHARED_LOC
152b0 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  K;.      pFile->
152c0 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  pOpen->nLock++;.
152d0 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74        pLock->cnt
152e0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
152f0 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  lse if( locktype
15300 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
15310 20 26 26 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31   && pLock->cnt>1
15320 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72   ){.    /* We ar
15330 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
15340 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
15350 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
15360 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 2a  d in this.     *
15370 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69  * same process i
15380 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  s still holding 
15390 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a  a shared lock. *
153a0 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
153b0 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b  E_BUSY;.  }else{
153c0 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
153d0 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45  est was for a RE
153e0 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
153f0 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73  IVE lock.  It is
15400 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20  .    ** assumed 
15410 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20  that there is a 
15420 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
15430 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  r lock on the fi
15440 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  le.    ** alread
15450 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  y..    */.    in
15460 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20  t failed = 0;.  
15470 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69    assert( 0!=pFi
15480 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a  le->locktype );.
15490 20 20 20 20 69 66 20 28 6c 6f 63 6b 74 79 70 65      if (locktype
154a0 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   >= RESERVED_LOC
154b0 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  K && pFile->lock
154c0 74 79 70 65 20 3c 20 52 45 53 45 52 56 45 44 5f  type < RESERVED_
154d0 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20  LOCK) {.        
154e0 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53  /* Acquire a RES
154f0 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20  ERVED lock */.  
15500 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61        failed = a
15510 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
15520 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
15530 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
15540 20 31 2c 31 29 3b 0a 20 20 20 20 20 20 69 66 28   1,1);.      if(
15550 20 21 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20   !failed ){.    
15560 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73      context->res
15570 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  erved = 1;.     
15580 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20   }.    }.    if 
15590 28 21 66 61 69 6c 65 64 20 26 26 20 6c 6f 63 6b  (!failed && lock
155a0 74 79 70 65 20 3d 3d 20 45 58 43 4c 55 53 49 56  type == EXCLUSIV
155b0 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  E_LOCK) {.      
155c0 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58  /* Acquire an EX
155d0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a  CLUSIVE lock */.
155e0 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f          .      /
155f0 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61  * Remove the sha
15600 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20  red lock before 
15610 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67 65  trying the range
15620 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f  .  we'll need to
15630 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73 74   .      ** reest
15640 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
15650 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61 6e  d lock if we can
15660 27 74 20 67 65 74 20 74 68 65 20 20 61 66 70 55  't get the  afpU
15670 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20  nlock.      */. 
15680 20 20 20 20 20 69 66 28 20 21 28 66 61 69 6c 65       if( !(faile
15690 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
156a0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
156b0 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
156c0 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20 20  RST +.          
156d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
156e0 4c 6f 63 6b 2d 3e 73 68 61 72 65 64 42 79 74 65  Lock->sharedByte
156f0 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20 20 20 20  , 1, 0)) ){.    
15700 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 32 20      int failed2 
15710 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
15720 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65       /* now atte
15730 6d 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20  mmpt to get the 
15740 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72  exclusive lock r
15750 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  ange */.        
15760 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
15770 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
15780 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
15790 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20  ED_FIRST, .     
157a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157b0 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
157c0 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20  _SIZE, 1);.     
157d0 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 26 26     if( failed &&
157e0 20 28 66 61 69 6c 65 64 32 20 3d 20 61 66 70 53   (failed2 = afpS
157f0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
15800 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a  dbPath, pFile, .
15810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15820 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
15830 52 53 54 20 2b 20 70 4c 6f 63 6b 2d 3e 73 68 61  RST + pLock->sha
15840 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 29 20  redByte, 1, 1)) 
15850 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
15860 43 61 6e 27 74 20 72 65 65 73 74 61 62 6c 69 73  Can't reestablis
15870 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  h the shared loc
15880 6b 2e 20 20 53 71 6c 69 74 65 20 63 61 6e 27 74  k.  Sqlite can't
15890 20 64 65 61 6c 2c 20 74 68 69 73 20 69 73 0a 20   deal, this is. 
158a0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 72           ** a cr
158b0 69 74 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72  itical I/O error
158c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
158d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 28 28 66          rc = ((f
158e0 61 69 6c 65 64 20 26 20 53 51 4c 49 54 45 5f 49  ailed & SQLITE_I
158f0 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f  OERR) == SQLITE_
15900 49 4f 45 52 52 29 20 3f 20 66 61 69 6c 65 64 32  IOERR) ? failed2
15910 20 3a 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   : .            
15920 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f     SQLITE_IOERR_
15930 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  LOCK;.          
15940 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
15950 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20  k;.        } .  
15960 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15970 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 20     rc = failed; 
15980 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15990 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 29 7b     if( failed ){
159a0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c  .      rc = fail
159b0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ed;.    }.  }.  
159c0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
159d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  E_OK ){.    pFil
159e0 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
159f0 63 6b 74 79 70 65 3b 0a 20 20 20 20 70 4c 6f 63  cktype;.    pLoc
15a00 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  k->locktype = lo
15a10 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73 65 20  cktype;.  }else 
15a20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
15a30 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
15a40 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
15a50 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ype = PENDING_LO
15a60 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c  CK;.    pLock->l
15a70 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e  ocktype = PENDIN
15a80 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61  G_LOCK;.  }.  .a
15a90 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75  fp_end_lock:.  u
15aa0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
15ab0 0a 20 20 4f 53 54 52 41 43 45 34 28 22 4c 4f 43  .  OSTRACE4("LOC
15ac0 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28 61  K    %d %s %s (a
15ad0 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
15ae0 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c  , locktypeName(l
15af0 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20 20  ocktype), .     
15b00 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
15b10 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
15b20 65 64 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ed");.  return r
15b30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
15b40 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
15b50 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
15b60 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
15b70 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74  locktype.  lockt
15b80 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ype.** must be e
15b90 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
15ba0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
15bb0 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
15bc0 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
15bd0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
15be0 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
15bf0 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
15c00 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
15c10 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
15c20 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
15c30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
15c40 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  pUnlock(sqlite3_
15c50 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
15c60 63 6b 74 79 70 65 29 20 7b 0a 20 20 69 6e 74 20  cktype) {.  int 
15c70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15c80 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
15c90 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
15ca0 64 3b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  d;.  struct unix
15cb0 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b  LockInfo *pLock;
15cc0 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
15cd0 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20  text *context = 
15ce0 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
15cf0 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
15d00 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
15d10 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20  nt skipShared = 
15d20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
15d30 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d 20  _TEST.  int h = 
15d40 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66  pFile->h;.#endif
15d50 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
15d60 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 37 28  e );.  OSTRACE7(
15d70 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
15d80 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64  as %d(%d,%d) pid
15d90 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  =%d (afp)\n", pF
15da0 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
15db0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
15dc0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46  le->locktype, pF
15dd0 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  ile->pLock->lock
15de0 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f  type, pFile->pLo
15df0 63 6b 2d 3e 63 6e 74 2c 20 67 65 74 70 69 64 28  ck->cnt, getpid(
15e00 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6c  ));..  assert( l
15e10 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
15e20 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
15e30 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c  ile->locktype<=l
15e40 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
15e50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15e60 0a 20 20 7d 0a 20 20 69 66 28 20 43 48 45 43 4b  .  }.  if( CHECK
15e70 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c 65 29  _THREADID(pFile)
15e80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
15e90 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
15ea0 54 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  T;.  }.  unixEnt
15eb0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 4c 6f  erMutex();.  pLo
15ec0 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  ck = pFile->pLoc
15ed0 6b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f  k;.  assert( pLo
15ee0 63 6b 2d 3e 63 6e 74 21 3d 30 20 29 3b 0a 20 20  ck->cnt!=0 );.  
15ef0 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
15f00 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ype>SHARED_LOCK 
15f10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
15f20 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  Lock->locktype==
15f30 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
15f40 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
15f50 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
15f60 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
15f70 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20  rror( h=(-1) ). 
15f80 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
15f90 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
15fa0 20 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47   .#ifndef NDEBUG
15fb0 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64  .    /* When red
15fc0 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63  ucing a lock suc
15fd0 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f  h that other pro
15fe0 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74  cesses can start
15ff0 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
16000 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16010 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75  e again, make su
16020 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  re that the.    
16030 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
16040 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
16050 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ed if any part o
16060 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
16070 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67     ** file chang
16080 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
16090 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
160a0 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a  is not updated,.
160b0 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
160c0 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  nections to the 
160d0 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20  same file might 
160e0 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74  not realize that
160f0 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65  .    ** the file
16100 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64   has changed and
16110 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74   hence might not
16120 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74   know to flush t
16130 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68  heir.    ** cach
16140 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61  e.  The use of a
16150 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e   stale cache can
16160 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
16170 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
16180 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
16190 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
161a0 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20 20  Write==0.       
161b0 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62      || pFile->db
161c0 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20 20  Update==0.      
161d0 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74       || pFile->t
161e0 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20  ransCntrChng==1 
161f0 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e  );.    pFile->in
16200 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b  NormalWrite = 0;
16210 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20 20  .#endif.    .   
16220 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
16230 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
16240 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
16250 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
16260 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
16270 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
16280 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c  ST, SHARED_SIZE,
16290 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
162a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
162b0 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  (locktype==SHARE
162c0 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d  D_LOCK || pLock-
162d0 3e 63 6e 74 3e 31 29 20 29 7b 0a 20 20 20 20 20  >cnt>1) ){.     
162e0 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73     /* only re-es
162f0 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72  tablish the shar
16300 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73  ed lock if neces
16310 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  sary */.        
16320 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  int sharedLockBy
16330 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  te = SHARED_FIRS
16340 54 2b 70 4c 6f 63 6b 2d 3e 73 68 61 72 65 64 42  T+pLock->sharedB
16350 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72 63 20  yte;.        rc 
16360 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
16370 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
16380 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42  ile, sharedLockB
16390 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  yte, 1, 1);.    
163a0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
163b0 20 20 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20     skipShared = 
163c0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
163d0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
163e0 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d  ITE_OK && pFile-
163f0 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49  >locktype>=PENDI
16400 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  NG_LOCK ){.     
16410 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
16420 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
16430 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47  , pFile, PENDING
16440 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
16450 20 20 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d    } .    if( rc=
16460 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46  =SQLITE_OK && pF
16470 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52  ile->locktype>=R
16480 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
16490 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65  context->reserve
164a0 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
164b0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
164c0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
164d0 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
164e0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 1, 0);.      i
164f0 66 28 20 21 72 63 20 29 7b 20 0a 20 20 20 20 20  f( !rc ){ .     
16500 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65     context->rese
16510 72 76 65 64 20 3d 20 30 3b 20 0a 20 20 20 20 20  rved = 0; .     
16520 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
16530 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
16540 26 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  & (locktype==SHA
16550 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63  RED_LOCK || pLoc
16560 6b 2d 3e 63 6e 74 3e 31 29 29 7b 0a 20 20 20 20  k->cnt>1)){.    
16570 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70    pLock->locktyp
16580 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  e = SHARED_LOCK;
16590 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
165a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
165b0 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  & locktype==NO_L
165c0 4f 43 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44  OCK ){..    /* D
165d0 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61  ecrement the sha
165e0 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72  red lock counter
165f0 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  .  Release the l
16600 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20  ock using an.   
16610 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79   ** OS call only
16620 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64   when all thread
16630 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70  s in this same p
16640 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65  rocess have rele
16650 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20  ased.    ** the 
16660 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lock..    */.   
16670 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
16680 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  ong sharedLockBy
16690 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  te = SHARED_FIRS
166a0 54 2b 70 4c 6f 63 6b 2d 3e 73 68 61 72 65 64 42  T+pLock->sharedB
166b0 79 74 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  yte;.    pLock->
166c0 63 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  cnt--;.    if( p
166d0 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 7b 0a  Lock->cnt==0 ){.
166e0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
166f0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
16700 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
16710 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a  Error( h=(-1) ).
16720 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
16730 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
16740 20 20 20 20 20 20 69 66 28 20 21 73 6b 69 70 53        if( !skipS
16750 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  hared ){.       
16760 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
16770 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
16780 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
16790 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a  ockByte, 1, 0);.
167a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
167b0 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20  ( !rc ){.       
167c0 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
167d0 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
167e0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
167f0 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ype = NO_LOCK;. 
16800 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16810 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16820 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  OK ){.      stru
16830 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a  ct unixOpenCnt *
16840 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70  pOpen = pFile->p
16850 4f 70 65 6e 3b 0a 20 20 20 20 20 20 20 20 0a 20  Open;.        . 
16860 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63       pOpen->nLoc
16870 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k--;.      asser
16880 74 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e  t( pOpen->nLock>
16890 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
168a0 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20  pOpen->nLock==0 
168b0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
168c0 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
168d0 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pFile);.      }.
168e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75      }.  }.  .  u
168f0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
16900 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
16910 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 6c 6f  E_OK ) pFile->lo
16920 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
16930 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  e;.  return rc;.
16940 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
16950 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20   file & cleanup 
16960 41 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63  AFP specific loc
16970 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f  king context .*/
16980 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43  .static int afpC
16990 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
169a0 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72  e *id) {.  int r
169b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
169c0 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75   if( id ){.    u
169d0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
169e0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
169f0 20 20 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64      afpUnlock(id
16a00 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
16a10 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
16a20 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  ;.    if( pFile-
16a30 3e 70 4f 70 65 6e 20 26 26 20 70 46 69 6c 65 2d  >pOpen && pFile-
16a40 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b  >pOpen->nLock ){
16a50 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
16a60 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
16a70 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74  ng locks, do not
16a80 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20   actually close 
16a90 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20  the file just.  
16aa0 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75      ** yet becau
16ab0 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c  se that would cl
16ac0 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  ear those locks.
16ad0 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74    Instead, add t
16ae0 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  he file.      **
16af0 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70   descriptor to p
16b00 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2e 20  Open->aPending. 
16b10 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
16b20 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
16b30 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74   when.      ** t
16b40 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20  he last lock is 
16b50 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a  cleared..      *
16b60 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64 69  /.      setPendi
16b70 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20  ngFd(pFile);.   
16b80 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f   }.    releaseLo
16b90 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c  ckInfo(pFile->pL
16ba0 6f 63 6b 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ock);.    releas
16bb0 65 4f 70 65 6e 43 6e 74 28 70 46 69 6c 65 2d 3e  eOpenCnt(pFile->
16bc0 70 4f 70 65 6e 29 3b 0a 20 20 20 20 73 71 6c 69  pOpen);.    sqli
16bd0 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
16be0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
16bf0 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55  .    rc = closeU
16c00 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20  nixFile(id);.   
16c10 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
16c20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
16c30 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  rc;.}..#endif /*
16c40 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
16c50 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
16c60 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
16c70 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
16c80 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68  code above is th
16c90 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65  e AFP lock imple
16ca0 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
16cb0 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63  code is specific
16cc0 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e  .** to MacOSX an
16cd0 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  d does not work 
16ce0 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c  on other unix pl
16cf0 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74  atforms.  No alt
16d00 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61  ernative.** is a
16d10 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f  vailable.  If yo
16d20 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20  u don't compile 
16d30 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20  for a mac, then 
16d40 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a  the "unix-afp".*
16d50 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61  * VFS is not ava
16d60 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  ilable..**.*****
16d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16d80 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20   End of the AFP 
16d90 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
16da0 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
16db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
16dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
16e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
16e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e70 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46  ******* Begin NF
16e80 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  S Locking ******
16e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66  **********/..#if
16eb0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
16ec0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
16ed0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
16ee0 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20  LE./*. ** Lower 
16ef0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
16f00 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
16f10 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f  ptor pFile to lo
16f20 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70  cktype.  locktyp
16f30 65 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  e. ** must be ei
16f40 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
16f50 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a  SHARED_LOCK.. **
16f60 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  . ** If the lock
16f70 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
16f80 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
16f90 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
16fa0 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20  r below. ** the 
16fb0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
16fc0 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
16fd0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
16fe0 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .. */.static int
16ff0 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74   nfsUnlock(sqlit
17000 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
17010 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 72 65   locktype){.  re
17020 74 75 72 6e 20 5f 70 6f 73 69 78 55 6e 6c 6f 63  turn _posixUnloc
17030 6b 28 69 64 2c 20 6c 6f 63 6b 74 79 70 65 2c 20  k(id, locktype, 
17040 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  1);.}..#endif /*
17050 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
17060 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
17070 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
17080 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
17090 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68  code above is th
170a0 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65  e NFS lock imple
170b0 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
170c0 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63  code is specific
170d0 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e  .** to MacOSX an
170e0 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  d does not work 
170f0 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c  on other unix pl
17100 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74  atforms.  No alt
17110 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61  ernative.** is a
17120 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a  vailable.  .**.*
17130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17140 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
17150 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  NFS lock impleme
17160 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
17170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
17180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
171d0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
171e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
17220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17230 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c   Non-locking sql
17240 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64  ite3_file method
17250 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
17260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
17270 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 64  **.** The next d
17280 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
17290 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
172a0 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73   for all methods
172b0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69   of the .** sqli
172c0 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20  te3_file object 
172d0 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6c  other than the l
172e0 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20  ocking methods. 
172f0 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   The locking.** 
17300 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64 65 66  methods were def
17310 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69 6f 6e  ined in division
17320 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63  s above (one loc
17330 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65 72 0a  king method per.
17340 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20 20 54  ** division).  T
17350 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74 68 61  hose methods tha
17360 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20  t are common to 
17370 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  all locking mode
17380 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65 72 20  s.** are gather 
17390 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20 74 68  together into th
173a0 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a  is division..*/.
173b0 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74  ./*.** Seek to t
173c0 68 65 20 6f 66 66 73 65 74 20 70 61 73 73 65 64  he offset passed
173d0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
173e0 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65  rgument, then re
173f0 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73  ad cnt .** bytes
17400 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65 74 75   into pBuf. Retu
17410 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
17420 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
17430 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20  read..**.** NB: 
17440 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65 20 55   If you define U
17450 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53 45 5f  SE_PREAD or USE_
17460 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20 69 74  PREAD64, then it
17470 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62   might also.** b
17480 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64  e necessary to d
17490 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55  efine _XOPEN_SOU
174a0 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e 20 20  RCE to be 500.  
174b0 54 68 69 73 20 76 61 72 69 65 73 20 66 72 6f 6d  This varies from
174c0 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20 74  .** one system t
174d0 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63  o another.  Sinc
174e0 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f  e SQLite does no
174f0 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45  t define USE_PRE
17500 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20 66 6f  AD.** any any fo
17510 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c 20 77  rm by default, w
17520 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d  e will not attem
17530 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f  pt to define _XO
17540 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53  PEN_SOURCE..** S
17550 65 65 20 74 69 63 6b 65 74 73 20 23 32 37 34 31  ee tickets #2741
17560 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a   and #2681..**.*
17570 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70  * To avoid stomp
17580 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61  ing the errno va
17590 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20  lue on a failed 
175a0 72 65 61 64 20 74 68 65 20 6c 61 73 74 45 72 72  read the lastErr
175b0 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  no value.** is s
175c0 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  et before return
175d0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
175e0 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28 75  nt seekAndRead(u
175f0 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c  nixFile *id, sql
17600 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
17610 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  t, void *pBuf, i
17620 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67  nt cnt){.  int g
17630 6f 74 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65  ot;.#if (!define
17640 64 28 55 53 45 5f 50 52 45 41 44 29 20 26 26 20  d(USE_PREAD) && 
17650 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
17660 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77  AD64)).  i64 new
17670 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20  Offset;.#endif. 
17680 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69   TIMER_START;.#i
17690 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
176a0 45 41 44 29 0a 20 20 67 6f 74 20 3d 20 70 72 65  EAD).  got = pre
176b0 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  ad(id->h, pBuf, 
176c0 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  cnt, offset);.  
176d0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
176e0 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c   got = -1 );.#el
176f0 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
17700 52 45 41 44 36 34 29 0a 20 20 67 6f 74 20 3d 20  READ64).  got = 
17710 70 72 65 61 64 36 34 28 69 64 2d 3e 68 2c 20 70  pread64(id->h, p
17720 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
17730 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
17740 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29  rror( got = -1 )
17750 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66  ;.#else.  newOff
17760 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e  set = lseek(id->
17770 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f  h, offset, SEEK_
17780 53 45 54 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  SET);.  Simulate
17790 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73  IOError( newOffs
177a0 65 74 2d 2d 20 29 3b 0a 20 20 69 66 28 20 6e 65  et-- );.  if( ne
177b0 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20  wOffset!=offset 
177c0 29 7b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66  ){.    if( newOf
177d0 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  fset == -1 ){.  
177e0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
177f0 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
17800 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73   errno;.    }els
17810 65 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46  e{.      ((unixF
17820 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
17830 72 6e 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20 20  rno = 0;....    
17840 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  }.    return -1;
17850 0a 20 20 7d 0a 20 20 67 6f 74 20 3d 20 72 65 61  .  }.  got = rea
17860 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  d(id->h, pBuf, c
17870 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49  nt);.#endif.  TI
17880 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67  MER_END;.  if( g
17890 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e  ot<0 ){.    ((un
178a0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
178b0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
178c0 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 35 28 22    }.  OSTRACE5("
178d0 52 45 41 44 20 20 20 20 25 2d 33 64 20 25 35 64  READ    %-3d %5d
178e0 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20   %7lld %llu\n", 
178f0 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73  id->h, got, offs
17900 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  et, TIMER_ELAPSE
17910 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74  D);.  return got
17920 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
17930 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65  data from a file
17940 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20   into a buffer. 
17950 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
17960 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65  K if all.** byte
17970 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63  s were read succ
17980 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c  essfully and SQL
17990 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79  ITE_IOERR if any
179a0 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
179b0 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
179c0 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73  nt unixRead(.  s
179d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
179e0 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20   .  void *pBuf, 
179f0 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71  .  int amt,.  sq
17a00 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
17a10 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  et.){.  unixFile
17a20 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
17a30 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20  ile *)id;.  int 
17a40 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69  got;.  assert( i
17a50 64 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  d );..  /* If th
17a60 69 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65  is is a database
17a70 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75   file (not a jou
17a80 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75  rnal, master-jou
17a90 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a  rnal or temp.  *
17aa0 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74  * file), the byt
17ab0 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  es in the lockin
17ac0 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e  g range should n
17ad0 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20  ever be read or 
17ae0 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 61 73  written. */.  as
17af0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e  sert( pFile->pUn
17b00 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c  used==0.       |
17b10 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e  | offset>=PENDIN
17b20 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20  G_BYTE+512.     
17b30 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c    || offset+amt<
17b40 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20  =PENDING_BYTE . 
17b50 20 29 3b 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65   );..  got = see
17b60 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20  kAndRead(pFile, 
17b70 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d  offset, pBuf, am
17b80 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61  t);.  if( got==a
17b90 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  mt ){.    return
17ba0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
17bb0 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20 29 7b  lse if( got<0 ){
17bc0 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e  .    /* lastErrn
17bd0 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64  o set by seekAnd
17be0 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65 74 75  Read */.    retu
17bf0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
17c00 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  READ;.  }else{. 
17c10 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
17c20 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20  rno = 0; /* not 
17c30 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a  a system error *
17c40 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20  /.    /* Unread 
17c50 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66  parts of the buf
17c60 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  fer must be zero
17c70 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d  -filled */.    m
17c80 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70  emset(&((char*)p
17c90 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d  Buf)[got], 0, am
17ca0 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75  t-got);.    retu
17cb0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
17cc0 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a  SHORT_READ;.  }.
17cd0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f  }../*.** Seek to
17ce0 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69   the offset in i
17cf0 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72  d->offset then r
17d00 65 61 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e  ead cnt bytes in
17d10 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75  to pBuf..** Retu
17d20 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
17d30 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
17d40 72 65 61 64 2e 20 20 55 70 64 61 74 65 20 74 68  read.  Update th
17d50 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  e offset..**.** 
17d60 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e  To avoid stompin
17d70 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75  g the errno valu
17d80 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 77 72  e on a failed wr
17d90 69 74 65 20 74 68 65 20 6c 61 73 74 45 72 72 6e  ite the lastErrn
17da0 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  o value.** is se
17db0 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  t before returni
17dc0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
17dd0 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75  t seekAndWrite(u
17de0 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69 36 34  nixFile *id, i64
17df0 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74 20 76   offset, const v
17e00 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63  oid *pBuf, int c
17e10 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a  nt){.  int got;.
17e20 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55 53  #if (!defined(US
17e30 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65 66  E_PREAD) && !def
17e40 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
17e50 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73  )).  i64 newOffs
17e60 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d  et;.#endif.  TIM
17e70 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65  ER_START;.#if de
17e80 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
17e90 0a 20 20 67 6f 74 20 3d 20 70 77 72 69 74 65 28  .  got = pwrite(
17ea0 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
17eb0 2c 20 6f 66 66 73 65 74 29 3b 0a 23 65 6c 69 66  , offset);.#elif
17ec0 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
17ed0 41 44 36 34 29 0a 20 20 67 6f 74 20 3d 20 70 77  AD64).  got = pw
17ee0 72 69 74 65 36 34 28 69 64 2d 3e 68 2c 20 70 42  rite64(id->h, pB
17ef0 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
17f00 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66  ;.#else.  newOff
17f10 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e  set = lseek(id->
17f20 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f  h, offset, SEEK_
17f30 53 45 54 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f  SET);.  if( newO
17f40 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b  ffset!=offset ){
17f50 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73  .    if( newOffs
17f60 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  et == -1 ){.    
17f70 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
17f80 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
17f90 72 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rrno;.    }else{
17fa0 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c  .      ((unixFil
17fb0 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
17fc0 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20 20 7d 0a  o = 0;....    }.
17fd0 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
17fe0 20 7d 0a 20 20 67 6f 74 20 3d 20 77 72 69 74 65   }.  got = write
17ff0 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
18000 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d  t);.#endif.  TIM
18010 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f  ER_END;.  if( go
18020 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69  t<0 ){.    ((uni
18030 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
18040 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
18050 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 35 28 22   }..  OSTRACE5("
18060 57 52 49 54 45 20 20 20 25 2d 33 64 20 25 35 64  WRITE   %-3d %5d
18070 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20   %7lld %llu\n", 
18080 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73  id->h, got, offs
18090 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  et, TIMER_ELAPSE
180a0 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74  D);.  return got
180b0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
180c0 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  e data from a bu
180d0 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65  ffer into a file
180e0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
180f0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
18100 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
18110 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61  error code on fa
18120 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
18130 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28 0a   int unixWrite(.
18140 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
18150 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69  id, .  const voi
18160 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20  d *pBuf, .  int 
18170 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69  amt,.  sqlite3_i
18180 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a  nt64 offset .){.
18190 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
181a0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
181b0 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20 3d  d;.  int wrote =
181c0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   0;.  assert( id
181d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d   );.  assert( am
181e0 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  t>0 );..  /* If 
181f0 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61  this is a databa
18200 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a  se file (not a j
18210 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a  ournal, master-j
18220 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20  ournal or temp. 
18230 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62   ** file), the b
18240 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b  ytes in the lock
18250 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64  ing range should
18260 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f   never be read o
18270 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20  r written. */.  
18280 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
18290 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20  Unused==0.      
182a0 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44   || offset>=PEND
182b0 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20  ING_BYTE+512.   
182c0 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d      || offset+am
182d0 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  t<=PENDING_BYTE 
182e0 0a 20 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e  .  );..#ifndef N
182f0 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65  DEBUG.  /* If we
18300 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72   are doing a nor
18310 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64  mal write to a d
18320 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
18330 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a   opposed to.  **
18340 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75   doing a hot-jou
18350 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  rnal rollback or
18360 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65   a write to some
18370 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e   file other than
18380 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64   a.  ** normal d
18390 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 74 68  atabase file) th
183a0 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20 66 61  en record the fa
183b0 63 74 20 74 68 61 74 20 74 68 65 20 64 61 74 61  ct that the data
183c0 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68  base.  ** has ch
183d0 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74  anged.  If the t
183e0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
183f0 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20  er is modified, 
18400 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a  record that.  **
18410 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a   fact too..  */.
18420 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e    if( pFile->inN
18430 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20  ormalWrite ){.  
18440 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74    pFile->dbUpdat
18450 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64  e = 1;  /* The d
18460 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
18470 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20   modified */.   
18480 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20   if( offset<=24 
18490 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32  && offset+amt>=2
184a0 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  7 ){.      int r
184b0 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c  c;.      char ol
184c0 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20  dCntr[4];.      
184d0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
184e0 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
184f0 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  rc = seekAndRead
18500 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43  (pFile, 24, oldC
18510 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53  ntr, 4);.      S
18520 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
18530 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69  nign(0);.      i
18540 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63  f( rc!=4 || memc
18550 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63  mp(oldCntr, &((c
18560 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66  har*)pBuf)[24-of
18570 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a  fset], 4)!=0 ){.
18580 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74          pFile->t
18590 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31  ransCntrChng = 1
185a0 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61  ;  /* The transa
185b0 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61  ction counter ha
185c0 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20  s changed */.   
185d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
185e0 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65 28 20  endif..  while( 
185f0 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20  amt>0 && (wrote 
18600 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70  = seekAndWrite(p
18610 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42  File, offset, pB
18620 75 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20  uf, amt))>0 ){. 
18630 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b     amt -= wrote;
18640 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77  .    offset += w
18650 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d  rote;.    pBuf =
18660 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b   &((char*)pBuf)[
18670 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69  wrote];.  }.  Si
18680 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20  mulateIOError(( 
18690 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d  wrote=(-1), amt=
186a0 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  1 ));.  Simulate
186b0 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20  DiskfullError(( 
186c0 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29  wrote=0, amt=1 )
186d0 29 3b 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29  );.  if( amt>0 )
186e0 7b 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c  {.    if( wrote<
186f0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61  0 ){.      /* la
18700 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73  stErrno set by s
18710 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20  eekAndWrite */. 
18720 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18730 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
18740 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18750 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
18760 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20  o = 0; /* not a 
18770 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a  system error */.
18780 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18790 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a  ITE_FULL;.    }.
187a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
187b0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65  ITE_OK;.}..#ifde
187c0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
187d0 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
187e0 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63  mber of fullsync
187f0 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e  s and normal syn
18800 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  cs.  This is use
18810 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61  d to test.** tha
18820 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c  t syncs and full
18830 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72  syncs are occurr
18840 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74  ing at the right
18850 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   times..*/.int s
18860 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
18870 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74  t = 0;.int sqlit
18880 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
18890 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
188a0 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74  *.** We do not t
188b0 72 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20  rust systems to 
188c0 70 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e  provide a workin
188d0 67 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20  g fdatasync().  
188e0 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65  Some do..** Othe
188f0 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65  rs do no.  To be
18900 20 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73   safe, we will s
18910 74 69 63 6b 20 77 69 74 68 20 74 68 65 20 28 73  tick with the (s
18920 6c 6f 77 65 72 29 20 66 73 79 6e 63 28 29 2e 0a  lower) fsync()..
18930 2a 2a 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74  ** If you know t
18940 68 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20  hat your system 
18950 64 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64 61  does support fda
18960 74 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74  tasync() correct
18970 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70  ly,.** then simp
18980 6c 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20  ly compile with 
18990 2d 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74  -Dfdatasync=fdat
189a0 61 73 79 6e 63 0a 2a 2f 0a 23 69 66 20 21 64 65  async.*/.#if !de
189b0 66 69 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29  fined(fdatasync)
189c0 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 6c   && !defined(__l
189d0 69 6e 75 78 5f 5f 29 0a 23 20 64 65 66 69 6e 65  inux__).# define
189e0 20 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63   fdatasync fsync
189f0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
18a00 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46  efine HAVE_FULLF
18a10 53 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64  SYNC to 0 or 1 d
18a20 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
18a30 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68  her or not.** th
18a40 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61  e F_FULLFSYNC ma
18a50 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20  cro is defined. 
18a60 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20   F_FULLFSYNC is 
18a70 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c  currently.** onl
18a80 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d  y available on M
18a90 61 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68  ac OS X.  But th
18aa0 61 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e  at could change.
18ab0 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c  .*/.#ifdef F_FUL
18ac0 4c 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  LFSYNC.# define 
18ad0 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31  HAVE_FULLFSYNC 1
18ae0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
18af0 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30  HAVE_FULLFSYNC 0
18b00 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
18b10 54 68 65 20 66 73 79 6e 63 28 29 20 73 79 73 74  The fsync() syst
18b20 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74  em call does not
18b30 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69   work as adverti
18b40 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75  sed on many.** u
18b50 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68  nix systems.  Th
18b60 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63  e following proc
18b70 65 64 75 72 65 20 69 73 20 61 6e 20 61 74 74 65  edure is an atte
18b80 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69  mpt to make.** i
18b90 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a  t work better..*
18ba0 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f  *.** The SQLITE_
18bb0 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69  NO_SYNC macro di
18bc0 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63  sables all fsync
18bd0 28 29 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  ()s.  This is us
18be0 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74  eful.** for test
18bf0 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74  ing when we want
18c00 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20   to run through 
18c10 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20 71  the test suite q
18c20 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61  uickly..** You a
18c30 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69  re strongly advi
18c40 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70  sed *not* to dep
18c50 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f  loy with SQLITE_
18c60 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c  NO_SYNC.** enabl
18c70 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e  ed, however, sin
18c80 63 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e  ce with SQLITE_N
18c90 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20  O_SYNC enabled, 
18ca0 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f  an OS crash.** o
18cb0 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  r power failure 
18cc0 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72  will likely corr
18cd0 75 70 74 20 74 68 65 20 64 61 74 61 62 61 73 65  upt the database
18ce0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   file..**.** SQL
18cf0 69 74 65 20 73 65 74 73 20 74 68 65 20 64 61 74  ite sets the dat
18d00 61 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20 74 68  aOnly flag if th
18d10 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
18d20 6c 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e  le is unchanged.
18d30 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 62 65 68  .** The idea beh
18d40 69 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69 73 20  ind dataOnly is 
18d50 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 6f  that it should o
18d60 6e 6c 79 20 77 72 69 74 65 20 74 68 65 20 66 69  nly write the fi
18d70 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f  le content.** to
18d80 20 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69   disk, not the i
18d90 6e 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73  node.  We only s
18da0 65 74 20 64 61 74 61 4f 6e 6c 79 20 69 66 20 74  et dataOnly if t
18db0 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20  he file size is 
18dc0 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 73 69  .** unchanged si
18dd0 6e 63 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a  nce the file siz
18de0 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  e is part of the
18df0 20 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65 72   inode.  However
18e00 2c 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74  , .** Ted Ts'o t
18e10 65 6c 6c 73 20 75 73 20 74 68 61 74 20 66 64 61  ells us that fda
18e20 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c  tasync() will al
18e30 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f  so write the ino
18e40 64 65 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c  de if the.** fil
18e50 65 20 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67  e size has chang
18e60 65 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65  ed.  The only re
18e70 61 6c 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  al difference be
18e80 74 77 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28  tween fdatasync(
18e90 29 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29  ).** and fsync()
18ea0 2c 20 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20  , Ted tells us, 
18eb0 69 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e  is that fdatasyn
18ec0 63 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75  c() will not flu
18ed0 73 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20  sh the.** inode 
18ee0 69 66 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 20  if the mtime or 
18ef0 6f 77 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 69  owner or other i
18f00 6e 6f 64 65 20 61 74 74 72 69 62 75 74 65 73 20  node attributes 
18f10 68 61 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  have changed..**
18f20 20 57 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62   We only care ab
18f30 6f 75 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a  out the file siz
18f40 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68 65 72  e, not the other
18f50 20 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73   file attributes
18f60 2c 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61  , so.** as far a
18f70 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 63  s SQLite is conc
18f80 65 72 6e 65 64 2c 20 61 6e 20 66 64 61 74 61 73  erned, an fdatas
18f90 79 6e 63 28 29 20 69 73 20 61 6c 77 61 79 73 20  ync() is always 
18fa0 61 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c  adequate..** So,
18fb0 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 66   we always use f
18fc0 64 61 74 61 73 79 6e 63 28 29 20 69 66 20 69 74  datasync() if it
18fd0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72   is available, r
18fe0 65 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20  egardless of.** 
18ff0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
19000 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a   dataOnly flag..
19010 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75  */.static int fu
19020 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c  ll_fsync(int fd,
19030 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69   int fullSync, i
19040 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20  nt dataOnly){.  
19050 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68  int rc;..  /* Th
19060 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64  e following "ifd
19070 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62  ef/elif/else/" b
19080 6c 6f 63 6b 20 68 61 73 20 74 68 65 20 73 61 6d  lock has the sam
19090 65 20 73 74 72 75 63 74 75 72 65 20 61 73 0a 20  e structure as. 
190a0 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f   ** the one belo
190b0 77 2e 20 49 74 20 69 73 20 72 65 70 6c 69 63 61  w. It is replica
190c0 74 65 64 20 68 65 72 65 20 73 6f 6c 65 6c 79 20  ted here solely 
190d0 74 6f 20 61 76 6f 69 64 20 63 6c 75 74 74 65 72  to avoid clutter
190e0 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74 68 65  ing .  ** up the
190f0 20 72 65 61 6c 20 63 6f 64 65 20 77 69 74 68 20   real code with 
19100 74 68 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  the UNUSED_PARAM
19110 45 54 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20  ETER() macros.. 
19120 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
19130 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53  E_NO_SYNC.  UNUS
19140 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29  ED_PARAMETER(fd)
19150 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
19160 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a  ETER(fullSync);.
19170 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
19180 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65  ER(dataOnly);.#e
19190 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  lif HAVE_FULLFSY
191a0 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  NC.  UNUSED_PARA
191b0 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b  METER(dataOnly);
191c0 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
191d0 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79  PARAMETER(fullSy
191e0 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  nc);.  UNUSED_PA
191f0 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79  RAMETER(dataOnly
19200 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
19210 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65  Record the numbe
19220 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20  r of times that 
19230 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66  we do a normal f
19240 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a  sync() and .  **
19250 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73   FULLSYNC.  This
19260 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20   is used during 
19270 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66  testing to verif
19280 79 20 74 68 61 74 20 74 68 69 73 20 70 72 6f 63  y that this proc
19290 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20  edure.  ** gets 
192a0 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  called with the 
192b0 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74  correct argument
192c0 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  s..  */.#ifdef S
192d0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
192e0 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69   fullSync ) sqli
192f0 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
19300 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f  nt++;.  sqlite3_
19310 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  sync_count++;.#e
19320 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ndif..  /* If we
19330 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74   compiled with t
19340 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
19350 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e  C flag, then syn
19360 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e  cing is a.  ** n
19370 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66  o-op.  */.#ifdef
19380 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
19390 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
193a0 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  ;.#elif HAVE_FUL
193b0 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c  LFSYNC.  if( ful
193c0 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  lSync ){.    rc 
193d0 3d 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55  = fcntl(fd, F_FU
193e0 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d  LLFSYNC, 0);.  }
193f0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31  else{.    rc = 1
19400 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68  ;.  }.  /* If th
19410 65 20 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c  e FULLFSYNC fail
19420 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ed, fall back to
19430 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66   attempting an f
19440 73 79 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20  sync()..  ** It 
19450 73 68 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73  shouldn't be pos
19460 73 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73  sible for fullfs
19470 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74  ync to fail on t
19480 68 65 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66  he local .  ** f
19490 69 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f  ile system (on O
194a0 53 58 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20  SX), so failure 
194b0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 46  indicates that F
194c0 55 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73  ULLFSYNC.  ** is
194d0 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f  n't supported fo
194e0 72 20 74 68 69 73 20 66 69 6c 65 20 73 79 73 74  r this file syst
194f0 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20  em. So, attempt 
19500 61 6e 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61  an fsync .  ** a
19510 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e  nd (for now) ign
19520 6f 72 65 20 74 68 65 20 6f 76 65 72 68 65 61 64  ore the overhead
19530 20 6f 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75   of a superfluou
19540 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a  s fcntl call.  .
19550 20 20 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74    ** It'd be bet
19560 74 65 72 20 74 6f 20 64 65 74 65 63 74 20 66 75  ter to detect fu
19570 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20  llfsync support 
19580 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a  once and avoid .
19590 20 20 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63    ** the fcntl c
195a0 61 6c 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73  all every time s
195b0 79 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20  ync is called.. 
195c0 20 2a 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72   */.  if( rc ) r
195d0 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a  c = fsync(fd);..
195e0 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  #elif defined(__
195f0 41 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64  APPLE__).  /* fd
19600 61 74 61 73 79 6e 63 28 29 20 6f 6e 20 48 46 53  atasync() on HFS
19610 2b 20 64 6f 65 73 6e 27 74 20 79 65 74 20 66 6c  + doesn't yet fl
19620 75 73 68 20 74 68 65 20 66 69 6c 65 20 73 69 7a  ush the file siz
19630 65 20 69 66 20 69 74 20 63 68 61 6e 67 65 64 20  e if it changed 
19640 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73  correctly.  ** s
19650 6f 20 63 75 72 72 65 6e 74 6c 79 20 77 65 20 64  o currently we d
19660 65 66 61 75 6c 74 20 74 6f 20 74 68 65 20 6d 61  efault to the ma
19670 63 72 6f 20 74 68 61 74 20 72 65 64 65 66 69 6e  cro that redefin
19680 65 73 20 66 64 61 74 61 73 79 6e 63 20 74 6f 20  es fdatasync to 
19690 66 73 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20  fsync.  */.  rc 
196a0 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c  = fsync(fd);.#el
196b0 73 65 20 0a 20 20 72 63 20 3d 20 66 64 61 74 61  se .  rc = fdata
196c0 73 79 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f 53  sync(fd);.#if OS
196d0 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72  _VXWORKS.  if( r
196e0 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d  c==-1 && errno==
196f0 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20 20 20 72  ENOTSUP ){.    r
19700 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20  c = fsync(fd);. 
19710 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f   }.#endif /* OS_
19720 56 58 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69  VXWORKS */.#endi
19730 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54  f /* ifdef SQLIT
19740 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48  E_NO_SYNC elif H
19750 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f  AVE_FULLFSYNC */
19760 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52  ..  if( OS_VXWOR
19770 4b 53 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b  KS && rc!= -1 ){
19780 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d  .    rc = 0;.  }
19790 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
197a0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
197b0 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61   all writes to a
197c0 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65   particular file
197d0 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74   are committed t
197e0 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  o disk..**.** If
197f0 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65   dataOnly==0 the
19800 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20  n both the file 
19810 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d  itself and its m
19820 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a  etadata (file.**
19830 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69   size, access ti
19840 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e  me, etc) are syn
19850 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c  ced.  If dataOnl
19860 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74  y!=0 then only t
19870 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20  he.** file data 
19880 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  is synced..**.**
19890 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73   Under Unix, als
198a0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
198b0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65   the directory e
198c0 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c  ntry for the fil
198d0 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72  e.** has been cr
198e0 65 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69  eated by fsync-i
198f0 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ng the directory
19900 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
19910 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77  he file..** If w
19920 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73  e do not do this
19930 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65   and we encounte
19940 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  r a power failur
19950 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  e, the directory
19960 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68  .** entry for th
19970 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  e journal might 
19980 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65 72 20  not exist after 
19990 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20  we reboot.  The 
199a0 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74  next.** SQLite t
199b0 6f 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c  o access the fil
199c0 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20  e will not know 
199d0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
199e0 20 65 78 69 73 74 73 20 28 62 65 63 61 75 73 65   exists (because
199f0 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72  .** the director
19a00 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  y entry for the 
19a10 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65  journal was neve
19a20 72 20 63 72 65 61 74 65 64 29 20 61 6e 64 20 74  r created) and t
19a30 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  he transaction.*
19a40 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20  * will not roll 
19a50 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20  back - possibly 
19a60 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62  leading to datab
19a70 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
19a80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
19a90 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66  ixSync(sqlite3_f
19aa0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61  ile *id, int fla
19ab0 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gs){.  int rc;. 
19ac0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
19ad0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
19ae0 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61 4f  ;..  int isDataO
19af0 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51 4c  nly = (flags&SQL
19b00 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
19b10 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c  Y);.  int isFull
19b20 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30 78  sync = (flags&0x
19b30 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
19b40 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65  _FULL;..  /* Che
19b50 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53  ck that one of S
19b60 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
19b70 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61  L or FULL was pa
19b80 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  ssed */.  assert
19b90 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53  ((flags&0x0F)==S
19ba0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
19bb0 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67  L.      || (flag
19bc0 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
19bd0 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a  SYNC_FULL.  );..
19be0 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74    /* Unix cannot
19bf0 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65  , but some syste
19c00 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ms may return SQ
19c10 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68  LITE_FULL from h
19c20 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c  ere. This.  ** l
19c30 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20 74  ine is to test t
19c40 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65  hat doing so doe
19c50 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20  s not cause any 
19c60 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20  problems..  */. 
19c70 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
19c80 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  lError( return S
19c90 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20  QLITE_FULL );.. 
19ca0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
19cb0 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22 53 59  ;.  OSTRACE2("SY
19cc0 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70  NC    %-3d\n", p
19cd0 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 72 63 20 3d  File->h);.  rc =
19ce0 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c   full_fsync(pFil
19cf0 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63  e->h, isFullsync
19d00 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20  , isDataOnly);. 
19d10 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
19d20 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20  ( rc=1 );.  if( 
19d30 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  rc ){.    pFile-
19d40 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
19d50 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  no;.    return S
19d60 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e  QLITE_IOERR_FSYN
19d70 43 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69  C;.  }.  if( pFi
19d80 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b 0a  le->dirfd>=0 ){.
19d90 20 20 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20      int err;.   
19da0 20 4f 53 54 52 41 43 45 34 28 22 44 49 52 53 59   OSTRACE4("DIRSY
19db0 4e 43 20 25 2d 33 64 20 28 68 61 76 65 5f 66 75  NC %-3d (have_fu
19dc0 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73  llfsync=%d fulls
19dd0 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c  ync=%d)\n", pFil
19de0 65 2d 3e 64 69 72 66 64 2c 0a 20 20 20 20 20 20  e->dirfd,.      
19df0 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46        HAVE_FULLF
19e00 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63  SYNC, isFullsync
19e10 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
19e20 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e  E_DISABLE_DIRSYN
19e30 43 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72  C.    /* The dir
19e40 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20 6f  ectory sync is o
19e50 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66  nly attempted if
19e60 20 66 75 6c 6c 5f 66 73 79 6e 63 20 69 73 0a 20   full_fsync is. 
19e70 20 20 20 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66     ** turned off
19e80 20 6f 72 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e   or unavailable.
19e90 20 20 49 66 20 61 20 66 75 6c 6c 5f 66 73 79 6e    If a full_fsyn
19ea0 63 20 6f 63 63 75 72 72 65 64 20 61 62 6f 76 65  c occurred above
19eb0 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
19ec0 65 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63  e directory sync
19ed0 20 69 73 20 73 75 70 65 72 66 6c 75 6f 75 73 2e   is superfluous.
19ee0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
19ef0 28 21 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  (!HAVE_FULLFSYNC
19f00 20 7c 7c 20 21 69 73 46 75 6c 6c 73 79 6e 63 29   || !isFullsync)
19f10 20 26 26 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70   && full_fsync(p
19f20 46 69 6c 65 2d 3e 64 69 72 66 64 2c 30 2c 30 29  File->dirfd,0,0)
19f30 20 29 7b 0a 20 20 20 20 20 20 20 2f 2a 0a 20 20   ){.       /*.  
19f40 20 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20       ** We have 
19f50 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70 6c  received multipl
19f60 65 20 72 65 70 6f 72 74 73 20 6f 66 20 66 73 79  e reports of fsy
19f70 6e 63 28 29 20 72 65 74 75 72 6e 69 6e 67 0a 20  nc() returning. 
19f80 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73 20        ** errors 
19f90 77 68 65 6e 20 61 70 70 6c 69 65 64 20 74 6f 20  when applied to 
19fa0 64 69 72 65 63 74 6f 72 69 65 73 20 6f 6e 20 63  directories on c
19fb0 65 72 74 61 69 6e 20 66 69 6c 65 20 73 79 73 74  ertain file syst
19fc0 65 6d 73 2e 0a 20 20 20 20 20 20 20 2a 2a 20 41  ems..       ** A
19fd0 20 66 61 69 6c 65 64 20 64 69 72 65 63 74 6f 72   failed director
19fe0 79 20 73 79 6e 63 20 69 73 20 6e 6f 74 20 61 20  y sync is not a 
19ff0 62 69 67 20 64 65 61 6c 2e 20 20 53 6f 20 69 74  big deal.  So it
1a000 20 73 65 65 6d 73 0a 20 20 20 20 20 20 20 2a 2a   seems.       **
1a010 20 62 65 74 74 65 72 20 74 6f 20 69 67 6e 6f 72   better to ignor
1a020 65 20 74 68 65 20 65 72 72 6f 72 2e 20 20 54 69  e the error.  Ti
1a030 63 6b 65 74 20 23 31 36 35 37 0a 20 20 20 20 20  cket #1657.     
1a040 20 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20 70    */.       /* p
1a050 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1a060 3d 20 65 72 72 6e 6f 3b 20 2a 2f 0a 20 20 20 20  = errno; */.    
1a070 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 53 51 4c     /* return SQL
1a080 49 54 45 5f 49 4f 45 52 52 3b 20 2a 2f 0a 20 20  ITE_IOERR; */.  
1a090 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 65    }.#endif.    e
1a0a0 72 72 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c 65  rr = close(pFile
1a0b0 2d 3e 64 69 72 66 64 29 3b 20 2f 2a 20 4f 6e 6c  ->dirfd); /* Onl
1a0c0 79 20 6e 65 65 64 20 74 6f 20 73 79 6e 63 20 6f  y need to sync o
1a0d0 6e 63 65 2c 20 73 6f 20 63 6c 6f 73 65 20 74 68  nce, so close th
1a0e0 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 72 72  e */.    if( err
1a0f0 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  ==0 ){          
1a100 20 20 20 20 2f 2a 20 64 69 72 65 63 74 6f 72 79      /* directory
1a110 20 77 68 65 6e 20 77 65 20 61 72 65 20 64 6f 6e   when we are don
1a120 65 20 2a 2f 0a 20 20 20 20 20 20 70 46 69 6c 65  e */.      pFile
1a130 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20  ->dirfd = -1;.  
1a140 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1a150 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1a160 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
1a170 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
1a180 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20  _DIR_CLOSE;.    
1a190 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1a1a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  c;.}../*.** Trun
1a1b0 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c  cate an open fil
1a1c0 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64  e to a specified
1a1d0 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20   size.*/.static 
1a1e0 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65  int unixTruncate
1a1f0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1a200 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  d, i64 nByte){. 
1a210 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
1a220 74 28 20 69 64 20 29 3b 0a 20 20 53 69 6d 75 6c  t( id );.  Simul
1a230 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
1a240 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1a250 54 52 55 4e 43 41 54 45 20 29 3b 0a 20 20 72 63  TRUNCATE );.  rc
1a260 20 3d 20 66 74 72 75 6e 63 61 74 65 28 28 28 75   = ftruncate(((u
1a270 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c  nixFile*)id)->h,
1a280 20 28 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a   (off_t)nByte);.
1a290 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1a2a0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
1a2b0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
1a2c0 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  no;.    return S
1a2d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
1a2e0 43 41 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23  CATE;.  }else{.#
1a2f0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
1a300 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
1a310 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72  oing a normal wr
1a320 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73  ite to a databas
1a330 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73  e file (as oppos
1a340 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69  ed to.    ** doi
1a350 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
1a360 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77   rollback or a w
1a370 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c  rite to some fil
1a380 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20  e other than a. 
1a390 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74     ** normal dat
1a3a0 61 62 61 73 65 20 66 69 6c 65 29 20 61 6e 64 20  abase file) and 
1a3b0 77 65 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  we truncate the 
1a3c0 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  file to zero len
1a3d0 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74  gth,.    ** that
1a3e0 20 65 66 66 65 63 74 69 76 65 6c 79 20 75 70 64   effectively upd
1a3f0 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 20  ates the change 
1a400 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 6d  counter.  This m
1a410 69 67 68 74 20 68 61 70 70 65 6e 0a 20 20 20 20  ight happen.    
1a420 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f 72 69 6e  ** when restorin
1a430 67 20 61 20 64 61 74 61 62 61 73 65 20 75 73 69  g a database usi
1a440 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20 41 50  ng the backup AP
1a450 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65  I from a zero-le
1a460 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72  ngth.    ** sour
1a470 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ce..    */.    i
1a480 66 28 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  f( ((unixFile*)i
1a490 64 29 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  d)->inNormalWrit
1a4a0 65 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b  e && nByte==0 ){
1a4b0 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c  .      ((unixFil
1a4c0 65 2a 29 69 64 29 2d 3e 74 72 61 6e 73 43 6e 74  e*)id)->transCnt
1a4d0 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d  rChng = 1;.    }
1a4e0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74  .#endif..    ret
1a4f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1a500 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65   }.}../*.** Dete
1a510 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e  rmine the curren
1a520 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65  t size of a file
1a530 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61   in bytes.*/.sta
1a540 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
1a550 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
1a560 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a  e *id, i64 *pSiz
1a570 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
1a580 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
1a590 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
1a5a0 0a 20 20 72 63 20 3d 20 66 73 74 61 74 28 28 28  .  rc = fstat(((
1a5b0 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68  unixFile*)id)->h
1a5c0 2c 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c  , &buf);.  Simul
1a5d0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
1a5e0 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20   );.  if( rc!=0 
1a5f0 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c  ){.    ((unixFil
1a600 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
1a610 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72  o = errno;.    r
1a620 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1a630 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20  RR_FSTAT;.  }.  
1a640 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f  *pSize = buf.st_
1a650 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e  size;..  /* When
1a660 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f 2d   opening a zero-
1a670 73 69 7a 65 20 64 61 74 61 62 61 73 65 2c 20 74  size database, t
1a680 68 65 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28  he findLockInfo(
1a690 29 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a  ) procedure.  **
1a6a0 20 77 72 69 74 65 73 20 61 20 73 69 6e 67 6c 65   writes a single
1a6b0 20 62 79 74 65 20 69 6e 74 6f 20 74 68 61 74 20   byte into that 
1a6c0 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  file in order to
1a6d0 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 62   work around a b
1a6e0 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 4f  ug.  ** in the O
1a6f0 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65 73 79  S-X msdos filesy
1a700 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72 20  stem.  In order 
1a710 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  to avoid problem
1a720 73 20 77 69 74 68 20 75 70 70 65 72 0a 20 20 2a  s with upper.  *
1a730 2a 20 6c 61 79 65 72 73 2c 20 77 65 20 6e 65 65  * layers, we nee
1a740 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 69 73  d to report this
1a750 20 66 69 6c 65 20 73 69 7a 65 20 61 73 20 7a 65   file size as ze
1a760 72 6f 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69  ro even though i
1a770 74 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c 6c 79  t is.  ** really
1a780 20 31 2e 20 20 20 54 69 63 6b 65 74 20 23 33 32   1.   Ticket #32
1a790 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 2a  60..  */.  if( *
1a7a0 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53 69 7a  pSize==1 ) *pSiz
1a7b0 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74 75 72  e = 0;...  retur
1a7c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1a7d0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
1a7e0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
1a7f0 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
1a800 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64  LE__)./*.** Hand
1a810 6c 65 72 20 66 6f 72 20 70 72 6f 78 79 2d 6c 6f  ler for proxy-lo
1a820 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e 74 72  cking file-contr
1a830 6f 6c 20 76 65 72 62 73 2e 20 20 44 65 66 69 6e  ol verbs.  Defin
1a840 65 64 20 62 65 6c 6f 77 20 69 6e 20 74 68 65 0a  ed below in the.
1a850 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b  ** proxying lock
1a860 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f  ing division..*/
1a870 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
1a880 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  yFileControl(sql
1a890 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76  ite3_file*,int,v
1a8a0 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 0a  oid*);.#endif...
1a8b0 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f  /*.** Informatio
1a8c0 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66  n and control of
1a8d0 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68 61   an open file ha
1a8e0 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
1a8f0 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74  int unixFileCont
1a900 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
1a910 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f   *id, int op, vo
1a920 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77 69  id *pArg){.  swi
1a930 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
1a940 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1a950 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20  _LOCKSTATE: {.  
1a960 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
1a970 3d 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  = ((unixFile*)id
1a980 29 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20  )->locktype;.   
1a990 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a9a0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1a9b0 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f  ase SQLITE_LAST_
1a9c0 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a  ERRNO: {.      *
1a9d0 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 28 75  (int*)pArg = ((u
1a9e0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
1a9f0 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  stErrno;.      r
1aa00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1aa10 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  .    }.#ifndef N
1aa20 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 65  DEBUG.    /* The
1aa30 20 70 61 67 65 72 20 63 61 6c 6c 73 20 74 68 69   pager calls thi
1aa40 73 20 6d 65 74 68 6f 64 20 74 6f 20 73 69 67 6e  s method to sign
1aa50 61 6c 20 74 68 61 74 20 69 74 20 68 61 73 20 64  al that it has d
1aa60 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6c  one.    ** a rol
1aa70 6c 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74  lback and that t
1aa80 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 74  he database is t
1aa90 68 65 72 65 66 6f 72 65 20 75 6e 63 68 61 6e 67  herefore unchang
1aaa0 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 74  ed and.    ** it
1aab0 20 68 65 6e 63 65 20 69 74 20 69 73 20 4f 4b 20   hence it is OK 
1aac0 66 6f 72 20 74 68 65 20 74 72 61 6e 73 61 63 74  for the transact
1aad0 69 6f 6e 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  ion change count
1aae0 65 72 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  er to be.    ** 
1aaf0 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 2a  unchanged..    *
1ab00 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1ab10 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41  E_FCNTL_DB_UNCHA
1ab20 4e 47 45 44 3a 20 7b 0a 20 20 20 20 20 20 28 28  NGED: {.      ((
1ab30 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 64  unixFile*)id)->d
1ab40 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20  bUpdate = 0;.   
1ab50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ab60 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  _OK;.    }.#endi
1ab70 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
1ab80 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1ab90 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
1aba0 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73 65  PPLE__).    case
1abb0 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
1abc0 50 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20 63  PROXYFILE:.    c
1abd0 61 73 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c  ase SQLITE_GET_L
1abe0 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a  OCKPROXYFILE: {.
1abf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f        return pro
1ac00 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64  xyFileControl(id
1ac10 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d  ,op,pArg);.    }
1ac20 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1ac30 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1ac40 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
1ac50 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a  d(__APPLE__) */.
1ac60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1ac70 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  ITE_ERROR;.}../*
1ac80 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
1ac90 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79  ector size in by
1aca0 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72  tes of the under
1acb0 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69  lying block devi
1acc0 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70  ce for.** the sp
1acd0 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68  ecified file. Th
1ace0 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  is is almost alw
1acf0 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62  ays 512 bytes, b
1ad00 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72  ut may be.** lar
1ad10 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76  ger for some dev
1ad20 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ices..**.** SQLi
1ad30 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20  te code assumes 
1ad40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
1ad50 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c  nnot fail. It al
1ad60 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  so assumes that.
1ad70 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20  ** if two files 
1ad80 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74  are created in t
1ad90 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73  he same file-sys
1ada0 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69  tem directory (i
1adb0 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  .e..** a databas
1adc0 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61  e and its journa
1add0 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65  l file) that the
1ade0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
1adf0 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65  l be the.** same
1ae00 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74   for both..*/.st
1ae10 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63  atic int unixSec
1ae20 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
1ae30 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a  file *NotUsed){.
1ae40 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1ae50 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
1ae60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46  eturn SQLITE_DEF
1ae70 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
1ae80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1ae90 6e 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61  n the device cha
1aea0 72 61 63 74 65 72 69 73 74 69 63 73 20 66 6f 72  racteristics for
1aeb0 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20   the file. This 
1aec0 69 73 20 61 6c 77 61 79 73 20 30 20 66 6f 72 20  is always 0 for 
1aed0 75 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  unix..*/.static 
1aee0 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68  int unixDeviceCh
1aef0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
1af00 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
1af10 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
1af20 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
1af30 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
1af40 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64  ../*.** Here end
1af50 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
1af60 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69  tion of all sqli
1af70 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73  te3_file methods
1af80 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
1af90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
1afa0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74  sqlite3_file Met
1afb0 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
1afc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1afd0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
1afe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b020 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ***/../*.** This
1b030 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
1b040 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  ns definitions o
1b050 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  f sqlite3_io_met
1b060 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74 68 61  hods objects tha
1b070 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76  t.** implement v
1b080 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b  arious file lock
1b090 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20  ing strategies. 
1b0a0 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e   It also contain
1b0b0 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a  s definitions.**
1b0c0 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66 75 6e   of "finder" fun
1b0d0 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65  ctions.  A finde
1b0e0 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  r-function is us
1b0f0 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  ed to locate the
1b100 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
1b110 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1b120 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 20  ds object for a 
1b130 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
1b140 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70  ase file.  The p
1b150 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64  AppData.** field
1b160 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
1b170 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74 73 20  vfs VFS objects 
1b180 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  are initialized 
1b190 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73 20 74  to be pointers t
1b1a0 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  o.** the correct
1b1b0 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
1b1c0 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e 0a 2a   for that VFS..*
1b1d0 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72  *.** Most finder
1b1e0 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
1b1f0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
1b200 20 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69   fixed sqlite3_i
1b210 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
1b220 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69  ect.  The only i
1b230 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e 64 65  nteresting finde
1b240 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 75  r-function is au
1b250 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  tolockIoFinder, 
1b260 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61  which.** looks a
1b270 74 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  t the filesystem
1b280 20 74 79 70 65 20 61 6e 64 20 74 72 69 65 73 20   type and tries 
1b290 74 6f 20 67 75 65 73 73 20 74 68 65 20 62 65 73  to guess the bes
1b2a0 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72  t locking.** str
1b2b0 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61 74 2e  ategy from that.
1b2c0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65  .**.** For finde
1b2d0 72 2d 66 75 6e 74 69 6f 6e 20 46 2c 20 74 77 6f  r-funtion F, two
1b2e0 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65   objects are cre
1b2f0 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ated:.**.**    (
1b300 31 29 20 54 68 65 20 72 65 61 6c 20 66 69 6e 64  1) The real find
1b310 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er-function name
1b320 64 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a  d "FImpt()"..**.
1b330 2a 2a 20 20 20 20 28 32 29 20 41 20 63 6f 6e 73  **    (2) A cons
1b340 74 61 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f 20  tant pointer to 
1b350 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61  this function na
1b360 6d 65 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a  med just "F"..**
1b370 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72  .**.** A pointer
1b380 20 74 6f 20 74 68 65 20 46 20 70 6f 69 6e 74 65   to the F pointe
1b390 72 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65  r is used as the
1b3a0 20 70 41 70 70 44 61 74 61 20 76 61 6c 75 65 20   pAppData value 
1b3b0 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63  for VFS.** objec
1b3c0 74 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  ts.  We have to 
1b3d0 64 6f 20 74 68 69 73 20 69 6e 73 74 65 61 64 20  do this instead 
1b3e0 6f 66 20 6c 65 74 74 69 6e 67 20 70 41 70 70 44  of letting pAppD
1b3f0 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72  ata point.** dir
1b400 65 63 74 6c 79 20 61 74 20 74 68 65 20 66 69 6e  ectly at the fin
1b410 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e  der-function sin
1b420 63 65 20 43 39 30 20 72 75 6c 65 73 20 70 72 65  ce C90 rules pre
1b430 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20  vent a void*.** 
1b440 66 72 6f 6d 20 62 65 20 63 61 73 74 20 69 6e 74  from be cast int
1b450 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  o a function poi
1b460 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45  nter..**.**.** E
1b470 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ach instance of 
1b480 74 68 69 73 20 6d 61 63 72 6f 20 67 65 6e 65 72  this macro gener
1b490 61 74 65 73 20 74 77 6f 20 6f 62 6a 65 63 74 73  ates two objects
1b4a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63  :.**.**   *  A c
1b4b0 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74 65 33 5f  onstant sqlite3_
1b4c0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
1b4d0 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68  t call METHOD th
1b4e0 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a  at has locking.*
1b4f0 2a 20 20 20 20 20 20 6d 65 74 68 6f 64 73 20 43  *      methods C
1b500 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f  LOSE, LOCK, UNLO
1b510 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a  CK, CKRESLOCK..*
1b520 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f  *.**   *  An I/O
1b530 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66   method finder f
1b540 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46  unction called F
1b550 49 4e 44 45 52 20 74 68 61 74 20 72 65 74 75 72  INDER that retur
1b560 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
1b570 20 20 20 20 20 74 6f 20 74 68 65 20 4d 45 54 48       to the METH
1b580 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  OD object in the
1b590 20 70 72 65 76 69 6f 75 73 20 62 75 6c 6c 65 74   previous bullet
1b5a0 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d  ..*/.#define IOM
1b5b0 45 54 48 4f 44 53 28 46 49 4e 44 45 52 2c 20 4d  ETHODS(FINDER, M
1b5c0 45 54 48 4f 44 2c 20 43 4c 4f 53 45 2c 20 4c 4f  ETHOD, CLOSE, LO
1b5d0 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f  CK, UNLOCK, CKLO
1b5e0 43 4b 29 20 20 20 20 20 20 20 20 20 20 20 20 20  CK)             
1b5f0 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74    \.static const
1b600 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1b610 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20  ods METHOD = {  
1b620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b640 20 5c 0a 20 20 20 31 2c 20 20 20 20 20 20 20 20   \.   1,        
1b650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b660 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
1b670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b690 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20 20 20  \.   CLOSE,     
1b6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6b0 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20   /* xClose */   
1b6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1b6e0 0a 20 20 20 75 6e 69 78 52 65 61 64 2c 20 20 20  .   unixRead,   
1b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b700 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20 20 20 20  /* xRead */     
1b710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1b730 20 20 20 75 6e 69 78 57 72 69 74 65 2c 20 20 20     unixWrite,   
1b740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b750 2a 20 78 57 72 69 74 65 20 2a 2f 20 20 20 20 20  * xWrite */     
1b760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b770 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1b780 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 20    unixTruncate, 
1b790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b7a0 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 20 20 20   xTruncate */   
1b7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7c0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1b7d0 20 75 6e 69 78 53 79 6e 63 2c 20 20 20 20 20 20   unixSync,      
1b7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b7f0 78 53 79 6e 63 20 2a 2f 20 20 20 20 20 20 20 20  xSync */        
1b800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b810 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1b820 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20 20 20  unixFileSize,   
1b830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1b840 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20 20  FileSize */     
1b850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b860 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 4c            \.   L
1b870 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20  OCK,            
1b880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
1b890 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
1b8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8b0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 55 4e           \.   UN
1b8c0 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20  LOCK,           
1b8d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
1b8e0 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  lock */         
1b8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b900 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c          \.   CKL
1b910 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20  OCK,            
1b920 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65           /* xChe
1b930 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a  ckReservedLock *
1b940 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
1b950 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
1b960 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20  FileControl,    
1b970 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
1b980 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20  Control */      
1b990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9a0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
1b9b0 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20  ectorSize,      
1b9c0 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f         /* xSecto
1b9d0 72 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20  rSize */        
1b9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9f0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 44 65       \.   unixDe
1ba00 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1ba10 69 63 73 20 20 20 2f 2a 20 78 44 65 76 69 63 65  ics   /* xDevice
1ba20 43 61 70 61 62 69 6c 69 74 69 65 73 20 2a 2f 20  Capabilities */ 
1ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba40 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20      \.};        
1ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba90 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73     \.static cons
1baa0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
1bab0 68 6f 64 73 20 2a 46 49 4e 44 45 52 23 23 49 6d  hods *FINDER##Im
1bac0 70 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  pl(const char *z
1bad0 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20  , unixFile *p){ 
1bae0 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52    \.  UNUSED_PAR
1baf0 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55 53 45  AMETER(z); UNUSE
1bb00 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20  D_PARAMETER(p); 
1bb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb30 20 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d 45 54   \.  return &MET
1bb40 48 4f 44 3b 20 20 20 20 20 20 20 20 20 20 20 20  HOD;            
1bb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb80 5c 0a 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  \.}             
1bb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1bbd0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
1bbe0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1bbf0 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52   *(*const FINDER
1bc00 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
1bc10 69 78 46 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a  ixFile *p)    \.
1bc20 20 20 20 20 3d 20 46 49 4e 44 45 52 23 23 49 6d      = FINDER##Im
1bc30 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20  pl;../*.** Here 
1bc40 61 72 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73  are all of the s
1bc50 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1bc60 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61  s objects for ea
1bc70 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63  ch of the.** loc
1bc80 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e  king strategies.
1bc90 20 20 46 75 6e 63 74 69 6f 6e 73 20 74 68 61 74    Functions that
1bca0 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 73   return pointers
1bcb0 20 74 6f 20 74 68 65 73 65 20 6d 65 74 68 6f 64   to these method
1bcc0 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63 72  s.** are also cr
1bcd0 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48  eated..*/.IOMETH
1bce0 4f 44 53 28 0a 20 20 70 6f 73 69 78 49 6f 46 69  ODS(.  posixIoFi
1bcf0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
1bd00 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
1bd10 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f  ion name */.  po
1bd20 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  sixIoMethods,   
1bd30 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
1bd40 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
1bd50 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 75  ject name */.  u
1bd60 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nixClose,       
1bd70 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
1bd80 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  se method */.  u
1bd90 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  nixLock,        
1bda0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
1bdb0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
1bdc0 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ixUnlock,       
1bdd0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
1bde0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  ck method */.  u
1bdf0 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
1be00 4c 6f 63 6b 20 20 20 20 20 2f 2a 20 78 43 68 65  Lock     /* xChe
1be10 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
1be20 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54  ethod */.).IOMET
1be30 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f  HODS(.  nolockIo
1be40 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
1be50 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
1be60 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e  tion name */.  n
1be70 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  olockIoMethods, 
1be80 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
1be90 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
1bea0 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
1beb0 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20  nolockClose,    
1bec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
1bed0 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
1bee0 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20  nolockLock,     
1bef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
1bf00 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e  ck method */.  n
1bf10 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20  olockUnlock,    
1bf20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
1bf30 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
1bf40 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  nolockCheckReser
1bf50 76 65 64 4c 6f 63 6b 20 20 20 2f 2a 20 78 43 68  vedLock   /* xCh
1bf60 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
1bf70 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45  method */.).IOME
1bf80 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b  THODS(.  dotlock
1bf90 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
1bfa0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
1bfb0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
1bfc0 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  dotlockIoMethods
1bfd0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c  ,         /* sql
1bfe0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1bff0 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
1c000 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20   dotlockClose,  
1c010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
1c020 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
1c030 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20   dotlockLock,   
1c040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
1c050 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
1c060 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20  dotlockUnlock,  
1c070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
1c080 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
1c090 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73   dotlockCheckRes
1c0a0 65 72 76 65 64 4c 6f 63 6b 20 20 2f 2a 20 78 43  ervedLock  /* xC
1c0b0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
1c0c0 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69   method */.)..#i
1c0d0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1c0e0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
1c0f0 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d   !OS_VXWORKS.IOM
1c100 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49  ETHODS(.  flockI
1c110 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
1c120 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
1c130 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
1c140 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c   flockIoMethods,
1c150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
1c160 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1c170 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
1c180 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20    flockClose,   
1c190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1c1a0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
1c1b0 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20    flockLock,    
1c1c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1c1d0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
1c1e0 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20   flockUnlock,   
1c1f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
1c200 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
1c210 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65    flockCheckRese
1c220 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78  rvedLock    /* x
1c230 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
1c240 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  k method */.).#e
1c250 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57  ndif..#if OS_VXW
1c260 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  ORKS.IOMETHODS(.
1c270 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20    semIoFinder,  
1c280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1c290 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
1c2a0 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65  ame */.  semIoMe
1c2b0 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
1c2c0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
1c2d0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
1c2e0 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 43 6c 6f  name */.  semClo
1c2f0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
1c300 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
1c310 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c 6f 63  thod */.  semLoc
1c320 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
1c330 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
1c340 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 55 6e 6c 6f  hod */.  semUnlo
1c350 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
1c360 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
1c370 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 43 68 65  thod */.  semChe
1c380 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
1c390 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
1c3a0 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
1c3b0 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69   */.).#endif..#i
1c3c0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1c3d0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
1c3e0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1c3f0 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  YLE.IOMETHODS(. 
1c400 20 61 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20   afpIoFinder,   
1c410 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1c420 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
1c430 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74  me */.  afpIoMet
1c440 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
1c450 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
1c460 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
1c470 61 6d 65 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73  ame */.  afpClos
1c480 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1c490 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
1c4a0 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b  hod */.  afpLock
1c4b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c4c0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
1c4d0 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63  od */.  afpUnloc
1c4e0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
1c4f0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
1c500 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43 68 65 63  hod */.  afpChec
1c510 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
1c520 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
1c530 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
1c540 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  */.).#endif../*.
1c550 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63  ** The proxy loc
1c560 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69 73 20 61  king method is a
1c570 20 22 73 75 70 65 72 2d 6d 65 74 68 6f 64 22 20   "super-method" 
1c580 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68 61  in the sense tha
1c590 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65  t it.** opens se
1c5a0 63 6f 6e 64 61 72 79 20 66 69 6c 65 20 64 65 73  condary file des
1c5b0 63 72 69 70 74 6f 72 73 20 66 6f 72 20 74 68 65  criptors for the
1c5c0 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20   conch and lock 
1c5d0 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20  files and.** it 
1c5e0 75 73 65 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d  uses proxy, dot-
1c5f0 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20 66  file, AFP, and f
1c600 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d  lock() locking m
1c610 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a  ethods on those.
1c620 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c  ** secondary fil
1c630 65 73 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65  es.  For this re
1c640 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69  ason, the divisi
1c650 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  on that implemen
1c660 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b  ts.** proxy lock
1c670 69 6e 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6d  ing is located m
1c680 75 63 68 20 66 75 72 74 68 65 72 20 64 6f 77 6e  uch further down
1c690 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 42   in the file.  B
1c6a0 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f  ut we need.** to
1c6b0 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64 65   go ahead and de
1c6c0 66 69 6e 65 20 74 68 65 20 73 71 6c 69 74 65 33  fine the sqlite3
1c6d0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20  _io_methods and 
1c6e0 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a  finder function.
1c6f0 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63  ** for proxy loc
1c700 6b 69 6e 67 20 68 65 72 65 2e 20 20 53 6f 20 77  king here.  So w
1c710 65 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72  e forward declar
1c720 65 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64  e the I/O method
1c730 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  s..*/.#if define
1c740 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
1c750 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1c760 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74  CKING_STYLE.stat
1c770 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73  ic int proxyClos
1c780 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  e(sqlite3_file*)
1c790 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
1c7a0 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  xyLock(sqlite3_f
1c7b0 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74  ile*, int);.stat
1c7c0 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f  ic int proxyUnlo
1c7d0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ck(sqlite3_file*
1c7e0 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69  , int);.static i
1c7f0 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73  nt proxyCheckRes
1c800 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
1c810 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a  3_file*, int*);.
1c820 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 72 6f  IOMETHODS(.  pro
1c830 78 79 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  xyIoFinder,     
1c840 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
1c850 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
1c860 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f  /.  proxyIoMetho
1c870 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ds,           /*
1c880 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1c890 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
1c8a0 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c  */.  proxyClose,
1c8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c8c0 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
1c8d0 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20  */.  proxyLock, 
1c8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c8f0 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
1c900 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c  /.  proxyUnlock,
1c910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c920 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
1c930 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65 63 6b 52  */.  proxyCheckR
1c940 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f  eservedLock    /
1c950 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
1c960 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
1c970 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73 20  .#endif../* nfs 
1c980 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e  lockd on OSX 10.
1c990 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65 61 72  3+ doesn't clear
1c9a0 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 77 68 65   write locks whe
1c9b0 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73  n a read lock is
1c9c0 20 73 65 74 20 2a 2f 0a 23 69 66 20 64 65 66 69   set */.#if defi
1c9d0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
1c9e0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
1c9f0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f  LOCKING_STYLE.IO
1ca00 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66 73 49 6f  METHODS(.  nfsIo
1ca10 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
1ca20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
1ca30 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
1ca40 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f 64 73 2c  .  nfsIoMethods,
1ca50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ca60 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1ca70 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
1ca80 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20  */.  unixClose, 
1ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1caa0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
1cab0 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20   */.  unixLock, 
1cac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cad0 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
1cae0 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c   */.  nfsUnlock,
1caf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb00 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
1cb10 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63  od */.  unixChec
1cb20 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
1cb30 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
1cb40 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
1cb50 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  */.).#endif..#if
1cb60 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1cb70 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
1cb80 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1cb90 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22  LE./* .** This "
1cba0 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e  finder" function
1cbb0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74   attempts to det
1cbc0 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20  ermine the best 
1cbd0 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79  locking strategy
1cbe0 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74   .** for the dat
1cbf0 61 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65  abase file "file
1cc00 50 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20  Path".  It then 
1cc10 72 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69  returns the sqli
1cc20 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a  te3_io_methods.*
1cc30 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d  * object that im
1cc40 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74  plements that st
1cc50 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rategy..**.** Th
1cc60 69 73 20 69 73 20 66 6f 72 20 4d 61 63 4f 53 58  is is for MacOSX
1cc70 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63   only..*/.static
1cc80 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
1cc90 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c  o_methods *autol
1cca0 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28  ockIoFinderImpl(
1ccb0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  .  const char *f
1ccc0 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e  ilePath,    /* n
1ccd0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
1cce0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  ase file */.  un
1ccf0 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20  ixFile *pNew    
1cd00 20 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e 20 66         /* open f
1cd10 69 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74  ile object for t
1cd20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1cd30 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20   */.){.  static 
1cd40 63 6f 6e 73 74 20 73 74 72 75 63 74 20 4d 61 70  const struct Map
1cd50 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ping {.    const
1cd60 20 63 68 61 72 20 2a 7a 46 69 6c 65 73 79 73 74   char *zFilesyst
1cd70 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
1cd80 20 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d 20 74   /* Filesystem t
1cd90 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ype name */.    
1cda0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
1cdb0 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f  _methods *pMetho
1cdc0 64 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70 72  ds;   /* Appropr
1cdd0 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  iate locking met
1cde0 68 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b  hod */.  } aMap[
1cdf0 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66 73  ] = {.    { "hfs
1ce00 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65  ",    &posixIoMe
1ce10 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22  thods },.    { "
1ce20 75 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49  ufs",    &posixI
1ce30 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
1ce40 7b 20 22 61 66 70 66 73 22 2c 20 20 26 61 66 70  { "afpfs",  &afp
1ce50 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
1ce60 20 7b 20 22 73 6d 62 66 73 22 2c 20 20 26 61 66   { "smbfs",  &af
1ce70 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  pIoMethods },.  
1ce80 20 20 7b 20 22 77 65 62 64 61 76 22 2c 20 26 6e    { "webdav", &n
1ce90 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d  olockIoMethods }
1cea0 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20  ,.    { 0, 0 }. 
1ceb0 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73   };.  int i;.  s
1cec0 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49  truct statfs fsI
1ced0 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  nfo;.  struct fl
1cee0 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20  ock lockInfo;.. 
1cef0 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20 29   if( !filePath )
1cf00 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65  {.    /* If file
1cf10 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Path==NULL that 
1cf20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61  means we are dea
1cf30 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e  ling with a tran
1cf40 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a  sient file.    *
1cf50 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  * that does not 
1cf60 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65  need to be locke
1cf70 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  d. */.    return
1cf80 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
1cf90 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61  s;.  }.  if( sta
1cfa0 74 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26 66  tfs(filePath, &f
1cfb0 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a  sInfo) != -1 ){.
1cfc0 20 20 20 20 69 66 28 20 66 73 49 6e 66 6f 2e 66      if( fsInfo.f
1cfd0 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f  _flags & MNT_RDO
1cfe0 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 72 65 74  NLY ){.      ret
1cff0 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  urn &nolockIoMet
1d000 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  hods;.    }.    
1d010 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d  for(i=0; aMap[i]
1d020 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b  .zFilesystem; i+
1d030 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
1d040 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73  rcmp(fsInfo.f_fs
1d050 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69  typename, aMap[i
1d060 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d  ].zFilesystem)==
1d070 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
1d080 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74  urn aMap[i].pMet
1d090 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20  hods;.      }.  
1d0a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65    }.  }..  /* De
1d0b0 66 61 75 6c 74 20 63 61 73 65 2e 20 48 61 6e 64  fault case. Hand
1d0c0 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68  les, amongst oth
1d0d0 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a  ers, "nfs"..  **
1d0e0 20 54 65 73 74 20 62 79 74 65 2d 72 61 6e 67 65   Test byte-range
1d0f0 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e 74   lock using fcnt
1d100 6c 28 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  l(). If the call
1d110 20 73 75 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a   succeeds, .  **
1d120 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
1d130 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70   file-system sup
1d140 70 6f 72 74 73 20 50 4f 53 49 58 20 73 74 79 6c  ports POSIX styl
1d150 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20  e locks. .  */. 
1d160 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20   lockInfo.l_len 
1d170 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 1;.  lockInfo.
1d180 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c  l_start = 0;.  l
1d190 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65  ockInfo.l_whence
1d1a0 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c   = SEEK_SET;.  l
1d1b0 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d  ockInfo.l_type =
1d1c0 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20   F_RDLCK;.  if( 
1d1d0 66 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46  fcntl(pNew->h, F
1d1e0 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66  _GETLK, &lockInf
1d1f0 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69  o)!=-1 ) {.    i
1d200 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  f( strcmp(fsInfo
1d210 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22  .f_fstypename, "
1d220 6e 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nfs")==0 ){.    
1d230 20 20 72 65 74 75 72 6e 20 26 6e 66 73 49 6f 4d    return &nfsIoM
1d240 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 20 65 6c  ethods;.    } el
1d250 73 65 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  se {.      retur
1d260 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  n &posixIoMethod
1d270 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  s;.    }.  }else
1d280 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 64 6f  {.    return &do
1d290 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  tlockIoMethods;.
1d2a0 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e    }.}.static con
1d2b0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
1d2c0 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73  thods .  *(*cons
1d2d0 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  t autolockIoFind
1d2e0 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  er)(const char*,
1d2f0 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75 74  unixFile*) = aut
1d300 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70  olockIoFinderImp
1d310 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  l;..#endif /* de
1d320 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1d330 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
1d340 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
1d350 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  */..#if OS_VXWOR
1d360 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  KS && SQLITE_ENA
1d370 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1d380 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66  E./* .** This "f
1d390 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20  inder" function 
1d3a0 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65  attempts to dete
1d3b0 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c  rmine the best l
1d3c0 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20  ocking strategy 
1d3d0 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61  .** for the data
1d3e0 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50  base file "fileP
1d3f0 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72  ath".  It then r
1d400 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74  eturns the sqlit
1d410 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a  e3_io_methods.**
1d420 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70   object that imp
1d430 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72  lements that str
1d440 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ategy..**.** Thi
1d450 73 20 69 73 20 66 6f 72 20 56 58 57 6f 72 6b 73  s is for VXWorks
1d460 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63   only..*/.static
1d470 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
1d480 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c  o_methods *autol
1d490 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28  ockIoFinderImpl(
1d4a0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  .  const char *f
1d4b0 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e  ilePath,    /* n
1d4c0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
1d4d0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  ase file */.  un
1d4e0 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20  ixFile *pNew    
1d4f0 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 6f 70         /* the op
1d500 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 2a  en file object *
1d510 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c  /.){.  struct fl
1d520 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20  ock lockInfo;.. 
1d530 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20 29   if( !filePath )
1d540 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65  {.    /* If file
1d550 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Path==NULL that 
1d560 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61  means we are dea
1d570 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e  ling with a tran
1d580 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a  sient file.    *
1d590 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  * that does not 
1d5a0 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65  need to be locke
1d5b0 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  d. */.    return
1d5c0 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
1d5d0 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73  s;.  }..  /* Tes
1d5e0 74 20 69 66 20 66 63 6e 74 6c 28 29 20 69 73 20  t if fcntl() is 
1d5f0 73 75 70 70 6f 72 74 65 64 20 61 6e 64 20 75 73  supported and us
1d600 65 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f  e POSIX style lo
1d610 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77  cks..  ** Otherw
1d620 69 73 65 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ise fall back to
1d630 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70   the named semap
1d640 68 6f 72 65 20 6d 65 74 68 6f 64 2e 0a 20 20 2a  hore method..  *
1d650 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c  /.  lockInfo.l_l
1d660 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e  en = 1;.  lockIn
1d670 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a  fo.l_start = 0;.
1d680 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65    lockInfo.l_whe
1d690 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
1d6a0 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70    lockInfo.l_typ
1d6b0 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69  e = F_RDLCK;.  i
1d6c0 66 28 20 66 63 6e 74 6c 28 70 4e 65 77 2d 3e 68  f( fcntl(pNew->h
1d6d0 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_GETLK, &lock
1d6e0 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20  Info)!=-1 ) {.  
1d6f0 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49    return &posixI
1d700 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73  oMethods;.  }els
1d710 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 73  e{.    return &s
1d720 65 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  emIoMethods;.  }
1d730 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .}.static const 
1d740 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1d750 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61  ds .  *(*const a
1d760 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29  utolockIoFinder)
1d770 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69  (const char*,uni
1d780 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f  xFile*) = autolo
1d790 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a  ckIoFinderImpl;.
1d7a0 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
1d7b0 57 4f 52 4b 53 20 26 26 20 53 51 4c 49 54 45 5f  WORKS && SQLITE_
1d7c0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1d7d0 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  TYLE */../*.** A
1d7e0 6e 20 61 62 73 74 72 61 63 74 20 74 79 70 65 20  n abstract type 
1d7f0 66 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  for a pointer to
1d800 20 61 20 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e   a IO method fin
1d810 64 65 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f  der function:.*/
1d820 0a 74 79 70 65 64 65 66 20 63 6f 6e 73 74 20 73  .typedef const s
1d830 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1d840 73 20 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70 65  s *(*finder_type
1d850 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
1d860 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a  ixFile*);.../***
1d870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d8a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d8b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
1d8c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d8d0 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  ****** sqlite3_v
1d8e0 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  fs methods *****
1d8f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d900 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
1d910 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
1d920 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ains the impleme
1d930 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f  ntation of metho
1d940 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c  ds on the.** sql
1d950 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e  ite3_vfs object.
1d960 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  .*/../*.** Initi
1d970 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e  alize the conten
1d980 74 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69  ts of the unixFi
1d990 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  le structure poi
1d9a0 6e 74 65 64 20 74 6f 20 62 79 20 70 49 64 2e 0a  nted to by pId..
1d9b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
1d9c0 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20  llInUnixFile(.  
1d9d0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1d9e0 73 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  s,      /* Point
1d9f0 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74  er to vfs object
1da00 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20   */.  int h,    
1da10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1da20 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   Open file descr
1da30 69 70 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65  iptor of file be
1da40 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  ing opened */.  
1da50 69 6e 74 20 64 69 72 66 64 2c 20 20 20 20 20 20  int dirfd,      
1da60 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63          /* Direc
1da70 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  tory file descri
1da80 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ptor */.  sqlite
1da90 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20  3_file *pId,    
1daa0 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68    /* Write to th
1dab0 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
1dac0 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
1dad0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1dae0 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
1daf0 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67  f the file being
1db00 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74   opened */.  int
1db10 20 6e 6f 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20   noLock,        
1db20 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 6c 6f 63       /* Omit loc
1db30 6b 69 6e 67 20 69 66 20 74 72 75 65 20 2a 2f 0a  king if true */.
1db40 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20    int isDelete  
1db50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c            /* Del
1db60 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20  ete on close if 
1db70 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  true */.){.  con
1db80 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
1db90 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53  thods *pLockingS
1dba0 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65  tyle;.  unixFile
1dbb0 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69   *pNew = (unixFi
1dbc0 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20  le *)pId;.  int 
1dbd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1dbe0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
1dbf0 3e 70 4c 6f 63 6b 3d 3d 4e 55 4c 4c 20 29 3b 0a  >pLock==NULL );.
1dc00 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
1dc10 70 4f 70 65 6e 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a  pOpen==NULL );..
1dc20 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 69    /* Parameter i
1dc30 73 44 65 6c 65 74 65 20 69 73 20 6f 6e 6c 79 20  sDelete is only 
1dc40 75 73 65 64 20 6f 6e 20 76 78 77 6f 72 6b 73 2e  used on vxworks.
1dc50 20 45 78 70 72 65 73 73 20 74 68 69 73 20 65 78   Express this ex
1dc60 70 6c 69 63 69 74 6c 79 20 0a 20 20 2a 2a 20 68  plicitly .  ** h
1dc70 65 72 65 20 74 6f 20 70 72 65 76 65 6e 74 20 63  ere to prevent c
1dc80 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73  ompiler warnings
1dc90 20 61 62 6f 75 74 20 75 6e 75 73 65 64 20 70 61   about unused pa
1dca0 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20  rameters..  */. 
1dcb0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1dcc0 52 28 69 73 44 65 6c 65 74 65 29 3b 0a 0a 20 20  R(isDelete);..  
1dcd0 4f 53 54 52 41 43 45 33 28 22 4f 50 45 4e 20 20  OSTRACE3("OPEN  
1dce0 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c    %-3d %s\n", h,
1dcf0 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 20 20 20 20   zFilename);    
1dd00 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a  .  pNew->h = h;.
1dd10 20 20 70 4e 65 77 2d 3e 64 69 72 66 64 20 3d 20    pNew->dirfd = 
1dd20 64 69 72 66 64 3b 0a 20 20 53 45 54 5f 54 48 52  dirfd;.  SET_THR
1dd30 45 41 44 49 44 28 70 4e 65 77 29 3b 0a 20 20 70  EADID(pNew);.  p
1dd40 4e 65 77 2d 3e 66 69 6c 65 46 6c 61 67 73 20 3d  New->fileFlags =
1dd50 20 30 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f   0;..#if OS_VXWO
1dd60 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20  RKS.  pNew->pId 
1dd70 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c  = vxworksFindFil
1dd80 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  eId(zFilename);.
1dd90 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d    if( pNew->pId=
1dda0 3d 30 20 29 7b 0a 20 20 20 20 6e 6f 4c 6f 63 6b  =0 ){.    noLock
1ddb0 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53   = 1;.    rc = S
1ddc0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
1ddd0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e  .#endif..  if( n
1dde0 6f 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  oLock ){.    pLo
1ddf0 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f  ckingStyle = &no
1de00 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
1de10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63   }else{.    pLoc
1de20 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28  kingStyle = (**(
1de30 66 69 6e 64 65 72 5f 74 79 70 65 2a 29 70 56 66  finder_type*)pVf
1de40 73 2d 3e 70 41 70 70 44 61 74 61 29 28 7a 46 69  s->pAppData)(zFi
1de50 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23  lename, pNew);.#
1de60 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
1de70 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
1de80 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c     /* Cache zFil
1de90 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63  ename in the loc
1dea0 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28 41 46  king context (AF
1deb0 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76  P and dotlock ov
1dec0 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20 20 20  erride) for.    
1ded0 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74  ** proxyLock act
1dee0 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69  ivation is possi
1def0 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72 6f 78  ble (remote prox
1df00 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20 64 62  y is based on db
1df10 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46   name).    ** zF
1df20 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20  ilename remains 
1df30 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c 65  valid until file
1df40 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73   is closed, to s
1df50 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e  upport */.    pN
1df60 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
1df70 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c  xt = (void*)zFil
1df80 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20  ename;.#endif.  
1df90 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e  }..  if( pLockin
1dfa0 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78  gStyle == &posix
1dfb0 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20 64 65  IoMethods.#if de
1dfc0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1dfd0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
1dfe0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
1dff0 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53      || pLockingS
1e000 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65  tyle == &nfsIoMe
1e010 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20 29  thods.#endif.  )
1e020 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  {.    unixEnterM
1e030 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d  utex();.    rc =
1e040 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70 4e   findLockInfo(pN
1e050 65 77 2c 20 26 70 4e 65 77 2d 3e 70 4c 6f 63 6b  ew, &pNew->pLock
1e060 2c 20 26 70 4e 65 77 2d 3e 70 4f 70 65 6e 29 3b  , &pNew->pOpen);
1e070 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1e080 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e090 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
1e0a0 63 63 75 72 65 64 20 69 6e 20 66 69 6e 64 4c 6f  ccured in findLo
1e0b0 63 6b 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20  ckInfo(), close 
1e0c0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
1e0d0 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d  tor.      ** imm
1e0e0 65 64 69 61 74 65 6c 79 2c 20 62 65 66 6f 72 65  ediately, before
1e0f0 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 6d   releasing the m
1e100 75 74 65 78 2e 20 66 69 6e 64 4c 6f 63 6b 49 6e  utex. findLockIn
1e110 66 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a 20 20  fo() may fail.  
1e120 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63      ** in two sc
1e130 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a  enarios:.      *
1e140 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 61 29  *.      **   (a)
1e150 20 41 20 63 61 6c 6c 20 74 6f 20 66 73 74 61 74   A call to fstat
1e160 28 29 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20  () failed..     
1e170 20 2a 2a 20 20 20 28 62 29 20 41 20 6d 61 6c 6c   **   (b) A mall
1e180 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20  oc failed..     
1e190 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63 65   **.      ** Sce
1e1a0 6e 61 72 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e  nario (b) may on
1e1b0 6c 79 20 6f 63 63 75 72 20 69 66 20 74 68 65 20  ly occur if the 
1e1c0 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
1e1d0 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20  ng no other.    
1e1e0 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69    ** file descri
1e1f0 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  ptors open on th
1e200 65 20 73 61 6d 65 20 66 69 6c 65 2e 20 49 66 20  e same file. If 
1e210 74 68 65 72 65 20 77 65 72 65 20 6f 74 68 65 72  there were other
1e220 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64   file.      ** d
1e230 65 73 63 72 69 70 74 6f 72 73 20 6f 6e 20 74 68  escriptors on th
1e240 69 73 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f  is file, then no
1e250 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65   malloc would be
1e260 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20   required by.   
1e270 20 20 20 2a 2a 20 66 69 6e 64 4c 6f 63 6b 49 6e     ** findLockIn
1e280 66 6f 28 29 2e 20 49 66 20 74 68 69 73 20 69 73  fo(). If this is
1e290 20 74 68 65 20 63 61 73 65 2c 20 69 74 20 69 73   the case, it is
1e2a0 20 71 75 69 74 65 20 73 61 66 65 20 74 6f 20 63   quite safe to c
1e2b0 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61  lose.      ** ha
1e2c0 6e 64 6c 65 20 68 20 2d 20 61 73 20 69 74 20 69  ndle h - as it i
1e2d0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
1e2e0 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73  t no posix locks
1e2f0 20 77 69 6c 6c 20 62 65 20 72 65 6c 65 61 73 65   will be release
1e300 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 64 6f  d.      ** by do
1e310 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a  ing so..      **
1e320 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73 63 65  .      ** If sce
1e330 6e 61 72 69 6f 20 28 61 29 20 63 61 75 73 65 64  nario (a) caused
1e340 20 74 68 65 20 65 72 72 6f 72 20 74 68 65 6e 20   the error then 
1e350 74 68 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 73  things are not s
1e360 6f 20 73 61 66 65 2e 20 54 68 65 0a 20 20 20 20  o safe. The.    
1e370 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61 73    ** implicit as
1e380 73 75 6d 70 74 69 6f 6e 20 68 65 72 65 20 69 73  sumption here is
1e390 20 74 68 61 74 20 69 66 20 66 73 74 61 74 28 29   that if fstat()
1e3a0 20 66 61 69 6c 73 2c 20 74 68 69 6e 67 73 20 61   fails, things a
1e3b0 72 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73  re in.      ** s
1e3c0 75 63 68 20 62 61 64 20 73 68 61 70 65 20 74 68  uch bad shape th
1e3d0 61 74 20 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f  at dropping a lo
1e3e0 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27  ck or two doesn'
1e3f0 74 20 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a 20  t matter much.. 
1e400 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6c       */.      cl
1e410 6f 73 65 28 68 29 3b 0a 20 20 20 20 20 20 68 20  ose(h);.      h 
1e420 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
1e430 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
1e440 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54  ;.  }..#if SQLIT
1e450 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1e460 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
1e470 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 65  d(__APPLE__).  e
1e480 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  lse if( pLocking
1e490 53 74 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f 4d  Style == &afpIoM
1e4a0 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
1e4b0 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65   AFP locking use
1e4c0 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20  s the file path 
1e4d0 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  so it needs to b
1e4e0 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20  e included in.  
1e4f0 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b    ** the afpLock
1e500 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20  ingContext..    
1e510 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e  */.    afpLockin
1e520 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a  gContext *pCtx;.
1e530 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
1e540 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 20  gContext = pCtx 
1e550 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
1e560 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20  ( sizeof(*pCtx) 
1e570 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 3d  );.    if( pCtx=
1e580 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
1e590 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1e5a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e5b0 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65  /* NB: zFilename
1e5c0 20 65 78 69 73 74 73 20 61 6e 64 20 72 65 6d 61   exists and rema
1e5d0 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20  ins valid until 
1e5e0 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  the file is clos
1e5f0 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 63 63 6f  ed.      ** acco
1e600 72 64 69 6e 67 20 74 6f 20 72 65 71 75 69 72 65  rding to require
1e610 6d 65 6e 74 20 46 31 31 31 34 31 2e 20 20 53 6f  ment F11141.  So
1e620 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20   we do not need 
1e630 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20 20 20  to make a.      
1e640 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66  ** copy of the f
1e650 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20  ilename. */.    
1e660 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d    pCtx->dbPath =
1e670 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20   zFilename;.    
1e680 20 20 70 43 74 78 2d 3e 72 65 73 65 72 76 65 64    pCtx->reserved
1e690 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 72 61 6e   = 0;.      sran
1e6a0 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20 20 20  domdev();.      
1e6b0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
1e6c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69 6e  ;.      rc = fin
1e6d0 64 4c 6f 63 6b 49 6e 66 6f 28 70 4e 65 77 2c 20  dLockInfo(pNew, 
1e6e0 26 70 4e 65 77 2d 3e 70 4c 6f 63 6b 2c 20 26 70  &pNew->pLock, &p
1e6f0 4e 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20  New->pOpen);.   
1e700 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1e710 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1e720 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
1e730 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
1e740 74 29 3b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73  t);.        clos
1e750 65 28 68 29 3b 0a 20 20 20 20 20 20 20 20 68 20  e(h);.        h 
1e760 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
1e770 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
1e780 65 78 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20  ex();        .  
1e790 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1e7a0 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b    else if( pLock
1e7b0 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74  ingStyle == &dot
1e7c0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b  lockIoMethods ){
1e7d0 0a 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20  .    /* Dotfile 
1e7e0 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65  locking uses the
1e7f0 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74   file path so it
1e800 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63   needs to be inc
1e810 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20  luded in.    ** 
1e820 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69  the dotlockLocki
1e830 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a  ngContext .    *
1e840 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63  /.    char *zLoc
1e850 6b 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e  kFile;.    int n
1e860 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 6e 46  Filename;.    nF
1e870 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73  ilename = (int)s
1e880 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29  trlen(zFilename)
1e890 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46   + 6;.    zLockF
1e8a0 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ile = (char *)sq
1e8b0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69  lite3_malloc(nFi
1e8c0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  lename);.    if(
1e8d0 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b   zLockFile==0 ){
1e8e0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1e8f0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
1e900 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
1e910 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c  e3_snprintf(nFil
1e920 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65  ename, zLockFile
1e930 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53  , "%s" DOTLOCK_S
1e940 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65  UFFIX, zFilename
1e950 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  );.    }.    pNe
1e960 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
1e970 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20  t = zLockFile;. 
1e980 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   }..#if OS_VXWOR
1e990 4b 53 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c  KS.  else if( pL
1e9a0 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
1e9b0 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  semIoMethods ){.
1e9c0 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d      /* Named sem
1e9d0 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75  aphore locking u
1e9e0 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
1e9f0 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
1ea00 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75   be.    ** inclu
1ea10 64 65 64 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f  ded in the semLo
1ea20 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20  ckingContext.   
1ea30 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74 65   */.    unixEnte
1ea40 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63  rMutex();.    rc
1ea50 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28   = findLockInfo(
1ea60 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 4c 6f  pNew, &pNew->pLo
1ea70 63 6b 2c 20 26 70 4e 65 77 2d 3e 70 4f 70 65 6e  ck, &pNew->pOpen
1ea80 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d  );.    if( (rc==
1ea90 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70  SQLITE_OK) && (p
1eaa0 4e 65 77 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d  New->pOpen->pSem
1eab0 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20  ==NULL) ){.     
1eac0 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20   char *zSemName 
1ead0 3d 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 2d 3e 61  = pNew->pOpen->a
1eae0 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69  SemName;.      i
1eaf0 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt n;.      sqli
1eb00 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58  te3_snprintf(MAX
1eb10 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e  _PATHNAME, zSemN
1eb20 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0a  ame, "/%s.sem",.
1eb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb40 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 64         pNew->pId
1eb50 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
1eb60 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 6e 3d  );.      for( n=
1eb70 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20  1; zSemName[n]; 
1eb80 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20 69 66  n++ ).        if
1eb90 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27  ( zSemName[n]=='
1eba0 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d  /' ) zSemName[n]
1ebb0 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e   = '_';.      pN
1ebc0 65 77 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 20  ew->pOpen->pSem 
1ebd0 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e  = sem_open(zSemN
1ebe0 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36  ame, O_CREAT, 06
1ebf0 36 36 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  66, 1);.      if
1ec00 28 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 2d 3e 70  ( pNew->pOpen->p
1ec10 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45  Sem == SEM_FAILE
1ec20 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  D ){.        rc 
1ec30 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1ec40 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f          pNew->pO
1ec50 70 65 6e 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d  pen->aSemName[0]
1ec60 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d   = '\0';.      }
1ec70 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c  .    }.    unixL
1ec80 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
1ec90 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 70 4e 65  .#endif.  .  pNe
1eca0 77 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  w->lastErrno = 0
1ecb0 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ;.#if OS_VXWORKS
1ecc0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1ecd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
1ece0 68 3e 3d 30 20 29 20 63 6c 6f 73 65 28 68 29 3b  h>=0 ) close(h);
1ecf0 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20  .    h = -1;.   
1ed00 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d   unlink(zFilenam
1ed10 65 29 3b 0a 20 20 20 20 69 73 44 65 6c 65 74 65  e);.    isDelete
1ed20 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77   = 0;.  }.  pNew
1ed30 2d 3e 69 73 44 65 6c 65 74 65 20 3d 20 69 73 44  ->isDelete = isD
1ed40 65 6c 65 74 65 3b 0a 23 65 6e 64 69 66 0a 20 20  elete;.#endif.  
1ed50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ed60 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 64 69 72  K ){.    if( dir
1ed70 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 64 69  fd>=0 ) close(di
1ed80 72 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 20  rfd); /* silent 
1ed90 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20 61 6c  leak if fail, al
1eda0 72 65 61 64 79 20 69 6e 20 65 72 72 6f 72 20 2a  ready in error *
1edb0 2f 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29  /.    if( h>=0 )
1edc0 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20 7d 65 6c   close(h);.  }el
1edd0 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d  se{.    pNew->pM
1ede0 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67  ethod = pLocking
1edf0 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43  Style;.    OpenC
1ee00 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 7d 0a  ounter(+1);.  }.
1ee10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ee20 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c  /*.** Open a fil
1ee30 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
1ee40 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f  the directory co
1ee50 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46  ntaining file zF
1ee60 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73  ilename..** If s
1ee70 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 46 64 20  uccessful, *pFd 
1ee80 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 70  is set to the op
1ee90 65 6e 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  ened file descri
1eea0 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  ptor and.** SQLI
1eeb0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1eec0 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  d. If an error o
1eed0 63 63 75 72 73 2c 20 65 69 74 68 65 72 20 53 51  ccurs, either SQ
1eee0 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72  LITE_NOMEM.** or
1eef0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
1ef00 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1ef10 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20   *pFd is set to 
1ef20 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20  an undefined.** 
1ef30 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  value..**.** If 
1ef40 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1ef50 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65  urned, the calle
1ef60 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
1ef70 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20   for closing.** 
1ef80 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
1ef90 74 6f 72 20 2a 70 46 64 20 75 73 69 6e 67 20 63  tor *pFd using c
1efa0 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lose()..*/.stati
1efb0 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74  c int openDirect
1efc0 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ory(const char *
1efd0 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a  zFilename, int *
1efe0 70 46 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a  pFd){.  int ii;.
1eff0 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20    int fd = -1;. 
1f000 20 63 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d   char zDirname[M
1f010 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a  AX_PATHNAME+1];.
1f020 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
1f030 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ntf(MAX_PATHNAME
1f040 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73 22  , zDirname, "%s"
1f050 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
1f060 66 6f 72 28 69 69 3d 28 69 6e 74 29 73 74 72 6c  for(ii=(int)strl
1f070 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69  en(zDirname); ii
1f080 3e 31 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69  >1 && zDirname[i
1f090 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a  i]!='/'; ii--);.
1f0a0 20 20 69 66 28 20 69 69 3e 30 20 29 7b 0a 20 20    if( ii>0 ){.  
1f0b0 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d    zDirname[ii] =
1f0c0 20 27 5c 30 27 3b 0a 20 20 20 20 66 64 20 3d 20   '\0';.    fd = 
1f0d0 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f  open(zDirname, O
1f0e0 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59  _RDONLY|O_BINARY
1f0f0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64  , 0);.    if( fd
1f100 3e 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 46 44  >=0 ){.#ifdef FD
1f110 5f 43 4c 4f 45 58 45 43 0a 20 20 20 20 20 20 66  _CLOEXEC.      f
1f120 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44  cntl(fd, F_SETFD
1f130 2c 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45  , fcntl(fd, F_GE
1f140 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f  TFD, 0) | FD_CLO
1f150 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20  EXEC);.#endif.  
1f160 20 20 20 20 4f 53 54 52 41 43 45 33 28 22 4f 50      OSTRACE3("OP
1f170 45 4e 44 49 52 20 25 2d 33 64 20 25 73 5c 6e 22  ENDIR %-3d %s\n"
1f180 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 3b  , fd, zDirname);
1f190 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46  .    }.  }.  *pF
1f1a0 64 20 3d 20 66 64 3b 0a 20 20 72 65 74 75 72 6e  d = fd;.  return
1f1b0 20 28 66 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f   (fd>=0?SQLITE_O
1f1c0 4b 3a 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  K:SQLITE_CANTOPE
1f1d0 4e 5f 42 4b 50 54 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  N_BKPT);.}../*.*
1f1e0 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f  * Create a tempo
1f1f0 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69  rary file name i
1f200 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75  n zBuf.  zBuf mu
1f210 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a  st be allocated.
1f220 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ** by the callin
1f230 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75  g process and mu
1f240 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68  st be big enough
1f250 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73   to hold at leas
1f260 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74  t.** pVfs->mxPat
1f270 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a  hname bytes..*/.
1f280 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 54 65  static int getTe
1f290 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c  mpname(int nBuf,
1f2a0 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
1f2b0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
1f2c0 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a  r *azDirs[] = {.
1f2d0 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a       0,.     0,.
1f2e0 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c       "/var/tmp",
1f2f0 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22  .     "/usr/tmp"
1f300 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20  ,.     "/tmp",. 
1f310 20 20 20 20 22 2e 22 2c 0a 20 20 7d 3b 0a 20 20      ".",.  };.  
1f320 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
1f330 69 67 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72  igned char zChar
1f340 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65  s[] =.    "abcde
1f350 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
1f360 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44  vwxyz".    "ABCD
1f370 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
1f380 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32  UVWXYZ".    "012
1f390 33 34 35 36 37 38 39 22 3b 0a 20 20 75 6e 73 69  3456789";.  unsi
1f3a0 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  gned int i, j;. 
1f3b0 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
1f3c0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1f3d0 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a 20 20 2f  zDir = ".";..  /
1f3e0 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
1f3f0 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
1f400 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
1f410 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
1f420 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
1f430 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
1f440 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
1f450 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
1f460 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
1f470 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
1f480 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
1f490 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
1f4a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a  SQLITE_IOERR );.
1f4b0 0a 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73  .  azDirs[0] = s
1f4c0 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
1f4d0 63 74 6f 72 79 3b 0a 20 20 69 66 20 28 4e 55 4c  ctory;.  if (NUL
1f4e0 4c 20 3d 3d 20 61 7a 44 69 72 73 5b 31 5d 29 20  L == azDirs[1]) 
1f4f0 7b 0a 20 20 20 20 61 7a 44 69 72 73 5b 31 5d 20  {.    azDirs[1] 
1f500 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52  = getenv("TMPDIR
1f510 22 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 66 6f 72  ");.  }.  .  for
1f520 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
1f530 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a  zDirs)/sizeof(az
1f540 44 69 72 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  Dirs[0]); i++){.
1f550 20 20 20 20 69 66 28 20 61 7a 44 69 72 73 5b 69      if( azDirs[i
1f560 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
1f570 0a 20 20 20 20 69 66 28 20 73 74 61 74 28 61 7a  .    if( stat(az
1f580 44 69 72 73 5b 69 5d 2c 20 26 62 75 66 29 20 29  Dirs[i], &buf) )
1f590 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
1f5a0 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e  f( !S_ISDIR(buf.
1f5b0 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69  st_mode) ) conti
1f5c0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 61 63 63  nue;.    if( acc
1f5d0 65 73 73 28 61 7a 44 69 72 73 5b 69 5d 2c 20 30  ess(azDirs[i], 0
1f5e0 37 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  7) ) continue;. 
1f5f0 20 20 20 7a 44 69 72 20 3d 20 61 7a 44 69 72 73     zDir = azDirs
1f600 5b 69 5d 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  [i];.    break;.
1f610 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
1f620 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20  that the output 
1f630 62 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20  buffer is large 
1f640 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74  enough for the t
1f650 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20  emporary file . 
1f660 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20   ** name. If it 
1f670 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53  is not, return S
1f680 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a  QLITE_ERROR..  *
1f690 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65 6e 28  /.  if( (strlen(
1f6a0 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e 28 53  zDir) + strlen(S
1f6b0 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
1f6c0 50 52 45 46 49 58 29 20 2b 20 31 37 29 20 3e 3d  PREFIX) + 17) >=
1f6d0 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 7b   (size_t)nBuf ){
1f6e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1f6f0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
1f700 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33   do{.    sqlite3
1f710 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31  _snprintf(nBuf-1
1f720 37 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51  7, zBuf, "%s/"SQ
1f730 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
1f740 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20  REFIX, zDir);.  
1f750 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c 65    j = (int)strle
1f760 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c  n(zBuf);.    sql
1f770 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
1f780 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20  15, &zBuf[j]);. 
1f790 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35     for(i=0; i<15
1f7a0 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
1f7b0 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68     zBuf[j] = (ch
1f7c0 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73  ar)zChars[ ((uns
1f7d0 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b  igned char)zBuf[
1f7e0 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61  j])%(sizeof(zCha
1f7f0 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a  rs)-1) ];.    }.
1f800 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b      zBuf[j] = 0;
1f810 0a 20 20 7d 77 68 69 6c 65 28 20 61 63 63 65 73  .  }while( acces
1f820 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a  s(zBuf,0)==0 );.
1f830 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f840 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  OK;.}..#if SQLIT
1f850 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1f860 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
1f870 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a  d(__APPLE__)./*.
1f880 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72  ** Routine to tr
1f890 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69  ansform a unixFi
1f8a0 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d  le into a proxy-
1f8b0 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65  locking unixFile
1f8c0 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  ..** Implementat
1f8d0 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79  ion in the proxy
1f8e0 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20  -lock division, 
1f8f0 62 75 74 20 75 73 65 64 20 62 79 20 75 6e 69 78  but used by unix
1f900 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c  Open().** if SQL
1f910 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
1f920 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69  _LOCKING is defi
1f930 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
1f940 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72  nt proxyTransfor
1f950 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69  mUnixFile(unixFi
1f960 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  le*, const char*
1f970 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  );.#endif../*.**
1f980 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75   Search for an u
1f990 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
1f9a0 69 70 74 6f 72 20 74 68 61 74 20 77 61 73 20 6f  iptor that was o
1f9b0 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74  pened on the dat
1f9c0 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28  abase .** file (
1f9d0 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72  not a journal or
1f9e0 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
1f9f0 66 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65 64  file) identified
1fa00 20 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20   by pathname.** 
1fa10 7a 50 61 74 68 20 77 69 74 68 20 53 51 4c 49 54  zPath with SQLIT
1fa20 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73  E_OPEN_XXX flags
1fa30 20 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65 20   matching those 
1fa40 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
1fa50 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  cond.** argument
1fa60 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1fa70 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20  n..**.** Such a 
1fa80 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1fa90 6d 61 79 20 65 78 69 73 74 20 69 66 20 61 20 64  may exist if a d
1faa0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1fab0 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a  on was closed.**
1fac0 20 62 75 74 20 74 68 65 20 61 73 73 6f 63 69 61   but the associa
1fad0 74 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  ted file descrip
1fae0 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  tor could not be
1faf0 20 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65 20   closed because 
1fb00 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69  some.** other fi
1fb10 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70  le descriptor op
1fb20 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66  en on the same f
1fb30 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  ile is holding a
1fb40 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52   file-lock..** R
1fb50 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73  efer to comments
1fb60 20 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f 73   in the unixClos
1fb70 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  e() function and
1fb80 20 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d   the lengthy com
1fb90 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62 69  ment.** describi
1fba0 6e 67 20 22 50 6f 73 69 78 20 41 64 76 69 73 6f  ng "Posix Adviso
1fbb0 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74  ry Locking" at t
1fbc0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73  he start of this
1fbd0 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75   file for .** fu
1fbe0 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20 41  rther details. A
1fbf0 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30 31  lso, ticket #401
1fc00 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75  8..**.** If a su
1fc10 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63  itable file desc
1fc20 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c  riptor is found,
1fc30 20 74 68 65 6e 20 69 74 20 69 73 20 72 65 74 75   then it is retu
1fc40 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73  rned. If no.** s
1fc50 75 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70  uch file descrip
1fc60 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c 20  tor is located, 
1fc70 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  -1 is returned..
1fc80 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55 6e  */.static UnixUn
1fc90 75 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75 73  usedFd *findReus
1fca0 61 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68 61  ableFd(const cha
1fcb0 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c  r *zPath, int fl
1fcc0 61 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73  ags){.  UnixUnus
1fcd0 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20  edFd *pUnused = 
1fce0 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  0;..  /* Do not 
1fcf0 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e  search for an un
1fd00 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
1fd10 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e  ptor on vxworks.
1fd20 20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20 2a   Not because.  *
1fd30 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20  * vxworks would 
1fd40 6e 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f 6d  not benefit from
1fd50 20 74 68 65 20 63 68 61 6e 67 65 20 28 69 74 20   the change (it 
1fd60 6d 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f 74  might, we're not
1fd70 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74   sure),.  ** but
1fd80 20 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79 20   because no way 
1fd90 74 6f 20 74 65 73 74 20 69 74 20 69 73 20 63 75  to test it is cu
1fda0 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c  rrently availabl
1fdb0 65 2e 20 49 74 20 69 73 20 62 65 74 74 65 72 20  e. It is better 
1fdc0 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73  .  ** not to ris
1fdd0 6b 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f 72  k breaking vxwor
1fde0 6b 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74  ks support for t
1fdf0 68 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68 20  he sake of such 
1fe00 61 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a  an obscure .  **
1fe10 20 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69   feature.  */.#i
1fe20 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  f !OS_VXWORKS.  
1fe30 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
1fe40 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1fe50 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20       /* Results 
1fe60 6f 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20 2a  of stat() call *
1fe70 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28 29  /..  /* A stat()
1fe80 20 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66   call may fail f
1fe90 6f 72 20 76 61 72 69 6f 75 73 20 72 65 61 73 6f  or various reaso
1fea0 6e 73 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ns. If this happ
1feb0 65 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20  ens, it is.  ** 
1fec0 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74  almost certain t
1fed0 68 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63 61  hat an open() ca
1fee0 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70  ll on the same p
1fef0 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61  ath will also fa
1ff00 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69  il..  ** For thi
1ff10 73 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20  s reason, if an 
1ff20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
1ff30 74 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c 20  the stat() call 
1ff40 68 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a  here, it is.  **
1ff50 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20   ignored and -1 
1ff60 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65  is returned. The
1ff70 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79   caller will try
1ff80 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66   to open a new f
1ff90 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70  ile.  ** descrip
1ffa0 74 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  tor on the same 
1ffb0 70 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20  path, fail, and 
1ffc0 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
1ffd0 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a  to SQLite..  **.
1ffe0 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20 73    ** Even if a s
1fff0 75 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28 29  ubsequent open()
20000 20 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63 65   call does succe
20010 65 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75 65  ed, the conseque
20020 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74  nces of.  ** not
20030 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 61   searching for a
20040 20 72 65 73 75 73 61 62 6c 65 20 66 69 6c 65 20   resusable file 
20050 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6e  descriptor are n
20060 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69  ot dire.  */.  i
20070 66 28 20 30 3d 3d 73 74 61 74 28 7a 50 61 74 68  f( 0==stat(zPath
20080 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20  , &sStat) ){.   
20090 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e   struct unixOpen
200a0 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a 0a 20 20 20  Cnt *pOpen;..   
200b0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
200c0 29 3b 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20 6f  );.    pOpen = o
200d0 70 65 6e 4c 69 73 74 3b 0a 20 20 20 20 77 68 69  penList;.    whi
200e0 6c 65 28 20 70 4f 70 65 6e 20 26 26 20 28 70 4f  le( pOpen && (pO
200f0 70 65 6e 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21  pen->fileId.dev!
20100 3d 73 53 74 61 74 2e 73 74 5f 64 65 76 0a 20 20  =sStat.st_dev.  
20110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20120 20 20 20 7c 7c 20 70 4f 70 65 6e 2d 3e 66 69 6c     || pOpen->fil
20130 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74 2e 73  eId.ino!=sStat.s
20140 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  t_ino) ){.      
20150 20 70 4f 70 65 6e 20 3d 20 70 4f 70 65 6e 2d 3e   pOpen = pOpen->
20160 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
20170 20 69 66 28 20 70 4f 70 65 6e 20 29 7b 0a 20 20   if( pOpen ){.  
20180 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64      UnixUnusedFd
20190 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20 66 6f 72   **pp;.      for
201a0 28 70 70 3d 26 70 4f 70 65 6e 2d 3e 70 55 6e 75  (pp=&pOpen->pUnu
201b0 73 65 64 3b 20 2a 70 70 20 26 26 20 28 2a 70 70  sed; *pp && (*pp
201c0 29 2d 3e 66 6c 61 67 73 21 3d 66 6c 61 67 73 3b  )->flags!=flags;
201d0 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65   pp=&((*pp)->pNe
201e0 78 74 29 29 3b 0a 20 20 20 20 20 20 70 55 6e 75  xt));.      pUnu
201f0 73 65 64 20 3d 20 2a 70 70 3b 0a 20 20 20 20 20  sed = *pp;.     
20200 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a   if( pUnused ){.
20210 20 20 20 20 20 20 20 20 2a 70 70 20 3d 20 70 55          *pp = pU
20220 6e 75 73 65 64 2d 3e 70 4e 65 78 74 3b 0a 20 20  nused->pNext;.  
20230 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
20240 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
20250 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 20 20 20  ;.  }.#endif    
20260 2f 2a 20 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b  /* if !OS_VXWORK
20270 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 55  S */.  return pU
20280 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nused;.}../*.** 
20290 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a 50  Open the file zP
202a0 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76  ath..** .** Prev
202b0 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c 69  iously, the SQLi
202c0 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65 64  te OS layer used
202d0 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73   three functions
202e0 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 69   in place of thi
202f0 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20  s.** one:.**.** 
20300 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
20310 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a  nReadWrite();.**
20320 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70       sqlite3OsOp
20330 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a  enReadOnly();.**
20340 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70       sqlite3OsOp
20350 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a  enExclusive();.*
20360 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 73  *.** These calls
20370 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74   correspond to t
20380 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
20390 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61  binations of fla
203a0 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65  gs:.**.**     Re
203b0 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20 20  adWrite() ->    
203c0 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52   (READWRITE | CR
203d0 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65 61  EATE).**     Rea
203e0 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20 20  dOnly()  ->     
203f0 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20  (READONLY) .**  
20400 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65     OpenExclusive
20410 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54 45  () -> (READWRITE
20420 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43 4c   | CREATE | EXCL
20430 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65  USIVE).**.** The
20440 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73 69   old OpenExclusi
20450 76 65 28 29 20 61 63 63 65 70 74 65 64 20 61 20  ve() accepted a 
20460 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74  boolean argument
20470 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49 66   - "delFlag". If
20480 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66 69  .** true, the fi
20490 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72 65  le was configure
204a0 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74 69  d to be automati
204b0 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68  cally deleted wh
204c0 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68  en the.** file h
204d0 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f  andle closed. To
204e0 20 61 63 68 69 65 76 65 20 74 68 65 20 73 61 6d   achieve the sam
204f0 65 20 65 66 66 65 63 74 20 75 73 69 6e 67 20 74  e effect using t
20500 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65  his new .** inte
20510 72 66 61 63 65 2c 20 61 64 64 20 74 68 65 20 44  rface, add the D
20520 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61  ELETEONCLOSE fla
20530 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69  g to those speci
20540 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20 0a  fied above for .
20550 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  ** OpenExclusive
20560 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
20570 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71  t unixOpen(.  sq
20580 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
20590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
205a0 65 20 56 46 53 20 66 6f 72 20 77 68 69 63 68 20  e VFS for which 
205b0 74 68 69 73 20 69 73 20 74 68 65 20 78 4f 70 65  this is the xOpe
205c0 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f  n method */.  co
205d0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
205e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
205f0 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  thname of file t
20600 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  o be opened */. 
20610 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
20620 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  File,         /*
20630 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   The file descri
20640 70 74 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c 65  ptor to be fille
20650 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  d in */.  int fl
20660 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
20670 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20         /* Input 
20680 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c  flags to control
20690 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a   the opening */.
206a0 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73    int *pOutFlags
206b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
206c0 2a 20 4f 75 74 70 75 74 20 66 6c 61 67 73 20 72  * Output flags r
206d0 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74  eturned to SQLit
206e0 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20 75  e core */.){.  u
206f0 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e  nixFile *p = (un
20700 69 78 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  ixFile *)pFile;.
20710 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20 20    int fd = -1;  
20720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20730 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
20740 74 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  tor returned by 
20750 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  open() */.  int 
20760 64 69 72 66 64 20 3d 20 2d 31 3b 20 20 20 20 20  dirfd = -1;     
20770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
20780 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73  rectory file des
20790 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  criptor */.  int
207a0 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20   openFlags = 0; 
207b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
207c0 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20  lags to pass to 
207d0 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  open() */.  int 
207e0 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78  eType = flags&0x
207f0 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79  FFFFFF00;  /* Ty
20800 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70  pe of file to op
20810 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f  en */.  int noLo
20820 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
20830 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
20840 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70  o omit locking p
20850 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20 69  rimitives */.  i
20860 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
20870 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  K;            /*
20880 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e   Function Return
20890 20 43 6f 64 65 20 2a 2f 0a 0a 20 20 69 6e 74 20   Code */..  int 
208a0 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28  isExclusive  = (
208b0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
208c0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a  PEN_EXCLUSIVE);.
208d0 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20    int isDelete  
208e0 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
208f0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
20900 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20  ONCLOSE);.  int 
20910 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28  isCreate     = (
20920 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
20930 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69  PEN_CREATE);.  i
20940 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20  nt isReadonly   
20950 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
20960 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
20970 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 72  ;.  int isReadWr
20980 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ite  = (flags & 
20990 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
209a0 57 52 49 54 45 29 3b 0a 23 69 66 20 53 51 4c 49  WRITE);.#if SQLI
209b0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
209c0 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 69 73  G_STYLE.  int is
209d0 41 75 74 6f 50 72 6f 78 79 20 20 3d 20 28 66 6c  AutoProxy  = (fl
209e0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
209f0 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a 23 65  N_AUTOPROXY);.#e
20a00 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 63 72  ndif..  /* If cr
20a10 65 61 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20  eating a master 
20a20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75  or main-file jou
20a30 72 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e 63 74  rnal, this funct
20a40 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20  ion will open.  
20a50 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73 63 72 69  ** a file-descri
20a60 70 74 6f 72 20 6f 6e 20 74 68 65 20 64 69 72 65  ptor on the dire
20a70 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20 66  ctory too. The f
20a80 69 72 73 74 20 74 69 6d 65 20 75 6e 69 78 53 79  irst time unixSy
20a90 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c  nc().  ** is cal
20aa0 6c 65 64 20 74 68 65 20 64 69 72 65 63 74 6f 72  led the director
20ab0 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
20ac0 72 20 77 69 6c 6c 20 62 65 20 66 73 79 6e 63 28  r will be fsync(
20ad0 29 65 64 20 61 6e 64 20 63 6c 6f 73 65 28 29 64  )ed and close()d
20ae0 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f  ..  */.  int isO
20af0 70 65 6e 44 69 72 65 63 74 6f 72 79 20 3d 20 28  penDirectory = (
20b00 69 73 43 72 65 61 74 65 20 26 26 20 0a 20 20 20  isCreate && .   
20b10 20 20 20 28 65 54 79 70 65 3d 3d 53 51 4c 49 54     (eType==SQLIT
20b20 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
20b30 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d  URNAL || eType==
20b40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
20b50 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 29 3b 0a 0a  _JOURNAL).  );..
20b60 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74    /* If argument
20b70 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c   zPath is a NULL
20b80 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66   pointer, this f
20b90 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69  unction is requi
20ba0 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a  red to open.  **
20bb0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
20bc0 65 2e 20 55 73 65 20 74 68 69 73 20 62 75 66 66  e. Use this buff
20bd0 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  er to store the 
20be0 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20  file name in..  
20bf0 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61  */.  char zTmpna
20c00 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  me[MAX_PATHNAME+
20c10 31 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  1];.  const char
20c20 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61 74 68 3b   *zName = zPath;
20c30 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65  ..  /* Check the
20c40 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65   following state
20c50 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20  ments are true: 
20c60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29  .  **.  **   (a)
20c70 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20   Exactly one of 
20c80 74 68 65 20 52 45 41 44 57 52 49 54 45 20 61 6e  the READWRITE an
20c90 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73  d READONLY flags
20ca0 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e   must be set, an
20cb0 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66  d .  **   (b) if
20cc0 20 43 52 45 41 54 45 20 69 73 20 73 65 74 2c 20   CREATE is set, 
20cd0 74 68 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d  then READWRITE m
20ce0 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c  ust also be set,
20cf0 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20   and.  **   (c) 
20d00 69 66 20 45 58 43 4c 55 53 49 56 45 20 69 73 20  if EXCLUSIVE is 
20d10 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45  set, then CREATE
20d20 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
20d30 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66  t..  **   (d) if
20d40 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69   DELETEONCLOSE i
20d50 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41  s set, then CREA
20d60 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
20d70 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  set..  */.  asse
20d80 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d  rt((isReadonly==
20d90 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65  0 || isReadWrite
20da0 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61 64 57  ==0) && (isReadW
20db0 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e  rite || isReadon
20dc0 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ly));.  assert(i
20dd0 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73  sCreate==0 || is
20de0 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73  ReadWrite);.  as
20df0 73 65 72 74 28 69 73 45 78 63 6c 75 73 69 76 65  sert(isExclusive
20e00 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29  ==0 || isCreate)
20e10 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44 65 6c  ;.  assert(isDel
20e20 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ete==0 || isCrea
20e30 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d  te);..  /* The m
20e40 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75  ain DB, main jou
20e50 72 6e 61 6c 2c 20 61 6e 64 20 6d 61 73 74 65 72  rnal, and master
20e60 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76   journal are nev
20e70 65 72 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  er automatically
20e80 0a 20 20 2a 2a 20 64 65 6c 65 74 65 64 2e 20 4e  .  ** deleted. N
20e90 6f 72 20 61 72 65 20 74 68 65 79 20 65 76 65 72  or are they ever
20ea0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
20eb0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
20ec0 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
20ed0 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
20ee0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
20ef0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
20f00 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
20f10 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
20f20 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
20f30 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73  JOURNAL );.  ass
20f40 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
20f50 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
20f60 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
20f70 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29  MASTER_JOURNAL )
20f80 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
20f90 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61  hat the upper la
20fa0 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20  yer has set one 
20fb0 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70  of the "file-typ
20fc0 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61  e" flags. */.  a
20fd0 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51  ssert( eType==SQ
20fe0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
20ff0 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d  B      || eType=
21000 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
21010 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20  P_DB .       || 
21020 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
21030 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
21040 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
21050 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
21060 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
21070 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
21080 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c  _SUBJOURNAL   ||
21090 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
210a0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
210b0 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
210c0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
210d0 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 0a 20 20  _TRANSIENT_DB.  
210e0 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  );..  memset(p, 
210f0 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69  0, sizeof(unixFi
21100 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20 65 54 79  le));..  if( eTy
21110 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
21120 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 55  MAIN_DB ){.    U
21130 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e  nixUnusedFd *pUn
21140 75 73 65 64 3b 0a 20 20 20 20 70 55 6e 75 73 65  used;.    pUnuse
21150 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65  d = findReusable
21160 46 64 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29  Fd(zName, flags)
21170 3b 0a 20 20 20 20 69 66 28 20 70 55 6e 75 73 65  ;.    if( pUnuse
21180 64 20 29 7b 0a 20 20 20 20 20 20 66 64 20 3d 20  d ){.      fd = 
21190 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 20  pUnused->fd;.   
211a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 55   }else{.      pU
211b0 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f  nused = sqlite3_
211c0 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  malloc(sizeof(*p
211d0 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 20 20  Unused));.      
211e0 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a  if( !pUnused ){.
211f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
21200 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
21210 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
21220 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75  ->pUnused = pUnu
21230 73 65 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  sed;.  }else if(
21240 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2f   !zName ){.    /
21250 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 4e 55  * If zName is NU
21260 4c 4c 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61  LL, the upper la
21270 79 65 72 20 69 73 20 72 65 71 75 65 73 74 69 6e  yer is requestin
21280 67 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 2a  g a temp file. *
21290 2f 0a 20 20 20 20 61 73 73 65 72 74 28 69 73 44  /.    assert(isD
212a0 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70 65 6e  elete && !isOpen
212b0 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20  Directory);.    
212c0 72 63 20 3d 20 67 65 74 54 65 6d 70 6e 61 6d 65  rc = getTempname
212d0 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 2c  (MAX_PATHNAME+1,
212e0 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20   zTmpname);.    
212f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
21300 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
21310 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
21320 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65  zName = zTmpname
21330 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65  ;.  }..  /* Dete
21340 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20  rmine the value 
21350 6f 66 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  of the flags par
21360 61 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 6f  ameter passed to
21370 20 50 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a   POSIX function.
21380 20 20 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65    ** open(). The
21390 73 65 20 6d 75 73 74 20 62 65 20 63 61 6c 63 75  se must be calcu
213a0 6c 61 74 65 64 20 65 76 65 6e 20 69 66 20 6f 70  lated even if op
213b0 65 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c  en() is not call
213c0 65 64 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65 79  ed, as.  ** they
213d0 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61   may be stored a
213e0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69  s part of the fi
213f0 6c 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 75 73  le handle and us
21400 65 64 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20  ed by the .  ** 
21410 27 63 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63  'conch file' loc
21420 6b 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c  king functions l
21430 61 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69  ater on.  */.  i
21440 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20  f( isReadonly ) 
21450 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
21460 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73  RDONLY;.  if( is
21470 52 65 61 64 57 72 69 74 65 20 29 20 6f 70 65 6e  ReadWrite ) open
21480 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b  Flags |= O_RDWR;
21490 0a 20 20 69 66 28 20 69 73 43 72 65 61 74 65 20  .  if( isCreate 
214a0 29 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c  )    openFlags |
214b0 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28  = O_CREAT;.  if(
214c0 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f   isExclusive ) o
214d0 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45  penFlags |= (O_E
214e0 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b  XCL|O_NOFOLLOW);
214f0 0a 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20  .  openFlags |= 
21500 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42  (O_LARGEFILE|O_B
21510 49 4e 41 52 59 29 3b 0a 0a 20 20 69 66 28 20 66  INARY);..  if( f
21520 64 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f  d<0 ){.    mode_
21530 74 20 6f 70 65 6e 4d 6f 64 65 20 3d 20 28 69 73  t openMode = (is
21540 44 65 6c 65 74 65 3f 30 36 30 30 3a 53 51 4c 49  Delete?0600:SQLI
21550 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
21560 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20  PERMISSIONS);.  
21570 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 4e 61 6d    fd = open(zNam
21580 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70  e, openFlags, op
21590 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 4f 53 54  enMode);.    OST
215a0 52 41 43 45 34 28 22 4f 50 45 4e 58 20 20 20 25  RACE4("OPENX   %
215b0 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66  -3d %s 0%o\n", f
215c0 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c  d, zName, openFl
215d0 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66 64  ags);.    if( fd
215e0 3c 30 20 26 26 20 65 72 72 6e 6f 21 3d 45 49 53  <0 && errno!=EIS
215f0 44 49 52 20 26 26 20 69 73 52 65 61 64 57 72 69  DIR && isReadWri
21600 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69  te && !isExclusi
21610 76 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  ve ){.      /* F
21620 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68  ailed to open th
21630 65 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2f  e file for read/
21640 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 72  write access. Tr
21650 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a  y read-only. */.
21660 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
21670 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
21680 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
21690 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20  EN_CREATE);.    
216a0 20 20 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20 7e    openFlags &= ~
216b0 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 29  (O_RDWR|O_CREAT)
216c0 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d  ;.      flags |=
216d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
216e0 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 6f 70 65  DONLY;.      ope
216f0 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e  nFlags |= O_RDON
21700 4c 59 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 6f  LY;.      fd = o
21710 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46  pen(zName, openF
21720 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b  lags, openMode);
21730 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
21740 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  d<0 ){.      rc 
21750 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
21760 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  N_BKPT;.      go
21770 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64  to open_finished
21780 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
21790 73 65 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20  sert( fd>=0 );. 
217a0 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29   if( pOutFlags )
217b0 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73  {.    *pOutFlags
217c0 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20   = flags;.  }.. 
217d0 20 69 66 28 20 70 2d 3e 70 55 6e 75 73 65 64 20   if( p->pUnused 
217e0 29 7b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65  ){.    p->pUnuse
217f0 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20 20  d->fd = fd;.    
21800 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67  p->pUnused->flag
21810 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a  s = flags;.  }..
21820 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29    if( isDelete )
21830 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  {.#if OS_VXWORKS
21840 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61  .    zPath = zNa
21850 6d 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 6e  me;.#else.    un
21860 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e  link(zName);.#en
21870 64 69 66 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49  dif.  }.#if SQLI
21880 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
21890 47 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a  G_STYLE.  else{.
218a0 20 20 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73      p->openFlags
218b0 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20   = openFlags;.  
218c0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
218d0 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20  isOpenDirectory 
218e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e  ){.    rc = open
218f0 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c  Directory(zPath,
21900 20 26 64 69 72 66 64 29 3b 0a 20 20 20 20 69 66   &dirfd);.    if
21910 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
21920 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69  ){.      /* It i
21930 73 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 20  s safe to close 
21940 66 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  fd at this point
21950 2c 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  , because it is 
21960 67 75 61 72 61 6e 74 65 65 64 20 6e 6f 74 0a 20  guaranteed not. 
21970 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 6f 70       ** to be op
21980 65 6e 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  en on a database
21990 20 66 69 6c 65 2e 20 49 66 20 69 74 20 77 65 72   file. If it wer
219a0 65 20 6f 70 65 6e 20 6f 6e 20 61 20 64 61 74 61  e open on a data
219b0 62 61 73 65 20 66 69 6c 65 2c 0a 20 20 20 20 20  base file,.     
219c0 20 2a 2a 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74   ** it would not
219d0 20 62 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73   be safe to clos
219e0 65 20 61 73 20 74 68 69 73 20 77 6f 75 6c 64 20  e as this would 
219f0 72 65 6c 65 61 73 65 20 61 6e 79 20 6c 6f 63 6b  release any lock
21a00 73 20 68 65 6c 64 0a 20 20 20 20 20 20 2a 2a 20  s held.      ** 
21a10 6f 6e 20 74 68 65 20 66 69 6c 65 20 62 79 20 74  on the file by t
21a20 68 69 73 20 70 72 6f 63 65 73 73 2e 20 20 2a 2f  his process.  */
21a30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
21a40 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
21a50 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 20  N_MAIN_DB );.   
21a60 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 20 20 20     close(fd);   
21a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 69 6c            /* sil
21a80 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61  ently leak if fa
21a90 69 6c 2c 20 61 6c 72 65 61 64 79 20 69 6e 20 65  il, already in e
21aa0 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 67 6f  rror */.      go
21ab0 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64  to open_finished
21ac0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
21ad0 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20  def FD_CLOEXEC. 
21ae0 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54   fcntl(fd, F_SET
21af0 46 44 2c 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f  FD, fcntl(fd, F_
21b00 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43  GETFD, 0) | FD_C
21b10 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a  LOEXEC);.#endif.
21b20 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70  .  noLock = eTyp
21b30 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
21b40 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23 69 66 20  AIN_DB;..  .#if 
21b50 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
21b60 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41  _) || SQLITE_ENA
21b70 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
21b80 45 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66  E.  struct statf
21b90 73 20 66 73 49 6e 66 6f 3b 0a 20 20 69 66 28 20  s fsInfo;.  if( 
21ba0 66 73 74 61 74 66 73 28 66 64 2c 20 26 66 73 49  fstatfs(fd, &fsI
21bb0 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  nfo) == -1 ){.  
21bc0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46    ((unixFile*)pF
21bd0 69 6c 65 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  ile)->lastErrno 
21be0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28  = errno;.    if(
21bf0 20 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73   dirfd>=0 ) clos
21c00 65 28 64 69 72 66 64 29 3b 20 2f 2a 20 73 69 6c  e(dirfd); /* sil
21c10 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61  ently leak if fa
21c20 69 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a  il, in error */.
21c30 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 20 2f      close(fd); /
21c40 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20  * silently leak 
21c50 69 66 20 66 61 69 6c 2c 20 69 6e 20 65 72 72 6f  if fail, in erro
21c60 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  r */.    return 
21c70 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
21c80 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30  ESS;.  }.  if (0
21c90 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73 64   == strncmp("msd
21ca0 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73  os", fsInfo.f_fs
21cb0 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a  typename, 5)) {.
21cc0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
21cd0 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20  pFile)->fsFlags 
21ce0 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47  |= SQLITE_FSFLAG
21cf0 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a  S_IS_MSDOS;.  }.
21d00 23 65 6e 64 69 66 0a 20 20 0a 23 69 66 20 53 51  #endif.  .#if SQ
21d10 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
21d20 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20 53 51  ING_STYLE.#if SQ
21d30 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
21d40 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41 75  Y_LOCKING.  isAu
21d50 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65 6e  toProxy = 1;.#en
21d60 64 69 66 0a 20 20 69 66 28 20 69 73 41 75 74 6f  dif.  if( isAuto
21d70 50 72 6f 78 79 20 26 26 20 28 7a 50 61 74 68 21  Proxy && (zPath!
21d80 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c 6f  =NULL) && (!noLo
21d90 63 6b 29 20 26 26 20 70 56 66 73 2d 3e 78 4f 70  ck) && pVfs->xOp
21da0 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  en ){.    char *
21db0 65 6e 76 66 6f 72 63 65 20 3d 20 67 65 74 65 6e  envforce = geten
21dc0 76 28 22 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  v("SQLITE_FORCE_
21dd0 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b  PROXY_LOCKING");
21de0 0a 20 20 20 20 69 6e 74 20 75 73 65 50 72 6f 78  .    int useProx
21df0 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53  y = 0;..    /* S
21e00 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
21e10 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61  Y_LOCKING==1 mea
21e20 6e 73 20 66 6f 72 63 65 20 61 6c 77 61 79 73 20  ns force always 
21e30 75 73 65 20 70 72 6f 78 79 2c 20 30 20 6d 65 61  use proxy, 0 mea
21e40 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72  ns .    ** never
21e50 20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c   use proxy, NULL
21e60 20 6d 65 61 6e 73 20 75 73 65 20 70 72 6f 78 79   means use proxy
21e70 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66   for non-local f
21e80 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20  iles only.  */. 
21e90 20 20 20 69 66 28 20 65 6e 76 66 6f 72 63 65 21     if( envforce!
21ea0 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75  =NULL ){.      u
21eb0 73 65 50 72 6f 78 79 20 3d 20 61 74 6f 69 28 65  seProxy = atoi(e
21ec0 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20  nvforce)>0;.    
21ed0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 72  }else{.      str
21ee0 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66  uct statfs fsInf
21ef0 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 61  o;.      if( sta
21f00 74 66 73 28 7a 50 61 74 68 2c 20 26 66 73 49 6e  tfs(zPath, &fsIn
21f10 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20  fo) == -1 ){.   
21f20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72       /* In theor
21f30 79 2c 20 74 68 65 20 63 6c 6f 73 65 28 66 64 29  y, the close(fd)
21f40 20 63 61 6c 6c 20 69 73 20 73 75 62 2d 6f 70 74   call is sub-opt
21f50 69 6d 61 6c 2e 20 49 66 20 74 68 65 20 66 69 6c  imal. If the fil
21f60 65 20 6f 70 65 6e 65 64 0a 20 20 20 20 20 20 20  e opened.       
21f70 20 2a 2a 20 77 69 74 68 20 66 64 20 69 73 20 61   ** with fd is a
21f80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
21f90 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6f 74  and there are ot
21fa0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  her connections 
21fb0 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  open.        ** 
21fc0 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61  on that file tha
21fd0 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  t are currently 
21fe0 68 6f 6c 64 69 6e 67 20 61 64 76 69 73 6f 72 79  holding advisory
21ff0 20 6c 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a 20 20   locks on it,.  
22000 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
22010 65 20 63 61 6c 6c 20 74 6f 20 63 6c 6f 73 65 28  e call to close(
22020 29 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20 74 68  ) will cancel th
22030 6f 73 65 20 6c 6f 63 6b 73 2e 20 49 6e 20 70 72  ose locks. In pr
22040 61 63 74 69 63 65 2c 0a 20 20 20 20 20 20 20 20  actice,.        
22050 2a 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e  ** we're assumin
22060 67 20 74 68 61 74 20 73 74 61 74 66 73 28 29 20  g that statfs() 
22070 64 6f 65 73 6e 27 74 20 66 61 69 6c 20 76 65 72  doesn't fail ver
22080 79 20 6f 66 74 65 6e 2e 20 41 74 20 6c 65 61 73  y often. At leas
22090 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74  t.        ** not
220a0 20 77 68 69 6c 65 20 6f 74 68 65 72 20 66 69 6c   while other fil
220b0 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70  e descriptors op
220c0 65 6e 65 64 20 62 79 20 74 68 65 20 73 61 6d 65  ened by the same
220d0 20 70 72 6f 63 65 73 73 20 6f 6e 0a 20 20 20 20   process on.    
220e0 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20      ** the same 
220f0 66 69 6c 65 20 61 72 65 20 77 6f 72 6b 69 6e 67  file are working
22100 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 2d  .  */.        p-
22110 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
22120 6e 6f 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  no;.        if( 
22130 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  dirfd>=0 ){.    
22140 20 20 20 20 20 20 63 6c 6f 73 65 28 64 69 72 66        close(dirf
22150 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20  d); /* silently 
22160 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20 69 6e  leak if fail, in
22170 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
22180 20 20 7d 0a 20 20 20 20 20 20 20 20 63 6c 6f 73    }.        clos
22190 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74  e(fd); /* silent
221a0 6c 79 20 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c  ly leak if fail,
221b0 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   in error */.   
221c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
221d0 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20  _IOERR_ACCESS;. 
221e0 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e         goto open
221f0 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20  _finished;.     
22200 20 7d 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78   }.      useProx
22210 79 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66  y = !(fsInfo.f_f
22220 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b  lags&MNT_LOCAL);
22230 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
22240 73 65 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20  seProxy ){.     
22250 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78   rc = fillInUnix
22260 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 64  File(pVfs, fd, d
22270 69 72 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61  irfd, pFile, zPa
22280 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 20 69 73 44 65  th, noLock, isDe
22290 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  lete);.      if(
222a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
222b0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
222c0 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69  roxyTransformUni
222d0 78 46 69 6c 65 28 28 75 6e 69 78 46 69 6c 65 2a  xFile((unixFile*
222e0 29 70 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a 22  )pFile, ":auto:"
222f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
22300 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
22310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
22320 20 75 6e 69 78 43 6c 6f 73 65 20 74 6f 20 63 6c   unixClose to cl
22330 65 61 6e 20 75 70 20 74 68 65 20 72 65 73 6f 75  ean up the resou
22340 72 63 65 73 20 61 64 64 65 64 20 69 6e 20 66 69  rces added in fi
22350 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 20 0a 20 20  llInUnixFile .  
22360 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63          ** and c
22370 6c 65 61 72 20 61 6c 6c 20 74 68 65 20 73 74 72  lear all the str
22380 75 63 74 75 72 65 27 73 20 72 65 66 65 72 65 6e  ucture's referen
22390 63 65 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c  ces.  Specifical
223a0 6c 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ly, .          *
223b0 2a 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  * pFile->pMethod
223c0 73 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 73  s will be NULL s
223d0 6f 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65  o sqlite3OsClose
223e0 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70   will be a no-op
223f0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20   .          */. 
22400 20 20 20 20 20 20 20 20 20 75 6e 69 78 43 6c 6f           unixClo
22410 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  se(pFile);.     
22420 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
22430 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22440 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  }.      goto ope
22450 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  n_finished;.    
22460 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  }.  }.#endif.  .
22470 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69    rc = fillInUni
22480 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20  xFile(pVfs, fd, 
22490 64 69 72 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50  dirfd, pFile, zP
224a0 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 20 69 73 44  ath, noLock, isD
224b0 65 6c 65 74 65 29 3b 0a 6f 70 65 6e 5f 66 69 6e  elete);.open_fin
224c0 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 63 21  ished:.  if( rc!
224d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
224e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
224f0 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a  ->pUnused);.  }.
22500 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22510 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
22520 65 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68 2e  e file at zPath.
22530 20 49 66 20 74 68 65 20 64 69 72 53 79 6e 63 20   If the dirSync 
22540 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65  argument is true
22550 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65  , fsync().** the
22560 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72   directory after
22570 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69   deleting the fi
22580 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
22590 74 20 75 6e 69 78 44 65 6c 65 74 65 28 0a 20 20  t unixDelete(.  
225a0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
225b0 55 73 65 64 2c 20 20 20 20 20 2f 2a 20 56 46 53  Used,     /* VFS
225c0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73   containing this
225d0 20 61 73 20 74 68 65 20 78 44 65 6c 65 74 65 20   as the xDelete 
225e0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73  method */.  cons
225f0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
22600 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
22610 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65   file to be dele
22620 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72  ted */.  int dir
22630 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20  Sync            
22640 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 66     /* If true, f
22650 73 79 6e 63 28 29 20 64 69 72 65 63 74 6f 72 79  sync() directory
22660 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20   after deleting 
22670 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  file */.){.  int
22680 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
22690 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
226a0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
226b0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
226c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
226d0 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 75  ERR_DELETE);.  u
226e0 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3b 0a 23 69  nlink(zPath);.#i
226f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53  fndef SQLITE_DIS
22700 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 69  ABLE_DIRSYNC.  i
22710 66 28 20 64 69 72 53 79 6e 63 20 29 7b 0a 20 20  f( dirSync ){.  
22720 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63    int fd;.    rc
22730 20 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79   = openDirectory
22740 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a 20 20  (zPath, &fd);.  
22750 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22760 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58  _OK ){.#if OS_VX
22770 57 4f 52 4b 53 0a 20 20 20 20 20 20 69 66 28 20  WORKS.      if( 
22780 66 73 79 6e 63 28 66 64 29 3d 3d 2d 31 20 29 0a  fsync(fd)==-1 ).
22790 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20  #else.      if( 
227a0 66 73 79 6e 63 28 66 64 29 20 29 0a 23 65 6e 64  fsync(fd) ).#end
227b0 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
227c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
227d0 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 3b 0a  OERR_DIR_FSYNC;.
227e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
227f0 28 20 63 6c 6f 73 65 28 66 64 29 26 26 21 72 63  ( close(fd)&&!rc
22800 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
22810 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49   SQLITE_IOERR_DI
22820 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 7d  R_CLOSE;.      }
22830 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
22840 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  f.  return rc;.}
22850 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  ../*.** Test the
22860 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 6f 72   existance of or
22870 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69   access permissi
22880 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74  ons of file zPat
22890 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70  h. The.** test p
228a0 65 72 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73  erformed depends
228b0 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66   on the value of
228c0 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
228d0 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f    SQLITE_ACCESS_
228e0 45 58 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31  EXISTS: Return 1
228f0 20 69 66 20 74 68 65 20 66 69 6c 65 20 65 78 69   if the file exi
22900 73 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  sts.**     SQLIT
22910 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49  E_ACCESS_READWRI
22920 54 45 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20  TE: Return 1 if 
22930 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64  the file is read
22940 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a   and writable..*
22950 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43  *     SQLITE_ACC
22960 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65  ESS_READONLY: Re
22970 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
22980 6c 65 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a  le is readable..
22990 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  **.** Otherwise 
229a0 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
229b0 74 69 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65  tic int unixAcce
229c0 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ss(.  sqlite3_vf
229d0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a  s *NotUsed,   /*
229e0 20 54 68 65 20 56 46 53 20 63 6f 6e 74 61 69 6e   The VFS contain
229f0 69 6e 67 20 74 68 69 73 20 78 41 63 63 65 73 73  ing this xAccess
22a00 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e   method */.  con
22a10 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
22a20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20       /* Path of 
22a30 74 68 65 20 66 69 6c 65 20 74 6f 20 65 78 61 6d  the file to exam
22a40 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ine */.  int fla
22a50 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
22a60 20 2f 2a 20 57 68 61 74 20 64 6f 20 77 65 20 77   /* What do we w
22a70 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f  ant to learn abo
22a80 75 74 20 74 68 65 20 7a 50 61 74 68 20 66 69 6c  ut the zPath fil
22a90 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  e? */.  int *pRe
22aa0 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  sOut            
22ab0 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 20  /* Write result 
22ac0 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a  boolean here */.
22ad0 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65 20 3d  ){.  int amode =
22ae0 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   0;.  UNUSED_PAR
22af0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
22b00 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
22b10 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
22b20 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20  E_IOERR_ACCESS; 
22b30 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61  );.  switch( fla
22b40 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  gs ){.    case S
22b50 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
22b60 53 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65  STS:.      amode
22b70 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20 62   = F_OK;.      b
22b80 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
22b90 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
22ba0 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20 61 6d  DWRITE:.      am
22bb0 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b  ode = W_OK|R_OK;
22bc0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
22bd0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
22be0 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 20  CESS_READ:.     
22bf0 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20   amode = R_OK;. 
22c00 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
22c10 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
22c20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64  assert(!"Invalid
22c30 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22   flags argument"
22c40 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75  );.  }.  *pResOu
22c50 74 20 3d 20 28 61 63 63 65 73 73 28 7a 50 61 74  t = (access(zPat
22c60 68 2c 20 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 20  h, amode)==0);. 
22c70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22c80 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72  K;.}.../*.** Tur
22c90 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  n a relative pat
22ca0 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c  hname into a ful
22cb0 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 20  l pathname. The 
22cc0 72 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a 2a  relative path.**
22cd0 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 20   is stored as a 
22ce0 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
22cf0 74 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75 66  tring in the buf
22d00 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
22d10 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a  y.** zPath. .**.
22d20 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74  ** zOut points t
22d30 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74  o a buffer of at
22d40 20 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f 76   least sqlite3_v
22d50 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79  fs.mxPathname by
22d60 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73  tes .** (in this
22d70 20 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e   case, MAX_PATHN
22d80 41 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65 20  AME bytes). The 
22d90 66 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72 69  full-path is wri
22da0 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20  tten to.** this 
22db0 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 72 65  buffer before re
22dc0 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
22dd0 69 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50  ic int unixFullP
22de0 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74  athname(.  sqlit
22df0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
22e00 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
22e10 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63  ter to vfs objec
22e20 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
22e30 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
22e40 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
22e50 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20   relative input 
22e60 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  path */.  int nO
22e70 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
22e80 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
22e90 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  of output buffer
22ea0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
22eb0 68 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20  har *zOut       
22ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22ed0 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  Output buffer */
22ee0 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f  .){..  /* It's o
22ef0 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
22f00 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
22f10 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
22f20 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
22f30 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
22f40 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
22f50 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
22f60 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
22f70 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
22f80 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e  ailing. This fun
22f90 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c  ction could fail
22fa0 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65   if, for example
22fb0 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  , the.  ** curre
22fc0 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63  nt working direc
22fd0 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e  tory has been un
22fe0 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53  linked..  */.  S
22ff0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
23000 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
23010 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ROR );..  assert
23020 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ( pVfs->mxPathna
23030 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45  me==MAX_PATHNAME
23040 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
23050 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20  AMETER(pVfs);.. 
23060 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20   zOut[nOut-1] = 
23070 27 5c 30 27 3b 0a 20 20 69 66 28 20 7a 50 61 74  '\0';.  if( zPat
23080 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  h[0]=='/' ){.   
23090 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
230a0 66 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25  f(nOut, zOut, "%
230b0 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 65  s", zPath);.  }e
230c0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77  lse{.    int nCw
230d0 64 3b 0a 20 20 20 20 69 66 28 20 67 65 74 63 77  d;.    if( getcw
230e0 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31 29 3d  d(zOut, nOut-1)=
230f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
23100 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
23110 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
23120 20 20 20 6e 43 77 64 20 3d 20 28 69 6e 74 29 73     nCwd = (int)s
23130 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20 20  trlen(zOut);.   
23140 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
23150 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26 7a 4f  f(nOut-nCwd, &zO
23160 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73 22 2c  ut[nCwd], "/%s",
23170 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72   zPath);.  }.  r
23180 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23190 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
231a0 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
231b0 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e  TENSION./*.** In
231c0 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65  terfaces for ope
231d0 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69  ning a shared li
231e0 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65  brary, finding e
231f0 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77  ntry points.** w
23200 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64  ithin the shared
23210 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c   library, and cl
23220 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  osing the shared
23230 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e   library..*/.#in
23240 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a  clude <dlfcn.h>.
23250 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69  static void *uni
23260 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  xDlOpen(sqlite3_
23270 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f  vfs *NotUsed, co
23280 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
23290 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ame){.  UNUSED_P
232a0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
232b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70  );.  return dlop
232c0 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54  en(zFilename, RT
232d0 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c  LD_NOW | RTLD_GL
232e0 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  OBAL);.}../*.** 
232f0 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69  SQLite calls thi
23300 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64  s function immed
23310 69 61 74 65 6c 79 20 61 66 74 65 72 20 61 20 63  iately after a c
23320 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d  all to unixDlSym
23330 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f  () or.** unixDlO
23340 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74  pen() fails (ret
23350 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  urns a null poin
23360 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20  ter). If a more 
23370 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a  detailed error.*
23380 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61 76 61  * message is ava
23390 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72  ilable, it is wr
233a0 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74  itten to zBufOut
233b0 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65  . If no error me
233c0 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69  ssage.** is avai
233d0 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69  lable, zBufOut i
233e0 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65  s left unmodifie
233f0 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65  d and SQLite use
23400 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65  s a default.** e
23410 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f  rror message..*/
23420 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
23430 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33  xDlError(sqlite3
23440 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
23450 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
23460 42 75 66 4f 75 74 29 7b 0a 20 20 63 68 61 72 20  BufOut){.  char 
23470 2a 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f  *zErr;.  UNUSED_
23480 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
23490 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d  d);.  unixEnterM
234a0 75 74 65 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d  utex();.  zErr =
234b0 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69 66   dlerror();.  if
234c0 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 73 71  ( zErr ){.    sq
234d0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
234e0 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25  Buf, zBufOut, "%
234f0 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20  s", zErr);.  }. 
23500 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
23510 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
23520 20 28 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c   (*unixDlSym(sql
23530 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
23540 64 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73  d, void *p, cons
23550 74 20 63 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f  t char*zSym))(vo
23560 69 64 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  id){.  /* .  ** 
23570 47 43 43 20 77 69 74 68 20 2d 70 65 64 61 6e 74  GCC with -pedant
23580 69 63 2d 65 72 72 6f 72 73 20 73 61 79 73 20 74  ic-errors says t
23590 68 61 74 20 43 39 30 20 64 6f 65 73 20 6e 6f 74  hat C90 does not
235a0 20 61 6c 6c 6f 77 20 61 20 76 6f 69 64 2a 20 74   allow a void* t
235b0 6f 20 62 65 0a 20 20 2a 2a 20 63 61 73 74 20 69  o be.  ** cast i
235c0 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  nto a pointer to
235d0 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41 6e   a function.  An
235e0 64 20 79 65 74 20 74 68 65 20 6c 69 62 72 61 72  d yet the librar
235f0 79 20 64 6c 73 79 6d 28 29 20 72 6f 75 74 69 6e  y dlsym() routin
23600 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61  e.  ** returns a
23610 20 76 6f 69 64 2a 20 77 68 69 63 68 20 69 73 20   void* which is 
23620 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72  really a pointer
23630 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20   to a function. 
23640 20 53 6f 20 68 6f 77 20 64 6f 20 77 65 0a 20 20   So how do we.  
23650 2a 2a 20 75 73 65 20 64 6c 73 79 6d 28 29 20 77  ** use dlsym() w
23660 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72  ith -pedantic-er
23670 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rors?.  **.  ** 
23680 56 61 72 69 61 62 6c 65 20 78 20 62 65 6c 6f 77  Variable x below
23690 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62   is defined to b
236a0 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
236b0 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e 67   function taking
236c0 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  .  ** parameters
236d0 20 76 6f 69 64 2a 20 61 6e 64 20 63 6f 6e 73 74   void* and const
236e0 20 63 68 61 72 2a 20 61 6e 64 20 72 65 74 75 72   char* and retur
236f0 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74  ning a pointer t
23700 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  o a function..  
23710 2a 2a 20 57 65 20 69 6e 69 74 69 61 6c 69 7a 65  ** We initialize
23720 20 78 20 62 79 20 61 73 73 69 67 6e 69 6e 67 20   x by assigning 
23730 69 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  it a pointer to 
23740 74 68 65 20 64 6c 73 79 6d 28 29 20 66 75 6e 63  the dlsym() func
23750 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68 61 74  tion..  ** (That
23760 20 61 73 73 69 67 6e 6d 65 6e 74 20 72 65 71 75   assignment requ
23770 69 72 65 73 20 61 20 63 61 73 74 2e 29 20 20 54  ires a cast.)  T
23780 68 65 6e 20 77 65 20 63 61 6c 6c 20 74 68 65 20  hen we call the 
23790 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 20 20  function that.  
237a0 2a 2a 20 78 20 70 6f 69 6e 74 73 20 74 6f 2e 20  ** x points to. 
237b0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73   .  **.  ** This
237c0 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20   work-around is 
237d0 75 6e 6c 69 6b 65 6c 79 20 74 6f 20 77 6f 72 6b  unlikely to work
237e0 20 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20 61 6e   correctly on an
237f0 79 20 73 79 73 74 65 6d 20 77 68 65 72 65 0a 20  y system where. 
23800 20 2a 2a 20 79 6f 75 20 72 65 61 6c 6c 79 20 63   ** you really c
23810 61 6e 6e 6f 74 20 63 61 73 74 20 61 20 66 75 6e  annot cast a fun
23820 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 6e  ction pointer in
23830 74 6f 20 76 6f 69 64 2a 2e 20 20 42 75 74 20 74  to void*.  But t
23840 68 65 6e 2c 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  hen, on the.  **
23850 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 64 6c 73   other hand, dls
23860 79 6d 28 29 20 77 69 6c 6c 20 6e 6f 74 20 77 6f  ym() will not wo
23870 72 6b 20 6f 6e 20 73 75 63 68 20 61 20 73 79 73  rk on such a sys
23880 74 65 6d 20 65 69 74 68 65 72 2c 20 73 6f 20 77  tem either, so w
23890 65 20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f 74 20  e have.  ** not 
238a0 72 65 61 6c 6c 79 20 6c 6f 73 74 20 61 6e 79 74  really lost anyt
238b0 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69  hing..  */.  voi
238c0 64 20 28 2a 28 2a 78 29 28 76 6f 69 64 2a 2c 63  d (*(*x)(void*,c
238d0 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69  onst char*))(voi
238e0 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d);.  UNUSED_PAR
238f0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
23900 0a 20 20 78 20 3d 20 28 76 6f 69 64 28 2a 28 2a  .  x = (void(*(*
23910 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68  )(void*,const ch
23920 61 72 2a 29 29 28 76 6f 69 64 29 29 64 6c 73 79  ar*))(void))dlsy
23930 6d 3b 0a 20 20 72 65 74 75 72 6e 20 28 2a 78 29  m;.  return (*x)
23940 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61  (p, zSym);.}.sta
23950 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 43  tic void unixDlC
23960 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lose(sqlite3_vfs
23970 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20   *NotUsed, void 
23980 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55  *pHandle){.  UNU
23990 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
239a0 74 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f 73  tUsed);.  dlclos
239b0 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65  e(pHandle);.}.#e
239c0 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45  lse /* if SQLITE
239d0 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
239e0 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a  SION is defined:
239f0 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 75 6e   */.  #define un
23a00 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64  ixDlOpen  0.  #d
23a10 65 66 69 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f  efine unixDlErro
23a20 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e  r 0.  #define un
23a30 69 78 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64  ixDlSym   0.  #d
23a40 65 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73  efine unixDlClos
23a50 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  e 0.#endif../*.*
23a60 2a 20 57 72 69 74 65 20 6e 42 75 66 20 62 79 74  * Write nBuf byt
23a70 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74  es of random dat
23a80 61 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  a to the supplie
23a90 64 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a  d buffer zBuf..*
23aa0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
23ab0 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69  xRandomness(sqli
23ac0 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
23ad0 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
23ae0 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45   *zBuf){.  UNUSE
23af0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
23b00 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74 28 28  sed);.  assert((
23b10 73 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73 69  size_t)nBuf>=(si
23b20 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a  zeof(time_t)+siz
23b30 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f  eof(int)));..  /
23b40 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69  * We have to ini
23b50 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20  tialize zBuf to 
23b60 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64  prevent valgrind
23b70 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a   from reporting.
23b80 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68    ** errors.  Th
23b90 65 20 72 65 70 6f 72 74 73 20 69 73 73 75 65 64  e reports issued
23ba0 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65   by valgrind are
23bb0 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20   incorrect - we 
23bc0 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65  would.  ** prefe
23bd0 72 20 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f  r that the rando
23be0 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61 73  mness be increas
23bf0 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65  ed by making use
23c00 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69   of the.  ** uni
23c10 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65  nitialized space
23c20 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76   in zBuf - but v
23c30 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74  algrind errors t
23c40 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a  end to worry.  *
23c50 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52  * some users.  R
23c60 61 74 68 65 72 20 74 68 61 6e 20 61 72 67 75 65  ather than argue
23c70 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73 69 65  , it seems easie
23c80 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61  r just to initia
23c90 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68  lize.  ** the wh
23ca0 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73 69  ole array and si
23cb0 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20  lence valgrind, 
23cc0 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61  even if that mea
23cd0 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65  ns less randomne
23ce0 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  ss.  ** in the r
23cf0 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a  andom seed..  **
23d00 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69  .  ** When testi
23d10 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  ng, initializing
23d20 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20   zBuf[] to zero 
23d30 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54  is all we do.  T
23d40 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74  hat means.  ** t
23d50 68 61 74 20 77 65 20 61 6c 77 61 79 73 20 75 73  hat we always us
23d60 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f  e the same rando
23d70 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63  m number sequenc
23d80 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 20 74  e.  This makes t
23d90 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65  he.  ** tests re
23da0 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  peatable..  */. 
23db0 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c   memset(zBuf, 0,
23dc0 20 6e 42 75 66 29 3b 0a 23 69 66 20 21 64 65 66   nBuf);.#if !def
23dd0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
23de0 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 70 69  ).  {.    int pi
23df0 64 2c 20 66 64 3b 0a 20 20 20 20 66 64 20 3d 20  d, fd;.    fd = 
23e00 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64  open("/dev/urand
23e10 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a  om", O_RDONLY);.
23e20 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a      if( fd<0 ){.
23e30 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a        time_t t;.
23e40 20 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b 0a        time(&t);.
23e50 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75        memcpy(zBu
23e60 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74 29  f, &t, sizeof(t)
23e70 29 3b 0a 20 20 20 20 20 20 70 69 64 20 3d 20 67  );.      pid = g
23e80 65 74 70 69 64 28 29 3b 0a 20 20 20 20 20 20 6d  etpid();.      m
23e90 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65  emcpy(&zBuf[size
23ea0 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c 20 73 69  of(t)], &pid, si
23eb0 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20  zeof(pid));.    
23ec0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
23ed0 28 74 29 2b 73 69 7a 65 6f 66 28 70 69 64 29 3c  (t)+sizeof(pid)<
23ee0 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b  =(size_t)nBuf );
23ef0 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20 73 69  .      nBuf = si
23f00 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f 66  zeof(t) + sizeof
23f10 28 70 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pid);.    }else
23f20 7b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20 72  {.      nBuf = r
23f30 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42  ead(fd, zBuf, nB
23f40 75 66 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65  uf);.      close
23f50 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (fd);.    }.  }.
23f60 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
23f70 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nBuf;.}.../*.** 
23f80 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
23f90 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
23fa0 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
23fb0 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54  time slept..** T
23fc0 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
23fd0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63  he number of mic
23fe0 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e  roseconds we wan
23ff0 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54  t to sleep..** T
24000 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
24010 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
24020 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66   microseconds of
24030 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a   sleep actually.
24040 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f  ** requested fro
24050 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  m the underlying
24060 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
24070 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63  m, a number whic
24080 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72  h.** might be gr
24090 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
240a0 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d  ual to the argum
240b0 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73  ent, but not les
240c0 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72  s.** than the ar
240d0 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
240e0 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28  c int unixSleep(
240f0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
24100 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73  Used, int micros
24110 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f  econds){.#if OS_
24120 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
24130 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20   timespec sp;.. 
24140 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63   sp.tv_sec = mic
24150 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30  roseconds / 1000
24160 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65  000;.  sp.tv_nse
24170 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64  c = (microsecond
24180 73 20 25 20 31 30 30 30 30 30 30 29 20 2a 20 31  s % 1000000) * 1
24190 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70  000;.  nanosleep
241a0 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55  (&sp, NULL);.  U
241b0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
241c0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
241d0 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b  rn microseconds;
241e0 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48  .#elif defined(H
241f0 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48  AVE_USLEEP) && H
24200 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c  AVE_USLEEP.  usl
24210 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73  eep(microseconds
24220 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
24230 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
24240 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65    return microse
24250 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69  conds;.#else.  i
24260 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69  nt seconds = (mi
24270 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39  croseconds+99999
24280 39 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c  9)/1000000;.  sl
24290 65 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20  eep(seconds);.  
242a0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
242b0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
242c0 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30  urn seconds*1000
242d0 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  000;.#endif.}../
242e0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
242f0 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20  ng variable, if 
24300 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  set to a non-zer
24310 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65  o value, is inte
24320 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68  rpreted as.** th
24330 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f  e number of seco
24340 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61  nds since 1970 a
24350 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65  nd is used to se
24360 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  t the result of.
24370 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72  ** sqlite3OsCurr
24380 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67  entTime() during
24390 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66   testing..*/.#if
243a0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
243b0 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72  int sqlite3_curr
243c0 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f  ent_time = 0;  /
243d0 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69  * Fake system ti
243e0 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69  me in seconds si
243f0 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e  nce 1970. */.#en
24400 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  dif../*.** Find 
24410 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
24420 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
24430 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
24440 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20  .  Write the.** 
24450 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64  current time and
24460 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61   date as a Julia
24470 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74  n Day number int
24480 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20  o *prNow and.** 
24490 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72  return 0.  Retur
244a0 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20  n 1 if the time 
244b0 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20  and date cannot 
244c0 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  be found..*/.sta
244d0 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72  tic int unixCurr
244e0 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f  entTime(sqlite3_
244f0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 64 6f  vfs *NotUsed, do
24500 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 23 69  uble *prNow){.#i
24510 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
24520 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
24530 4f 49 4e 54 29 0a 20 20 74 69 6d 65 5f 74 20 74  OINT).  time_t t
24540 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20  ;.  time(&t);.  
24550 2a 70 72 4e 6f 77 20 3d 20 28 28 28 73 71 6c 69  *prNow = (((sqli
24560 74 65 33 5f 69 6e 74 36 34 29 74 29 2f 38 36 34  te3_int64)t)/864
24570 30 20 2b 20 32 34 34 30 35 38 37 35 29 2f 31 30  0 + 24405875)/10
24580 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
24590 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74 69 6d  NO_GETTOD).  tim
245a0 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26 74  e_t t;.  time(&t
245b0 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 74 2f  );.  *prNow = t/
245c0 38 36 34 30 30 2e 30 20 2b 20 32 34 34 30 35 38  86400.0 + 244058
245d0 37 2e 35 3b 0a 23 65 6c 69 66 20 4f 53 5f 56 58  7.5;.#elif OS_VX
245e0 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74  WORKS.  struct t
245f0 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20 20  imespec sNow;.  
24600 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43 4c  clock_gettime(CL
24610 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26 73  OCK_REALTIME, &s
24620 4e 6f 77 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d  Now);.  *prNow =
24630 20 32 34 34 30 35 38 37 2e 35 20 2b 20 73 4e 6f   2440587.5 + sNo
24640 77 2e 74 76 5f 73 65 63 2f 38 36 34 30 30 2e 30  w.tv_sec/86400.0
24650 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f   + sNow.tv_nsec/
24660 38 36 34 30 30 30 30 30 30 30 30 30 30 30 2e 30  86400000000000.0
24670 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74  ;.#else.  struct
24680 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20   timeval sNow;. 
24690 20 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73   gettimeofday(&s
246a0 4e 6f 77 2c 20 30 29 3b 0a 20 20 2a 70 72 4e 6f  Now, 0);.  *prNo
246b0 77 20 3d 20 32 34 34 30 35 38 37 2e 35 20 2b 20  w = 2440587.5 + 
246c0 73 4e 6f 77 2e 74 76 5f 73 65 63 2f 38 36 34 30  sNow.tv_sec/8640
246d0 30 2e 30 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73  0.0 + sNow.tv_us
246e0 65 63 2f 38 36 34 30 30 30 30 30 30 30 30 2e 30  ec/86400000000.0
246f0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
24700 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
24710 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  f( sqlite3_curre
24720 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a  nt_time ){.    *
24730 70 72 4e 6f 77 20 3d 20 73 71 6c 69 74 65 33 5f  prNow = sqlite3_
24740 63 75 72 72 65 6e 74 5f 74 69 6d 65 2f 38 36 34  current_time/864
24750 30 30 2e 30 20 2b 20 32 34 34 30 35 38 37 2e 35  00.0 + 2440587.5
24760 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55  ;.  }.#endif.  U
24770 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
24780 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
24790 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  rn 0;.}../*.** W
247a0 65 20 61 64 64 65 64 20 74 68 65 20 78 47 65 74  e added the xGet
247b0 4c 61 73 74 45 72 72 6f 72 28 29 20 6d 65 74 68  LastError() meth
247c0 6f 64 20 77 69 74 68 20 74 68 65 20 69 6e 74 65  od with the inte
247d0 6e 74 69 6f 6e 20 6f 66 20 70 72 6f 76 69 64 69  ntion of providi
247e0 6e 67 0a 2a 2a 20 62 65 74 74 65 72 20 6c 6f 77  ng.** better low
247f0 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d 65 73  -level error mes
24800 73 61 67 65 73 20 77 68 65 6e 20 6f 70 65 72 61  sages when opera
24810 74 69 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f 62  ting-system prob
24820 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20  lems come up.** 
24830 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 6f 70  during SQLite op
24840 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 73 6f  eration.  But so
24850 20 66 61 72 2c 20 6e 6f 6e 65 20 6f 66 20 74 68   far, none of th
24860 61 74 20 68 61 73 20 62 65 65 6e 20 69 6d 70 6c  at has been impl
24870 65 6d 65 6e 74 65 64 0a 2a 2a 20 69 6e 20 74 68  emented.** in th
24880 65 20 63 6f 72 65 2e 20 20 53 6f 20 74 68 69 73  e core.  So this
24890 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
248a0 72 20 63 61 6c 6c 65 64 2e 20 20 46 6f 72 20 6e  r called.  For n
248b0 6f 77 2c 20 69 74 20 69 73 20 6d 65 72 65 6c 79  ow, it is merely
248c0 0a 2a 2a 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64  .** a place-hold
248d0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
248e0 74 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72  t unixGetLastErr
248f0 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
24900 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
24910 55 73 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f 74  Used2, char *Not
24920 55 73 65 64 33 29 7b 0a 20 20 55 4e 55 53 45 44  Used3){.  UNUSED
24930 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
24940 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ed);.  UNUSED_PA
24950 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 32  RAMETER(NotUsed2
24960 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
24970 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 33 29 3b  METER(NotUsed3);
24980 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
24990 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /*.*************
249a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
249b0 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d  of sqlite3_vfs m
249c0 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
249d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
249e0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
249f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a30 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
24a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a80 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
24a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
24aa0 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69  egin Proxy Locki
24ab0 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
24ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24ad0 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20  ***.**.** Proxy 
24ae0 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20 22 75 62  locking is a "ub
24af0 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f  er-locking-metho
24b00 64 22 20 69 6e 20 74 68 69 73 20 73 65 6e 73 65  d" in this sense
24b10 3a 20 20 49 74 20 75 73 65 73 20 74 68 65 0a 2a  :  It uses the.*
24b20 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20  * other locking 
24b30 6d 65 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e  methods on secon
24b40 64 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e  dary lock files.
24b50 20 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20    Proxy locking 
24b60 69 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79  is a.** meta-lay
24b70 65 72 20 6f 76 65 72 20 74 6f 70 20 6f 66 20 74  er over top of t
24b80 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63  he primitive loc
24b90 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64  king implemented
24ba0 20 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20   above.  For.** 
24bb0 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65  this reason, the
24bc0 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69   division that i
24bd0 6d 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f  mplements of pro
24be0 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65  xy locking is de
24bf0 66 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20  ferred.** until 
24c00 6c 61 74 65 20 69 6e 20 74 68 65 20 66 69 6c 65  late in the file
24c10 20 28 68 65 72 65 29 20 61 66 74 65 72 20 61 6c   (here) after al
24c20 6c 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 49  l of the other I
24c30 2f 4f 20 6d 65 74 68 6f 64 73 20 68 61 76 65 0a  /O methods have.
24c40 2a 2a 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20  ** been defined 
24c50 2d 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 72  - so that the pr
24c60 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20  imitive locking 
24c70 6d 65 74 68 6f 64 73 20 61 72 65 20 61 76 61 69  methods are avai
24c80 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76  lable.** as serv
24c90 69 63 65 73 20 74 6f 20 68 65 6c 70 20 77 69 74  ices to help wit
24ca0 68 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  h the implementa
24cb0 74 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f  tion of proxy lo
24cc0 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a  cking..**.****.*
24cd0 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
24ce0 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73   locking schemes
24cf0 20 69 6e 20 53 51 4c 69 74 65 20 75 73 65 20 62   in SQLite use b
24d00 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20  yte-range locks 
24d10 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  on the.** databa
24d20 73 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64  se file to coord
24d30 69 6e 61 74 65 20 73 61 66 65 2c 20 63 6f 6e 63  inate safe, conc
24d40 75 72 72 65 6e 74 20 61 63 63 65 73 73 20 62 79  urrent access by
24d50 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72   multiple reader
24d60 73 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 72 73  s.** and writers
24d70 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e   [http://sqlite.
24d80 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74  org/lockingv3.ht
24d90 6d 6c 5d 2e 20 20 54 68 65 20 66 69 76 65 20 66  ml].  The five f
24da0 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73  ile locking.** s
24db0 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c  tates (UNLOCKED,
24dc0 20 50 45 4e 44 49 4e 47 2c 20 53 48 41 52 45 44   PENDING, SHARED
24dd0 2c 20 52 45 53 45 52 56 45 44 2c 20 45 58 43 4c  , RESERVED, EXCL
24de0 55 53 49 56 45 29 20 61 72 65 20 69 6d 70 6c 65  USIVE) are imple
24df0 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53  mented.** as POS
24e00 49 58 20 72 65 61 64 20 26 20 77 72 69 74 65 20  IX read & write 
24e10 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69 78 65 64  locks over fixed
24e20 20 73 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e   set of location
24e30 73 20 28 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a  s (via fsctl),.*
24e40 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d 42  * on AFP and SMB
24e50 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76 65 20   only exclusive 
24e60 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73  byte-range locks
24e70 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 76   are available v
24e80 69 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68  ia fsctl.** with
24e90 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20   _IOWR('z', 23, 
24ea0 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
24eb0 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74 72 61 63  LockPB2) to trac
24ec0 6b 20 74 68 65 20 73 61 6d 65 20 35 20 73 74 61  k the same 5 sta
24ed0 74 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c  tes..** To simul
24ee0 61 74 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e  ate a F_RDLCK on
24ef0 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67   the shared rang
24f00 65 2c 20 6f 6e 20 41 46 50 20 61 20 72 61 6e 64  e, on AFP a rand
24f10 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a  omly selected.**
24f20 20 61 64 64 72 65 73 73 20 69 6e 20 74 68 65 20   address in the 
24f30 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20  shared range is 
24f40 74 61 6b 65 6e 20 66 6f 72 20 61 20 53 48 41 52  taken for a SHAR
24f50 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74  ED lock, the ent
24f60 69 72 65 0a 2a 2a 20 73 68 61 72 65 64 20 72 61  ire.** shared ra
24f70 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72  nge is taken for
24f80 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
24f90 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ck):.**.**      
24fa0 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20  PENDING_BYTE    
24fb0 20 20 20 20 30 78 34 30 30 30 30 30 30 30 09 09      0x40000000..
24fc0 20 20 20 09 0a 2a 2a 20 20 20 20 20 20 52 45 53     ..**      RES
24fd0 45 52 56 45 44 5f 42 59 54 45 20 20 20 20 20 20  ERVED_BYTE      
24fe0 20 30 78 34 30 30 30 30 30 30 31 0a 2a 2a 20 20   0x40000001.**  
24ff0 20 20 20 20 53 48 41 52 45 44 5f 52 41 4e 47 45      SHARED_RANGE
25000 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30          0x400000
25010 30 32 20 2d 3e 20 30 78 34 30 30 30 30 32 30 30  02 -> 0x40000200
25020 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b  .**.** This work
25030 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f  s well on the lo
25040 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2c  cal file system,
25050 20 62 75 74 20 73 68 6f 77 73 20 61 20 6e 65 61   but shows a nea
25060 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77  rly 100x.** slow
25070 64 6f 77 6e 20 69 6e 20 72 65 61 64 20 70 65 72  down in read per
25080 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20  formance on AFP 
25090 62 65 63 61 75 73 65 20 74 68 65 20 41 46 50 20  because the AFP 
250a0 63 6c 69 65 6e 74 20 64 69 73 61 62 6c 65 73 0a  client disables.
250b0 2a 2a 20 74 68 65 20 72 65 61 64 20 63 61 63 68  ** the read cach
250c0 65 20 77 68 65 6e 20 62 79 74 65 2d 72 61 6e 67  e when byte-rang
250d0 65 20 6c 6f 63 6b 73 20 61 72 65 20 70 72 65 73  e locks are pres
250e0 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74  ent.  Enabling t
250f0 68 65 20 72 65 61 64 0a 2a 2a 20 63 61 63 68 65  he read.** cache
25100 20 65 78 70 6f 73 65 73 20 61 20 63 61 63 68 65   exposes a cache
25110 20 63 6f 68 65 72 65 6e 63 79 20 70 72 6f 62 6c   coherency probl
25120 65 6d 20 74 68 61 74 20 69 73 20 70 72 65 73 65  em that is prese
25130 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a  nt on all OS X.*
25140 2a 20 73 75 70 70 6f 72 74 65 64 20 6e 65 74 77  * supported netw
25150 6f 72 6b 20 66 69 6c 65 20 73 79 73 74 65 6d 73  ork file systems
25160 2e 20 20 4e 46 53 20 61 6e 64 20 41 46 50 20 62  .  NFS and AFP b
25170 6f 74 68 20 6f 62 73 65 72 76 65 20 74 68 65 0a  oth observe the.
25180 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e  ** close-to-open
25190 20 73 65 6d 61 6e 74 69 63 73 20 66 6f 72 20 65   semantics for e
251a0 6e 73 75 72 69 6e 67 20 63 61 63 68 65 20 63 6f  nsuring cache co
251b0 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70  herency.** [http
251c0 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72  ://nfs.sourcefor
251d0 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c  ge.net/#faq_a8],
251e0 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20   which does not 
251f0 65 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61  effectively.** a
25200 64 64 72 65 73 73 20 74 68 65 20 72 65 71 75 69  ddress the requi
25210 72 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63  rements for conc
25220 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
25230 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70  access by multip
25240 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73 20 61 6e  le.** readers an
25250 64 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74  d writers.** [ht
25260 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e  tp://www.nabble.
25270 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46  com/SQLite-on-NF
25280 53 2d 63 61 63 68 65 2d 63 6f 68 65 72 65 6e 63  S-cache-coherenc
25290 79 2d 74 64 31 35 36 35 35 37 30 31 2e 68 74 6d  y-td15655701.htm
252a0 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64  l]..**.** To add
252b0 72 65 73 73 20 74 68 65 20 70 65 72 66 6f 72 6d  ress the perform
252c0 61 6e 63 65 20 61 6e 64 20 63 61 63 68 65 20 63  ance and cache c
252d0 6f 68 65 72 65 6e 63 79 20 69 73 73 75 65 73 2c  oherency issues,
252e0 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b   proxy file lock
252f0 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ing.** changes t
25300 68 65 20 77 61 79 20 64 61 74 61 62 61 73 65 20  he way database 
25310 61 63 63 65 73 73 20 69 73 20 63 6f 6e 74 72 6f  access is contro
25320 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74 69 6e 67  lled by limiting
25330 20 61 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20   access to a.** 
25340 73 69 6e 67 6c 65 20 68 6f 73 74 20 61 74 20 61  single host at a
25350 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67   time and moving
25360 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20   file locks off 
25370 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
25380 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f  file.** and onto
25390 20 61 20 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e   a proxy file on
253a0 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20   the local file 
253b0 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a  system.  .**.**.
253c0 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78 79 20 6c  ** Using proxy l
253d0 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  ocks.** --------
253e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20  ---------.**.** 
253f0 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71  C APIs.**.**  sq
25400 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
25410 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53  ol(db, dbname, S
25420 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
25430 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20  OXYFILE,.**     
25440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25450 20 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c    <proxy_path> |
25460 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20   ":auto:");.**  
25470 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
25480 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c  trol(db, dbname,
25490 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b   SQLITE_GET_LOCK
254a0 50 52 4f 58 59 46 49 4c 45 2c 20 26 3c 70 72 6f  PROXYFILE, &<pro
254b0 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a  xy_path>);.**.**
254c0 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61 73 0a  .** SQL pragmas.
254d0 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64  **.**  PRAGMA [d
254e0 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72  atabase.]lock_pr
254f0 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f  oxy_file=<proxy_
25500 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a  path> | :auto:.*
25510 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62  *  PRAGMA [datab
25520 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f  ase.]lock_proxy_
25530 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69  file.**.** Speci
25540 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d  fying ":auto:" m
25550 65 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65  eans that if the
25560 72 65 20 69 73 20 61 20 63 6f 6e 63 68 20 66 69  re is a conch fi
25570 6c 65 20 77 69 74 68 20 61 20 6d 61 74 63 68 69  le with a matchi
25580 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e  ng.** host ID in
25590 20 69 74 2c 20 74 68 65 20 70 72 6f 78 79 20 70   it, the proxy p
255a0 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68  ath in the conch
255b0 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73   file will be us
255c0 65 64 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a  ed, otherwise.**
255d0 20 61 20 70 72 6f 78 79 20 70 61 74 68 20 62 61   a proxy path ba
255e0 73 65 64 20 6f 6e 20 74 68 65 20 75 73 65 72 27  sed on the user'
255f0 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76  s temp dir.** (v
25600 69 61 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44  ia confstr(_CS_D
25610 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f  ARWIN_USER_TEMP_
25620 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62  DIR,...)) will b
25630 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  e used and the.*
25640 2a 20 61 63 74 75 61 6c 20 70 72 6f 78 79 20 66  * actual proxy f
25650 69 6c 65 20 6e 61 6d 65 20 69 73 20 67 65 6e 65  ile name is gene
25660 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6e  rated from the n
25670 61 6d 65 20 61 6e 64 20 70 61 74 68 20 6f 66 20  ame and path of 
25680 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
25690 66 69 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70  file.  For examp
256a0 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  le:.**.**       
256b0 46 6f 72 20 64 61 74 61 62 61 73 65 20 70 61 74  For database pat
256c0 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f  h "/Users/me/foo
256d0 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20 20 20 54  .db" .**       T
256e0 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c  he lock path wil
256f0 6c 20 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73  l be "<tmpdir>/s
25700 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65  qliteplocks/_Use
25710 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74  rs_me_foo.db:aut
25720 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  o:").**.** Once 
25730 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73 20  a lock proxy is 
25740 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 61  configured for a
25750 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
25760 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74  tion, it can not
25770 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c 20  .** be removed, 
25780 68 6f 77 65 76 65 72 20 69 74 20 6d 61 79 20 62  however it may b
25790 65 20 73 77 69 74 63 68 65 64 20 74 6f 20 61 20  e switched to a 
257a0 64 69 66 66 65 72 65 6e 74 20 70 72 6f 78 79 20  different proxy 
257b0 70 61 74 68 20 76 69 61 0a 2a 2a 20 74 68 65 20  path via.** the 
257c0 61 62 6f 76 65 20 41 50 49 73 20 28 61 73 73 75  above APIs (assu
257d0 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63 68 20 66  ming the conch f
257e0 69 6c 65 20 69 73 20 6e 6f 74 20 62 65 69 6e 67  ile is not being
257f0 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72   held by another
25800 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  .** connection o
25810 72 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a  r process). .**.
25820 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20  **.** How proxy 
25830 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a  locking works.**
25840 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
25850 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50  --------.**.** P
25860 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  roxy file lockin
25870 67 20 72 65 6c 69 65 73 20 70 72 69 6d 61 72 69  g relies primari
25880 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75  ly on two new su
25890 70 70 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a 20  pporting files: 
258a0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63  .**.**   *  conc
258b0 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20  h file to limit 
258c0 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 61  access to the da
258d0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 61  tabase file to a
258e0 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20   single host.** 
258f0 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 0a 2a       at a time.*
25900 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79 20  *.**   *  proxy 
25910 66 69 6c 65 20 74 6f 20 61 63 74 20 61 73 20 61  file to act as a
25920 20 70 72 6f 78 79 20 66 6f 72 20 74 68 65 20 61   proxy for the a
25930 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f  dvisory locks no
25940 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74  rmally.**      t
25950 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  aken on the data
25960 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  base.**.** The c
25970 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f 20 75  onch file - to u
25980 73 65 20 61 20 70 72 6f 78 79 20 66 69 6c 65 2c  se a proxy file,
25990 20 73 71 6c 69 74 65 20 6d 75 73 74 20 66 69 72   sqlite must fir
259a0 73 74 20 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e  st "hold the con
259b0 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67  ch".** by taking
259c0 20 61 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c 65   an sqlite-style
259d0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
259e0 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20  the conch file, 
259f0 72 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63  reading the.** c
25a00 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70  ontents and comp
25a10 61 72 69 6e 67 20 74 68 65 20 68 6f 73 74 27 73  aring the host's
25a20 20 75 6e 69 71 75 65 20 68 6f 73 74 20 49 44 20   unique host ID 
25a30 28 73 65 65 20 62 65 6c 6f 77 29 20 61 6e 64 20  (see below) and 
25a40 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61  lock.** proxy pa
25a50 74 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 76  th against the v
25a60 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20  alues stored in 
25a70 74 68 65 20 63 6f 6e 63 68 2e 20 20 54 68 65 20  the conch.  The 
25a80 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a  conch file is.**
25a90 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73   stored in the s
25aa0 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73  ame directory as
25ab0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25ac0 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
25ad0 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74 65  name.** is patte
25ae0 72 6e 65 64 20 61 66 74 65 72 20 74 68 65 20 64  rned after the d
25af0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
25b00 65 20 61 73 20 22 2e 3c 64 61 74 61 62 61 73 65  e as ".<database
25b10 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a  name>-conch"..**
25b20 20 49 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69   If the conch fi
25b30 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
25b40 74 2c 20 6f 72 20 69 74 27 73 20 63 6f 6e 74 65  t, or it's conte
25b50 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  nts do not match
25b60 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20   the.** host ID 
25b70 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70 61 74  and/or proxy pat
25b80 68 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b  h, then the lock
25b90 20 69 73 20 65 73 63 61 6c 61 74 65 64 20 74 6f   is escalated to
25ba0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a   an exclusive.**
25bb0 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 63 6f   lock and the co
25bc0 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74  nch file content
25bd0 73 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74  s is updated wit
25be0 68 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e  h the host ID an
25bf0 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20  d proxy.** path 
25c00 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  and the lock is 
25c10 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20  downgraded to a 
25c20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 67 61 69  shared lock agai
25c30 6e 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 63 68  n.  If the conch
25c40 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62 79 20 61  .** is held by a
25c50 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 28  nother process (
25c60 77 69 74 68 20 61 20 73 68 61 72 65 64 20 6c 6f  with a shared lo
25c70 63 6b 29 2c 20 74 68 65 20 65 78 63 6c 75 73 69  ck), the exclusi
25c80 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20  ve lock.** will 
25c90 66 61 69 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f  fail and SQLITE_
25ca0 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
25cb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78  ..**.** The prox
25cc0 79 20 66 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c  y file - a singl
25cd0 65 2d 62 79 74 65 20 66 69 6c 65 20 75 73 65 64  e-byte file used
25ce0 20 66 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f 72   for all advisor
25cf0 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20  y file locks.** 
25d00 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f  normally taken o
25d10 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
25d20 69 6c 65 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f  ile.   This allo
25d30 77 73 20 66 6f 72 20 73 61 66 65 20 73 68 61 72  ws for safe shar
25d40 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ing.** of the da
25d50 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
25d60 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
25d70 20 61 6e 64 20 77 72 69 74 65 72 73 20 6f 6e 20   and writers on 
25d80 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74  the same.** host
25d90 20 28 74 68 65 20 63 6f 6e 63 68 20 65 6e 73 75   (the conch ensu
25da0 72 65 73 20 74 68 61 74 20 74 68 65 79 20 61 6c  res that they al
25db0 6c 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 6c  l use the same l
25dc0 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e  ocal lock file).
25dd0 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e  .**.** Requestin
25de0 67 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79  g the lock proxy
25df0 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69   does not immedi
25e00 61 74 65 6c 79 20 74 61 6b 65 20 74 68 65 20 63  ately take the c
25e10 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f  onch, it is.** o
25e20 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e 20 74  nly taken when t
25e30 68 65 20 66 69 72 73 74 20 72 65 71 75 65 73 74  he first request
25e40 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61 73   to lock databas
25e50 65 20 66 69 6c 65 20 69 73 20 6d 61 64 65 2e 20  e file is made. 
25e60 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63 68 65   .** This matche
25e70 73 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20  s the semantics 
25e80 6f 66 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e  of the tradition
25e90 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76  al locking behav
25ea0 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70  ior, where.** op
25eb0 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69  ening a connecti
25ec0 6f 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73 65  on to a database
25ed0 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74   file does not t
25ee0 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74  ake a lock on it
25ef0 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20  ..** The shared 
25f00 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e  lock and an open
25f10 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
25f20 20 61 72 65 20 6d 61 69 6e 74 61 69 6e 65 64 20   are maintained 
25f30 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f  until .** the co
25f40 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nnection to the 
25f50 64 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73  database is clos
25f60 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ed. .**.** The p
25f70 72 6f 78 79 20 66 69 6c 65 20 61 6e 64 20 74 68  roxy file and th
25f80 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65 20  e lock file are 
25f90 6e 65 76 65 72 20 64 65 6c 65 74 65 64 20 73 6f  never deleted so
25fa0 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a   they only need.
25fb0 2a 2a 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  ** to be created
25fc0 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
25fd0 74 68 65 79 20 61 72 65 20 75 73 65 64 2e 0a 2a  they are used..*
25fe0 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69  *.** Configurati
25ff0 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d  on options.** --
26000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26010 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54  ---.**.**  SQLIT
26020 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
26030 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20  OCKING.**.**    
26040 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65     Database file
26050 73 20 61 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f  s accessed on no
26060 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73  n-local file sys
26070 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20 20  tems are.**     
26080 20 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20    automatically 
26090 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 70  configured for p
260a0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f  roxy locking, lo
260b0 63 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20  ck files are.** 
260c0 20 20 20 20 20 20 6e 61 6d 65 64 20 61 75 74 6f        named auto
260d0 6d 61 74 69 63 61 6c 6c 79 20 75 73 69 6e 67 20  matically using 
260e0 74 68 65 20 73 61 6d 65 20 6c 6f 67 69 63 20 61  the same logic a
260f0 73 0a 2a 2a 20 20 20 20 20 20 20 50 52 41 47 4d  s.**       PRAGM
26100 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  A lock_proxy_fil
26110 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20  e=":auto:".**   
26120 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f   .**  SQLITE_PRO
26130 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20  XY_DEBUG.**.**  
26140 20 20 20 20 20 45 6e 61 62 6c 65 73 20 74 68 65       Enables the
26150 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72 72 6f   logging of erro
26160 72 20 6d 65 73 73 61 67 65 73 20 64 75 72 69 6e  r messages durin
26170 67 20 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a  g host id file.*
26180 2a 20 20 20 20 20 20 20 72 65 74 72 69 65 76 61  *       retrieva
26190 6c 20 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a  l and creation.*
261a0 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44  *.**  LOCKPROXYD
261b0 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f  IR.**.**       O
261c0 76 65 72 72 69 64 65 73 20 74 68 65 20 64 65 66  verrides the def
261d0 61 75 6c 74 20 64 69 72 65 63 74 6f 72 79 20 75  ault directory u
261e0 73 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f  sed for lock pro
261f0 78 79 20 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a  xy files that.**
26200 20 20 20 20 20 20 20 61 72 65 20 6e 61 6d 65 64         are named
26210 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76   automatically v
26220 69 61 20 74 68 65 20 22 3a 61 75 74 6f 3a 22 20  ia the ":auto:" 
26230 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53  setting.**.**  S
26240 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
26250 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
26260 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50  NS.**.**       P
26270 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75 73  ermissions to us
26280 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
26290 61 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20  a directory for 
262a0 73 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20  storing the.**  
262b0 20 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20       lock proxy 
262c0 66 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64  files, only used
262d0 20 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44   when LOCKPROXYD
262e0 49 52 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a  IR is not set..*
262f0 2a 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20  *    .**    .** 
26300 41 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f  As mentioned abo
26310 76 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65  ve, when compile
26320 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 50 52  d with SQLITE_PR
26330 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
26340 4e 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74  NG,.** setting t
26350 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  he environment v
26360 61 72 69 61 62 6c 65 20 53 51 4c 49 54 45 5f 46  ariable SQLITE_F
26370 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  ORCE_PROXY_LOCKI
26380 4e 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20  NG to 1 will.** 
26390 66 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b  force proxy lock
263a0 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20 66  ing to be used f
263b0 6f 72 20 65 76 65 72 79 20 64 61 74 61 62 61 73  or every databas
263c0 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61  e file opened, a
263d0 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72  nd 0.** will for
263e0 63 65 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f  ce automatic pro
263f0 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65  xy locking to be
26400 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 61 6c   disabled for al
26410 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  l database.** fi
26420 6c 65 73 20 28 65 78 70 6c 69 63 69 74 79 20 63  les (explicity c
26430 61 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c 49 54  alling the SQLIT
26440 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
26450 49 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a  ILE pragma or.**
26460 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e   sqlite_file_con
26470 74 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20  trol API is not 
26480 61 66 66 65 63 74 65 64 20 62 79 20 53 51 4c 49  affected by SQLI
26490 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
264a0 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a  OCKING)..*/../*.
264b0 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ** Proxy locking
264c0 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62   is only availab
264d0 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f  le on MacOSX .*/
264e0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
264f0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
26500 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
26510 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68  _STYLE../*.** Th
26520 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  e proxyLockingCo
26530 6e 74 65 78 74 20 68 61 73 20 74 68 65 20 70 61  ntext has the pa
26540 74 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75  th and file stru
26550 63 74 75 72 65 73 20 66 6f 72 20 74 68 65 20 72  ctures for the r
26560 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f  emote .** and lo
26570 63 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20  cal proxy files 
26580 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66  in it.*/.typedef
26590 20 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63   struct proxyLoc
265a0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78  kingContext prox
265b0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  yLockingContext;
265c0 0a 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63  .struct proxyLoc
265d0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20  kingContext {.  
265e0 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
265f0 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ile;         /* 
26600 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20  Open conch file 
26610 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68  */.  char *conch
26620 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20  FilePath;       
26630 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
26640 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20   conch file */. 
26650 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50   unixFile *lockP
26660 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  roxy;         /*
26670 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b   Open proxy lock
26680 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
26690 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20  *lockProxyPath; 
266a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
266b0 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63  of the proxy loc
266c0 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  k file */.  char
266d0 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20   *dbPath;       
266e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
266f0 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
26700 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68  e */.  int conch
26710 48 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  Held;           
26720 20 20 20 20 2f 2a 20 31 20 69 66 20 74 68 65 20      /* 1 if the 
26730 63 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c 20 2d  conch is held, -
26740 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f  1 if lockless */
26750 0a 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b  .  void *oldLock
26760 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20  ingContext;     
26770 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b  /* Original lock
26780 69 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20 72 65  ingcontext to re
26790 73 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a  store on close *
267a0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  /.  sqlite3_io_m
267b0 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f  ethods const *pO
267c0 6c 64 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a  ldMethod;     /*
267d0 20 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65   Original I/O me
267e0 74 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73 65 20  thods for close 
267f0 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  */.};../* .** Th
26800 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c  e proxy lock fil
26810 65 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 64  e path for the d
26820 61 74 61 62 61 73 65 20 61 74 20 64 62 50 61 74  atabase at dbPat
26830 68 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  h is written int
26840 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a 20 77 68 69  o lPath, .** whi
26850 63 68 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ch must point to
26860 20 76 61 6c 69 64 2c 20 77 72 69 74 61 62 6c 65   valid, writable
26870 20 6d 65 6d 6f 72 79 20 6c 61 72 67 65 20 65 6e   memory large en
26880 6f 75 67 68 20 66 6f 72 20 61 20 6d 61 78 4c 65  ough for a maxLe
26890 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20 66 69 6c 65  n length.** file
268a0 20 70 61 74 68 2e 20 0a 2a 2f 0a 73 74 61 74 69   path. .*/.stati
268b0 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f  c int proxyGetLo
268c0 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61  ckPath(const cha
268d0 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20  r *dbPath, char 
268e0 2a 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d  *lPath, size_t m
268f0 61 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65  axLen){.  int le
26900 6e 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a  n;.  int dbLen;.
26910 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66    int i;..#ifdef
26920 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 20 20   LOCKPROXYDIR.  
26930 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50  len = strlcpy(lP
26940 61 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49  ath, LOCKPROXYDI
26950 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73  R, maxLen);.#els
26960 65 0a 23 20 69 66 64 65 66 20 5f 43 53 5f 44 41  e.# ifdef _CS_DA
26970 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44  RWIN_USER_TEMP_D
26980 49 52 0a 20 20 7b 0a 20 20 20 20 69 66 28 20 21  IR.  {.    if( !
26990 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57  confstr(_CS_DARW
269a0 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52  IN_USER_TEMP_DIR
269b0 2c 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29  , lPath, maxLen)
269c0 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
269d0 45 34 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20  E4("GETLOCKPATH 
269e0 20 66 61 69 6c 65 64 20 25 73 20 65 72 72 6e 6f   failed %s errno
269f0 3d 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20  =%d pid=%d\n",. 
26a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 50                lP
26a10 61 74 68 2c 20 65 72 72 6e 6f 2c 20 67 65 74 70  ath, errno, getp
26a20 69 64 28 29 29 3b 0a 20 20 20 20 20 20 72 65 74  id());.      ret
26a30 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
26a40 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  _LOCK;.    }.   
26a50 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c   len = strlcat(l
26a60 50 61 74 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f  Path, "sqliteplo
26a70 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20  cks", maxLen);  
26a80 20 20 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20    .  }.# else.  
26a90 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50  len = strlcpy(lP
26aa0 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61  ath, "/tmp/", ma
26ab0 78 4c 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23  xLen);.# endif.#
26ac0 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6c 50 61  endif..  if( lPa
26ad0 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29  th[len-1]!='/' )
26ae0 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c  {.    len = strl
26af0 63 61 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20  cat(lPath, "/", 
26b00 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a  maxLen);.  }.  .
26b10 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74    /* transform t
26b20 68 65 20 64 62 20 70 61 74 68 20 74 6f 20 61 20  he db path to a 
26b30 75 6e 69 71 75 65 20 63 61 63 68 65 20 6e 61 6d  unique cache nam
26b40 65 20 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28  e */.  dbLen = (
26b50 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74  int)strlen(dbPat
26b60 68 29 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20  h);.  for( i=0; 
26b70 69 3c 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65  i<dbLen && (i+le
26b80 6e 2b 37 29 3c 6d 61 78 4c 65 6e 3b 20 69 2b 2b  n+7)<maxLen; i++
26b90 29 7b 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20  ){.    char c = 
26ba0 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 6c  dbPath[i];.    l
26bb0 50 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63  Path[i+len] = (c
26bc0 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20 20  =='/')?'_':c;.  
26bd0 7d 0a 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d  }.  lPath[i+len]
26be0 3d 27 5c 30 27 3b 0a 20 20 73 74 72 6c 63 61 74  ='\0';.  strlcat
26bf0 28 6c 50 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22  (lPath, ":auto:"
26c00 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 4f 53 54  , maxLen);.  OST
26c10 52 41 43 45 33 28 22 47 45 54 4c 4f 43 4b 50 41  RACE3("GETLOCKPA
26c20 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70  TH  proxy lock p
26c30 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22  ath=%s pid=%d\n"
26c40 2c 20 6c 50 61 74 68 2c 20 67 65 74 70 69 64 28  , lPath, getpid(
26c50 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
26c60 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20  ITE_OK;.}../* . 
26c70 2a 2a 20 43 72 65 61 74 65 73 20 74 68 65 20 6c  ** Creates the l
26c80 6f 63 6b 20 66 69 6c 65 20 61 6e 64 20 61 6e 79  ock file and any
26c90 20 6d 69 73 73 69 6e 67 20 64 69 72 65 63 74 6f   missing directo
26ca0 72 69 65 73 20 69 6e 20 6c 6f 63 6b 50 61 74 68  ries in lockPath
26cb0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
26cc0 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50  proxyCreateLockP
26cd0 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ath(const char *
26ce0 6c 6f 63 6b 50 61 74 68 29 7b 0a 20 20 69 6e 74  lockPath){.  int
26cf0 20 69 2c 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20   i, len;.  char 
26d00 62 75 66 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b  buf[MAXPATHLEN];
26d10 0a 20 20 69 6e 74 20 73 74 61 72 74 20 3d 20 30  .  int start = 0
26d20 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 6c 6f  ;.  .  assert(lo
26d30 63 6b 50 61 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20  ckPath!=NULL);. 
26d40 20 2f 2a 20 74 72 79 20 74 6f 20 63 72 65 61 74   /* try to creat
26d50 65 20 61 6c 6c 20 74 68 65 20 69 6e 74 65 72 6d  e all the interm
26d60 65 64 69 61 74 65 20 64 69 72 65 63 74 6f 72 69  ediate directori
26d70 65 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d 20 28 69  es */.  len = (i
26d80 6e 74 29 73 74 72 6c 65 6e 28 6c 6f 63 6b 50 61  nt)strlen(lockPa
26d90 74 68 29 3b 0a 20 20 62 75 66 5b 30 5d 20 3d 20  th);.  buf[0] = 
26da0 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a 20 20 66  lockPath[0];.  f
26db0 6f 72 28 20 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20  or( i=1; i<len; 
26dc0 69 2b 2b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c  i++ ){.    if( l
26dd0 6f 63 6b 50 61 74 68 5b 69 5d 20 3d 3d 20 27 2f  ockPath[i] == '/
26de0 27 20 26 26 20 28 69 20 2d 20 73 74 61 72 74 20  ' && (i - start 
26df0 3e 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  > 0) ){.      /*
26e00 20 6f 6e 6c 79 20 6d 6b 64 69 72 20 69 66 20 6c   only mkdir if l
26e10 65 61 66 20 64 69 72 20 21 3d 20 22 2e 22 20 6f  eaf dir != "." o
26e20 72 20 22 2f 22 20 6f 72 20 22 2e 2e 22 20 2a 2f  r "/" or ".." */
26e30 0a 20 20 20 20 20 20 69 66 28 20 69 2d 73 74 61  .      if( i-sta
26e40 72 74 3e 32 20 7c 7c 20 28 69 2d 73 74 61 72 74  rt>2 || (i-start
26e50 3d 3d 31 20 26 26 20 62 75 66 5b 73 74 61 72 74  ==1 && buf[start
26e60 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b  ] != '.' && buf[
26e70 73 74 61 72 74 5d 20 21 3d 20 27 2f 27 29 20 0a  start] != '/') .
26e80 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 2d 73           || (i-s
26e90 74 61 72 74 3d 3d 32 20 26 26 20 62 75 66 5b 73  tart==2 && buf[s
26ea0 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20  tart] != '.' && 
26eb0 62 75 66 5b 73 74 61 72 74 2b 31 5d 20 21 3d 20  buf[start+1] != 
26ec0 27 2e 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '.') ){.        
26ed0 62 75 66 5b 69 5d 3d 27 5c 30 27 3b 0a 20 20 20  buf[i]='\0';.   
26ee0 20 20 20 20 20 69 66 28 20 6d 6b 64 69 72 28 62       if( mkdir(b
26ef0 75 66 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  uf, SQLITE_DEFAU
26f00 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d  LT_PROXYDIR_PERM
26f10 49 53 53 49 4f 4e 53 29 20 29 7b 0a 20 20 20 20  ISSIONS) ){.    
26f20 20 20 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72        int err=er
26f30 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 69  rno;.          i
26f40 66 28 20 65 72 72 21 3d 45 45 58 49 53 54 20 29  f( err!=EEXIST )
26f50 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f   {.            O
26f60 53 54 52 41 43 45 35 28 22 43 52 45 41 54 45 4c  STRACE5("CREATEL
26f70 4f 43 4b 50 41 54 48 20 20 46 41 49 4c 45 44 20  OCKPATH  FAILED 
26f80 63 72 65 61 74 69 6e 67 20 25 73 2c 20 22 0a 20  creating %s, ". 
26f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26fa0 20 20 20 20 22 27 25 73 27 20 70 72 6f 78 79 20      "'%s' proxy 
26fb0 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64  lock path=%s pid
26fc0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
26fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66               buf
26fe0 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72 29 2c  , strerror(err),
26ff0 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74 70 69   lockPath, getpi
27000 64 28 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d());.          
27010 20 20 72 65 74 75 72 6e 20 65 72 72 3b 0a 20 20    return err;.  
27020 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27030 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
27040 20 20 73 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20    start=i+1;.   
27050 20 7d 0a 20 20 20 20 62 75 66 5b 69 5d 20 3d 20   }.    buf[i] = 
27060 6c 6f 63 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d  lockPath[i];.  }
27070 0a 20 20 4f 53 54 52 41 43 45 33 28 22 43 52 45  .  OSTRACE3("CRE
27080 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f  ATELOCKPATH  pro
27090 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20  xy lock path=%s 
270a0 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50  pid=%d\n", lockP
270b0 61 74 68 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  ath, getpid());.
270c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
270d0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
270e0 77 20 56 46 53 20 66 69 6c 65 20 64 65 73 63 72  w VFS file descr
270f0 69 70 74 6f 72 20 28 73 74 6f 72 65 64 20 69 6e  iptor (stored in
27100 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
27110 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
27120 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65  _malloc) and ope
27130 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64  n the file named
27140 20 22 70 61 74 68 22 20 69 6e 20 74 68 65 20 66   "path" in the f
27150 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a  ile descriptor..
27160 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
27170 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
27180 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f  not only for clo
27190 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 65  sing the file de
271a0 73 63 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20  scriptor.** but 
271b0 61 6c 73 6f 20 66 6f 72 20 66 72 65 65 69 6e 67  also for freeing
271c0 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f   the memory asso
271d0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
271e0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
271f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
27200 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69  roxyCreateUnixFi
27210 6c 65 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le(.    const ch
27220 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20  ar *path,       
27230 20 2f 2a 20 70 61 74 68 20 66 6f 72 20 74 68 65   /* path for the
27240 20 6e 65 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f   new unixFile */
27250 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a  .    unixFile **
27260 70 70 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a  ppFile,       /*
27270 20 75 6e 69 78 46 69 6c 65 20 63 72 65 61 74 65   unixFile create
27280 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 62  d and returned b
27290 79 20 72 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74  y ref */.    int
272a0 20 69 73 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20   islockfile     
272b0 20 20 20 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20        /* if non 
272c0 7a 65 72 6f 20 6d 69 73 73 69 6e 67 20 64 69 72  zero missing dir
272d0 73 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65  s will be create
272e0 64 20 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66  d */.) {.  int f
272f0 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 64 69  d = -1;.  int di
27300 72 66 64 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78  rfd = -1;.  unix
27310 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  File *pNew;.  in
27320 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
27330 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  ;.  int openFlag
27340 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43  s = O_RDWR | O_C
27350 52 45 41 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f  REAT;.  sqlite3_
27360 76 66 73 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20  vfs dummyVfs;.  
27370 69 6e 74 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a  int terrno = 0;.
27380 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
27390 70 55 6e 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a  pUnused = NULL;.
273a0 0a 20 20 2f 2a 20 31 2e 20 66 69 72 73 74 20 74  .  /* 1. first t
273b0 72 79 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74  ry to open/creat
273c0 65 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  e the file.  ** 
273d0 32 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c 73  2. if that fails
273e0 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 61 20  , and this is a 
273f0 6c 6f 63 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63  lock file (not-c
27400 6f 6e 63 68 29 2c 20 74 72 79 20 63 72 65 61 74  onch), try creat
27410 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 70 61 72  ing.  ** the par
27420 65 6e 74 20 64 69 72 65 63 74 6f 72 69 65 73 20  ent directories 
27430 61 6e 64 20 74 68 65 6e 20 74 72 79 20 61 67 61  and then try aga
27440 69 6e 2e 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74  in..  ** 3. if t
27450 68 61 74 20 66 61 69 6c 73 2c 20 74 72 79 20 74  hat fails, try t
27460 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  o open the file 
27470 72 65 61 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f  read-only.  ** o
27480 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
27490 42 55 53 59 20 28 69 66 20 6c 6f 63 6b 20 66 69  BUSY (if lock fi
274a0 6c 65 29 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20  le) or CANTOPEN 
274b0 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69  for the conch fi
274c0 6c 65 0a 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65  le.  */.  pUnuse
274d0 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65  d = findReusable
274e0 46 64 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  Fd(path, openFla
274f0 67 73 29 3b 0a 20 20 69 66 28 20 70 55 6e 75 73  gs);.  if( pUnus
27500 65 64 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 70  ed ){.    fd = p
27510 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65  Unused->fd;.  }e
27520 6c 73 65 7b 0a 20 20 20 20 70 55 6e 75 73 65 64  lse{.    pUnused
27530 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
27540 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65  c(sizeof(*pUnuse
27550 64 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 55  d));.    if( !pU
27560 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 72  nused ){.      r
27570 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
27580 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
27590 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
275a0 66 64 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c 20  fd = open(path, 
275b0 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54  openFlags, SQLIT
275c0 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
275d0 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20  ERMISSIONS);.   
275e0 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   terrno = errno;
275f0 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26  .    if( fd<0 &&
27600 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26   errno==ENOENT &
27610 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a  & islockfile ){.
27620 20 20 20 20 20 20 69 66 28 20 70 72 6f 78 79 43        if( proxyC
27630 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 70 61  reateLockPath(pa
27640 74 68 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b  th) == SQLITE_OK
27650 20 29 7b 0a 20 20 20 20 20 20 20 20 66 64 20 3d   ){.        fd =
27660 20 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e   open(path, open
27670 46 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45  Flags, SQLITE_DE
27680 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
27690 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20 7d  SSIONS);.      }
276a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
276b0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6f 70 65   fd<0 ){.    ope
276c0 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c  nFlags = O_RDONL
276d0 59 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e  Y;.    fd = open
276e0 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
276f0 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
27700 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
27710 53 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d  S);.    terrno =
27720 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66   errno;.  }.  if
27730 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 69 66  ( fd<0 ){.    if
27740 28 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a  ( islockfile ){.
27750 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
27760 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
27770 20 20 20 20 73 77 69 74 63 68 20 28 74 65 72 72      switch (terr
27780 6e 6f 29 20 7b 0a 20 20 20 20 20 20 63 61 73 65  no) {.      case
27790 20 45 41 43 43 45 53 3a 0a 20 20 20 20 20 20 20   EACCES:.       
277a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
277b0 45 52 4d 3b 0a 20 20 20 20 20 20 63 61 73 65 20  ERM;.      case 
277c0 45 49 4f 3a 20 0a 20 20 20 20 20 20 20 20 72 65  EIO: .        re
277d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
277e0 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20  R_LOCK; /* even 
277f0 74 68 6f 75 67 68 20 69 74 20 69 73 20 74 68 65  though it is the
27800 20 63 6f 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20   conch */.      
27810 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
27820 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
27830 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
27840 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 70 4e 65    }.  }.  .  pNe
27850 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  w = (unixFile *)
27860 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
27870 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20  izeof(*pNew));. 
27880 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20   if( pNew==NULL 
27890 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
278a0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
278b0 74 6f 20 65 6e 64 5f 63 72 65 61 74 65 5f 70 72  to end_create_pr
278c0 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  oxy;.  }.  memse
278d0 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f  t(pNew, 0, sizeo
278e0 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20  f(unixFile));.  
278f0 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  pNew->openFlags 
27900 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 64  = openFlags;.  d
27910 75 6d 6d 79 56 66 73 2e 70 41 70 70 44 61 74 61  ummyVfs.pAppData
27920 20 3d 20 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c   = (void*)&autol
27930 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a 20 20 70  ockIoFinder;.  p
27940 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b  Unused->fd = fd;
27950 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67  .  pUnused->flag
27960 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20  s = openFlags;. 
27970 20 70 4e 65 77 2d 3e 70 55 6e 75 73 65 64 20 3d   pNew->pUnused =
27980 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72   pUnused;.  .  r
27990 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
279a0 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c 20 66 64  le(&dummyVfs, fd
279b0 2c 20 64 69 72 66 64 2c 20 28 73 71 6c 69 74 65  , dirfd, (sqlite
279c0 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20 70 61  3_file*)pNew, pa
279d0 74 68 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28  th, 0, 0);.  if(
279e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
279f0 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65 20 3d 20  {.    *ppFile = 
27a00 70 4e 65 77 3b 0a 20 20 20 20 72 65 74 75 72 6e  pNew;.    return
27a10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
27a20 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79  end_create_proxy
27a30 3a 20 20 20 20 0a 20 20 63 6c 6f 73 65 28 66 64  :    .  close(fd
27a40 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c  ); /* silently l
27a50 65 61 6b 20 66 64 20 69 66 20 65 72 72 6f 72 2c  eak fd if error,
27a60 20 77 65 27 72 65 20 61 6c 72 65 61 64 79 20 69   we're already i
27a70 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 73 71 6c  n error */.  sql
27a80 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
27a90 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
27aa0 70 55 6e 75 73 65 64 29 3b 0a 20 20 72 65 74 75  pUnused);.  retu
27ab0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65  rn rc;.}..#if de
27ac0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
27ad0 54 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  T) && defined(__
27ae0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
27af0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
27b00 47 5f 53 54 59 4c 45 0a 2f 2a 20 73 69 6d 75 6c  G_STYLE./* simul
27b10 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73  ate multiple hos
27b20 74 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 75  ts by creating u
27b30 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c  nique hostid fil
27b40 65 20 70 61 74 68 73 20 2a 2f 0a 69 6e 74 20 73  e paths */.int s
27b50 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
27b60 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  m = 0;.#endif..#
27b70 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 4f 53  define PROXY_HOS
27b80 54 49 44 4c 45 4e 20 20 20 20 31 36 20 20 2f 2a  TIDLEN    16  /*
27b90 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 6f 73 74   conch file host
27ba0 20 69 64 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a 2f   id length */../
27bb0 2a 20 67 65 74 20 74 68 65 20 68 6f 73 74 20 49  * get the host I
27bc0 44 20 76 69 61 20 67 65 74 68 6f 73 74 75 75 69  D via gethostuui
27bd0 64 28 29 2c 20 70 48 6f 73 74 49 44 20 6d 75 73  d(), pHostID mus
27be0 74 20 70 6f 69 6e 74 20 74 6f 20 50 52 4f 58 59  t point to PROXY
27bf0 5f 48 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a 20 62  _HOSTIDLEN .** b
27c00 79 74 65 73 20 6f 66 20 77 72 69 74 61 62 6c 65  ytes of writable
27c10 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
27c20 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 48  ic int proxyGetH
27c30 6f 73 74 49 44 28 75 6e 73 69 67 6e 65 64 20 63  ostID(unsigned c
27c40 68 61 72 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e  har *pHostID, in
27c50 74 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 73 74  t *pError){.  st
27c60 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 74 69  ruct timespec ti
27c70 6d 65 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20  meout = {1, 0}; 
27c80 2f 2a 20 31 20 73 65 63 20 74 69 6d 65 6f 75 74  /* 1 sec timeout
27c90 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28   */.  .  assert(
27ca0 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20  PROXY_HOSTIDLEN 
27cb0 3d 3d 20 73 69 7a 65 6f 66 28 75 75 69 64 5f 74  == sizeof(uuid_t
27cc0 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 48 6f  ));.  memset(pHo
27cd0 73 74 49 44 2c 20 30 2c 20 50 52 4f 58 59 5f 48  stID, 0, PROXY_H
27ce0 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 69 66 28  OSTIDLEN);.  if(
27cf0 20 67 65 74 68 6f 73 74 75 75 69 64 28 70 48 6f   gethostuuid(pHo
27d00 73 74 49 44 2c 20 26 74 69 6d 65 6f 75 74 29 20  stID, &timeout) 
27d10 29 7b 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d  ){.    int err =
27d20 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20   errno;.    if( 
27d30 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  pError ){.      
27d40 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a 20  *pError = err;. 
27d50 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
27d60 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
27d70 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
27d80 54 45 53 54 0a 20 20 2f 2a 20 73 69 6d 75 6c 61  TEST.  /* simula
27d90 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74  te multiple host
27da0 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e  s by creating un
27db0 69 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65  ique hostid file
27dc0 20 70 61 74 68 73 20 2a 2f 0a 20 20 69 66 28 20   paths */.  if( 
27dd0 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e  sqlite3_hostid_n
27de0 75 6d 20 21 3d 20 30 29 7b 0a 20 20 20 20 70 48  um != 0){.    pH
27df0 6f 73 74 49 44 5b 30 5d 20 3d 20 28 63 68 61 72  ostID[0] = (char
27e00 29 28 70 48 6f 73 74 49 44 5b 30 5d 20 2b 20 28  )(pHostID[0] + (
27e10 63 68 61 72 29 28 73 71 6c 69 74 65 33 5f 68 6f  char)(sqlite3_ho
27e20 73 74 69 64 5f 6e 75 6d 20 26 20 30 78 46 46 29  stid_num & 0xFF)
27e30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
27e40 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
27e50 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63  _OK;.}../* The c
27e60 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 61 69  onch file contai
27e70 6e 73 20 74 68 65 20 68 65 61 64 65 72 2c 20 68  ns the header, h
27e80 6f 73 74 20 69 64 20 61 6e 64 20 6c 6f 63 6b 20  ost id and lock 
27e90 66 69 6c 65 20 70 61 74 68 0a 20 2a 2f 0a 23 64  file path. */.#d
27ea0 65 66 69 6e 65 20 50 52 4f 58 59 5f 43 4f 4e 43  efine PROXY_CONC
27eb0 48 56 45 52 53 49 4f 4e 20 32 20 20 20 2f 2a 20  HVERSION 2   /* 
27ec0 31 2d 62 79 74 65 20 68 65 61 64 65 72 2c 20 31  1-byte header, 1
27ed0 36 2d 62 79 74 65 20 68 6f 73 74 20 69 64 2c 20  6-byte host id, 
27ee0 70 61 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20  path */.#define 
27ef0 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 20  PROXY_HEADERLEN 
27f00 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e 63 68 20     1   /* conch 
27f10 66 69 6c 65 20 68 65 61 64 65 72 20 6c 65 6e 67  file header leng
27f20 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  th */.#define PR
27f30 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 20 20  OXY_PATHINDEX   
27f40 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45   (PROXY_HEADERLE
27f50 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  N+PROXY_HOSTIDLE
27f60 4e 29 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  N).#define PROXY
27f70 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 20 20 28 50  _MAXCONCHLEN  (P
27f80 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50  ROXY_HEADERLEN+P
27f90 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d  ROXY_HOSTIDLEN+M
27fa0 41 58 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a  AXPATHLEN)../* .
27fb0 2a 2a 20 54 61 6b 65 73 20 61 6e 20 6f 70 65 6e  ** Takes an open
27fc0 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 63 6f 70   conch file, cop
27fd0 69 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ies the contents
27fe0 20 74 6f 20 61 20 6e 65 77 20 70 61 74 68 20 61   to a new path a
27ff0 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73 20 0a 2a  nd then moves .*
28000 2a 20 69 74 20 62 61 63 6b 2e 20 20 54 68 65 20  * it back.  The 
28010 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 66 69  newly created fi
28020 6c 65 27 73 20 66 69 6c 65 20 64 65 73 63 72 69  le's file descri
28030 70 74 6f 72 20 69 73 20 61 73 73 69 67 6e 65 64  ptor is assigned
28040 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 63 68   to the.** conch
28050 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20   file structure 
28060 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68 65 20  and finally the 
28070 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63 68 20 66  original conch f
28080 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
28090 73 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20 20 52  s .** closed.  R
280a0 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 73  eturns zero if s
280b0 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74  uccessful..*/.st
280c0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 42 72  atic int proxyBr
280d0 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69  eakConchLock(uni
280e0 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75  xFile *pFile, uu
280f0 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 29 7b 0a  id_t myHostID){.
28100 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
28110 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
28120 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
28130 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
28140 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75  ingContext; .  u
28150 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
28160 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68  le = pCtx->conch
28170 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 74 50 61  File;.  char tPa
28180 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a  th[MAXPATHLEN];.
28190 20 20 63 68 61 72 20 62 75 66 5b 50 52 4f 58 59    char buf[PROXY
281a0 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20  _MAXCONCHLEN];. 
281b0 20 63 68 61 72 20 2a 63 50 61 74 68 20 3d 20 70   char *cPath = p
281c0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
281d0 74 68 3b 0a 20 20 73 69 7a 65 5f 74 20 72 65 61  th;.  size_t rea
281e0 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 73 69 7a 65  dLen = 0;.  size
281f0 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 30 3b 0a  _t pathLen = 0;.
28200 20 20 63 68 61 72 20 65 72 72 6d 73 67 5b 36 34    char errmsg[64
28210 5d 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20 66 64  ] = "";.  int fd
28220 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20   = -1;.  int rc 
28230 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 63 72 65 61  = -1;..  /* crea
28240 74 65 20 61 20 6e 65 77 20 70 61 74 68 20 62 79  te a new path by
28250 20 72 65 70 6c 61 63 65 20 74 68 65 20 74 72 61   replace the tra
28260 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20 77  iling '-conch' w
28270 69 74 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f 0a  ith '-break' */.
28280 20 20 70 61 74 68 4c 65 6e 20 3d 20 73 74 72 6c    pathLen = strl
28290 63 70 79 28 74 50 61 74 68 2c 20 63 50 61 74 68  cpy(tPath, cPath
282a0 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
282b0 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41 58   if( pathLen>MAX
282c0 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68 4c  PATHLEN || pathL
282d0 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28 73  en<6 || .     (s
282e0 74 72 6c 63 70 79 28 26 74 50 61 74 68 5b 70 61  trlcpy(&tPath[pa
282f0 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61 6b  thLen-5], "break
28300 22 2c 20 36 29 20 21 3d 20 35 29 20 29 7b 0a 20  ", 6) != 5) ){. 
28310 20 20 20 73 70 72 69 6e 74 66 28 65 72 72 6d 73     sprintf(errms
28320 67 2c 20 22 70 61 74 68 20 65 72 72 6f 72 20 28  g, "path error (
28330 6c 65 6e 20 25 64 29 22 2c 20 28 69 6e 74 29 70  len %d)", (int)p
28340 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74  athLen);.    got
28350 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
28360 0a 20 20 7d 0a 20 20 2f 2a 20 72 65 61 64 20 74  .  }.  /* read t
28370 68 65 20 63 6f 6e 63 68 20 63 6f 6e 74 65 6e 74  he conch content
28380 20 2a 2f 0a 20 20 72 65 61 64 4c 65 6e 20 3d 20   */.  readLen = 
28390 70 72 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d  pread(conchFile-
283a0 3e 68 2c 20 62 75 66 2c 20 50 52 4f 58 59 5f 4d  >h, buf, PROXY_M
283b0 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a  AXCONCHLEN, 0);.
283c0 20 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 50 52    if( readLen<PR
283d0 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 29 7b  OXY_PATHINDEX ){
283e0 0a 20 20 20 20 73 70 72 69 6e 74 66 28 65 72 72  .    sprintf(err
283f0 6d 73 67 2c 20 22 72 65 61 64 20 65 72 72 6f 72  msg, "read error
28400 20 28 6c 65 6e 20 25 64 29 22 2c 20 28 69 6e 74   (len %d)", (int
28410 29 72 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67  )readLen);.    g
28420 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
28430 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74  k;.  }.  /* writ
28440 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20  e it out to the 
28450 74 65 6d 70 6f 72 61 72 79 20 62 72 65 61 6b 20  temporary break 
28460 66 69 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20 6f  file */.  fd = o
28470 70 65 6e 28 74 50 61 74 68 2c 20 28 4f 5f 52 44  pen(tPath, (O_RD
28480 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43  WR|O_CREAT|O_EXC
28490 4c 29 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  L), SQLITE_DEFAU
284a0 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
284b0 4f 4e 53 29 3b 0a 20 20 69 66 28 20 66 64 3c 30  ONS);.  if( fd<0
284c0 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28   ){.    sprintf(
284d0 65 72 72 6d 73 67 2c 20 22 63 72 65 61 74 65 20  errmsg, "create 
284e0 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72  failed (%d)", er
284f0 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  rno);.    goto e
28500 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
28510 7d 0a 20 20 69 66 28 20 70 77 72 69 74 65 28 66  }.  if( pwrite(f
28520 64 2c 20 62 75 66 2c 20 72 65 61 64 4c 65 6e 2c  d, buf, readLen,
28530 20 30 29 20 21 3d 20 72 65 61 64 4c 65 6e 20 29   0) != readLen )
28540 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 65 72  {.    sprintf(er
28550 72 6d 73 67 2c 20 22 77 72 69 74 65 20 66 61 69  rmsg, "write fai
28560 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f  led (%d)", errno
28570 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
28580 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  breaklock;.  }. 
28590 20 69 66 28 20 72 65 6e 61 6d 65 28 74 50 61 74   if( rename(tPat
285a0 68 2c 20 63 50 61 74 68 29 20 29 7b 0a 20 20 20  h, cPath) ){.   
285b0 20 73 70 72 69 6e 74 66 28 65 72 72 6d 73 67 2c   sprintf(errmsg,
285c0 20 22 72 65 6e 61 6d 65 20 66 61 69 6c 65 64 20   "rename failed 
285d0 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20  (%d)", errno);. 
285e0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
285f0 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20  klock;.  }.  rc 
28600 3d 20 30 3b 0a 20 20 66 70 72 69 6e 74 66 28 73  = 0;.  fprintf(s
28610 74 64 65 72 72 2c 20 22 62 72 6f 6b 65 20 73 74  tderr, "broke st
28620 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e  ale lock on %s\n
28630 22 2c 20 63 50 61 74 68 29 3b 0a 20 20 63 6c 6f  ", cPath);.  clo
28640 73 65 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 29  se(conchFile->h)
28650 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  ;.  conchFile->h
28660 20 3d 20 66 64 3b 0a 20 20 63 6f 6e 63 68 46 69   = fd;.  conchFi
28670 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  le->openFlags = 
28680 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54  O_RDWR | O_CREAT
28690 3b 0a 0a 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b  ;..end_breaklock
286a0 3a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  :.  if( rc ){.  
286b0 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20    if( fd>=0 ){. 
286c0 20 20 20 20 20 75 6e 6c 69 6e 6b 28 74 50 61 74       unlink(tPat
286d0 68 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28  h);.      close(
286e0 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  fd);.    }.    f
286f0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
28700 66 61 69 6c 65 64 20 74 6f 20 62 72 65 61 6b 20  failed to break 
28710 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73  stale lock on %s
28720 2c 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20  , %s\n", cPath, 
28730 65 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72  errmsg);.  }.  r
28740 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
28750 54 61 6b 65 20 74 68 65 20 72 65 71 75 65 73 74  Take the request
28760 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63  ed lock on the c
28770 6f 6e 63 68 20 66 69 6c 65 20 61 6e 64 20 62 72  onch file and br
28780 65 61 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b  eak a stale lock
28790 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74   if the .** host
287a0 20 69 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a   id matches..*/.
287b0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
287c0 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69  ConchLock(unixFi
287d0 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f  le *pFile, uuid_
287e0 74 20 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74 20  t myHostID, int 
287f0 6c 6f 63 6b 54 79 70 65 29 7b 0a 20 20 70 72 6f  lockType){.  pro
28800 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
28810 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
28820 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
28830 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
28840 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69  ntext; .  unixFi
28850 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20  le *conchFile = 
28860 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
28870 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
28880 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 72  TE_OK;.  int nTr
28890 69 65 73 20 3d 20 30 3b 0a 20 20 73 74 72 75 63  ies = 0;.  struc
288a0 74 20 74 69 6d 65 73 70 65 63 20 63 6f 6e 63 68  t timespec conch
288b0 4d 6f 64 54 69 6d 65 3b 0a 20 20 0a 20 20 64 6f  ModTime;.  .  do
288c0 20 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63   {.    rc = conc
288d0 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
288e0 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
288f0 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
28900 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 6e  lockType);.    n
28910 54 72 69 65 73 20 2b 2b 3b 0a 20 20 20 20 69 66  Tries ++;.    if
28920 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
28930 59 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  Y ){.      /* If
28940 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 65 64   the lock failed
28950 20 28 62 75 73 79 29 3a 0a 20 20 20 20 20 20 20   (busy):.       
28960 2a 20 31 73 74 20 74 72 79 3a 20 67 65 74 20 74  * 1st try: get t
28970 68 65 20 6d 6f 64 20 74 69 6d 65 20 6f 66 20 74  he mod time of t
28980 68 65 20 63 6f 6e 63 68 2c 20 77 61 69 74 20 30  he conch, wait 0
28990 2e 35 73 20 61 6e 64 20 74 72 79 20 61 67 61 69  .5s and try agai
289a0 6e 2e 20 0a 20 20 20 20 20 20 20 2a 20 32 6e 64  n. .       * 2nd
289b0 20 74 72 79 3a 20 66 61 69 6c 20 69 66 20 74 68   try: fail if th
289c0 65 20 6d 6f 64 20 74 69 6d 65 20 63 68 61 6e 67  e mod time chang
289d0 65 64 20 6f 72 20 68 6f 73 74 20 69 64 20 69 73  ed or host id is
289e0 20 64 69 66 66 65 72 65 6e 74 2c 20 77 61 69 74   different, wait
289f0 20 0a 20 20 20 20 20 20 20 2a 20 20 20 20 20 20   .       *      
28a00 20 20 20 20 20 31 30 20 73 65 63 20 61 6e 64 20       10 sec and 
28a10 74 72 79 20 61 67 61 69 6e 0a 20 20 20 20 20 20  try again.      
28a20 20 2a 20 33 72 64 20 74 72 79 3a 20 62 72 65 61   * 3rd try: brea
28a30 6b 20 74 68 65 20 6c 6f 63 6b 20 75 6e 6c 65 73  k the lock unles
28a40 73 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 68  s the mod time h
28a50 61 73 20 63 68 61 6e 67 65 64 2e 0a 20 20 20 20  as changed..    
28a60 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75     */.      stru
28a70 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20  ct stat buf;.   
28a80 20 20 20 69 66 28 20 66 73 74 61 74 28 63 6f 6e     if( fstat(con
28a90 63 68 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29  chFile->h, &buf)
28aa0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
28ab0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
28ac0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65  rrno;.        re
28ad0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
28ae0 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a  R_LOCK;.      }.
28af0 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28        .      if(
28b00 20 6e 54 72 69 65 73 3d 3d 31 20 29 7b 0a 20 20   nTries==1 ){.  
28b10 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69        conchModTi
28b20 6d 65 20 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d  me = buf.st_mtim
28b30 65 73 70 65 63 3b 0a 20 20 20 20 20 20 20 20 75  espec;.        u
28b40 73 6c 65 65 70 28 35 30 30 30 30 30 29 3b 20 2f  sleep(500000); /
28b50 2a 20 77 61 69 74 20 30 2e 35 20 73 65 63 20 61  * wait 0.5 sec a
28b60 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20  nd try the lock 
28b70 61 67 61 69 6e 2a 2f 0a 20 20 20 20 20 20 20 20  again*/.        
28b80 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20  continue;  .    
28b90 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
28ba0 74 28 20 6e 54 72 69 65 73 3e 31 20 29 3b 0a 20  t( nTries>1 );. 
28bb0 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68 4d 6f       if( conchMo
28bc0 64 54 69 6d 65 2e 74 76 5f 73 65 63 20 21 3d 20  dTime.tv_sec != 
28bd0 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63  buf.st_mtimespec
28be0 2e 74 76 5f 73 65 63 20 7c 7c 20 0a 20 20 20 20  .tv_sec || .    
28bf0 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d       conchModTim
28c00 65 2e 74 76 5f 6e 73 65 63 20 21 3d 20 62 75 66  e.tv_nsec != buf
28c10 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76  .st_mtimespec.tv
28c20 5f 6e 73 65 63 20 29 7b 0a 20 20 20 20 20 20 20  _nsec ){.       
28c30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
28c40 55 53 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  USY;.      }.   
28c50 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54     .      if( nT
28c60 72 69 65 73 3d 3d 32 20 29 7b 20 20 0a 20 20 20  ries==2 ){  .   
28c70 20 20 20 20 20 63 68 61 72 20 74 42 75 66 5b 50       char tBuf[P
28c80 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
28c90 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  ];.        int l
28ca0 65 6e 20 3d 20 70 72 65 61 64 28 63 6f 6e 63 68  en = pread(conch
28cb0 46 69 6c 65 2d 3e 68 2c 20 74 42 75 66 2c 20 50  File->h, tBuf, P
28cc0 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
28cd0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
28ce0 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20  ( len<0 ){.     
28cf0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
28d00 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
28d10 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
28d20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
28d30 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  K;.        }.   
28d40 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 50 52 4f       if( len>PRO
28d50 58 59 5f 50 41 54 48 49 4e 44 45 58 20 26 26 20  XY_PATHINDEX && 
28d60 74 42 75 66 5b 30 5d 3d 3d 28 63 68 61 72 29 50  tBuf[0]==(char)P
28d70 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f  ROXY_CONCHVERSIO
28d80 4e 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  N){.          /*
28d90 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68 65   don't break the
28da0 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 68 6f 73   lock if the hos
28db0 74 20 69 64 20 64 6f 65 73 6e 27 74 20 6d 61 74  t id doesn't mat
28dc0 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ch */.          
28dd0 69 66 28 20 30 21 3d 6d 65 6d 63 6d 70 28 26 74  if( 0!=memcmp(&t
28de0 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44 45 52  Buf[PROXY_HEADER
28df0 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20  LEN], myHostID, 
28e00 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
28e10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
28e20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
28e30 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  SY;.          }.
28e40 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
28e50 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27           /* don'
28e60 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b  t break the lock
28e70 20 6f 6e 20 73 68 6f 72 74 20 72 65 61 64 20 6f   on short read o
28e80 72 20 61 20 76 65 72 73 69 6f 6e 20 6d 69 73 6d  r a version mism
28e90 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
28ea0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28eb0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BUSY;.        }.
28ec0 20 20 20 20 20 20 20 20 75 73 6c 65 65 70 28 31          usleep(1
28ed0 30 30 30 30 30 30 30 29 3b 20 2f 2a 20 77 61 69  0000000); /* wai
28ee0 74 20 31 30 20 73 65 63 20 61 6e 64 20 74 72 79  t 10 sec and try
28ef0 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e 20   the lock again 
28f00 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  */.        conti
28f10 6e 75 65 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  nue; .      }.  
28f20 20 20 20 20 0a 20 20 20 20 20 20 61 73 73 65 72      .      asser
28f30 74 28 20 6e 54 72 69 65 73 3d 3d 33 20 29 3b 0a  t( nTries==3 );.
28f40 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 72 6f        if( 0==pro
28f50 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b  xyBreakConchLock
28f60 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44  (pFile, myHostID
28f70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
28f80 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
28f90 20 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70       if( lockTyp
28fa0 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
28fb0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
28fc0 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
28fd0 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
28fe0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
28ff0 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c  chFile, SHARED_L
29000 4f 43 4b 29 3b 20 20 20 20 20 20 20 20 20 20 0a  OCK);          .
29010 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29020 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20    if( !rc ){.   
29030 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63         rc = conc
29040 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
29050 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
29060 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
29070 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 20  lockType);.     
29080 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
29090 20 7d 0a 20 20 7d 20 77 68 69 6c 65 28 20 72 63   }.  } while( rc
290a0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
290b0 20 6e 54 72 69 65 73 3c 33 20 29 3b 0a 20 20 0a   nTries<3 );.  .
290c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
290d0 2f 2a 20 54 61 6b 65 73 20 74 68 65 20 63 6f 6e  /* Takes the con
290e0 63 68 20 62 79 20 74 61 6b 69 6e 67 20 61 20 73  ch by taking a s
290f0 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 72  hared lock and r
29100 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ead the contents
29110 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a 20 6c   conch, if .** l
29120 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f 6e 2d 4e  ockPath is non-N
29130 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74 20 49 44  ULL, the host ID
29140 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70   and lock file p
29150 61 74 68 20 6d 75 73 74 20 6d 61 74 63 68 2e 20  ath must match. 
29160 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f 63 6b   A NULL .** lock
29170 50 61 74 68 20 6d 65 61 6e 73 20 74 68 61 74 20  Path means that 
29180 74 68 65 20 6c 6f 63 6b 50 61 74 68 20 69 6e 20  the lockPath in 
29190 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77  the conch file w
291a0 69 6c 6c 20 62 65 20 75 73 65 64 20 69 66 20 74  ill be used if t
291b0 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49 44 73 20  he .** host IDs 
291c0 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e 65 77 20  match, or a new 
291d0 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62  lock path will b
291e0 65 20 67 65 6e 65 72 61 74 65 64 20 61 75 74 6f  e generated auto
291f0 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 61 6e  matically .** an
29200 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  d written to the
29210 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2f 0a   conch file..*/.
29220 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
29230 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78 46 69  TakeConch(unixFi
29240 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 70 72  le *pFile){.  pr
29250 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
29260 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
29270 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
29280 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
29290 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20 20 69 66  ontext; .  .  if
292a0 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c  ( pCtx->conchHel
292b0 64 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d!=0 ){.    retu
292c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
292d0 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46  }else{.    unixF
292e0 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d  ile *conchFile =
292f0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
29300 3b 0a 20 20 20 20 75 75 69 64 5f 74 20 6d 79 48  ;.    uuid_t myH
29310 6f 73 74 49 44 3b 0a 20 20 20 20 69 6e 74 20 70  ostID;.    int p
29320 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20 63  Error = 0;.    c
29330 68 61 72 20 72 65 61 64 42 75 66 5b 50 52 4f 58  har readBuf[PROX
29340 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a  Y_MAXCONCHLEN];.
29350 20 20 20 20 63 68 61 72 20 6c 6f 63 6b 50 61 74      char lockPat
29360 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20  h[MAXPATHLEN];. 
29370 20 20 20 63 68 61 72 20 2a 74 65 6d 70 4c 6f 63     char *tempLoc
29380 6b 50 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20  kPath = NULL;.  
29390 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
293a0 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 63 72  E_OK;.    int cr
293b0 65 61 74 65 43 6f 6e 63 68 20 3d 20 30 3b 0a 20  eateConch = 0;. 
293c0 20 20 20 69 6e 74 20 68 6f 73 74 49 64 4d 61 74     int hostIdMat
293d0 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ch = 0;.    int 
293e0 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 20  readLen = 0;.   
293f0 20 69 6e 74 20 74 72 79 4f 6c 64 4c 6f 63 6b 50   int tryOldLockP
29400 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ath = 0;.    int
29410 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74   forceNewLockPat
29420 68 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20 20 20  h = 0;.    .    
29430 4f 53 54 52 41 43 45 34 28 22 54 41 4b 45 43 4f  OSTRACE4("TAKECO
29440 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73 20 70  NCH  %d for %s p
29450 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46  id=%d\n", conchF
29460 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
29470 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b       (pCtx->lock
29480 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78  ProxyPath ? pCtx
29490 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
294a0 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74  : ":auto:"), get
294b0 70 69 64 28 29 29 3b 0a 0a 20 20 20 20 72 63 20  pid());..    rc 
294c0 3d 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44  = proxyGetHostID
294d0 28 6d 79 48 6f 73 74 49 44 2c 20 26 70 45 72 72  (myHostID, &pErr
294e0 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63  or);.    if( (rc
294f0 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49  &0xff)==SQLITE_I
29500 4f 45 52 52 20 29 7b 0a 20 20 20 20 20 20 70 46  OERR ){.      pF
29510 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
29520 20 70 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 67   pError;.      g
29530 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
29540 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  h;.    }.    rc 
29550 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b  = proxyConchLock
29560 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44  (pFile, myHostID
29570 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
29580 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29590 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
295a0 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
295b0 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  h;.    }.    /* 
295c0 72 65 61 64 20 74 68 65 20 65 78 69 73 74 69 6e  read the existin
295d0 67 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a  g conch file */.
295e0 20 20 20 20 72 65 61 64 4c 65 6e 20 3d 20 73 65      readLen = se
295f0 65 6b 41 6e 64 52 65 61 64 28 28 75 6e 69 78 46  ekAndRead((unixF
29600 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
29610 30 2c 20 72 65 61 64 42 75 66 2c 20 50 52 4f 58  0, readBuf, PROX
29620 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 29 3b 0a  Y_MAXCONCHLEN);.
29630 20 20 20 20 69 66 28 20 72 65 61 64 4c 65 6e 3c      if( readLen<
29640 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 2f  0 ){.      /* I/
29650 4f 20 65 72 72 6f 72 3a 20 6c 61 73 74 45 72 72  O error: lastErr
29660 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e  no set by seekAn
29670 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 20 20 70  dRead */.      p
29680 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
29690 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6c 61 73  = conchFile->las
296a0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63  tErrno;.      rc
296b0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
296c0 52 45 41 44 3b 0a 20 20 20 20 20 20 67 6f 74 6f  READ;.      goto
296d0 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a   end_takeconch;.
296e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
296f0 61 64 4c 65 6e 3c 3d 28 50 52 4f 58 59 5f 48 45  adLen<=(PROXY_HE
29700 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f  ADERLEN+PROXY_HO
29710 53 54 49 44 4c 45 4e 29 20 7c 7c 20 0a 20 20 20  STIDLEN) || .   
29720 20 20 20 20 20 20 20 20 20 20 72 65 61 64 42 75            readBu
29730 66 5b 30 5d 21 3d 28 63 68 61 72 29 50 52 4f 58  f[0]!=(char)PROX
29740 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20 29  Y_CONCHVERSION )
29750 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20 73 68 6f  {.      /* a sho
29760 72 74 20 72 65 61 64 20 6f 72 20 76 65 72 73 69  rt read or versi
29770 6f 6e 20 66 6f 72 6d 61 74 20 6d 69 73 6d 61 74  on format mismat
29780 63 68 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64  ch means we need
29790 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
297a0 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 63 68   .      ** conch
297b0 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 2a 2f   file. .      */
297c0 0a 20 20 20 20 20 20 63 72 65 61 74 65 43 6f 6e  .      createCon
297d0 63 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ch = 1;.    }.  
297e0 20 20 2f 2a 20 69 66 20 74 68 65 20 68 6f 73 74    /* if the host
297f0 20 69 64 20 6d 61 74 63 68 65 73 20 61 6e 64 20   id matches and 
29800 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 61 6c  the lock path al
29810 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 20  ready exists in 
29820 74 68 65 20 63 6f 6e 63 68 0a 20 20 20 20 2a 2a  the conch.    **
29830 20 77 65 27 6c 6c 20 74 72 79 20 74 6f 20 75 73   we'll try to us
29840 65 20 74 68 65 20 70 61 74 68 20 74 68 65 72 65  e the path there
29850 2c 20 69 66 20 77 65 20 63 61 6e 27 74 20 6f 70  , if we can't op
29860 65 6e 20 74 68 61 74 20 70 61 74 68 2c 20 77 65  en that path, we
29870 27 6c 6c 20 0a 20 20 20 20 2a 2a 20 72 65 74 72  'll .    ** retr
29880 79 20 77 69 74 68 20 61 20 6e 65 77 20 61 75 74  y with a new aut
29890 6f 2d 67 65 6e 65 72 61 74 65 64 20 70 61 74 68  o-generated path
298a0 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20   .    */.    do 
298b0 7b 20 2f 2a 20 69 6e 20 63 61 73 65 20 77 65 20  { /* in case we 
298c0 6e 65 65 64 20 74 6f 20 74 72 79 20 61 67 61 69  need to try agai
298d0 6e 20 66 6f 72 20 61 6e 20 3a 61 75 74 6f 3a 20  n for an :auto: 
298e0 6e 61 6d 65 64 20 6c 6f 63 6b 20 66 69 6c 65 20  named lock file 
298f0 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 63  */..      if( !c
29900 72 65 61 74 65 43 6f 6e 63 68 20 26 26 20 21 66  reateConch && !f
29910 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20  orceNewLockPath 
29920 29 7b 0a 20 20 20 20 20 20 20 20 68 6f 73 74 49  ){.        hostI
29930 64 4d 61 74 63 68 20 3d 20 21 6d 65 6d 63 6d 70  dMatch = !memcmp
29940 28 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f  (&readBuf[PROXY_
29950 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f  HEADERLEN], myHo
29960 73 74 49 44 2c 20 0a 20 20 20 20 20 20 20 20 20  stID, .         
29970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29980 20 20 20 20 20 20 20 20 20 50 52 4f 58 59 5f 48           PROXY_H
29990 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20  OSTIDLEN);.     
299a0 20 20 20 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e     /* if the con
299b0 63 68 20 68 61 73 20 64 61 74 61 20 63 6f 6d 70  ch has data comp
299c0 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  are the contents
299d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
299e0 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  !pCtx->lockProxy
299f0 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
29a00 20 20 2f 2a 20 66 6f 72 20 61 75 74 6f 2d 6e 61    /* for auto-na
29a10 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66  med local lock f
29a20 69 6c 65 2c 20 6a 75 73 74 20 63 68 65 63 6b 20  ile, just check 
29a30 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20  the host ID and 
29a40 77 65 27 6c 6c 0a 20 20 20 20 20 20 20 20 20 20  we'll.          
29a50 20 2a 2a 20 75 73 65 20 74 68 65 20 6c 6f 63 61   ** use the loca
29a60 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  l lock file path
29a70 20 74 68 61 74 27 73 20 61 6c 72 65 61 64 79 20   that's already 
29a80 69 6e 20 74 68 65 72 65 0a 20 20 20 20 20 20 20  in there.       
29a90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
29aa0 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68   if( hostIdMatch
29ab0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29ac0 73 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d  size_t pathLen =
29ad0 20 28 72 65 61 64 4c 65 6e 20 2d 20 50 52 4f 58   (readLen - PROX
29ae0 59 5f 50 41 54 48 49 4e 44 45 58 29 3b 0a 20 20  Y_PATHINDEX);.  
29af0 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
29b00 20 20 20 20 20 20 20 69 66 28 20 70 61 74 68 4c         if( pathL
29b10 65 6e 3e 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29  en>=MAXPATHLEN )
29b20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
29b30 70 61 74 68 4c 65 6e 3d 4d 41 58 50 41 54 48 4c  pathLen=MAXPATHL
29b40 45 4e 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  EN-1;.          
29b50 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
29b60 6d 65 6d 63 70 79 28 6c 6f 63 6b 50 61 74 68 2c  memcpy(lockPath,
29b70 20 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f   &readBuf[PROXY_
29b80 50 41 54 48 49 4e 44 45 58 5d 2c 20 70 61 74 68  PATHINDEX], path
29b90 4c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Len);.          
29ba0 20 20 6c 6f 63 6b 50 61 74 68 5b 70 61 74 68 4c    lockPath[pathL
29bb0 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  en] = 0;.       
29bc0 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74       tempLockPat
29bd0 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20  h = lockPath;.  
29be0 20 20 20 20 20 20 20 20 20 20 74 72 79 4f 6c 64            tryOld
29bf0 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20 20  LockPath = 1;.  
29c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 72 65            /* cre
29c10 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ate a copy of th
29c20 65 20 6c 6f 63 6b 20 70 61 74 68 20 69 66 20 74  e lock path if t
29c30 68 65 20 63 6f 6e 63 68 20 69 73 20 74 61 6b 65  he conch is take
29c40 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  n */.           
29c50 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
29c60 6e 63 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nch;.          }
29c70 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
29c80 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68 0a 20  f( hostIdMatch. 
29c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
29ca0 20 21 73 74 72 6e 63 6d 70 28 70 43 74 78 2d 3e   !strncmp(pCtx->
29cb0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 26  lockProxyPath, &
29cc0 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 50 41  readBuf[PROXY_PA
29cd0 54 48 49 4e 44 45 58 5d 2c 0a 20 20 20 20 20 20  THINDEX],.      
29ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29cf0 20 20 20 20 20 72 65 61 64 4c 65 6e 2d 50 52 4f       readLen-PRO
29d00 58 59 5f 50 41 54 48 49 4e 44 45 58 29 0a 20 20  XY_PATHINDEX).  
29d10 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
29d20 20 20 20 2f 2a 20 63 6f 6e 63 68 20 68 6f 73 74     /* conch host
29d30 20 61 6e 64 20 6c 6f 63 6b 20 70 61 74 68 20 6d   and lock path m
29d40 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
29d50 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
29d60 6f 6e 63 68 3b 20 0a 20 20 20 20 20 20 20 20 7d  onch; .        }
29d70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
29d80 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20        /* if the 
29d90 63 6f 6e 63 68 20 69 73 6e 27 74 20 77 72 69 74  conch isn't writ
29da0 61 62 6c 65 20 61 6e 64 20 64 6f 65 73 6e 27 74  able and doesn't
29db0 20 6d 61 74 63 68 2c 20 77 65 20 63 61 6e 27 74   match, we can't
29dc0 20 74 61 6b 65 20 69 74 20 2a 2f 0a 20 20 20 20   take it */.    
29dd0 20 20 69 66 28 20 28 63 6f 6e 63 68 46 69 6c 65    if( (conchFile
29de0 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f 5f 52 44  ->openFlags&O_RD
29df0 57 52 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  WR) == 0 ){.    
29e00 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
29e10 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 67 6f  BUSY;.        go
29e20 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68  to end_takeconch
29e30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29e40 0a 20 20 20 20 20 20 2f 2a 20 65 69 74 68 65 72  .      /* either
29e50 20 74 68 65 20 63 6f 6e 63 68 20 64 69 64 6e 27   the conch didn'
29e60 74 20 6d 61 74 63 68 20 6f 72 20 77 65 20 6e 65  t match or we ne
29e70 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  ed to create a n
29e80 65 77 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20  ew one */.      
29e90 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50  if( !pCtx->lockP
29ea0 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20  roxyPath ){.    
29eb0 20 20 20 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b      proxyGetLock
29ec0 50 61 74 68 28 70 43 74 78 2d 3e 64 62 50 61 74  Path(pCtx->dbPat
29ed0 68 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 4d 41 58  h, lockPath, MAX
29ee0 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20  PATHLEN);.      
29ef0 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d    tempLockPath =
29f00 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20 20 20 20   lockPath;.     
29f10 20 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20 63     /* create a c
29f20 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  opy of the lock 
29f30 70 61 74 68 20 5f 6f 6e 6c 79 5f 20 69 66 20 74  path _only_ if t
29f40 68 65 20 63 6f 6e 63 68 20 69 73 20 74 61 6b 65  he conch is take
29f50 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  n */.      }.   
29f60 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 75 70 64     .      /* upd
29f70 61 74 65 20 63 6f 6e 63 68 20 77 69 74 68 20 68  ate conch with h
29f80 6f 73 74 20 61 6e 64 20 70 61 74 68 20 28 74 68  ost and path (th
29f90 69 73 20 77 69 6c 6c 20 66 61 69 6c 20 69 66 20  is will fail if 
29fa0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20  other process.  
29fb0 20 20 20 20 2a 2a 20 68 61 73 20 61 20 73 68 61      ** has a sha
29fc0 72 65 64 20 6c 6f 63 6b 20 61 6c 72 65 61 64 79  red lock already
29fd0 29 2c 20 69 66 20 74 68 65 20 68 6f 73 74 20 69  ), if the host i
29fe0 64 20 6d 61 74 63 68 65 73 2c 20 75 73 65 20 74  d matches, use t
29ff0 68 65 20 62 69 67 0a 20 20 20 20 20 20 2a 2a 20  he big.      ** 
2a000 73 74 69 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a  stick..      */.
2a010 20 20 20 20 20 20 66 75 74 69 6d 65 73 28 63 6f        futimes(co
2a020 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 4e 55 4c 4c  nchFile->h, NULL
2a030 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 6f 73  );.      if( hos
2a040 74 49 64 4d 61 74 63 68 20 26 26 20 21 63 72 65  tIdMatch && !cre
2a050 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20  ateConch ){.    
2a060 20 20 20 20 69 66 28 20 63 6f 6e 63 68 46 69 6c      if( conchFil
2a070 65 2d 3e 70 4c 6f 63 6b 20 26 26 20 63 6f 6e 63  e->pLock && conc
2a080 68 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e  hFile->pLock->cn
2a090 74 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  t>1 ){.         
2a0a0 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e   /* We are tryin
2a0b0 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  g for an exclusi
2a0c0 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74  ve lock but anot
2a0d0 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68  her thread in th
2a0e0 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a  is.           **
2a0f0 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
2a100 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
2a110 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
2a120 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2a130 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
2a140 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 20 20 20       } else {   
2a150 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
2a160 20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63    rc = proxyConc
2a170 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48  hLock(pFile, myH
2a180 6f 73 74 49 44 2c 20 45 58 43 4c 55 53 49 56 45  ostID, EXCLUSIVE
2a190 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
2a1a0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
2a1b0 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63         rc = conc
2a1c0 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
2a1d0 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
2a1e0 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
2a1f0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
2a200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2a210 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a220 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
2a230 20 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f   writeBuffer[PRO
2a240 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b  XY_MAXCONCHLEN];
2a250 0a 20 20 20 20 20 20 20 20 69 6e 74 20 77 72 69  .        int wri
2a260 74 65 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  teSize = 0;.    
2a270 20 20 20 20 0a 20 20 20 20 20 20 20 20 77 72 69      .        wri
2a280 74 65 42 75 66 66 65 72 5b 30 5d 20 3d 20 28 63  teBuffer[0] = (c
2a290 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56  har)PROXY_CONCHV
2a2a0 45 52 53 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20  ERSION;.        
2a2b0 6d 65 6d 63 70 79 28 26 77 72 69 74 65 42 75 66  memcpy(&writeBuf
2a2c0 66 65 72 5b 50 52 4f 58 59 5f 48 45 41 44 45 52  fer[PROXY_HEADER
2a2d0 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20  LEN], myHostID, 
2a2e0 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
2a2f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
2a300 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
2a310 68 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  h!=NULL ){.     
2a320 20 20 20 20 20 73 74 72 6c 63 70 79 28 26 77 72       strlcpy(&wr
2a330 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f  iteBuffer[PROXY_
2a340 50 41 54 48 49 4e 44 45 58 5d 2c 20 70 43 74 78  PATHINDEX], pCtx
2a350 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c  ->lockProxyPath,
2a360 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
2a370 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2a380 20 20 20 20 20 20 20 73 74 72 6c 63 70 79 28 26         strlcpy(&
2a390 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58  writeBuffer[PROX
2a3a0 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 74 65  Y_PATHINDEX], te
2a3b0 6d 70 4c 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50  mpLockPath, MAXP
2a3c0 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20  ATHLEN);.       
2a3d0 20 7d 0a 20 20 20 20 20 20 20 20 77 72 69 74 65   }.        write
2a3e0 53 69 7a 65 20 3d 20 50 52 4f 58 59 5f 50 41 54  Size = PROXY_PAT
2a3f0 48 49 4e 44 45 58 20 2b 20 73 74 72 6c 65 6e 28  HINDEX + strlen(
2a400 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f  &writeBuffer[PRO
2a410 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 29 3b 0a  XY_PATHINDEX]);.
2a420 20 20 20 20 20 20 20 20 66 74 72 75 6e 63 61 74          ftruncat
2a430 65 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  e(conchFile->h, 
2a440 77 72 69 74 65 53 69 7a 65 29 3b 0a 20 20 20 20  writeSize);.    
2a450 20 20 20 20 72 63 20 3d 20 75 6e 69 78 57 72 69      rc = unixWri
2a460 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  te((sqlite3_file
2a470 20 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 77 72   *)conchFile, wr
2a480 69 74 65 42 75 66 66 65 72 2c 20 77 72 69 74 65  iteBuffer, write
2a490 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Size, 0);.      
2a4a0 20 20 66 73 79 6e 63 28 63 6f 6e 63 68 46 69 6c    fsync(conchFil
2a4b0 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20 20 20 2f  e->h);.        /
2a4c0 2a 20 49 66 20 77 65 20 63 72 65 61 74 65 64 20  * If we created 
2a4d0 61 20 6e 65 77 20 63 6f 6e 63 68 20 66 69 6c 65  a new conch file
2a4e0 20 28 6e 6f 74 20 6a 75 73 74 20 75 70 64 61 74   (not just updat
2a4f0 65 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ed the contents 
2a500 6f 66 20 61 20 0a 20 20 20 20 20 20 20 20 20 2a  of a .         *
2a510 2a 20 76 61 6c 69 64 20 63 6f 6e 63 68 20 66 69  * valid conch fi
2a520 6c 65 29 2c 20 74 72 79 20 74 6f 20 6d 61 74 63  le), try to matc
2a530 68 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e  h the permission
2a540 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
2a550 65 20 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  e .         */. 
2a560 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2a570 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 72 65 61  QLITE_OK && crea
2a580 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20  teConch ){.     
2a590 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
2a5a0 20 62 75 66 3b 0a 20 20 20 20 20 20 20 20 20 20   buf;.          
2a5b0 69 6e 74 20 65 72 72 20 3d 20 66 73 74 61 74 28  int err = fstat(
2a5c0 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 3b  pFile->h, &buf);
2a5d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
2a5e0 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rr==0 ){.       
2a5f0 20 20 20 20 20 6d 6f 64 65 5f 74 20 63 6d 6f 64       mode_t cmod
2a600 65 20 3d 20 62 75 66 2e 73 74 5f 6d 6f 64 65 26  e = buf.st_mode&
2a610 28 53 5f 49 52 55 53 52 7c 53 5f 49 57 55 53 52  (S_IRUSR|S_IWUSR
2a620 20 7c 20 53 5f 49 52 47 52 50 7c 53 5f 49 57 47   | S_IRGRP|S_IWG
2a630 52 50 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  RP |.           
2a640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a650 20 20 20 20 20 20 20 20 20 20 20 20 20 53 5f 49               S_I
2a660 52 4f 54 48 7c 53 5f 49 57 4f 54 48 29 3b 0a 20  ROTH|S_IWOTH);. 
2a670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72             /* tr
2a680 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 64  y to match the d
2a690 61 74 61 62 61 73 65 20 66 69 6c 65 20 52 2f 57  atabase file R/W
2a6a0 20 70 65 72 6d 69 73 73 69 6f 6e 73 2c 20 69 67   permissions, ig
2a6b0 6e 6f 72 65 20 66 61 69 6c 75 72 65 20 2a 2f 0a  nore failure */.
2a6c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 50  #ifndef SQLITE_P
2a6d0 52 4f 58 59 5f 44 45 42 55 47 0a 20 20 20 20 20  ROXY_DEBUG.     
2a6e0 20 20 20 20 20 20 20 66 63 68 6d 6f 64 28 63 6f         fchmod(co
2a6f0 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64  nchFile->h, cmod
2a700 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  e);.#else.      
2a710 20 20 20 20 20 20 69 66 28 20 66 63 68 6d 6f 64        if( fchmod
2a720 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63  (conchFile->h, c
2a730 6d 6f 64 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  mode)!=0 ){.    
2a740 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f            int co
2a750 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  de = errno;.    
2a760 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
2a770 66 28 73 74 64 65 72 72 2c 20 22 66 63 68 6d 6f  f(stderr, "fchmo
2a780 64 20 25 6f 20 46 41 49 4c 45 44 20 77 69 74 68  d %o FAILED with
2a790 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20   %d %s\n",.     
2a7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7b0 20 63 6d 6f 64 65 2c 20 63 6f 64 65 2c 20 73 74   cmode, code, st
2a7c0 72 65 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a 20  rerror(code));. 
2a7d0 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
2a7e0 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
2a7f0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
2a800 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20 53 55 43  , "fchmod %o SUC
2a810 43 45 44 45 44 5c 6e 22 2c 63 6d 6f 64 65 29 3b  CEDED\n",cmode);
2a820 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2a830 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2a840 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
2a850 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  code = errno;.  
2a860 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
2a870 66 28 73 74 64 65 72 72 2c 20 22 53 54 41 54 20  f(stderr, "STAT 
2a880 46 41 49 4c 45 44 5b 25 64 5d 20 77 69 74 68 20  FAILED[%d] with 
2a890 25 64 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20  %d %s\n", .     
2a8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
2a8b0 72 72 2c 20 63 6f 64 65 2c 20 73 74 72 65 72 72  rr, code, strerr
2a8c0 6f 72 28 63 6f 64 65 29 29 3b 0a 23 65 6e 64 69  or(code));.#endi
2a8d0 66 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  f.          }.  
2a8e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2a8f0 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d        conchFile-
2a900 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63  >pMethod->xUnloc
2a910 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
2a920 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52  )conchFile, SHAR
2a930 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
2a940 0a 20 20 20 20 65 6e 64 5f 74 61 6b 65 63 6f 6e  .    end_takecon
2a950 63 68 3a 0a 20 20 20 20 20 20 4f 53 54 52 41 43  ch:.      OSTRAC
2a960 45 32 28 22 54 52 41 4e 53 50 52 4f 58 59 3a 20  E2("TRANSPROXY: 
2a970 43 4c 4f 53 45 20 20 25 64 5c 6e 22 2c 20 70 46  CLOSE  %d\n", pF
2a980 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20 69  ile->h);.      i
2a990 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a9a0 20 26 26 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46   && pFile->openF
2a9b0 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20  lags ){.        
2a9c0 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20  if( pFile->h>=0 
2a9d0 29 7b 0a 23 69 66 64 65 66 20 53 54 52 49 43 54  ){.#ifdef STRICT
2a9e0 5f 43 4c 4f 53 45 5f 45 52 52 4f 52 0a 20 20 20  _CLOSE_ERROR.   
2a9f0 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65         if( close
2aa00 28 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20 20  (pFile->h) ){.  
2aa10 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
2aa20 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
2aa30 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  no;.            
2aa40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2aa50 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20  ERR_CLOSE;.     
2aa60 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
2aa70 20 20 20 20 20 20 20 63 6c 6f 73 65 28 70 46 69         close(pFi
2aa80 6c 65 2d 3e 68 29 3b 20 2f 2a 20 73 69 6c 65 6e  le->h); /* silen
2aa90 74 6c 79 20 6c 65 61 6b 20 66 64 20 69 66 20 66  tly leak fd if f
2aaa0 61 69 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ail */.#endif.  
2aab0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2aac0 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  pFile->h = -1;. 
2aad0 20 20 20 20 20 20 20 69 6e 74 20 66 64 20 3d 20         int fd = 
2aae0 6f 70 65 6e 28 70 43 74 78 2d 3e 64 62 50 61 74  open(pCtx->dbPat
2aaf0 68 2c 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c  h, pFile->openFl
2ab00 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ags,.           
2ab10 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
2ab20 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
2ab30 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20  ERMISSIONS);.   
2ab40 20 20 20 20 20 4f 53 54 52 41 43 45 32 28 22 54       OSTRACE2("T
2ab50 52 41 4e 53 50 52 4f 58 59 3a 20 4f 50 45 4e 20  RANSPROXY: OPEN 
2ab60 20 25 64 5c 6e 22 2c 20 66 64 29 3b 0a 20 20 20   %d\n", fd);.   
2ab70 20 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29       if( fd>=0 )
2ab80 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  {.          pFil
2ab90 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 20 20 20  e->h = fd;.     
2aba0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2abb0 20 20 20 20 72 63 3d 53 51 4c 49 54 45 5f 43 41      rc=SQLITE_CA
2abc0 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 20 2f 2a 20  NTOPEN_BKPT; /* 
2abd0 53 51 4c 49 54 45 5f 42 55 53 59 3f 20 70 72 6f  SQLITE_BUSY? pro
2abe0 78 79 54 61 6b 65 43 6f 6e 63 68 20 63 61 6c 6c  xyTakeConch call
2abf0 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 64 75  ed.           du
2ac00 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a  ring locking */.
2ac10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ac20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
2ac30 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 43  SQLITE_OK && !pC
2ac40 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 29 7b  tx->lockProxy ){
2ac50 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
2ac60 61 74 68 20 3d 20 74 65 6d 70 4c 6f 63 6b 50 61  ath = tempLockPa
2ac70 74 68 20 3f 20 74 65 6d 70 4c 6f 63 6b 50 61 74  th ? tempLockPat
2ac80 68 20 3a 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h : pCtx->lockPr
2ac90 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20  oxyPath;.       
2aca0 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74   rc = proxyCreat
2acb0 65 55 6e 69 78 46 69 6c 65 28 70 61 74 68 2c 20  eUnixFile(path, 
2acc0 26 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  &pCtx->lockProxy
2acd0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
2ace0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2acf0 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f  && rc!=SQLITE_NO
2ad00 4d 45 4d 20 26 26 20 74 72 79 4f 6c 64 4c 6f 63  MEM && tryOldLoc
2ad10 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20  kPath ){.       
2ad20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 6e 27     /* we couldn'
2ad30 74 20 63 72 65 61 74 65 20 74 68 65 20 70 72 6f  t create the pro
2ad40 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 77 69 74  xy lock file wit
2ad50 68 20 74 68 65 20 6f 6c 64 20 6c 6f 63 6b 20 66  h the old lock f
2ad60 69 6c 65 20 70 61 74 68 0a 20 20 20 20 20 20 20  ile path.       
2ad70 20 20 20 20 2a 2a 20 73 6f 20 74 72 79 20 61 67      ** so try ag
2ad80 61 69 6e 20 76 69 61 20 61 75 74 6f 2d 6e 61 6d  ain via auto-nam
2ad90 69 6e 67 20 0a 20 20 20 20 20 20 20 20 20 20 20  ing .           
2ada0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  */.          for
2adb0 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20  ceNewLockPath = 
2adc0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74 72 79  1;.          try
2add0 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b  OldLockPath = 0;
2ade0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
2adf0 6e 75 65 3b 20 2f 2a 20 67 6f 20 62 61 63 6b 20  nue; /* go back 
2ae00 74 6f 20 74 68 65 20 64 6f 20 7b 7d 20 77 68 69  to the do {} whi
2ae10 6c 65 20 73 74 61 72 74 20 70 6f 69 6e 74 2c 20  le start point, 
2ae20 74 72 79 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20  try again */.   
2ae30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2ae40 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2ae50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ae60 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b    /* Need to mak
2ae70 65 20 61 20 63 6f 70 79 20 6f 66 20 70 61 74 68  e a copy of path
2ae80 20 69 66 20 77 65 20 65 78 74 72 61 63 74 65 64   if we extracted
2ae90 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20   the value.     
2aea0 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
2aeb0 63 6f 6e 63 68 20 66 69 6c 65 20 6f 72 20 74 68  conch file or th
2aec0 65 20 70 61 74 68 20 77 61 73 20 61 6c 6c 6f 63  e path was alloc
2aed0 61 74 65 64 20 6f 6e 20 74 68 65 20 73 74 61 63  ated on the stac
2aee0 6b 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  k.         */.  
2aef0 20 20 20 20 20 20 69 66 28 20 74 65 6d 70 4c 6f        if( tempLo
2af00 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  ckPath ){.      
2af10 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72      pCtx->lockPr
2af20 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65  oxyPath = sqlite
2af30 33 44 62 53 74 72 44 75 70 28 30 2c 20 74 65 6d  3DbStrDup(0, tem
2af40 70 4c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 20 20  pLockPath);.    
2af50 20 20 20 20 20 20 69 66 28 20 21 70 43 74 78 2d        if( !pCtx-
2af60 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29  >lockProxyPath )
2af70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
2af80 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2af90 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2afa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2afb0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2afc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2afd0 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c    pCtx->conchHel
2afe0 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a  d = 1;.        .
2aff0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74 78          if( pCtx
2b000 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65  ->lockProxy->pMe
2b010 74 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65  thod == &afpIoMe
2b020 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20  thods ){.       
2b030 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e     afpLockingCon
2b040 74 65 78 74 20 2a 61 66 70 43 74 78 3b 0a 20 20  text *afpCtx;.  
2b050 20 20 20 20 20 20 20 20 61 66 70 43 74 78 20 3d          afpCtx =
2b060 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
2b070 65 78 74 20 2a 29 70 43 74 78 2d 3e 6c 6f 63 6b  ext *)pCtx->lock
2b080 50 72 6f 78 79 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  Proxy->lockingCo
2b090 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  ntext;.         
2b0a0 20 61 66 70 43 74 78 2d 3e 64 62 50 61 74 68 20   afpCtx->dbPath 
2b0b0 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
2b0c0 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 7d  yPath;.        }
2b0d0 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
2b0e0 20 20 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c          conchFil
2b0f0 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c  e->pMethod->xUnl
2b100 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
2b110 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f  e*)conchFile, NO
2b120 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
2b130 20 20 20 20 20 20 4f 53 54 52 41 43 45 33 28 22        OSTRACE3("
2b140 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20 25 73  TAKECONCH  %d %s
2b150 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  \n", conchFile->
2b160 68 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  h, rc==SQLITE_OK
2b170 3f 22 6f 6b 22 3a 22 66 61 69 6c 65 64 22 29 3b  ?"ok":"failed");
2b180 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2b190 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 31  ;.    } while (1
2b1a0 29 3b 20 2f 2a 20 69 6e 20 63 61 73 65 20 77 65  ); /* in case we
2b1b0 20 6e 65 65 64 20 74 6f 20 72 65 74 72 79 20 74   need to retry t
2b1c0 68 65 20 3a 61 75 74 6f 3a 20 6c 6f 63 6b 20 66  he :auto: lock f
2b1d0 69 6c 65 20 2d 20 77 65 20 73 68 6f 75 6c 64 20  ile - we should 
2b1e0 6e 65 76 65 72 20 67 65 74 20 68 65 72 65 20 65  never get here e
2b1f0 78 63 65 70 74 20 76 69 61 20 74 68 65 20 27 63  xcept via the 'c
2b200 6f 6e 74 69 6e 75 65 27 20 63 61 6c 6c 2e 20 2a  ontinue' call. *
2b210 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  /.  }.}../*.** I
2b220 66 20 70 46 69 6c 65 20 68 6f 6c 64 73 20 61 20  f pFile holds a 
2b230 6c 6f 63 6b 20 6f 6e 20 61 20 63 6f 6e 63 68 20  lock on a conch 
2b240 66 69 6c 65 2c 20 74 68 65 6e 20 72 65 6c 65 61  file, then relea
2b250 73 65 20 74 68 61 74 20 6c 6f 63 6b 2e 0a 2a 2f  se that lock..*/
2b260 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2b270 79 52 65 6c 65 61 73 65 43 6f 6e 63 68 28 75 6e  yReleaseConch(un
2b280 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
2b290 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2b2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b2b0 20 53 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75   Subroutine retu
2b2c0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 70 72 6f  rn code */.  pro
2b2d0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
2b2e0 20 2a 70 43 74 78 3b 20 20 2f 2a 20 54 68 65 20   *pCtx;  /* The 
2b2f0 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
2b300 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 6c 6f  for the proxy lo
2b310 63 6b 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  ck */.  unixFile
2b320 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20   *conchFile;    
2b330 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2b340 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f  he conch file */
2b350 0a 0a 20 20 70 43 74 78 20 3d 20 28 70 72 6f 78  ..  pCtx = (prox
2b360 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
2b370 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
2b380 43 6f 6e 74 65 78 74 3b 0a 20 20 63 6f 6e 63 68  Context;.  conch
2b390 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
2b3a0 63 68 46 69 6c 65 3b 0a 20 20 4f 53 54 52 41 43  chFile;.  OSTRAC
2b3b0 45 34 28 22 52 45 4c 45 41 53 45 43 4f 4e 43 48  E4("RELEASECONCH
2b3c0 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d    %d for %s pid=
2b3d0 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65  %d\n", conchFile
2b3e0 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
2b3f0 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  (pCtx->lockProxy
2b400 50 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63  Path ? pCtx->loc
2b410 6b 50 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61  kProxyPath : ":a
2b420 75 74 6f 3a 22 29 2c 20 0a 20 20 20 20 20 20 20  uto:"), .       
2b430 20 20 20 20 67 65 74 70 69 64 28 29 29 3b 0a 20      getpid());. 
2b440 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68   if( pCtx->conch
2b450 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 72 63  Held>0 ){.    rc
2b460 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
2b470 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28  ethod->xUnlock((
2b480 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
2b490 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b  nchFile, NO_LOCK
2b4a0 29 3b 0a 20 20 7d 0a 20 20 70 43 74 78 2d 3e 63  );.  }.  pCtx->c
2b4b0 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a 20 20  onchHeld = 0;.  
2b4c0 4f 53 54 52 41 43 45 33 28 22 52 45 4c 45 41 53  OSTRACE3("RELEAS
2b4d0 45 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e 22  ECONCH  %d %s\n"
2b4e0 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a  , conchFile->h,.
2b4f0 20 20 20 20 20 20 20 20 20 20 20 28 72 63 3d 3d             (rc==
2b500 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
2b510 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
2b520 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2b530 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e  *.** Given the n
2b540 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73  ame of a databas
2b550 65 20 66 69 6c 65 2c 20 63 6f 6d 70 75 74 65 20  e file, compute 
2b560 74 68 65 20 6e 61 6d 65 20 6f 66 20 69 74 73 20  the name of its 
2b570 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2a 20 53  conch file..** S
2b580 74 6f 72 65 20 74 68 65 20 63 6f 6e 63 68 20 66  tore the conch f
2b590 69 6c 65 6e 61 6d 65 20 69 6e 20 6d 65 6d 6f 72  ilename in memor
2b5a0 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
2b5b0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
2b5c0 2e 0a 2a 2a 20 4d 61 6b 65 20 2a 70 43 6f 6e 63  ..** Make *pConc
2b5d0 68 50 61 74 68 20 70 6f 69 6e 74 20 74 6f 20 74  hPath point to t
2b5e0 68 65 20 6e 65 77 20 6e 61 6d 65 2e 20 20 52 65  he new name.  Re
2b5f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
2b600 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20  n success.** or 
2b610 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
2b620 75 6e 61 62 6c 65 20 74 6f 20 6f 62 74 61 69 6e  unable to obtain
2b630 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54   memory..**.** T
2b640 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73  he caller is res
2b650 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73  ponsible for ens
2b660 75 72 69 6e 67 20 74 68 61 74 20 74 68 65 20 61  uring that the a
2b670 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a  llocated memory.
2b680 2a 2a 20 73 70 61 63 65 20 69 73 20 65 76 65 6e  ** space is even
2b690 74 75 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a  tually freed..**
2b6a0 0a 2a 2a 20 2a 70 43 6f 6e 63 68 50 61 74 68 20  .** *pConchPath 
2b6b0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69  is set to NULL i
2b6c0 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
2b6d0 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75  ation error occu
2b6e0 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
2b6f0 74 20 70 72 6f 78 79 43 72 65 61 74 65 43 6f 6e  t proxyCreateCon
2b700 63 68 50 61 74 68 6e 61 6d 65 28 63 68 61 72 20  chPathname(char 
2b710 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a 2a  *dbPath, char **
2b720 70 43 6f 6e 63 68 50 61 74 68 29 7b 0a 20 20 69  pConchPath){.  i
2b730 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
2b740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b750 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
2b760 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28 69 6e 74    int len = (int
2b770 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b  )strlen(dbPath);
2b780 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 64 61   /* Length of da
2b790 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  tabase filename 
2b7a0 2d 20 64 62 50 61 74 68 20 2a 2f 0a 20 20 63 68  - dbPath */.  ch
2b7b0 61 72 20 2a 63 6f 6e 63 68 50 61 74 68 3b 20 20  ar *conchPath;  
2b7c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62              /* b
2b7d0 75 66 66 65 72 20 69 6e 20 77 68 69 63 68 20 74  uffer in which t
2b7e0 6f 20 63 6f 6e 73 74 72 75 63 74 20 63 6f 6e 63  o construct conc
2b7f0 68 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 2f 2a 20  h name */..  /* 
2b800 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
2b810 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  or the conch fil
2b820 65 6e 61 6d 65 20 61 6e 64 20 69 6e 69 74 69 61  ename and initia
2b830 6c 69 7a 65 20 74 68 65 20 6e 61 6d 65 20 74 6f  lize the name to
2b840 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  .  ** the name o
2b850 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  f the original d
2b860 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
2b870 20 20 0a 20 20 2a 70 43 6f 6e 63 68 50 61 74 68    .  *pConchPath
2b880 20 3d 20 63 6f 6e 63 68 50 61 74 68 20 3d 20 28   = conchPath = (
2b890 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  char *)sqlite3_m
2b8a0 61 6c 6c 6f 63 28 6c 65 6e 20 2b 20 38 29 3b 0a  alloc(len + 8);.
2b8b0 20 20 69 66 28 20 63 6f 6e 63 68 50 61 74 68 3d    if( conchPath=
2b8c0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2b8d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2b8e0 20 7d 0a 20 20 6d 65 6d 63 70 79 28 63 6f 6e 63   }.  memcpy(conc
2b8f0 68 50 61 74 68 2c 20 64 62 50 61 74 68 2c 20 6c  hPath, dbPath, l
2b900 65 6e 2b 31 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e  en+1);.  .  /* n
2b910 6f 77 20 69 6e 73 65 72 74 20 61 20 22 2e 22 20  ow insert a "." 
2b920 62 65 66 6f 72 65 20 74 68 65 20 6c 61 73 74 20  before the last 
2b930 2f 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20  / character */. 
2b940 20 66 6f 72 28 20 69 3d 28 6c 65 6e 2d 31 29 3b   for( i=(len-1);
2b950 20 69 3e 3d 30 3b 20 69 2d 2d 20 29 7b 0a 20 20   i>=0; i-- ){.  
2b960 20 20 69 66 28 20 63 6f 6e 63 68 50 61 74 68 5b    if( conchPath[
2b970 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  i]=='/' ){.     
2b980 20 69 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61   i++;.      brea
2b990 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63  k;.    }.  }.  c
2b9a0 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 27 2e 27 3b  onchPath[i]='.';
2b9b0 0a 20 20 77 68 69 6c 65 20 28 20 69 3c 6c 65 6e  .  while ( i<len
2b9c0 20 29 7b 0a 20 20 20 20 63 6f 6e 63 68 50 61 74   ){.    conchPat
2b9d0 68 5b 69 2b 31 5d 3d 64 62 50 61 74 68 5b 69 5d  h[i+1]=dbPath[i]
2b9e0 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a  ;.    i++;.  }..
2b9f0 20 20 2f 2a 20 61 70 70 65 6e 64 20 74 68 65 20    /* append the 
2ba00 22 2d 63 6f 6e 63 68 22 20 73 75 66 66 69 78 20  "-conch" suffix 
2ba10 74 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  to the file */. 
2ba20 20 6d 65 6d 63 70 79 28 26 63 6f 6e 63 68 50 61   memcpy(&conchPa
2ba30 74 68 5b 69 2b 31 5d 2c 20 22 2d 63 6f 6e 63 68  th[i+1], "-conch
2ba40 22 2c 20 37 29 3b 0a 20 20 61 73 73 65 72 74 28  ", 7);.  assert(
2ba50 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 63 6f 6e   (int)strlen(con
2ba60 63 68 50 61 74 68 29 20 3d 3d 20 6c 65 6e 2b 37  chPath) == len+7
2ba70 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51   );..  return SQ
2ba80 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20  LITE_OK;.}.../* 
2ba90 54 61 6b 65 73 20 61 20 66 75 6c 6c 79 20 63 6f  Takes a fully co
2baa0 6e 66 69 67 75 72 65 64 20 70 72 6f 78 79 20 6c  nfigured proxy l
2bab0 6f 63 6b 69 6e 67 2d 73 74 79 6c 65 20 75 6e 69  ocking-style uni
2bac0 78 20 66 69 6c 65 20 61 6e 64 20 73 77 69 74 63  x file and switc
2bad0 68 65 73 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 6c  hes.** the local
2bae0 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20   lock file path 
2baf0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2bb00 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79 50 61  witchLockProxyPa
2bb10 74 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  th(unixFile *pFi
2bb20 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  le, const char *
2bb30 70 61 74 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c  path) {.  proxyL
2bb40 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
2bb50 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
2bb60 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c  ingContext*)pFil
2bb70 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
2bb80 74 3b 0a 20 20 63 68 61 72 20 2a 6f 6c 64 50 61  t;.  char *oldPa
2bb90 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  th = pCtx->lockP
2bba0 72 6f 78 79 50 61 74 68 3b 0a 20 20 69 6e 74 20  roxyPath;.  int 
2bbb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2bbc0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
2bbd0 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20  cktype!=NO_LOCK 
2bbe0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2bbf0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 20 20  LITE_BUSY;.  }  
2bc00 0a 0a 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74  ..  /* nothing t
2bc10 6f 20 64 6f 20 69 66 20 74 68 65 20 70 61 74 68  o do if the path
2bc20 20 69 73 20 4e 55 4c 4c 2c 20 3a 61 75 74 6f 3a   is NULL, :auto:
2bc30 20 6f 72 20 6d 61 74 63 68 65 73 20 74 68 65 20   or matches the 
2bc40 65 78 69 73 74 69 6e 67 20 70 61 74 68 20 2a 2f  existing path */
2bc50 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c 7c 20  .  if( !path || 
2bc60 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c  path[0]=='\0' ||
2bc70 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c 20 22   !strcmp(path, "
2bc80 3a 61 75 74 6f 3a 22 29 20 7c 7c 0a 20 20 20 20  :auto:") ||.    
2bc90 28 6f 6c 64 50 61 74 68 20 26 26 20 21 73 74 72  (oldPath && !str
2bca0 6e 63 6d 70 28 6f 6c 64 50 61 74 68 2c 20 70 61  ncmp(oldPath, pa
2bcb0 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 29  th, MAXPATHLEN))
2bcc0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2bcd0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
2bce0 65 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  e{.    unixFile 
2bcf0 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 70 43 74  *lockProxy = pCt
2bd00 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20  x->lockProxy;.  
2bd10 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78    pCtx->lockProx
2bd20 79 3d 4e 55 4c 4c 3b 0a 20 20 20 20 70 43 74 78  y=NULL;.    pCtx
2bd30 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b  ->conchHeld = 0;
2bd40 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f  .    if( lockPro
2bd50 78 79 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  xy!=NULL ){.    
2bd60 20 20 72 63 3d 6c 6f 63 6b 50 72 6f 78 79 2d 3e    rc=lockProxy->
2bd70 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28  pMethod->xClose(
2bd80 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
2bd90 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20  lockProxy);.    
2bda0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2bdb0 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  n rc;.      sqli
2bdc0 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f  te3_free(lockPro
2bdd0 78 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  xy);.    }.    s
2bde0 71 6c 69 74 65 33 5f 66 72 65 65 28 6f 6c 64 50  qlite3_free(oldP
2bdf0 61 74 68 29 3b 0a 20 20 20 20 70 43 74 78 2d 3e  ath);.    pCtx->
2be00 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20  lockProxyPath = 
2be10 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
2be20 30 2c 20 70 61 74 68 29 3b 0a 20 20 7d 0a 20 20  0, path);.  }.  
2be30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2be40 0a 2f 2a 0a 2a 2a 20 70 46 69 6c 65 20 69 73 20  ./*.** pFile is 
2be50 61 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20  a file that has 
2be60 62 65 65 6e 20 6f 70 65 6e 65 64 20 62 79 20 61  been opened by a
2be70 20 70 72 69 6f 72 20 78 4f 70 65 6e 20 63 61 6c   prior xOpen cal
2be80 6c 2e 20 20 64 62 50 61 74 68 0a 2a 2a 20 69 73  l.  dbPath.** is
2be90 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72   a string buffer
2bea0 20 61 74 20 6c 65 61 73 74 20 4d 41 58 50 41 54   at least MAXPAT
2beb0 48 4c 45 4e 2b 31 20 63 68 61 72 61 63 74 65 72  HLEN+1 character
2bec0 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
2bed0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 66 69   This routine fi
2bee0 6e 64 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  nd the filename 
2bef0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2bf00 70 46 69 6c 65 20 61 6e 64 20 77 72 69 74 65 73  pFile and writes
2bf10 20 69 74 0a 2a 2a 20 69 6e 74 20 64 62 50 61 74   it.** int dbPat
2bf20 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h..*/.static int
2bf30 20 70 72 6f 78 79 47 65 74 44 62 50 61 74 68 46   proxyGetDbPathF
2bf40 6f 72 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46  orUnixFile(unixF
2bf50 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 68 61 72  ile *pFile, char
2bf60 20 2a 64 62 50 61 74 68 29 7b 0a 23 69 66 20 64   *dbPath){.#if d
2bf70 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2bf80 29 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  ).  if( pFile->p
2bf90 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f  Method == &afpIo
2bfa0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
2bfb0 2a 20 61 66 70 20 73 74 79 6c 65 20 6b 65 65 70  * afp style keep
2bfc0 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
2bfd0 20 74 68 65 20 64 62 20 70 61 74 68 20 69 6e 20   the db path in 
2bfe0 74 68 65 20 66 69 6c 65 50 61 74 68 20 66 69 65  the filePath fie
2bff0 6c 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ld .    ** of th
2c000 65 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 20 20  e struct */.    
2c010 61 73 73 65 72 74 28 20 28 69 6e 74 29 73 74 72  assert( (int)str
2c020 6c 65 6e 28 28 63 68 61 72 2a 29 70 46 69 6c 65  len((char*)pFile
2c030 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2c040 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b  )<=MAXPATHLEN );
2c050 0a 20 20 20 20 73 74 72 6c 63 70 79 28 64 62 50  .    strlcpy(dbP
2c060 61 74 68 2c 20 28 28 61 66 70 4c 6f 63 6b 69 6e  ath, ((afpLockin
2c070 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
2c080 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2c090 29 2d 3e 64 62 50 61 74 68 2c 20 4d 41 58 50 41  )->dbPath, MAXPA
2c0a0 54 48 4c 45 4e 29 3b 0a 20 20 7d 20 65 6c 73 65  THLEN);.  } else
2c0b0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 46  .#endif.  if( pF
2c0c0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20  ile->pMethod == 
2c0d0 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  &dotlockIoMethod
2c0e0 73 20 29 7b 0a 20 20 20 20 2f 2a 20 64 6f 74 20  s ){.    /* dot 
2c0f0 6c 6f 63 6b 20 73 74 79 6c 65 20 75 73 65 73 20  lock style uses 
2c100 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  the locking cont
2c110 65 78 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ext to store the
2c120 20 64 6f 74 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a   dot lock.    **
2c130 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20   file path */.  
2c140 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c    int len = strl
2c150 65 6e 28 28 63 68 61 72 20 2a 29 70 46 69 6c 65  en((char *)pFile
2c160 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2c170 29 20 2d 20 73 74 72 6c 65 6e 28 44 4f 54 4c 4f  ) - strlen(DOTLO
2c180 43 4b 5f 53 55 46 46 49 58 29 3b 0a 20 20 20 20  CK_SUFFIX);.    
2c190 6d 65 6d 63 70 79 28 64 62 50 61 74 68 2c 20 28  memcpy(dbPath, (
2c1a0 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  char *)pFile->lo
2c1b0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 6c 65  ckingContext, le
2c1c0 6e 20 2b 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  n + 1);.  }else{
2c1d0 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6f 74 68 65  .    /* all othe
2c1e0 72 20 73 74 79 6c 65 73 20 75 73 65 20 74 68 65  r styles use the
2c1f0 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
2c200 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 64 62   to store the db
2c210 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20   file path */.  
2c220 20 20 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e    assert( strlen
2c230 28 28 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c  ((char*)pFile->l
2c240 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d  ockingContext)<=
2c250 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b 0a 20 20  MAXPATHLEN );.  
2c260 20 20 73 74 72 6c 63 70 79 28 64 62 50 61 74 68    strlcpy(dbPath
2c270 2c 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  , (char *)pFile-
2c280 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c  >lockingContext,
2c290 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
2c2a0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
2c2b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
2c2c0 61 6b 65 73 20 61 6e 20 61 6c 72 65 61 64 79 20  akes an already 
2c2d0 66 69 6c 6c 65 64 20 69 6e 20 75 6e 69 78 20 66  filled in unix f
2c2e0 69 6c 65 20 61 6e 64 20 61 6c 74 65 72 73 20 69  ile and alters i
2c2f0 74 20 73 6f 20 61 6c 6c 20 66 69 6c 65 20 6c 6f  t so all file lo
2c300 63 6b 69 6e 67 20 0a 2a 2a 20 77 69 6c 6c 20 62  cking .** will b
2c310 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74  e performed on t
2c320 68 65 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 6c  he local proxy l
2c330 6f 63 6b 20 66 69 6c 65 2e 20 20 54 68 65 20 66  ock file.  The f
2c340 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 0a  ollowing fields.
2c350 2a 2a 20 61 72 65 20 70 72 65 73 65 72 76 65 64  ** are preserved
2c360 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
2c370 63 6f 6e 74 65 78 74 20 73 6f 20 74 68 61 74 20  context so that 
2c380 74 68 65 79 20 63 61 6e 20 62 65 20 72 65 73 74  they can be rest
2c390 6f 72 65 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65  ored and .** the
2c3a0 20 75 6e 69 78 20 73 74 72 75 63 74 75 72 65 20   unix structure 
2c3b0 70 72 6f 70 65 72 6c 79 20 63 6c 65 61 6e 65 64  properly cleaned
2c3c0 20 75 70 20 61 74 20 63 6c 6f 73 65 20 74 69 6d   up at close tim
2c3d0 65 3a 0a 2a 2a 20 20 2d 3e 6c 6f 63 6b 69 6e 67  e:.**  ->locking
2c3e0 43 6f 6e 74 65 78 74 0a 2a 2a 20 20 2d 3e 70 4d  Context.**  ->pM
2c3f0 65 74 68 6f 64 0a 2a 2f 0a 73 74 61 74 69 63 20  ethod.*/.static 
2c400 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f  int proxyTransfo
2c410 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46  rmUnixFile(unixF
2c420 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73  ile *pFile, cons
2c430 74 20 63 68 61 72 20 2a 70 61 74 68 29 20 7b 0a  t char *path) {.
2c440 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
2c450 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 63  ntext *pCtx;.  c
2c460 68 61 72 20 64 62 50 61 74 68 5b 4d 41 58 50 41  har dbPath[MAXPA
2c470 54 48 4c 45 4e 2b 31 5d 3b 20 20 20 20 20 20 20  THLEN+1];       
2c480 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
2c490 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2c4a0 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68    char *lockPath
2c4b0 3d 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20 72 63 20  =NULL;.  int rc 
2c4c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a  = SQLITE_OK;.  .
2c4d0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
2c4e0 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 29  ktype!=NO_LOCK )
2c4f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2c500 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20  ITE_BUSY;.  }.  
2c510 70 72 6f 78 79 47 65 74 44 62 50 61 74 68 46 6f  proxyGetDbPathFo
2c520 72 55 6e 69 78 46 69 6c 65 28 70 46 69 6c 65 2c  rUnixFile(pFile,
2c530 20 64 62 50 61 74 68 29 3b 0a 20 20 69 66 28 20   dbPath);.  if( 
2c540 21 70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d  !path || path[0]
2c550 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d  =='\0' || !strcm
2c560 70 28 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22  p(path, ":auto:"
2c570 29 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 50 61 74  ) ){.    lockPat
2c580 68 3d 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  h=NULL;.  }else{
2c590 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68 3d 28 63  .    lockPath=(c
2c5a0 68 61 72 20 2a 29 70 61 74 68 3b 0a 20 20 7d 0a  har *)path;.  }.
2c5b0 20 20 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54    .  OSTRACE4("T
2c5c0 52 41 4e 53 50 52 4f 58 59 20 20 25 64 20 66 6f  RANSPROXY  %d fo
2c5d0 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20  r %s pid=%d\n", 
2c5e0 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
2c5f0 20 20 20 20 20 28 6c 6f 63 6b 50 61 74 68 20 3f       (lockPath ?
2c600 20 6c 6f 63 6b 50 61 74 68 20 3a 20 22 3a 61 75   lockPath : ":au
2c610 74 6f 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29  to:"), getpid())
2c620 3b 0a 0a 20 20 70 43 74 78 20 3d 20 73 71 6c 69  ;..  pCtx = sqli
2c630 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
2c640 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 69  of(*pCtx) );.  i
2c650 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20  f( pCtx==0 ){.  
2c660 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c670 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d  NOMEM;.  }.  mem
2c680 73 65 74 28 70 43 74 78 2c 20 30 2c 20 73 69 7a  set(pCtx, 0, siz
2c690 65 6f 66 28 2a 70 43 74 78 29 29 3b 0a 0a 20 20  eof(*pCtx));..  
2c6a0 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65  rc = proxyCreate
2c6b0 43 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28 64 62  ConchPathname(db
2c6c0 50 61 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e  Path, &pCtx->con
2c6d0 63 68 46 69 6c 65 50 61 74 68 29 3b 0a 20 20 69  chFilePath);.  i
2c6e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2c6f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 72 6f   ){.    rc = pro
2c700 78 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65  xyCreateUnixFile
2c710 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  (pCtx->conchFile
2c720 50 61 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e  Path, &pCtx->con
2c730 63 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20  chFile, 0);.    
2c740 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  if( rc==SQLITE_C
2c750 41 4e 54 4f 50 45 4e 20 26 26 20 28 28 70 46 69  ANTOPEN && ((pFi
2c760 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f 5f  le->openFlags&O_
2c770 52 44 57 52 29 20 3d 3d 20 30 29 20 29 7b 0a 20  RDWR) == 0) ){. 
2c780 20 20 20 20 20 2f 2a 20 69 66 20 28 61 29 20 74       /* if (a) t
2c790 68 65 20 6f 70 65 6e 20 66 6c 61 67 73 20 61 72  he open flags ar
2c7a0 65 20 6e 6f 74 20 4f 5f 52 44 57 52 2c 20 28 62  e not O_RDWR, (b
2c7b0 29 20 74 68 65 20 63 6f 6e 63 68 20 69 73 6e 27  ) the conch isn'
2c7c0 74 20 74 68 65 72 65 2c 20 61 6e 64 0a 20 20 20  t there, and.   
2c7d0 20 20 20 2a 2a 20 28 63 29 20 74 68 65 20 66 69     ** (c) the fi
2c7e0 6c 65 20 73 79 73 74 65 6d 20 69 73 20 72 65 61  le system is rea
2c7f0 64 2d 6f 6e 6c 79 2c 20 74 68 65 6e 20 65 6e 61  d-only, then ena
2c800 62 6c 65 20 6e 6f 2d 6c 6f 63 6b 69 6e 67 20 61  ble no-locking a
2c810 63 63 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20  ccess..      ** 
2c820 55 67 68 2c 20 73 69 6e 63 65 20 4f 5f 52 44 4f  Ugh, since O_RDO
2c830 4e 4c 59 3d 3d 30 78 30 30 30 30 20 77 65 20 74  NLY==0x0000 we t
2c840 65 73 74 20 66 6f 72 20 21 4f 5f 52 44 57 52 20  est for !O_RDWR 
2c850 73 69 6e 63 65 20 75 6e 69 78 4f 70 65 6e 20 61  since unixOpen a
2c860 73 73 65 72 74 73 0a 20 20 20 20 20 20 2a 2a 20  sserts.      ** 
2c870 74 68 61 74 20 6f 70 65 6e 46 6c 61 67 73 20 77  that openFlags w
2c880 69 6c 6c 20 68 61 76 65 20 6f 6e 6c 79 20 6f 6e  ill have only on
2c890 65 20 6f 66 20 4f 5f 52 44 4f 4e 4c 59 20 6f 72  e of O_RDONLY or
2c8a0 20 4f 5f 52 44 57 52 2e 0a 20 20 20 20 20 20 2a   O_RDWR..      *
2c8b0 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  /.      struct s
2c8c0 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20  tatfs fsInfo;.  
2c8d0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
2c8e0 63 6f 6e 63 68 49 6e 66 6f 3b 0a 20 20 20 20 20  conchInfo;.     
2c8f0 20 69 6e 74 20 67 6f 4c 6f 63 6b 6c 65 73 73 20   int goLockless 
2c900 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  = 0;..      if( 
2c910 73 74 61 74 28 70 43 74 78 2d 3e 63 6f 6e 63 68  stat(pCtx->conch
2c920 46 69 6c 65 50 61 74 68 2c 20 26 63 6f 6e 63 68  FilePath, &conch
2c930 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20 7b 0a  Info) == -1 ) {.
2c940 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 20          int err 
2c950 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
2c960 20 69 66 28 20 28 65 72 72 3d 3d 45 4e 4f 45 4e   if( (err==ENOEN
2c970 54 29 20 26 26 20 28 73 74 61 74 66 73 28 64 62  T) && (statfs(db
2c980 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21  Path, &fsInfo) !
2c990 3d 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  = -1) ){.       
2c9a0 20 20 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20     goLockless = 
2c9b0 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26  (fsInfo.f_flags&
2c9c0 4d 4e 54 5f 52 44 4f 4e 4c 59 29 20 3d 3d 20 4d  MNT_RDONLY) == M
2c9d0 4e 54 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  NT_RDONLY;.     
2c9e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2c9f0 20 20 20 69 66 28 20 67 6f 4c 6f 63 6b 6c 65 73     if( goLockles
2ca00 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74  s ){.        pCt
2ca10 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 2d  x->conchHeld = -
2ca20 31 3b 20 2f 2a 20 72 65 61 64 20 6f 6e 6c 79 20  1; /* read only 
2ca30 46 53 2f 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a  FS/ lockless */.
2ca40 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2ca50 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
2ca60 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 69 66      }.  }  .  if
2ca70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ca80 26 26 20 6c 6f 63 6b 50 61 74 68 20 29 7b 0a 20  && lockPath ){. 
2ca90 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f     pCtx->lockPro
2caa0 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33  xyPath = sqlite3
2cab0 44 62 53 74 72 44 75 70 28 30 2c 20 6c 6f 63 6b  DbStrDup(0, lock
2cac0 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Path);.  }..  if
2cad0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2cae0 29 7b 0a 20 20 20 20 70 43 74 78 2d 3e 64 62 50  ){.    pCtx->dbP
2caf0 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ath = sqlite3DbS
2cb00 74 72 44 75 70 28 30 2c 20 64 62 50 61 74 68 29  trDup(0, dbPath)
2cb10 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e  ;.    if( pCtx->
2cb20 64 62 50 61 74 68 3d 3d 4e 55 4c 4c 20 29 7b 0a  dbPath==NULL ){.
2cb30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2cb40 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
2cb50 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
2cb60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
2cb70 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 69 73 20 61   all memory is a
2cb80 6c 6c 6f 63 61 74 65 64 2c 20 70 72 6f 78 79 73  llocated, proxys
2cb90 20 61 72 65 20 63 72 65 61 74 65 64 20 61 6e 64   are created and
2cba0 20 61 73 73 69 67 6e 65 64 2c 20 0a 20 20 20 20   assigned, .    
2cbb0 2a 2a 20 73 77 69 74 63 68 20 74 68 65 20 6c 6f  ** switch the lo
2cbc0 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 61 6e  cking context an
2cbd0 64 20 70 4d 65 74 68 6f 64 20 74 68 65 6e 20 72  d pMethod then r
2cbe0 65 74 75 72 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  eturn..    */.  
2cbf0 20 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69    pCtx->oldLocki
2cc00 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 46 69 6c  ngContext = pFil
2cc10 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
2cc20 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  t;.    pFile->lo
2cc30 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70  ckingContext = p
2cc40 43 74 78 3b 0a 20 20 20 20 70 43 74 78 2d 3e 70  Ctx;.    pCtx->p
2cc50 4f 6c 64 4d 65 74 68 6f 64 20 3d 20 70 46 69 6c  OldMethod = pFil
2cc60 65 2d 3e 70 4d 65 74 68 6f 64 3b 0a 20 20 20 20  e->pMethod;.    
2cc70 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
2cc80 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73   &proxyIoMethods
2cc90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
2cca0 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69  f( pCtx->conchFi
2ccb0 6c 65 20 29 7b 20 0a 20 20 20 20 20 20 70 43 74  le ){ .      pCt
2ccc0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d  x->conchFile->pM
2ccd0 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73  ethod->xClose((s
2cce0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 70 43  qlite3_file *)pC
2ccf0 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a  tx->conchFile);.
2cd00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2cd10 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69  ee(pCtx->conchFi
2cd20 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  le);.    }.    s
2cd30 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
2cd40 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 29  ->lockProxyPath)
2cd50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
2cd60 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69  ee(pCtx->conchFi
2cd70 6c 65 50 61 74 68 29 3b 20 0a 20 20 20 20 73 71  lePath); .    sq
2cd80 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 29  lite3_free(pCtx)
2cd90 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 33  ;.  }.  OSTRACE3
2cda0 28 22 54 52 41 4e 53 50 52 4f 58 59 20 20 25 64  ("TRANSPROXY  %d
2cdb0 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %s\n", pFile->h
2cdc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 72 63  ,.           (rc
2cdd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
2cde0 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
2cdf0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ce00 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2ce10 74 69 6e 65 20 68 61 6e 64 6c 65 73 20 73 71 6c  tine handles sql
2ce20 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
2ce30 6c 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 61  l() calls that a
2ce40 72 65 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74  re specific.** t
2ce50 6f 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e  o proxy locking.
2ce60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2ce70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  roxyFileControl(
2ce80 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
2ce90 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
2cea0 70 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28  pArg){.  switch(
2ceb0 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
2cec0 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50  SQLITE_GET_LOCKP
2ced0 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20  ROXYFILE: {.    
2cee0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
2cef0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
2cf00 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69  d;.      if( pFi
2cf10 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26  le->pMethod == &
2cf20 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 20 29  proxyIoMethods )
2cf30 7b 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79 4c  {.        proxyL
2cf40 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
2cf50 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
2cf60 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c  ingContext*)pFil
2cf70 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
2cf80 74 3b 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79  t;.        proxy
2cf90 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29  TakeConch(pFile)
2cfa0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
2cfb0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
2cfc0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  h ){.          *
2cfd0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70  (const char **)p
2cfe0 41 72 67 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b  Arg = pCtx->lock
2cff0 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20  ProxyPath;.     
2d000 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d010 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72      *(const char
2d020 20 2a 2a 29 70 41 72 67 20 3d 20 22 3a 61 75 74   **)pArg = ":aut
2d030 6f 3a 20 28 6e 6f 74 20 68 65 6c 64 29 22 3b 0a  o: (not held)";.
2d040 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d050 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
2d060 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a   *(const char **
2d070 29 70 41 72 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20  )pArg = NULL;.  
2d080 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2d090 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2d0a0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
2d0b0 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
2d0c0 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75  YFILE: {.      u
2d0d0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
2d0e0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
2d0f0 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53        int rc = S
2d100 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2d110 69 6e 74 20 69 73 50 72 6f 78 79 53 74 79 6c 65  int isProxyStyle
2d120 20 3d 20 28 70 46 69 6c 65 2d 3e 70 4d 65 74 68   = (pFile->pMeth
2d130 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65  od == &proxyIoMe
2d140 74 68 6f 64 73 29 3b 0a 20 20 20 20 20 20 69 66  thods);.      if
2d150 28 20 70 41 72 67 3d 3d 4e 55 4c 4c 20 7c 7c 20  ( pArg==NULL || 
2d160 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 41  (const char *)pA
2d170 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rg==0 ){.       
2d180 20 69 66 28 20 69 73 50 72 6f 78 79 53 74 79 6c   if( isProxyStyl
2d190 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  e ){.          /
2d1a0 2a 20 74 75 72 6e 20 6f 66 66 20 70 72 6f 78 79  * turn off proxy
2d1b0 20 6c 6f 63 6b 69 6e 67 20 2d 20 6e 6f 74 20 73   locking - not s
2d1c0 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20  upported */.    
2d1d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2d1e0 45 5f 45 52 52 4f 52 20 2f 2a 53 51 4c 49 54 45  E_ERROR /*SQLITE
2d1f0 5f 50 52 4f 54 4f 43 4f 4c 3f 20 53 51 4c 49 54  _PROTOCOL? SQLIT
2d200 45 5f 4d 49 53 55 53 45 3f 2a 2f 3b 0a 20 20 20  E_MISUSE?*/;.   
2d210 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2d220 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 66        /* turn of
2d230 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  f proxy locking 
2d240 2d 20 61 6c 72 65 61 64 79 20 6f 66 66 20 2d 20  - already off - 
2d250 4e 4f 4f 50 20 2a 2f 0a 20 20 20 20 20 20 20 20  NOOP */.        
2d260 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2d270 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2d280 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2d290 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f   const char *pro
2d2a0 78 79 50 61 74 68 20 3d 20 28 63 6f 6e 73 74 20  xyPath = (const 
2d2b0 63 68 61 72 20 2a 29 70 41 72 67 3b 0a 20 20 20  char *)pArg;.   
2d2c0 20 20 20 20 20 69 66 28 20 69 73 50 72 6f 78 79       if( isProxy
2d2d0 53 74 79 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  Style ){.       
2d2e0 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43     proxyLockingC
2d2f0 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 0a  ontext *pCtx = .
2d300 20 20 20 20 20 20 20 20 20 20 20 20 28 70 72 6f              (pro
2d310 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
2d320 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
2d330 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20  Context;.       
2d340 20 20 20 69 66 28 20 21 73 74 72 63 6d 70 28 70     if( !strcmp(p
2d350 41 72 67 2c 20 22 3a 61 75 74 6f 3a 22 29 20 0a  Arg, ":auto:") .
2d360 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
2d370 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
2d380 74 68 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  th &&.          
2d390 20 20 20 20 20 21 73 74 72 6e 63 6d 70 28 70 43       !strncmp(pC
2d3a0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
2d3b0 68 2c 20 70 72 6f 78 79 50 61 74 68 2c 20 4d 41  h, proxyPath, MA
2d3c0 58 50 41 54 48 4c 45 4e 29 29 0a 20 20 20 20 20  XPATHLEN)).     
2d3d0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2d3e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2d3f0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  OK;.          }e
2d400 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2d410 20 72 63 20 3d 20 73 77 69 74 63 68 4c 6f 63 6b   rc = switchLock
2d420 50 72 6f 78 79 50 61 74 68 28 70 46 69 6c 65 2c  ProxyPath(pFile,
2d430 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20   proxyPath);.   
2d440 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d450 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2d460 20 20 2f 2a 20 74 75 72 6e 20 6f 6e 20 70 72 6f    /* turn on pro
2d470 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  xy file locking 
2d480 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
2d490 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d  = proxyTransform
2d4a0 55 6e 69 78 46 69 6c 65 28 70 46 69 6c 65 2c 20  UnixFile(pFile, 
2d4b0 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20  proxyPath);.    
2d4c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2d4d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2d4e0 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
2d4f0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
2d500 28 20 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 63  ( 0 );  /* The c
2d510 61 6c 6c 20 61 73 73 75 72 65 73 20 74 68 61 74  all assures that
2d520 20 6f 6e 6c 79 20 76 61 6c 69 64 20 6f 70 63 6f   only valid opco
2d530 64 65 73 20 61 72 65 20 73 65 6e 74 20 2a 2f 0a  des are sent */.
2d540 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f      }.  }.  /*NO
2d550 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 72 65 74  TREACHED*/.  ret
2d560 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
2d570 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 74 68 69  ;.}../*.** Withi
2d580 6e 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e 20  n this division 
2d590 28 74 68 65 20 70 72 6f 78 79 69 6e 67 20 6c 6f  (the proxying lo
2d5a0 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61  cking implementa
2d5b0 74 69 6f 6e 29 20 74 68 65 20 70 72 6f 63 65 64  tion) the proced
2d5c0 75 72 65 73 0a 2a 2a 20 61 62 6f 76 65 20 74 68  ures.** above th
2d5d0 69 73 20 70 6f 69 6e 74 20 61 72 65 20 61 6c 6c  is point are all
2d5e0 20 75 74 69 6c 69 74 69 65 73 2e 20 20 54 68 65   utilities.  The
2d5f0 20 6c 6f 63 6b 2d 72 65 6c 61 74 65 64 20 6d 65   lock-related me
2d600 74 68 6f 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20  thods of the.** 
2d610 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 73 71  proxy-locking sq
2d620 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 20  lite3_io_method 
2d630 6f 62 6a 65 63 74 20 66 6f 6c 6c 6f 77 2e 0a 2a  object follow..*
2d640 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  /.../*.** This r
2d650 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
2d660 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
2d670 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
2d680 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
2d690 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
2d6a0 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
2d6b0 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
2d6c0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
2d6d0 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
2d6e0 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
2d6f0 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
2d700 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
2d710 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
2d720 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
2d730 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
2d740 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
2d750 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
2d760 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
2d770 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
2d780 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  xyCheckReservedL
2d790 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
2d7a0 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
2d7b0 75 74 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ut) {.  unixFile
2d7c0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
2d7d0 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72  ile*)id;.  int r
2d7e0 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e  c = proxyTakeCon
2d7f0 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  ch(pFile);.  if(
2d800 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2d810 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69  {.    proxyLocki
2d820 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
2d830 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
2d840 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
2d850 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
2d860 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f      if( pCtx->co
2d870 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20  nchHeld>0 ){.   
2d880 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f     unixFile *pro
2d890 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  xy = pCtx->lockP
2d8a0 72 6f 78 79 3b 0a 20 20 20 20 20 20 72 65 74 75  roxy;.      retu
2d8b0 72 6e 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f  rn proxy->pMetho
2d8c0 64 2d 3e 78 43 68 65 63 6b 52 65 73 65 72 76 65  d->xCheckReserve
2d8d0 64 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  dLock((sqlite3_f
2d8e0 69 6c 65 2a 29 70 72 6f 78 79 2c 20 70 52 65 73  ile*)proxy, pRes
2d8f0 4f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Out);.    }else{
2d900 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20   /* conchHeld < 
2d910 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f  0 is lockless */
2d920 0a 20 20 20 20 20 20 70 52 65 73 4f 75 74 3d 30  .      pResOut=0
2d930 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2d940 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2d950 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
2d960 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
2d970 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
2d980 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20  eter locktype - 
2d990 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
2d9a0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2d9b0 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
2d9c0 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
2d9d0 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
2d9e0 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
2d9f0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
2da00 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
2da10 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
2da20 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
2da30 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
2da40 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
2da50 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
2da60 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
2da70 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
2da80 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
2da90 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
2daa0 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
2dab0 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
2dac0 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
2dad0 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
2dae0 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
2daf0 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
2db00 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
2db10 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
2db20 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
2db30 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
2db40 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
2db50 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
2db60 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
2db70 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
2db80 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
2db90 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
2dba0 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
2dbb0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
2dbc0 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
2dbd0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
2dbe0 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
2dbf0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
2dc00 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2dc10 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
2dc20 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
2dc30 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
2dc40 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
2dc50 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
2dc60 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
2dc70 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c  tatic int proxyL
2dc80 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
2dc90 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
2dca0 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  pe) {.  unixFile
2dcb0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
2dcc0 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72  ile*)id;.  int r
2dcd0 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e  c = proxyTakeCon
2dce0 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  ch(pFile);.  if(
2dcf0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2dd00 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69  {.    proxyLocki
2dd10 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
2dd20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
2dd30 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
2dd40 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
2dd50 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f      if( pCtx->co
2dd60 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20  nchHeld>0 ){.   
2dd70 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f     unixFile *pro
2dd80 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  xy = pCtx->lockP
2dd90 72 6f 78 79 3b 0a 20 20 20 20 20 20 72 63 20 3d  roxy;.      rc =
2dda0 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d   proxy->pMethod-
2ddb0 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
2ddc0 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 6c 6f 63  file*)proxy, loc
2ddd0 6b 74 79 70 65 29 3b 0a 20 20 20 20 20 20 70 46  ktype);.      pF
2dde0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
2ddf0 70 72 6f 78 79 2d 3e 6c 6f 63 6b 74 79 70 65 3b  proxy->locktype;
2de00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2de10 20 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c    /* conchHeld <
2de20 20 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a   0 is lockless *
2de30 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  /.    }.  }.  re
2de40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
2de50 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
2de60 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
2de70 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
2de80 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e  ile to locktype.
2de90 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75    locktype.** mu
2dea0 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
2deb0 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
2dec0 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
2ded0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
2dee0 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
2def0 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
2df00 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
2df10 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
2df20 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
2df30 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
2df40 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
2df50 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b   int proxyUnlock
2df60 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
2df70 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
2df80 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
2df90 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
2dfa0 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *)id;.  int rc =
2dfb0 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28   proxyTakeConch(
2dfc0 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63  pFile);.  if( rc
2dfd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2dfe0 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43     proxyLockingC
2dff0 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
2e000 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
2e010 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
2e020 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
2e030 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68   if( pCtx->conch
2e040 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 20 20  Held>0 ){.      
2e050 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78 79 20  unixFile *proxy 
2e060 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
2e070 79 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 72  y;.      rc = pr
2e080 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55  oxy->pMethod->xU
2e090 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  nlock((sqlite3_f
2e0a0 69 6c 65 2a 29 70 72 6f 78 79 2c 20 6c 6f 63 6b  ile*)proxy, lock
2e0b0 74 79 70 65 29 3b 0a 20 20 20 20 20 20 70 46 69  type);.      pFi
2e0c0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 70  le->locktype = p
2e0d0 72 6f 78 79 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a  roxy->locktype;.
2e0e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e0f0 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20   /* conchHeld < 
2e100 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f  0 is lockless */
2e110 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2e120 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2e130 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 74 68   Close a file th
2e140 61 74 20 75 73 65 73 20 70 72 6f 78 79 20 6c 6f  at uses proxy lo
2e150 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  cks..*/.static i
2e160 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71  nt proxyClose(sq
2e170 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
2e180 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  {.  if( id ){.  
2e190 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
2e1a0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
2e1b0 64 3b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b  d;.    proxyLock
2e1c0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
2e1d0 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
2e1e0 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
2e1f0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
2e200 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c  .    unixFile *l
2e210 6f 63 6b 50 72 6f 78 79 20 3d 20 70 43 74 78 2d  ockProxy = pCtx-
2e220 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20  >lockProxy;.    
2e230 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
2e240 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ile = pCtx->conc
2e250 68 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 72  hFile;.    int r
2e260 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2e270 20 20 20 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b     .    if( lock
2e280 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72  Proxy ){.      r
2e290 63 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70  c = lockProxy->p
2e2a0 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28  Method->xUnlock(
2e2b0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c  (sqlite3_file*)l
2e2c0 6f 63 6b 50 72 6f 78 79 2c 20 4e 4f 5f 4c 4f 43  ockProxy, NO_LOC
2e2d0 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
2e2e0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2e2f0 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 50 72 6f      rc = lockPro
2e300 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c  xy->pMethod->xCl
2e310 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ose((sqlite3_fil
2e320 65 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20  e*)lockProxy);. 
2e330 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
2e340 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73  turn rc;.      s
2e350 71 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b  qlite3_free(lock
2e360 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 70 43  Proxy);.      pC
2e370 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 3d 20  tx->lockProxy = 
2e380 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
2e390 20 63 6f 6e 63 68 46 69 6c 65 20 29 7b 0a 20 20   conchFile ){.  
2e3a0 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f      if( pCtx->co
2e3b0 6e 63 68 48 65 6c 64 20 29 7b 0a 20 20 20 20 20  nchHeld ){.     
2e3c0 20 20 20 72 63 20 3d 20 70 72 6f 78 79 52 65 6c     rc = proxyRel
2e3d0 65 61 73 65 43 6f 6e 63 68 28 70 46 69 6c 65 29  easeConch(pFile)
2e3e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2e3f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2e400 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
2e410 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
2e420 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c  hod->xClose((sql
2e430 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
2e440 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28  File);.      if(
2e450 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2e460 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2e470 72 65 65 28 63 6f 6e 63 68 46 69 6c 65 29 3b 0a  ree(conchFile);.
2e480 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2e490 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 6c 6f 63  3_free(pCtx->loc
2e4a0 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20  kProxyPath);.   
2e4b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
2e4c0 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74  tx->conchFilePat
2e4d0 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  h);.    sqlite3_
2e4e0 66 72 65 65 28 70 43 74 78 2d 3e 64 62 50 61 74  free(pCtx->dbPat
2e4f0 68 29 3b 0a 20 20 20 20 2f 2a 20 72 65 73 74 6f  h);.    /* resto
2e500 72 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  re the original 
2e510 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
2e520 61 6e 64 20 70 4d 65 74 68 6f 64 20 74 68 65 6e  and pMethod then
2e530 20 63 6c 6f 73 65 20 69 74 20 2a 2f 0a 20 20 20   close it */.   
2e540 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
2e550 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 2d 3e 6f  ontext = pCtx->o
2e560 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ldLockingContext
2e570 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65  ;.    pFile->pMe
2e580 74 68 6f 64 20 3d 20 70 43 74 78 2d 3e 70 4f 6c  thod = pCtx->pOl
2e590 64 4d 65 74 68 6f 64 3b 0a 20 20 20 20 73 71 6c  dMethod;.    sql
2e5a0 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 29 3b  ite3_free(pCtx);
2e5b0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 46 69 6c  .    return pFil
2e5c0 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f  e->pMethod->xClo
2e5d0 73 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65  se(id);.  }.  re
2e5e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2e5f0 7d 0a 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  }....#endif /* d
2e600 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2e610 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
2e620 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2e630 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72   */./*.** The pr
2e640 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c  oxy locking styl
2e650 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 66 6f  e is intended fo
2e660 72 20 75 73 65 20 77 69 74 68 20 41 46 50 20 66  r use with AFP f
2e670 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 20 41  ilesystems..** A
2e680 6e 64 20 73 69 6e 63 65 20 41 46 50 20 69 73 20  nd since AFP is 
2e690 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f  only supported o
2e6a0 6e 20 4d 61 63 4f 53 58 2c 20 74 68 65 20 70 72  n MacOSX, the pr
2e6b0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61  oxy locking is a
2e6c0 6c 73 6f 0a 2a 2a 20 72 65 73 74 72 69 63 74 65  lso.** restricte
2e6d0 64 20 74 6f 20 4d 61 63 4f 53 58 2e 0a 2a 2a 20  d to MacOSX..** 
2e6e0 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
2e6f0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
2e700 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 69 6d  he proxy lock im
2e710 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
2e720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e730 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
2e740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e780 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  **/../*.** Initi
2e790 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74  alize the operat
2e7a0 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72  ing system inter
2e7b0 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  face..**.** This
2e7c0 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65   routine registe
2e7d0 72 73 20 61 6c 6c 20 56 46 53 20 69 6d 70 6c 65  rs all VFS imple
2e7e0 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 75  mentations for u
2e7f0 6e 69 78 2d 6c 69 6b 65 20 6f 70 65 72 61 74 69  nix-like operati
2e800 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73 2e 20 20  ng.** systems.  
2e810 54 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 6e  This routine, an
2e820 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 73  d the sqlite3_os
2e830 5f 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 20 74  _end() routine t
2e840 68 61 74 20 66 6f 6c 6c 6f 77 73 2c 0a 2a 2a 20  hat follows,.** 
2e850 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6f 6e  should be the on
2e860 6c 79 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ly routines in t
2e870 68 69 73 20 66 69 6c 65 20 74 68 61 74 20 61 72  his file that ar
2e880 65 20 76 69 73 69 62 6c 65 20 66 72 6f 6d 20 6f  e visible from o
2e890 74 68 65 72 0a 2a 2a 20 66 69 6c 65 73 2e 0a 2a  ther.** files..*
2e8a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2e8b0 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65  e is called once
2e8c0 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 69   during SQLite i
2e8d0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 61 6e  nitialization an
2e8e0 64 20 62 79 20 61 0a 2a 2a 20 73 69 6e 67 6c 65  d by a.** single
2e8f0 20 74 68 72 65 61 64 2e 20 20 54 68 65 20 6d 65   thread.  The me
2e900 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
2e910 61 6e 64 20 6d 75 74 65 78 20 73 75 62 73 79 73  and mutex subsys
2e920 74 65 6d 73 20 68 61 76 65 20 6e 6f 74 0a 2a 2a  tems have not.**
2e930 20 6e 65 63 65 73 73 61 72 69 6c 79 20 62 65 65   necessarily bee
2e940 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68  n initialized wh
2e950 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2e960 69 73 20 63 61 6c 6c 65 64 2c 20 61 6e 64 20 73  is called, and s
2e970 6f 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64  o they.** should
2e980 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 0a 2a 2f   not be used..*/
2e990 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
2e9a0 69 6e 69 74 28 76 6f 69 64 29 7b 20 0a 20 20 2f  init(void){ .  /
2e9b0 2a 20 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  * .  ** The foll
2e9c0 6f 77 69 6e 67 20 6d 61 63 72 6f 20 64 65 66 69  owing macro defi
2e9d0 6e 65 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a  nes an initializ
2e9e0 65 72 20 66 6f 72 20 61 6e 20 73 71 6c 69 74 65  er for an sqlite
2e9f0 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 20 20  3_vfs object..  
2ea00 2a 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74  ** The name of t
2ea10 68 65 20 56 46 53 20 69 73 20 4e 41 4d 45 2e 20  he VFS is NAME. 
2ea20 20 54 68 65 20 70 41 70 70 44 61 74 61 20 69 73   The pAppData is
2ea30 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
2ea40 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 74 6f 20  pointer.  ** to 
2ea50 74 68 65 20 22 66 69 6e 64 65 72 22 20 66 75 6e  the "finder" fun
2ea60 63 74 69 6f 6e 2e 20 20 28 70 41 70 70 44 61 74  ction.  (pAppDat
2ea70 61 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  a is a pointer t
2ea80 6f 20 61 20 70 6f 69 6e 74 65 72 20 62 65 63 61  o a pointer beca
2ea90 75 73 65 0a 20 20 2a 2a 20 73 69 6c 6c 79 20 43  use.  ** silly C
2eaa0 39 30 20 72 75 6c 65 73 20 70 72 6f 68 69 62 69  90 rules prohibi
2eab0 74 20 61 20 76 6f 69 64 2a 20 66 72 6f 6d 20 62  t a void* from b
2eac0 65 69 6e 67 20 63 61 73 74 20 74 6f 20 61 20 66  eing cast to a f
2ead0 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 0a  unction pointer.
2eae0 20 20 2a 2a 20 61 6e 64 20 73 6f 20 77 65 20 68    ** and so we h
2eaf0 61 76 65 20 74 6f 20 67 6f 20 74 68 72 6f 75 67  ave to go throug
2eb00 68 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  h the intermedia
2eb10 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 76  te pointer to av
2eb20 6f 69 64 20 70 72 6f 62 6c 65 6d 73 0a 20 20 2a  oid problems.  *
2eb30 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * when compiling
2eb40 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d   with -pedantic-
2eb50 65 72 72 6f 72 73 20 6f 6e 20 47 43 43 2e 29 0a  errors on GCC.).
2eb60 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 46 49    **.  ** The FI
2eb70 4e 44 45 52 20 70 61 72 61 6d 65 74 65 72 20 74  NDER parameter t
2eb80 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20  o this macro is 
2eb90 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
2eba0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 20  pointer to the. 
2ebb0 20 2a 2a 20 66 69 6e 64 65 72 2d 66 75 6e 63 74   ** finder-funct
2ebc0 69 6f 6e 2e 20 20 54 68 65 20 66 69 6e 64 65 72  ion.  The finder
2ebd0 2d 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e  -function return
2ebe0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
2ebf0 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 69  he.  ** sqlite_i
2ec00 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
2ec10 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
2ec20 20 74 68 65 20 64 65 73 69 72 65 64 20 6c 6f 63   the desired loc
2ec30 6b 69 6e 67 0a 20 20 2a 2a 20 62 65 68 61 76 69  king.  ** behavi
2ec40 6f 72 73 2e 20 20 53 65 65 20 74 68 65 20 64 69  ors.  See the di
2ec50 76 69 73 69 6f 6e 20 61 62 6f 76 65 20 74 68 61  vision above tha
2ec60 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49  t contains the I
2ec70 4f 4d 45 54 48 4f 44 53 0a 20 20 2a 2a 20 6d 61  OMETHODS.  ** ma
2ec80 63 72 6f 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  cro for addition
2ec90 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
2eca0 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 73  finder-functions
2ecb0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 73 74  ..  **.  ** Most
2ecc0 20 66 69 6e 64 65 72 73 20 73 69 6d 70 6c 79 20   finders simply 
2ecd0 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
2ece0 20 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69   to a fixed sqli
2ecf0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 20  te3_io_methods. 
2ed00 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 42 75 74   ** object.  But
2ed10 20 74 68 65 20 22 61 75 74 6f 6c 6f 63 6b 49 6f   the "autolockIo
2ed20 46 69 6e 64 65 72 22 20 61 76 61 69 6c 61 62 6c  Finder" availabl
2ed30 65 20 6f 6e 20 4d 61 63 4f 53 58 20 64 6f 65 73  e on MacOSX does
2ed40 20 61 20 6c 69 74 74 6c 65 0a 20 20 2a 2a 20 6d   a little.  ** m
2ed50 6f 72 65 20 74 68 61 6e 20 74 68 61 74 3b 20 69  ore than that; i
2ed60 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66  t looks at the f
2ed70 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 74  ilesystem type t
2ed80 68 61 74 20 68 6f 73 74 73 20 74 68 65 20 0a 20  hat hosts the . 
2ed90 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
2eda0 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20 63  e and tries to c
2edb0 68 6f 6f 73 65 20 61 6e 20 6c 6f 63 6b 69 6e 67  hoose an locking
2edc0 20 6d 65 74 68 6f 64 20 61 70 70 72 6f 70 72 69   method appropri
2edd0 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 74 68 61  ate for.  ** tha
2ede0 74 20 66 69 6c 65 73 79 73 74 65 6d 20 74 69 6d  t filesystem tim
2edf0 65 2e 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e  e..  */.  #defin
2ee00 65 20 55 4e 49 58 56 46 53 28 56 46 53 4e 41 4d  e UNIXVFS(VFSNAM
2ee10 45 2c 20 46 49 4e 44 45 52 29 20 7b 20 20 20 20  E, FINDER) {    
2ee20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee30 20 20 20 20 5c 0a 20 20 20 20 31 2c 20 20 20 20      \.    1,    
2ee40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee50 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20  /* iVersion */  
2ee60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee70 20 20 5c 0a 20 20 20 20 73 69 7a 65 6f 66 28 75    \.    sizeof(u
2ee80 6e 69 78 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a  nixFile),     /*
2ee90 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 20 20 20 20   szOsFile */    
2eea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eeb0 5c 0a 20 20 20 20 4d 41 58 5f 50 41 54 48 4e 41  \.    MAX_PATHNA
2eec0 4d 45 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6d  ME,         /* m
2eed0 78 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20 20 20  xPathname */    
2eee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2eef0 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
2ef00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
2ef10 78 74 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  xt */           
2ef20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2ef30 20 20 56 46 53 4e 41 4d 45 2c 20 20 20 20 20 20    VFSNAME,      
2ef40 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65          /* zName
2ef50 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2ef60 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
2ef70 28 76 6f 69 64 2a 29 26 46 49 4e 44 45 52 2c 20  (void*)&FINDER, 
2ef80 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74        /* pAppDat
2ef90 61 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  a */            
2efa0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
2efb0 69 78 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  ixOpen,         
2efc0 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 20      /* xOpen */ 
2efd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2efe0 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
2eff0 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20  Delete,         
2f000 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 20    /* xDelete */ 
2f010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f020 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 41 63      \.    unixAc
2f030 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  cess,           
2f040 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 20 20 20  /* xAccess */   
2f050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f060 20 20 5c 0a 20 20 20 20 75 6e 69 78 46 75 6c 6c    \.    unixFull
2f070 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a  Pathname,     /*
2f080 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
2f090 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2f0a0 5c 0a 20 20 20 20 75 6e 69 78 44 6c 4f 70 65 6e  \.    unixDlOpen
2f0b0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
2f0c0 44 6c 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20 20  DlOpen */       
2f0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2f0e0 20 20 20 20 75 6e 69 78 44 6c 45 72 72 6f 72 2c      unixDlError,
2f0f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2f100 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20 20 20  Error */        
2f110 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2f120 20 20 75 6e 69 78 44 6c 53 79 6d 2c 20 20 20 20    unixDlSym,    
2f130 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79          /* xDlSy
2f140 6d 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  m */            
2f150 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
2f160 75 6e 69 78 44 6c 43 6c 6f 73 65 2c 20 20 20 20  unixDlClose,    
2f170 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
2f180 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
2f190 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
2f1a0 69 78 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20  ixRandomness,   
2f1b0 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65      /* xRandomne
2f1c0 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ss */           
2f1d0 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
2f1e0 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20  Sleep,          
2f1f0 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 20 20    /* xSleep */  
2f200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f210 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 43 75      \.    unixCu
2f220 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20  rrentTime,      
2f230 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20  /* xCurrentTime 
2f240 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
2f250 20 20 5c 0a 20 20 20 20 75 6e 69 78 47 65 74 4c    \.    unixGetL
2f260 61 73 74 45 72 72 6f 72 20 20 20 20 20 20 2f 2a  astError      /*
2f270 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a   xGetLastError *
2f280 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2f290 5c 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  \.  }..  /*.  **
2f2a0 20 41 6c 6c 20 64 65 66 61 75 6c 74 20 56 46 53   All default VFS
2f2b0 65 73 20 66 6f 72 20 75 6e 69 78 20 61 72 65 20  es for unix are 
2f2c0 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
2f2d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79   following array
2f2e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  ..  **.  ** Note
2f2f0 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
2f300 33 5f 76 66 73 2e 70 4e 65 78 74 20 66 69 65 6c  3_vfs.pNext fiel
2f310 64 20 6f 66 20 74 68 65 20 56 46 53 20 6f 62 6a  d of the VFS obj
2f320 65 63 74 20 69 73 20 6d 6f 64 69 66 69 65 64 0a  ect is modified.
2f330 20 20 2a 2a 20 62 79 20 74 68 65 20 53 51 4c 69    ** by the SQLi
2f340 74 65 20 63 6f 72 65 20 77 68 65 6e 20 74 68 65  te core when the
2f350 20 56 46 53 20 69 73 20 72 65 67 69 73 74 65 72   VFS is register
2f360 65 64 2e 20 20 53 6f 20 74 68 65 20 66 6f 6c 6c  ed.  So the foll
2f370 6f 77 69 6e 67 0a 20 20 2a 2a 20 61 72 72 61 79  owing.  ** array
2f380 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 73 74   cannot be const
2f390 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  ..  */.  static 
2f3a0 73 71 6c 69 74 65 33 5f 76 66 73 20 61 56 66 73  sqlite3_vfs aVfs
2f3b0 5b 5d 20 3d 20 7b 0a 23 69 66 20 53 51 4c 49 54  [] = {.#if SQLIT
2f3c0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2f3d0 5f 53 54 59 4c 45 20 26 26 20 28 4f 53 5f 56 58  _STYLE && (OS_VX
2f3e0 57 4f 52 4b 53 20 7c 7c 20 64 65 66 69 6e 65 64  WORKS || defined
2f3f0 28 5f 5f 41 50 50 4c 45 5f 5f 29 29 0a 20 20 20  (__APPLE__)).   
2f400 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 22 2c   UNIXVFS("unix",
2f410 20 20 20 20 20 20 20 20 20 20 61 75 74 6f 6c 6f            autolo
2f420 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65  ckIoFinder ),.#e
2f430 6c 73 65 0a 20 20 20 20 55 4e 49 58 56 46 53 28  lse.    UNIXVFS(
2f440 22 75 6e 69 78 22 2c 20 20 20 20 20 20 20 20 20  "unix",         
2f450 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29   posixIoFinder )
2f460 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 55 4e 49  ,.#endif.    UNI
2f470 58 56 46 53 28 22 75 6e 69 78 2d 6e 6f 6e 65 22  XVFS("unix-none"
2f480 2c 20 20 20 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69  ,     nolockIoFi
2f490 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49 58  nder ),.    UNIX
2f4a0 56 46 53 28 22 75 6e 69 78 2d 64 6f 74 66 69 6c  VFS("unix-dotfil
2f4b0 65 22 2c 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69  e",  dotlockIoFi
2f4c0 6e 64 65 72 20 29 2c 0a 23 69 66 20 4f 53 5f 56  nder ),.#if OS_V
2f4d0 58 57 4f 52 4b 53 0a 20 20 20 20 55 4e 49 58 56  XWORKS.    UNIXV
2f4e0 46 53 28 22 75 6e 69 78 2d 6e 61 6d 65 64 73 65  FS("unix-namedse
2f4f0 6d 22 2c 20 73 65 6d 49 6f 46 69 6e 64 65 72 20  m", semIoFinder 
2f500 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  ),.#endif.#if SQ
2f510 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2f520 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 55 4e  ING_STYLE.    UN
2f530 49 58 56 46 53 28 22 75 6e 69 78 2d 70 6f 73 69  IXVFS("unix-posi
2f540 78 22 2c 20 20 20 20 70 6f 73 69 78 49 6f 46 69  x",    posixIoFi
2f550 6e 64 65 72 20 29 2c 0a 23 69 66 20 21 4f 53 5f  nder ),.#if !OS_
2f560 56 58 57 4f 52 4b 53 0a 20 20 20 20 55 4e 49 58  VXWORKS.    UNIX
2f570 56 46 53 28 22 75 6e 69 78 2d 66 6c 6f 63 6b 22  VFS("unix-flock"
2f580 2c 20 20 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64  ,    flockIoFind
2f590 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 23 65 6e  er ),.#endif.#en
2f5a0 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
2f5b0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2f5c0 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
2f5d0 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 55 4e  _APPLE__).    UN
2f5e0 49 58 56 46 53 28 22 75 6e 69 78 2d 61 66 70 22  IXVFS("unix-afp"
2f5f0 2c 20 20 20 20 20 20 61 66 70 49 6f 46 69 6e 64  ,      afpIoFind
2f600 65 72 20 29 2c 0a 20 20 20 20 55 4e 49 58 56 46  er ),.    UNIXVF
2f610 53 28 22 75 6e 69 78 2d 6e 66 73 22 2c 20 20 20  S("unix-nfs",   
2f620 20 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 20 29     nfsIoFinder )
2f630 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ,.    UNIXVFS("u
2f640 6e 69 78 2d 70 72 6f 78 79 22 2c 20 20 20 20 70  nix-proxy",    p
2f650 72 6f 78 79 49 6f 46 69 6e 64 65 72 20 29 2c 0a  roxyIoFinder ),.
2f660 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 75 6e  #endif.  };.  un
2f670 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 20 20 20  signed int i;   
2f680 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2f690 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20  ounter */..  /* 
2f6a0 52 65 67 69 73 74 65 72 20 61 6c 6c 20 56 46 53  Register all VFS
2f6b0 65 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68  es defined in th
2f6c0 65 20 61 56 66 73 5b 5d 20 61 72 72 61 79 20 2a  e aVfs[] array *
2f6d0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28  /.  for(i=0; i<(
2f6e0 73 69 7a 65 6f 66 28 61 56 66 73 29 2f 73 69 7a  sizeof(aVfs)/siz
2f6f0 65 6f 66 28 73 71 6c 69 74 65 33 5f 76 66 73 29  eof(sqlite3_vfs)
2f700 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ); i++){.    sql
2f710 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
2f720 72 28 26 61 56 66 73 5b 69 5d 2c 20 69 3d 3d 30  r(&aVfs[i], i==0
2f730 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2f740 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f  SQLITE_OK; .}../
2f750 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
2f760 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
2f770 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  em interface..**
2f780 0a 2a 2a 20 53 6f 6d 65 20 6f 70 65 72 61 74 69  .** Some operati
2f790 6e 67 20 73 79 73 74 65 6d 73 20 6d 69 67 68 74  ng systems might
2f7a0 20 6e 65 65 64 20 74 6f 20 64 6f 20 73 6f 6d 65   need to do some
2f7b0 20 63 6c 65 61 6e 75 70 20 69 6e 20 74 68 69 73   cleanup in this
2f7c0 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 74 6f 20   routine,.** to 
2f7d0 72 65 6c 65 61 73 65 20 64 79 6e 61 6d 69 63 61  release dynamica
2f7e0 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6f 62  lly allocated ob
2f7f0 6a 65 63 74 73 2e 20 20 42 75 74 20 6e 6f 74 20  jects.  But not 
2f800 6f 6e 20 75 6e 69 78 2e 0a 2a 2a 20 54 68 69 73  on unix..** This
2f810 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
2f820 2d 6f 70 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f  -op for unix..*/
2f830 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
2f840 65 6e 64 28 76 6f 69 64 29 7b 20 0a 20 20 72 65  end(void){ .  re
2f850 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
2f860 0a 7d 0a 20 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .}. .#endif /* S
2f870 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 2a 2f  QLITE_OS_UNIX */
2f880 0a                                               .