/ Hex Artifact Content
Login

Artifact 68ca0b5e203c7f56bfad37062ba83f94840ef015:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
0c30: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0c40: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0c50: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0c60: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0c70: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0c90: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0ca0: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0cb0: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0cc0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0cd0: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0ce0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0cf0: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d00: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0d10: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0d20: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0d30: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0d40: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0d50: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0d60: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0d70: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0d80: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0d90: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0da0: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0db0: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0dc0: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0dd0: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0de0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0df0: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e00: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0e10: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0e20: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0e30: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0e40: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0e50: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0e60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0e70: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0e80: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0e90: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0ea0: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0ec0: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0ed0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0ee0: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0ef0: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f00: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0f10: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0f20: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0f30: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0f40: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0f50: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0f60: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
0f70: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
0f80: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
0f90: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
0fa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
0fb0: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
0fc0: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
0fd0: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
0fe0: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1010: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
1020: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
1040: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
1050: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
1060: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1070: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1090: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
10a0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
10b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
10c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
10d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
10e0: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
10f0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1100: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1110: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
1130: 6e 6f 2e 68 3e 0a 23 69 66 6e 64 65 66 20 53 51  no.h>.#ifndef SQ
1140: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23 69  LITE_OMIT_WAL.#i
1150: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e  nclude <sys/mman
1160: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  .h>.#endif..#if 
1170: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1180: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e  CKING_STYLE.# in
1190: 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c  clude <sys/ioctl
11a0: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75  .h>.# include <u
11b0: 75 69 64 2f 75 75 69 64 2e 68 3e 0a 23 20 69 66  uid/uuid.h>.# if
11c0: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
11d0: 5f 5f 29 20 26 26 20 28 28 5f 5f 4d 41 43 5f 4f  __) && ((__MAC_O
11e0: 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f  S_X_VERSION_MIN_
11f0: 52 45 51 55 49 52 45 44 20 3e 20 31 30 35 30 29  REQUIRED > 1050)
1200: 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20   || \.          
1210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1220: 20 20 28 5f 5f 49 50 48 4f 4e 45 5f 4f 53 5f 56    (__IPHONE_OS_V
1230: 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49  ERSION_MIN_REQUI
1240: 52 45 44 20 3e 20 32 30 30 30 29 29 0a 23 20 20  RED > 2000)).#  
1250: 64 65 66 69 6e 65 20 48 41 56 45 5f 47 45 54 48  define HAVE_GETH
1260: 4f 53 54 55 55 49 44 20 31 0a 23 20 65 6e 64 69  OSTUUID 1.# endi
1270: 66 0a 23 20 69 66 20 4f 53 5f 56 58 57 4f 52 4b  f.# if OS_VXWORK
1280: 53 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 65  S.#  include <se
1290: 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 20 69 6e  maphore.h>.#  in
12a0: 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e  clude <limits.h>
12b0: 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75  .# else.#  inclu
12c0: 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a  de <sys/file.h>.
12d0: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  #  include <sys/
12e0: 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e 64 69 66  param.h>.# endif
12f0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1300: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1310: 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64  _STYLE */..#if d
1320: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1330: 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f 45 4e 41  ) || (SQLITE_ENA
1340: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1350: 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53  E && !OS_VXWORKS
1360: 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  ).# include <sys
1370: 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66  /mount.h>.#endif
1380: 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f 55 54  ..#ifdef HAVE_UT
1390: 49 4d 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75  IME.# include <u
13a0: 74 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a  time.h>.#endif..
13b0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61  /*.** Allowed va
13c0: 6c 75 65 73 20 6f 66 20 75 6e 69 78 46 69 6c 65  lues of unixFile
13d0: 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66  .fsFlags.*/.#def
13e0: 69 6e 65 20 53 51 4c 49 54 45 5f 46 53 46 4c 41  ine SQLITE_FSFLA
13f0: 47 53 5f 49 53 5f 4d 53 44 4f 53 20 20 20 20 20  GS_IS_MSDOS     
1400: 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65  0x1../*.** If we
1410: 20 61 72 65 20 74 6f 20 62 65 20 74 68 72 65 61   are to be threa
1420: 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75 64 65 20  d-safe, include 
1430: 74 68 65 20 70 74 68 72 65 61 64 73 20 68 65 61  the pthreads hea
1440: 64 65 72 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a  der and define.*
1450: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 55 4e 49  * the SQLITE_UNI
1460: 58 5f 54 48 52 45 41 44 53 20 6d 61 63 72 6f 2e  X_THREADS macro.
1470: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  .*/.#if SQLITE_T
1480: 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e 63 6c  HREADSAFE.# incl
1490: 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a  ude <pthread.h>.
14a0: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
14b0: 55 4e 49 58 5f 54 48 52 45 41 44 53 20 31 0a 23  UNIX_THREADS 1.#
14c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  endif../*.** Def
14d0: 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73  ault permissions
14e0: 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61   when creating a
14f0: 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66   new file.*/.#if
1500: 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41  ndef SQLITE_DEFA
1510: 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
1520: 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51  IONS.# define SQ
1530: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
1540: 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 36  E_PERMISSIONS 06
1550: 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  44.#endif../*. *
1560: 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73  * Default permis
1570: 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74  sions when creat
1580: 69 6e 67 20 61 75 74 6f 20 70 72 6f 78 79 20 64  ing auto proxy d
1590: 69 72 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ir. */.#ifndef S
15a0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
15b0: 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
15c0: 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  NS.# define SQLI
15d0: 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59  TE_DEFAULT_PROXY
15e0: 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  DIR_PERMISSIONS 
15f0: 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0755.#endif../*.
1600: 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70 70 6f  ** Maximum suppo
1610: 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67 74 68  rted path-length
1620: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58  ..*/.#define MAX
1630: 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a 0a 2f  _PATHNAME 512../
1640: 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74 68  *.** Only set th
1650: 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20 74  e lastErrno if t
1660: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
1670: 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61 6e   a real error an
1680: 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72 6d  d not .** a norm
1690: 61 6c 20 65 78 70 65 63 74 65 64 20 72 65 74 75  al expected retu
16a0: 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49 54  rn code of SQLIT
16b0: 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54 45  E_BUSY or SQLITE
16c0: 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49  _OK.*/.#define I
16d0: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29 20  S_LOCK_ERROR(x) 
16e0: 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 4f   ((x != SQLITE_O
16f0: 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c 49  K) && (x != SQLI
1700: 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20 46 6f  TE_BUSY))../* Fo
1710: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73  rward references
1720: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
1730: 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69 78 53  ct unixShm unixS
1740: 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hm;             
1750: 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
1760: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
1770: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1780: 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e 69 78  unixShmNode unix
1790: 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 2f  ShmNode;       /
17a0: 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * Shared memory 
17b0: 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79 70 65  instance */.type
17c0: 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 49  def struct unixI
17d0: 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49 6e 6f  nodeInfo unixIno
17e0: 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e 20  deInfo;   /* An 
17f0: 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65 64 65  i-node */.typede
1800: 66 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e 75  f struct UnixUnu
1810: 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65 64  sedFd UnixUnused
1820: 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e  Fd;     /* An un
1830: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
1840: 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  ptor */../*.** S
1850: 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72 20  ometimes, after 
1860: 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69 73  a file handle is
1870: 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69 74   closed by SQLit
1880: 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  e, the file desc
1890: 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f 74  riptor.** cannot
18a0: 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64   be closed immed
18b0: 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73 65  iately. In these
18c0: 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63 65   cases, instance
18d0: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
18e0: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  ng.** structure 
18f0: 61 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72  are used to stor
1900: 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
1910: 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69 74  iptor while wait
1920: 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f 70  ing for an.** op
1930: 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69 74  portunity to eit
1940: 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65 75  her close or reu
1950: 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74  se it..*/.struct
1960: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 7b 0a   UnixUnusedFd {.
1970: 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
1980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1990: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
19a0: 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e 74  o close */.  int
19b0: 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20   flags;         
19c0: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
19d0: 74 68 69 73 20 66 69 6c 65 20 64 65 73 63 72 69  this file descri
19e0: 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  ptor was opened 
19f0: 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  with */.  UnixUn
1a00: 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 20 20  usedFd *pNext;  
1a10: 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75 73      /* Next unus
1a20: 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
1a30: 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c 65 20  or on same file 
1a40: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  */.};../*.** The
1a50: 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
1a60: 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73 20  ure is subclass 
1a70: 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  of sqlite3_file 
1a80: 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65 20  specific to the 
1a90: 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d 70 6c  unix.** VFS impl
1aa0: 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f 0a  ementations..*/.
1ab0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75  typedef struct u
1ac0: 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c 65  nixFile unixFile
1ad0: 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c  ;.struct unixFil
1ae0: 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  e {.  sqlite3_io
1af0: 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a  _methods const *
1b00: 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c 77  pMethod;  /* Alw
1b10: 61 79 73 20 74 68 65 20 66 69 72 73 74 20 65 6e  ays the first en
1b20: 74 72 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  try */.  unixIno
1b30: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b50: 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73  Info about locks
1b60: 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a   on this inode *
1b70: 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20  /.  int h;      
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1ba0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1bb0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1bc0: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
1bd0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1be0: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64  ype of lock held
1bf0: 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20   on this fd */. 
1c00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
1c10: 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20  trlFlags;       
1c20: 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72       /* Behavior
1c30: 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49  al bits.  UNIXFI
1c40: 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20  LE_* flags */.  
1c50: 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  int lastErrno;  
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c70: 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20      /* The unix 
1c80: 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20  errno from last 
1c90: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76  I/O error */.  v
1ca0: 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oid *lockingCont
1cb0: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
1cc0: 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74     /* Locking st
1cd0: 79 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61  yle specific sta
1ce0: 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  te */.  UnixUnus
1cf0: 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20  edFd *pUnused;  
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1d10: 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69  re-allocated Uni
1d20: 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63  xUnusedFd */.  c
1d30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
1d40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d50: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1d60: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
1d70: 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20  Shm *pShm;      
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d90: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
1da0: 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61   segment informa
1db0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  tion */.  int sz
1dc0: 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  Chunk;          
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1de0: 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   Configured by F
1df0: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
1e00: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
1e10: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1e20: 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  LE.  int openFla
1e30: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1e40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e50: 66 6c 61 67 73 20 73 70 65 63 69 66 69 65 64 20  flags specified 
1e60: 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65 6e  at open() */.#en
1e70: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
1e80: 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45  NABLE_DATA_PROTE
1e90: 43 54 49 4f 4e 0a 20 20 69 6e 74 20 70 72 6f 74  CTION.  int prot
1ea0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1ec0: 61 74 61 20 70 72 6f 74 65 63 74 69 6f 6e 20 66  ata protection f
1ed0: 6c 61 67 73 20 66 72 6f 6d 20 75 6e 69 78 4f 70  lags from unixOp
1ee0: 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  en */.#endif.#if
1ef0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1f00: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20  OCKING_STYLE || 
1f10: 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1f20: 5f 29 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73  _).  unsigned fs
1f30: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
1f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68           /* cach
1f50: 65 64 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20  ed details from 
1f60: 73 74 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64  statfs() */.#end
1f70: 69 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  if.#if OS_VXWORK
1f80: 53 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  S.  int isDelete
1f90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fa0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
1fb0: 65 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72  e on close if tr
1fc0: 75 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76  ue */.  struct v
1fd0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49  xworksFileId *pI
1fe0: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  d;          /* U
1ff0: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 2a 2f  nique file ID */
2000: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
2010: 4e 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  NDEBUG.  /* The 
2020: 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61  next group of va
2030: 72 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64  riables are used
2040: 20 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65   to track whethe
2050: 72 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a  r or not the.  *
2060: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
2070: 75 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32  unter in bytes 2
2080: 34 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65  4-27 of database
2090: 20 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74   files are updat
20a0: 65 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72  ed.  ** whenever
20b0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
20c0: 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
20d0: 73 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e  s.  An assertion
20e0: 20 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a   fault will.  **
20f0: 20 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65   occur if a file
2100: 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68   is updated with
2110: 6f 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e  out also updatin
2120: 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  g the transactio
2130: 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20  n.  ** counter. 
2140: 20 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61   This test is ma
2150: 64 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20  de to avoid new 
2160: 70 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72  problems similar
2170: 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65   to the.  ** one
2180: 20 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69   described by ti
2190: 63 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a  cket #3584. .  *
21a0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
21b0: 72 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b  r transCntrChng;
21c0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
21d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
21e0: 75 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f  unter changed */
21f0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2200: 20 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20   dbUpdate;      
2210: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79    /* True if any
2220: 20 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73   part of databas
2230: 65 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a  e file changed *
2240: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
2250: 72 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b  r inNormalWrite;
2260: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e     /* True if in
2270: 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20   a normal write 
2280: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 23 65 6e  operation */.#en
2290: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
22a0: 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74  E_TEST.  /* In t
22b0: 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61  est mode, increa
22c0: 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
22d0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61 20  his structure a 
22e0: 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20 2a  bit so that .  *
22f0: 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20 74  * it is larger t
2300: 68 61 6e 20 74 68 65 20 73 74 72 75 63 74 20 43  han the struct C
2310: 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65 64  rashFile defined
2320: 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a   in test6.c..  *
2330: 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64 69 6e  /.  char aPaddin
2340: 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b  g[32];.#endif.};
2350: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20  ../*.** Allowed 
2360: 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 75  values for the u
2370: 6e 69 78 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67  nixFile.ctrlFlag
2380: 73 20 62 69 74 6d 61 73 6b 3a 0a 2a 2f 0a 23 64  s bitmask:.*/.#d
2390: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 45  efine UNIXFILE_E
23a0: 58 43 4c 20 20 20 20 20 20 20 20 30 78 30 31 20  XCL        0x01 
23b0: 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
23c0: 6e 73 20 66 72 6f 6d 20 6f 6e 65 20 70 72 6f 63  ns from one proc
23d0: 65 73 73 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66  ess only */.#def
23e0: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f  ine UNIXFILE_RDO
23f0: 4e 4c 59 20 20 20 20 20 20 30 78 30 32 20 20 20  NLY      0x02   
2400: 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
2410: 69 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a  is read only */.
2420: 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45  #define UNIXFILE
2430: 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 30 78 30  _PERSIST_WAL 0x0
2440: 34 20 20 20 20 20 2f 2a 20 50 65 72 73 69 73 74  4     /* Persist
2450: 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a  ent WAL mode */.
2460: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
2470: 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 23  ISABLE_DIRSYNC.#
2480: 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45   define UNIXFILE
2490: 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30 38  _DIRSYNC    0x08
24a0: 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72       /* Director
24b0: 79 20 73 79 6e 63 20 6e 65 65 64 65 64 20 2a 2f  y sync needed */
24c0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
24d0: 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
24e0: 20 20 20 20 30 78 30 30 0a 23 65 6e 64 69 66 0a      0x00.#endif.
24f0: 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63  ./*.** Include c
2500: 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d  ode that is comm
2510: 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63  on to all os_*.c
2520: 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75   files.*/.#inclu
2530: 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22  de "os_common.h"
2540: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76  ../*.** Define v
2550: 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68  arious macros th
2560: 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66  at are missing f
2570: 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73  rom some systems
2580: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c  ..*/.#ifndef O_L
2590: 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e  ARGEFILE.# defin
25a0: 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a  e O_LARGEFILE 0.
25b0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
25c0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
25d0: 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45  .# undef O_LARGE
25e0: 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f  FILE.# define O_
25f0: 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64  LARGEFILE 0.#end
2600: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46  if.#ifndef O_NOF
2610: 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f  OLLOW.# define O
2620: 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64  _NOFOLLOW 0.#end
2630: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e  if.#ifndef O_BIN
2640: 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42  ARY.# define O_B
2650: 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a  INARY 0.#endif..
2660: 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64  /*.** The thread
2670: 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65  id macro resolve
2680: 73 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d  s to the thread-
2690: 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65  id or to 0.  Use
26a0: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
26b0: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
26c0: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  nly..*/.#if SQLI
26d0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64  TE_THREADSAFE.#d
26e0: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70  efine threadid p
26f0: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65  thread_self().#e
2700: 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65  lse.#define thre
2710: 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 23  adid 0.#endif..#
2720: 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a  ifdef __APPLE__.
2730: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45  #define SQLITE_E
2740: 4e 41 42 4c 45 5f 53 55 50 45 52 4c 4f 43 4b 20  NABLE_SUPERLOCK 
2750: 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  1.#endif..#if SQ
2760: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 55 50 45  LITE_ENABLE_SUPE
2770: 52 4c 4f 43 4b 0a 23 69 6e 63 6c 75 64 65 20 22  RLOCK.#include "
2780: 73 71 6c 69 74 65 33 2e 68 22 0a 23 69 6e 63 6c  sqlite3.h".#incl
2790: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23  ude <string.h>.#
27a0: 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e  include <assert.
27b0: 68 3e 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75  h>../*.** A stru
27c0: 63 74 75 72 65 20 74 6f 20 63 6f 6c 6c 65 63 74  cture to collect
27d0: 20 61 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20   a busy-handler 
27e0: 63 61 6c 6c 62 61 63 6b 20 61 6e 64 20 61 72 67  callback and arg
27f0: 75 6d 65 6e 74 20 61 6e 64 20 61 20 63 6f 75 6e  ument and a coun
2800: 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6e 75 6d 62  t.** of the numb
2810: 65 72 20 6f 66 20 74 69 6d 65 73 20 69 74 20 68  er of times it h
2820: 61 73 20 62 65 65 6e 20 69 6e 76 6f 6b 65 64 2e  as been invoked.
2830: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 75 70 65 72  .*/.struct Super
2840: 6c 6f 63 6b 42 75 73 79 20 7b 0a 20 20 69 6e 74  lockBusy {.  int
2850: 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64 2a 2c   (*xBusy)(void*,
2860: 69 6e 74 29 3b 20 20 20 20 20 20 20 20 2f 2a 20  int);        /* 
2870: 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d  Pointer to busy-
2880: 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
2890: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73   */.  void *pBus
28a0: 79 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  yArg;           
28b0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
28c0: 72 67 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42  rg to pass to xB
28d0: 75 73 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 75  usy */.  int nBu
28e0: 73 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sy;             
28f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2900: 65 72 20 6f 66 20 74 69 6d 65 73 20 78 42 75 73  er of times xBus
2910: 79 20 68 61 73 20 62 65 65 6e 20 69 6e 76 6f 6b  y has been invok
2920: 65 64 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65 66  ed */.};.typedef
2930: 20 73 74 72 75 63 74 20 53 75 70 65 72 6c 6f 63   struct Superloc
2940: 6b 42 75 73 79 20 53 75 70 65 72 6c 6f 63 6b 42  kBusy SuperlockB
2950: 75 73 79 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  usy;../*.** An i
2960: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
2970: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
2980: 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  re is allocated 
2990: 66 6f 72 20 65 61 63 68 20 61 63 74 69 76 65 0a  for each active.
29a0: 2a 2a 20 73 75 70 65 72 6c 6f 63 6b 2e 20 54 68  ** superlock. Th
29b0: 65 20 6f 70 61 71 75 65 20 68 61 6e 64 6c 65 20  e opaque handle 
29c0: 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
29d0: 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63  te3demo_superloc
29e0: 6b 28 29 20 69 73 0a 2a 2a 20 61 63 74 75 61 6c  k() is.** actual
29f0: 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ly a pointer to 
2a00: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
2a10: 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  his structure..*
2a20: 2f 0a 73 74 72 75 63 74 20 53 75 70 65 72 6c 6f  /.struct Superlo
2a30: 63 6b 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ck {.  sqlite3 *
2a40: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
2a50: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
2a60: 73 65 20 68 61 6e 64 6c 65 20 75 73 65 64 20 74  se handle used t
2a70: 6f 20 6c 6f 63 6b 20 64 62 20 2a 2f 0a 20 20 69  o lock db */.  i
2a80: 6e 74 20 62 57 61 6c 3b 20 20 20 20 20 20 20 20  nt bWal;        
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2aa0: 2a 20 54 72 75 65 20 69 66 20 64 62 20 69 73 20  * True if db is 
2ab0: 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 20 2a  a WAL database *
2ac0: 2f 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74 72  /.};.typedef str
2ad0: 75 63 74 20 53 75 70 65 72 6c 6f 63 6b 20 53 75  uct Superlock Su
2ae0: 70 65 72 6c 6f 63 6b 3b 0a 0a 2f 2a 0a 2a 2a 20  perlock;../*.** 
2af0: 54 68 65 20 70 43 74 78 20 70 6f 69 6e 74 65 72  The pCtx pointer
2b00: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
2b10: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 63 74 75  function is actu
2b20: 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
2b30: 6f 20 61 0a 2a 2a 20 53 75 70 65 72 6c 6f 63 6b  o a.** Superlock
2b40: 42 75 73 79 20 73 74 72 75 63 74 75 72 65 2e 20  Busy structure. 
2b50: 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 2d  Invoke the busy-
2b60: 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
2b70: 20 65 6e 63 61 70 73 75 6c 61 74 65 64 0a 2a 2a   encapsulated.**
2b80: 20 62 79 20 74 68 65 20 73 74 72 75 63 74 75 72   by the structur
2b90: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  e and return the
2ba0: 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74   result..*/.stat
2bb0: 69 63 20 69 6e 74 20 73 75 70 65 72 6c 6f 63 6b  ic int superlock
2bc0: 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64  BusyHandler(void
2bd0: 20 2a 70 43 74 78 2c 20 69 6e 74 20 55 4e 55 53   *pCtx, int UNUS
2be0: 45 44 29 7b 0a 20 20 53 75 70 65 72 6c 6f 63 6b  ED){.  Superlock
2bf0: 42 75 73 79 20 2a 70 42 75 73 79 20 3d 20 28 53  Busy *pBusy = (S
2c00: 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 2a 29 70  uperlockBusy *)p
2c10: 43 74 78 3b 0a 20 20 69 66 28 20 70 42 75 73 79  Ctx;.  if( pBusy
2c20: 2d 3e 78 42 75 73 79 3d 3d 30 20 29 20 72 65 74  ->xBusy==0 ) ret
2c30: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
2c40: 70 42 75 73 79 2d 3e 78 42 75 73 79 28 70 42 75  pBusy->xBusy(pBu
2c50: 73 79 2d 3e 70 42 75 73 79 41 72 67 2c 20 70 42  sy->pBusyArg, pB
2c60: 75 73 79 2d 3e 6e 42 75 73 79 2b 2b 29 3b 0a 7d  usy->nBusy++);.}
2c70: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2c80: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
2c90: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
2ca0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
2cb0: 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 63 6f 6e  file for .** con
2cc0: 6e 65 63 74 69 6f 6e 20 64 62 20 69 73 20 6f 70  nection db is op
2cd0: 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 20 6f  en in WAL mode o
2ce0: 72 20 6e 6f 74 2e 20 49 66 20 6e 6f 20 65 72 72  r not. If no err
2cf0: 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  or occurs and th
2d00: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  e.** database fi
2d10: 6c 65 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64  le is in WAL mod
2d20: 65 2c 20 73 65 74 20 2a 70 62 57 61 6c 20 74 6f  e, set *pbWal to
2d30: 20 74 72 75 65 20 61 6e 64 20 72 65 74 75 72 6e   true and return
2d40: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49   SQLITE_OK..** I
2d50: 66 20 69 74 20 69 73 20 6e 6f 74 20 69 6e 20 57  f it is not in W
2d60: 41 4c 20 6d 6f 64 65 2c 20 73 65 74 20 2a 70 62  AL mode, set *pb
2d70: 57 61 6c 20 74 6f 20 66 61 6c 73 65 2e 0a 2a 2a  Wal to false..**
2d80: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
2d90: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61  occurs, return a
2da0: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
2db0: 6f 64 65 2e 20 54 68 65 20 76 61 6c 75 65 20 6f  ode. The value o
2dc0: 66 20 2a 70 62 57 61 6c 0a 2a 2a 20 69 73 20 75  f *pbWal.** is u
2dd0: 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73  ndefined in this
2de0: 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   case..*/.static
2df0: 20 69 6e 74 20 73 75 70 65 72 6c 6f 63 6b 49 73   int superlockIs
2e00: 57 61 6c 28 53 75 70 65 72 6c 6f 63 6b 20 2a 70  Wal(Superlock *p
2e10: 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Lock){.  int rc;
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e30: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2e40: 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn Code */.  sql
2e50: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
2e60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2e70: 43 6f 6d 70 69 6c 65 64 20 50 52 41 47 4d 41 20  Compiled PRAGMA 
2e80: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 73 74 61  journal_mode sta
2e90: 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 72 63 20  tement */..  rc 
2ea0: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
2eb0: 65 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20 22 50 52  e(pLock->db, "PR
2ec0: 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72 6e 61  AGMA main.journa
2ed0: 6c 5f 6d 6f 64 65 22 2c 20 2d 31 2c 20 26 70 53  l_mode", -1, &pS
2ee0: 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  tmt, 0);.  if( r
2ef0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
2f00: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 4c 6f  eturn rc;..  pLo
2f10: 63 6b 2d 3e 62 57 61 6c 20 3d 20 30 3b 0a 20 20  ck->bWal = 0;.  
2f20: 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
2f30: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
2f40: 6d 74 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  mt) ){.    const
2f50: 20 63 68 61 72 20 2a 7a 4d 6f 64 65 20 3d 20 28   char *zMode = (
2f60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c  const char *)sql
2f70: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
2f80: 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
2f90: 69 66 28 20 7a 4d 6f 64 65 20 26 26 20 73 74 72  if( zMode && str
2fa0: 6c 65 6e 28 7a 4d 6f 64 65 29 3d 3d 33 20 26 26  len(zMode)==3 &&
2fb0: 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
2fc0: 70 28 22 77 61 6c 22 2c 20 7a 4d 6f 64 65 2c 20  p("wal", zMode, 
2fd0: 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  3)==0 ){.      p
2fe0: 4c 6f 63 6b 2d 3e 62 57 61 6c 20 3d 20 31 3b 0a  Lock->bWal = 1;.
2ff0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
3000: 75 72 6e 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  urn sqlite3_fina
3010: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a  lize(pStmt);.}..
3020: 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 6e 20  /*.** Obtain an 
3030: 65 78 63 6c 75 73 69 76 65 20 73 68 6d 2d 6c 6f  exclusive shm-lo
3040: 63 6b 20 6f 6e 20 6e 42 79 74 65 20 62 79 74 65  ck on nByte byte
3050: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66  s starting at of
3060: 66 73 65 74 20 69 64 78 0a 2a 2a 20 6f 66 20 74  fset idx.** of t
3070: 68 65 20 66 69 6c 65 20 66 64 2e 20 49 66 20 74  he file fd. If t
3080: 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  he lock cannot b
3090: 65 20 6f 62 74 61 69 6e 65 64 20 69 6d 6d 65 64  e obtained immed
30a0: 69 61 74 65 6c 79 2c 20 69 6e 76 6f 6b 65 0a 2a  iately, invoke.*
30b0: 2a 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  * the busy-handl
30c0: 65 72 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20  er until either 
30d0: 69 74 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f  it is obtained o
30e0: 72 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  r the busy-handl
30f0: 65 72 0a 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 72  er.** callback r
3100: 65 74 75 72 6e 73 20 30 2e 0a 2a 2f 0a 73 74 61  eturns 0..*/.sta
3110: 74 69 63 20 69 6e 74 20 73 75 70 65 72 6c 6f 63  tic int superloc
3120: 6b 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69  kShmLock(.  sqli
3130: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
3140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
3150: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e  atabase file han
3160: 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  dle */.  int idx
3170: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3180: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
3190: 65 74 20 6f 66 20 73 68 6d 2d 6c 6f 63 6b 20 74  et of shm-lock t
31a0: 6f 20 6f 62 74 61 69 6e 20 2a 2f 0a 20 20 69 6e  o obtain */.  in
31b0: 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20  t nByte,        
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31d0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 65   Number of conse
31e0: 63 74 69 76 65 20 62 79 74 65 73 20 74 6f 20 6c  ctive bytes to l
31f0: 6f 63 6b 20 2a 2f 0a 20 20 53 75 70 65 72 6c 6f  ock */.  Superlo
3200: 63 6b 42 75 73 79 20 2a 70 42 75 73 79 20 20 20  ckBusy *pBusy   
3210: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 73 79           /* Busy
3220: 2d 68 61 6e 64 6c 65 72 20 77 72 61 70 70 65 72  -handler wrapper
3230: 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
3240: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 28 2a  int rc;.  int (*
3250: 78 53 68 6d 4c 6f 63 6b 29 28 73 71 6c 69 74 65  xShmLock)(sqlite
3260: 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2c 20 69 6e  3_file*, int, in
3270: 74 2c 20 69 6e 74 29 20 3d 20 66 64 2d 3e 70 4d  t, int) = fd->pM
3280: 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b  ethods->xShmLock
3290: 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20  ;.  do {.    rc 
32a0: 3d 20 78 53 68 6d 4c 6f 63 6b 28 66 64 2c 20 69  = xShmLock(fd, i
32b0: 64 78 2c 20 6e 42 79 74 65 2c 20 53 51 4c 49 54  dx, nByte, SQLIT
32c0: 45 5f 53 48 4d 5f 4c 4f 43 4b 7c 53 51 4c 49 54  E_SHM_LOCK|SQLIT
32d0: 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
32e0: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d  ;.  }while( rc==
32f0: 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73  SQLITE_BUSY && s
3300: 75 70 65 72 6c 6f 63 6b 42 75 73 79 48 61 6e 64  uperlockBusyHand
3310: 6c 65 72 28 28 76 6f 69 64 20 2a 29 70 42 75 73  ler((void *)pBus
3320: 79 2c 20 30 29 20 29 3b 0a 20 20 72 65 74 75 72  y, 0) );.  retur
3330: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n rc;.}../*.** O
3340: 62 74 61 69 6e 20 74 68 65 20 65 78 74 72 61 20  btain the extra 
3350: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 64 61 74  locks on the dat
3360: 61 62 61 73 65 20 66 69 6c 65 20 72 65 71 75 69  abase file requi
3370: 72 65 64 20 66 6f 72 20 57 41 4c 20 64 61 74 61  red for WAL data
3380: 62 61 73 65 73 2e 0a 2a 2a 20 49 6e 76 6f 6b 65  bases..** Invoke
3390: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75   the supplied bu
33a0: 73 79 2d 68 61 6e 64 6c 65 72 20 61 73 20 72 65  sy-handler as re
33b0: 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  quired..*/.stati
33c0: 63 20 69 6e 74 20 73 75 70 65 72 6c 6f 63 6b 57  c int superlockW
33d0: 61 6c 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65  alLock(.  sqlite
33e0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
33f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
3400: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 70 65  abase handle ope
3410: 6e 20 6f 6e 20 57 41 4c 20 64 61 74 61 62 61 73  n on WAL databas
3420: 65 20 2a 2f 0a 20 20 53 75 70 65 72 6c 6f 63 6b  e */.  Superlock
3430: 42 75 73 79 20 2a 70 42 75 73 79 20 20 20 20 20  Busy *pBusy     
3440: 20 20 20 20 20 20 20 2f 2a 20 42 75 73 79 20 68         /* Busy h
3450: 61 6e 64 6c 65 72 20 77 72 61 70 70 65 72 20 6f  andler wrapper o
3460: 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  bject */.){.  in
3470: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
3480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3490: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
34a0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
34b0: 66 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  fd = 0;         
34c0: 20 20 2f 2a 20 4d 61 69 6e 20 64 61 74 61 62 61    /* Main databa
34d0: 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a  se file handle *
34e0: 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c  /.  void volatil
34f0: 65 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20  e *p = 0;       
3500: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
3510: 6f 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  o first page of 
3520: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
3530: 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20  ..  /* Obtain a 
3540: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
3550: 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65  qlite3_file obje
3560: 63 74 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 6d  ct open on the m
3570: 61 69 6e 20 64 62 20 66 69 6c 65 2e 20 2a 2f 0a  ain db file. */.
3580: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
3590: 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
35a0: 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46  "main", SQLITE_F
35b0: 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  CNTL_FILE_POINTE
35c0: 52 2c 20 28 76 6f 69 64 20 2a 29 26 66 64 29 3b  R, (void *)&fd);
35d0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
35e0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
35f0: 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74  ;..  /* Obtain t
3600: 68 65 20 22 72 65 63 6f 76 65 72 79 22 20 6c 6f  he "recovery" lo
3610: 63 6b 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68  ck. Normally, th
3620: 69 73 20 6c 6f 63 6b 20 69 73 20 6f 6e 6c 79 20  is lock is only 
3630: 6f 62 74 61 69 6e 65 64 20 62 79 0a 20 20 2a 2a  obtained by.  **
3640: 20 63 6c 69 65 6e 74 73 20 72 75 6e 6e 69 6e 67   clients running
3650: 20 64 61 74 61 62 61 73 65 20 72 65 63 6f 76 65   database recove
3660: 72 79 2e 20 20 0a 20 20 2a 2f 0a 20 20 72 63 20  ry.  .  */.  rc 
3670: 3d 20 73 75 70 65 72 6c 6f 63 6b 53 68 6d 4c 6f  = superlockShmLo
3680: 63 6b 28 66 64 2c 20 32 2c 20 31 2c 20 70 42 75  ck(fd, 2, 1, pBu
3690: 73 79 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  sy);.  if( rc!=S
36a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
36b0: 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f  n rc;..  /* Zero
36c0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
36d0: 65 20 66 69 72 73 74 20 73 68 61 72 65 64 2d 6d  e first shared-m
36e0: 65 6d 6f 72 79 20 70 61 67 65 2e 20 54 68 69 73  emory page. This
36f0: 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e 79 0a   means that any.
3700: 20 20 2a 2a 20 63 6c 69 65 6e 74 73 20 74 68 61    ** clients tha
3710: 74 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20 77  t open read or w
3720: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
3730: 73 20 66 72 6f 6d 20 74 68 69 73 20 70 6f 69 6e  s from this poin
3740: 74 20 6f 6e 20 77 69 6c 6c 0a 20 20 2a 2a 20 68  t on will.  ** h
3750: 61 76 65 20 74 6f 20 72 75 6e 20 72 65 63 6f 76  ave to run recov
3760: 65 72 79 20 62 65 66 6f 72 65 20 70 72 6f 63 65  ery before proce
3770: 65 64 69 6e 67 2e 20 53 69 6e 63 65 20 74 68 65  eding. Since the
3780: 79 20 6e 65 65 64 20 74 68 65 20 22 72 65 63 6f  y need the "reco
3790: 76 65 72 79 22 0a 20 20 2a 2a 20 6c 6f 63 6b 20  very".  ** lock 
37a0: 74 68 61 74 20 74 68 69 73 20 70 72 6f 63 65 73  that this proces
37b0: 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 6f 20  s is holding to 
37c0: 64 6f 20 74 68 61 74 2c 20 6e 6f 20 6e 65 77 20  do that, no new 
37d0: 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a 20 20  read or write.  
37e0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  ** transactions 
37f0: 6d 61 79 20 6e 6f 77 20 62 65 20 6f 70 65 6e 65  may now be opene
3800: 64 2e 20 4e 6f 72 20 63 61 6e 20 61 20 63 68 65  d. Nor can a che
3810: 63 6b 70 6f 69 6e 74 20 62 65 20 72 75 6e 2c 20  ckpoint be run, 
3820: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d  for the.  ** sam
3830: 65 20 72 65 61 73 6f 6e 2e 0a 20 20 2a 2f 0a 20  e reason..  */. 
3840: 20 72 63 20 3d 20 66 64 2d 3e 70 4d 65 74 68 6f   rc = fd->pMetho
3850: 64 73 2d 3e 78 53 68 6d 4d 61 70 28 66 64 2c 20  ds->xShmMap(fd, 
3860: 30 2c 20 33 32 2a 31 30 32 34 2c 20 31 2c 20 26  0, 32*1024, 1, &
3870: 70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  p);.  if( rc!=SQ
3880: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
3890: 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28 28 76   rc;.  memset((v
38a0: 6f 69 64 20 2a 29 70 2c 20 30 2c 20 33 32 29 3b  oid *)p, 0, 32);
38b0: 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 65 78  ..  /* Obtain ex
38c0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 6f 6e  clusive locks on
38d0: 20 61 6c 6c 20 74 68 65 20 22 72 65 61 64 2d 6c   all the "read-l
38e0: 6f 63 6b 22 20 73 6c 6f 74 73 2e 20 4f 6e 63 65  ock" slots. Once
38f0: 20 74 68 65 73 65 20 6c 6f 63 6b 73 0a 20 20 2a   these locks.  *
3900: 2a 20 61 72 65 20 68 65 6c 64 2c 20 69 74 20 69  * are held, it i
3910: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
3920: 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61  t there are no a
3930: 63 74 69 76 65 20 72 65 61 64 65 72 2c 20 77 72  ctive reader, wr
3940: 69 74 65 72 20 6f 72 20 0a 20 20 2a 2a 20 63 68  iter or .  ** ch
3950: 65 63 6b 70 6f 69 6e 74 65 72 20 63 6c 69 65 6e  eckpointer clien
3960: 74 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ts..  */.  rc = 
3970: 73 75 70 65 72 6c 6f 63 6b 53 68 6d 4c 6f 63 6b  superlockShmLock
3980: 28 66 64 2c 20 33 2c 20 53 51 4c 49 54 45 5f 53  (fd, 3, SQLITE_S
3990: 48 4d 5f 4e 4c 4f 43 4b 2d 33 2c 20 70 42 75 73  HM_NLOCK-3, pBus
39a0: 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  y);.  return rc;
39b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
39c0: 65 20 61 20 73 75 70 65 72 6c 6f 63 6b 20 68 65  e a superlock he
39d0: 6c 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ld on a database
39e0: 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d   file. The argum
39f0: 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 0a 2a  ent passed to .*
3a00: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
3a10: 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
3a20: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 73  btained from a s
3a30: 75 63 63 65 73 73 66 75 6c 20 63 61 6c 6c 20 74  uccessful call t
3a40: 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 64 65 6d 6f  o.** sqlite3demo
3a50: 5f 73 75 70 65 72 6c 6f 63 6b 28 29 2e 0a 2a 2f  _superlock()..*/
3a60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
3a70: 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e  ite3demo_superun
3a80: 6c 6f 63 6b 28 76 6f 69 64 20 2a 70 4c 6f 63 6b  lock(void *pLock
3a90: 29 7b 0a 20 20 53 75 70 65 72 6c 6f 63 6b 20 2a  ){.  Superlock *
3aa0: 70 20 3d 20 28 53 75 70 65 72 6c 6f 63 6b 20 2a  p = (Superlock *
3ab0: 29 70 4c 6f 63 6b 3b 0a 20 20 69 66 28 20 70 2d  )pLock;.  if( p-
3ac0: 3e 62 57 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  >bWal ){.    int
3ad0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3af0: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
3b00: 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 53     int flags = S
3b10: 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
3b20: 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
3b30: 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 73 71 6c  CLUSIVE;.    sql
3b40: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20  ite3_file *fd = 
3b50: 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
3b60: 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
3b70: 28 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20  (p->db, "main", 
3b80: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c  SQLITE_FCNTL_FIL
3b90: 45 5f 50 4f 49 4e 54 45 52 2c 20 28 76 6f 69 64  E_POINTER, (void
3ba0: 20 2a 29 26 66 64 29 3b 0a 20 20 20 20 69 66 28   *)&fd);.    if(
3bb0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
3bc0: 7b 0a 20 20 20 20 20 20 66 64 2d 3e 70 4d 65 74  {.      fd->pMet
3bd0: 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28 66  hods->xShmLock(f
3be0: 64 2c 20 32 2c 20 31 2c 20 66 6c 61 67 73 29 3b  d, 2, 1, flags);
3bf0: 0a 20 20 20 20 20 20 66 64 2d 3e 70 4d 65 74 68  .      fd->pMeth
3c00: 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28 66 64  ods->xShmLock(fd
3c10: 2c 20 33 2c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  , 3, SQLITE_SHM_
3c20: 4e 4c 4f 43 4b 2d 33 2c 20 66 6c 61 67 73 29 3b  NLOCK-3, flags);
3c30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
3c40: 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62  ite3_close(p->db
3c50: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3c60: 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  e(p);.}../*.** O
3c70: 62 74 61 69 6e 20 61 20 73 75 70 65 72 6c 6f 63  btain a superloc
3c80: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
3c90: 65 20 66 69 6c 65 20 69 64 65 6e 74 69 66 69 65  e file identifie
3ca0: 64 20 62 79 20 7a 50 61 74 68 2c 20 75 73 69 6e  d by zPath, usin
3cb0: 67 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  g the.** locking
3cc0: 20 70 72 69 6d 69 74 69 76 65 73 20 70 72 6f 76   primitives prov
3cd0: 69 64 65 64 20 62 79 20 56 46 53 20 7a 56 66 73  ided by VFS zVfs
3ce0: 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
3cf0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a   SQLITE_OK is.**
3d00: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6f 75   returned and ou
3d10: 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70  tput variable *p
3d20: 70 4c 6f 63 6b 20 69 73 20 70 6f 70 75 6c 61 74  pLock is populat
3d30: 65 64 20 77 69 74 68 20 61 6e 20 6f 70 61 71 75  ed with an opaqu
3d40: 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 74 68 61 74  e handle.** that
3d50: 20 6d 61 79 20 62 65 20 75 73 65 64 20 77 69 74   may be used wit
3d60: 68 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75  h sqlite3demo_su
3d70: 70 65 72 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 72  perunlock() to r
3d80: 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 2e  elease the lock.
3d90: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
3da0: 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 4c 6f  or occurs, *ppLo
3db0: 63 6b 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  ck is set to 0 a
3dc0: 6e 64 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  nd an SQLite err
3dd0: 6f 72 20 63 6f 64 65 20 0a 2a 2a 20 28 65 2e 67  or code .** (e.g
3de0: 2e 20 53 51 4c 49 54 45 5f 42 55 53 59 29 20 69  . SQLITE_BUSY) i
3df0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
3e00: 2a 20 49 66 20 61 20 72 65 71 75 69 72 65 64 20  * If a required 
3e10: 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
3e20: 62 74 61 69 6e 65 64 20 69 6d 6d 65 64 69 61 74  btained immediat
3e30: 65 6c 79 20 61 6e 64 20 74 68 65 20 78 42 75 73  ely and the xBus
3e40: 79 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 74  y parameter.** t
3e50: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
3e60: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
3e70: 6e 20 78 42 75 73 79 20 69 73 20 69 6e 76 6f 6b  n xBusy is invok
3e80: 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77  ed in the same w
3e90: 61 79 0a 2a 2a 20 61 73 20 61 20 62 75 73 79 2d  ay.** as a busy-
3ea0: 68 61 6e 64 6c 65 72 20 72 65 67 69 73 74 65 72  handler register
3eb0: 65 64 20 77 69 74 68 20 53 51 4c 69 74 65 20 28  ed with SQLite (
3ec0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 62 75  using sqlite3_bu
3ed0: 73 79 5f 68 61 6e 64 6c 65 72 28 29 29 0a 2a 2a  sy_handler()).**
3ee0: 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 74 68   until either th
3ef0: 65 20 6c 6f 63 6b 20 63 61 6e 20 62 65 20 6f 62  e lock can be ob
3f00: 74 61 69 6e 65 64 20 6f 72 20 74 68 65 20 62 75  tained or the bu
3f10: 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy-handler funct
3f20: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 30  ion returns.** 0
3f30: 20 28 69 6e 64 69 63 61 74 69 6e 67 20 22 67 69   (indicating "gi
3f40: 76 65 20 75 70 22 29 2e 0a 2a 2f 0a 73 74 61 74  ve up")..*/.stat
3f50: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 64 65  ic int sqlite3de
3f60: 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 0a 20 20  mo_superlock(.  
3f70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
3f80: 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
3f90: 2f 2a 20 50 61 74 68 20 74 6f 20 64 61 74 61 62  /* Path to datab
3fa0: 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 6f 63 6b  ase file to lock
3fb0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
3fc0: 20 2a 7a 56 66 73 2c 20 20 20 20 20 20 20 20 20   *zVfs,         
3fd0: 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20        /* VFS to 
3fe0: 75 73 65 20 74 6f 20 61 63 63 65 73 73 20 64 61  use to access da
3ff0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
4000: 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4020: 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 66   /* Additional f
4030: 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20  lags to pass to 
4040: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 20  sqlite3_open_v2 
4050: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
4060: 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 20 20 20  )(void*,int),   
4070: 20 20 20 20 20 2f 2a 20 42 75 73 79 20 68 61 6e       /* Busy han
4080: 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 2a 2f  dler callback */
4090: 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 41 72  .  void *pBusyAr
40a0: 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
40b0: 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72     /* Context ar
40c0: 67 20 66 6f 72 20 62 75 73 79 20 68 61 6e 64 6c  g for busy handl
40d0: 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70  er */.  void **p
40e0: 70 4c 6f 63 6b 20 20 20 20 20 20 20 20 20 20 20  pLock           
40f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
4100: 43 6f 6e 74 65 78 74 20 74 6f 20 70 61 73 73 20  Context to pass 
4110: 74 6f 20 73 75 70 65 72 75 6e 6c 6f 63 6b 28 29  to superunlock()
4120: 20 2a 2f 0a 29 7b 0a 20 20 53 75 70 65 72 6c 6f   */.){.  Superlo
4130: 63 6b 42 75 73 79 20 62 75 73 79 20 3d 20 7b 30  ckBusy busy = {0
4140: 2c 20 30 2c 20 30 7d 3b 20 2f 2a 20 42 75 73 79  , 0, 0}; /* Busy
4150: 20 68 61 6e 64 6c 65 72 20 77 72 61 70 70 65 72   handler wrapper
4160: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
4170: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
4180: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4190: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
41a0: 20 53 75 70 65 72 6c 6f 63 6b 20 2a 70 4c 6f 63   Superlock *pLoc
41b0: 6b 3b 0a 0a 20 20 70 4c 6f 63 6b 20 3d 20 73 71  k;..  pLock = sq
41c0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
41d0: 65 6f 66 28 53 75 70 65 72 6c 6f 63 6b 29 29 3b  eof(Superlock));
41e0: 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 20  .  if( !pLock ) 
41f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
4200: 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 4c  MEM;.  memset(pL
4210: 6f 63 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53  ock, 0, sizeof(S
4220: 75 70 65 72 6c 6f 63 6b 29 29 3b 0a 0a 20 20 2f  uperlock));..  /
4230: 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73  * Open a databas
4240: 65 20 68 61 6e 64 6c 65 20 6f 6e 20 74 68 65 20  e handle on the 
4250: 66 69 6c 65 20 74 6f 20 73 75 70 65 72 6c 6f 63  file to superloc
4260: 6b 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  k. */.  rc = sql
4270: 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20  ite3_open_v2(.  
4280: 20 20 20 20 7a 50 61 74 68 2c 20 26 70 4c 6f 63      zPath, &pLoc
4290: 6b 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 4f 50  k->db, SQLITE_OP
42a0: 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
42b0: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
42c0: 66 6c 61 67 73 2c 20 7a 56 66 73 0a 20 20 29 3b  flags, zVfs.  );
42d0: 0a 0a 20 20 2f 2a 20 49 6e 73 74 61 6c 6c 20 61  ..  /* Install a
42e0: 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 61 6e   busy-handler an
42f0: 64 20 65 78 65 63 75 74 65 20 61 20 42 45 47 49  d execute a BEGI
4300: 4e 20 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20  N EXCLUSIVE. If 
4310: 74 68 69 73 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  this is not.  **
4320: 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c   a WAL database,
4330: 20 74 68 69 73 20 69 73 20 61 6c 6c 20 77 65 20   this is all we 
4340: 6e 65 65 64 20 74 6f 20 64 6f 2e 20 20 0a 20 20  need to do.  .  
4350: 2a 2a 0a 20 20 2a 2a 20 41 20 77 72 61 70 70 65  **.  ** A wrappe
4360: 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  r function is us
4370: 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ed to invoke the
4380: 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 6e   busy-handler in
4390: 73 74 65 61 64 20 6f 66 0a 20 20 2a 2a 20 72 65  stead of.  ** re
43a0: 67 69 73 74 65 72 69 6e 67 20 74 68 65 20 62 75  gistering the bu
43b0: 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy-handler funct
43c0: 69 6f 6e 20 73 75 70 70 6c 69 65 64 20 62 79 20  ion supplied by 
43d0: 74 68 65 20 75 73 65 72 20 64 69 72 65 63 74 6c  the user directl
43e0: 79 0a 20 20 2a 2a 20 77 69 74 68 20 53 51 4c 69  y.  ** with SQLi
43f0: 74 65 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  te. This is beca
4400: 75 73 65 20 74 68 65 20 73 61 6d 65 20 62 75 73  use the same bus
4410: 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y-handler functi
4420: 6f 6e 20 6d 61 79 20 62 65 0a 20 20 2a 2a 20 69  on may be.  ** i
4430: 6e 76 6f 6b 65 64 20 64 69 72 65 63 74 6c 79 20  nvoked directly 
4440: 6c 61 74 65 72 20 6f 6e 20 77 68 65 6e 20 61 74  later on when at
4450: 74 65 6d 70 74 69 6e 67 20 74 6f 20 6f 62 74 61  tempting to obta
4460: 69 6e 20 74 68 65 20 65 78 74 72 61 20 6c 6f 63  in the extra loc
4470: 6b 73 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  ks.  ** required
4480: 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 42 79   in WAL mode. By
4490: 20 75 73 69 6e 67 20 74 68 65 20 77 72 61 70 70   using the wrapp
44a0: 65 72 2c 20 77 65 20 61 72 65 20 61 62 6c 65 20  er, we are able 
44b0: 74 6f 20 67 75 61 72 61 6e 74 65 65 0a 20 20 2a  to guarantee.  *
44c0: 2a 20 74 68 61 74 20 74 68 65 20 22 6e 42 75 73  * that the "nBus
44d0: 79 22 20 69 6e 74 65 67 65 72 20 70 61 72 61 6d  y" integer param
44e0: 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 74  eter passed to t
44f0: 68 65 20 75 73 65 72 73 20 62 75 73 79 2d 68 61  he users busy-ha
4500: 6e 64 6c 65 72 0a 20 20 2a 2a 20 72 65 70 72 65  ndler.  ** repre
4510: 73 65 6e 74 73 20 74 68 65 20 74 6f 74 61 6c 20  sents the total 
4520: 6e 75 6d 62 65 72 20 6f 66 20 62 75 73 79 2d 68  number of busy-h
4530: 61 6e 64 6c 65 72 20 69 6e 76 6f 63 61 74 69 6f  andler invocatio
4540: 6e 73 20 6d 61 64 65 20 77 69 74 68 69 6e 0a 20  ns made within. 
4550: 20 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 74 6f   ** this call to
4560: 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70   sqlite3demo_sup
4570: 65 72 6c 6f 63 6b 28 29 2c 20 69 6e 63 6c 75 64  erlock(), includ
4580: 69 6e 67 20 61 6e 79 20 6d 61 64 65 20 64 75 72  ing any made dur
4590: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 22 42 45  ing the.  ** "BE
45a0: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 22 2e 0a  GIN EXCLUSIVE"..
45b0: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
45c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
45d0: 62 75 73 79 2e 78 42 75 73 79 20 3d 20 78 42 75  busy.xBusy = xBu
45e0: 73 79 3b 0a 20 20 20 20 62 75 73 79 2e 70 42 75  sy;.    busy.pBu
45f0: 73 79 41 72 67 20 3d 20 70 42 75 73 79 41 72 67  syArg = pBusyArg
4600: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75  ;.    sqlite3_bu
4610: 73 79 5f 68 61 6e 64 6c 65 72 28 70 4c 6f 63 6b  sy_handler(pLock
4620: 2d 3e 64 62 2c 20 73 75 70 65 72 6c 6f 63 6b 42  ->db, superlockB
4630: 75 73 79 48 61 6e 64 6c 65 72 2c 20 28 76 6f 69  usyHandler, (voi
4640: 64 20 2a 29 26 62 75 73 79 29 3b 0a 20 20 20 20  d *)&busy);.    
4650: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
4660: 63 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20 22 42 45  c(pLock->db, "BE
4670: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 22 2c 20  GIN EXCLUSIVE", 
4680: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  0, 0, 0);.  }.. 
4690: 20 2f 2a 20 49 66 20 74 68 65 20 42 45 47 49 4e   /* If the BEGIN
46a0: 20 45 58 43 4c 55 53 49 56 45 20 77 61 73 20 65   EXCLUSIVE was e
46b0: 78 65 63 75 74 65 64 20 73 75 63 63 65 73 73 66  xecuted successf
46c0: 75 6c 6c 79 20 61 6e 64 20 74 68 69 73 20 69 73  ully and this is
46d0: 20 61 20 57 41 4c 0a 20 20 2a 2a 20 64 61 74 61   a WAL.  ** data
46e0: 62 61 73 65 2c 20 63 61 6c 6c 20 73 75 70 65 72  base, call super
46f0: 6c 6f 63 6b 57 61 6c 4c 6f 63 6b 28 29 20 74 6f  lockWalLock() to
4700: 20 6f 62 74 61 69 6e 20 74 68 65 20 65 78 74 72   obtain the extr
4710: 61 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 64  a locks required
4720: 0a 20 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74  .  ** to prevent
4730: 20 72 65 61 64 65 72 73 2c 20 77 72 69 74 65 72   readers, writer
4740: 73 20 61 6e 64 2f 6f 72 20 63 68 65 63 6b 70 6f  s and/or checkpo
4750: 69 6e 74 65 72 73 20 66 72 6f 6d 20 61 63 63 65  inters from acce
4760: 73 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 64  ssing the.  ** d
4770: 62 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  b while this pro
4780: 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
4790: 74 68 65 20 73 75 70 65 72 6c 6f 63 6b 2e 0a 20  the superlock.. 
47a0: 20 2a 2a 0a 20 20 2a 2a 20 42 65 66 6f 72 65 20   **.  ** Before 
47b0: 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 57  attempting any W
47c0: 41 4c 20 6c 6f 63 6b 73 2c 20 63 6f 6d 6d 69 74  AL locks, commit
47d0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
47e0: 20 73 74 61 72 74 65 64 20 61 62 6f 76 65 0a 20   started above. 
47f0: 20 2a 2a 20 74 6f 20 64 72 6f 70 20 74 68 65 20   ** to drop the 
4800: 57 41 4c 20 72 65 61 64 20 61 6e 64 20 77 72 69  WAL read and wri
4810: 74 65 20 6c 6f 63 6b 73 20 63 75 72 72 65 6e 74  te locks current
4820: 6c 79 20 68 65 6c 64 2e 20 4f 74 68 65 72 77 69  ly held. Otherwi
4830: 73 65 2c 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77  se, the.  ** new
4840: 20 57 41 4c 20 6c 6f 63 6b 73 20 6d 61 79 20 63   WAL locks may c
4850: 6f 6e 66 6c 69 63 74 20 77 69 74 68 20 74 68 65  onflict with the
4860: 20 6f 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   old..  */.  if(
4870: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
4880: 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  {.    if( SQLITE
4890: 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 75 70 65 72  _OK==(rc = super
48a0: 6c 6f 63 6b 49 73 57 61 6c 28 70 4c 6f 63 6b 29  lockIsWal(pLock)
48b0: 29 20 26 26 20 70 4c 6f 63 6b 2d 3e 62 57 61 6c  ) && pLock->bWal
48c0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
48d0: 71 6c 69 74 65 33 5f 65 78 65 63 28 70 4c 6f 63  qlite3_exec(pLoc
48e0: 6b 2d 3e 64 62 2c 20 22 43 4f 4d 4d 49 54 22 2c  k->db, "COMMIT",
48f0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
4900: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4910: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
4920: 20 3d 20 73 75 70 65 72 6c 6f 63 6b 57 61 6c 4c   = superlockWalL
4930: 6f 63 6b 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20 26  ock(pLock->db, &
4940: 62 75 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  busy);.      }. 
4950: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
4960: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
4970: 0a 20 20 20 20 73 71 6c 69 74 65 33 64 65 6d 6f  .    sqlite3demo
4980: 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 28 70 4c 6f  _superunlock(pLo
4990: 63 6b 29 3b 0a 20 20 20 20 2a 70 70 4c 6f 63 6b  ck);.    *ppLock
49a0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
49b0: 20 20 20 2a 70 70 4c 6f 63 6b 20 3d 20 70 4c 6f     *ppLock = pLo
49c0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ck;.  }..  retur
49d0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 41 20 63 6f  n rc;.}../* A co
49e0: 72 72 75 70 74 20 44 42 20 77 6f 6e 27 74 20 77  rrupt DB won't w
49f0: 6f 72 6b 20 77 69 74 68 20 74 68 65 20 73 71 6c  ork with the sql
4a00: 2d 62 61 73 65 64 20 6c 6f 63 6b 69 6e 67 20 61  -based locking a
4a10: 74 74 65 6d 70 74 2c 20 67 72 61 62 20 61 6e 20  ttempt, grab an 
4a20: 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  .** exclusive lo
4a30: 63 6b 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ck and return SQ
4a40: 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54  LITE_OK or SQLIT
4a50: 45 5f 42 55 53 59 20 69 66 20 74 68 65 20 6c 6f  E_BUSY if the lo
4a60: 63 6b 20 66 61 69 6c 73 20 0a 2a 2a 20 72 65 74  ck fails .** ret
4a70: 75 72 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74  urns the current
4a80: 20 6c 6f 63 6b 20 6c 65 76 65 6c 20 68 65 6c 64   lock level held
4a90: 20 6f 6e 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   on sqlite3_file
4aa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
4ab0: 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72  qlite3demo_super
4ac0: 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 73 71 6c  lock_corrupt(sql
4ad0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
4ae0: 6e 74 20 65 54 61 72 67 65 74 46 69 6c 65 4c 6f  nt eTargetFileLo
4af0: 63 6b 2c 20 69 6e 74 20 2a 70 46 69 6c 65 4c 6f  ck, int *pFileLo
4b00: 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
4b10: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
4b20: 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 65  ile*)id;.  int e
4b30: 46 69 6c 65 4c 6f 63 6b 20 3d 20 70 46 69 6c 65  FileLock = pFile
4b40: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 69  ->eFileLock;.  i
4b50: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
4b60: 4b 3b 0a 20 20 0a 20 20 69 66 28 20 65 46 69 6c  K;.  .  if( eFil
4b70: 65 4c 6f 63 6b 3c 65 54 61 72 67 65 74 46 69 6c  eLock<eTargetFil
4b80: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 63 20  eLock ){.    rc 
4b90: 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  = pFile->pMethod
4ba0: 2d 3e 78 4c 6f 63 6b 28 69 64 2c 20 53 51 4c 49  ->xLock(id, SQLI
4bb0: 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 29 3b  TE_LOCK_SHARED);
4bc0: 0a 20 20 7d 0a 20 20 69 66 28 20 21 72 63 20 26  .  }.  if( !rc &
4bd0: 26 20 65 46 69 6c 65 4c 6f 63 6b 3c 65 54 61 72  & eFileLock<eTar
4be0: 67 65 74 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  getFileLock ){. 
4bf0: 20 20 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70     rc = pFile->p
4c00: 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 69 64  Method->xLock(id
4c10: 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58  , SQLITE_LOCK_EX
4c20: 43 4c 55 53 49 56 45 29 3b 0a 20 20 7d 0a 20 20  CLUSIVE);.  }.  
4c30: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66  if( rc ){.    if
4c40: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
4c50: 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63 6b 20 29  ck > eFileLock )
4c60: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70  {.      pFile->p
4c70: 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28  Method->xUnlock(
4c80: 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a  id, eFileLock);.
4c90: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
4ca0: 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 20 28 70   rc;.  }.  if (p
4cb0: 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 20 20  FileLock) {.    
4cc0: 2a 70 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  *pFileLock = eFi
4cd0: 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 65  leLock;.  }.  re
4ce0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
4cf0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  }..static int sq
4d00: 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75  lite3demo_superu
4d10: 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 73 71  nlock_corrupt(sq
4d20: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
4d30: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
4d40: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
4d50: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
4d60: 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  id;.  int rc = S
4d70: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69  QLITE_OK;.  .  i
4d80: 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
4d90: 6f 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63 6b 20  ock > eFileLock 
4da0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 46 69 6c  ){.    rc = pFil
4db0: 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c  e->pMethod->xUnl
4dc0: 6f 63 6b 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c  ock(id, SQLITE_L
4dd0: 4f 43 4b 5f 53 48 41 52 45 44 29 3b 0a 20 20 7d  OCK_SHARED);.  }
4de0: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
4df0: 69 6c 65 4c 6f 63 6b 20 3e 20 65 46 69 6c 65 4c  ileLock > eFileL
4e00: 6f 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 75  ock ){.    int u
4e10: 6e 6c 6f 63 6b 52 43 20 3d 20 70 46 69 6c 65 2d  nlockRC = pFile-
4e20: 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63  >pMethod->xUnloc
4e30: 6b 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  k(id, SQLITE_LOC
4e40: 4b 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 69 66 20  K_NONE);.    if 
4e50: 28 21 72 63 29 20 72 63 20 3d 20 75 6e 6c 6f 63  (!rc) rc = unloc
4e60: 6b 52 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  kRC;.  }.  retur
4e70: 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  n rc;.}..#endif 
4e80: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
4e90: 5f 53 55 50 45 52 4c 4f 43 4b 20 2a 2f 0a 0a 0a  _SUPERLOCK */...
4ea0: 2f 2a 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20  /*.** Different 
4eb0: 55 6e 69 78 20 73 79 73 74 65 6d 73 20 64 65 63  Unix systems dec
4ec0: 6c 61 72 65 20 6f 70 65 6e 28 29 20 69 6e 20 64  lare open() in d
4ed0: 69 66 66 65 72 65 6e 74 20 77 61 79 73 2e 20 20  ifferent ways.  
4ee0: 53 61 6d 65 20 75 73 65 0a 2a 2a 20 6f 70 65 6e  Same use.** open
4ef0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
4f00: 2c 6d 6f 64 65 5f 74 29 2e 20 20 4f 74 68 65 72  ,mode_t).  Other
4f10: 73 20 75 73 65 20 6f 70 65 6e 28 63 6f 6e 73 74  s use open(const
4f20: 20 63 68 61 72 2a 2c 69 6e 74 2c 2e 2e 2e 29 2e   char*,int,...).
4f30: 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
4f40: 63 65 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  ce is important 
4f50: 77 68 65 6e 20 75 73 69 6e 67 20 61 20 70 6f 69  when using a poi
4f60: 6e 74 65 72 20 74 6f 20 74 68 65 20 66 75 6e 63  nter to the func
4f70: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
4f80: 73 61 66 65 73 74 20 77 61 79 20 74 6f 20 64 65  safest way to de
4f90: 61 6c 20 77 69 74 68 20 74 68 65 20 70 72 6f 62  al with the prob
4fa0: 6c 65 6d 20 69 73 20 74 6f 20 61 6c 77 61 79 73  lem is to always
4fb0: 20 75 73 65 20 74 68 69 73 20 77 72 61 70 70 65   use this wrappe
4fc0: 72 0a 2a 2a 20 77 68 69 63 68 20 61 6c 77 61 79  r.** which alway
4fd0: 73 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 77  s has the same w
4fe0: 65 6c 6c 2d 64 65 66 69 6e 65 64 20 69 6e 74 65  ell-defined inte
4ff0: 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rface..*/.static
5000: 20 69 6e 74 20 70 6f 73 69 78 4f 70 65 6e 28 63   int posixOpen(c
5010: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
5020: 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 69 6e 74  , int flags, int
5030: 20 6d 6f 64 65 29 7b 0a 20 20 72 65 74 75 72 6e   mode){.  return
5040: 20 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 66 6c 61   open(zFile, fla
5050: 67 73 2c 20 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a  gs, mode);.}../*
5060: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
5070: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ce */.static int
5080: 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63   openDirectory(c
5090: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 2a  onst char*, int*
50a0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73  );../*.** Many s
50b0: 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20  ystem calls are 
50c0: 61 63 63 65 73 73 65 64 20 74 68 72 6f 75 67 68  accessed through
50d0: 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63   pointer-to-func
50e0: 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a  tions so that.**
50f0: 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65   they may be ove
5100: 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69  rridden at runti
5110: 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  me to facilitate
5120: 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e   fault injection
5130: 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69   during.** testi
5140: 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e  ng and sandboxin
5150: 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  g.  The followin
5160: 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68  g array holds th
5170: 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e  e names and poin
5180: 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f  ters.** to all o
5190: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
51a0: 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  em calls..*/.sta
51b0: 74 69 63 20 73 74 72 75 63 74 20 75 6e 69 78 5f  tic struct unix_
51c0: 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73  syscall {.  cons
51d0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20  t char *zName;  
51e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
51f0: 65 20 6f 66 20 74 68 65 20 73 79 74 65 6d 20 63  e of the sytem c
5200: 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  all */.  sqlite3
5210: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75  _syscall_ptr pCu
5220: 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e  rrent; /* Curren
5230: 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  t value of the s
5240: 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20  ystem call */.  
5250: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5260: 70 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a  ptr pDefault; /*
5270: 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a   Default value *
5280: 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d  /.} aSyscall[] =
5290: 20 7b 0a 20 20 7b 20 22 6f 70 65 6e 22 2c 20 20   {.  { "open",  
52a0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
52b0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69  syscall_ptr)posi
52c0: 78 4f 70 65 6e 2c 20 20 30 20 20 7d 2c 0a 23 64  xOpen,  0  },.#d
52d0: 65 66 69 6e 65 20 6f 73 4f 70 65 6e 20 20 20 20  efine osOpen    
52e0: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
52f0: 20 63 68 61 72 2a 2c 69 6e 74 2c 69 6e 74 29 29   char*,int,int))
5300: 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72  aSyscall[0].pCur
5310: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 63 6c 6f 73  rent)..  { "clos
5320: 65 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  e",        (sqli
5330: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
5340: 63 6c 6f 73 65 2c 20 20 20 20 20 20 30 20 20 7d  close,      0  }
5350: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73  ,.#define osClos
5360: 65 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69  e     ((int(*)(i
5370: 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e  nt))aSyscall[1].
5380: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
5390: 61 63 63 65 73 73 22 2c 20 20 20 20 20 20 20 28  access",       (
53a0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
53b0: 70 74 72 29 61 63 63 65 73 73 2c 20 20 20 20 20  ptr)access,     
53c0: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
53d0: 41 63 63 65 73 73 20 20 20 20 28 28 69 6e 74 28  Access    ((int(
53e0: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  *)(const char*,i
53f0: 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e  nt))aSyscall[2].
5400: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
5410: 67 65 74 63 77 64 22 2c 20 20 20 20 20 20 20 28  getcwd",       (
5420: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5430: 70 74 72 29 67 65 74 63 77 64 2c 20 20 20 20 20  ptr)getcwd,     
5440: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
5450: 47 65 74 63 77 64 20 20 20 20 28 28 63 68 61 72  Getcwd    ((char
5460: 2a 28 2a 29 28 63 68 61 72 2a 2c 73 69 7a 65 5f  *(*)(char*,size_
5470: 74 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70  t))aSyscall[3].p
5480: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 73  Current)..  { "s
5490: 74 61 74 22 2c 20 20 20 20 20 20 20 20 20 28 73  tat",         (s
54a0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
54b0: 74 72 29 73 74 61 74 2c 20 20 20 20 20 20 20 30  tr)stat,       0
54c0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 53    },.#define osS
54d0: 74 61 74 20 20 20 20 20 20 28 28 69 6e 74 28 2a  tat      ((int(*
54e0: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74  )(const char*,st
54f0: 72 75 63 74 20 73 74 61 74 2a 29 29 61 53 79 73  ruct stat*))aSys
5500: 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74  call[4].pCurrent
5510: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47  )../*.** The DJG
5520: 50 50 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69  PP compiler envi
5530: 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f  ronment looks mo
5540: 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20  stly like Unix, 
5550: 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20  but it.** lacks 
5560: 74 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74  the fcntl() syst
5570: 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64  em call.  So red
5580: 65 66 69 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f  efine fcntl() to
5590: 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   be something.**
55a0: 20 74 68 61 74 20 61 6c 77 61 79 73 20 73 75 63   that always suc
55b0: 63 65 65 64 73 2e 20 20 54 68 69 73 20 6d 65 61  ceeds.  This mea
55c0: 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20  ns that locking 
55d0: 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
55e0: 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20  nder.** DJGPP.  
55f0: 42 75 74 20 69 74 20 69 73 20 44 4f 53 20 2d 20  But it is DOS - 
5600: 77 68 61 74 20 64 69 64 20 79 6f 75 20 65 78 70  what did you exp
5610: 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f  ect?.*/.#ifdef _
5620: 5f 44 4a 47 50 50 5f 5f 0a 20 20 7b 20 22 66 73  _DJGPP__.  { "fs
5630: 74 61 74 22 2c 20 20 20 20 20 20 20 20 30 2c 20  tat",        0, 
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5650: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
5660: 46 73 74 61 74 28 61 2c 62 2c 63 29 20 20 20 20  Fstat(a,b,c)    
5670: 30 0a 23 65 6c 73 65 20 20 20 20 20 0a 20 20 7b  0.#else     .  {
5680: 20 22 66 73 74 61 74 22 2c 20 20 20 20 20 20 20   "fstat",       
5690: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
56a0: 6c 5f 70 74 72 29 66 73 74 61 74 2c 20 20 20 20  l_ptr)fstat,    
56b0: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
56c0: 6f 73 46 73 74 61 74 20 20 20 20 20 28 28 69 6e  osFstat     ((in
56d0: 74 28 2a 29 28 69 6e 74 2c 73 74 72 75 63 74 20  t(*)(int,struct 
56e0: 73 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b  stat*))aSyscall[
56f0: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  5].pCurrent).#en
5700: 64 69 66 0a 0a 20 20 7b 20 22 66 74 72 75 6e 63  dif..  { "ftrunc
5710: 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65  ate",    (sqlite
5720: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 74  3_syscall_ptr)ft
5730: 72 75 6e 63 61 74 65 2c 20 20 30 20 20 7d 2c 0a  runcate,  0  },.
5740: 23 64 65 66 69 6e 65 20 6f 73 46 74 72 75 6e 63  #define osFtrunc
5750: 61 74 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74  ate ((int(*)(int
5760: 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,off_t))aSyscall
5770: 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [6].pCurrent).. 
5780: 20 7b 20 22 66 63 6e 74 6c 22 2c 20 20 20 20 20   { "fcntl",     
5790: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
57a0: 61 6c 6c 5f 70 74 72 29 66 63 6e 74 6c 2c 20 20  all_ptr)fcntl,  
57b0: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
57c0: 65 20 6f 73 46 63 6e 74 6c 20 20 20 20 20 28 28  e osFcntl     ((
57d0: 69 6e 74 28 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e  int(*)(int,int,.
57e0: 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e  ..))aSyscall[7].
57f0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
5800: 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 20 28  read",         (
5810: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5820: 70 74 72 29 72 65 61 64 2c 20 20 20 20 20 20 20  ptr)read,       
5830: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
5840: 52 65 61 64 20 20 20 20 20 20 28 28 73 73 69 7a  Read      ((ssiz
5850: 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a  e_t(*)(int,void*
5860: 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c  ,size_t))aSyscal
5870: 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[8].pCurrent)..
5880: 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
5890: 50 52 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45  PREAD) || SQLITE
58a0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
58b0: 53 54 59 4c 45 0a 20 20 7b 20 22 70 72 65 61 64  STYLE.  { "pread
58c0: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
58d0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
58e0: 72 65 61 64 2c 20 20 20 20 20 20 30 20 20 7d 2c  read,      0  },
58f0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61  .#else.  { "prea
5900: 64 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  d",        (sqli
5910: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
5920: 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  0,          0  }
5930: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
5940: 20 6f 73 50 72 65 61 64 20 20 20 20 20 28 28 73   osPread     ((s
5950: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f  size_t(*)(int,vo
5960: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
5970: 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43  ))aSyscall[9].pC
5980: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
5990: 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
59a0: 29 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c  ).  { "pread64",
59b0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
59c0: 79 73 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64  yscall_ptr)pread
59d0: 36 34 2c 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c  64,    0  },.#el
59e0: 73 65 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22  se.  { "pread64"
59f0: 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f  ,      (sqlite3_
5a00: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
5a10: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65          0  },.#e
5a20: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50  ndif.#define osP
5a30: 72 65 61 64 36 34 20 20 20 28 28 73 73 69 7a 65  read64   ((ssize
5a40: 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c  _t(*)(int,void*,
5a50: 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53  size_t,off_t))aS
5a60: 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72  yscall[10].pCurr
5a70: 65 6e 74 29 0a 0a 20 20 7b 20 22 77 72 69 74 65  ent)..  { "write
5a80: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
5a90: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 77  e3_syscall_ptr)w
5aa0: 72 69 74 65 2c 20 20 20 20 20 20 30 20 20 7d 2c  rite,      0  },
5ab0: 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65  .#define osWrite
5ac0: 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a       ((ssize_t(*
5ad0: 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  )(int,const void
5ae0: 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61  *,size_t))aSysca
5af0: 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[11].pCurrent)
5b00: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ..#if defined(US
5b10: 45 5f 50 52 45 41 44 29 20 7c 7c 20 53 51 4c 49  E_PREAD) || SQLI
5b20: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
5b30: 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70 77 72  G_STYLE.  { "pwr
5b40: 69 74 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c  ite",       (sql
5b50: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
5b60: 29 70 77 72 69 74 65 2c 20 20 20 20 20 30 20 20  )pwrite,     0  
5b70: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77  },.#else.  { "pw
5b80: 72 69 74 65 22 2c 20 20 20 20 20 20 20 28 73 71  rite",       (sq
5b90: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5ba0: 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20  r)0,          0 
5bb0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69   },.#endif.#defi
5bc0: 6e 65 20 6f 73 50 77 72 69 74 65 20 20 20 20 28  ne osPwrite    (
5bd0: 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c  (ssize_t(*)(int,
5be0: 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65  const void*,size
5bf0: 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20  _t,off_t))\.    
5c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c10: 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75  aSyscall[12].pCu
5c20: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
5c30: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
5c40: 0a 20 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c  .  { "pwrite64",
5c50: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
5c60: 73 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65  scall_ptr)pwrite
5c70: 36 34 2c 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73  64,   0  },.#els
5c80: 65 0a 20 20 7b 20 22 70 77 72 69 74 65 36 34 22  e.  { "pwrite64"
5c90: 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ,     (sqlite3_s
5ca0: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
5cb0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e         0  },.#en
5cc0: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77  dif.#define osPw
5cd0: 72 69 74 65 36 34 20 20 28 28 73 73 69 7a 65 5f  rite64  ((ssize_
5ce0: 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76  t(*)(int,const v
5cf0: 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f  oid*,size_t,off_
5d00: 74 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20  t))\.           
5d10: 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c           aSyscal
5d20: 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[13].pCurrent).
5d30: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
5d40: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
5d50: 0a 20 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20  .  { "fchmod",  
5d60: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
5d70: 73 63 61 6c 6c 5f 70 74 72 29 66 63 68 6d 6f 64  scall_ptr)fchmod
5d80: 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73  ,     0  },.#els
5d90: 65 0a 20 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20  e.  { "fchmod", 
5da0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
5db0: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
5dc0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e         0  },.#en
5dd0: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 63  dif.#define osFc
5de0: 68 6d 6f 64 20 20 20 20 28 28 69 6e 74 28 2a 29  hmod    ((int(*)
5df0: 28 69 6e 74 2c 6d 6f 64 65 5f 74 29 29 61 53 79  (int,mode_t))aSy
5e00: 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65  scall[14].pCurre
5e10: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
5e20: 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c  (HAVE_POSIX_FALL
5e30: 4f 43 41 54 45 29 20 26 26 20 48 41 56 45 5f 50  OCATE) && HAVE_P
5e40: 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20  OSIX_FALLOCATE. 
5e50: 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20   { "fallocate", 
5e60: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
5e70: 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 5f 66 61  all_ptr)posix_fa
5e80: 6c 6c 6f 63 61 74 65 2c 20 20 30 20 7d 2c 0a 23  llocate,  0 },.#
5e90: 65 6c 73 65 0a 20 20 7b 20 22 66 61 6c 6c 6f 63  else.  { "falloc
5ea0: 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65  ate",    (sqlite
5eb0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ed0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66  0 },.#endif.#def
5ee0: 69 6e 65 20 6f 73 46 61 6c 6c 6f 63 61 74 65 20  ine osFallocate 
5ef0: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66  ((int(*)(int,off
5f00: 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61  _t,off_t))aSysca
5f10: 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[15].pCurrent)
5f20: 0a 0a 20 20 7b 20 22 75 6e 6c 69 6e 6b 22 2c 20  ..  { "unlink", 
5f30: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
5f40: 79 73 63 61 6c 6c 5f 70 74 72 29 75 6e 6c 69 6e  yscall_ptr)unlin
5f50: 6b 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  k,           0 }
5f60: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 69  ,.#define osUnli
5f70: 6e 6b 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63  nk    ((int(*)(c
5f80: 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53 79 73  onst char*))aSys
5f90: 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e  call[16].pCurren
5fa0: 74 29 0a 0a 20 20 7b 20 22 6f 70 65 6e 44 69 72  t)..  { "openDir
5fb0: 65 63 74 6f 72 79 22 2c 20 20 20 20 28 73 71 6c  ectory",    (sql
5fc0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
5fd0: 29 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 2c 20  )openDirectory, 
5fe0: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
5ff0: 65 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72  e osOpenDirector
6000: 79 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74  y ((int(*)(const
6010: 20 63 68 61 72 2a 2c 69 6e 74 2a 29 29 61 53 79   char*,int*))aSy
6020: 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65  scall[17].pCurre
6030: 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f  nt)..}; /* End o
6040: 66 20 74 68 65 20 6f 76 65 72 72 69 64 65 61 62  f the overrideab
6050: 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  le system calls 
6060: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  */../*.** This i
6070: 73 20 74 68 65 20 78 53 65 74 53 79 73 74 65 6d  s the xSetSystem
6080: 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66  Call() method of
6090: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f 72   sqlite3_vfs for
60a0: 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22   all of the.** "
60b0: 75 6e 69 78 22 20 56 46 53 65 73 2e 20 20 52 65  unix" VFSes.  Re
60c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
60d0: 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  pon successfully
60e0: 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a   updating the.**
60f0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69   system call poi
6100: 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f  nter, or SQLITE_
6110: 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65 72  NOTFOUND if ther
6120: 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72  e is no configur
6130: 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63  able.** system c
6140: 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e  all named zName.
6150: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
6160: 6e 69 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  nixSetSystemCall
6170: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
6180: 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20  *pNotUsed,      
6190: 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f 69    /* The VFS poi
61a0: 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64 20  nter.  Not used 
61b0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
61c0: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *zName,         
61d0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79     /* Name of sy
61e0: 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65  stem call to ove
61f0: 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74  rride */.  sqlit
6200: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70  e3_syscall_ptr p
6210: 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e  NewFunc  /* Poin
6220: 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74 65  ter to new syste
6230: 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a  m call value */.
6240: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ){.  unsigned in
6250: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t i;.  int rc = 
6260: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
6270: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
6280: 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a  ETER(pNotUsed);.
6290: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
62a0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a  {.    /* If no z
62b0: 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20 72  Name is given, r
62c0: 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74 65  estore all syste
62d0: 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69 72  m calls to their
62e0: 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20   default.    ** 
62f0: 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65 74  settings and ret
6300: 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a  urn NULL.    */.
6310: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
6320: 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  OK;.    for(i=0;
6330: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
6340: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
6350: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
6360: 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c       if( aSyscal
6370: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b  l[i].pDefault ){
6380: 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c  .        aSyscal
6390: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20  l[i].pCurrent = 
63a0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
63b0: 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ault;.      }.  
63c0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
63d0: 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20   /* If zName is 
63e0: 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72 61  specified, opera
63f0: 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f  te on only the o
6400: 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20  ne system call. 
6410: 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 2e     ** specified.
6420: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
6430: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
6440: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
6450: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
6460: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
6470: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
6480: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
6490: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
64a0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
64b0: 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ault==0 ){.     
64c0: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d       aSyscall[i]
64d0: 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79 73  .pDefault = aSys
64e0: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
64f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6500: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
6510: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  OK;.        if( 
6520: 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e  pNewFunc==0 ) pN
6530: 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61 6c  ewFunc = aSyscal
6540: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20  l[i].pDefault;. 
6550: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
6560: 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70 4e  i].pCurrent = pN
6570: 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20  ewFunc;.        
6580: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
6590: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
65a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
65b0: 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
65c0: 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c  of a system call
65d0: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
65e0: 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61  f zName is not a
65f0: 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 73  .** recognized s
6600: 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e  ystem call name.
6610: 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72    NULL is also r
6620: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 73  eturned if the s
6630: 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73  ystem call.** is
6640: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 66   currently undef
6650: 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
6660: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
6670: 70 74 72 20 75 6e 69 78 47 65 74 53 79 73 74 65  ptr unixGetSyste
6680: 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33  mCall(.  sqlite3
6690: 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 0a  _vfs *pNotUsed,.
66a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
66b0: 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65  ame.){.  unsigne
66c0: 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55 53  d int i;..  UNUS
66d0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f  ED_PARAMETER(pNo
66e0: 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69 3d  tUsed);.  for(i=
66f0: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73  0; i<sizeof(aSys
6700: 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79  call)/sizeof(aSy
6710: 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b  scall[0]); i++){
6720: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
6730: 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b  zName, aSyscall[
6740: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  i].zName)==0 ) r
6750: 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69  eturn aSyscall[i
6760: 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a  ].pCurrent;.  }.
6770: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
6780: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
6790: 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73  name of the firs
67a0: 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61 66  t system call af
67b0: 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a  ter zName.  If z
67c0: 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68  Name==NULL.** th
67d0: 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61  en return the na
67e0: 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  me of the first 
67f0: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65  system call.  Re
6800: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61  turn NULL if zNa
6810: 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73  me.** is the las
6820: 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72  t system call or
6830: 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74   if zName is not
6840: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76   the name of a v
6850: 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20 63  alid.** system c
6860: 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  all..*/.static c
6870: 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78 4e  onst char *unixN
6880: 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71  extSystemCall(sq
6890: 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f  lite3_vfs *p, co
68a0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
68b0: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a  {.  int i = -1;.
68c0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
68d0: 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e  TER(p);.  if( zN
68e0: 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ame ){.    for(i
68f0: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
6900: 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b  aSyscall)-1; i++
6910: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
6920: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
6930: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
6940: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
6950: 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69    }.  for(i++; i
6960: 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63  <ArraySize(aSysc
6970: 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  all); i++){.    
6980: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
6990: 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65  pCurrent!=0 ) re
69a0: 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d  turn aSyscall[i]
69b0: 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65  .zName;.  }.  re
69c0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
69d0: 20 52 65 74 72 79 20 6f 70 65 6e 28 29 20 63 61   Retry open() ca
69e0: 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 64 75  lls that fail du
69f0: 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73 74  e to EINTR.*/.st
6a00: 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f  atic int robust_
6a10: 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  open(const char 
6a20: 2a 7a 2c 20 69 6e 74 20 66 2c 20 69 6e 74 20 6d  *z, int f, int m
6a30: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64  ){.  int rc;.  d
6a40: 6f 7b 20 72 63 20 3d 20 6f 73 4f 70 65 6e 28 7a  o{ rc = osOpen(z
6a50: 2c 66 2c 6d 29 3b 20 7d 77 68 69 6c 65 28 20 72  ,f,m); }while( r
6a60: 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  c<0 && errno==EI
6a70: 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  NTR );.  return 
6a80: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c  rc;.}../*.** Hel
6a90: 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  per functions to
6aa0: 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69   obtain and reli
6ab0: 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61  nquish the globa
6ac0: 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20  l mutex. The.** 
6ad0: 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20  global mutex is 
6ae0: 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20  used to protect 
6af0: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
6b00: 6f 20 61 6e 64 0a 2a 2a 20 76 78 77 6f 72 6b 73  o and.** vxworks
6b10: 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 73 20 75  FileId objects u
6b20: 73 65 64 20 62 79 20 74 68 69 73 20 66 69 6c 65  sed by this file
6b30: 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d  , all of which m
6b40: 61 79 20 62 65 20 0a 2a 2a 20 73 68 61 72 65 64  ay be .** shared
6b50: 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72   by multiple thr
6b60: 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63  eads..**.** Func
6b70: 74 69 6f 6e 20 75 6e 69 78 4d 75 74 65 78 48 65  tion unixMutexHe
6b80: 6c 64 28 29 20 69 73 20 75 73 65 64 20 74 6f 20  ld() is used to 
6b90: 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68  assert() that th
6ba0: 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a  e global mutex .
6bb0: 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65 6e 20  ** is held when 
6bc0: 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 66  required. This f
6bd0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
6be0: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
6bf0: 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74 61  assert() .** sta
6c00: 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a  tements. e.g..**
6c10: 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  .**   unixEnterM
6c20: 75 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73  utex().**     as
6c30: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
6c40: 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 75 6e  eld() );.**   un
6c50: 69 78 45 6e 74 65 72 4c 65 61 76 65 28 29 0a 2a  ixEnterLeave().*
6c60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
6c70: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69  ixEnterMutex(voi
6c80: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
6c90: 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65  tex_enter(sqlite
6ca0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
6cb0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
6cc0: 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74  MASTER));.}.stat
6cd0: 69 63 20 76 6f 69 64 20 75 6e 69 78 4c 65 61 76  ic void unixLeav
6ce0: 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20  eMutex(void){.  
6cf0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
6d00: 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78  ave(sqlite3Mutex
6d10: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
6d20: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
6d30: 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c  ));.}.#ifdef SQL
6d40: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
6d50: 20 69 6e 74 20 75 6e 69 78 4d 75 74 65 78 48 65   int unixMutexHe
6d60: 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65 74  ld(void) {.  ret
6d70: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
6d80: 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d 75  x_held(sqlite3Mu
6d90: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
6da0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
6db0: 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TER));.}.#endif.
6dc0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
6dd0: 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64 65  LITE_TEST) && de
6de0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
6df0: 55 47 29 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72  UG)./*.** Helper
6e00: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72   function for pr
6e10: 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61 63 65  inting out trace
6e20: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
6e30: 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62  m debugging.** b
6e40: 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20 72 65  inaries. This re
6e50: 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67  turns the string
6e60: 20 72 65 70 72 65 73 65 74 61 74 69 6f 6e 20 6f   represetation o
6e70: 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a  f the supplied.*
6e80: 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74  * integer lock-t
6e90: 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ype..*/.static c
6ea0: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 46 69 6c  onst char *azFil
6eb0: 65 4c 6f 63 6b 28 69 6e 74 20 65 46 69 6c 65 4c  eLock(int eFileL
6ec0: 6f 63 6b 29 7b 0a 20 20 73 77 69 74 63 68 28 20  ock){.  switch( 
6ed0: 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
6ee0: 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72   case NO_LOCK: r
6ef0: 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20  eturn "NONE";.  
6f00: 20 20 63 61 73 65 20 53 48 41 52 45 44 5f 4c 4f    case SHARED_LO
6f10: 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48 41 52  CK: return "SHAR
6f20: 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 52 45  ED";.    case RE
6f30: 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74  SERVED_LOCK: ret
6f40: 75 72 6e 20 22 52 45 53 45 52 56 45 44 22 3b 0a  urn "RESERVED";.
6f50: 20 20 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47      case PENDING
6f60: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50  _LOCK: return "P
6f70: 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20 63 61 73  ENDING";.    cas
6f80: 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  e EXCLUSIVE_LOCK
6f90: 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53  : return "EXCLUS
6fa0: 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75  IVE";.  }.  retu
6fb0: 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65  rn "ERROR";.}.#e
6fc0: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
6fd0: 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f  ITE_LOCK_TRACE./
6fe0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 69  *.** Print out i
6ff0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
7000: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65   all locking ope
7010: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  rations..**.** T
7020: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
7030: 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c 65 73  sed for troubles
7040: 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e  hooting locks on
7050: 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64 0a 2a   multithreaded.*
7060: 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e  * platforms.  En
7070: 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e  able by compilin
7080: 67 20 77 69 74 68 20 74 68 65 20 2d 44 53 51 4c  g with the -DSQL
7090: 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a  ITE_LOCK_TRACE.*
70a0: 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f  * command-line o
70b0: 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d  ption on the com
70c0: 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63 6f 64  piler.  This cod
70d0: 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a  e is normally.**
70e0: 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a   turned off..*/.
70f0: 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54  static int lockT
7100: 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74  race(int fd, int
7110: 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63   op, struct floc
7120: 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  k *p){.  char *z
7130: 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a  OpName, *zType;.
7140: 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73    int s;.  int s
7150: 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28  avedErrno;.  if(
7160: 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a   op==F_GETLK ){.
7170: 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47      zOpName = "G
7180: 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69  ETLK";.  }else i
7190: 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29  f( op==F_SETLK )
71a0: 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20  {.    zOpName = 
71b0: 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65  "SETLK";.  }else
71c0: 7b 0a 20 20 20 20 73 20 3d 20 6f 73 46 63 6e 74  {.    s = osFcnt
71d0: 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20  l(fd, op, p);.  
71e0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
71f0: 69 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e  intf("fcntl unkn
7200: 6f 77 6e 20 25 64 20 25 64 20 25 64 5c 6e 22 2c  own %d %d %d\n",
7210: 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20   fd, op, s);.   
7220: 20 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20   return s;.  }. 
7230: 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d   if( p->l_type==
7240: 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a  F_RDLCK ){.    z
7250: 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a  Type = "RDLCK";.
7260: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c    }else if( p->l
7270: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  _type==F_WRLCK )
7280: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57  {.    zType = "W
7290: 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69  RLCK";.  }else i
72a0: 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  f( p->l_type==F_
72b0: 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79  UNLCK ){.    zTy
72c0: 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20  pe = "UNLCK";.  
72d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
72e0: 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73  t( 0 );.  }.  as
72f0: 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63  sert( p->l_whenc
7300: 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20  e==SEEK_SET );. 
7310: 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c   s = osFcntl(fd,
7320: 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76 65 64   op, p);.  saved
7330: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
7340: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
7350: 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20 25 64  ntf("fcntl %d %d
7360: 20 25 73 20 25 73 20 25 64 20 25 64 20 25 64 20   %s %s %d %d %d 
7370: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72 65  %d\n",.     thre
7380: 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d  adid, fd, zOpNam
7390: 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 70  e, zType, (int)p
73a0: 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29  ->l_start, (int)
73b0: 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20 28  p->l_len,.     (
73c0: 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73 29  int)p->l_pid, s)
73d0: 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20  ;.  if( s==(-1) 
73e0: 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 26  && op==F_SETLK &
73f0: 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  & (p->l_type==F_
7400: 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79  RDLCK || p->l_ty
7410: 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b 0a  pe==F_WRLCK) ){.
7420: 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b      struct flock
7430: 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a 70   l2;.    l2 = *p
7440: 3b 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64  ;.    osFcntl(fd
7450: 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b  , F_GETLK, &l2);
7460: 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79  .    if( l2.l_ty
7470: 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
7480: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44       zType = "RD
7490: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  LCK";.    }else 
74a0: 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46  if( l2.l_type==F
74b0: 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _WRLCK ){.      
74c0: 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b  zType = "WRLCK";
74d0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
74e0: 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43  2.l_type==F_UNLC
74f0: 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  K ){.      zType
7500: 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20   = "UNLCK";.    
7510: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
7520: 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a  ert( 0 );.    }.
7530: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
7540: 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61  Printf("fcntl-fa
7550: 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73  ilure-reason: %s
7560: 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20   %d %d %d\n",.  
7570: 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e 74       zType, (int
7580: 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e  )l2.l_start, (in
7590: 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74  t)l2.l_len, (int
75a0: 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a  )l2.l_pid);.  }.
75b0: 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64 45    errno = savedE
75c0: 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73  rrno;.  return s
75d0: 3b 0a 7d 0a 23 75 6e 64 65 66 20 6f 73 46 63 6e  ;.}.#undef osFcn
75e0: 74 6c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e  tl.#define osFcn
75f0: 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e  tl lockTrace.#en
7600: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f  dif /* SQLITE_LO
7610: 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a  CK_TRACE */../*.
7620: 2a 2a 20 52 65 74 72 79 20 66 74 72 75 6e 63 61  ** Retry ftrunca
7630: 74 65 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20  te() calls that 
7640: 66 61 69 6c 20 64 75 65 20 74 6f 20 45 49 4e 54  fail due to EINT
7650: 52 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  R.*/.static int 
7660: 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
7670: 28 69 6e 74 20 68 2c 20 73 71 6c 69 74 65 33 5f  (int h, sqlite3_
7680: 69 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69 6e 74  int64 sz){.  int
7690: 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20   rc;.  do{ rc = 
76a0: 6f 73 46 74 72 75 6e 63 61 74 65 28 68 2c 73 7a  osFtruncate(h,sz
76b0: 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  ); }while( rc<0 
76c0: 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
76d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
76e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
76f0: 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74 65 73  utine translates
7700: 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f 53 49   a standard POSI
7710: 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74  X errno code int
7720: 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75  o something.** u
7730: 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63 6c 69  seful to the cli
7740: 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71 6c 69  ents of the sqli
7750: 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  te3 functions.  
7760: 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 74  Specifically, it
7770: 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20   is.** intended 
7780: 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61 20 76  to translate a v
7790: 61 72 69 65 74 79 20 6f 66 20 22 74 72 79 20 61  ariety of "try a
77a0: 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69 6e 74  gain" errors int
77b0: 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a  o SQLITE_BUSY.**
77c0: 20 61 6e 64 20 61 20 76 61 72 69 65 74 79 20 6f   and a variety o
77d0: 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73 65 20  f "please close 
77e0: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
77f0: 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72 73 20  tor NOW" errors 
7800: 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  into .** SQLITE_
7810: 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72  IOERR.** .** Err
7820: 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69 74 69  ors during initi
7830: 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63  alization of loc
7840: 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79 73 74  ks, or file syst
7850: 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c  em support for l
7860: 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20  ocks,.** should 
7870: 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45  handle ENOLCK, E
7880: 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55  NOTSUP, EOPNOTSU
7890: 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a  PP separately..*
78a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
78b0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
78c0: 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73 69 78  xError(int posix
78d0: 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74  Error, int sqlit
78e0: 65 49 4f 45 72 72 29 20 7b 0a 20 20 73 77 69 74  eIOErr) {.  swit
78f0: 63 68 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20  ch (posixError) 
7900: 7b 0a 23 69 66 20 30 0a 20 20 2f 2a 20 41 74 20  {.#if 0.  /* At 
7910: 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20 63  one point this c
7920: 6f 64 65 20 77 61 73 20 6e 6f 74 20 63 6f 6d 6d  ode was not comm
7930: 65 6e 74 65 64 20 6f 75 74 2e 20 49 6e 20 74 68  ented out. In th
7940: 65 6f 72 79 2c 20 74 68 69 73 20 62 72 61 6e 63  eory, this branc
7950: 68 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 65  h.  ** should ne
7960: 76 65 72 20 62 65 20 68 69 74 2c 20 61 73 20 74  ver be hit, as t
7970: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
7980: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  uld only be call
7990: 65 64 20 61 66 74 65 72 0a 20 20 2a 2a 20 61 20  ed after.  ** a 
79a0: 6c 6f 63 6b 69 6e 67 2d 72 65 6c 61 74 65 64 20  locking-related 
79b0: 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65 2e 20 66  function (i.e. f
79c0: 63 6e 74 6c 28 29 29 20 68 61 73 20 72 65 74 75  cntl()) has retu
79d0: 72 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 77 69  rned non-zero wi
79e0: 74 68 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  th.  ** the valu
79f0: 65 20 6f 66 20 65 72 72 6e 6f 20 61 73 20 74 68  e of errno as th
7a00: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
7a10: 2e 20 53 69 6e 63 65 20 61 20 73 79 73 74 65 6d  . Since a system
7a20: 20 63 61 6c 6c 20 68 61 73 20 66 61 69 6c 65 64   call has failed
7a30: 2c 0a 20 20 2a 2a 20 65 72 72 6e 6f 20 73 68 6f  ,.  ** errno sho
7a40: 75 6c 64 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 2e  uld be non-zero.
7a50: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 73 70 69  .  **.  ** Despi
7a60: 74 65 20 74 68 69 73 2c 20 69 66 20 65 72 72 6e  te this, if errn
7a70: 6f 20 72 65 61 6c 6c 79 20 69 73 20 7a 65 72 6f  o really is zero
7a80: 2c 20 77 65 20 73 74 69 6c 6c 20 64 6f 6e 27 74  , we still don't
7a90: 20 77 61 6e 74 20 74 6f 20 72 65 74 75 72 6e 0a   want to return.
7aa0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20    ** SQLITE_OK. 
7ab0: 54 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  The system call 
7ac0: 66 61 69 6c 65 64 2c 20 61 6e 64 20 2a 73 6f 6d  failed, and *som
7ad0: 65 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  e* SQLite error 
7ae0: 73 68 6f 75 6c 64 20 62 65 0a 20 20 2a 2a 20 70  should be.  ** p
7af0: 72 6f 70 61 67 61 74 65 64 20 62 61 63 6b 20 74  ropagated back t
7b00: 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 43 6f  o the caller. Co
7b10: 6d 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 62 72  mmenting this br
7b20: 61 6e 63 68 20 6f 75 74 20 6d 65 61 6e 73 20 65  anch out means e
7b30: 72 72 6e 6f 3d 3d 30 0a 20 20 2a 2a 20 77 69 6c  rrno==0.  ** wil
7b40: 6c 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20  l be handled by 
7b50: 74 68 65 20 22 64 65 66 61 75 6c 74 3a 22 20 63  the "default:" c
7b60: 61 73 65 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a  ase below..  */.
7b70: 20 20 63 61 73 65 20 30 3a 20 0a 20 20 20 20 72    case 0: .    r
7b80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7b90: 0a 23 65 6e 64 69 66 0a 0a 20 20 63 61 73 65 20  .#endif..  case 
7ba0: 45 41 47 41 49 4e 3a 0a 20 20 63 61 73 65 20 45  EAGAIN:.  case E
7bb0: 54 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61 73 65  TIMEDOUT:.  case
7bc0: 20 45 42 55 53 59 3a 0a 20 20 63 61 73 65 20 45   EBUSY:.  case E
7bd0: 49 4e 54 52 3a 0a 20 20 63 61 73 65 20 45 4e 4f  INTR:.  case ENO
7be0: 4c 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20 72 61  LCK:  .    /* ra
7bf0: 6e 64 6f 6d 20 4e 46 53 20 72 65 74 72 79 20 65  ndom NFS retry e
7c00: 72 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64 75 72  rror, unless dur
7c10: 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ing file system 
7c20: 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20  support .     * 
7c30: 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69  introspection, i
7c40: 6e 20 77 68 69 63 68 20 69 74 20 61 63 74 75 61  n which it actua
7c50: 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69  lly means what i
7c60: 74 20 73 61 79 73 20 2a 2f 0a 20 20 20 20 72 65  t says */.    re
7c70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
7c80: 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45 41  ;.    .  case EA
7c90: 43 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20 45 41  CCES: .    /* EA
7ca0: 43 43 45 53 20 69 73 20 6c 69 6b 65 20 45 41 47  CCES is like EAG
7cb0: 41 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69  AIN during locki
7cc0: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 62  ng operations, b
7cd0: 75 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68 65 72  ut not any other
7ce0: 20 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66 28 20   time*/.    if( 
7cf0: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
7d00: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
7d10: 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65 49  K) || ..(sqliteI
7d20: 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49  OErr == SQLITE_I
7d30: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20  OERR_UNLOCK) || 
7d40: 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d  ..(sqliteIOErr =
7d50: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  = SQLITE_IOERR_R
7d60: 44 4c 4f 43 4b 29 20 7c 7c 0a 09 28 73 71 6c 69  DLOCK) ||..(sqli
7d70: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
7d80: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
7d90: 45 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a 20 20  ERVEDLOCK) ){.  
7da0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7db0: 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20  E_BUSY;.    }.  
7dc0: 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 20 74    /* else fall t
7dd0: 68 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61 73 65  hrough */.  case
7de0: 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65 74   EPERM: .    ret
7df0: 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
7e00: 0a 20 20 20 20 0a 20 20 2f 2a 20 45 44 45 41 44  .    .  /* EDEAD
7e10: 4c 4b 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69  LK is only possi
7e20: 62 6c 65 20 69 66 20 61 20 63 61 6c 6c 20 74 6f  ble if a call to
7e30: 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 57 29   fcntl(F_SETLKW)
7e40: 20 69 73 20 6d 61 64 65 2e 20 41 6e 64 0a 20 20   is made. And.  
7e50: 2a 2a 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 6e  ** this module n
7e60: 65 76 65 72 20 6d 61 6b 65 73 20 73 75 63 68 20  ever makes such 
7e70: 61 20 63 61 6c 6c 2e 20 41 6e 64 20 74 68 65 20  a call. And the 
7e80: 63 6f 64 65 20 69 6e 20 53 51 4c 69 74 65 20 69  code in SQLite i
7e90: 74 73 65 6c 66 20 0a 20 20 2a 2a 20 61 73 73 65  tself .  ** asse
7ea0: 72 74 73 20 74 68 61 74 20 53 51 4c 49 54 45 5f  rts that SQLITE_
7eb0: 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 69 73  IOERR_BLOCKED is
7ec0: 20 6e 65 76 65 72 20 72 65 74 75 72 6e 65 64 2e   never returned.
7ed0: 20 46 6f 72 20 74 68 65 73 65 20 72 65 61 73 6f   For these reaso
7ee0: 6e 73 0a 20 20 2a 2a 20 74 68 69 73 20 63 61 73  ns.  ** this cas
7ef0: 65 20 69 73 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e  e is also commen
7f00: 74 65 64 20 6f 75 74 2e 20 49 66 20 74 68 65 20  ted out. If the 
7f10: 73 79 73 74 65 6d 20 64 6f 65 73 20 73 65 74 20  system does set 
7f20: 65 72 72 6e 6f 20 74 6f 20 45 44 45 41 44 4c 4b  errno to EDEADLK
7f30: 2c 0a 20 20 2a 2a 20 74 68 65 20 64 65 66 61 75  ,.  ** the defau
7f40: 6c 74 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  lt SQLITE_IOERR_
7f50: 58 58 58 20 63 6f 64 65 20 77 69 6c 6c 20 62 65  XXX code will be
7f60: 20 72 65 74 75 72 6e 65 64 2e 20 2a 2f 0a 23 69   returned. */.#i
7f70: 66 20 30 0a 20 20 63 61 73 65 20 45 44 45 41 44  f 0.  case EDEAD
7f80: 4c 4b 3a 0a 20 20 20 20 72 65 74 75 72 6e 20 53  LK:.    return S
7f90: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
7fa0: 4b 45 44 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  KED;.#endif.    
7fb0: 0a 23 69 66 20 45 4f 50 4e 4f 54 53 55 50 50 21  .#if EOPNOTSUPP!
7fc0: 3d 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20  =ENOTSUP.  case 
7fd0: 45 4f 50 4e 4f 54 53 55 50 50 3a 20 0a 20 20 20  EOPNOTSUPP: .   
7fe0: 20 2f 2a 20 73 6f 6d 65 74 68 69 6e 67 20 77 65   /* something we
7ff0: 6e 74 20 74 65 72 72 69 62 6c 79 20 61 77 72 79  nt terribly awry
8000: 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20  , unless during 
8010: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
8020: 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72  ort .     * intr
8030: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
8040: 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20  ich it actually 
8050: 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61  means what it sa
8060: 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  ys */.#endif.#if
8070: 64 65 66 20 45 4e 4f 54 53 55 50 0a 20 20 63 61  def ENOTSUP.  ca
8080: 73 65 20 45 4e 4f 54 53 55 50 3a 20 0a 20 20 20  se ENOTSUP: .   
8090: 20 2f 2a 20 69 6e 76 61 6c 69 64 20 66 64 2c 20   /* invalid fd, 
80a0: 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69  unless during fi
80b0: 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le system suppor
80c0: 74 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c  t introspection,
80d0: 20 69 6e 20 77 68 69 63 68 20 0a 20 20 20 20 20   in which .     
80e0: 2a 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65  * it actually me
80f0: 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73  ans what it says
8100: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 61 73   */.#endif.  cas
8110: 65 20 45 49 4f 3a 0a 20 20 63 61 73 65 20 45 42  e EIO:.  case EB
8120: 41 44 46 3a 0a 20 20 63 61 73 65 20 45 49 4e 56  ADF:.  case EINV
8130: 41 4c 3a 0a 20 20 63 61 73 65 20 45 4e 4f 54 43  AL:.  case ENOTC
8140: 4f 4e 4e 3a 0a 20 20 63 61 73 65 20 45 4e 4f 44  ONN:.  case ENOD
8150: 45 56 3a 0a 20 20 63 61 73 65 20 45 4e 58 49 4f  EV:.  case ENXIO
8160: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 45 4e 54 3a  :.  case ENOENT:
8170: 0a 23 69 66 64 65 66 20 45 53 54 41 4c 45 20 20  .#ifdef ESTALE  
8180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8190: 20 20 20 2f 2a 20 45 53 54 41 4c 45 20 69 73 20     /* ESTALE is 
81a0: 6e 6f 74 20 64 65 66 69 6e 65 64 20 6f 6e 20 49  not defined on I
81b0: 6e 74 65 72 69 78 20 73 79 73 74 65 6d 73 20 2a  nterix systems *
81c0: 2f 0a 20 20 63 61 73 65 20 45 53 54 41 4c 45 3a  /.  case ESTALE:
81d0: 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45  .#endif.  case E
81e0: 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20 74 68  NOSYS:.    /* th
81f0: 65 73 65 20 73 68 6f 75 6c 64 20 66 6f 72 63 65  ese should force
8200: 20 74 68 65 20 63 6c 69 65 6e 74 20 74 6f 20 63   the client to c
8210: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61 6e  lose the file an
8220: 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20  d reconnect */. 
8230: 20 20 20 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a     .  default: .
8240: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
8250: 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a  eIOErr;.  }.}...
8260: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
8270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82b0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
82c0: 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71 75 65  *** Begin Unique
82d0: 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79   File ID Utility
82e0: 20 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73   Used By VxWorks
82f0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
8300: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76  .**.** On most v
8310: 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c  ersions of unix,
8320: 20 77 65 20 63 61 6e 20 67 65 74 20 61 20 75 6e   we can get a un
8330: 69 71 75 65 20 49 44 20 66 6f 72 20 61 20 66 69  ique ID for a fi
8340: 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e 61 74  le by concatenat
8350: 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76 69 63  ing.** the devic
8360: 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  e number and the
8370: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20   inode number.  
8380: 42 75 74 20 74 68 69 73 20 64 6f 65 73 20 6e 6f  But this does no
8390: 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b  t work on VxWork
83a0: 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73  s..** On VxWorks
83b0: 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20  , a unique file 
83c0: 69 64 20 6d 75 73 74 20 62 65 20 62 61 73 65 64  id must be based
83d0: 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61   on the canonica
83e0: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a  l filename..**.*
83f0: 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  * A pointer to a
8400: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
8410: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
8420: 63 74 75 72 65 20 63 61 6e 20 62 65 20 75 73 65  cture can be use
8430: 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65  d as a.** unique
8440: 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78 57 6f   file ID in VxWo
8450: 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73 74 61  rks.  Each insta
8460: 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
8470: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a  cture contains.*
8480: 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  * a copy of the 
8490: 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  canonical filena
84a0: 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20 61 6c  me.  There is al
84b0: 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65 20 63  so a reference c
84c0: 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73  ount.  .** The s
84d0: 74 72 75 63 74 75 72 65 20 69 73 20 72 65 63 6c  tructure is recl
84e0: 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65 20 6e  aimed when the n
84f0: 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72  umber of pointer
8500: 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20 74 6f  s to it drops to
8510: 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  .** zero..**.** 
8520: 54 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20  There are never 
8530: 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65 73 20  very many files 
8540: 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65  open at one time
8550: 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65   and lookups are
8560: 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72   not.** a perfor
8570: 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c 20 70  mance-critical p
8580: 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20 73 75  ath, so it is su
8590: 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75 74 20  fficient to put 
85a0: 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63 74 75  these.** structu
85b0: 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20  res on a linked 
85c0: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  list..*/.struct 
85d0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a  vxworksFileId {.
85e0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
85f0: 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20 20  FileId *pNext;  
8600: 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c 69 73  /* Next in a lis
8610: 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f  t of them all */
8620: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
8630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8640: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
8650: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73  ferences to this
8660: 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e   one */.  int nN
8670: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
8680: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
8690: 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69  h of the zCanoni
86a0: 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67  calName[] string
86b0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e   */.  char *zCan
86c0: 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20  onicalName;     
86d0: 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c      /* Canonical
86e0: 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a   filename */.};.
86f0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
8700: 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75  /* .** All uniqu
8710: 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20  e filenames are 
8720: 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64  held on a linked
8730: 20 6c 69 73 74 20 68 65 61 64 65 64 20 62 79 20   list headed by 
8740: 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65  this.** variable
8750: 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  :.*/.static stru
8760: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
8770: 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73   *vxworksFileLis
8780: 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69  t = 0;../*.** Si
8790: 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d  mplify a filenam
87a0: 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e  e into its canon
87b0: 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20  ical form.** by 
87c0: 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  making the follo
87d0: 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a  wing changes:.**
87e0: 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20  .**  * removing 
87f0: 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61 6e 64  any trailing and
8800: 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20   duplicate /.** 
8810: 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69   * convert /./ i
8820: 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a  nto just /.**  *
8830: 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20   convert /A/../ 
8840: 77 68 65 72 65 20 41 20 69 73 20 61 6e 79 20 73  where A is any s
8850: 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20  imple name into 
8860: 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61  just /.**.** Cha
8870: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 6e  nges are made in
8880: 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72 6e 20  -place.  Return 
8890: 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e  the new name len
88a0: 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  gth..**.** The o
88b0: 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  riginal filename
88c0: 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d   is in z[0..n-1]
88d0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
88e0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61  mber of.** chara
88f0: 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 69 6d  cters in the sim
8900: 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f  plified name..*/
8910: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78 77 6f  .static int vxwo
8920: 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28  rksSimplifyName(
8930: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b  char *z, int n){
8940: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77  .  int i, j;.  w
8950: 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e  hile( n>1 && z[n
8960: 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b  -1]=='/' ){ n--;
8970: 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20   }.  for(i=j=0; 
8980: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<n; i++){.    i
8990: 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a  f( z[i]=='/' ){.
89a0: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
89b0: 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65  =='/' ) continue
89c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  ;.      if( z[i+
89d0: 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e  1]=='.' && i+2<n
89e0: 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20   && z[i+2]=='/' 
89f0: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20  ){.        i += 
8a00: 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  1;.        conti
8a10: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
8a20: 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27     if( z[i+1]=='
8a30: 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a  .' && i+3<n && z
8a40: 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b  [i+2]=='.' && z[
8a50: 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i+3]=='/' ){.   
8a60: 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20       while( j>0 
8a70: 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29  && z[j-1]!='/' )
8a80: 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20  { j--; }.       
8a90: 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b   if( j>0 ){ j--;
8aa0: 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20   }.        i += 
8ab0: 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  2;.        conti
8ac0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
8ad0: 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20   }.    z[j++] = 
8ae0: 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d  z[i];.  }.  z[j]
8af0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a   = 0;.  return j
8b00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
8b10: 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44  a unique file ID
8b20: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 61   for the given a
8b30: 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65  bsolute pathname
8b40: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  .  Return.** a p
8b50: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 76 78  ointer to the vx
8b60: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
8b70: 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 65  ct.  This pointe
8b80: 72 20 69 73 20 74 68 65 20 75 6e 69 71 75 65 0a  r is the unique.
8b90: 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a  ** file ID..**.*
8ba0: 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65 6c 64  * The nRef field
8bb0: 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b 73 46   of the vxworksF
8bc0: 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20  ileId object is 
8bd0: 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65 66 6f  incremented befo
8be0: 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74  re.** the object
8bf0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41   is returned.  A
8c00: 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69 6c 65   new vxworksFile
8c10: 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  Id object is cre
8c20: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65  ated.** and adde
8c30: 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20  d to the global 
8c40: 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73 61 72  list if necessar
8c50: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  y..**.** If a me
8c60: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
8c70: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
8c80: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  turn NULL..*/.st
8c90: 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77 6f  atic struct vxwo
8ca0: 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72  rksFileId *vxwor
8cb0: 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e  ksFindFileId(con
8cc0: 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75  st char *zAbsolu
8cd0: 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75 63  teName){.  struc
8ce0: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
8cf0: 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 2f  *pNew;         /
8d00: 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61 6e 64  * search key and
8d10: 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a   new file ID */.
8d20: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
8d30: 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69 64 61  FileId *pCandida
8d40: 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f  te;   /* For loo
8d50: 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73 74 69  ping over existi
8d60: 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20  ng file IDs */. 
8d70: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
8d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d90: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
8da0: 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20  f zAbsoluteName 
8db0: 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73  string */..  ass
8dc0: 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61  ert( zAbsoluteNa
8dd0: 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20  me[0]=='/' );.  
8de0: 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
8df0: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a  zAbsoluteName);.
8e00: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
8e10: 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
8e20: 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29  *pNew) + (n+1) )
8e30: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
8e40: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
8e50: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
8e60: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  me = (char*)&pNe
8e70: 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70  w[1];.  memcpy(p
8e80: 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  New->zCanonicalN
8e90: 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61  ame, zAbsoluteNa
8ea0: 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20  me, n+1);.  n = 
8eb0: 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e  vxworksSimplifyN
8ec0: 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  ame(pNew->zCanon
8ed0: 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20  icalName, n);.. 
8ee0: 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
8ef0: 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  n existing entry
8f00: 20 74 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74   that matching t
8f10: 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d  he canonical nam
8f20: 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64  e..  ** If found
8f30: 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  , increment the 
8f40: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
8f50: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
8f60: 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65  nter to.  ** the
8f70: 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49   existing file I
8f80: 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e  D..  */.  unixEn
8f90: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f  terMutex();.  fo
8fa0: 72 28 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77  r(pCandidate=vxw
8fb0: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43  orksFileList; pC
8fc0: 61 6e 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69  andidate; pCandi
8fd0: 64 61 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d  date=pCandidate-
8fe0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
8ff0: 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61   pCandidate->nNa
9000: 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d  me==n .     && m
9010: 65 6d 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65  emcmp(pCandidate
9020: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
9030: 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63  , pNew->zCanonic
9040: 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20  alName, n)==0.  
9050: 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69    ){.       sqli
9060: 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
9070: 20 20 20 20 20 20 20 70 43 61 6e 64 69 64 61 74         pCandidat
9080: 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  e->nRef++;.     
9090: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
90a0: 28 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72  ();.       retur
90b0: 6e 20 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20  n pCandidate;.  
90c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f    }.  }..  /* No
90d0: 20 6d 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64   match was found
90e0: 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20  .  We will make 
90f0: 61 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f  a new file ID */
9100: 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20  .  pNew->nRef = 
9110: 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65  1;.  pNew->nName
9120: 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e   = n;.  pNew->pN
9130: 65 78 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c  ext = vxworksFil
9140: 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73  eList;.  vxworks
9150: 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b  FileList = pNew;
9160: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
9170: 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  x();.  return pN
9180: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  ew;.}../*.** Dec
9190: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
91a0: 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20  ence count on a 
91b0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
91c0: 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74  ject.  Free.** t
91d0: 68 65 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74  he object when t
91e0: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
91f0: 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e  nt reaches zero.
9200: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9210: 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69  vxworksReleaseFi
9220: 6c 65 49 64 28 73 74 72 75 63 74 20 76 78 77 6f  leId(struct vxwo
9230: 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b  rksFileId *pId){
9240: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
9250: 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x();.  assert( p
9260: 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Id->nRef>0 );.  
9270: 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pId->nRef--;.  i
9280: 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20  f( pId->nRef==0 
9290: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 76 78  ){.    struct vx
92a0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70  worksFileId **pp
92b0: 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78  ;.    for(pp=&vx
92c0: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a  worksFileList; *
92d0: 70 70 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20  pp && *pp!=pId; 
92e0: 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e  pp = &((*pp)->pN
92f0: 65 78 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65  ext)){}.    asse
9300: 72 74 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a  rt( *pp==pId );.
9310: 20 20 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70      *pp = pId->p
9320: 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Next;.    sqlite
9330: 33 5f 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d  3_free(pId);.  }
9340: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
9350: 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  x();.}.#endif /*
9360: 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f   OS_VXWORKS */./
9370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
9380: 45 6e 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69  End of Unique Fi
9390: 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73  le ID Utility Us
93a0: 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a  ed By VxWorks **
93b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
93c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
93d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
93e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
93f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
9410: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
9420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9460: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
9470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73  ************ Pos
9480: 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b  ix Advisory Lock
9490: 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
94a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
94b0: 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76  .**.** POSIX adv
94c0: 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20  isory locks are 
94d0: 62 72 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e  broken by design
94e0: 2e 20 20 41 4e 53 49 20 53 54 44 20 31 30 30 33  .  ANSI STD 1003
94f0: 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63  .1 (1996).** sec
9500: 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e  tion 6.5.2.2 lin
9510: 65 73 20 34 38 33 20 74 68 72 6f 75 67 68 20 34  es 483 through 4
9520: 39 30 20 73 70 65 63 69 66 79 20 74 68 61 74 20  90 specify that 
9530: 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a  when a process.*
9540: 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73  * sets or clears
9550: 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70   a lock, that op
9560: 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65  eration override
9570: 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b  s any prior lock
9580: 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20  s set.** by the 
9590: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49  same process.  I
95a0: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69  t does not expli
95b0: 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75  citly say so, bu
95c0: 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a  t this implies.*
95d0: 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72 72 69  * that it overri
95e0: 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79  des locks set by
95f0: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
9600: 73 20 75 73 69 6e 67 20 61 20 64 69 66 66 65 72  s using a differ
9610: 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  ent.** file desc
9620: 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65  riptor.  Conside
9630: 72 20 74 68 69 73 20 74 65 73 74 20 63 61 73 65  r this test case
9640: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e  :.**.**       in
9650: 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f  t fd1 = open("./
9660: 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f  file1", O_RDWR|O
9670: 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a  _CREAT, 0644);.*
9680: 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 32 20  *       int fd2 
9690: 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22  = open("./file2"
96a0: 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  , O_RDWR|O_CREAT
96b0: 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53  , 0644);.**.** S
96c0: 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61  uppose ./file1 a
96d0: 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72  nd ./file2 are r
96e0: 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66  eally the same f
96f0: 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ile (because.** 
9700: 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20 6f 72  one is a hard or
9710: 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74   symbolic link t
9720: 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74 68 65  o the other) the
9730: 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20  n if you set.** 
9740: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
9750: 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74  k on fd1, then t
9760: 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63  ry to get an exc
9770: 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f  lusive lock.** o
9780: 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e  n fd2, it works.
9790: 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65    I would have e
97a0: 78 70 65 63 74 65 64 20 74 68 65 20 73 65 63 6f  xpected the seco
97b0: 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61  nd lock to.** fa
97c0: 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77  il since there w
97d0: 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  as already a loc
97e0: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75  k on the file du
97f0: 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74  e to fd1..** But
9800: 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20   not so.  Since 
9810: 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20  both locks came 
9820: 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72  from the same pr
9830: 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65  ocess, the.** se
9840: 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74  cond overrides t
9850: 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74  he first, even t
9860: 68 6f 75 67 68 20 74 68 65 79 20 77 65 72 65 20  hough they were 
9870: 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  on different.** 
9880: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
9890: 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65   opened on diffe
98a0: 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e  rent file names.
98b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e  .**.** This mean
98c0: 73 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74  s that we cannot
98d0: 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73   use POSIX locks
98e0: 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20   to synchronize 
98f0: 66 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61  file access.** a
9900: 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74  mong competing t
9910: 68 72 65 61 64 73 20 6f 66 20 74 68 65 20 73 61  hreads of the sa
9920: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53  me process.  POS
9930: 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f  IX locks will wo
9940: 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79  rk fine.** to sy
9950: 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73  nchronize access
9960: 20 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20   for threads in 
9970: 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73  separate process
9980: 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74  es, but not.** t
9990: 68 72 65 61 64 73 20 77 69 74 68 69 6e 20 74 68  hreads within th
99a0: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a  e same process..
99b0: 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72  **.** To work ar
99c0: 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d  ound the problem
99d0: 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20  , SQLite has to 
99e0: 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b  manage file lock
99f0: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  s internally.** 
9a00: 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65  on its own.  Whe
9a10: 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61 74 61  never a new data
9a20: 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20  base is opened, 
9a30: 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20  we have to find 
9a40: 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  the.** specific 
9a50: 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74  inode of the dat
9a60: 61 62 61 73 65 20 66 69 6c 65 20 28 74 68 65 20  abase file (the 
9a70: 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69  inode is determi
9a80: 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74  ned by the.** st
9a90: 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20  _dev and st_ino 
9aa0: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74  fields of the st
9ab0: 61 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61  at structure tha
9ac0: 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20  t fstat() fills 
9ad0: 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b  in).** and check
9ae0: 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61   for locks alrea
9af0: 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74  dy existing on t
9b00: 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e  hat inode.  When
9b10: 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72   locks are.** cr
9b20: 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64  eated or removed
9b30: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f  , we have to loo
9b40: 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74  k at our own int
9b50: 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20  ernal record of 
9b60: 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20  the.** locks to 
9b70: 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74  see if another t
9b80: 68 72 65 61 64 20 68 61 73 20 70 72 65 76 69 6f  hread has previo
9b90: 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20  usly set a lock 
9ba0: 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20  on that same.** 
9bb0: 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73  inode..**.** (As
9bc0: 69 64 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20  ide: The use of 
9bd0: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73  inode numbers as
9be0: 20 75 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73   unique IDs does
9bf0: 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57   not work on VxW
9c00: 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57  orks..** For VxW
9c10: 6f 72 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f  orks, we have to
9c20: 20 75 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61   use the alterna
9c30: 74 69 76 65 20 75 6e 69 71 75 65 20 49 44 20 73  tive unique ID s
9c40: 79 73 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a  ystem based on.*
9c50: 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  * canonical file
9c60: 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65  name and impleme
9c70: 6e 74 65 64 20 69 6e 20 74 68 65 20 70 72 65 76  nted in the prev
9c80: 69 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a  ious division.).
9c90: 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  **.** The sqlite
9ca0: 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
9cb0: 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f   for POSIX is no
9cc0: 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20   longer just an 
9cd0: 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20  integer file.** 
9ce0: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20  descriptor.  It 
9cf0: 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75  is now a structu
9d00: 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  re that holds th
9d10: 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a  e integer file.*
9d20: 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64  * descriptor and
9d30: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
9d40: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
9d50: 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6e 74  escribes the int
9d60: 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f  ernal.** locks o
9d70: 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
9d80: 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72  ing inode.  Ther
9d90: 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67  e is one locking
9da0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65   structure.** pe
9db0: 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74  r inode, so if t
9dc0: 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73  he same inode is
9dd0: 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62   opened twice, b
9de0: 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72  oth unixFile str
9df0: 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74  uctures.** point
9e00: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63   to the same loc
9e10: 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20  king structure. 
9e20: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72   The locking str
9e30: 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20  ucture keeps.** 
9e40: 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  a reference coun
9e50: 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e  t (so we will kn
9e60: 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74  ow when to delet
9e70: 65 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74  e it) and a "cnt
9e80: 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20  ".** field that 
9e90: 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74  tells us its int
9ea0: 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75  ernal lock statu
9eb0: 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73  s.  cnt==0 means
9ec0: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20   the.** file is 
9ed0: 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d  unlocked.  cnt==
9ee0: 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c  -1 means the fil
9ef0: 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69  e has an exclusi
9f00: 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e  ve lock..** cnt>
9f10: 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72  0 means there ar
9f20: 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63  e cnt shared loc
9f30: 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a  ks on the file..
9f40: 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70  **.** Any attemp
9f50: 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c  t to lock or unl
9f60: 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74  ock a file first
9f70: 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b   checks the lock
9f80: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
9f90: 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73  .  The fcntl() s
9fa0: 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e  ystem call is on
9fb0: 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65  ly invoked to se
9fc0: 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f  t a .** POSIX lo
9fd0: 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e  ck if the intern
9fe0: 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72  al lock structur
9ff0: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65  e transitions be
a000: 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65  tween.** a locke
a010: 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65  d and an unlocke
a020: 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42  d state..**.** B
a030: 75 74 20 77 61 69 74 3a 20 20 74 68 65 72 65 20  ut wait:  there 
a040: 61 72 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f  are yet more pro
a050: 62 6c 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58  blems with POSIX
a060: 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e   advisory locks.
a070: 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c  .**.** If you cl
a080: 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72  ose a file descr
a090: 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74  iptor that point
a0a0: 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74  s to a file that
a0b0: 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61   has locks,.** a
a0c0: 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74  ll locks on that
a0d0: 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f   file that are o
a0e0: 77 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72  wned by the curr
a0f0: 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a  ent process are.
a100: 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f  ** released.  To
a110: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
a120: 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20  s problem, each 
a130: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
a140: 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e  ject.** maintain
a150: 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  s a count of the
a160: 20 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69   number of pendi
a170: 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 20  ng locks on tha 
a180: 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20 61  inode..** When a
a190: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
a1a0: 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e  e to close an un
a1b0: 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65  ixFile, if there
a1c0: 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e   are.** other un
a1d0: 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74  ixFile open on t
a1e0: 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68  he same inode th
a1f0: 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c  at are holding l
a200: 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a  ocks, the call.*
a210: 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65  * to close() the
a220: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
a230: 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
a240: 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f  il all of the lo
a250: 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68  cks clear..** Th
a260: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
a270: 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20  structure keeps 
a280: 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64  a list of file d
a290: 65 73 63 72 69 70 74 6f 72 73 20 74 68 61 74 20  escriptors that 
a2a0: 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c  need to.** be cl
a2b0: 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69  osed and that li
a2c0: 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e  st is walked (an
a2d0: 64 20 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20  d cleared) when 
a2e0: 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a  the last lock.**
a2f0: 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59   clears..**.** Y
a300: 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c  et another probl
a310: 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65 61 64  em:  LinuxThread
a320: 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65  s do not play we
a330: 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20 6c 6f  ll with posix lo
a340: 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20  cks..**.** Many 
a350: 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
a360: 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68 65 20  f linux use the 
a370: 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c 69 62  LinuxThreads lib
a380: 72 61 72 79 20 77 68 69 63 68 20 69 73 0a 2a 2a  rary which is.**
a390: 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c   not posix compl
a3a0: 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e  iant.  Under Lin
a3b0: 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c 6f 63  uxThreads, a loc
a3c0: 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72  k created by thr
a3d0: 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20  ead.** A cannot 
a3e0: 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f  be modified or o
a3f0: 76 65 72 72 69 64 64 65 6e 20 62 79 20 61 20 64  verridden by a d
a400: 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 20  ifferent thread 
a410: 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61  B..** Only threa
a420: 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79 20 74  d A can modify t
a430: 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e  he lock.  Lockin
a440: 67 20 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f  g behavior is co
a450: 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 20  rrect.** if the 
a460: 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65 73 20  appliation uses 
a470: 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69 76 65  the newer Native
a480: 20 50 6f 73 69 78 20 54 68 72 65 61 64 20 4c 69   Posix Thread Li
a490: 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20  brary (NPTL).** 
a4a0: 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74 68 20  on linux - with 
a4b0: 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61  NPTL a lock crea
a4c0: 74 65 64 20 62 79 20 74 68 72 65 61 64 20 41 20  ted by thread A 
a4d0: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63  can override loc
a4e0: 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64 20  ks.** in thread 
a4f0: 42 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73  B.  But there is
a500: 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20   no way to know 
a510: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
a520: 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61 64 69  which.** threadi
a530: 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20 62 65  ng library is be
a540: 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20 74 68  ing used.  So th
a550: 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f  ere is no way to
a560: 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70   know at.** comp
a570: 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72  ile-time whether
a580: 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 20 41   or not thread A
a590: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f   can override lo
a5a0: 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20 42 2e  cks on thread B.
a5b0: 0a 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20 64  .** One has to d
a5c0: 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65  o a run-time che
a5d0: 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  ck to discover t
a5e0: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
a5f0: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72  he.** current pr
a600: 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  ocess..**.** SQL
a610: 69 74 65 20 75 73 65 64 20 74 6f 20 73 75 70 70  ite used to supp
a620: 6f 72 74 20 4c 69 6e 75 78 54 68 72 65 61 64 73  ort LinuxThreads
a630: 2e 20 20 42 75 74 20 73 75 70 70 6f 72 74 20 66  .  But support f
a640: 6f 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73 0a  or LinuxThreads.
a650: 2a 2a 20 77 61 73 20 64 72 6f 70 70 65 64 20 62  ** was dropped b
a660: 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 76 65  eginning with ve
a670: 72 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53 51  rsion 3.7.0.  SQ
a680: 4c 69 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20  Lite will still 
a690: 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69 6e  work with.** Lin
a6a0: 75 78 54 68 72 65 61 64 73 20 70 72 6f 76 69 64  uxThreads provid
a6b0: 65 64 20 74 68 61 74 20 28 31 29 20 74 68 65 72  ed that (1) ther
a6c0: 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61  e is no more tha
a6d0: 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  n one connection
a6e0: 20 0a 2a 2a 20 70 65 72 20 64 61 74 61 62 61 73   .** per databas
a6f0: 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61  e file in the sa
a700: 6d 65 20 70 72 6f 63 65 73 73 20 61 6e 64 20 28  me process and (
a710: 32 29 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  2) database conn
a720: 65 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f  ections.** do no
a730: 74 20 6d 6f 76 65 20 61 63 72 6f 73 73 20 74 68  t move across th
a740: 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  reads..*/../*.**
a750: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
a760: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
a770: 72 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61  ructure serves a
a780: 73 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a  s the key used.*
a790: 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61  * to locate a pa
a7a0: 72 74 69 63 75 6c 61 72 20 75 6e 69 78 49 6e 6f  rticular unixIno
a7b0: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a  deInfo object..*
a7c0: 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c  /.struct unixFil
a7d0: 65 49 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65  eId {.  dev_t de
a7e0: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
a7f0: 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75      /* Device nu
a800: 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56  mber */.#if OS_V
a810: 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
a820: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
a830: 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66  Id;  /* Unique f
a840: 69 6c 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72  ile ID for vxwor
a850: 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69  ks. */.#else.  i
a860: 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20  no_t ino;       
a870: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
a880: 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65  ode number */.#e
a890: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
a8a0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
a8b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
a8c0: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
a8d0: 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e  ed for each open
a8e0: 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20  .** inode.  Or, 
a8f0: 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c  on LinuxThreads,
a900: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 66   there is one of
a910: 20 74 68 65 73 65 20 73 74 72 75 63 74 75 72 65   these structure
a920: 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e  s for.** each in
a930: 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20 65 61  ode opened by ea
a940: 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ch thread..**.**
a950: 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20   A single inode 
a960: 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c  can have multipl
a970: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
a980: 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78  rs, so each unix
a990: 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72  File.** structur
a9a0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
a9b0: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61  nter to an insta
a9c0: 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
a9d0: 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f  ct and this.** o
a9e0: 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f  bject keeps a co
a9f0: 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
aa00: 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f  r of unixFile po
aa10: 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f  inting to it..*/
aa20: 0a 73 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64  .struct unixInod
aa30: 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74  eInfo {.  struct
aa40: 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65   unixFileId file
aa50: 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Id;       /* The
aa60: 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20   lookup key */. 
aa70: 20 69 6e 74 20 6e 53 68 61 72 65 64 3b 20 20 20   int nShared;   
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48   /* Number of SH
aaa0: 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20  ARED locks held 
aab0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
aac0: 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20  ar eFileLock;   
aad0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53       /* One of S
aae0: 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45  HARED_LOCK, RESE
aaf0: 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a  RVED_LOCK etc. *
ab00: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
ab10: 72 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b 20  r bProcessLock; 
ab20: 20 20 20 20 2f 2a 20 41 6e 20 65 78 63 6c 75 73      /* An exclus
ab30: 69 76 65 20 70 72 6f 63 65 73 73 20 6c 6f 63 6b  ive process lock
ab40: 20 69 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e   is held */.  in
ab50: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ab70: 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   Number of point
ab80: 65 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75  ers to this stru
ab90: 63 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53  cture */.  unixS
aba0: 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
abb0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68  ;          /* Sh
abc0: 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f  ared memory asso
abd0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
abe0: 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20   inode */.  int 
abf0: 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  nLock;          
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
ac10: 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e  umber of outstan
ac20: 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20  ding file locks 
ac30: 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  */.  UnixUnusedF
ac40: 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20  d *pUnused;     
ac50: 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66       /* Unused f
ac60: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
ac70: 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e  to close */.  un
ac80: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65  ixInodeInfo *pNe
ac90: 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  xt;           /*
aca0: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69   List of all uni
acb0: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
acc0: 74 73 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  ts */.  unixInod
acd0: 65 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20 20  eInfo *pPrev;   
ace0: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e          /*    ..
acf0: 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64  .. doubly linked
ad00: 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45   */.#if SQLITE_E
ad10: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
ad20: 59 4c 45 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  YLE.  unsigned l
ad30: 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 42  ong long sharedB
ad40: 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50  yte;  /* for AFP
ad50: 20 73 69 6d 75 6c 61 74 65 64 20 73 68 61 72 65   simulated share
ad60: 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66  d lock */.#endif
ad70: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
ad80: 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20    sem_t *pSem;  
ad90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ada0: 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58    /* Named POSIX
adb0: 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20   semaphore */.  
adc0: 63 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41  char aSemName[MA
add0: 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20  X_PATHNAME+2];  
ade0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61 74 20  /* Name of that 
adf0: 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e  semaphore */.#en
ae00: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20  dif.};../*.** A 
ae10: 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69  lists of all uni
ae20: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
ae30: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e  ts..*/.static un
ae40: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f  ixInodeInfo *ino
ae50: 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  deList = 0;../*.
ae60: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
ae70: 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72  ion - unixLogErr
ae80: 6f 72 5f 78 28 29 2c 20 69 73 20 6f 6e 6c 79 20  or_x(), is only 
ae90: 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20  ever called via 
aea0: 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69  the macro.** uni
aeb0: 78 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a  xLogError()..**.
aec0: 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64  ** It is invoked
aed0: 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20   after an error 
aee0: 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20  occurs in an OS 
aef0: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 65 72 72  function and err
af00: 6e 6f 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 73  no has been.** s
af10: 65 74 2e 20 49 74 20 6c 6f 67 73 20 61 20 6d 65  et. It logs a me
af20: 73 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69  ssage using sqli
af30: 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69  te3_log() contai
af40: 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ning the current
af50: 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72   value of.** err
af60: 6e 6f 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69  no and, if possi
af70: 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72  ble, the human-r
af80: 65 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65  eadable equivale
af90: 6e 74 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72  nt from strerror
afa0: 28 29 20 6f 72 0a 2a 2a 20 73 74 72 65 72 72 6f  () or.** strerro
afb0: 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  r_r()..**.** The
afc0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
afd0: 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61  passed to the ma
afe0: 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68  cro should be th
aff0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61  e error code tha
b000: 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74  t.** will be ret
b010: 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20  urned to SQLite 
b020: 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45  (e.g. SQLITE_IOE
b030: 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54  RR_DELETE, SQLIT
b040: 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a  E_CANTOPEN). .**
b050: 20 54 68 65 20 74 77 6f 20 73 75 62 73 65 71 75   The two subsequ
b060: 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68  ent arguments sh
b070: 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65  ould be the name
b080: 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74   of the OS funct
b090: 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c  ion that.** fail
b0a0: 65 64 20 28 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b  ed (e.g. "unlink
b0b0: 22 2c 20 22 6f 70 65 6e 22 29 20 61 6e 64 20 74  ", "open") and t
b0c0: 68 65 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  he the associate
b0d0: 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61  d file-system pa
b0e0: 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a  th,.** if any..*
b0f0: 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69 78 4c 6f  /.#define unixLo
b100: 67 45 72 72 6f 72 28 61 2c 62 2c 63 29 20 20 20  gError(a,b,c)   
b110: 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74    unixLogErrorAt
b120: 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e  Line(a,b,c,__LIN
b130: 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20  E__).static int 
b140: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69  unixLogErrorAtLi
b150: 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64  ne(.  int errcod
b160: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
b170: 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20        /* SQLite 
b180: 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
b190: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
b1a0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
b1b0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75  /* Name of OS fu
b1c0: 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c  nction that fail
b1d0: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
b1e0: 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
b1f0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
b200: 70 61 74 68 20 61 73 73 6f 63 69 61 74 65 64 20  path associated 
b210: 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20  with error */.  
b220: 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20  int iLine       
b230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b240: 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e  /* Source line n
b250: 75 6d 62 65 72 20 77 68 65 72 65 20 65 72 72 6f  umber where erro
b260: 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b  r occurred */.){
b270: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 20 20  .  char *zErr;  
b280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b290: 20 20 20 2f 2a 20 4d 65 73 73 61 67 65 20 66 72     /* Message fr
b2a0: 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72  om strerror() or
b2b0: 20 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f 0a 20   equivalent */. 
b2c0: 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20 65 72   int iErrno = er
b2d0: 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  rno;            
b2e0: 20 2f 2a 20 53 61 76 65 64 20 73 79 73 63 61 6c   /* Saved syscal
b2f0: 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 2a  l error number *
b300: 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  /..  /* If this 
b310: 69 73 20 6e 6f 74 20 61 20 74 68 72 65 61 64 73  is not a threads
b320: 61 66 65 20 62 75 69 6c 64 20 28 53 51 4c 49 54  afe build (SQLIT
b330: 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d 30 29  E_THREADSAFE==0)
b340: 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 2a 2a 20  , then use.  ** 
b350: 74 68 65 20 73 74 72 65 72 72 6f 72 28 29 20 66  the strerror() f
b360: 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69  unction to obtai
b370: 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64  n the human-read
b380: 61 62 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61  able error messa
b390: 67 65 0a 20 20 2a 2a 20 65 71 75 69 76 61 6c 65  ge.  ** equivale
b3a0: 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f 74 68  nt to errno. Oth
b3b0: 65 72 77 69 73 65 2c 20 75 73 65 20 73 74 72 65  erwise, use stre
b3c0: 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a  rror_r()..  */ .
b3d0: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
b3e0: 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64  DSAFE && defined
b3f0: 28 48 41 56 45 5f 53 54 52 45 52 52 4f 52 5f 52  (HAVE_STRERROR_R
b400: 29 0a 20 20 63 68 61 72 20 61 45 72 72 5b 38 30  ).  char aErr[80
b410: 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45 72 72  ];.  memset(aErr
b420: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 45 72 72  , 0, sizeof(aErr
b430: 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61 45 72  ));.  zErr = aEr
b440: 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54 52 45  r;..  /* If STRE
b450: 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20 28 73  RROR_R_CHAR_P (s
b460: 65 74 20 62 79 20 61 75 74 6f 63 6f 6e 66 20 73  et by autoconf s
b470: 63 72 69 70 74 73 29 20 6f 72 20 5f 5f 55 53 45  cripts) or __USE
b480: 5f 47 4e 55 20 69 73 20 64 65 66 69 6e 65 64 2c  _GNU is defined,
b490: 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61  .  ** assume tha
b4a0: 74 20 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f  t the system pro
b4b0: 76 69 64 65 73 20 74 68 65 20 74 68 65 20 47 4e  vides the the GN
b4c0: 55 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 74 72  U version of str
b4d0: 65 72 72 6f 72 5f 72 28 29 20 74 68 61 74 20 0a  error_r() that .
b4e0: 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70    ** returns a p
b4f0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66  ointer to a buff
b500: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
b510: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
b520: 20 54 68 61 74 20 70 6f 69 6e 74 65 72 20 0a 20   That pointer . 
b530: 20 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f   ** may point to
b540: 20 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d   aErr[], or it m
b550: 61 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ay point to some
b560: 20 73 74 61 74 69 63 20 73 74 6f 72 61 67 65 20   static storage 
b570: 73 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a  somewhere. .  **
b580: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73 75   Otherwise, assu
b590: 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73 74  me that the syst
b5a0: 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65 20  em provides the 
b5b0: 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 6f 66  POSIX version of
b5c0: 20 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f   .  ** strerror_
b5d0: 72 28 29 2c 20 77 68 69 63 68 20 61 6c 77 61 79  r(), which alway
b5e0: 73 20 77 72 69 74 65 73 20 61 6e 20 65 72 72 6f  s writes an erro
b5f0: 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 61  r message into a
b600: 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Err[]..  **.  **
b610: 20 49 66 20 74 68 65 20 63 6f 64 65 20 69 6e 63   If the code inc
b620: 6f 72 72 65 63 74 6c 79 20 61 73 73 75 6d 65 73  orrectly assumes
b630: 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20   that it is the 
b640: 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 74 68  POSIX version th
b650: 61 74 20 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c  at is.  ** avail
b660: 61 62 6c 65 2c 20 74 68 65 20 65 72 72 6f 72 20  able, the error 
b670: 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 6f 66 74  message will oft
b680: 65 6e 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73  en be an empty s
b690: 74 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a  tring. Not a.  *
b6a0: 2a 20 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20  * huge problem. 
b6b0: 49 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63  Incorrectly conc
b6c0: 6c 75 64 69 6e 67 20 74 68 61 74 20 74 68 65 20  luding that the 
b6d0: 47 4e 55 20 76 65 72 73 69 6f 6e 20 69 73 20 61  GNU version is a
b6e0: 76 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63  vailable .  ** c
b6f0: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 73  ould lead to a s
b700: 65 67 66 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a  egfault though..
b710: 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64    */.#if defined
b720: 28 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52  (STRERROR_R_CHAR
b730: 5f 50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  _P) || defined(_
b740: 5f 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72  _USE_GNU).  zErr
b750: 20 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20 73 74   = .# endif.  st
b760: 72 65 72 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c  rerror_r(iErrno,
b770: 20 61 45 72 72 2c 20 73 69 7a 65 6f 66 28 61 45   aErr, sizeof(aE
b780: 72 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53  rr)-1);..#elif S
b790: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
b7a0: 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20  .  /* This is a 
b7b0: 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64  threadsafe build
b7c0: 2c 20 62 75 74 20 73 74 72 65 72 72 6f 72 5f 72  , but strerror_r
b7d0: 28 29 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  () is not availa
b7e0: 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d  ble. */.  zErr =
b7f0: 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20   "";.#else.  /* 
b800: 4e 6f 6e 2d 74 68 72 65 61 64 73 61 66 65 20 62  Non-threadsafe b
b810: 75 69 6c 64 2c 20 75 73 65 20 73 74 72 65 72 72  uild, use strerr
b820: 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20  or(). */.  zErr 
b830: 3d 20 73 74 72 65 72 72 6f 72 28 69 45 72 72 6e  = strerror(iErrn
b840: 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  o);.#endif..  as
b850: 73 65 72 74 28 20 65 72 72 63 6f 64 65 21 3d 53  sert( errcode!=S
b860: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
b870: 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61  ( zPath==0 ) zPa
b880: 74 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74  th = "";.  sqlit
b890: 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a  e3_log(errcode,.
b8a0: 20 20 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63        "os_unix.c
b8b0: 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25 73 29  :%d: (%d) %s(%s)
b8c0: 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c   - %s",.      iL
b8d0: 69 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75  ine, iErrno, zFu
b8e0: 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a  nc, zPath, zErr.
b8f0: 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65    );..  return e
b900: 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rrcode;.}../*.**
b910: 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65   Close a file de
b920: 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  scriptor..**.** 
b930: 57 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 63  We assume that c
b940: 6c 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c  lose() almost al
b950: 77 61 79 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63  ways works, sinc
b960: 65 20 69 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20  e it is only in 
b970: 61 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b 20 61  a.** very sick a
b980: 70 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e  pplication or on
b990: 20 61 20 76 65 72 79 20 73 69 63 6b 20 70 6c 61   a very sick pla
b9a0: 74 66 6f 72 6d 20 74 68 61 74 20 69 74 20 6d 69  tform that it mi
b9b0: 67 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20  ght fail..** If 
b9c0: 69 74 20 64 6f 65 73 20 66 61 69 6c 2c 20 73 69  it does fail, si
b9d0: 6d 70 6c 79 20 6c 65 61 6b 20 74 68 65 20 66 69  mply leak the fi
b9e0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 62  le descriptor, b
b9f0: 75 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a  ut do log the.**
ba00: 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   error..**.** No
ba10: 74 65 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  te that it is no
ba20: 74 20 73 61 66 65 20 74 6f 20 72 65 74 72 79 20  t safe to retry 
ba30: 63 6c 6f 73 65 28 29 20 61 66 74 65 72 20 45 49  close() after EI
ba40: 4e 54 52 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a  NTR since the.**
ba50: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
ba60: 20 6d 69 67 68 74 20 68 61 76 65 20 61 6c 72 65   might have alre
ba70: 61 64 79 20 62 65 65 6e 20 72 65 75 73 65 64 20  ady been reused 
ba80: 62 79 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  by another threa
ba90: 64 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27  d..** So we don'
baa0: 74 20 65 76 65 6e 20 74 72 79 20 74 6f 20 72 65  t even try to re
bab0: 63 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20 45 49  cover from an EI
bac0: 4e 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74  NTR.  Just log t
bad0: 68 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20  he error.** and 
bae0: 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  move on..*/.stat
baf0: 69 63 20 76 6f 69 64 20 72 6f 62 75 73 74 5f 63  ic void robust_c
bb00: 6c 6f 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  lose(unixFile *p
bb10: 46 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74  File, int h, int
bb20: 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20   lineno){.  if( 
bb30: 6f 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20  osClose(h) ){.  
bb40: 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74    unixLogErrorAt
bb50: 4c 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f 45 52  Line(SQLITE_IOER
bb60: 52 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22  R_CLOSE, "close"
bb70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
bb80: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 20 3f           pFile ?
bb90: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20   pFile->zPath : 
bba0: 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a  0, lineno);.  }.
bbb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
bbc0: 6c 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ll file descript
bbd0: 6f 72 73 20 61 63 63 75 6d 75 61 74 65 64 20 69  ors accumuated i
bbe0: 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  n the unixInodeI
bbf0: 6e 66 6f 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73  nfo->pUnused lis
bc00: 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  t..*/ .static vo
bc10: 69 64 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46  id closePendingF
bc20: 64 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ds(unixFile *pFi
bc30: 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  le){.  unixInode
bc40: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
bc50: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
bc60: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 3b  UnixUnusedFd *p;
bc70: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
bc80: 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d  *pNext;.  for(p=
bc90: 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b  pInode->pUnused;
bca0: 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20   p; p=pNext){.  
bcb0: 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65    pNext = p->pNe
bcc0: 78 74 3b 0a 23 69 66 20 4f 53 43 4c 4f 53 45 5f  xt;.#if OSCLOSE_
bcd0: 43 48 45 43 4b 5f 43 4c 4f 53 45 5f 49 4f 45 52  CHECK_CLOSE_IOER
bce0: 52 0a 20 20 20 20 69 66 28 20 63 6c 6f 73 65 28  R.    if( close(
bcf0: 70 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20  p->fd) ){.      
bd00: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
bd10: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
bd20: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
bd30: 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 70  R_CLOSE;.      p
bd40: 2d 3e 70 4e 65 78 74 20 3d 20 70 45 72 72 6f 72  ->pNext = pError
bd50: 3b 0a 20 20 20 20 20 20 70 45 72 72 6f 72 20 3d  ;.      pError =
bd60: 20 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   p;.    }else{. 
bd70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
bd80: 65 28 70 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  e(p);.    }.#els
bd90: 65 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f  e.    robust_clo
bda0: 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c  se(pFile, p->fd,
bdb0: 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
bdc0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
bdd0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 49  .#endif.  }.  pI
bde0: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  node->pUnused = 
bdf0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  0;.}../*.** Rele
be00: 61 73 65 20 61 20 75 6e 69 78 49 6e 6f 64 65 49  ase a unixInodeI
be10: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 72  nfo structure pr
be20: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
be30: 65 64 20 62 79 20 66 69 6e 64 49 6e 6f 64 65 49  ed by findInodeI
be40: 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nfo()..**.** The
be50: 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75   mutex entered u
be60: 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74  sing the unixEnt
be70: 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69  erMutex() functi
be80: 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  on must be held.
be90: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ** when this fun
bea0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
beb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
bec0: 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f  releaseInodeInfo
bed0: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
bee0: 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ){.  unixInodeIn
bef0: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
bf00: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
bf10: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
bf20: 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 41  eld() );.  if( A
bf30: 4c 57 41 59 53 28 70 49 6e 6f 64 65 29 20 29 7b  LWAYS(pInode) ){
bf40: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65  .    pInode->nRe
bf50: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  f--;.    if( pIn
bf60: 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ode->nRef==0 ){.
bf70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
bf80: 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d  node->pShmNode==
bf90: 30 20 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65  0 );.      close
bfa0: 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65  PendingFds(pFile
bfb0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  );.      if( pIn
bfc0: 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ode->pPrev ){.  
bfd0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
bfe0: 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  node->pPrev->pNe
bff0: 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  xt==pInode );.  
c000: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50        pInode->pP
c010: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e  rev->pNext = pIn
c020: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ode->pNext;.    
c030: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c040: 20 61 73 73 65 72 74 28 20 69 6e 6f 64 65 4c 69   assert( inodeLi
c050: 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  st==pInode );.  
c060: 20 20 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20        inodeList 
c070: 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
c080: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
c090: 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74  f( pInode->pNext
c0a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
c0b0: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  rt( pInode->pNex
c0c0: 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65  t->pPrev==pInode
c0d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   );.        pIno
c0e0: 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  de->pNext->pPrev
c0f0: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76   = pInode->pPrev
c100: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c110: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e  sqlite3_free(pIn
c120: 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ode);.    }.  }.
c130: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
c140: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
c150: 2c 20 6c 6f 63 61 74 65 20 74 68 65 20 75 6e 69  , locate the uni
c160: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
c170: 74 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69  t that.** descri
c180: 62 65 73 20 74 68 61 74 20 66 69 6c 65 20 64 65  bes that file de
c190: 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74  scriptor.  Creat
c1a0: 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
c1b0: 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a  ecessary.  The.*
c1c0: 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6d  * return value m
c1d0: 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61  ight be uninitia
c1e0: 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f  lized if an erro
c1f0: 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  r occurs..**.** 
c200: 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65  The mutex entere
c210: 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78  d using the unix
c220: 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e  EnterMutex() fun
c230: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65  ction must be he
c240: 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  ld.** when this 
c250: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
c260: 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
c270: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
c280: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
c290: 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e  tatic int findIn
c2a0: 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46  odeInfo(.  unixF
c2b0: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
c2c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69            /* Uni
c2d0: 78 20 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65  x file with file
c2e0: 20 64 65 73 63 20 75 73 65 64 20 69 6e 20 74 68   desc used in th
c2f0: 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78 49  e key */.  unixI
c300: 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f  nodeInfo **ppIno
c310: 64 65 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  de        /* Ret
c320: 75 72 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  urn the unixInod
c330: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65 72  eInfo object her
c340: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
c350: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c360: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 73 74           /* Syst
c370: 65 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e 20 63  em call return c
c380: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b  ode */.  int fd;
c390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
c3b0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
c3c0: 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74  or pFile */.  st
c3d0: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
c3e0: 66 69 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a 20  fileId;      /* 
c3f0: 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74  Lookup key for t
c400: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
c410: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61   */.  struct sta
c420: 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20  t statbuf;      
c430: 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65       /* Low-leve
c440: 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69  l file informati
c450: 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  on */.  unixInod
c460: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
c470: 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64 69 64  0;     /* Candid
c480: 61 74 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ate unixInodeInf
c490: 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61  o object */..  a
c4a0: 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
c4b0: 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20  Held() );..  /* 
c4c0: 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e  Get low-level in
c4d0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
c4e0: 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77 65  the file that we
c4f0: 20 63 61 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a   can used to.  *
c500: 2a 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  * create a uniqu
c510: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 66  e name for the f
c520: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d  ile..  */.  fd =
c530: 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20   pFile->h;.  rc 
c540: 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73  = osFstat(fd, &s
c550: 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72  tatbuf);.  if( r
c560: 63 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  c!=0 ){.    pFil
c570: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
c580: 72 72 6e 6f 3b 0a 23 69 66 64 65 66 20 45 4f 56  rrno;.#ifdef EOV
c590: 45 52 46 4c 4f 57 0a 20 20 20 20 69 66 28 20 70  ERFLOW.    if( p
c5a0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d  File->lastErrno=
c5b0: 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72 65 74  =EOVERFLOW ) ret
c5c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53  urn SQLITE_NOLFS
c5d0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
c5e0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
c5f0: 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f  ;.  }..#ifdef __
c600: 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20  APPLE__.  /* On 
c610: 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73  OS X on an msdos
c620: 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 74 68 65   filesystem, the
c630: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69 73   inode number is
c640: 20 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69   reported.  ** i
c650: 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 7a  ncorrectly for z
c660: 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20  ero-size files. 
c670: 20 53 65 65 20 74 69 63 6b 65 74 20 23 33 32 36   See ticket #326
c680: 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a  0.  To work.  **
c690: 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f   around this pro
c6a0: 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69 64 65  blem (we conside
c6b0: 72 20 69 74 20 61 20 62 75 67 20 69 6e 20 4f 53  r it a bug in OS
c6c0: 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a   X, not SQLite).
c6d0: 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73 20 69    ** we always i
c6e0: 6e 63 72 65 61 73 65 20 74 68 65 20 66 69 6c 65  ncrease the file
c6f0: 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20 77 72   size to 1 by wr
c700: 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62  iting a single b
c710: 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74  yte.  ** prior t
c720: 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  o accessing the 
c730: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 54  inode number.  T
c740: 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72 69 74  he one byte writ
c750: 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41  ten is.  ** an A
c760: 53 43 49 49 20 27 53 27 20 63 68 61 72 61 63 74  SCII 'S' charact
c770: 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20 68 61  er which also ha
c780: 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20  ppens to be the 
c790: 66 69 72 73 74 20 62 79 74 65 0a 20 20 2a 2a 20  first byte.  ** 
c7a0: 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  in the header of
c7b0: 20 65 76 65 72 79 20 53 51 4c 69 74 65 20 64 61   every SQLite da
c7c0: 74 61 62 61 73 65 2e 20 20 49 6e 20 74 68 69 73  tabase.  In this
c7d0: 20 77 61 79 2c 20 69 66 20 74 68 65 72 65 0a 20   way, if there. 
c7e0: 20 2a 2a 20 69 73 20 61 20 72 61 63 65 20 63 6f   ** is a race co
c7f0: 6e 64 69 74 69 6f 6e 20 73 75 63 68 20 74 68 61  ndition such tha
c800: 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
c810: 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 6f 70   has already pop
c820: 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68 65 20  ulated.  ** the 
c830: 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
c840: 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 20 64  e database, no d
c850: 61 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20  amage is done.. 
c860: 20 2a 2f 0a 20 20 69 66 28 20 73 74 61 74 62 75   */.  if( statbu
c870: 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20  f.st_size==0 && 
c880: 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20  (pFile->fsFlags 
c890: 26 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  & SQLITE_FSFLAGS
c8a0: 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b  _IS_MSDOS)!=0 ){
c8b0: 0a 20 20 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73  .    do{ rc = os
c8c0: 57 72 69 74 65 28 66 64 2c 20 22 53 22 2c 20 31  Write(fd, "S", 1
c8d0: 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  ); }while( rc<0 
c8e0: 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
c8f0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 31  );.    if( rc!=1
c900: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
c910: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
c920: 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  no;.      return
c930: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
c940: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73     }.    rc = os
c950: 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62  Fstat(fd, &statb
c960: 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  uf);.    if( rc!
c970: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  =0 ){.      pFil
c980: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
c990: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75  rrno;.      retu
c9a0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
c9b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
c9c0: 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69 6c  f..  memset(&fil
c9d0: 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66  eId, 0, sizeof(f
c9e0: 69 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c 65 49  ileId));.  fileI
c9f0: 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e  d.dev = statbuf.
ca00: 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f 56  st_dev;.#if OS_V
ca10: 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49 64 2e  XWORKS.  fileId.
ca20: 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64  pId = pFile->pId
ca30: 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65 49 64  ;.#else.  fileId
ca40: 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73  .ino = statbuf.s
ca50: 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20 20  t_ino;.#endif.  
ca60: 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69  pInode = inodeLi
ca70: 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e  st;.  while( pIn
ca80: 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70 28 26 66  ode && memcmp(&f
ca90: 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64 65 2d 3e  ileId, &pInode->
caa0: 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66  fileId, sizeof(f
cab0: 69 6c 65 49 64 29 29 20 29 7b 0a 20 20 20 20 70  ileId)) ){.    p
cac0: 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e  Inode = pInode->
cad0: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pNext;.  }.  if(
cae0: 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20   pInode==0 ){.  
caf0: 20 20 70 49 6e 6f 64 65 20 3d 20 73 71 6c 69 74    pInode = sqlit
cb00: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
cb10: 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b 0a 20 20  f(*pInode) );.  
cb20: 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20    if( pInode==0 
cb30: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
cb40: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
cb50: 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
cb60: 49 6e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66  Inode, 0, sizeof
cb70: 28 2a 70 49 6e 6f 64 65 29 29 3b 0a 20 20 20 20  (*pInode));.    
cb80: 6d 65 6d 63 70 79 28 26 70 49 6e 6f 64 65 2d 3e  memcpy(&pInode->
cb90: 66 69 6c 65 49 64 2c 20 26 66 69 6c 65 49 64 2c  fileId, &fileId,
cba0: 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29   sizeof(fileId))
cbb0: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52  ;.    pInode->nR
cbc0: 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 49 6e 6f  ef = 1;.    pIno
cbd0: 64 65 2d 3e 70 4e 65 78 74 20 3d 20 69 6e 6f 64  de->pNext = inod
cbe0: 65 4c 69 73 74 3b 0a 20 20 20 20 70 49 6e 6f 64  eList;.    pInod
cbf0: 65 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  e->pPrev = 0;.  
cc00: 20 20 69 66 28 20 69 6e 6f 64 65 4c 69 73 74 20    if( inodeList 
cc10: 29 20 69 6e 6f 64 65 4c 69 73 74 2d 3e 70 50 72  ) inodeList->pPr
cc20: 65 76 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 20  ev = pInode;.   
cc30: 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e   inodeList = pIn
cc40: 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ode;.  }else{.  
cc50: 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b    pInode->nRef++
cc60: 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 6e 6f 64 65  ;.  }.  *ppInode
cc70: 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 72 65 74   = pInode;.  ret
cc80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
cc90: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
cca0: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
ccb0: 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
ccc0: 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
ccd0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
cce0: 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
ccf0: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
cd00: 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
cd10: 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
cd20: 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
cd30: 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
cd40: 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
cd50: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
cd60: 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
cd70: 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
cd80: 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
cd90: 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
cda0: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
cdb0: 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
cdc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
cdd0: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
cde0: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
cdf0: 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
ce00: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
ce10: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
ce20: 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
ce30: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
ce40: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
ce50: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
ce60: 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
ce70: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
ce80: 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20  ERVEDLOCK; );.. 
ce90: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
cea0: 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  ;.  unixEnterMut
ceb0: 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  ex(); /* Because
cec0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69   pFile->pInode i
ced0: 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
cee0: 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a  threads */..  /*
cef0: 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
cf00: 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
cf10: 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
cf20: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
cf30: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
cf40: 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
cf50: 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76  CK ){.    reserv
cf60: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  ed = 1;.  }..  /
cf70: 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
cf80: 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
cf90: 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a  ocess holds it..
cfa0: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44    */.#ifndef __D
cfb0: 4a 47 50 50 5f 5f 0a 20 20 69 66 28 20 21 72 65  JGPP__.  if( !re
cfc0: 73 65 72 76 65 64 20 26 26 20 21 70 46 69 6c 65  served && !pFile
cfd0: 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
cfe0: 73 73 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74  ssLock ){.    st
cff0: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
d000: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  .    lock.l_when
d010: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
d020: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
d030: 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b  = RESERVED_BYTE;
d040: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
d050: 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  = 1;.    lock.l_
d060: 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a  type = F_WRLCK;.
d070: 20 20 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28      if( osFcntl(
d080: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c  pFile->h, F_GETL
d090: 4b 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 23 69 66  K, &lock) ){.#if
d0a0: 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b   OSLOCKING_CHECK
d0b0: 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20  _BUSY_IOERR.    
d0c0: 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
d0d0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
d0e0: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
d0f0: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
d100: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
d110: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
d120: 4b 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  K);.      pFile-
d130: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
d140: 72 6e 6f 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  rno;.#else.     
d150: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
d160: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
d170: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c  LOCK;.      pFil
d180: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
d190: 72 72 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 20  rrno;.#endif.   
d1a0: 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b   } else if( lock
d1b0: 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b  .l_type!=F_UNLCK
d1c0: 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65 72 76   ){.      reserv
d1d0: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
d1e0: 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 75 6e  }.#endif.  .  un
d1f0: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
d200: 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
d210: 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
d220: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
d230: 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
d240: 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f  ved));..  *pResO
d250: 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
d260: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
d270: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
d280: 73 65 74 20 61 20 73 79 73 74 65 6d 2d 6c 6f 63  set a system-loc
d290: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 70 46  k on the file pF
d2a0: 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69  ile.  The lock i
d2b0: 73 20 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20  s .** described 
d2c0: 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  by pLock..**.** 
d2d0: 49 66 20 74 68 65 20 70 46 69 6c 65 20 77 61 73  If the pFile was
d2e0: 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77 72 69   opened read/wri
d2f0: 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65 78 63  te from unix-exc
d300: 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e 6c 79  l, then the only
d310: 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20 6f 62   lock.** ever ob
d320: 74 61 69 6e 65 64 20 69 73 20 61 6e 20 65 78 63  tained is an exc
d330: 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61 6e 64  lusive lock, and
d340: 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65 64 20   it is obtained 
d350: 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a 2a 20  exactly once.** 
d360: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  the first time a
d370: 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d  ny lock is attem
d380: 70 74 65 64 2e 20 20 41 6c 6c 20 73 75 62 73 65  pted.  All subse
d390: 71 75 65 6e 74 20 73 79 73 74 65 6d 20 6c 6f 63  quent system loc
d3a0: 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  king.** operatio
d3b0: 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f 70 73  ns become no-ops
d3c0: 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  .  Locking opera
d3d0: 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61 70 70  tions still happ
d3e0: 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c 0a 2a  en internally,.*
d3f0: 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  * in order to co
d400: 6f 72 64 69 6e 61 74 65 20 61 63 63 65 73 73 20  ordinate access 
d410: 62 65 74 77 65 65 6e 20 73 65 70 61 72 61 74 65  between separate
d420: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
d430: 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69 6e 20  tions.** within 
d440: 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20 62 75  this process, bu
d450: 74 20 61 6c 6c 20 6f 66 20 74 68 61 74 20 69 73  t all of that is
d460: 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65 6d 6f   handled in memo
d470: 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20 6f 70  ry and the.** op
d480: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 64  erating system d
d490: 6f 65 73 20 6e 6f 74 20 70 61 72 74 69 63 69 70  oes not particip
d4a0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ate..**.** This 
d4b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 70 61  function is a pa
d4c0: 73 73 2d 74 68 72 6f 75 67 68 20 74 6f 20 66 63  ss-through to fc
d4d0: 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69 66 20  ntl(F_SETLK) if 
d4e0: 70 46 69 6c 65 20 69 73 20 75 73 69 6e 67 0a 2a  pFile is using.*
d4f0: 2a 20 61 6e 79 20 56 46 53 20 6f 74 68 65 72 20  * any VFS other 
d500: 74 68 61 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22  than "unix-excl"
d510: 20 6f 72 20 69 66 20 70 46 69 6c 65 20 69 73 20   or if pFile is 
d520: 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69 78 2d  opened on "unix-
d530: 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69 73 20  excl".** and is 
d540: 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a  read-only..**.**
d550: 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65   Zero is returne
d560: 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20 63 6f  d if the call co
d570: 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73 73 66  mpletes successf
d580: 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66 20 61  ully, or -1 if a
d590: 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63 6e 74   call.** to fcnt
d5a0: 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e 20 74 68  l() fails. In th
d5b0: 69 73 20 63 61 73 65 2c 20 65 72 72 6e 6f 20 69  is case, errno i
d5c0: 73 20 73 65 74 20 61 70 70 72 6f 70 72 69 61 74  s set appropriat
d5d0: 65 6c 79 20 28 62 79 20 66 63 6e 74 6c 28 29 29  ely (by fcntl())
d5e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d5f0: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75 6e 69  unixFileLock(uni
d600: 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 74  xFile *pFile, st
d610: 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63  ruct flock *pLoc
d620: 6b 2c 20 69 6e 74 20 6e 52 65 74 72 79 29 7b 0a  k, int nRetry){.
d630: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78    int rc;.  unix
d640: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
d650: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
d660: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  e;.  assert( uni
d670: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
d680: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
d690: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 70  !=0 );.  if( ((p
d6a0: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
d6b0: 26 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 29  & UNIXFILE_EXCL)
d6c0: 21 3d 30 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 62  !=0 || pInode->b
d6d0: 50 72 6f 63 65 73 73 4c 6f 63 6b 29 0a 20 20 20  ProcessLock).   
d6e0: 26 26 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c  && ((pFile->ctrl
d6f0: 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
d700: 5f 52 44 4f 4e 4c 59 29 3d 3d 30 29 0a 20 20 29  _RDONLY)==0).  )
d710: 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  {.    if( pInode
d720: 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
d730: 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  0 ){.      struc
d740: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
d750: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
d760: 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  de->nLock==0 );.
d770: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
d780: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
d790: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
d7a0: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
d7b0: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
d7c0: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
d7d0: 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  E;.      lock.l_
d7e0: 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a  type = F_WRLCK;.
d7f0: 20 20 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e        rc = osFcn
d800: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
d810: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20  ETLK, &lock);.  
d820: 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 20 72      if( rc<0 ) r
d830: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
d840: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
d850: 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20  Lock = 1;.      
d860: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
d870: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d880: 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a    rc = 0;.    }.
d890: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
d8a0: 20 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20   i = 0;         
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20               .  
d8c0: 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20    do {.      rc 
d8d0: 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d  = osFcntl(pFile-
d8e0: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f  >h, F_SETLK, pLo
d8f0: 63 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ck);.      if( r
d900: 63 20 26 26 20 6e 52 65 74 72 79 20 29 7b 0a 20  c && nRetry ){. 
d910: 20 20 20 20 20 20 20 20 75 73 6c 65 65 70 28 31          usleep(1
d920: 30 30 20 2a 20 28 2b 2b 69 29 29 3b 0a 20 20 20  00 * (++i));.   
d930: 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28     }.    }while(
d940: 20 21 72 63 20 26 26 20 6e 52 65 74 72 79 2d 2d   !rc && nRetry--
d950: 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   );.  }.  return
d960: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
d970: 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
d980: 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
d990: 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
d9a0: 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
d9b0: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
d9c0: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
d9d0: 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
d9e0: 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
d9f0: 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
da00: 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
da10: 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
da20: 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
da30: 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
da40: 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
da50: 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
da60: 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
da70: 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
da80: 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
da90: 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
daa0: 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
dab0: 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
dac0: 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
dad0: 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
dae0: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
daf0: 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
db00: 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
db10: 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
db20: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
db30: 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
db40: 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
db50: 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
db60: 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
db70: 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
db80: 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
db90: 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
dba0: 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
dbb0: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
dbc0: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
dbd0: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
dbe0: 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
dbf0: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
dc00: 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
dc10: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
dc20: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
dc30: 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
dc40: 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
dc50: 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
dc60: 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
dc70: 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
dc80: 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
dc90: 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28  ic int unixLock(
dca0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
dcb0: 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
dcc0: 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  {.  /* The follo
dcd0: 77 69 6e 67 20 64 65 73 63 72 69 62 65 73 20 74  wing describes t
dce0: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
dcf0: 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73  n of the various
dd00: 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20   locks and.  ** 
dd10: 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73  lock transitions
dd20: 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65   in terms of the
dd30: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
dd40: 73 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75  shared and exclu
dd50: 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70  sive.  ** lock p
dd60: 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65  rimitives (calle
dd70: 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64  d read-locks and
dd80: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c   write-locks bel
dd90: 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a  ow, to avoid.  *
dda0: 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68  * confusion with
ddb0: 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d   SQLite lock nam
ddc0: 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74  es). The algorit
ddd0: 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61  hms are complica
dde0: 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c  ted.  ** slightl
ddf0: 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65  y in order to be
de00: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
de10: 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73   windows systems
de20: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a   simultaneously.
de30: 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74    ** accessing t
de40: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
de50: 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74   file, in case t
de60: 68 61 74 20 69 73 20 65 76 65 72 20 72 65 71 75  hat is ever requ
de70: 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ired..  **.  ** 
de80: 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20  Symbols defined 
de90: 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66  in os.h indentif
dea0: 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  y the 'pending b
deb0: 79 74 65 27 20 61 6e 64 20 74 68 65 20 27 72 65  yte' and the 're
dec0: 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65  served.  ** byte
ded0: 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62  ', each single b
dee0: 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f  ytes at well kno
def0: 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20  wn offsets, and 
df00: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
df10: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20  .  ** range', a 
df20: 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74  range of 510 byt
df30: 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f  es at a well kno
df40: 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a  wn offset..  **.
df50: 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61    ** To obtain a
df60: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20   SHARED lock, a 
df70: 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74  read-lock is obt
df80: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65  ained on the 'pe
df90: 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27  nding.  ** byte'
dfa0: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73 75  .  If this is su
dfb0: 63 63 65 73 73 66 75 6c 2c 20 61 20 72 61 6e 64  ccessful, a rand
dfc0: 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 74 68 65  om byte from the
dfd0: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
dfe0: 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 72 65 61  ** range' is rea
dff0: 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65  d-locked and the
e000: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70 65   lock on the 'pe
e010: 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65 6c 65  nding byte' rele
e020: 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ased..  **.  ** 
e030: 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e  A process may on
e040: 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45  ly obtain a RESE
e050: 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72 20  RVED lock after 
e060: 69 74 20 68 61 73 20 61 20 53 48 41 52 45 44 20  it has a SHARED 
e070: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53  lock..  ** A RES
e080: 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d  ERVED lock is im
e090: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72 61  plemented by gra
e0a0: 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  bbing a write-lo
e0b0: 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27  ck on the.  ** '
e0c0: 72 65 73 65 72 76 65 64 20 62 79 74 65 27 2e 20  reserved byte'. 
e0d0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f  .  **.  ** A pro
e0e0: 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62  cess may only ob
e0f0: 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c  tain a PENDING l
e100: 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73  ock after it has
e110: 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a   obtained a.  **
e120: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20   SHARED lock. A 
e130: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
e140: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f  implemented by o
e150: 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65  btaining a write
e160: 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68  -lock.  ** on th
e170: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
e180: 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
e190: 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52 45  hat no new SHARE
e1a0: 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20  D locks can be. 
e1b0: 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62 75   ** obtained, bu
e1c0: 74 20 65 78 69 73 74 69 6e 67 20 53 48 41 52 45  t existing SHARE
e1d0: 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f  D locks are allo
e1e0: 77 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e 20  wed to persist. 
e1f0: 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64  A process.  ** d
e200: 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
e210: 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  obtain a RESERVE
e220: 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61  D lock on the wa
e230: 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c  y to a PENDING l
e240: 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70  ock..  ** This p
e250: 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20  roperty is used 
e260: 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d  by the algorithm
e270: 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63   for rolling bac
e280: 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  k a journal file
e290: 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63 72  .  ** after a cr
e2a0: 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ash..  **.  ** A
e2b0: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
e2c0: 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65 72  , obtained after
e2d0: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
e2e0: 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a  is held, is.  **
e2f0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
e300: 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74  obtaining a writ
e310: 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e  e-lock on the en
e320: 74 69 72 65 20 27 73 68 61 72 65 64 20 62 79 74  tire 'shared byt
e330: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53  e.  ** range'. S
e340: 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c  ince all other l
e350: 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61 20 72  ocks require a r
e360: 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20  ead-lock on one 
e370: 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20 20 2a  of the bytes.  *
e380: 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 72 61  * within this ra
e390: 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65  nge, this ensure
e3a0: 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  s that no other 
e3b0: 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20 6f  locks are held o
e3c0: 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
e3d0: 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ase. .  **.  ** 
e3e0: 54 68 65 20 72 65 61 73 6f 6e 20 61 20 73 69 6e  The reason a sin
e3f0: 67 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f 74 20  gle byte cannot 
e400: 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20  be used instead 
e410: 6f 66 20 74 68 65 20 27 73 68 61 72 65 64 20 62  of the 'shared b
e420: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20  yte.  ** range' 
e430: 69 73 20 74 68 61 74 20 73 6f 6d 65 20 76 65 72  is that some ver
e440: 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73  sions of windows
e450: 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
e460: 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20  read-locks. By. 
e470: 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61   ** locking a ra
e480: 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 61  ndom byte from a
e490: 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65   range, concurre
e4a0: 6e 74 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20  nt SHARED locks 
e4b0: 6d 61 79 20 65 78 69 73 74 0a 20 20 2a 2a 20 65  may exist.  ** e
e4c0: 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b 69  ven if the locki
e4d0: 6e 67 20 70 72 69 6d 69 74 69 76 65 20 75 73 65  ng primitive use
e4e0: 64 20 69 73 20 61 6c 77 61 79 73 20 61 20 77 72  d is always a wr
e4f0: 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  ite-lock..  */. 
e500: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
e510: 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
e520: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
e530: 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
e540: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
e550: 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
e560: 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72 72  lock;.  int tErr
e570: 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  no = 0;..  asser
e580: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
e590: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
e5a0: 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c  %d %s was %s(%s,
e5b0: 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78  %d) pid=%d (unix
e5c0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
e5d0: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
e5e0: 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46  (eFileLock), azF
e5f0: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65  ileLock(pFile->e
e600: 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20  FileLock),.     
e610: 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c   azFileLock(pFil
e620: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
e630: 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e 70 49  Lock), pFile->pI
e640: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20  node->nShared , 
e650: 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f  getpid()));..  /
e660: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
e670: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
e680: 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
e690: 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
e6a0: 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69   the.  ** unixFi
e6b0: 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
e6c0: 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e  Don't use the en
e6d0: 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
e6e0: 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45  h, as.  ** unixE
e6f0: 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
e700: 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
e710: 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
e720: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
e730: 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
e740: 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
e750: 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c      %d %s ok (al
e760: 72 65 61 64 79 20 68 65 6c 64 29 20 28 75 6e 69  ready held) (uni
e770: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
e780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 46  .            azF
e790: 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
e7a0: 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  k)));.    return
e7b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
e7c0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
e7d0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
e7e0: 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e  ence is correct.
e7f0: 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65  .  **  (1) We ne
e800: 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e  ver move from un
e810: 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69  locked to anythi
e820: 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73  ng higher than s
e830: 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  hared lock..  **
e840: 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76    (2) SQLite nev
e850: 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65  er explicitly re
e860: 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20  quests a pendig 
e870: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20  lock..  **  (3) 
e880: 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73  A shared lock is
e890: 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65   always held whe
e8a0: 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b  n a reserve lock
e8b0: 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20   is requested.. 
e8c0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
e8d0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
e8e0: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NO_LOCK || eFile
e8f0: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
e900: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
e910: 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  FileLock!=PENDIN
e920: 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
e930: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52  rt( eFileLock!=R
e940: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
e950: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
e960: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
e970: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65  ..  /* This mute
e980: 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61  x is needed beca
e990: 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
e9a0: 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
e9b0: 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a  ss threads.  */.
e9c0: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
e9d0: 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
e9e0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20  File->pInode;.. 
e9f0: 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65   /* If some thre
ea00: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
ea10: 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61  D has a lock via
ea20: 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69   a different uni
ea30: 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64  xFile*.  ** hand
ea40: 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65  le that preclude
ea50: 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
ea60: 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53  lock, return BUS
ea70: 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  Y..  */.  if( (p
ea80: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
ea90: 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  =pInode->eFileLo
eaa0: 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  ck && .         
eab0: 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
eac0: 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
ead0: 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53  K || eFileLock>S
eae0: 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29  HARED_LOCK)).  )
eaf0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
eb00: 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
eb10: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a   end_lock;.  }..
eb20: 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44    /* If a SHARED
eb30: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
eb40: 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72  ed, and some thr
eb50: 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
eb60: 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ID already.  ** 
eb70: 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20  has a SHARED or 
eb80: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74  RESERVED lock, t
eb90: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65  hen increment re
eba0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61  ference counts a
ebb0: 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  nd.  ** return S
ebc0: 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20  QLITE_OK..  */. 
ebd0: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
ebe0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
ebf0: 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65        (pInode->e
ec00: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
ec10: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
ec20: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45  >eFileLock==RESE
ec30: 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  RVED_LOCK) ){.  
ec40: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
ec50: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
ec60: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
ec70: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
ec80: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
ec90: 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
eca0: 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c  ed>0 );.    pFil
ecb0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
ecc0: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
ecd0: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b  pInode->nShared+
ece0: 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  +;.    pInode->n
ecf0: 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  Lock++;.    goto
ed00: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a   end_lock;.  }..
ed10: 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20  .  /* A PENDING 
ed20: 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62  lock is needed b
ed30: 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20  efore acquiring 
ed40: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e  a SHARED lock an
ed50: 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63  d before.  ** ac
ed60: 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55  quiring an EXCLU
ed70: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20  SIVE lock.  For 
ed80: 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
ed90: 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c   the PENDING wil
eda0: 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73  l.  ** be releas
edb0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e  ed..  */.  lock.
edc0: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f  l_len = 1L;.  lo
edd0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
ede0: 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46  EK_SET;.  if( eF
edf0: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
ee00: 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28  LOCK .      || (
ee10: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
ee20: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69  SIVE_LOCK && pFi
ee30: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45  le->eFileLock<PE
ee40: 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b  NDING_LOCK).  ){
ee50: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
ee60: 20 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   = (eFileLock==S
ee70: 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c  HARED_LOCK?F_RDL
ee80: 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20  CK:F_WRLCK);.   
ee90: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
eea0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
eeb0: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
eec0: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c  ck(pFile, &lock,
eed0: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72   0) ){.      tEr
eee0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
eef0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
ef00: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
ef10: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
ef20: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
ef30: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
ef40: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
ef50: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
ef60: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
ef70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
ef80: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  to end_lock;.   
ef90: 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66   }.  }...  /* If
efa0: 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f   control gets to
efb0: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
efc0: 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68  n actually go ah
efd0: 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a  ead and make.  *
efe0: 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
eff0: 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  em calls for the
f000: 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e   specified lock.
f010: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
f020: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
f030: 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
f040: 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
f050: 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
f060: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
f070: 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
f080: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
f090: 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  TE_OK );..    /*
f0a0: 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61   Now get the rea
f0b0: 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f  d-lock */.    lo
f0c0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
f0d0: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c  RED_FIRST;.    l
f0e0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
f0f0: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28  ED_SIZE;.    if(
f100: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
f110: 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 30 29 20 29  ile, &lock, 0) )
f120: 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  {.      tErrno =
f130: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
f140: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
f150: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
f160: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
f170: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a  R_LOCK);.    }..
f180: 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
f190: 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e  temporary PENDIN
f1a0: 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f  G lock */.    lo
f1b0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e  ck.l_start = PEN
f1c0: 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c  DING_BYTE;.    l
f1d0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a  ock.l_len = 1L;.
f1e0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
f1f0: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69  = F_UNLCK;.    i
f200: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
f210: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30  pFile, &lock, 10
f220: 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ) && rc==SQLITE_
f230: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  OK ){.      /* T
f240: 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e  his could happen
f250: 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b 20   with a network 
f260: 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74  mount */.      t
f270: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23  Errno = errno;.#
f280: 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45  if OSLOCKING_CHE
f290: 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20  CK_BUSY_IOERR.  
f2a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
f2b0: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
f2c0: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
f2d0: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
f2e0: 20 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63   .#else.      rc
f2f0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
f300: 55 4e 4c 4f 43 4b 3b 20 0a 23 65 6e 64 69 66 0a  UNLOCK; .#endif.
f310: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
f320: 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 49  c ){.      if( I
f330: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
f340: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
f350: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
f360: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
f370: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f       goto end_lo
f380: 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ck;.    }else{. 
f390: 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
f3a0: 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
f3b0: 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  OCK;.      pInod
f3c0: 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
f3d0: 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
f3e0: 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 1;.    }.  }
f3f0: 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f  else if( eFileLo
f400: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
f410: 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK && pInode->nS
f420: 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f  hared>1 ){.    /
f430: 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20  * We are trying 
f440: 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65  for an exclusive
f450: 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65   lock but anothe
f460: 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  r thread in this
f470: 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f  .    ** same pro
f480: 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f  cess is still ho
f490: 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  lding a shared l
f4a0: 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ock. */.    rc =
f4b0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
f4c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
f4d0: 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f  e request was fo
f4e0: 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
f4f0: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
f500: 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73   It is.    ** as
f510: 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65  sumed that there
f520: 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20   is a SHARED or 
f530: 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
f540: 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
f550: 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
f560: 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70      assert( 0!=p
f570: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
f580: 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  );.    lock.l_ty
f590: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a 20  pe = F_WRLCK;.. 
f5a0: 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65     assert( eFile
f5b0: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
f5c0: 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
f5d0: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
f5e0: 20 29 3b 0a 20 20 20 20 69 66 28 20 65 46 69 6c   );.    if( eFil
f5f0: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
f600: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f  LOCK ){.      lo
f610: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53  ck.l_start = RES
f620: 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20  ERVED_BYTE;.    
f630: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
f640: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  L;.    }else{.  
f650: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
f660: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
f670: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  .      lock.l_le
f680: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
f690: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
f6a0: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
f6b0: 6c 65 2c 20 26 6c 6f 63 6b 2c 20 30 29 20 29 7b  le, &lock, 0) ){
f6c0: 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
f6d0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
f6e0: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
f6f0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
f700: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
f710: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
f720: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
f730: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  Y ){.        pFi
f740: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
f750: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
f760: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69      }.  }.  ..#i
f770: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f  fndef NDEBUG.  /
f780: 2a 20 53 65 74 20 75 70 20 74 68 65 20 74 72 61  * Set up the tra
f790: 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72  nsaction-counter
f7a0: 20 63 68 61 6e 67 65 20 63 68 65 63 6b 69 6e 67   change checking
f7b0: 20 66 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a   flags when.  **
f7c0: 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66   transitioning f
f7d0: 72 6f 6d 20 61 20 53 48 41 52 45 44 20 74 6f 20  rom a SHARED to 
f7e0: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e  a RESERVED lock.
f7f0: 20 20 54 68 65 20 63 68 61 6e 67 65 0a 20 20 2a    The change.  *
f800: 2a 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f  * from SHARED to
f810: 20 52 45 53 45 52 56 45 44 20 6d 61 72 6b 73 20   RESERVED marks 
f820: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
f830: 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77   a normal.  ** w
f840: 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 28  rite operation (
f850: 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  not a hot journa
f860: 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a  l rollback)..  *
f870: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
f880: 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c  TE_OK.   && pFil
f890: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  e->eFileLock<=SH
f8a0: 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20  ARED_LOCK.   && 
f8b0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
f8c0: 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20  VED_LOCK.  ){.  
f8d0: 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e    pFile->transCn
f8e0: 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20  trChng = 0;.    
f8f0: 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20  pFile->dbUpdate 
f900: 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
f910: 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
f920: 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a  1;.  }.#endif...
f930: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f940: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  _OK ){.    pFile
f950: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
f960: 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e  ileLock;.    pIn
f970: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
f980: 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65   eFileLock;.  }e
f990: 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
f9a0: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
f9b0: 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
f9c0: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44  eFileLock = PEND
f9d0: 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49  ING_LOCK;.    pI
f9e0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
f9f0: 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
fa00: 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20    }..end_lock:. 
fa10: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
fa20: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
fa30: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20  OCK    %d %s %s 
fa40: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
fa50: 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ->h, azFileLock(
fa60: 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20  eFileLock), .   
fa70: 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
fa80: 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
fa90: 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  d"));.  return r
faa0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  c;.}../*.** Add 
fab0: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
fac0: 74 6f 72 20 75 73 65 64 20 62 79 20 66 69 6c 65  tor used by file
fad0: 20 68 61 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f   handle pFile to
fae0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
faf0: 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69  ng.** pUnused li
fb00: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
fb10: 69 64 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28  id setPendingFd(
fb20: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
fb30: 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  {.  unixInodeInf
fb40: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
fb50: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69  e->pInode;.  Uni
fb60: 78 55 6e 75 73 65 64 46 64 20 2a 70 20 3d 20 70  xUnusedFd *p = p
fb70: 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20  File->pUnused;. 
fb80: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f   p->pNext = pIno
fb90: 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70  de->pUnused;.  p
fba0: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d  Inode->pUnused =
fbb0: 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d   p;.  pFile->h =
fbc0: 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 55   -1;.  pFile->pU
fbd0: 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  nused = 0;.}../*
fbe0: 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
fbf0: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
fc00: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
fc10: 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
fc20: 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
fc30: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
fc40: 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
fc50: 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
fc60: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
fc70: 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
fc80: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
fc90: 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
fca0: 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
fcb0: 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
fcc0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
fcd0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a   a no-op..** .**
fce0: 20 49 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c   If handleNFSUnl
fcf0: 6f 63 6b 20 69 73 20 74 72 75 65 2c 20 74 68 65  ock is true, the
fd00: 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67  n on downgrading
fd10: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   an EXCLUSIVE_LO
fd20: 43 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20  CK to SHARED.** 
fd30: 74 68 65 20 62 79 74 65 20 72 61 6e 67 65 20 69  the byte range i
fd40: 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 32  s divided into 2
fd50: 20 70 61 72 74 73 20 61 6e 64 20 74 68 65 20 66   parts and the f
fd60: 69 72 73 74 20 70 61 72 74 20 69 73 20 75 6e 6c  irst part is unl
fd70: 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65  ocked then.** se
fd80: 74 20 74 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b  t to a read lock
fd90: 2c 20 74 68 65 6e 20 74 68 65 20 6f 74 68 65 72  , then the other
fda0: 20 70 61 72 74 20 69 73 20 73 69 6d 70 6c 79 20   part is simply 
fdb0: 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73 20  unlocked.  This 
fdc0: 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64  works .** around
fdd0: 20 61 20 62 75 67 20 69 6e 20 42 53 44 20 4e 46   a bug in BSD NF
fde0: 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65  S lockd (also se
fdf0: 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e  en on MacOSX 10.
fe00: 33 2b 29 20 74 68 61 74 20 66 61 69 6c 73 20 74  3+) that fails t
fe10: 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65  o .** remove the
fe20: 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61   write lock on a
fe30: 20 72 65 67 69 6f 6e 20 77 68 65 6e 20 61 20 72   region when a r
fe40: 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e  ead lock is set.
fe50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
fe60: 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  osixUnlock(sqlit
fe70: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
fe80: 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20   eFileLock, int 
fe90: 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29  handleNFSUnlock)
fea0: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
feb0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
fec0: 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  )id;.  unixInode
fed0: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20  Info *pInode;.  
fee0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
fef0: 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  k;.  int rc = SQ
ff00: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
ff10: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
ff20: 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
ff30: 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64   %d %d was %d(%d
ff40: 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69  ,%d) pid=%d (uni
ff50: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
ff60: 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20   eFileLock,.    
ff70: 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
ff80: 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ck, pFile->pInod
ff90: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46  e->eFileLock, pF
ffa0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68  ile->pInode->nSh
ffb0: 61 72 65 64 2c 0a 20 20 20 20 20 20 67 65 74 70  ared,.      getp
ffc0: 69 64 28 29 29 29 3b 0a 0a 20 20 61 73 73 65 72  id()));..  asser
ffd0: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
ffe0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  ARED_LOCK );.  i
fff0: 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
10000 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock<=eFileLock )
10010 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
10020 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e  ITE_OK;.  }.  un
10030 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
10040 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
10050 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65  ->pInode;.  asse
10060 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
10070 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  red!=0 );.  if( 
10080 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
10090 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
100a0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
100b0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70  de->eFileLock==p
100c0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
100d0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  );..#ifndef NDEB
100e0 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72  UG.    /* When r
100f0 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73  educing a lock s
10100 75 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70  uch that other p
10110 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61  rocesses can sta
10120 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  rt.    ** readin
10130 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
10140 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20  ile again, make 
10150 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20  sure that the.  
10160 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
10170 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64   counter was upd
10180 61 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74  ated if any part
10190 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
101a0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61  .    ** file cha
101b0 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72  nged.  If the tr
101c0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
101d0 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64  r is not updated
101e0 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63  ,.    ** other c
101f0 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68  onnections to th
10200 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68  e same file migh
10210 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68  t not realize th
10220 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  at.    ** the fi
10230 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61  le has changed a
10240 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e  nd hence might n
10250 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68  ot know to flush
10260 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61   their.    ** ca
10270 63 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66  che.  The use of
10280 20 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63   a stale cache c
10290 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
102a0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
102b0 20 20 20 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65      */.    pFile
102c0 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20  ->inNormalWrite 
102d0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  = 0;.#endif..   
102e0 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e 67 20   /* downgrading 
102f0 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  to a shared lock
10300 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76 65 73   on NFS involves
10310 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 77 72   clearing the wr
10320 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20  ite lock.    ** 
10330 62 65 66 6f 72 65 20 65 73 74 61 62 6c 69 73 68  before establish
10340 69 6e 67 20 74 68 65 20 72 65 61 64 6c 6f 63 6b  ing the readlock
10350 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 72 61   - to avoid a ra
10360 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77 65 20  ce condition we 
10370 64 6f 77 6e 67 72 61 64 65 0a 20 20 20 20 2a 2a  downgrade.    **
10380 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32 20 62   the lock in 2 b
10390 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74 20 70  locks, so that p
103a0 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65  art of the range
103b0 20 77 69 6c 6c 20 62 65 20 63 6f 76 65 72 65 64   will be covered
103c0 20 62 79 20 61 20 0a 20 20 20 20 2a 2a 20 77 72   by a .    ** wr
103d0 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74  ite lock until t
103e0 68 65 20 72 65 73 74 20 69 73 20 63 6f 76 65 72  he rest is cover
103f0 65 64 20 62 79 20 61 20 72 65 61 64 20 6c 6f 63  ed by a read loc
10400 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20 20 20  k:.    **  1:   
10410 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a 20 20  [WWWWW].    **  
10420 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20  2:   [....W].   
10430 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52 52 57   **  3:   [RRRRW
10440 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20 20 5b  ].    **  4:   [
10450 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20  RRRR.].    */.  
10460 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
10470 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
10480 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
10490 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
104a0 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
104b0 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 65  om system call e
104c0 72 72 6f 72 73 20 2a 2f 0a 0a 23 69 66 20 21 64  rrors */..#if !d
104d0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
104e0 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 45 4e 41  ) || !SQLITE_ENA
104f0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
10500 45 0a 20 20 20 20 20 20 28 76 6f 69 64 29 68 61  E.      (void)ha
10510 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20  ndleNFSUnlock;. 
10520 20 20 20 20 20 61 73 73 65 72 74 28 20 68 61 6e       assert( han
10530 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20  dleNFSUnlock==0 
10540 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  );.#endif.#if de
10550 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
10560 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
10570 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
10580 20 20 20 20 20 20 69 66 28 20 68 61 6e 64 6c 65        if( handle
10590 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20  NFSUnlock ){.   
105a0 20 20 20 20 20 6f 66 66 5f 74 20 64 69 76 53 69       off_t divSi
105b0 7a 65 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  ze = SHARED_SIZE
105c0 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20   - 1;.        . 
105d0 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79         lock.l_ty
105e0 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
105f0 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
10600 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
10610 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
10620 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
10630 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
10640 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a  k.l_len = divSiz
10650 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  e;.        if( u
10660 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
10670 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d 28  e, &lock, 10)==(
10680 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
10690 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
106a0 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43  .#if OSLOCKING_C
106b0 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a  HECK_BUSY_IOERR.
106c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
106d0 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
106e0 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
106f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
10700 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65 0a 20 20 20  LOCK);.#else.   
10710 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
10720 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
10730 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
10740 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
10750 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
10760 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
10770 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
10780 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
10790 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
107a0 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
107b0 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e   }.        lock.
107c0 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
107d0 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
107e0 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
107f0 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
10800 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
10810 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
10820 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69   lock.l_len = di
10830 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  vSize;.        i
10840 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
10850 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30  pFile, &lock, 10
10860 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
10870 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
10880 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
10890 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
108a0 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
108b0 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
108c0 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_RDLOCK);.    
108d0 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
108e0 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
108f0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
10900 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
10910 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
10920 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
10930 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
10940 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c       }.        l
10950 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
10960 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  NLCK;.        lo
10970 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
10980 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
10990 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
109a0 48 41 52 45 44 5f 46 49 52 53 54 2b 64 69 76 53  HARED_FIRST+divS
109b0 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  ize;.        loc
109c0 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
109d0 5f 53 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20  _SIZE-divSize;. 
109e0 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46         if( unixF
109f0 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
10a00 6c 6f 63 6b 2c 20 31 30 29 3d 3d 28 2d 31 29 20  lock, 10)==(-1) 
10a10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72  ){.          tEr
10a20 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66  rno = errno;.#if
10a30 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b   OSLOCKING_CHECK
10a40 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20  _BUSY_IOERR.    
10a50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10a60 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
10a70 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
10a80 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
10a90 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  );.#else.       
10aa0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
10ab0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 23 65 6e  OERR_UNLOCK;.#en
10ac0 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 69 66  dif.          if
10ad0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
10ae0 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rc) ){.         
10af0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
10b00 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
10b10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10b20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c      goto end_unl
10b30 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ock;.        }. 
10b40 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
10b50 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
10b60 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
10b70 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
10b80 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20 20 20  _STYLE */.      
10b90 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  {.        lock.l
10ba0 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
10bb0 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
10bc0 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
10bd0 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
10be0 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
10bf0 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20  _FIRST;.        
10c00 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
10c10 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  RED_SIZE;.      
10c20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
10c30 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c  ck(pFile, &lock,
10c40 20 31 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20   10) ){.        
10c50 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
10c60 3b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f  ;.#if OSLOCKING_
10c70 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52  CHECK_BUSY_IOERR
10c80 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
10c90 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
10ca0 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
10cb0 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  , SQLITE_IOERR_R
10cc0 44 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65 0a 20 20  DLOCK);.#else.  
10cd0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68          /* In th
10ce0 65 6f 72 79 2c 20 74 68 65 20 63 61 6c 6c 20 74  eory, the call t
10cf0 6f 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 29  o unixFileLock()
10d00 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 62 65 63   cannot fail bec
10d10 61 75 73 65 20 61 6e 6f 74 68 65 72 0a 20 20 20  ause another.   
10d20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
10d30 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  s is holding an 
10d40 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6c 6f 63  incompatible loc
10d50 6b 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74  k. If it does, t
10d60 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  his .          *
10d70 2a 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  * indicates that
10d80 20 74 68 65 20 6f 74 68 65 72 20 70 72 6f 63 65   the other proce
10d90 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77  ss is not follow
10da0 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a  ing the locking.
10db0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
10dc0 74 6f 63 6f 6c 2e 20 49 66 20 74 68 69 73 20 68  tocol. If this h
10dd0 61 70 70 65 6e 73 2c 20 72 65 74 75 72 6e 20 53  appens, return S
10de0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
10df0 43 4b 2e 20 52 65 74 75 72 6e 69 6e 67 0a 20 20  CK. Returning.  
10e00 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54          ** SQLIT
10e10 45 5f 42 55 53 59 20 77 6f 75 6c 64 20 63 6f 6e  E_BUSY would con
10e20 66 75 73 65 20 74 68 65 20 75 70 70 65 72 20 6c  fuse the upper l
10e30 61 79 65 72 20 28 69 6e 20 70 72 61 63 74 69 63  ayer (in practic
10e40 65 20 69 74 20 63 61 75 73 65 73 20 0a 20 20 20  e it causes .   
10e50 20 20 20 20 20 20 20 2a 2a 20 61 6e 20 61 73 73         ** an ass
10e60 65 72 74 20 74 6f 20 66 61 69 6c 29 2e 20 2a 2f  ert to fail). */
10e70 20 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d   .          rc =
10e80 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
10e90 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  LOCK;.          
10ea0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
10eb0 20 3d 20 74 45 72 72 6e 6f 3b 0a 23 65 6e 64 69   = tErrno;.#endi
10ec0 66 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  f.          if( 
10ed0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
10ee0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
10ef0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
10f00 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
10f10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10f20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
10f30 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
10f40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c     }.    }.    l
10f50 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
10f60 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  NLCK;.    lock.l
10f70 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
10f80 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ET;.    lock.l_s
10f90 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
10fa0 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
10fb0 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72  len = 2L;  asser
10fc0 74 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t( PENDING_BYTE+
10fd0 31 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45  1==RESERVED_BYTE
10fe0 20 29 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78   );.    if( unix
10ff0 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
11000 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d 30 20 29 7b  &lock, 10)==0 ){
11010 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  .      pInode->e
11020 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
11030 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  D_LOCK;.    }els
11040 65 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47  e{.#if OSLOCKING
11050 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52  _CHECK_BUSY_IOER
11060 52 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  R.      tErrno =
11070 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
11080 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
11090 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
110a0 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
110b0 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_UNLOCK);.     
110c0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
110d0 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
110e0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
110f0 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
11100 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20     }.#else.     
11110 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
11120 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20  RR_UNLOCK;.     
11130 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
11140 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 65 6e 64 69  o = errno;.#endi
11150 66 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  f.      goto end
11160 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  _unlock;.    }. 
11170 20 7d 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f   }.  if( eFileLo
11180 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  ck==NO_LOCK ){. 
11190 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
111a0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
111b0 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73  counter.  Releas
111c0 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67  e the lock using
111d0 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61   an.    ** OS ca
111e0 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c  ll only when all
111f0 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73   threads in this
11200 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61   same process ha
11210 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  ve released.    
11220 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20  ** the lock..   
11230 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e   */.    pInode->
11240 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69  nShared--;.    i
11250 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  f( pInode->nShar
11260 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c  ed==0 ){.      l
11270 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
11280 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  NLCK;.      lock
11290 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
112a0 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  _SET;.      lock
112b0 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e  .l_start = lock.
112c0 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20  l_len = 0L;.    
112d0 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
112e0 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c  ck(pFile, &lock,
112f0 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   10)==0 ){.     
11300 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
11310 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
11320 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66        }else{.#if
11330 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b   OSLOCKING_CHECK
11340 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20  _BUSY_IOERR.    
11350 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
11360 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  no;.        rc =
11370 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
11380 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
11390 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
113a0 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  UNLOCK);.       
113b0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
113c0 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
113d0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
113e0 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
113f0 20 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20         }.#else. 
11400 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
11410 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
11420 0a 09 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  ..    pFile->las
11430 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
11440 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 70  #endif.        p
11450 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
11460 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
11470 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
11480 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
11490 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
114a0 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
114b0 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63  the count of loc
114c0 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69 73 20  ks against this 
114d0 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e  same file.  When
114e0 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e   the.    ** coun
114f0 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20  t reaches zero, 
11500 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20  close any other 
11510 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
11520 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20   whose close.   
11530 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65 64   ** was deferred
11540 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73   because of outs
11550 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20  tanding locks.. 
11560 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65     */.    pInode
11570 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61  ->nLock--;.    a
11580 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
11590 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69  Lock>=0 );.    i
115a0 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  f( pInode->nLock
115b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f  ==0 ){.      clo
115c0 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69  sePendingFds(pFi
115d0 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 09  le);.    }.  }..
115e0 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75  .end_unlock:.  u
115f0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
11600 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
11610 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46  E_OK ) pFile->eF
11620 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
11630 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ock;.  return rc
11640 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
11650 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
11660 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
11670 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
11680 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
11690 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
116a0 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
116b0 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
116c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
116d0 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
116e0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
116f0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
11700 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
11710 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
11720 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
11730 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
11740 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
11750 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  nixUnlock(sqlite
11760 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
11770 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65  eFileLock){.  re
11780 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b  turn posixUnlock
11790 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20  (id, eFileLock, 
117a0 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0);.}../*.** Thi
117b0 73 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f  s function perfo
117c0 72 6d 73 20 74 68 65 20 70 61 72 74 73 20 6f 66  rms the parts of
117d0 20 74 68 65 20 22 63 6c 6f 73 65 20 66 69 6c 65   the "close file
117e0 22 20 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20  " operation .** 
117f0 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f  common to all lo
11800 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 2e 20 49  cking schemes. I
11810 74 20 63 6c 6f 73 65 73 20 74 68 65 20 64 69 72  t closes the dir
11820 65 63 74 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a  ectory and file.
11830 2a 2a 20 68 61 6e 64 6c 65 73 2c 20 69 66 20 74  ** handles, if t
11840 68 65 79 20 61 72 65 20 76 61 6c 69 64 2c 20 61  hey are valid, a
11850 6e 64 20 73 65 74 73 20 61 6c 6c 20 66 69 65 6c  nd sets all fiel
11860 64 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69  ds of the unixFi
11870 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  le.** structure 
11880 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  to 0..**.** It i
11890 73 20 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72  s *not* necessar
118a0 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75  y to hold the mu
118b0 74 65 78 20 77 68 65 6e 20 74 68 69 73 20 72 6f  tex when this ro
118c0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
118d0 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f  .** even on VxWo
118e0 72 6b 73 2e 20 20 41 20 6d 75 74 65 78 20 77 69  rks.  A mutex wi
118f0 6c 6c 20 62 65 20 61 63 71 75 69 72 65 64 20 6f  ll be acquired o
11900 6e 20 56 78 57 6f 72 6b 73 20 62 79 20 74 68 65  n VxWorks by the
11910 0a 2a 2a 20 76 78 77 6f 72 6b 73 52 65 6c 65 61  .** vxworksRelea
11920 73 65 46 69 6c 65 49 64 28 29 20 72 6f 75 74 69  seFileId() routi
11930 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ne..*/.static in
11940 74 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  t closeUnixFile(
11950 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
11960 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
11970 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
11980 2a 29 69 64 3b 0a 23 69 66 20 4f 53 43 4c 4f 53  *)id;.#if OSCLOS
11990 45 5f 43 48 45 43 4b 5f 43 4c 4f 53 45 5f 49 4f  E_CHECK_CLOSE_IO
119a0 45 52 52 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  ERR.  if( pFile-
119b0 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  >h>=0 ){.    int
119c0 20 65 72 72 20 3d 20 63 6c 6f 73 65 28 70 46 69   err = close(pFi
119d0 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 69 66 28 20  le->h);.    if( 
119e0 65 72 72 20 29 7b 0a 20 20 20 20 20 20 70 46 69  err ){.      pFi
119f0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
11a00 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74  errno;.      ret
11a10 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
11a20 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 7d 65 6c 73  _CLOSE;.    }els
11a30 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
11a40 68 3d 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  h=-1;.    }.  }.
11a50 23 65 6c 73 65 0a 20 20 69 66 28 20 70 46 69 6c  #else.  if( pFil
11a60 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 72  e->h>=0 ){.    r
11a70 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c  obust_close(pFil
11a80 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c  e, pFile->h, __L
11a90 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c  INE__);.    pFil
11aa0 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23  e->h = -1;.  }.#
11ab0 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56 58 57  endif.#if OS_VXW
11ac0 4f 52 4b 53 0a 20 20 69 66 28 20 70 46 69 6c 65  ORKS.  if( pFile
11ad0 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20 69 66 28  ->pId ){.    if(
11ae0 20 70 46 69 6c 65 2d 3e 69 73 44 65 6c 65 74 65   pFile->isDelete
11af0 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69   ){.      osUnli
11b00 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a  nk(pFile->pId->z
11b10 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a  CanonicalName);.
11b20 20 20 20 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b      }.    vxwork
11b30 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 70  sReleaseFileId(p
11b40 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20  File->pId);.    
11b50 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a  pFile->pId = 0;.
11b60 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54    }.#endif.  OST
11b70 52 41 43 45 28 28 22 43 4c 4f 53 45 20 20 20 25  RACE(("CLOSE   %
11b80 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
11b90 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65  ));.  OpenCounte
11ba0 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  r(-1);.  sqlite3
11bb0 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 70 55 6e  _free(pFile->pUn
11bc0 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73 65 74 28  used);.  memset(
11bd0 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66  pFile, 0, sizeof
11be0 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 72  (unixFile));.  r
11bf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11c00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
11c10 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
11c20 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28  c int unixClose(
11c30 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
11c40 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
11c50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
11c60 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
11c70 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 75  ixFile *)id;.  u
11c80 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  nixUnlock(id, NO
11c90 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e  _LOCK);.  unixEn
11ca0 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f  terMutex();..  /
11cb0 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64  * unixFile.pInod
11cc0 65 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69  e is always vali
11cd0 64 20 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73  d here. Otherwis
11ce0 65 2c 20 61 20 64 69 66 66 65 72 65 6e 74 20 63  e, a different c
11cf0 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  lose.  ** routin
11d00 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c  e (e.g. nolockCl
11d10 6f 73 65 28 29 29 20 77 6f 75 6c 64 20 62 65 20  ose()) would be 
11d20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a  called instead..
11d30 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
11d40 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c  File->pInode->nL
11d50 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e  ock>0 || pFile->
11d60 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
11d70 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Lock==0 );.  if(
11d80 20 41 4c 57 41 59 53 28 70 46 69 6c 65 2d 3e 70   ALWAYS(pFile->p
11d90 49 6e 6f 64 65 29 20 26 26 20 70 46 69 6c 65 2d  Inode) && pFile-
11da0 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29  >pInode->nLock )
11db0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
11dc0 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
11dd0 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20  g locks, do not 
11de0 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74  actually close t
11df0 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20  he file just.   
11e00 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20   ** yet because 
11e10 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72  that would clear
11e20 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49   those locks.  I
11e30 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20  nstead, add the 
11e40 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63  file.    ** desc
11e50 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65  riptor to pInode
11e60 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20  ->pUnused list. 
11e70 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
11e80 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
11e90 20 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68   .    ** when th
11ea0 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63  e last lock is c
11eb0 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  leared..    */. 
11ec0 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28     setPendingFd(
11ed0 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pFile);.  }.  re
11ee0 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70  leaseInodeInfo(p
11ef0 46 69 6c 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c  File);.  rc = cl
11f00 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
11f10 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
11f20 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
11f30 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
11f40 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
11f50 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c  posix advisory l
11f60 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
11f70 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
11f80 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
11f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fd0 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
11fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12020 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
12030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12040 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69  **** No-op Locki
12050 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
12060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12070 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74  *****.**.** Of t
12080 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69  he various locki
12090 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ng implementatio
120a0 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68  ns available, th
120b0 69 73 20 69 73 20 62 79 20 66 61 72 20 74 68 65  is is by far the
120c0 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c  .** simplest:  l
120d0 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65  ocking is ignore
120e0 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69  d.  No attempt i
120f0 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74  s made to lock t
12100 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
12110 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20  ile for reading 
12120 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a  or writing..**.*
12130 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d  * This locking m
12140 6f 64 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ode is appropria
12150 74 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65  te for use on re
12160 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
12170 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61  s.** (ex: databa
12180 73 65 73 20 74 68 61 74 20 61 72 65 20 62 75 72  ses that are bur
12190 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c  ned into CD-ROM,
121a0 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20   for example.)  
121b0 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62  It can.** also b
121c0 65 20 75 73 65 64 20 69 66 20 74 68 65 20 61 70  e used if the ap
121d0 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79  plication employ
121e0 73 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20  s some external 
121f0 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20  mechanism to.** 
12200 70 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e  prevent simultan
12210 65 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20 74  eous access of t
12220 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
12230 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   by two or more.
12240 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
12250 65 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68  ections.  But th
12260 65 72 65 20 69 73 20 61 20 73 65 72 69 6f 75 73  ere is a serious
12270 20 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73   risk of databas
12280 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20  e.** corruption 
12290 69 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  if this locking 
122a0 6d 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e 20  mode is used in 
122b0 73 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65  situations where
122c0 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74   multiple.** dat
122d0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
122e0 73 20 61 72 65 20 61 63 63 65 73 73 69 6e 67 20  s are accessing 
122f0 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
12300 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61  e file at the sa
12310 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f  me.** time and o
12320 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
12330 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ose connections 
12340 61 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a  are writing..*/.
12350 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
12360 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
12370 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
12380 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a   *NotUsed, int *
12390 70 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53  pResOut){.  UNUS
123a0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
123b0 55 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75  Used);.  *pResOu
123c0 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
123d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61  SQLITE_OK;.}.sta
123e0 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f  tic int nolockLo
123f0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
12400 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
12410 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
12420 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
12430 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
12440 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12450 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  _OK;.}.static in
12460 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73  t nolockUnlock(s
12470 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
12480 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65  Used, int NotUse
12490 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
124a0 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
124b0 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
124c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
124d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
124e0 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
124f0 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c  tic int nolockCl
12500 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
12510 20 2a 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e   *id) {.  return
12520 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
12530 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  d);.}../********
12540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
12550 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63  of the no-op loc
12560 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
12570 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
12580 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
12590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125d0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
125e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12620 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
12630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12640 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65  * Begin dot-file
12650 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
12660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12670 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
12680 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  e dotfile lockin
12690 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
126a0 20 75 73 65 73 20 74 68 65 20 65 78 69 73 74 61   uses the exista
126b0 6e 63 65 20 6f 66 20 73 65 70 61 72 61 74 65 20  nce of separate 
126c0 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 69 6e  lock.** files in
126d0 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 72 6f   order to contro
126e0 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20  l access to the 
126f0 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
12700 77 6f 72 6b 73 20 6f 6e 20 6a 75 73 74 0a 2a 2a  works on just.**
12710 20 61 62 6f 75 74 20 65 76 65 72 79 20 66 69 6c   about every fil
12720 65 73 79 73 74 65 6d 20 69 6d 61 67 69 6e 61 62  esystem imaginab
12730 6c 65 2e 20 20 42 75 74 20 74 68 65 72 65 20 61  le.  But there a
12740 72 65 20 73 65 72 69 6f 75 73 20 64 6f 77 6e 73  re serious downs
12750 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ides:.**.**    (
12760 31 29 20 20 54 68 65 72 65 20 69 73 20 7a 65 72  1)  There is zer
12770 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e 20 20  o concurrency.  
12780 41 20 73 69 6e 67 6c 65 20 72 65 61 64 65 72 20  A single reader 
12790 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68 65 72  blocks all other
127a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 6e  .**         conn
127b0 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72 65 61  ections from rea
127c0 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
127d0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
127e0 0a 2a 2a 20 20 20 20 28 32 29 20 20 41 6e 20 61  .**    (2)  An a
127f0 70 70 6c 69 63 61 74 69 6f 6e 20 63 72 61 73 68  pplication crash
12800 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73 20 63   or power loss c
12810 61 6e 20 6c 65 61 76 65 20 73 74 61 6c 65 20 6c  an leave stale l
12820 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20 20 20  ock files.**    
12830 20 20 20 20 20 73 69 74 74 69 6e 67 20 61 72 6f       sitting aro
12840 75 6e 64 20 74 68 61 74 20 6e 65 65 64 20 74 6f  und that need to
12850 20 62 65 20 63 6c 65 61 72 65 64 20 6d 61 6e 75   be cleared manu
12860 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65  ally..**.** Neve
12870 72 74 68 65 6c 65 73 73 2c 20 61 20 64 6f 74 6c  rtheless, a dotl
12880 6f 63 6b 20 69 73 20 61 6e 20 61 70 70 72 6f 70  ock is an approp
12890 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f  riate locking mo
128a0 64 65 20 66 6f 72 20 75 73 65 20 69 66 20 6e 6f  de for use if no
128b0 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  .** other lockin
128c0 67 20 73 74 72 61 74 65 67 79 20 69 73 20 61 76  g strategy is av
128d0 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44  ailable..**.** D
128e0 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 77  otfile locking w
128f0 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69 6e 67  orks by creating
12900 20 61 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73   a file in the s
12910 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73  ame directory as
12920 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
12930 20 61 6e 64 20 77 69 74 68 20 74 68 65 20 73 61   and with the sa
12940 6d 65 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68  me name but with
12950 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e   a ".lock" exten
12960 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54  sion added..** T
12970 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20  he existance of 
12980 61 20 6c 6f 63 6b 20 66 69 6c 65 20 69 6d 70 6c  a lock file impl
12990 69 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ies an EXCLUSIVE
129a0 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65   lock.  All othe
129b0 72 20 6c 6f 63 6b 0a 2a 2a 20 74 79 70 65 73 20  r lock.** types 
129c0 28 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45  (SHARED, RESERVE
129d0 44 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20  D, PENDING) are 
129e0 6d 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c  mapped into EXCL
129f0 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  USIVE..*/../*.**
12a00 20 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78   The file suffix
12a10 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 61   added to the da
12a20 74 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  ta base filename
12a30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
12a40 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20  ate the.** lock 
12a50 66 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  file..*/.#define
12a60 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20   DOTLOCK_SUFFIX 
12a70 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54  ".lock"../*.** T
12a80 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
12a90 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
12aa0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
12ab0 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
12ac0 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
12ad0 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
12ae0 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
12af0 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
12b00 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
12b10 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
12b20 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
12b30 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
12b40 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
12b50 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
12b60 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
12b70 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
12b80 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
12b90 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
12ba0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74  ng..**.** In dot
12bb0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69  file locking, ei
12bc0 74 68 65 72 20 61 20 6c 6f 63 6b 20 65 78 69 73  ther a lock exis
12bd0 74 73 20 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f  ts or it does no
12be0 74 2e 20 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a  t.  So in this.*
12bf0 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 43  * variation of C
12c00 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
12c10 28 29 2c 20 2a 70 52 65 73 4f 75 74 20 69 73 20  (), *pResOut is 
12c20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61  set to true if a
12c30 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65  ny lock.** is he
12c40 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61  ld on the file a
12c50 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  nd false if the 
12c60 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
12c70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12c80 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  dotlockCheckRese
12c90 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
12ca0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
12cb0 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74  pResOut) {.  int
12cc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12cd0 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
12ce0 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
12cf0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
12d00 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c  le*)id;..  Simul
12d10 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
12d20 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
12d30 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
12d40 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
12d50 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  t( pFile );..  /
12d60 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
12d70 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
12d80 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
12d90 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
12da0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
12db0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
12dc0 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 69     /* Either thi
12dd0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20  s connection or 
12de0 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65  some other conne
12df0 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d  ction in the sam
12e00 65 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a  e process.    **
12e10 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e   holds a lock on
12e20 20 74 68 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e   the file.  No n
12e30 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66 75 72  eed to check fur
12e40 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73  ther. */.    res
12e50 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c  erved = 1;.  }el
12e60 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c  se{.    /* The l
12e70 6f 63 6b 20 69 73 20 68 65 6c 64 20 69 66 20 61  ock is held if a
12e80 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c  nd only if the l
12e90 6f 63 6b 66 69 6c 65 20 65 78 69 73 74 73 20 2a  ockfile exists *
12ea0 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
12eb0 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63   *zLockFile = (c
12ec0 6f 6e 73 74 20 63 68 61 72 2a 29 70 46 69 6c 65  onst char*)pFile
12ed0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
12ee0 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  ;.    reserved =
12ef0 20 6f 73 41 63 63 65 73 73 28 7a 4c 6f 63 6b 46   osAccess(zLockF
12f00 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a  ile, 0)==0;.  }.
12f10 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
12f20 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
12f30 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20  d (dotlock)\n", 
12f40 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
12f50 73 65 72 76 65 64 29 29 3b 0a 20 20 2a 70 52 65  served));.  *pRe
12f60 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
12f70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12f80 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
12f90 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
12fa0 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
12fb0 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
12fc0 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
12fd0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
12fe0 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
12ff0 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
13000 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
13010 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
13020 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
13030 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
13040 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
13050 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
13060 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
13070 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
13080 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
13090 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
130a0 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
130b0 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
130c0 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
130d0 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
130e0 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
130f0 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
13100 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
13110 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
13120 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
13130 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
13140 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
13150 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
13160 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
13170 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
13180 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
13190 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
131a0 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
131b0 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
131c0 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
131d0 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
131e0 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
131f0 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
13200 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
13210 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
13220 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
13230 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
13240 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
13250 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
13260 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
13270 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
13280 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
13290 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
132a0 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74  ..**.** With dot
132b0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65  file locking, we
132c0 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70   really only sup
132d0 70 6f 72 74 20 73 74 61 74 65 20 28 34 29 3a 20  port state (4): 
132e0 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75  EXCLUSIVE..** Bu
132f0 74 20 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f  t we track the o
13300 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  ther locking lev
13310 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  els internally..
13320 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
13330 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65  tlockLock(sqlite
13340 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
13350 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
13360 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
13370 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
13380 20 20 69 6e 74 20 66 64 3b 0a 20 20 63 68 61 72    int fd;.  char
13390 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63   *zLockFile = (c
133a0 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
133b0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
133c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
133d0 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  K;...  /* If we 
133e0 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74  have any lock, t
133f0 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  hen the lock fil
13400 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
13410 2e 20 20 41 6c 6c 20 77 65 20 68 61 76 65 0a 20  .  All we have. 
13420 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61 64 6a   ** to do is adj
13430 75 73 74 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ust our internal
13440 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 6c   record of the l
13450 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a  ock level..  */.
13460 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
13470 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b  leLock > NO_LOCK
13480 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
13490 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
134a0 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c 77  Lock;.    /* Alw
134b0 61 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74  ays update the t
134c0 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20  imestamp on the 
134d0 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 23 69 66 64  old file */.#ifd
134e0 65 66 20 48 41 56 45 5f 55 54 49 4d 45 0a 20 20  ef HAVE_UTIME.  
134f0 20 20 75 74 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c    utime(zLockFil
13500 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a  e, NULL);.#else.
13510 20 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b      utimes(zLock
13520 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e  File, NULL);.#en
13530 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
13540 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
13550 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78  .  /* grab an ex
13560 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
13570 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
13580 65 6e 28 7a 4c 6f 63 6b 46 69 6c 65 2c 4f 5f 52  en(zLockFile,O_R
13590 44 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54 7c 4f 5f  DONLY|O_CREAT|O_
135a0 45 58 43 4c 2c 30 36 30 30 29 3b 0a 20 20 69 66  EXCL,0600);.  if
135b0 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 2f 2a  ( fd<0 ){.    /*
135c0 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f   failed to open/
135d0 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 2c  create the file,
135e0 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 61   someone else ma
135f0 79 20 68 61 76 65 20 73 74 6f 6c 65 6e 20 74 68  y have stolen th
13600 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e  e lock */.    in
13610 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
13620 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49 53 54  ;.    if( EEXIST
13630 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20   == tErrno ){.  
13640 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13650 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65  BUSY;.    } else
13660 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
13670 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
13680 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
13690 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
136a0 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53  K);.      if( IS
136b0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
136c0 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
136d0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
136e0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rrno;.      }.  
136f0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
13700 63 3b 0a 20 20 7d 20 0a 23 69 66 20 4f 53 43 4c  c;.  } .#if OSCL
13710 4f 53 45 5f 43 48 45 43 4b 5f 43 4c 4f 53 45 5f  OSE_CHECK_CLOSE_
13720 49 4f 45 52 52 0a 20 20 69 66 28 20 63 6c 6f 73  IOERR.  if( clos
13730 65 28 66 64 29 20 29 7b 0a 20 20 20 20 70 46 69  e(fd) ){.    pFi
13740 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
13750 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20  errno;.    rc = 
13760 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
13770 53 45 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20  SE;.  }.#else.  
13780 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
13790 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  le, fd, __LINE__
137a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f  );.#endif.  .  /
137b0 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
137c0 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
137d0 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  n ok */.  pFile-
137e0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
137f0 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e  leLock;.  return
13800 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
13810 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
13820 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
13830 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
13840 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
13850 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
13860 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
13870 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
13880 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
13890 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
138a0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
138b0 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
138c0 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
138d0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
138e0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
138f0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
13900 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  op..**.** When t
13910 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
13920 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b   reaches NO_LOCK
13930 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63  , delete the loc
13940 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  k file..*/.stati
13950 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c  c int dotlockUnl
13960 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
13970 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
13980 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
13990 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
139a0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72  File*)id;.  char
139b0 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63   *zLockFile = (c
139c0 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
139d0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 20 20  kingContext;..  
139e0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
139f0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
13a00 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
13a10 64 20 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63  d pid=%d (dotloc
13a20 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
13a30 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20 20 20   eFileLock,..   
13a40 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13a50 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
13a60 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
13a70 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
13a80 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ;.  .  /* no-op 
13a90 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  if possible */. 
13aa0 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
13ab0 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b  eLock==eFileLock
13ac0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
13ad0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
13ae0 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64 65   /* To downgrade
13af0 20 74 6f 20 73 68 61 72 65 64 2c 20 73 69 6d 70   to shared, simp
13b00 6c 79 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e  ly update our in
13b10 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66  ternal notion of
13b20 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73   the.  ** lock s
13b30 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74  tate.  No need t
13b40 6f 20 6d 65 73 73 20 77 69 74 68 20 74 68 65 20  o mess with the 
13b50 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20  file on disk..  
13b60 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
13b70 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
13b80 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
13b90 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
13ba0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72  _LOCK;.    retur
13bb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13bc0 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75 6c 6c  .  .  /* To full
13bd0 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  y unlock the dat
13be0 61 62 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68  abase, delete th
13bf0 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20  e lock file */. 
13c00 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
13c10 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20  ck==NO_LOCK );. 
13c20 20 69 66 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4c   if( osUnlink(zL
13c30 6f 63 6b 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  ockFile) ){.    
13c40 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 20 20  int rc = 0;.    
13c50 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
13c60 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 4e 4f 45  no;.    if( ENOE
13c70 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  NT != tErrno ){.
13c80 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48  #if OSLOCKING_CH
13c90 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20  ECK_BUSY_IOERR. 
13ca0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13cb0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
13cc0 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
13cd0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
13ce0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63  ;.#else.      rc
13cf0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
13d00 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a 20  UNLOCK;.#endif. 
13d10 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f     }.    if( IS_
13d20 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
13d30 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
13d40 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
13d50 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  o;.    }.    ret
13d60 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70  urn rc; .  }.  p
13d70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
13d80 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74  = NO_LOCK;.  ret
13d90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13da0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
13db0 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  file.  Make sure
13dc0 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65   the lock has be
13dd0 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65 66 6f  en released befo
13de0 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73  re closing..*/.s
13df0 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
13e00 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
13e10 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
13e20 20 72 63 3b 0a 20 20 69 66 28 20 69 64 20 29 7b   rc;.  if( id ){
13e30 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
13e40 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
13e50 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c 6f 63  *)id;.    dotloc
13e60 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  kUnlock(id, NO_L
13e70 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  OCK);.    sqlite
13e80 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f  3_free(pFile->lo
13e90 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20  ckingContext);. 
13ea0 20 7d 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55   }.  rc = closeU
13eb0 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 72  nixFile(id);.  r
13ec0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a  eturn rc;.}./***
13ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
13ee0 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74 2d 66  End of the dot-f
13ef0 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ile lock impleme
13f00 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
13f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
13f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
13f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
13fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13fd0 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c  ******* Begin fl
13fe0 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ock Locking ****
13ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
14010 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f 63 6b  ** Use the flock
14020 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  () system call t
14030 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  o do file lockin
14040 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29  g..**.** flock()
14050 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65   locking is like
14060 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e   dot-file lockin
14070 67 20 69 6e 20 74 68 61 74 20 74 68 65 20 76 61  g in that the va
14080 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72  rious.** fine-gr
14090 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ain locking leve
140a0 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20  ls supported by 
140b0 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c 61  SQLite are colla
140c0 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73  psed into.** a s
140d0 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76 65 20  ingle exclusive 
140e0 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20  lock.  In other 
140f0 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c 20 52  words, SHARED, R
14100 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20  ESERVED, and.** 
14110 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72  PENDING locks ar
14120 65 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  e the same thing
14130 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45   as an EXCLUSIVE
14140 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a   lock.  SQLite.*
14150 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68  * still works wh
14160 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73 2c 20  en you do this, 
14170 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63 79 20  but concurrency 
14180 69 73 20 72 65 64 75 63 65 64 20 73 69 6e 63 65  is reduced since
14190 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  .** only a singl
141a0 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 62 65  e process can be
141b0 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74   reading the dat
141c0 61 62 61 73 65 20 61 74 20 61 20 74 69 6d 65 2e  abase at a time.
141d0 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73  .**.** Omit this
141e0 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51 4c 49   section if SQLI
141f0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
14200 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72 6e 65  G_STYLE is turne
14210 64 20 6f 66 66 20 6f 72 20 69 66 0a 2a 2a 20 63  d off or if.** c
14220 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 56 58 57  ompiling for VXW
14230 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  ORKS..*/.#if SQL
14240 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
14250 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f  NG_STYLE && !OS_
14260 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 52  VXWORKS../*.** R
14270 65 74 72 79 20 66 6c 6f 63 6b 28 29 20 63 61 6c  etry flock() cal
14280 6c 73 20 74 68 61 74 20 66 61 69 6c 20 77 69 74  ls that fail wit
14290 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64 65  h EINTR.*/.#ifde
142a0 66 20 45 49 4e 54 52 0a 73 74 61 74 69 63 20 69  f EINTR.static i
142b0 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  nt robust_flock(
142c0 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b  int fd, int op){
142d0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b  .  int rc;.  do{
142e0 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f   rc = flock(fd,o
142f0 70 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30  p); }while( rc<0
14300 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
14310 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
14320 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
14330 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 61  e robust_flock(a
14340 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a 23  ,b) flock(a,b).#
14350 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a  endif.     ../*.
14360 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14370 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
14380 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
14390 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
143a0 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
143b0 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
143c0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
143d0 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
143e0 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
143f0 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
14400 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
14410 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
14420 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
14430 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
14440 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
14450 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
14460 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
14470 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
14480 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
14490 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b  c int flockCheck
144a0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
144b0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
144c0 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
144d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
144e0 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
144f0 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
14500 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
14510 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20  xFile*)id;.  .  
14520 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
14530 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
14540 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
14550 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
14560 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
14570 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  .  .  /* Check i
14580 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
14590 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
145a0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
145b0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
145c0 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
145d0 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76  CK ){.    reserv
145e0 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20  ed = 1;.  }.  . 
145f0 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65   /* Otherwise se
14600 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  e if some other 
14610 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74  process holds it
14620 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65  . */.  if( !rese
14630 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61  rved ){.    /* a
14640 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20 74 68  ttempt to get th
14650 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e  e lock */.    in
14660 74 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66  t lrc = robust_f
14670 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
14680 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42  OCK_EX | LOCK_NB
14690 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63 20  );.    if( !lrc 
146a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20  ){.      /* got 
146b0 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b  the lock, unlock
146c0 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63   it */.      lrc
146d0 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28   = robust_flock(
146e0 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55  pFile->h, LOCK_U
146f0 4e 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6c  N);.      if ( l
14700 72 63 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69  rc ) {.        i
14710 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
14720 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 75 6e  o;.        /* un
14730 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77 69 74 68  lock failed with
14740 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 23 69 66   an error */.#if
14750 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b   OSLOCKING_CHECK
14760 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20  _BUSY_IOERR.    
14770 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65      lrc = sqlite
14780 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
14790 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
147a0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
147b0 3b 0a 23 65 6c 73 65 20 0a 20 20 20 20 20 20 20  ;.#else .       
147c0 20 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f   lrc = SQLITE_IO
147d0 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 23 65 6e  ERR_UNLOCK; .#en
147e0 64 69 66 0a 20 20 20 20 20 20 20 20 69 66 28 20  dif.        if( 
147f0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
14800 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
14810 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
14820 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
14830 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20       rc = lrc;. 
14840 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14850 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
14860 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
14870 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65   errno;.      re
14880 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
14890 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73    /* someone els
148a0 65 20 6d 69 67 68 74 20 68 61 76 65 20 69 74 20  e might have it 
148b0 72 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20  reserved */.    
148c0 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72    lrc = sqliteEr
148d0 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
148e0 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
148f0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20  _IOERR_LOCK); . 
14900 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
14910 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20  _ERROR(lrc) ){. 
14920 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
14930 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
14940 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c  ;.        rc = l
14950 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
14960 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  }.  }.  OSTRACE(
14970 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
14980 64 20 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c  d %d %d (flock)\
14990 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
149a0 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 23  , reserved));..#
149b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
149c0 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
149d0 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20  RRORS.  if( (rc 
149e0 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  & SQLITE_IOERR) 
149f0 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  == SQLITE_IOERR 
14a00 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
14a10 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72  TE_OK;.    reser
14a20 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  ved=1;.  }.#endi
14a30 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
14a40 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
14a50 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f  RORS */.  *pResO
14a60 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
14a70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
14a80 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
14a90 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
14aa0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
14ab0 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
14ac0 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
14ad0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
14ae0 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
14af0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
14b00 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
14b10 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
14b20 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
14b30 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
14b40 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
14b50 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
14b60 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
14b70 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
14b80 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
14b90 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
14ba0 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
14bb0 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
14bc0 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
14bd0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
14be0 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
14bf0 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
14c00 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
14c10 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
14c20 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
14c30 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
14c40 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
14c50 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
14c60 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
14c70 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
14c80 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
14c90 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
14ca0 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
14cb0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
14cc0 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
14cd0 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
14ce0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
14cf0 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
14d00 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
14d10 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
14d20 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
14d30 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20  E.**.** flock() 
14d40 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70  only really supp
14d50 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  ort EXCLUSIVE lo
14d60 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69  cks.  We track i
14d70 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c  ntermediate.** l
14d80 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68  ock states in th
14d90 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  e sqlite3_file s
14da0 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c  tructure, but al
14db0 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f  l locks SHARED o
14dc0 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72  r.** above are r
14dd0 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20  eally EXCLUSIVE 
14de0 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64  locks and exclud
14df0 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63  e all other proc
14e00 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63  esses from.** ac
14e10 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a  cess the file..*
14e20 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14e30 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
14e40 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
14e50 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
14e60 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
14e70 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
14e80 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
14e90 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
14ea0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
14eb0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
14ec0 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63  Lock) {.  int rc
14ed0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14ee0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
14ef0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
14f00 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
14f10 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65  e );..  /* if we
14f20 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
14f30 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c  lock, it is excl
14f40 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75  usive.  .  ** Ju
14f50 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20  st adjust level 
14f60 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74  and punt on outt
14f70 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20  a here. */.  if 
14f80 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
14f90 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20  k > NO_LOCK) {. 
14fa0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
14fb0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
14fc0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14fd0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
14fe0 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75  /* grab an exclu
14ff0 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a  sive lock */.  .
15000 20 20 69 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f    if (robust_flo
15010 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
15020 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29  K_EX | LOCK_NB))
15030 20 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e   {.    int tErrn
15040 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f  o = errno;.    /
15050 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75  * didn't get, mu
15060 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20  st be busy */.  
15070 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
15080 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
15090 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
150a0 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
150b0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
150c0 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
150d0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
150e0 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d   = tErrno;.    }
150f0 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
15100 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74  /* got it, set t
15110 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75  he type and retu
15120 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69  rn ok */.    pFi
15130 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
15140 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20  eFileLock;.  }. 
15150 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
15160 20 20 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f     %d %s %s (flo
15170 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
15180 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69  , azFileLock(eFi
15190 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20  leLock), .      
151a0 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
151b0 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
151c0 6c 65 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53  led"));.#ifdef S
151d0 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
151e0 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  CK_LOCK_ERRORS. 
151f0 20 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54   if( (rc & SQLIT
15200 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49  E_IOERR) == SQLI
15210 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
15220 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
15230 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
15240 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
15250 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
15260 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
15270 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  }.../*.** Lower 
15280 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
15290 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
152a0 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
152b0 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
152c0 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
152d0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
152e0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
152f0 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
15300 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
15310 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
15320 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
15330 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
15340 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
15350 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
15360 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
15370 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
15380 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  ockUnlock(sqlite
15390 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
153a0 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
153b0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
153c0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
153d0 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
153e0 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
153f0 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
15400 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 66  was %d pid=%d (f
15410 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
15420 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
15430 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
15440 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70  >eFileLock, getp
15450 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74  id()));.  assert
15460 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
15470 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
15480 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
15490 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
154a0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
154b0 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
154c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
154d0 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
154e0 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20  shared can just 
154f0 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77  be set because w
15500 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e  e always have an
15510 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20   exclusive */.  
15520 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if (eFileLock==S
15530 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  HARED_LOCK) {.  
15540 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
15550 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
15560 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15570 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
15580 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e  * no, really, un
15590 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72  lock. */.  if( r
155a0 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
155b0 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29  e->h, LOCK_UN) )
155c0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
155d0 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
155e0 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 65 74  K_ERRORS.    ret
155f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
15600 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
15610 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
15620 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20  K_ERRORS */.    
15630 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
15640 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65  ERR_UNLOCK;.  }e
15650 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
15660 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
15670 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  OCK;.    return 
15680 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
15690 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
156a0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
156b0 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73  int flockClose(s
156c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
156d0 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20   {.  if( id ){. 
156e0 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69     flockUnlock(i
156f0 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d  d, NO_LOCK);.  }
15700 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55  .  return closeU
15710 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a  nixFile(id);.}..
15720 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
15730 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
15740 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57  STYLE && !OS_VXW
15750 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ORK */../*******
15760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
15770 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f   of the flock lo
15780 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
15790 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
157a0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
157b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
157c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
157d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
157e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
157f0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
15800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15840 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
15850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15860 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65  * Begin Named Se
15870 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20  maphore Locking 
15880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15890 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e  ********.**.** N
158a0 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
158b0 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73  ocking is only s
158c0 75 70 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f  upported on VxWo
158d0 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70  rks..**.** Semap
158e0 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
158f0 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e  like dot-lock an
15900 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20  d flock in that 
15910 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a  it really only.*
15920 2a 20 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55  * supports EXCLU
15930 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f  SIVE locking.  O
15940 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f  nly a single pro
15950 63 65 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72  cess can read or
15960 20 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61   write.** the da
15970 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 61  tabase file at a
15980 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64   time.  This red
15990 75 63 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63  uces potential c
159a0 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a  oncurrency, but.
159b0 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63  ** makes the loc
159c0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
159d0 20 6d 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f   much easier..*/
159e0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
159f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
15a00 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
15a10 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
15a20 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
15a30 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
15a40 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
15a50 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
15a60 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
15a70 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
15a80 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
15a90 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
15aa0 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
15ab0 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
15ac0 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
15ad0 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
15ae0 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
15af0 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
15b00 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
15b10 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
15b20 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 68 65  tatic int semChe
15b30 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
15b40 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
15b50 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b   int *pResOut) {
15b60 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
15b70 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
15b80 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
15b90 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
15ba0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
15bb0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
15bc0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
15bd0 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
15be0 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
15bf0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
15c00 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  ;..  /* Check if
15c10 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
15c20 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
15c30 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
15c40 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
15c50 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
15c60 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
15c70 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  d = 1;.  }.  .  
15c80 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
15c90 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
15ca0 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
15cb0 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72   */.  if( !reser
15cc0 76 65 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74  ved ){.    sem_t
15cd0 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
15ce0 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20  pInode->pSem;.  
15cf0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
15d00 61 74 42 75 66 3b 0a 0a 20 20 20 20 69 66 28 20  atBuf;..    if( 
15d10 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d  sem_trywait(pSem
15d20 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69  )==-1 ){.      i
15d30 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
15d40 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41 47  o;.      if( EAG
15d50 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b  AIN != tErrno ){
15d60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
15d70 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
15d80 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
15d90 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
15da0 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b  CKRESERVEDLOCK);
15db0 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
15dc0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
15dd0 6e 6f 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  no;.      } else
15de0 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 6f   {.        /* so
15df0 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 74  meone else has t
15e00 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65 20  he lock when we 
15e10 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a  are in NO_LOCK *
15e20 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 72 76  /.        reserv
15e30 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46 69  ed = (pFile->eFi
15e40 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44 5f  leLock < SHARED_
15e50 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
15e60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15e70 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61 76 65  /* we could have
15e80 20 69 74 20 69 66 20 77 65 20 77 61 6e 74 20 69   it if we want i
15e90 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70  t */.      sem_p
15ea0 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d  ost(pSem);.    }
15eb0 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
15ec0 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
15ed0 20 25 64 20 25 64 20 28 73 65 6d 29 5c 6e 22 2c   %d %d (sem)\n",
15ee0 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
15ef0 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70  eserved));..  *p
15f00 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
15f10 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
15f20 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
15f30 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
15f40 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
15f50 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
15f60 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
15f70 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
15f80 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
15f90 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
15fa0 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
15fb0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
15fc0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
15fd0 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
15fe0 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
15ff0 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
16000 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
16010 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
16020 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
16030 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
16040 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
16050 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
16060 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
16070 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
16080 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
16090 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
160a0 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
160b0 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
160c0 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
160d0 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
160e0 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
160f0 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
16100 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
16110 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
16120 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
16130 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
16140 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
16150 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
16160 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
16170 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
16180 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
16190 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
161a0 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
161b0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
161c0 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
161d0 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61  USIVE.**.** Sema
161e0 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79  phore locks only
161f0 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20   really support 
16200 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e  EXCLUSIVE locks.
16210 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72    We track inter
16220 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20  mediate.** lock 
16230 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71  states in the sq
16240 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63  lite3_file struc
16250 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f  ture, but all lo
16260 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a  cks SHARED or.**
16270 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c   above are reall
16280 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  y EXCLUSIVE lock
16290 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c  s and exclude al
162a0 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  l other processe
162b0 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73  s from.** access
162c0 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
162d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
162e0 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
162f0 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
16300 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
16310 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
16320 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
16330 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
16340 69 63 20 69 6e 74 20 73 65 6d 4c 6f 63 6b 28 73  ic int semLock(s
16350 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
16360 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
16370 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
16380 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
16390 29 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20  )id;.  int fd;. 
163a0 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70   sem_t *pSem = p
163b0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  File->pInode->pS
163c0 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  em;.  int rc = S
163d0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
163e0 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  if we already ha
163f0 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73  ve a lock, it is
16400 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20   exclusive.  .  
16410 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c  ** Just adjust l
16420 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e  evel and punt on
16430 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a   outta here. */.
16440 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69    if (pFile->eFi
16450 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b  leLock > NO_LOCK
16460 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  ) {.    pFile->e
16470 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
16480 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53  Lock;.    rc = S
16490 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f  QLITE_OK;.    go
164a0 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b  to sem_end_lock;
164b0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63  .  }.  .  /* loc
164c0 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20  k semaphore now 
164d0 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65  but bail out whe
164e0 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64  n already locked
164f0 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74  . */.  if( sem_t
16500 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31  rywait(pSem)==-1
16510 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
16520 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f  ITE_BUSY;.    go
16530 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b  to sem_end_lock;
16540 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69  .  }..  /* got i
16550 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
16560 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
16570 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
16580 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
16590 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a  .. sem_end_lock:
165a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
165b0 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
165c0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
165d0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
165e0 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
165f0 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
16600 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
16610 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
16620 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
16630 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
16640 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
16650 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
16660 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
16670 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
16680 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
16690 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
166a0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
166b0 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 55 6e  static int semUn
166c0 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
166d0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
166e0 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
166f0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
16700 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d  xFile*)id;.  sem
16710 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65  _t *pSem = pFile
16720 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a  ->pInode->pSem;.
16730 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
16740 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
16750 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  em );.  OSTRACE(
16760 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
16770 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 73  was %d pid=%d (s
16780 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  em)\n", pFile->h
16790 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20 20  , eFileLock,..  
167a0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
167b0 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  k, getpid()));. 
167c0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
167d0 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
167e0 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
167f0 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
16800 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
16810 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63  leLock==eFileLoc
16820 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
16830 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
16840 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61   .  /* shared ca
16850 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65  n just be set be
16860 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20  cause we always 
16870 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76  have an exclusiv
16880 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65  e */.  if (eFile
16890 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
168a0 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
168b0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
168c0 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72  eLock;.    retur
168d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
168e0 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61  .  .  /* no, rea
168f0 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20  lly unlock. */. 
16900 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70   if ( sem_post(p
16910 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20  Sem)==-1 ) {.   
16920 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20   int rc, tErrno 
16930 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20  = errno;.    rc 
16940 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
16950 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
16960 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
16970 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  _UNLOCK);.    if
16980 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
16990 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  rc) ){.      pFi
169a0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
169b0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
169c0 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20    return rc; .  
169d0 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  }.  pFile->eFile
169e0 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
169f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16a00 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c  OK;.}../*. ** Cl
16a10 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a  ose a file.. */.
16a20 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 6c  static int semCl
16a30 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
16a40 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64   *id) {.  if( id
16a50 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   ){.    unixFile
16a60 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
16a70 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d  ile*)id;.    sem
16a80 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
16a90 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  CK);.    assert(
16aa0 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e   pFile );.    un
16ab0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
16ac0 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65      releaseInode
16ad0 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20  Info(pFile);.   
16ae0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
16af0 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78  );.    closeUnix
16b00 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20  File(id);.  }.  
16b10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16b20 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  ;.}..#endif /* O
16b30 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a  S_VXWORKS */./*.
16b40 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f  ** Named semapho
16b50 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e  re locking is on
16b60 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
16b70 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  VxWorks..**.****
16b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
16b90 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d  of the named sem
16ba0 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c  aphore lock impl
16bb0 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
16bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
16bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a  **********/.../*
16c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
16c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
16c90 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  AFP Locking ****
16ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
16cc0 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65 20 41  .** AFP is the A
16cd0 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f 74  pple Filing Prot
16ce0 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20 61 20  ocol.  AFP is a 
16cf0 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79 73 74  network filesyst
16d00 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41  em found.** on A
16d10 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20 63  pple Macintosh c
16d20 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74 68 20  omputers - both 
16d30 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a  OS9 and OSX..**.
16d40 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79 20 69  ** Third-party i
16d50 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
16d60 66 20 41 46 50 20 61 72 65 20 61 76 61 69 6c 61  f AFP are availa
16d70 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73 20 63  ble.  But this c
16d80 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79  ode here.** only
16d90 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a   works on OSX..*
16da0 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  /..#if defined(_
16db0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
16dc0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
16dd0 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54  NG_STYLE./*.** T
16de0 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  he afpLockingCon
16df0 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20 63  text structure c
16e00 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20  ontains all afp 
16e10 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20 73 74  lock specific st
16e20 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ate.*/.typedef s
16e30 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67  truct afpLocking
16e40 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b 69  Context afpLocki
16e50 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63  ngContext;.struc
16e60 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
16e70 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65 73 65  ext {.  int rese
16e80 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68  rved;.  const ch
16e90 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20  ar *dbPath;     
16ea0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
16eb0 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
16ec0 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42   */.};..struct B
16ed0 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a  yteRangeLockPB2.
16ee0 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  {.  unsigned lon
16ef0 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20  g long offset;  
16f00 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20        /* offset 
16f10 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f  to first byte to
16f20 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
16f30 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65  ned long long le
16f40 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f 2a 20  ngth;        /* 
16f50 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  nbr of bytes to 
16f60 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
16f70 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74  ed long long ret
16f80 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e  RangeStart; /* n
16f90 62 72 20 6f 66 20 31 73 74 20 62 79 74 65 20 6c  br of 1st byte l
16fa0 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65 73 73  ocked if success
16fb0 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ful */.  unsigne
16fc0 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61  d char unLockFla
16fd0 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20  g;         /* 1 
16fe0 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f  = unlock, 0 = lo
16ff0 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
17000 20 63 68 61 72 20 73 74 61 72 74 45 6e 64 46 6c   char startEndFl
17010 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d 72  ag;       /* 1=r
17020 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72  el to end of for
17030 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74 61 72  k, 0=rel to star
17040 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20  t */.  int fd;  
17050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17060 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65           /* file
17070 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63 20 74   desc to assoc t
17080 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f  his lock with */
17090 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66 70  .};..#define afp
170a0 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32  fsByteRangeLock2
170b0 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f 49 4f  FSCTL        _IO
170c0 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75  WR('z', 23, stru
170d0 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
170e0 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  PB2)../*.** This
170f0 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 6f   is a utility fo
17100 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63 6c 65  r setting or cle
17110 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61 6e 67  aring a bit-rang
17120 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20  e lock on an.** 
17130 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a  AFP filesystem..
17140 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  ** .** Return SQ
17150 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
17160 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ss, SQLITE_BUSY 
17170 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
17180 74 61 74 69 63 20 69 6e 74 20 61 66 70 53 65 74  tatic int afpSet
17190 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68  Lock(.  const ch
171a0 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20  ar *path,       
171b0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
171c0 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  f the file to be
171d0 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63   locked or unloc
171e0 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ked */.  unixFil
171f0 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
17200 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
17210 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
17220 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73  on path */.  uns
17230 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
17240 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a 20 46  offset,     /* F
17250 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65 20  irst byte to be 
17260 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69  locked */.  unsi
17270 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c  gned long long l
17280 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75  ength,     /* Nu
17290 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
172a0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73   lock */.  int s
172b0 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20 20  etLockFlag      
172c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
172d0 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20  e to set lock.  
172e0 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72 20 6c  False to clear l
172f0 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ock */.){.  stru
17300 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
17310 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20 65 72  PB2 pb;.  int er
17320 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63  r;.  .  pb.unLoc
17330 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46  kFlag = setLockF
17340 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70  lag ? 0 : 1;.  p
17350 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d  b.startEndFlag =
17360 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20   0;.  pb.offset 
17370 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c  = offset;.  pb.l
17380 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20  ength = length; 
17390 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69 6c 65  .  pb.fd = pFile
173a0 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43  ->h;.  .  OSTRAC
173b0 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b  E(("AFPSETLOCK [
173c0 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69 6e 20  %s] for %d%s in 
173d0 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c  range %llx:%llx\
173e0 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f 63  n", .    (setLoc
173f0 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22  kFlag?"ON":"OFF"
17400 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62  ), pFile->h, (pb
17410 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61  .fd==-1?"[testva
17420 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f  l-1]":""),.    o
17430 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b  ffset, length));
17440 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70  .  err = fsctl(p
17450 61 74 68 2c 20 61 66 70 66 73 42 79 74 65 52 61  ath, afpfsByteRa
17460 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26  ngeLock2FSCTL, &
17470 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65  pb, 0);.  if ( e
17480 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69  rr==-1 ) {.    i
17490 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 74  nt rc;.    int t
174a0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
174b0 20 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50     OSTRACE(("AFP
174c0 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74  SETLOCK failed t
174d0 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27 20 25  o fsctl() '%s' %
174e0 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
174f0 20 20 20 20 20 20 70 61 74 68 2c 20 74 45 72 72        path, tErr
17500 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74 45 72  no, strerror(tEr
17510 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66 20 53  rno)));.#ifdef S
17520 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50  QLITE_IGNORE_AFP
17530 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20  _LOCK_ERRORS.   
17540 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
17550 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20  Y;.#else.    rc 
17560 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
17570 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
17580 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
17590 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63 6b 46          setLockF
175a0 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45  lag ? SQLITE_IOE
175b0 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45  RR_LOCK : SQLITE
175c0 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
175d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
175e0 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b  _IGNORE_AFP_LOCK
175f0 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69  _ERRORS */.    i
17600 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
17610 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46  (rc) ){.      pF
17620 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
17630 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20   tErrno;.    }. 
17640 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17650 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74  } else {.    ret
17660 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
17670 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
17680 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
17690 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
176a0 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
176b0 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
176c0 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
176d0 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
176e0 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
176f0 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
17700 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
17710 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
17720 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
17730 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
17740 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
17750 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
17760 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
17770 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
17780 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
17790 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
177a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
177b0 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  fpCheckReservedL
177c0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
177d0 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
177e0 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ut){.  int rc = 
177f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
17800 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
17810 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
17820 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
17830 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
17840 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a  ntext *context;.
17850 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45    .  SimulateIOE
17860 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
17870 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
17880 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
17890 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
178a0 6c 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20  le );.  context 
178b0 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
178c0 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
178d0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
178e0 20 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65   if( context->re
178f0 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70  served ){.    *p
17900 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20  ResOut = 1;.    
17910 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17920 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65  ;.  }.  unixEnte
17930 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63  rMutex(); /* Bec
17940 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ause pFile->pIno
17950 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72  de is shared acr
17960 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20  oss threads */. 
17970 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
17980 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
17990 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
179a0 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
179b0 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
179c0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
179d0 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
179e0 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
179f0 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
17a00 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
17a10 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
17a20 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20  lds it..   */.  
17a30 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b  if( !reserved ){
17a40 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65  .    /* lock the
17a50 20 52 45 53 45 52 56 45 44 20 62 79 74 65 20 2a   RESERVED byte *
17a60 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20  /.    int lrc = 
17a70 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
17a80 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
17a90 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
17aa0 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66  , 1,1);  .    if
17ab0 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63  ( SQLITE_OK==lrc
17ac0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20   ){.      /* if 
17ad0 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20  we succeeded in 
17ae0 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72  taking the reser
17af0 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b  ved lock, unlock
17b00 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20   it to restore. 
17b10 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67       ** the orig
17b20 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20  inal state */.  
17b30 20 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74      lrc = afpSet
17b40 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
17b50 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
17b60 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30  ERVED_BYTE, 1, 0
17b70 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
17b80 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66        /* if we f
17b90 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65  ailed to get the
17ba0 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f   lock then someo
17bb0 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76  ne else must hav
17bc0 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  e it */.      re
17bd0 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
17be0 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  }.    if( IS_LOC
17bf0 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a  K_ERROR(lrc) ){.
17c00 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20        rc=lrc;.  
17c10 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69    }.  }.  .  uni
17c20 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
17c30 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
17c40 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
17c50 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
17c60 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
17c70 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f  d));.  .  *pResO
17c80 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
17c90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17ca0 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
17cb0 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
17cc0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
17cd0 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
17ce0 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
17cf0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
17d00 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
17d10 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
17d20 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
17d30 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
17d40 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
17d50 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
17d60 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
17d70 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
17d80 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
17d90 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
17da0 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
17db0 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
17dc0 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
17dd0 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
17de0 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
17df0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
17e00 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
17e10 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
17e20 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
17e30 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
17e40 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
17e50 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
17e60 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
17e70 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
17e80 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
17e90 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
17ea0 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
17eb0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
17ec0 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
17ed0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
17ee0 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
17ef0 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
17f00 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
17f10 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
17f20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
17f30 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
17f40 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
17f50 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
17f60 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
17f70 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
17f80 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
17f90 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
17fa0 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
17fb0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
17fc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
17fd0 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  pLock(sqlite3_fi
17fe0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
17ff0 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  eLock){.  int rc
18000 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
18010 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
18020 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
18030 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
18040 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
18050 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c  ->pInode;.  afpL
18060 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63  ockingContext *c
18070 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63  ontext = (afpLoc
18080 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70  kingContext *) p
18090 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
180a0 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72  text;.  .  asser
180b0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
180c0 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
180d0 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c  %d %s was %s(%s,
180e0 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 29  %d) pid=%d (afp)
180f0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
18100 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
18110 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
18120 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c   azFileLock(pFil
18130 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20  e->eFileLock),. 
18140 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
18150 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69  Lock(pInode->eFi
18160 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d  leLock), pInode-
18170 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74 70 69  >nShared , getpi
18180 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  d()));..  /* If 
18190 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
181a0 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
181b0 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
181c0 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
181d0 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64    ** unixFile, d
181e0 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74  o nothing. Don't
181f0 20 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64   use the afp_end
18200 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
18210 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e  , as.  ** unixEn
18220 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
18230 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
18240 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
18250 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
18260 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
18270 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
18280 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72     %d %s ok (alr
18290 65 61 64 79 20 68 65 6c 64 29 20 28 61 66 70 29  eady held) (afp)
182a0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
182b0 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
182c0 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29  Lock(eFileLock))
182d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
182e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
182f0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
18300 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63   locking sequenc
18310 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a  e is correct.  *
18320 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20  *  (1) We never 
18330 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b  move from unlock
18340 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68  ed to anything h
18350 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65  igher than share
18360 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32  d lock..  **  (2
18370 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65  ) SQLite never e
18380 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73  xplicitly reques
18390 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b  ts a pendig lock
183a0 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68  ..  **  (3) A sh
183b0 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77  ared lock is alw
183c0 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20  ays held when a 
183d0 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20  reserve lock is 
183e0 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
183f0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
18400 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  >eFileLock!=NO_L
18410 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
18420 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
18430 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
18440 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
18450 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
18460 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52  eFileLock!=RESER
18470 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c  VED_LOCK || pFil
18480 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
18490 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
184a0 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20    /* This mutex 
184b0 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73  is needed becaus
184c0 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  e pFile->pInode 
184d0 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
184e0 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20   threads.  */.  
184f0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
18500 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
18510 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f  le->pInode;..  /
18520 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64  * If some thread
18530 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
18540 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61  has a lock via a
18550 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46   different unixF
18560 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65  ile*.  ** handle
18570 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20   that precludes 
18580 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
18590 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e  ck, return BUSY.
185a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69  .  */.  if( (pFi
185b0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70  le->eFileLock!=p
185c0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
185d0 20 26 26 20 0a 20 20 20 20 20 20 20 28 70 49 6e   && .       (pIn
185e0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ode->eFileLock>=
185f0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20  PENDING_LOCK || 
18600 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
18610 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a  _LOCK)).     ){.
18620 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18630 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61  BUSY;.    goto a
18640 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  fp_end_lock;.  }
18650 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 20 53 48  .  .  /* If a SH
18660 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71  ARED lock is req
18670 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65  uested, and some
18680 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68   thread using th
18690 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20  is PID already. 
186a0 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45 44   ** has a SHARED
186b0 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63   or RESERVED loc
186c0 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e  k, then incremen
186d0 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  t reference coun
186e0 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75  ts and.  ** retu
186f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20  rn SQLITE_OK..  
18700 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
18710 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
18720 26 26 20 0a 20 20 20 20 20 28 70 49 6e 6f 64 65  && .     (pInode
18730 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ->eFileLock==SHA
18740 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f  RED_LOCK || pIno
18750 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52  de->eFileLock==R
18760 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b  ESERVED_LOCK) ){
18770 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69  .    assert( eFi
18780 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
18790 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  OCK );.    asser
187a0 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
187b0 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ock==0 );.    as
187c0 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
187d0 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70  hared>0 );.    p
187e0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
187f0 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
18800 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
18810 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  ed++;.    pInode
18820 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67  ->nLock++;.    g
18830 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
18840 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20  ;.  }.    .  /* 
18850 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
18860 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20  s needed before 
18870 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52  acquiring a SHAR
18880 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f  ED lock and befo
18890 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e  re.  ** acquirin
188a0 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  g an EXCLUSIVE l
188b0 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48  ock.  For the SH
188c0 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50  ARED lock, the P
188d0 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a  ENDING will.  **
188e0 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20   be released..  
188f0 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
18900 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
18910 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65  .      || (eFile
18920 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
18930 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  LOCK && pFile->e
18940 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47  FileLock<PENDING
18950 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20  _LOCK).  ){.    
18960 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  int failed;.    
18970 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
18980 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
18990 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
189a0 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b  ING_BYTE, 1, 1);
189b0 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 29  .    if (failed)
189c0 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61   {.      rc = fa
189d0 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f  iled;.      goto
189e0 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
189f0 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a     }.  }.  .  /*
18a00 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73   If control gets
18a10 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
18a20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f  then actually go
18a30 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a   ahead and make.
18a40 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73    ** operating s
18a50 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20  ystem calls for 
18a60 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f  the specified lo
18a70 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ck..  */.  if( e
18a80 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
18a90 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74  _LOCK ){.    int
18aa0 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63   lrc1, lrc2, lrc
18ab0 31 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20  1Errno = 0;.    
18ac0 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20  long lk, mask;. 
18ad0 20 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20     .    assert( 
18ae0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
18af0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
18b00 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
18b10 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ock==0 );.      
18b20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28 73    .    mask = (s
18b30 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29 20  izeof(long)==8) 
18b40 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20  ? LARGEST_INT64 
18b50 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20  : 0x7fffffff;.  
18b60 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
18b70 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45   read-lock SHARE
18b80 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a  D_LOCK */.    /*
18b90 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20 71   note that the q
18ba0 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61  uality of the ra
18bb0 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74  ndomness doesn't
18bc0 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75 63   matter that muc
18bd0 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61  h */.    lk = ra
18be0 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49 6e  ndom(); .    pIn
18bf0 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 20  ode->sharedByte 
18c00 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53  = (lk & mask)%(S
18c10 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b  HARED_SIZE - 1);
18c20 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70 53  .    lrc1 = afpS
18c30 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
18c40 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a  dbPath, pFile, .
18c50 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
18c60 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73  _FIRST+pInode->s
18c70 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29  haredByte, 1, 1)
18c80 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
18c90 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 7b  K_ERROR(lrc1) ){
18ca0 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e 6f  .      lrc1Errno
18cb0 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   = pFile->lastEr
18cc0 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  rno;.    }.    /
18cd0 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f  * Drop the tempo
18ce0 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63  rary PENDING loc
18cf0 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20  k */.    lrc2 = 
18d00 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
18d10 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
18d20 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
18d30 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20   1, 0);.    .   
18d40 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
18d50 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20  OR(lrc1) ) {.   
18d60 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
18d70 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b  rno = lrc1Errno;
18d80 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
18d90 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
18da0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
18db0 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43   else if( IS_LOC
18dc0 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b  K_ERROR(lrc2) ){
18dd0 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32  .      rc = lrc2
18de0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
18df0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
18e00 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21   else if( lrc1 !
18e10 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a  = SQLITE_OK ) {.
18e20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
18e30 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
18e40 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
18e50 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
18e60 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  CK;.      pInode
18e70 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20  ->nLock++;.     
18e80 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
18e90 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
18ea0 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
18eb0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
18ec0 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K && pInode->nSh
18ed0 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  ared>1 ){.    /*
18ee0 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
18ef0 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
18f00 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
18f10 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
18f20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f       ** same pro
18f30 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f  cess is still ho
18f40 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  lding a shared l
18f50 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ock. */.    rc =
18f60 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
18f70 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
18f80 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f  e request was fo
18f90 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
18fa0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
18fb0 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73   It is.    ** as
18fc0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65  sumed that there
18fd0 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20   is a SHARED or 
18fe0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
18ff0 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
19000 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
19010 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d      int failed =
19020 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
19030 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  0!=pFile->eFileL
19040 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65  ock );.    if (e
19050 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45  FileLock >= RESE
19060 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69  RVED_LOCK && pFi
19070 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20  le->eFileLock < 
19080 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b  RESERVED_LOCK) {
19090 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75  .        /* Acqu
190a0 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c  ire a RESERVED l
190b0 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  ock */.        f
190c0 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
190d0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
190e0 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
190f0 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a  VED_BYTE, 1,1);.
19100 20 20 20 20 20 20 69 66 28 20 21 66 61 69 6c 65        if( !faile
19110 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  d ){.        con
19120 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d  text->reserved =
19130 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
19140 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c 65  }.    if (!faile
19150 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d  d && eFileLock =
19160 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
19170 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71  ) {.      /* Acq
19180 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
19190 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  E lock */.      
191a0 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f    .      /* Remo
191b0 76 65 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  ve the shared lo
191c0 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67  ck before trying
191d0 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27   the range.  we'
191e0 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20  ll need to .    
191f0 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68    ** reestablish
19200 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
19210 20 69 66 20 77 65 20 63 61 6e 27 74 20 67 65 74   if we can't get
19220 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a   the  afpUnlock.
19230 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
19240 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66  f( !(failed = af
19250 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
19260 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
19270 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a   SHARED_FIRST +.
19280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19290 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d           pInode-
192a0 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
192b0 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  0)) ){.        i
192c0 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c  nt failed2 = SQL
192d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
192e0 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20  /* now attemmpt 
192f0 74 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75  to get the exclu
19300 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20  sive lock range 
19310 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65  */.        faile
19320 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
19330 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
19340 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
19350 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20  RST, .          
19360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19370 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45       SHARED_SIZE
19380 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
19390 28 20 66 61 69 6c 65 64 20 26 26 20 28 66 61 69  ( failed && (fai
193a0 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63  led2 = afpSetLoc
193b0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
193c0 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
193d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193e0 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b    SHARED_FIRST +
193f0 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42   pInode->sharedB
19400 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20  yte, 1, 1)) ){. 
19410 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27           /* Can'
19420 74 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68  t reestablish th
19430 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20  e shared lock.  
19440 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61  Sqlite can't dea
19450 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20 20  l, this is.     
19460 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63       ** a critic
19470 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20  al I/O error.   
19480 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
19490 20 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65      rc = ((faile
194a0 64 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  d & SQLITE_IOERR
194b0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  ) == SQLITE_IOER
194c0 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a  R) ? failed2 : .
194d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
194e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
194f0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
19500 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
19510 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20         } .      
19520 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
19530 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20  c = failed; .   
19540 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
19550 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  f( failed ){.   
19560 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a     rc = failed;.
19570 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69      }.  }.  .  i
19580 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19590 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
195a0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
195b0 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  Lock;.    pInode
195c0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
195d0 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65  ileLock;.  }else
195e0 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
195f0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
19600 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
19610 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
19620 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
19630 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
19640 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
19650 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  .  .afp_end_lock
19660 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
19670 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
19680 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
19690 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %s (afp)\n", pFi
196a0 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63  le->h, azFileLoc
196b0 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20  k(eFileLock), . 
196c0 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
196d0 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
196e0 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74  failed"));.  ret
196f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19700 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
19710 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
19720 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
19730 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
19740 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
19750 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
19760 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
19770 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
19780 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
19790 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
197a0 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
197b0 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
197c0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
197d0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
197e0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
197f0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
19800 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73   int afpUnlock(s
19810 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
19820 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
19830 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
19840 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
19850 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
19860 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
19870 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
19880 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  de;.  afpLocking
19890 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
198a0 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
198b0 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
198c0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
198d0 20 20 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64    int skipShared
198e0 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
198f0 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68  ITE_TEST.  int h
19900 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e   = pFile->h;.#en
19910 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
19920 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
19930 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
19940 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20  d was %d(%d,%d) 
19950 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c  pid=%d (afp)\n",
19960 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
19970 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
19980 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
19990 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
199a0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
199b0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  le->pInode->nSha
199c0 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  red,.           
199d0 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61  getpid()));..  a
199e0 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
199f0 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
19a00 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
19a10 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f  ileLock<=eFileLo
19a20 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
19a30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
19a40 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
19a50 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
19a60 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
19a70 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
19a80 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20  nShared!=0 );.  
19a90 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
19aa0 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
19ab0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
19ac0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
19ad0 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  k==pFile->eFileL
19ae0 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c  ock );.    Simul
19af0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
19b00 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  (1);.    Simulat
19b10 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
19b20 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49   ).    SimulateI
19b30 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
19b40 0a 20 20 20 20 0a 23 69 66 6e 64 65 66 20 4e 44  .    .#ifndef ND
19b50 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e  EBUG.    /* When
19b60 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b   reducing a lock
19b70 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72   such that other
19b80 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73   processes can s
19b90 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64  tart.    ** read
19ba0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
19bb0 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b   file again, mak
19bc0 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a  e sure that the.
19bd0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
19be0 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75  on counter was u
19bf0 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61  pdated if any pa
19c00 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
19c10 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  se.    ** file c
19c20 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20  hanged.  If the 
19c30 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
19c40 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74  ter is not updat
19c50 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  ed,.    ** other
19c60 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20   connections to 
19c70 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69  the same file mi
19c80 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20  ght not realize 
19c90 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
19ca0 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64  file has changed
19cb0 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74   and hence might
19cc0 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75   not know to flu
19cd0 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20  sh their.    ** 
19ce0 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20  cache.  The use 
19cf0 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65  of a stale cache
19d00 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
19d10 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
19d20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
19d30 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f  ert( pFile->inNo
19d40 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20  rmalWrite==0.   
19d50 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65          || pFile
19d60 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20  ->dbUpdate==0.  
19d70 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c           || pFil
19d80 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  e->transCntrChng
19d90 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  ==1 );.    pFile
19da0 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20  ->inNormalWrite 
19db0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = 0;.#endif.    
19dc0 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
19dd0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
19de0 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
19df0 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
19e00 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
19e10 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45  th, pFile, SHARE
19e20 44 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f  D_FIRST, SHARED_
19e30 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20  SIZE, 0);.      
19e40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19e50 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d  K && (eFileLock=
19e60 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
19e70 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
19e80 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  1) ){.        /*
19e90 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69   only re-establi
19ea0 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
19eb0 63 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  ck if necessary 
19ec0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  */.        int s
19ed0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20  haredLockByte = 
19ee0 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e  SHARED_FIRST+pIn
19ef0 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b  ode->sharedByte;
19f00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66  .        rc = af
19f10 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
19f20 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
19f30 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c   sharedLockByte,
19f40 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 20   1, 1);.      } 
19f50 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73  else {.        s
19f60 6b 69 70 53 68 61 72 65 64 20 3d 20 31 3b 0a 20  kipShared = 1;. 
19f70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
19f80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19f90 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  OK && pFile->eFi
19fa0 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f  leLock>=PENDING_
19fb0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
19fc0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
19fd0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
19fe0 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59  File, PENDING_BY
19ff0 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d  TE, 1, 0);.    }
1a000 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51   .    if( rc==SQ
1a010 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65  LITE_OK && pFile
1a020 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53  ->eFileLock>=RES
1a030 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f  ERVED_LOCK && co
1a040 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
1a050 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66  ){.      rc = af
1a060 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
1a070 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
1a080 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
1a090 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  1, 0);.      if(
1a0a0 20 21 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20   !rc ){ .       
1a0b0 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
1a0c0 65 64 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d  ed = 0; .      }
1a0d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1a0e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1a0f0 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
1a100 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64  ED_LOCK || pInod
1a110 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a  e->nShared>1)){.
1a120 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
1a130 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
1a140 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _LOCK;.    }.  }
1a150 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1a160 45 5f 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63  E_OK && eFileLoc
1a170 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20  k==NO_LOCK ){.. 
1a180 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
1a190 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
1a1a0 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73  counter.  Releas
1a1b0 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67  e the lock using
1a1c0 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61   an.    ** OS ca
1a1d0 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c  ll only when all
1a1e0 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73   threads in this
1a1f0 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61   same process ha
1a200 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  ve released.    
1a210 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20  ** the lock..   
1a220 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   */.    unsigned
1a230 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65   long long share
1a240 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52  dLockByte = SHAR
1a250 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d  ED_FIRST+pInode-
1a260 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20  >sharedByte;.   
1a270 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
1a280 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f  --;.    if( pIno
1a290 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
1a2a0 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  {.      Simulate
1a2b0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
1a2c0 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
1a2d0 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20  IOError( h=(-1) 
1a2e0 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ).      Simulate
1a2f0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
1a300 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 6b 69  ;.      if( !ski
1a310 70 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20  pShared ){.     
1a320 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
1a330 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
1a340 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65  th, pFile, share
1a350 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29  dLockByte, 1, 0)
1a360 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a370 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20  if( !rc ){.     
1a380 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
1a390 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
1a3a0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
1a3b0 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
1a3c0 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  CK;.      }.    
1a3d0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
1a3e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a3f0 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d   pInode->nLock--
1a400 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1a410 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30  pInode->nLock>=0
1a420 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49   );.      if( pI
1a430 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29  node->nLock==0 )
1a440 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 50  {.        closeP
1a450 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29  endingFds(pFile)
1a460 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a470 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61    }.  .  unixLea
1a480 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  veMutex();.  if(
1a490 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a4a0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
1a4b0 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
1a4c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1a4d0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
1a4e0 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20  e & cleanup AFP 
1a4f0 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67  specific locking
1a500 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61   context .*/.sta
1a510 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65  tic int afpClose
1a520 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1a530 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  d) {.  int rc = 
1a540 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
1a550 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46   id ){.    unixF
1a560 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1a570 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
1a580 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  afpUnlock(id, NO
1a590 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78  _LOCK);.    unix
1a5a0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
1a5b0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
1a5c0 6f 64 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49  ode && pFile->pI
1a5d0 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20  node->nLock ){. 
1a5e0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
1a5f0 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
1a600 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61   locks, do not a
1a610 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68  ctually close th
1a620 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20  e file just.    
1a630 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65    ** yet because
1a640 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61   that would clea
1a650 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20  r those locks.  
1a660 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65  Instead, add the
1a670 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64   file.      ** d
1a680 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e  escriptor to pIn
1a690 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20  ode->aPending.  
1a6a0 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
1a6b0 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
1a6c0 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68  when.      ** th
1a6d0 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63  e last lock is c
1a6e0 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  leared..      */
1a6f0 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e  .      setPendin
1a700 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  gFd(pFile);.    
1a710 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f  }.    releaseIno
1a720 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
1a730 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1a740 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
1a750 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d  ntext);.    rc =
1a760 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
1a770 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76  d);.    unixLeav
1a780 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20  eMutex();.  }.  
1a790 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
1a7a0 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
1a7b0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
1a7c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1a7d0 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a  ING_STYLE */./*.
1a7e0 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76  ** The code abov
1a7f0 65 20 69 73 20 74 68 65 20 41 46 50 20 6c 6f 63  e is the AFP loc
1a800 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
1a810 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20 73  .  The code is s
1a820 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61  pecific.** to Ma
1a830 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f  cOSX and does no
1a840 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20  t work on other 
1a850 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20  unix platforms. 
1a860 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a   No alternative.
1a870 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  ** is available.
1a880 20 20 49 66 20 79 6f 75 20 64 6f 6e 27 74 20 63    If you don't c
1a890 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d 61 63  ompile for a mac
1a8a0 2c 20 74 68 65 6e 20 74 68 65 20 22 75 6e 69 78  , then the "unix
1a8b0 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20 69 73 20  -afp".** VFS is 
1a8c0 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a  not available..*
1a8d0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
1a8e0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
1a8f0 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c  he AFP lock impl
1a900 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
1a910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a920 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
1a930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a970 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
1a980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a9a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a9b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a9c0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
1a9d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
1a9e0 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e 67  egin NFS Locking
1a9f0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1aa00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aa10 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
1aa20 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
1aa30 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1aa40 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a  ING_STYLE./*. **
1aa50 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
1aa60 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
1aa70 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
1aa80 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
1aa90 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d   eFileLock. ** m
1aaa0 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
1aab0 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
1aac0 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66  LOCK.. **. ** If
1aad0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
1aae0 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
1aaf0 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
1ab00 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
1ab10 0a 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  . ** the request
1ab20 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
1ab30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1ab40 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73  s a no-op.. */.s
1ab50 74 61 74 69 63 20 69 6e 74 20 6e 66 73 55 6e 6c  tatic int nfsUnl
1ab60 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
1ab70 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
1ab80 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ock){.  return p
1ab90 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65  osixUnlock(id, e
1aba0 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a  FileLock, 1);.}.
1abb0 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
1abc0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
1abd0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1abe0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
1abf0 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61  /*.** The code a
1ac00 62 6f 76 65 20 69 73 20 74 68 65 20 4e 46 53 20  bove is the NFS 
1ac10 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
1ac20 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69  ion.  The code i
1ac30 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f  s specific.** to
1ac40 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73   MacOSX and does
1ac50 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68   not work on oth
1ac60 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d  er unix platform
1ac70 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69  s.  No alternati
1ac80 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  ve.** is availab
1ac90 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  le.  .**.*******
1aca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
1acb0 6e 64 20 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f  nd of the NFS lo
1acc0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
1acd0 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
1ace0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
1acf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ad00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ad10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ad20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ad30 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
1ad40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ad50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ad60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ad70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ad80 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
1ad90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c  ********** Non-l
1ada0 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 66  ocking sqlite3_f
1adb0 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  ile methods ****
1adc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1add0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
1ade0 54 68 65 20 6e 65 78 74 20 64 69 76 69 73 69 6f  The next divisio
1adf0 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65  n contains imple
1ae00 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 61  mentations for a
1ae10 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68  ll methods of th
1ae20 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69  e .** sqlite3_fi
1ae30 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68 65 72 20  le object other 
1ae40 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  than the locking
1ae50 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20 6c   methods.  The l
1ae60 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64  ocking.** method
1ae70 73 20 77 65 72 65 20 64 65 66 69 6e 65 64 20 69  s were defined i
1ae80 6e 20 64 69 76 69 73 69 6f 6e 73 20 61 62 6f 76  n divisions abov
1ae90 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d  e (one locking m
1aea0 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76  ethod per.** div
1aeb0 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d  ision).  Those m
1aec0 65 74 68 6f 64 73 20 74 68 61 74 20 61 72 65 20  ethods that are 
1aed0 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f  common to all lo
1aee0 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61  cking modes.** a
1aef0 72 65 20 67 61 74 68 65 72 20 74 6f 67 65 74 68  re gather togeth
1af00 65 72 20 69 6e 74 6f 20 74 68 69 73 20 64 69 76  er into this div
1af10 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ision..*/../*.**
1af20 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66   Seek to the off
1af30 73 65 74 20 70 61 73 73 65 64 20 61 73 20 74 68  set passed as th
1af40 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1af50 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74  t, then read cnt
1af60 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20   .** bytes into 
1af70 70 42 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65  pBuf. Return the
1af80 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1af90 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a   actually read..
1afa0 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f  **.** NB:  If yo
1afb0 75 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45  u define USE_PRE
1afc0 41 44 20 6f 72 20 55 53 45 5f 50 52 45 41 44 36  AD or USE_PREAD6
1afd0 34 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74  4, then it might
1afe0 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65   also.** be nece
1aff0 73 73 61 72 79 20 74 6f 20 64 65 66 69 6e 65 20  ssary to define 
1b000 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f  _XOPEN_SOURCE to
1b010 20 62 65 20 35 30 30 2e 20 20 54 68 69 73 20 76   be 500.  This v
1b020 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e  aries from.** on
1b030 65 20 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74  e system to anot
1b040 68 65 72 2e 20 20 53 69 6e 63 65 20 53 51 4c 69  her.  Since SQLi
1b050 74 65 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69  te does not defi
1b060 6e 65 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20  ne USE_PREAD.** 
1b070 61 6e 79 20 61 6e 79 20 66 6f 72 6d 20 62 79 20  any any form by 
1b080 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c  default, we will
1b090 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
1b0a0 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f  define _XOPEN_SO
1b0b0 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63  URCE..** See tic
1b0c0 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64 20 23  kets #2741 and #
1b0d0 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  2681..**.** To a
1b0e0 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68  void stomping th
1b0f0 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e  e errno value on
1b100 20 61 20 66 61 69 6c 65 64 20 72 65 61 64 20 74   a failed read t
1b110 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c  he lastErrno val
1b120 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66  ue.** is set bef
1b130 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1b140 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
1b150 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c  kAndRead(unixFil
1b160 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69  e *id, sqlite3_i
1b170 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76 6f 69  nt64 offset, voi
1b180 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74  d *pBuf, int cnt
1b190 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69  ){.  int got;.#i
1b1a0 66 20 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f  f (!defined(USE_
1b1b0 50 52 45 41 44 29 20 26 26 20 21 64 65 66 69 6e  PREAD) && !defin
1b1c0 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 29  ed(USE_PREAD64))
1b1d0 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74  .  i64 newOffset
1b1e0 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52  ;.#endif.  TIMER
1b1f0 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69  _START;.#if defi
1b200 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20  ned(USE_PREAD). 
1b210 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 72 65   do{ got = osPre
1b220 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  ad(id->h, pBuf, 
1b230 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77  cnt, offset); }w
1b240 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65  hile( got<0 && e
1b250 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
1b260 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1b270 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65  ( got = -1 );.#e
1b280 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  lif defined(USE_
1b290 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 67  PREAD64).  do{ g
1b2a0 6f 74 20 3d 20 6f 73 50 72 65 61 64 36 34 28 69  ot = osPread64(i
1b2b0 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
1b2c0 20 6f 66 66 73 65 74 29 3b 20 7d 77 68 69 6c 65   offset); }while
1b2d0 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f  ( got<0 && errno
1b2e0 3d 3d 45 49 4e 54 52 29 3b 0a 20 20 53 69 6d 75  ==EINTR);.  Simu
1b2f0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74  lateIOError( got
1b300 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20   = -1 );.#else. 
1b310 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65   newOffset = lse
1b320 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74  ek(id->h, offset
1b330 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 53  , SEEK_SET);.  S
1b340 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1b350 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20  newOffset-- );. 
1b360 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d   if( newOffset!=
1b370 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 69 66  offset ){.    if
1b380 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d  ( newOffset == -
1b390 31 20 29 7b 0a 20 20 20 20 20 20 28 28 75 6e 69  1 ){.      ((uni
1b3a0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
1b3b0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
1b3c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b3d0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
1b3e0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09  >lastErrno = 0;.
1b3f0 09 09 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  ...    }.    ret
1b400 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 64 6f  urn -1;.  }.  do
1b410 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 69  { got = osRead(i
1b420 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29  d->h, pBuf, cnt)
1b430 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20  ; }while( got<0 
1b440 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
1b450 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45  );.#endif.  TIME
1b460 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74  R_END;.  if( got
1b470 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78  <0 ){.    ((unix
1b480 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
1b490 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
1b4a0 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  }.  OSTRACE(("RE
1b4b0 41 44 20 20 20 20 25 2d 33 64 20 25 35 64 20 25  AD    %-3d %5d %
1b4c0 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64  7lld %llu\n", id
1b4d0 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74  ->h, got, offset
1b4e0 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29  , TIMER_ELAPSED)
1b4f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b  );.  return got;
1b500 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64  .}../*.** Read d
1b510 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20  ata from a file 
1b520 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20  into a buffer.  
1b530 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1b540 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73   if all.** bytes
1b550 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65   were read succe
1b560 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49  ssfully and SQLI
1b570 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74  TE_IOERR if anyt
1b580 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
1b590 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
1b5a0 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73 71  t unixRead(.  sq
1b5b0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1b5c0 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a  .  void *pBuf, .
1b5d0 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c    int amt,.  sql
1b5e0 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
1b5f0 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  t.){.  unixFile 
1b600 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
1b610 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 67  le *)id;.  int g
1b620 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  ot;.  assert( id
1b630 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   );..  /* If thi
1b640 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  s is a database 
1b650 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72  file (not a jour
1b660 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72  nal, master-jour
1b670 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a  nal or temp.  **
1b680 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65   file), the byte
1b690 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  s in the locking
1b6a0 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65   range should ne
1b6b0 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77  ver be read or w
1b6c0 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30  ritten. */.#if 0
1b6d0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
1b6e0 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20  ->pUnused==0.   
1b6f0 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50      || offset>=P
1b700 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a  ENDING_BYTE+512.
1b710 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
1b720 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59  +amt<=PENDING_BY
1b730 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a  TE .  );.#endif.
1b740 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64  .  got = seekAnd
1b750 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73  Read(pFile, offs
1b760 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a  et, pBuf, amt);.
1b770 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29    if( got==amt )
1b780 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1b790 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20  ITE_OK;.  }else 
1b7a0 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
1b7b0 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65   /* lastErrno se
1b7c0 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64  t by seekAndRead
1b7d0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
1b7e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
1b7f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1b800 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1b810 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79  = 0; /* not a sy
1b820 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20  stem error */.  
1b830 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74    /* Unread part
1b840 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
1b850 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c  must be zero-fil
1b860 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  led */.    memse
1b870 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  t(&((char*)pBuf)
1b880 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f  [got], 0, amt-go
1b890 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
1b8a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1b8b0 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f  T_READ;.  }.}../
1b8c0 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65  *.** Seek to the
1b8d0 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f   offset in id->o
1b8e0 66 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20  ffset then read 
1b8f0 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70  cnt bytes into p
1b900 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  Buf..** Return t
1b910 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1b920 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
1b930 2e 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66  .  Update the of
1b940 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  fset..**.** To a
1b950 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68  void stomping th
1b960 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e  e errno value on
1b970 20 61 20 66 61 69 6c 65 64 20 77 72 69 74 65 20   a failed write 
1b980 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61  the lastErrno va
1b990 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65  lue.** is set be
1b9a0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
1b9b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
1b9c0 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46  ekAndWrite(unixF
1b9d0 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66  ile *id, i64 off
1b9e0 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  set, const void 
1b9f0 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b  *pBuf, int cnt){
1ba00 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66 20  .  int got;.#if 
1ba10 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  (!defined(USE_PR
1ba20 45 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64  EAD) && !defined
1ba30 28 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20  (USE_PREAD64)). 
1ba40 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a   i64 newOffset;.
1ba50 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53  #endif.  TIMER_S
1ba60 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65  TART;.#if define
1ba70 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 64  d(USE_PREAD).  d
1ba80 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 77 72 69 74  o{ got = osPwrit
1ba90 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  e(id->h, pBuf, c
1baa0 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77 68  nt, offset); }wh
1bab0 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72  ile( got<0 && er
1bac0 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65  rno==EINTR );.#e
1bad0 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  lif defined(USE_
1bae0 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 67  PREAD64).  do{ g
1baf0 6f 74 20 3d 20 6f 73 50 77 72 69 74 65 36 34 28  ot = osPwrite64(
1bb00 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
1bb10 2c 20 6f 66 66 73 65 74 29 3b 7d 77 68 69 6c 65  , offset);}while
1bb20 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f  ( got<0 && errno
1bb30 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a  ==EINTR);.#else.
1bb40 20 20 64 6f 7b 0a 20 20 20 20 6e 65 77 4f 66 66    do{.    newOff
1bb50 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e  set = lseek(id->
1bb60 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f  h, offset, SEEK_
1bb70 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  SET);.    Simula
1bb80 74 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66  teIOError( newOf
1bb90 66 73 65 74 2d 2d 20 29 3b 0a 20 20 20 20 69 66  fset-- );.    if
1bba0 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66  ( newOffset!=off
1bbb0 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  set ){.      if(
1bbc0 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31   newOffset == -1
1bbd0 20 29 7b 0a 20 20 20 20 20 20 20 20 28 28 75 6e   ){.        ((un
1bbe0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
1bbf0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
1bc00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1bc10 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a       ((unixFile*
1bc20 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  )id)->lastErrno 
1bc30 3d 20 30 3b 09 09 09 0a 20 20 20 20 20 20 7d 0a  = 0;....      }.
1bc40 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
1bc50 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d  .    }.    got =
1bc60 20 6f 73 57 72 69 74 65 28 69 64 2d 3e 68 2c 20   osWrite(id->h, 
1bc70 70 42 75 66 2c 20 63 6e 74 29 3b 0a 20 20 7d 77  pBuf, cnt);.  }w
1bc80 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65  hile( got<0 && e
1bc90 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23  rrno==EINTR );.#
1bca0 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e  endif.  TIMER_EN
1bcb0 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29  D;.  if( got<0 )
1bcc0 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
1bcd0 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
1bce0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 0a 20   = errno;.  }.. 
1bcf0 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45   OSTRACE(("WRITE
1bd00 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c     %-3d %5d %7ll
1bd10 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68  d %llu\n", id->h
1bd20 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54  , got, offset, T
1bd30 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a  IMER_ELAPSED));.
1bd40 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a    return got;.}.
1bd50 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61  ../*.** Write da
1bd60 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
1bd70 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52   into a file.  R
1bd80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1bd90 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72  on success.** or
1bda0 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
1bdb0 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72  r code on failur
1bdc0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1bdd0 20 75 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71   unixWrite(.  sq
1bde0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1bdf0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
1be00 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c  Buf, .  int amt,
1be10 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1be20 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e   offset .){.  un
1be30 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1be40 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
1be50 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a   int wrote = 0;.
1be60 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
1be70 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20    assert( amt>0 
1be80 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
1be90 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66   is a database f
1bea0 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e  ile (not a journ
1beb0 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  al, master-journ
1bec0 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20  al or temp.  ** 
1bed0 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73  file), the bytes
1bee0 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
1bef0 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76  range should nev
1bf00 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  er be read or wr
1bf10 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a  itten. */.#if 0.
1bf20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
1bf30 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20  >pUnused==0.    
1bf40 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45     || offset>=PE
1bf50 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20  NDING_BYTE+512. 
1bf60 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b        || offset+
1bf70 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  amt<=PENDING_BYT
1bf80 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  E .  );.#endif..
1bf90 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
1bfa0 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f   /* If we are do
1bfb0 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69  ing a normal wri
1bfc0 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65  te to a database
1bfd0 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65   file (as oppose
1bfe0 64 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20  d to.  ** doing 
1bff0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
1c000 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74  llback or a writ
1c010 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f  e to some file o
1c020 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a  ther than a.  **
1c030 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65   normal database
1c040 20 66 69 6c 65 29 20 74 68 65 6e 20 72 65 63 6f   file) then reco
1c050 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
1c060 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
1c070 2a 2a 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20  ** has changed. 
1c080 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
1c090 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6d  ion counter is m
1c0a0 6f 64 69 66 69 65 64 2c 20 72 65 63 6f 72 64 20  odified, record 
1c0b0 74 68 61 74 0a 20 20 2a 2a 20 66 61 63 74 20 74  that.  ** fact t
1c0c0 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  oo..  */.  if( p
1c0d0 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
1c0e0 69 74 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  ite ){.    pFile
1c0f0 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 31 3b 20  ->dbUpdate = 1; 
1c100 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1c110 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
1c120 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66  ed */.    if( of
1c130 66 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66 73  fset<=24 && offs
1c140 65 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20  et+amt>=27 ){.  
1c150 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1c160 20 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34    char oldCntr[4
1c170 5d 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  ];.      Simulat
1c180 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
1c190 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65  );.      rc = se
1c1a0 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c  ekAndRead(pFile,
1c1b0 20 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29   24, oldCntr, 4)
1c1c0 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
1c1d0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
1c1e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1c1f0 34 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43  4 || memcmp(oldC
1c200 6e 74 72 2c 20 26 28 28 63 68 61 72 2a 29 70 42  ntr, &((char*)pB
1c210 75 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20  uf)[24-offset], 
1c220 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  4)!=0 ){.       
1c230 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
1c240 72 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54  rChng = 1;  /* T
1c250 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1c260 6f 75 6e 74 65 72 20 68 61 73 20 63 68 61 6e 67  ounter has chang
1c270 65 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  ed */.      }.  
1c280 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1c290 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26    while( amt>0 &
1c2a0 26 20 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41  & (wrote = seekA
1c2b0 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 6f  ndWrite(pFile, o
1c2c0 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74  ffset, pBuf, amt
1c2d0 29 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20  ))>0 ){.    amt 
1c2e0 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66  -= wrote;.    of
1c2f0 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20  fset += wrote;. 
1c300 20 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61     pBuf = &((cha
1c310 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b  r*)pBuf)[wrote];
1c320 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49  .  }.  SimulateI
1c330 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28  OError(( wrote=(
1c340 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20  -1), amt=1 ));. 
1c350 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
1c360 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30  lError(( wrote=0
1c370 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 0a 20 20 69  , amt=1 ));..  i
1c380 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  f( amt>0 ){.    
1c390 69 66 28 20 77 72 6f 74 65 3c 30 20 26 26 20 70  if( wrote<0 && p
1c3a0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 21  File->lastErrno!
1c3b0 3d 45 4e 4f 53 50 43 20 29 7b 0a 20 20 20 20 20  =ENOSPC ){.     
1c3c0 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65   /* lastErrno se
1c3d0 74 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74  t by seekAndWrit
1c3e0 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  e */.      retur
1c3f0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
1c400 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RITE;.    }else{
1c410 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
1c420 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20  stErrno = 0; /* 
1c430 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72  not a system err
1c440 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  or */.      retu
1c450 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
1c460 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
1c470 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1c480 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1c490 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  TEST./*.** Count
1c4a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
1c4b0 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72  ullsyncs and nor
1c4c0 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73  mal syncs.  This
1c4d0 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
1c4e0 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61  .** that syncs a
1c4f0 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65  nd fullsyncs are
1c500 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20 74 68   occurring at th
1c510 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a  e right times..*
1c520 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79  /.int sqlite3_sy
1c530 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e  nc_count = 0;.in
1c540 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79  t sqlite3_fullsy
1c550 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  nc_count = 0;.#e
1c560 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64  ndif../*.** We d
1c570 6f 20 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74  o not trust syst
1c580 65 6d 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61  ems to provide a
1c590 20 77 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79   working fdatasy
1c5a0 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a  nc().  Some do..
1c5b0 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e  ** Others do no.
1c5c0 20 20 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65    To be safe, we
1c5d0 20 77 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68   will stick with
1c5e0 20 74 68 65 20 28 73 6c 69 67 68 74 6c 79 20 73   the (slightly s
1c5f0 6c 6f 77 65 72 29 0a 2a 2a 20 66 73 79 6e 63 28  lower).** fsync(
1c600 29 2e 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74  ). If you know t
1c610 68 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20  hat your system 
1c620 64 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64 61  does support fda
1c630 74 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74  tasync() correct
1c640 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70  ly,.** then simp
1c650 6c 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20  ly compile with 
1c660 2d 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74  -Dfdatasync=fdat
1c670 61 73 79 6e 63 0a 2a 2f 0a 23 69 66 20 21 64 65  async.*/.#if !de
1c680 66 69 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29  fined(fdatasync)
1c690 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74 61 73  .# define fdatas
1c6a0 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66  ync fsync.#endif
1c6b0 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48  ../*.** Define H
1c6c0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f  AVE_FULLFSYNC to
1c6d0 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e   0 or 1 dependin
1c6e0 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
1c6f0 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c  not.** the F_FUL
1c700 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20  LFSYNC macro is 
1c710 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c  defined.  F_FULL
1c720 46 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74  FSYNC is current
1c730 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c  ly.** only avail
1c740 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58  able on Mac OS X
1c750 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c  .  But that coul
1c760 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66  d change..*/.#if
1c770 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a  def F_FULLFSYNC.
1c780 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55  # define HAVE_FU
1c790 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a  LLFSYNC 1.#else.
1c7a0 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55  # define HAVE_FU
1c7b0 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66  LLFSYNC 0.#endif
1c7c0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1c7d0 55 53 45 5f 52 45 51 55 45 53 54 5f 46 55 4c 4c  USE_REQUEST_FULL
1c7e0 46 53 59 4e 43 0a 23 69 6d 70 6f 72 74 20 3c 6e  FSYNC.#import <n
1c7f0 6f 74 69 66 79 2e 68 3e 0a 23 69 6d 70 6f 72 74  otify.h>.#import
1c800 20 3c 6c 69 62 6b 65 72 6e 2f 4f 53 41 74 6f 6d   <libkern/OSAtom
1c810 69 63 2e 68 3e 0a 73 74 61 74 69 63 20 4f 53 53  ic.h>.static OSS
1c820 70 69 6e 4c 6f 63 6b 20 6e 6f 74 69 66 79 5f 6c  pinLock notify_l
1c830 6f 63 6b 20 3d 20 30 3b 0a 23 64 65 66 69 6e 65  ock = 0;.#define
1c840 20 52 45 51 55 45 53 54 5f 46 55 4c 4c 53 59 4e   REQUEST_FULLSYN
1c850 43 5f 4e 4f 54 49 46 49 43 41 54 49 4f 4e 20 20  C_NOTIFICATION  
1c860 20 20 22 63 6f 6d 2e 61 70 70 6c 65 2e 72 65 71    "com.apple.req
1c870 73 79 6e 63 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a  sync".#endif../*
1c880 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20  .** The fsync() 
1c890 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73  system call does
1c8a0 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76   not work as adv
1c8b0 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a  ertised on many.
1c8c0 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e  ** unix systems.
1c8d0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
1c8e0 70 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20  procedure is an 
1c8f0 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a  attempt to make.
1c900 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65  ** it work bette
1c910 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  r..**.** The SQL
1c920 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72  ITE_NO_SYNC macr
1c930 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66  o disables all f
1c940 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69  sync()s.  This i
1c950 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20  s useful.** for 
1c960 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20  testing when we 
1c970 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f  want to run thro
1c980 75 67 68 20 74 68 65 20 74 65 73 74 20 73 75 69  ugh the test sui
1c990 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59  te quickly..** Y
1c9a0 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20  ou are strongly 
1c9b0 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f  advised *not* to
1c9c0 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c   deploy with SQL
1c9d0 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65  ITE_NO_SYNC.** e
1c9e0 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c  nabled, however,
1c9f0 20 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49   since with SQLI
1ca00 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c  TE_NO_SYNC enabl
1ca10 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a  ed, an OS crash.
1ca20 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
1ca30 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  ure will likely 
1ca40 63 6f 72 72 75 70 74 20 74 68 65 20 64 61 74 61  corrupt the data
1ca50 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1ca60 20 53 51 4c 69 74 65 20 73 65 74 73 20 74 68 65   SQLite sets the
1ca70 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69   dataOnly flag i
1ca80 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
1ca90 65 20 66 69 6c 65 20 69 73 20 75 6e 63 68 61 6e  e file is unchan
1caa0 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61  ged..** The idea
1cab0 20 62 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79   behind dataOnly
1cac0 20 69 73 20 74 68 61 74 20 69 74 20 73 68 6f 75   is that it shou
1cad0 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68  ld only write th
1cae0 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a  e file content.*
1caf0 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74  * to disk, not t
1cb00 68 65 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e  he inode.  We on
1cb10 6c 79 20 73 65 74 20 64 61 74 61 4f 6e 6c 79 20  ly set dataOnly 
1cb20 69 66 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  if the file size
1cb30 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65   is .** unchange
1cb40 64 20 73 69 6e 63 65 20 74 68 65 20 66 69 6c 65  d since the file
1cb50 20 73 69 7a 65 20 69 73 20 70 61 72 74 20 6f 66   size is part of
1cb60 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77   the inode.  How
1cb70 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73  ever, .** Ted Ts
1cb80 27 6f 20 74 65 6c 6c 73 20 75 73 20 74 68 61 74  'o tells us that
1cb90 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c   fdatasync() wil
1cba0 6c 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65  l also write the
1cbb0 20 69 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a   inode if the.**
1cbc0 20 66 69 6c 65 20 73 69 7a 65 20 68 61 73 20 63   file size has c
1cbd0 68 61 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c  hanged.  The onl
1cbe0 79 20 72 65 61 6c 20 64 69 66 66 65 72 65 6e 63  y real differenc
1cbf0 65 20 62 65 74 77 65 65 6e 20 66 64 61 74 61 73  e between fdatas
1cc00 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79  ync().** and fsy
1cc10 6e 63 28 29 2c 20 54 65 64 20 74 65 6c 6c 73 20  nc(), Ted tells 
1cc20 75 73 2c 20 69 73 20 74 68 61 74 20 66 64 61 74  us, is that fdat
1cc30 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74  async() will not
1cc40 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e   flush the.** in
1cc50 6f 64 65 20 69 66 20 74 68 65 20 6d 74 69 6d 65  ode if the mtime
1cc60 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68   or owner or oth
1cc70 65 72 20 69 6e 6f 64 65 20 61 74 74 72 69 62 75  er inode attribu
1cc80 74 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64  tes have changed
1cc90 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72  ..** We only car
1cca0 65 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65  e about the file
1ccb0 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f   size, not the o
1ccc0 74 68 65 72 20 66 69 6c 65 20 61 74 74 72 69 62  ther file attrib
1ccd0 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66  utes, so.** as f
1cce0 61 72 20 61 73 20 53 51 4c 69 74 65 20 69 73 20  ar as SQLite is 
1ccf0 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66 64  concerned, an fd
1cd00 61 74 61 73 79 6e 63 28 29 20 69 73 20 61 6c 77  atasync() is alw
1cd10 61 79 73 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a  ays adequate..**
1cd20 20 53 6f 2c 20 77 65 20 61 6c 77 61 79 73 20 75   So, we always u
1cd30 73 65 20 66 64 61 74 61 73 79 6e 63 28 29 20 69  se fdatasync() i
1cd40 66 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c  f it is availabl
1cd50 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  e, regardless of
1cd60 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
1cd70 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c   the dataOnly fl
1cd80 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ag..*/.static in
1cd90 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74  t full_fsync(int
1cda0 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e   fd, int fullSyn
1cdb0 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29  c, int dataOnly)
1cdc0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  {.  int rc;..  /
1cdd0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1cde0 22 69 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65  "ifdef/elif/else
1cdf0 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20 74 68 65  /" block has the
1ce00 20 73 61 6d 65 20 73 74 72 75 63 74 75 72 65 20   same structure 
1ce10 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20  as.  ** the one 
1ce20 62 65 6c 6f 77 2e 20 49 74 20 69 73 20 72 65 70  below. It is rep
1ce30 6c 69 63 61 74 65 64 20 68 65 72 65 20 73 6f 6c  licated here sol
1ce40 65 6c 79 20 74 6f 20 61 76 6f 69 64 20 63 6c 75  ely to avoid clu
1ce50 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70  ttering .  ** up
1ce60 20 74 68 65 20 72 65 61 6c 20 63 6f 64 65 20 77   the real code w
1ce70 69 74 68 20 74 68 65 20 55 4e 55 53 45 44 5f 50  ith the UNUSED_P
1ce80 41 52 41 4d 45 54 45 52 28 29 20 6d 61 63 72 6f  ARAMETER() macro
1ce90 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  s..  */.#ifdef S
1cea0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
1ceb0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1cec0 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  (fd);.  UNUSED_P
1ced0 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e  ARAMETER(fullSyn
1cee0 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  c);.  UNUSED_PAR
1cef0 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
1cf00 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  ;.#elif HAVE_FUL
1cf10 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f  LFSYNC.  UNUSED_
1cf20 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
1cf30 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  ly);.#else.  UNU
1cf40 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75  SED_PARAMETER(fu
1cf50 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45  llSync);.  UNUSE
1cf60 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61  D_PARAMETER(data
1cf70 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Only);.#endif.. 
1cf80 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e   /* Record the n
1cf90 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
1cfa0 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d  hat we do a norm
1cfb0 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a  al fsync() and .
1cfc0 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20    ** FULLSYNC.  
1cfd0 54 68 69 73 20 69 73 20 75 73 65 64 20 64 75 72  This is used dur
1cfe0 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76  ing testing to v
1cff0 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20  erify that this 
1d000 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67  procedure.  ** g
1d010 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ets called with 
1d020 74 68 65 20 63 6f 72 72 65 63 74 20 61 72 67 75  the correct argu
1d030 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64  ments..  */.#ifd
1d040 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1d050 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20   if( fullSync ) 
1d060 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
1d070 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69  _count++;.  sqli
1d080 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  te3_sync_count++
1d090 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
1d0a0 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69  f we compiled wi
1d0b0 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f  th the SQLITE_NO
1d0c0 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e  _SYNC flag, then
1d0d0 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20   syncing is a.  
1d0e0 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69  ** no-op.  */.#i
1d0f0 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
1d100 59 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54  YNC.  rc = SQLIT
1d110 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56 45  E_OK;.#elif HAVE
1d120 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28  _FULLFSYNC.  if(
1d130 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 23 69 66   fullSync ){.#if
1d140 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45 5f 52  def SQLITE_USE_R
1d150 45 51 55 45 53 54 5f 46 55 4c 4c 46 53 59 4e 43  EQUEST_FULLFSYNC
1d160 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73 79 6e  .    rc = osFsyn
1d170 63 28 66 64 29 3b 0a 20 20 20 20 69 66 20 28 21  c(fd);.    if (!
1d180 72 63 29 20 7b 0a 20 20 20 20 20 20 4f 53 53 70  rc) {.      OSSp
1d190 69 6e 4c 6f 63 6b 4c 6f 63 6b 28 26 6e 6f 74 69  inLockLock(&noti
1d1a0 66 79 5f 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  fy_lock);.      
1d1b0 72 63 20 3d 20 6e 6f 74 69 66 79 5f 70 6f 73 74  rc = notify_post
1d1c0 28 52 45 51 55 45 53 54 5f 46 55 4c 4c 53 59 4e  (REQUEST_FULLSYN
1d1d0 43 5f 4e 4f 54 49 46 49 43 41 54 49 4f 4e 29 3b  C_NOTIFICATION);
1d1e0 0a 20 20 20 20 20 20 4f 53 53 70 69 6e 4c 6f 63  .      OSSpinLoc
1d1f0 6b 55 6e 6c 6f 63 6b 28 26 6e 6f 74 69 66 79 5f  kUnlock(&notify_
1d200 6c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 23 65 6c  lock);.    }.#el
1d210 73 65 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63  se.    rc = osFc
1d220 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53  ntl(fd, F_FULLFS
1d230 59 4e 43 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  YNC, 0);.#endif.
1d240 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
1d250 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66  = 1;.  }.  /* If
1d260 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20 66   the FULLFSYNC f
1d270 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b  ailed, fall back
1d280 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20 61   to attempting a
1d290 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a 20  n fsync()..  ** 
1d2a0 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65 20  It shouldn't be 
1d2b0 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75 6c  possible for ful
1d2c0 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f  lfsync to fail o
1d2d0 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20 2a  n the local .  *
1d2e0 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28 6f  * file system (o
1d2f0 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c 75  n OSX), so failu
1d300 72 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  re indicates tha
1d310 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a  t FULLFSYNC.  **
1d320 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64   isn't supported
1d330 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20 73   for this file s
1d340 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d  ystem. So, attem
1d350 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20 2a  pt an fsync .  *
1d360 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20  * and (for now) 
1d370 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72 68  ignore the overh
1d380 65 61 64 20 6f 66 20 61 20 73 75 70 65 72 66 6c  ead of a superfl
1d390 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e  uous fcntl call.
1d3a0 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62 65 20    .  ** It'd be 
1d3b0 62 65 74 74 65 72 20 74 6f 20 64 65 74 65 63 74  better to detect
1d3c0 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f   fullfsync suppo
1d3d0 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69  rt once and avoi
1d3e0 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e 74  d .  ** the fcnt
1d3f0 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69 6d  l call every tim
1d400 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65 64  e sync is called
1d410 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 20  ..  */.  if( rc 
1d420 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29  ) rc = fsync(fd)
1d430 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  ;..#elif defined
1d440 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a  (__APPLE__).  /*
1d450 20 66 64 61 74 61 73 79 6e 63 28 29 20 6f 6e 20   fdatasync() on 
1d460 48 46 53 2b 20 64 6f 65 73 6e 27 74 20 79 65 74  HFS+ doesn't yet
1d470 20 66 6c 75 73 68 20 74 68 65 20 66 69 6c 65 20   flush the file 
1d480 73 69 7a 65 20 69 66 20 69 74 20 63 68 61 6e 67  size if it chang
1d490 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a  ed correctly.  *
1d4a0 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c 79 20 77  * so currently w
1d4b0 65 20 64 65 66 61 75 6c 74 20 74 6f 20 74 68 65  e default to the
1d4c0 20 6d 61 63 72 6f 20 74 68 61 74 20 72 65 64 65   macro that rede
1d4d0 66 69 6e 65 73 20 66 64 61 74 61 73 79 6e 63 20  fines fdatasync 
1d4e0 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a 20 20  to fsync.  */.  
1d4f0 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a  rc = fsync(fd);.
1d500 23 65 6c 73 65 20 0a 20 20 72 63 20 3d 20 66 64  #else .  rc = fd
1d510 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 23 69 66  atasync(fd);.#if
1d520 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66   OS_VXWORKS.  if
1d530 28 20 72 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e  ( rc==-1 && errn
1d540 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20  o==ENOTSUP ){.  
1d550 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29    rc = fsync(fd)
1d560 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
1d570 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23 65  OS_VXWORKS */.#e
1d580 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51  ndif /* ifdef SQ
1d590 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69  LITE_NO_SYNC eli
1d5a0 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
1d5b0 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58   */..  if( OS_VX
1d5c0 57 4f 52 4b 53 20 26 26 20 72 63 21 3d 20 2d 31  WORKS && rc!= -1
1d5d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a   ){.    rc = 0;.
1d5e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1d5f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
1d600 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1d610 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72   to the director
1d620 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c  y containing fil
1d630 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20  e zFilename..** 
1d640 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a  If successful, *
1d650 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 74 68  pFd is set to th
1d660 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65  e opened file de
1d670 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20  scriptor and.** 
1d680 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1d690 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72  urned. If an err
1d6a0 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65  or occurs, eithe
1d6b0 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a  r SQLITE_NOMEM.*
1d6c0 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54  * or SQLITE_CANT
1d6d0 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64  OPEN is returned
1d6e0 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74   and *pFd is set
1d6f0 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64   to an undefined
1d700 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  .** value..**.**
1d710 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20 66   The directory f
1d720 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
1d730 73 20 75 73 65 64 20 66 6f 72 20 6f 6e 6c 79 20  s used for only 
1d740 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74 6f 0a 2a  one thing - to.*
1d750 2a 20 66 73 79 6e 63 28 29 20 61 20 64 69 72 65  * fsync() a dire
1d760 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65 20 73 75  ctory to make su
1d770 72 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e  re file creation
1d780 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 20 65 76   and deletion ev
1d790 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66 6c 75 73  ents.** are flus
1d7a0 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 53 75  hed to disk.  Su
1d7b0 63 68 20 66 73 79 6e 63 73 20 61 72 65 20 6e 6f  ch fsyncs are no
1d7c0 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e 65 77 65  t needed on newe
1d7d0 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67 20  r.** journaling 
1d7e0 66 69 6c 65 73 79 73 74 65 6d 73 2c 20 62 75 74  filesystems, but
1d7f0 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e   are required on
1d800 20 6f 6c 64 65 72 20 66 69 6c 65 73 79 73 74 65   older filesyste
1d810 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ms..**.** This r
1d820 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 6f 76  outine can be ov
1d830 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20 74  erridden using t
1d840 68 65 20 78 53 65 74 53 79 73 43 61 6c 6c 20 69  he xSetSysCall i
1d850 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20 54 68 65  nterface..** The
1d860 20 61 62 69 6c 69 74 79 20 74 6f 20 6f 76 65 72   ability to over
1d870 72 69 64 65 20 74 68 69 73 20 72 6f 75 74 69 6e  ride this routin
1d880 65 20 77 61 73 20 61 64 64 65 64 20 69 6e 20 73  e was added in s
1d890 75 70 70 6f 72 74 20 6f 66 20 74 68 65 0a 2a 2a  upport of the.**
1d8a0 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f   chromium sandbo
1d8b0 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61 20 64 69  x.  Opening a di
1d8c0 72 65 63 74 6f 72 79 20 69 73 20 61 20 73 65 63  rectory is a sec
1d8d0 75 72 69 74 79 20 72 69 73 6b 20 28 77 65 20 61  urity risk (we a
1d8e0 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f 20 6d  re.** told) so m
1d8f0 61 6b 69 6e 67 20 69 74 20 6f 76 65 72 72 69 64  aking it overrid
1d900 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20 74 68 65  eable allows the
1d910 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f   chromium sandbo
1d920 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61 63 65 20  x to.** replace 
1d930 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
1d940 68 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  h a harmless no-
1d950 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20 74 68 69  op.  To make thi
1d960 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 20 6e  s routine.** a n
1d970 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65 20 69 74  o-op, replace it
1d980 20 77 69 74 68 20 61 20 73 74 75 62 20 74 68 61   with a stub tha
1d990 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
1d9a0 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 73 0a 2a  _OK but leaves.*
1d9b0 2a 20 2a 70 46 64 20 73 65 74 20 74 6f 20 61 20  * *pFd set to a 
1d9c0 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e  negative number.
1d9d0 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
1d9e0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
1d9f0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   the caller is r
1da00 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
1da10 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69  losing.** the fi
1da20 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 70  le descriptor *p
1da30 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28 29  Fd using close()
1da40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1da50 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f  openDirectory(co
1da60 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1da70 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a  ame, int *pFd){.
1da80 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20    int ii;.  int 
1da90 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20  fd = -1;.  char 
1daa0 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54  zDirname[MAX_PAT
1dab0 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c  HNAME+1];..  sql
1dac0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
1dad0 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72  X_PATHNAME, zDir
1dae0 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c  name, "%s", zFil
1daf0 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69  ename);.  for(ii
1db00 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69  =(int)strlen(zDi
1db10 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20 26 26 20  rname); ii>1 && 
1db20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f  zDirname[ii]!='/
1db30 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20  '; ii--);.  if( 
1db40 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69 72  ii>0 ){.    zDir
1db50 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b  name[ii] = '\0';
1db60 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
1db70 5f 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20  _open(zDirname, 
1db80 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52  O_RDONLY|O_BINAR
1db90 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66  Y, 0);.    if( f
1dba0 64 3e 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 46  d>=0 ){.#ifdef F
1dbb0 44 5f 43 4c 4f 45 58 45 43 0a 20 20 20 20 20 20  D_CLOEXEC.      
1dbc0 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45  osFcntl(fd, F_SE
1dbd0 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28 66 64 2c  TFD, osFcntl(fd,
1dbe0 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46   F_GETFD, 0) | F
1dbf0 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64  D_CLOEXEC);.#end
1dc00 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  if.      OSTRACE
1dc10 28 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20  (("OPENDIR %-3d 
1dc20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e  %s\n", fd, zDirn
1dc30 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ame));.    }.  }
1dc40 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20  .  *pFd = fd;.  
1dc50 72 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51  return (fd>=0?SQ
1dc60 4c 49 54 45 5f 4f 4b 3a 75 6e 69 78 4c 6f 67 45  LITE_OK:unixLogE
1dc70 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
1dc80 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e  OPEN_BKPT, "open
1dc90 22 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 7d  ", zDirname));.}
1dca0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
1dcb0 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20  e all writes to 
1dcc0 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c  a particular fil
1dcd0 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20  e are committed 
1dce0 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49  to disk..**.** I
1dcf0 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68  f dataOnly==0 th
1dd00 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65  en both the file
1dd10 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20   itself and its 
1dd20 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a  metadata (file.*
1dd30 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74  * size, access t
1dd40 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73 79  ime, etc) are sy
1dd50 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e  nced.  If dataOn
1dd60 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20  ly!=0 then only 
1dd70 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61  the.** file data
1dd80 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a   is synced..**.*
1dd90 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c  * Under Unix, al
1dda0 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  so make sure tha
1ddb0 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  t the directory 
1ddc0 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
1ddd0 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63  le.** has been c
1dde0 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d  reated by fsync-
1ddf0 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72  ing the director
1de00 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  y that contains 
1de10 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20  the file..** If 
1de20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69  we do not do thi
1de30 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74  s and we encount
1de40 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  er a power failu
1de50 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72  re, the director
1de60 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74  y.** entry for t
1de70 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
1de80 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65 72   not exist after
1de90 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65   we reboot.  The
1dea0 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20   next.** SQLite 
1deb0 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66 69  to access the fi
1dec0 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77  le will not know
1ded0 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1dee0 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75 73  l exists (becaus
1def0 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f  e.** the directo
1df00 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ry entry for the
1df10 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76   journal was nev
1df20 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64 20  er created) and 
1df30 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
1df40 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  ** will not roll
1df50 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79   back - possibly
1df60 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61   leading to data
1df70 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
1df80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1df90 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f  nixSync(sqlite3_
1dfa0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c  file *id, int fl
1dfb0 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ags){.  int rc;.
1dfc0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1dfd0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
1dfe0 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61  d;..  int isData
1dff0 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51  Only = (flags&SQ
1e000 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
1e010 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c  LY);.  int isFul
1e020 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30  lsync = (flags&0
1e030 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
1e040 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68  C_FULL;..  /* Ch
1e050 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  eck that one of 
1e060 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
1e070 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70  AL or FULL was p
1e080 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  assed */.  asser
1e090 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  t((flags&0x0F)==
1e0a0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
1e0b0 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61  AL.      || (fla
1e0c0 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
1e0d0 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a  _SYNC_FULL.  );.
1e0e0 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f  .  /* Unix canno
1e0f0 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74  t, but some syst
1e100 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ems may return S
1e110 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20  QLITE_FULL from 
1e120 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20  here. This.  ** 
1e130 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20  line is to test 
1e140 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f  that doing so do
1e150 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79  es not cause any
1e160 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a   problems..  */.
1e170 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
1e180 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  llError( return 
1e190 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a  SQLITE_FULL );..
1e1a0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
1e1b0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  );.  OSTRACE(("S
1e1c0 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20  YNC    %-3d\n", 
1e1d0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63  pFile->h));.  rc
1e1e0 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46   = full_fsync(pF
1e1f0 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79  ile->h, isFullsy
1e200 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b  nc, isDataOnly);
1e210 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1e220 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66  or( rc=1 );.  if
1e230 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c  ( rc ){.    pFil
1e240 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
1e250 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
1e260 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
1e270 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
1e280 2c 20 22 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20  , "full_fsync", 
1e290 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
1e2a0 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73   }..  /* Also fs
1e2b0 79 6e 63 20 74 68 65 20 64 69 72 65 63 74 6f 72  ync the director
1e2c0 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  y containing the
1e2d0 20 66 69 6c 65 20 69 66 20 74 68 65 20 44 49 52   file if the DIR
1e2e0 53 59 4e 43 20 66 6c 61 67 0a 20 20 2a 2a 20 69  SYNC flag.  ** i
1e2f0 73 20 73 65 74 2e 20 20 54 68 69 73 20 69 73 20  s set.  This is 
1e300 61 20 6f 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72  a one-time occur
1e310 72 61 6e 63 65 2e 20 20 4d 61 6e 79 20 73 79 73  rance.  Many sys
1e320 74 65 6d 73 20 28 65 78 61 6d 70 6c 65 73 3a 20  tems (examples: 
1e330 41 49 58 29 0a 20 20 2a 2a 20 61 72 65 20 75 6e  AIX).  ** are un
1e340 61 62 6c 65 20 74 6f 20 66 73 79 6e 63 20 61 20  able to fsync a 
1e350 64 69 72 65 63 74 6f 72 79 2c 20 73 6f 20 69 67  directory, so ig
1e360 6e 6f 72 65 20 65 72 72 6f 72 73 20 6f 6e 20 74  nore errors on t
1e370 68 65 20 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20  he fsync..  */. 
1e380 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c   if( pFile->ctrl
1e390 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
1e3a0 5f 44 49 52 53 59 4e 43 20 29 7b 0a 20 20 20 20  _DIRSYNC ){.    
1e3b0 69 6e 74 20 64 69 72 66 64 3b 0a 20 20 20 20 4f  int dirfd;.    O
1e3c0 53 54 52 41 43 45 28 28 22 44 49 52 53 59 4e 43  STRACE(("DIRSYNC
1e3d0 20 25 73 20 28 68 61 76 65 5f 66 75 6c 6c 66 73   %s (have_fullfs
1e3e0 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d  ync=%d fullsync=
1e3f0 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a  %d)\n", pFile->z
1e400 50 61 74 68 2c 0a 20 20 20 20 20 20 20 20 20 20  Path,.          
1e410 20 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43    HAVE_FULLFSYNC
1e420 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a  , isFullsync));.
1e430 20 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44      rc = osOpenD
1e440 69 72 65 63 74 6f 72 79 28 70 46 69 6c 65 2d 3e  irectory(pFile->
1e450 7a 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a  zPath, &dirfd);.
1e460 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e470 54 45 5f 4f 4b 20 26 26 20 64 69 72 66 64 3e 3d  TE_OK && dirfd>=
1e480 30 20 29 7b 0a 20 20 20 20 20 20 66 75 6c 6c 5f  0 ){.      full_
1e490 66 73 79 6e 63 28 64 69 72 66 64 2c 20 30 2c 20  fsync(dirfd, 0, 
1e4a0 30 29 3b 0a 23 69 66 20 4f 53 43 4c 4f 53 45 5f  0);.#if OSCLOSE_
1e4b0 43 48 45 43 4b 5f 43 4c 4f 53 45 5f 49 4f 45 52  CHECK_CLOSE_IOER
1e4c0 52 0a 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73  R.      if( clos
1e4d0 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 29 20  e(pFile->dirfd) 
1e4e0 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
1e4f0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
1e500 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20  rno;.        rc 
1e510 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
1e520 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20  IR_CLOSE;.      
1e530 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 6f  }.#else.      ro
1e540 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
1e550 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f  , dirfd, __LINE_
1e560 5f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  _);.#endif.    }
1e570 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
1e580 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a  ITE_CANTOPEN ){.
1e590 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1e5a0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1e5b0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1e5c0 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 44 49   &= ~UNIXFILE_DI
1e5d0 52 53 59 4e 43 3b 0a 0a 20 20 7d 0a 20 20 72 65  RSYNC;..  }.  re
1e5e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1e5f0 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
1e600 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
1e610 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
1e620 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72  tatic int unixTr
1e630 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
1e640 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79  ile *id, i64 nBy
1e650 74 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  te){.  unixFile 
1e660 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
1e670 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72  le *)id;.  int r
1e680 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  c;.  assert( pFi
1e690 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  le );.  Simulate
1e6a0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
1e6b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
1e6c0 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  NCATE );..  /* I
1e6d0 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63  f the user has c
1e6e0 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e  onfigured a chun
1e6f0 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  k-size for this 
1e700 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74  file, truncate t
1e710 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20  he.  ** file so 
1e720 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73  that it consists
1e730 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e   of an integer n
1e740 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20  umber of chunks 
1e750 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61  (i.e. the.  ** a
1e760 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20  ctual file size 
1e770 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74  after the operat
1e780 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65  ion may be large
1e790 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
1e7a0 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e  sted.  ** size).
1e7b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
1e7c0 65 2d 3e 73 7a 43 68 75 6e 6b 20 29 7b 0a 20 20  e->szChunk ){.  
1e7d0 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74    nByte = ((nByt
1e7e0 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  e + pFile->szChu
1e7f0 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73  nk - 1)/pFile->s
1e800 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d  zChunk) * pFile-
1e810 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20  >szChunk;.  }.. 
1e820 20 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 74 72   rc = robust_ftr
1e830 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c  uncate(pFile->h,
1e840 20 28 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a   (off_t)nByte);.
1e850 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1e860 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1e870 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65   = errno;.    re
1e880 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
1e890 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  r(SQLITE_IOERR_T
1e8a0 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63  RUNCATE, "ftrunc
1e8b0 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ate", pFile->zPa
1e8c0 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69  th);.  }else{.#i
1e8d0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
1e8e0 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f   /* If we are do
1e8f0 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69  ing a normal wri
1e900 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65  te to a database
1e910 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65   file (as oppose
1e920 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69 6e  d to.    ** doin
1e930 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  g a hot-journal 
1e940 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72  rollback or a wr
1e950 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65  ite to some file
1e960 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20   other than a.  
1e970 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61    ** normal data
1e980 62 61 73 65 20 66 69 6c 65 29 20 61 6e 64 20 77  base file) and w
1e990 65 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66  e truncate the f
1e9a0 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ile to zero leng
1e9b0 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  th,.    ** that 
1e9c0 65 66 66 65 63 74 69 76 65 6c 79 20 75 70 64 61  effectively upda
1e9d0 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 20 63  tes the change c
1e9e0 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 6d 69  ounter.  This mi
1e9f0 67 68 74 20 68 61 70 70 65 6e 0a 20 20 20 20 2a  ght happen.    *
1ea00 2a 20 77 68 65 6e 20 72 65 73 74 6f 72 69 6e 67  * when restoring
1ea10 20 61 20 64 61 74 61 62 61 73 65 20 75 73 69 6e   a database usin
1ea20 67 20 74 68 65 20 62 61 63 6b 75 70 20 41 50 49  g the backup API
1ea30 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e   from a zero-len
1ea40 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72 63  gth.    ** sourc
1ea50 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1ea60 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61  ( pFile->inNorma
1ea70 6c 57 72 69 74 65 20 26 26 20 6e 42 79 74 65 3d  lWrite && nByte=
1ea80 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  =0 ){.      pFil
1ea90 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  e->transCntrChng
1eaa0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
1eab0 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 53  if..    return S
1eac0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
1ead0 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
1eae0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
1eaf0 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62  e of a file in b
1eb00 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ytes.*/.static i
1eb10 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 28  nt unixFileSize(
1eb20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1eb30 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  , i64 *pSize){. 
1eb40 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63   int rc;.  struc
1eb50 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73  t stat buf;.  as
1eb60 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63  sert( id );.  rc
1eb70 20 3d 20 6f 73 46 73 74 61 74 28 28 28 75 6e 69   = osFstat(((uni
1eb80 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26  xFile*)id)->h, &
1eb90 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  buf);.  Simulate
1eba0 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b  IOError( rc=1 );
1ebb0 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
1ebc0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
1ebd0 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
1ebe0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75   errno;.    retu
1ebf0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1ec00 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53  FSTAT;.  }.  *pS
1ec10 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a  ize = buf.st_siz
1ec20 65 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70  e;..  /* When op
1ec30 65 6e 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a  ening a zero-siz
1ec40 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1ec50 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20  findInodeInfo() 
1ec60 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77  procedure.  ** w
1ec70 72 69 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62  rites a single b
1ec80 79 74 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69  yte into that fi
1ec90 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77  le in order to w
1eca0 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67  ork around a bug
1ecb0 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d  .  ** in the OS-
1ecc0 58 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74  X msdos filesyst
1ecd0 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f  em.  In order to
1ece0 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20   avoid problems 
1ecf0 77 69 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20  with upper.  ** 
1ed00 6c 61 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20  layers, we need 
1ed10 74 6f 20 72 65 70 6f 72 74 20 74 68 69 73 20 66  to report this f
1ed20 69 6c 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f  ile size as zero
1ed30 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20   even though it 
1ed40 69 73 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31  is.  ** really 1
1ed50 2e 20 20 20 54 69 63 6b 65 74 20 23 33 32 36 30  .   Ticket #3260
1ed60 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53  ..  */.  if( *pS
1ed70 69 7a 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20  ize==1 ) *pSize 
1ed80 3d 20 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20  = 0;...  return 
1ed90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
1eda0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1edb0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
1edc0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1edd0 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65  __)./*.** Handle
1ede0 72 20 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b  r for proxy-lock
1edf0 69 6e 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  ing file-control
1ee00 20 76 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64   verbs.  Defined
1ee10 20 62 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a   below in the.**
1ee20 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e   proxying lockin
1ee30 67 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73  g division..*/.s
1ee40 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46  tatic int proxyF
1ee50 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  ileControl(sqlit
1ee60 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69  e3_file*,int,voi
1ee70 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  d*);.#endif../* 
1ee80 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1ee90 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68  n is called to h
1eea0 61 6e 64 6c 65 20 74 68 65 20 53 51 4c 49 54 45  andle the SQLITE
1eeb0 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
1eec0 20 0a 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74 72 6f   .** file-contro
1eed0 6c 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 45 6e  l operation.  En
1eee0 6c 61 72 67 65 20 74 68 65 20 64 61 74 61 62 61  large the databa
1eef0 73 65 20 74 6f 20 6e 42 79 74 65 73 20 69 6e 20  se to nBytes in 
1ef00 73 69 7a 65 0a 2a 2a 20 28 72 6f 75 6e 64 65 64  size.** (rounded
1ef10 20 75 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20   up to the next 
1ef20 63 68 75 6e 6b 2d 73 69 7a 65 29 2e 20 20 49 66  chunk-size).  If
1ef30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1ef40 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6e 42 79 74   already.** nByt
1ef50 65 73 20 6f 72 20 6c 61 72 67 65 72 2c 20 74 68  es or larger, th
1ef60 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
1ef70 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
1ef80 20 69 6e 74 20 66 63 6e 74 6c 53 69 7a 65 48 69   int fcntlSizeHi
1ef90 6e 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  nt(unixFile *pFi
1efa0 6c 65 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a  le, i64 nByte){.
1efb0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
1efc0 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 69 36  hunk>0 ){.    i6
1efd0 34 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20  4 nSize;        
1efe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1eff0 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a  equired file siz
1f000 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  e */.    struct 
1f010 73 74 61 74 20 62 75 66 3b 20 20 20 20 20 20 20  stat buf;       
1f020 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
1f030 6f 20 68 6f 6c 64 20 72 65 74 75 72 6e 20 76 61  o hold return va
1f040 6c 75 65 73 20 6f 66 20 66 73 74 61 74 28 29 20  lues of fstat() 
1f050 2a 2f 0a 20 20 20 0a 20 20 20 20 69 66 28 20 6f  */.   .    if( o
1f060 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c  sFstat(pFile->h,
1f070 20 26 62 75 66 29 20 29 20 72 65 74 75 72 6e 20   &buf) ) return 
1f080 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1f090 41 54 3b 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d  AT;..    nSize =
1f0a0 20 28 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e   ((nByte+pFile->
1f0b0 73 7a 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69  szChunk-1) / pFi
1f0c0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70  le->szChunk) * p
1f0d0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20  File->szChunk;. 
1f0e0 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 28 69 36     if( nSize>(i6
1f0f0 34 29 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b  4)buf.st_size ){
1f100 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  ..#if defined(HA
1f110 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
1f120 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49  TE) && HAVE_POSI
1f130 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20  X_FALLOCATE.    
1f140 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 62 65    /* The code be
1f150 6c 6f 77 20 69 73 20 68 61 6e 64 6c 69 6e 67 20  low is handling 
1f160 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
1f170 20 6f 66 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28   of osFallocate(
1f180 29 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  ) .      ** corr
1f190 65 63 74 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c  ectly. posix_fal
1f1a0 6c 6f 63 61 74 65 28 29 20 69 73 20 64 65 66 69  locate() is defi
1f1b0 6e 65 64 20 74 6f 20 22 72 65 74 75 72 6e 73 20  ned to "returns 
1f1c0 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c  zero on success,
1f1d0 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e   .      ** or an
1f1e0 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e   error number on
1f1f0 20 20 66 61 69 6c 75 72 65 22 2e 20 53 65 65 20    failure". See 
1f200 74 68 65 20 6d 61 6e 70 61 67 65 20 66 6f 72 20  the manpage for 
1f210 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20  details. */.    
1f220 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20 20    int err;.     
1f230 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 65 72 72   do{.        err
1f240 20 3d 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70   = osFallocate(p
1f250 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f  File->h, buf.st_
1f260 73 69 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e  size, nSize-buf.
1f270 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  st_size);.      
1f280 7d 77 68 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e  }while( err==EIN
1f290 54 52 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  TR );.      if( 
1f2a0 65 72 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c  err ) return SQL
1f2b0 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
1f2c0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20  .#else.      /* 
1f2d0 49 66 20 74 68 65 20 4f 53 20 64 6f 65 73 20 6e  If the OS does n
1f2e0 6f 74 20 68 61 76 65 20 70 6f 73 69 78 5f 66 61  ot have posix_fa
1f2f0 6c 6c 6f 63 61 74 65 28 29 2c 20 66 61 6b 65 20  llocate(), fake 
1f300 69 74 2e 20 46 69 72 73 74 20 75 73 65 0a 20 20  it. First use.  
1f310 20 20 20 20 2a 2a 20 66 74 72 75 6e 63 61 74 65      ** ftruncate
1f320 28 29 20 74 6f 20 73 65 74 20 74 68 65 20 66 69  () to set the fi
1f330 6c 65 20 73 69 7a 65 2c 20 74 68 65 6e 20 77 72  le size, then wr
1f340 69 74 65 20 61 20 73 69 6e 67 6c 65 20 62 79 74  ite a single byt
1f350 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  e to.      ** th
1f360 65 20 6c 61 73 74 20 62 79 74 65 20 69 6e 20 65  e last byte in e
1f370 61 63 68 20 62 6c 6f 63 6b 20 77 69 74 68 69 6e  ach block within
1f380 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65   the extended re
1f390 67 69 6f 6e 2e 20 54 68 69 73 0a 20 20 20 20 20  gion. This.     
1f3a0 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20   ** is the same 
1f3b0 74 65 63 68 6e 69 71 75 65 20 75 73 65 64 20 62  technique used b
1f3c0 79 20 67 6c 69 62 63 20 74 6f 20 69 6d 70 6c 65  y glibc to imple
1f3d0 6d 65 6e 74 20 70 6f 73 69 78 5f 66 61 6c 6c 6f  ment posix_fallo
1f3e0 63 61 74 65 28 29 0a 20 20 20 20 20 20 2a 2a 20  cate().      ** 
1f3f0 6f 6e 20 73 79 73 74 65 6d 73 20 74 68 61 74 20  on systems that 
1f400 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 72 65  do not have a re
1f410 61 6c 20 66 61 6c 6c 6f 63 61 74 65 28 29 20 73  al fallocate() s
1f420 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 20 20 20 20  ystem call..    
1f430 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e    */.      int n
1f440 42 6c 6b 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b  Blk = buf.st_blk
1f450 73 69 7a 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73  size;  /* File-s
1f460 79 73 74 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65  ystem block size
1f470 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 57   */.      i64 iW
1f480 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
1f490 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66        /* Next of
1f4a0 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 74 6f  fset to write to
1f4b0 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 72   */..      if( r
1f4c0 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
1f4d0 70 46 69 6c 65 2d 3e 68 2c 20 6e 53 69 7a 65 29  pFile->h, nSize)
1f4e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
1f4f0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
1f500 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65  rrno;.        re
1f510 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
1f520 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  r(SQLITE_IOERR_T
1f530 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63  RUNCATE, "ftrunc
1f540 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ate", pFile->zPa
1f550 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  th);.      }.   
1f560 20 20 20 69 57 72 69 74 65 20 3d 20 28 28 62 75     iWrite = ((bu
1f570 66 2e 73 74 5f 73 69 7a 65 20 2b 20 32 2a 6e 42  f.st_size + 2*nB
1f580 6c 6b 20 2d 20 31 29 2f 6e 42 6c 6b 29 2a 6e 42  lk - 1)/nBlk)*nB
1f590 6c 6b 2d 31 3b 0a 20 20 20 20 20 20 77 68 69 6c  lk-1;.      whil
1f5a0 65 28 20 69 57 72 69 74 65 3c 6e 53 69 7a 65 20  e( iWrite<nSize 
1f5b0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
1f5c0 57 72 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57  Write = seekAndW
1f5d0 72 69 74 65 28 70 46 69 6c 65 2c 20 69 57 72 69  rite(pFile, iWri
1f5e0 74 65 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20 20  te, "", 1);.    
1f5f0 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 21 3d      if( nWrite!=
1f600 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
1f610 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20  E_IOERR_WRITE;. 
1f620 20 20 20 20 20 20 20 69 57 72 69 74 65 20 2b 3d         iWrite +=
1f630 20 6e 42 6c 6b 3b 0a 20 20 20 20 20 20 7d 0a 23   nBlk;.      }.#
1f640 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
1f650 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1f660 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 28 53 51 4c  _OK;.}..#if (SQL
1f670 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45  ITE_ENABLE_APPLE
1f680 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e  _SPI>0) && defin
1f690 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23 69  ed(__APPLE__).#i
1f6a0 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 5f  nclude "sqlite3_
1f6b0 70 72 69 76 61 74 65 2e 68 22 0a 23 69 6e 63 6c  private.h".#incl
1f6c0 75 64 65 20 3c 63 6f 70 79 66 69 6c 65 2e 68 3e  ude <copyfile.h>
1f6d0 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 44  .static int getD
1f6e0 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65  bPathForUnixFile
1f6f0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
1f700 2c 20 63 68 61 72 20 2a 64 62 50 61 74 68 29 3b  , char *dbPath);
1f710 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69  .#endif.static i
1f720 6e 74 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e  nt isProxyLockin
1f730 67 4d 6f 64 65 28 75 6e 69 78 46 69 6c 65 20 2a  gMode(unixFile *
1f740 29 3b 0a 0a 23 69 66 20 28 53 51 4c 49 54 45 5f  );..#if (SQLITE_
1f750 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49  ENABLE_APPLE_SPI
1f760 3e 30 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f  >0) && defined(_
1f770 5f 41 50 50 4c 45 5f 5f 29 0a 73 74 61 74 69 63  _APPLE__).static
1f780 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74   int unixTruncat
1f790 65 44 61 74 61 62 61 73 65 28 75 6e 69 78 46 69  eDatabase(unixFi
1f7a0 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 62  le *pFile, int b
1f7b0 46 6c 61 67 73 29 20 7b 0a 20 20 73 71 6c 69 74  Flags) {.  sqlit
1f7c0 65 33 5f 66 69 6c 65 20 2a 69 64 20 3d 20 28 73  e3_file *id = (s
1f7d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 70 46  qlite3_file *)pF
1f7e0 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ile;.  int rc = 
1f7f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 76 6f 69  SQLITE_OK;.  voi
1f800 64 20 2a 70 4c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b  d *pLock = NULL;
1f810 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 30  .  int flags = 0
1f820 3b 0a 20 20 69 6e 74 20 63 6f 72 72 75 70 74 46  ;.  int corruptF
1f830 69 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 69  ileLock = 0;.  i
1f840 6e 74 20 69 73 43 6f 72 72 75 70 74 20 3d 20 30  nt isCorrupt = 0
1f850 3b 0a 20 20 20 20 0a 23 69 66 20 53 51 4c 49 54  ;.    .#if SQLIT
1f860 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52  E_ENABLE_DATA_PR
1f870 4f 54 45 43 54 49 4f 4e 0a 20 20 66 6c 61 67 73  OTECTION.  flags
1f880 20 7c 3d 20 70 46 69 6c 65 2d 3e 70 72 6f 74 46   |= pFile->protF
1f890 6c 61 67 73 3b 0a 23 65 6e 64 69 66 0a 23 69 66  lags;.#endif.#if
1f8a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1f8b0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69  OCKING_STYLE.  i
1f8c0 66 28 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e  f( isProxyLockin
1f8d0 67 4d 6f 64 65 28 70 46 69 6c 65 29 20 29 7b 0a  gMode(pFile) ){.
1f8e0 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
1f8f0 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f  ITE_OPEN_AUTOPRO
1f900 58 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  XY;.  }.#endif. 
1f910 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33   .  rc = sqlite3
1f920 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 70  demo_superlock(p
1f930 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 30 2c 20  File->zPath, 0, 
1f940 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 26 70 4c  flags, 0, 0, &pL
1f950 6f 63 6b 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ock);.  if( rc )
1f960 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  {.    if( rc==SQ
1f970 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20  LITE_CORRUPT || 
1f980 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 41 44  rc==SQLITE_NOTAD
1f990 42 20 29 7b 0a 20 20 20 20 20 20 69 73 43 6f 72  B ){.      isCor
1f9a0 72 75 70 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  rupt = 1;.      
1f9b0 72 63 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f  rc = sqlite3demo
1f9c0 5f 73 75 70 65 72 6c 6f 63 6b 5f 63 6f 72 72 75  _superlock_corru
1f9d0 70 74 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f  pt(id, SQLITE_LO
1f9e0 43 4b 5f 45 58 43 4c 55 53 49 56 45 2c 20 26 63  CK_EXCLUSIVE, &c
1f9f0 6f 72 72 75 70 74 46 69 6c 65 4c 6f 63 6b 29 3b  orruptFileLock);
1fa00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1fa10 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
1fa20 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
1fa30 20 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d    rc = pFile->pM
1fa40 65 74 68 6f 64 2d 3e 78 54 72 75 6e 63 61 74 65  ethod->xTruncate
1fa50 28 69 64 2c 20 28 28 70 46 69 6c 65 2d 3e 66 73  (id, ((pFile->fs
1fa60 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
1fa70 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29  SFLAGS_IS_MSDOS)
1fa80 20 21 3d 20 30 29 20 3f 20 31 4c 20 3a 20 30 4c   != 0) ? 1L : 0L
1fa90 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1faa0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 6e  ITE_OK ){.    un
1fab0 69 78 49 6e 76 61 6c 69 64 61 74 65 53 75 70 70  ixInvalidateSupp
1fac0 6f 72 74 46 69 6c 65 73 28 70 46 69 6c 65 2c 20  ortFiles(pFile, 
1fad0 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  0);.  }.  pFile-
1fae0 3e 70 4d 65 74 68 6f 64 2d 3e 78 53 79 6e 63 28  >pMethod->xSync(
1faf0 69 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  id, SQLITE_SYNC_
1fb00 46 55 4c 4c 29 3b 0a 0a 0a 20 20 69 66 28 20 69  FULL);...  if( i
1fb10 73 43 6f 72 72 75 70 74 20 29 7b 0a 20 20 20 20  sCorrupt ){.    
1fb20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65  sqlite3demo_supe
1fb30 72 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28  runlock_corrupt(
1fb40 69 64 2c 20 63 6f 72 72 75 70 74 46 69 6c 65 4c  id, corruptFileL
1fb50 6f 63 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ock);.  }else{. 
1fb60 20 20 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73     sqlite3demo_s
1fb70 75 70 65 72 75 6e 6c 6f 63 6b 28 70 4c 6f 63 6b  uperunlock(pLock
1fb80 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1fb90 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
1fba0 74 20 75 6e 69 78 49 6e 76 61 6c 69 64 61 74 65  t unixInvalidate
1fbb0 53 75 70 70 6f 72 74 46 69 6c 65 73 28 75 6e 69  SupportFiles(uni
1fbc0 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e  xFile *pFile, in
1fbd0 74 20 73 6b 69 70 57 41 4c 29 20 7b 0a 20 20 63  t skipWAL) {.  c
1fbe0 68 61 72 20 6a 50 61 74 68 5b 4d 41 58 50 41 54  har jPath[MAXPAT
1fbf0 48 4c 45 4e 2b 39 5d 3b 0a 20 20 69 6e 74 20 7a  HLEN+9];.  int z
1fc00 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6a 50  Len = strlcpy(jP
1fc10 61 74 68 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ath, pFile->zPat
1fc20 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 2b 39 29  h, MAXPATHLEN+9)
1fc30 3b 0a 20 20 69 66 28 20 7a 4c 65 6e 3c 4d 41 58  ;.  if( zLen<MAX
1fc40 50 41 54 48 4c 45 4e 20 29 7b 0a 20 20 20 20 73  PATHLEN ){.    s
1fc50 69 7a 65 5f 74 20 6a 4c 65 6e 3b 0a 20 20 20 20  ize_t jLen;.    
1fc60 63 6f 6e 73 74 20 63 68 61 72 20 65 78 74 65 6e  const char exten
1fc70 73 69 6f 6e 73 5b 33 5d 5b 39 5d 20 3d 20 7b 20  sions[3][9] = { 
1fc80 22 2d 77 61 6c 22 2c 20 22 2d 6a 6f 75 72 6e 61  "-wal", "-journa
1fc90 6c 22 2c 20 22 2d 73 68 6d 22 20 7d 3b 0a 20 20  l", "-shm" };.  
1fca0 20 20 69 6e 74 20 6a 20 3d 20 28 73 6b 69 70 57    int j = (skipW
1fcb0 41 4c 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  AL ? 1 : 0);.   
1fcc0 20 66 6f 72 28 20 3b 20 6a 3c 33 3b 20 6a 2b 2b   for( ; j<3; j++
1fcd0 20 29 7b 0a 20 20 20 20 20 20 0a 20 20 20 20 20   ){.      .     
1fce0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
1fcf0 20 69 66 20 74 68 65 20 73 68 6d 20 66 69 6c 65   if the shm file
1fd00 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
1fd10 65 64 20 66 6f 72 20 74 68 69 73 20 70 46 69 6c  ed for this pFil
1fd20 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6a  e */.      if( j
1fd30 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ==2 ){.        u
1fd40 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
1fd50 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c   /* Because pFil
1fd60 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61  e->pInode is sha
1fd70 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
1fd80 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e  ds */.        un
1fd90 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
1fda0 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
1fdb0 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode->pShmNode;. 
1fdc0 20 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e         if( pShmN
1fdd0 6f 64 65 20 26 26 20 21 70 53 68 6d 4e 6f 64 65  ode && !pShmNode
1fde0 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a  ->isReadonly ){.
1fdf0 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
1fe00 20 73 74 61 74 20 73 53 74 61 74 3b 0a 20 20 20   stat sStat;.   
1fe10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
1fe20 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
1fe30 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  ode->mutex);.   
1fe40 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
1fe50 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
1fe60 68 3e 3d 30 20 26 26 20 21 6f 73 46 73 74 61 74  h>=0 && !osFstat
1fe70 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73  (pShmNode->h, &s
1fe80 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Stat) ){.       
1fe90 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f       unsigned lo
1fea0 6e 67 20 73 69 7a 65 20 3d 20 28 73 53 74 61 74  ng size = (sStat
1feb0 2e 73 74 5f 73 69 7a 65 3c 34 29 20 3f 20 73 53  .st_size<4) ? sS
1fec0 74 61 74 2e 73 74 5f 73 69 7a 65 20 3a 20 34 3b  tat.st_size : 4;
1fed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1fee0 20 73 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20   size>0 ){.     
1fef0 20 20 20 20 20 20 20 20 20 62 7a 65 72 6f 28 70           bzero(p
1ff00 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
1ff10 6e 5b 30 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20  n[0], size);.   
1ff20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1ff30 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
1ff40 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1ff50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75  .              u
1ff60 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
1ff70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
1ff80 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1ff90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1ffa0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
1ffb0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1ffc0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1ffd0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1ffe0 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75       unixLeaveMu
1fff0 74 65 78 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tex();.      }. 
20000 20 20 20 20 20 6a 4c 65 6e 20 3d 20 73 74 72 6c       jLen = strl
20010 63 70 79 28 26 6a 50 61 74 68 5b 7a 4c 65 6e 5d  cpy(&jPath[zLen]
20020 2c 20 65 78 74 65 6e 73 69 6f 6e 73 5b 6a 5d 2c  , extensions[j],
20030 20 39 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6a   9);.      if( j
20040 4c 65 6e 20 3c 20 39 20 29 7b 0a 20 20 20 20 20  Len < 9 ){.     
20050 20 20 20 69 6e 74 20 6a 66 6c 61 67 73 20 3d 20     int jflags = 
20060 28 6a 3c 32 29 20 3f 20 4f 5f 54 52 55 4e 43 20  (j<2) ? O_TRUNC 
20070 3a 20 4f 5f 52 44 57 52 3b 0a 20 20 20 20 20 20  : O_RDWR;.      
20080 20 20 69 6e 74 20 6a 66 64 20 3d 20 6f 70 65 6e    int jfd = open
20090 28 6a 50 61 74 68 2c 20 6a 66 6c 61 67 73 29 3b  (jPath, jflags);
200a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 66 64  .        if( jfd
200b0 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
200c0 20 20 20 20 69 66 28 20 65 72 72 6e 6f 21 3d 45      if( errno!=E
200d0 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 20  NOENT ){.       
200e0 20 20 20 20 20 70 65 72 72 6f 72 28 6a 50 61 74       perror(jPat
200f0 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  h);.          }.
20100 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
20110 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a  .          if( j
20120 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==2 ){.         
20130 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
20140 53 74 61 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Stat;.          
20150 20 20 69 66 28 20 21 6f 73 46 73 74 61 74 28 6a    if( !osFstat(j
20160 66 64 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  fd, &sStat) ){. 
20170 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73               uns
20180 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 7a 65 20  igned long size 
20190 3d 20 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  = (sStat.st_size
201a0 3c 34 29 20 3f 20 73 53 74 61 74 2e 73 74 5f 73  <4) ? sStat.st_s
201b0 69 7a 65 20 3a 20 34 3b 0a 20 20 20 20 20 20 20  ize : 4;.       
201c0 20 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e         if( size>
201d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
201e0 20 20 20 20 20 75 69 6e 74 33 32 5f 74 20 7a 65       uint32_t ze
201f0 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ro = 0;.        
20200 20 20 20 20 20 20 20 20 70 77 72 69 74 65 28 6a          pwrite(j
20210 66 64 2c 20 26 7a 65 72 6f 2c 20 28 73 69 7a 65  fd, &zero, (size
20220 5f 74 29 73 69 7a 65 2c 20 30 29 3b 0a 20 20 20  _t)size, 0);.   
20230 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
20240 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
20250 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
20260 20 66 73 79 6e 63 28 6a 66 64 29 3b 0a 20 20 20   fsync(jfd);.   
20270 20 20 20 20 20 20 20 63 6c 6f 73 65 28 6a 66 64         close(jfd
20280 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
20290 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
202a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
202b0 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  K;.}..static int
202c0 20 75 6e 69 78 52 65 70 6c 61 63 65 44 61 74 61   unixReplaceData
202d0 62 61 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  base(unixFile *p
202e0 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 20 2a 73  File, sqlite3 *s
202f0 72 63 64 62 29 20 7b 0a 20 20 73 71 6c 69 74 65  rcdb) {.  sqlite
20300 33 5f 66 69 6c 65 20 2a 69 64 20 3d 20 28 73 71  3_file *id = (sq
20310 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 70 46 69  lite3_file *)pFi
20320 6c 65 3b 0a 20 20 42 74 72 65 65 20 2a 70 53 72  le;.  Btree *pSr
20330 63 42 74 72 65 65 20 3d 20 4e 55 4c 4c 3b 0a 20  cBtree = NULL;. 
20340 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73   sqlite3_file *s
20350 72 63 5f 66 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a  rc_file = NULL;.
20360 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 53 72 63    unixFile *pSrc
20370 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63  File = NULL;.  c
20380 68 61 72 20 73 72 63 57 61 6c 50 61 74 68 5b 4d  har srcWalPath[M
20390 41 58 50 41 54 48 4c 45 4e 2b 35 5d 3b 0a 20 20  AXPATHLEN+5];.  
203a0 69 6e 74 20 73 72 63 57 61 6c 46 44 20 3d 20 2d  int srcWalFD = -
203b0 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  1;.  int rc = SQ
203c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 76 6f 69 64 20  LITE_OK;.  void 
203d0 2a 70 4c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20  *pLock = NULL;. 
203e0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 30 3b 0a   int flags = 0;.
203f0 20 20 73 71 6c 69 74 65 33 20 2a 73 72 63 64 62    sqlite3 *srcdb
20400 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63 6f 70 79  2 = NULL;.  copy
20410 66 69 6c 65 5f 73 74 61 74 65 5f 74 20 73 3b 0a  file_state_t s;.
20420 20 20 69 6e 74 20 63 6f 72 72 75 70 74 53 72 63    int corruptSrc
20430 46 69 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20  FileLock = 0;.  
20440 69 6e 74 20 63 6f 72 72 75 70 74 44 73 74 46 69  int corruptDstFi
20450 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 69 6e  leLock = 0;.  in
20460 74 20 69 73 53 72 63 43 6f 72 72 75 70 74 20 3d  t isSrcCorrupt =
20470 20 30 3b 0a 20 20 69 6e 74 20 69 73 44 73 74 43   0;.  int isDstC
20480 6f 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 0a 20  orrupt = 0;.  . 
20490 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
204a0 65 74 79 43 68 65 63 6b 4f 6b 28 73 72 63 64 62  etyCheckOk(srcdb
204b0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
204c0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
204d0 20 7d 0a 20 20 20 20 0a 23 69 66 20 53 51 4c 49   }.    .#if SQLI
204e0 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50  TE_ENABLE_DATA_P
204f0 52 4f 54 45 43 54 49 4f 4e 0a 20 20 66 6c 61 67  ROTECTION.  flag
20500 73 20 7c 3d 20 70 46 69 6c 65 2d 3e 70 72 6f 74  s |= pFile->prot
20510 46 6c 61 67 73 3b 0a 23 65 6e 64 69 66 0a 23 69  Flags;.#endif.#i
20520 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
20530 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
20540 69 66 28 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69  if( isProxyLocki
20550 6e 67 4d 6f 64 65 28 70 46 69 6c 65 29 20 29 7b  ngMode(pFile) ){
20560 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51  .    flags |= SQ
20570 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52  LITE_OPEN_AUTOPR
20580 4f 58 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  OXY;.  }.#endif.
20590 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65    .  rc = sqlite
205a0 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28  3demo_superlock(
205b0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 30 2c  pFile->zPath, 0,
205c0 20 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 26 70   flags, 0, 0, &p
205d0 4c 6f 63 6b 29 3b 0a 20 20 69 66 28 20 72 63 20  Lock);.  if( rc 
205e0 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
205f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c  QLITE_CORRUPT ||
20600 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 41   rc==SQLITE_NOTA
20610 44 42 20 29 7b 0a 20 20 20 20 20 20 69 73 44 73  DB ){.      isDs
20620 74 43 6f 72 72 75 70 74 20 3d 20 31 3b 0a 20 20  tCorrupt = 1;.  
20630 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20640 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 5f 63  demo_superlock_c
20650 6f 72 72 75 70 74 28 69 64 2c 20 53 51 4c 49 54  orrupt(id, SQLIT
20660 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45  E_LOCK_EXCLUSIVE
20670 2c 20 26 63 6f 72 72 75 70 74 44 73 74 46 69 6c  , &corruptDstFil
20680 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  eLock);.    }.  
20690 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
206a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
206b0 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 67 65 74 20   }.  }.  /* get 
206c0 74 68 65 20 73 72 63 20 66 69 6c 65 20 64 65 73  the src file des
206d0 63 72 69 70 74 6f 72 20 61 64 68 65 72 69 6e 67  criptor adhering
206e0 20 74 6f 20 74 68 65 20 64 62 20 73 74 72 75 63   to the db struc
206f0 74 20 61 63 63 65 73 73 20 72 75 6c 65 73 20 0a  t access rules .
20700 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20     ** this code 
20710 69 73 20 6d 6f 64 65 6c 65 64 20 61 66 74 65 72  is modeled after
20720 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
20730 6e 74 72 6f 6c 28 29 20 69 6e 20 6d 61 69 6e 2e  ntrol() in main.
20740 63 0a 20 20 20 2a 2f 20 0a 20 20 73 71 6c 69 74  c.   */ .  sqlit
20750 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
20760 72 63 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  rcdb->mutex);.  
20770 69 66 28 20 73 72 63 64 62 2d 3e 6e 44 62 3e 30  if( srcdb->nDb>0
20780 20 29 7b 0a 20 20 20 20 70 53 72 63 42 74 72 65   ){.    pSrcBtre
20790 65 20 3d 20 73 72 63 64 62 2d 3e 61 44 62 5b 30  e = srcdb->aDb[0
207a0 5d 2e 70 42 74 3b 0a 20 20 7d 0a 20 20 69 66 28  ].pBt;.  }.  if(
207b0 20 70 53 72 63 42 74 72 65 65 20 29 7b 0a 20 20   pSrcBtree ){.  
207c0 20 20 50 61 67 65 72 20 2a 70 53 72 63 50 61 67    Pager *pSrcPag
207d0 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  er;.    sqlite3B
207e0 74 72 65 65 45 6e 74 65 72 28 70 53 72 63 42 74  treeEnter(pSrcBt
207f0 72 65 65 29 3b 0a 20 20 20 20 70 53 72 63 50 61  ree);.    pSrcPa
20800 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ger = sqlite3Btr
20810 65 65 50 61 67 65 72 28 70 53 72 63 42 74 72 65  eePager(pSrcBtre
20820 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
20830 70 53 72 63 50 61 67 65 72 21 3d 30 20 29 3b 0a  pSrcPager!=0 );.
20840 20 20 20 20 73 72 63 5f 66 69 6c 65 20 3d 20 73      src_file = s
20850 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
20860 70 53 72 63 50 61 67 65 72 29 3b 0a 20 20 20 20  pSrcPager);.    
20870 61 73 73 65 72 74 28 20 73 72 63 5f 66 69 6c 65  assert( src_file
20880 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 73  !=0 );.    if( s
20890 72 63 5f 66 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  rc_file->pMethod
208a0 73 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  s ){.      int s
208b0 72 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  rcFlags = 0;.   
208c0 20 20 20 70 53 72 63 46 69 6c 65 20 3d 20 28 75     pSrcFile = (u
208d0 6e 69 78 46 69 6c 65 20 2a 29 73 72 63 5f 66 69  nixFile *)src_fi
208e0 6c 65 3b 0a 20 20 20 20 20 20 2f 2a 20 77 61 6c  le;.      /* wal
208f0 20 6d 6f 64 65 20 64 62 20 63 61 6e 6e 6f 74 20   mode db cannot 
20900 62 65 20 6f 70 65 6e 65 64 20 72 65 61 64 6f 6e  be opened readon
20910 6c 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 20 28  ly */.      if (
20920 28 70 53 72 63 46 69 6c 65 2d 3e 6f 70 65 6e 46  (pSrcFile->openF
20930 6c 61 67 73 20 26 20 4f 5f 52 44 57 52 29 20 3d  lags & O_RDWR) =
20940 3d 20 4f 5f 52 44 57 52 29 20 7b 0a 20 20 20 20  = O_RDWR) {.    
20950 20 20 20 20 73 72 63 46 6c 61 67 73 20 3d 20 53      srcFlags = S
20960 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
20970 52 49 54 45 3b 0a 20 20 20 20 20 20 7d 20 65 6c  RITE;.      } el
20980 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 72 63  se {.        src
20990 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  Flags = SQLITE_O
209a0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
209b0 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45      }.#if SQLITE
209c0 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f  _ENABLE_DATA_PRO
209d0 54 45 43 54 49 4f 4e 0a 20 20 20 20 20 20 73 72  TECTION.      sr
209e0 63 46 6c 61 67 73 20 7c 3d 20 70 53 72 63 46 69  cFlags |= pSrcFi
209f0 6c 65 2d 3e 70 72 6f 74 46 6c 61 67 73 3b 0a 23  le->protFlags;.#
20a00 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
20a10 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
20a20 53 54 59 4c 45 0a 20 20 20 20 20 20 69 66 28 20  STYLE.      if( 
20a30 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f  isProxyLockingMo
20a40 64 65 28 70 53 72 63 46 69 6c 65 29 20 29 7b 0a  de(pSrcFile) ){.
20a50 20 20 20 20 20 20 20 20 73 72 63 46 6c 61 67 73          srcFlags
20a60 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
20a70 41 55 54 4f 50 52 4f 58 59 3b 0a 20 20 20 20 20  AUTOPROXY;.     
20a80 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
20a90 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
20aa0 6e 5f 76 32 28 70 53 72 63 46 69 6c 65 2d 3e 7a  n_v2(pSrcFile->z
20ab0 50 61 74 68 2c 20 26 73 72 63 64 62 32 2c 20 73  Path, &srcdb2, s
20ac0 72 63 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  rcFlags, 0);.   
20ad0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20ae0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
20af0 2f 2a 20 73 74 61 72 74 20 61 20 64 65 66 65 72  /* start a defer
20b00 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  red transaction 
20b10 61 6e 64 20 72 65 61 64 20 74 6f 20 65 73 74 61  and read to esta
20b20 62 6c 69 73 68 20 61 20 72 65 61 64 20 6c 6f 63  blish a read loc
20b30 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  k */.        rc 
20b40 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 73  = sqlite3_exec(s
20b50 72 63 64 62 32 2c 20 22 42 45 47 49 4e 20 44 45  rcdb2, "BEGIN DE
20b60 46 45 52 52 45 44 3b 20 50 52 41 47 4d 41 20 73  FERRED; PRAGMA s
20b70 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 22 2c 20  chema_version", 
20b80 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
20b90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20ba0 5f 43 4f 52 52 55 50 54 20 7c 7c 20 72 63 3d 3d  _CORRUPT || rc==
20bb0 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 29 7b  SQLITE_NOTADB ){
20bc0 0a 20 20 20 20 20 20 20 20 20 20 69 73 53 72 63  .          isSrc
20bd0 43 6f 72 72 75 70 74 20 3d 20 31 3b 0a 20 20 20  Corrupt = 1;.   
20be0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
20bf0 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63  te3demo_superloc
20c00 6b 5f 63 6f 72 72 75 70 74 28 73 72 63 5f 66 69  k_corrupt(src_fi
20c10 6c 65 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  le, SQLITE_LOCK_
20c20 53 48 41 52 45 44 2c 20 26 63 6f 72 72 75 70 74  SHARED, &corrupt
20c30 53 72 63 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20  SrcFileLock);.  
20c40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
20c50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
20c60 21 73 72 63 64 62 32 20 7c 7c 20 70 53 72 63 46  !srcdb2 || pSrcF
20c70 69 6c 65 3d 3d 4e 55 4c 4c 20 7c 7c 20 70 53 72  ile==NULL || pSr
20c80 63 46 69 6c 65 2d 3e 68 3c 30 29 7b 0a 20 20 20  cFile->h<0){.   
20c90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54   rc = SQLITE_INT
20ca0 45 52 4e 41 4c 3b 0a 20 20 7d 0a 20 20 69 66 28  ERNAL;.  }.  if(
20cb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20cc0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 72  {.    goto end_r
20cd0 65 70 6c 61 63 65 5f 64 61 74 61 62 61 73 65 3b  eplace_database;
20ce0 0a 20 20 7d 0a 20 20 2f 2a 20 62 6f 74 68 20 64  .  }.  /* both d
20cf0 61 74 61 62 61 73 65 73 20 61 72 65 20 6c 6f 63  atabases are loc
20d00 6b 65 64 20 61 70 70 72 6f 70 72 69 61 74 65 6c  ked appropriatel
20d10 79 2c 20 63 6f 70 79 20 74 68 65 20 73 72 63 20  y, copy the src 
20d20 77 61 6c 20 6a 6f 75 72 6e 61 6c 20 69 66 20 0a  wal journal if .
20d30 20 20 20 2a 2a 20 6f 6e 65 20 65 78 69 73 74 73     ** one exists
20d40 20 61 6e 64 20 74 68 65 6e 20 74 68 65 20 61 63   and then the ac
20d50 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  tual database fi
20d60 6c 65 0a 20 20 20 2a 2f 0a 20 20 73 74 72 6c 63  le.   */.  strlc
20d70 70 79 28 73 72 63 57 61 6c 50 61 74 68 2c 20 70  py(srcWalPath, p
20d80 53 72 63 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20  SrcFile->zPath, 
20d90 4d 41 58 50 41 54 48 4c 45 4e 2b 35 29 3b 0a 20  MAXPATHLEN+5);. 
20da0 20 73 74 72 6c 63 61 74 28 73 72 63 57 61 6c 50   strlcat(srcWalP
20db0 61 74 68 2c 20 22 2d 77 61 6c 22 2c 20 4d 41 58  ath, "-wal", MAX
20dc0 50 41 54 48 4c 45 4e 2b 35 29 3b 0a 20 20 73 72  PATHLEN+5);.  sr
20dd0 63 57 61 6c 46 44 20 3d 20 6f 70 65 6e 28 73 72  cWalFD = open(sr
20de0 63 57 61 6c 50 61 74 68 2c 20 4f 5f 52 44 4f 4e  cWalPath, O_RDON
20df0 4c 59 29 3b 0a 20 20 69 66 28 20 21 28 73 72 63  LY);.  if( !(src
20e00 57 61 6c 46 44 3c 30 29 20 29 7b 0a 20 20 20 20  WalFD<0) ){.    
20e10 63 68 61 72 20 64 73 74 57 61 6c 50 61 74 68 5b  char dstWalPath[
20e20 4d 41 58 50 41 54 48 4c 45 4e 2b 35 5d 3b 0a 20  MAXPATHLEN+5];. 
20e30 20 20 20 69 6e 74 20 64 73 74 57 61 6c 46 44 20     int dstWalFD 
20e40 3d 20 2d 31 3b 0a 20 20 20 20 73 74 72 6c 63 70  = -1;.    strlcp
20e50 79 28 64 73 74 57 61 6c 50 61 74 68 2c 20 70 46  y(dstWalPath, pF
20e60 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58 50  ile->zPath, MAXP
20e70 41 54 48 4c 45 4e 2b 35 29 3b 0a 20 20 20 20 73  ATHLEN+5);.    s
20e80 74 72 6c 63 61 74 28 64 73 74 57 61 6c 50 61 74  trlcat(dstWalPat
20e90 68 2c 20 22 2d 77 61 6c 22 2c 20 4d 41 58 50 41  h, "-wal", MAXPA
20ea0 54 48 4c 45 4e 2b 35 29 3b 0a 20 20 20 20 64 73  THLEN+5);.    ds
20eb0 74 57 61 6c 46 44 20 3d 20 6f 70 65 6e 28 64 73  tWalFD = open(ds
20ec0 74 57 61 6c 50 61 74 68 2c 20 4f 5f 52 44 57 52  tWalPath, O_RDWR
20ed0 7c 4f 5f 43 52 45 41 54 2c 20 53 51 4c 49 54 45  |O_CREAT, SQLITE
20ee0 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
20ef0 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20  RMISSIONS);.    
20f00 69 66 28 20 21 28 64 73 74 57 61 6c 46 44 3c 30  if( !(dstWalFD<0
20f10 29 20 29 7b 0a 20 20 20 20 20 20 73 20 3d 20 63  ) ){.      s = c
20f20 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 61 6c  opyfile_state_al
20f30 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 6c 73 65  loc();.      lse
20f40 65 6b 28 73 72 63 57 61 6c 46 44 2c 20 30 2c 20  ek(srcWalFD, 0, 
20f50 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 20  SEEK_SET);.     
20f60 20 6c 73 65 65 6b 28 64 73 74 57 61 6c 46 44 2c   lseek(dstWalFD,
20f70 20 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20   0, SEEK_SET);. 
20f80 20 20 20 20 20 69 66 28 20 66 63 6f 70 79 66 69       if( fcopyfi
20f90 6c 65 28 73 72 63 57 61 6c 46 44 2c 20 64 73 74  le(srcWalFD, dst
20fa0 57 61 6c 46 44 2c 20 73 2c 20 43 4f 50 59 46 49  WalFD, s, COPYFI
20fb0 4c 45 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20  LE_ALL) ){.     
20fc0 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f     int err=errno
20fd0 3b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68  ;.        switch
20fe0 28 65 72 72 29 20 7b 0a 20 20 20 20 20 20 20 20  (err) {.        
20ff0 20 20 63 61 73 65 20 45 4e 4f 4d 45 4d 3a 0a 20    case ENOMEM:. 
21000 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
21010 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
21020 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
21030 0a 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75  .          defau
21040 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  lt:.            
21050 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
21060 20 3d 20 65 72 72 3b 0a 20 20 20 20 20 20 20 20   = err;.        
21070 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
21080 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d  IOERR;.        }
21090 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
210a0 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 66 72  opyfile_state_fr
210b0 65 65 28 73 29 3b 0a 20 20 20 20 20 20 63 6c 6f  ee(s);.      clo
210c0 73 65 28 64 73 74 57 61 6c 46 44 29 3b 0a 20 20  se(dstWalFD);.  
210d0 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65 28 73 72    }.    close(sr
210e0 63 57 61 6c 46 44 29 3b 0a 20 20 7d 0a 20 20 69  cWalFD);.  }.  i
210f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21100 20 29 7b 0a 20 20 20 20 2f 2a 20 62 65 66 6f 72   ){.    /* befor
21110 65 20 77 65 20 63 6f 70 79 2c 20 65 6e 73 75 72  e we copy, ensur
21120 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  e that the file 
21130 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77  change counter w
21140 69 6c 6c 20 62 65 20 6d 6f 64 69 66 69 65 64 20  ill be modified 
21150 2a 2f 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 20  */.    uint32_t 
21160 73 72 63 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  srcChange = 0;. 
21170 20 20 20 75 69 6e 74 33 32 5f 74 20 64 73 74 43     uint32_t dstC
21180 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 70  hange = 0;.    p
21190 72 65 61 64 28 70 53 72 63 46 69 6c 65 2d 3e 68  read(pSrcFile->h
211a0 2c 20 26 73 72 63 43 68 61 6e 67 65 2c 20 34 2c  , &srcChange, 4,
211b0 20 32 34 29 3b 0a 20 20 20 20 70 72 65 61 64 28   24);.    pread(
211c0 70 46 69 6c 65 2d 3e 68 2c 20 26 64 73 74 43 68  pFile->h, &dstCh
211d0 61 6e 67 65 2c 20 34 2c 20 32 34 29 3b 0a 20 20  ange, 4, 24);.  
211e0 20 20 0a 20 20 20 20 2f 2a 20 63 6f 70 79 20 74    .    /* copy t
211f0 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61  he actual databa
21200 73 65 20 2a 2f 0a 20 20 20 20 73 20 3d 20 63 6f  se */.    s = co
21210 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 61 6c 6c  pyfile_state_all
21220 6f 63 28 29 3b 0a 20 20 20 20 6c 73 65 65 6b 28  oc();.    lseek(
21230 70 53 72 63 46 69 6c 65 2d 3e 68 2c 20 30 2c 20  pSrcFile->h, 0, 
21240 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 6c  SEEK_SET);.    l
21250 73 65 65 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 30  seek(pFile->h, 0
21260 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20  , SEEK_SET);.   
21270 20 69 66 28 20 66 63 6f 70 79 66 69 6c 65 28 70   if( fcopyfile(p
21280 53 72 63 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c  SrcFile->h, pFil
21290 65 2d 3e 68 2c 20 73 2c 20 43 4f 50 59 46 49 4c  e->h, s, COPYFIL
212a0 45 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  E_ALL) ){.      
212b0 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20  int err=errno;. 
212c0 20 20 20 20 20 73 77 69 74 63 68 28 65 72 72 29       switch(err)
212d0 20 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   {.        case 
212e0 45 4e 4f 4d 45 4d 3a 0a 20 20 20 20 20 20 20 20  ENOMEM:.        
212f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
21300 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 62  MEM;.          b
21310 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 64 65  reak;.        de
21320 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20  fault:.         
21330 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
21340 6f 20 3d 20 65 72 72 3b 0a 20 20 20 20 20 20 20  o = err;.       
21350 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
21360 4f 45 52 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OERR;.      }.  
21370 20 20 7d 0a 20 20 20 20 63 6f 70 79 66 69 6c 65    }.    copyfile
21380 5f 73 74 61 74 65 5f 66 72 65 65 28 73 29 3b 0a  _state_free(s);.
21390 20 20 20 20 0a 20 20 20 20 69 66 20 28 73 72 63      .    if (src
213a0 43 68 61 6e 67 65 20 3d 3d 20 64 73 74 43 68 61  Change == dstCha
213b0 6e 67 65 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20  nge) {.      /* 
213c0 6d 6f 64 69 66 79 20 74 68 65 20 63 68 61 6e 67  modify the chang
213d0 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 66 6f 72  e counter to for
213e0 63 65 20 70 61 67 65 20 7a 65 72 6f 20 74 6f 20  ce page zero to 
213f0 62 65 20 72 65 6c 6f 61 64 65 64 20 2a 2f 0a 20  be reloaded */. 
21400 20 20 20 20 20 64 73 74 43 68 61 6e 67 65 20 2b       dstChange +
21410 2b 3b 0a 20 20 20 20 20 20 70 77 72 69 74 65 28  +;.      pwrite(
21420 70 46 69 6c 65 2d 3e 68 2c 20 26 64 73 74 43 68  pFile->h, &dstCh
21430 61 6e 67 65 2c 20 34 2c 20 32 34 29 3b 0a 20 20  ange, 4, 24);.  
21440 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73    }.  }.  if( is
21450 53 72 63 43 6f 72 72 75 70 74 20 29 7b 0a 20 20  SrcCorrupt ){.  
21460 20 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75    sqlite3demo_su
21470 70 65 72 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70  perunlock_corrup
21480 74 28 73 72 63 5f 66 69 6c 65 2c 20 63 6f 72 72  t(src_file, corr
21490 75 70 74 53 72 63 46 69 6c 65 4c 6f 63 6b 29 3b  uptSrcFileLock);
214a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
214b0 20 64 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73   done with the s
214c0 6f 75 72 63 65 20 64 62 20 73 6f 20 65 6e 64 20  ource db so end 
214d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
214e0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  */.    sqlite3_e
214f0 78 65 63 28 73 72 63 64 62 32 2c 20 22 43 4f 4d  xec(srcdb2, "COM
21500 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  MIT", 0, 0, 0);.
21510 20 20 7d 0a 20 20 2f 2a 20 7a 65 72 6f 20 6f 75    }.  /* zero ou
21520 74 20 61 6e 79 20 6f 6c 64 20 6a 6f 75 72 6e 61  t any old journa
21530 6c 20 63 6c 75 74 74 65 72 20 2a 2f 0a 20 20 69  l clutter */.  i
21540 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21550 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 6b 69 70   ){.    int skip
21560 57 41 4c 20 3d 20 28 73 72 63 57 61 6c 46 44 3c  WAL = (srcWalFD<
21570 30 29 3f 30 3a 31 3b 0a 20 20 20 20 75 6e 69 78  0)?0:1;.    unix
21580 49 6e 76 61 6c 69 64 61 74 65 53 75 70 70 6f 72  InvalidateSuppor
21590 74 46 69 6c 65 73 28 70 46 69 6c 65 2c 20 73 6b  tFiles(pFile, sk
215a0 69 70 57 41 4c 29 3b 0a 20 20 7d 0a 20 20 0a 65  ipWAL);.  }.  .e
215b0 6e 64 5f 72 65 70 6c 61 63 65 5f 64 61 74 61 62  nd_replace_datab
215c0 61 73 65 3a 0a 20 20 69 66 28 20 70 53 72 63 42  ase:.  if( pSrcB
215d0 74 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  tree ){.    sqli
215e0 74 65 33 5f 63 6c 6f 73 65 28 73 72 63 64 62 32  te3_close(srcdb2
215f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
21600 72 65 65 4c 65 61 76 65 28 70 53 72 63 42 74 72  reeLeave(pSrcBtr
21610 65 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ee);.  }.  sqlit
21620 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
21630 72 63 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  rcdb->mutex);.  
21640 69 66 28 20 69 73 44 73 74 43 6f 72 72 75 70 74  if( isDstCorrupt
21650 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 64   ){.    sqlite3d
21660 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 5f  emo_superunlock_
21670 63 6f 72 72 75 70 74 28 69 64 2c 20 63 6f 72 72  corrupt(id, corr
21680 75 70 74 44 73 74 46 69 6c 65 4c 6f 63 6b 29 3b  uptDstFileLock);
21690 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
216a0 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75  lite3demo_superu
216b0 6e 6c 6f 63 6b 28 70 4c 6f 63 6b 29 3b 0a 20 20  nlock(pLock);.  
216c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
216d0 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
216e0 46 49 4c 45 5f 48 45 41 44 45 52 5f 4c 45 4e 20  FILE_HEADER_LEN 
216f0 31 36 0a 23 69 6e 63 6c 75 64 65 20 22 62 74 72  16.#include "btr
21700 65 65 49 6e 74 2e 68 22 0a 2f 2a 20 43 68 65 63  eeInt.h"./* Chec
21710 6b 20 66 6f 72 20 61 20 63 6f 6e 66 6c 69 63 74  k for a conflict
21720 69 6e 67 20 6c 6f 63 6b 2e 20 20 49 66 20 6f 6e  ing lock.  If on
21730 65 20 69 73 20 66 6f 75 6e 64 2c 20 70 72 69 6e  e is found, prin
21740 74 20 61 6e 20 74 68 69 73 0a 20 2a 2a 20 6f 6e  t an this. ** on
21750 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74   standard output
21760 20 75 73 69 6e 67 20 74 68 65 20 66 6f 72 6d 61   using the forma
21770 74 20 73 74 72 69 6e 67 20 67 69 76 65 6e 20 61  t string given a
21780 6e 64 20 72 65 74 75 72 6e 20 31 2e 0a 20 2a 2a  nd return 1.. **
21790 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
217a0 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c 6f 63   conflicting loc
217b0 6b 73 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 2a  ks, return 0.. *
217c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
217d0 78 49 73 4c 6f 63 6b 65 64 28 0a 20 20 70 69 64  xIsLocked(.  pid
217e0 5f 74 20 70 69 64 2c 20 20 20 20 20 20 20 20 20  _t pid,         
217f0 20 20 20 2f 2a 20 50 49 44 20 74 6f 20 74 65 73     /* PID to tes
21800 74 20 66 6f 72 20 6c 6f 63 6b 20 6f 77 6e 65 72  t for lock owner
21810 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20   */.  int h,    
21820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
21830 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
21840 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74  o check */.  int
21850 20 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20   type,          
21860 20 20 20 2f 2a 20 46 5f 52 44 4c 43 4b 20 6f 72     /* F_RDLCK or
21870 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 75 6e   F_WRLCK */.  un
21880 73 69 67 6e 65 64 20 69 6e 74 20 69 4f 66 73 74  signed int iOfst
21890 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74  ,   /* First byt
218a0 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 2a 2f  e of the lock */
218b0 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
218c0 69 43 6e 74 2c 20 20 20 20 2f 2a 20 4e 75 6d 62  iCnt,    /* Numb
218d0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
218e0 68 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f  he lock range */
218f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
21900 54 79 70 65 20 20 20 20 20 2f 2a 20 54 79 70 65  Type     /* Type
21910 20 6f 66 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20   of lock */.){. 
21920 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6b   struct flock lk
21930 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a  ;.  int err;.  .
21940 20 20 6d 65 6d 73 65 74 28 26 6c 6b 2c 20 30 2c    memset(&lk, 0,
21950 20 73 69 7a 65 6f 66 28 6c 6b 29 29 3b 0a 20 20   sizeof(lk));.  
21960 6c 6b 2e 6c 5f 74 79 70 65 20 3d 20 74 79 70 65  lk.l_type = type
21970 3b 0a 20 20 6c 6b 2e 6c 5f 77 68 65 6e 63 65 20  ;.  lk.l_whence 
21980 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6b  = SEEK_SET;.  lk
21990 2e 6c 5f 73 74 61 72 74 20 3d 20 69 4f 66 73 74  .l_start = iOfst
219a0 3b 0a 20 20 6c 6b 2e 6c 5f 6c 65 6e 20 3d 20 69  ;.  lk.l_len = i
219b0 43 6e 74 3b 0a 20 20 0a 20 20 69 66 28 20 70 69  Cnt;.  .  if( pi
219c0 64 21 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54  d!=SQLITE_LOCKST
219d0 41 54 45 5f 41 4e 59 50 49 44 20 29 7b 0a 23 69  ATE_ANYPID ){.#i
219e0 66 6e 64 65 66 20 46 5f 47 45 54 4c 4b 50 49 44  fndef F_GETLKPID
219f0 0a 23 20 77 61 72 6e 69 6e 67 20 46 5f 47 45 54  .# warning F_GET
21a00 4c 4b 50 49 44 20 75 6e 64 65 66 69 6e 65 64 2c  LKPID undefined,
21a10 20 5f 73 71 6c 69 74 65 33 5f 6c 6f 63 6b 73 74   _sqlite3_lockst
21a20 61 74 65 20 66 61 6c 6c 69 6e 67 20 62 61 63 6b  ate falling back
21a30 20 74 6f 20 46 5f 47 45 54 4c 4b 0a 20 20 20 20   to F_GETLK.    
21a40 65 72 72 20 3d 20 66 63 6e 74 6c 28 68 2c 20 46  err = fcntl(h, F
21a50 5f 47 45 54 4c 4b 2c 20 26 6c 6b 29 3b 0a 23 65  _GETLK, &lk);.#e
21a60 6c 73 65 0a 20 20 20 20 6c 6b 2e 6c 5f 70 69 64  lse.    lk.l_pid
21a70 20 3d 20 70 69 64 3b 0a 20 20 20 20 65 72 72 20   = pid;.    err 
21a80 3d 20 66 63 6e 74 6c 28 68 2c 20 46 5f 47 45 54  = fcntl(h, F_GET
21a90 4c 4b 50 49 44 2c 20 26 6c 6b 29 3b 0a 23 65 6e  LKPID, &lk);.#en
21aa0 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
21ab0 20 65 72 72 20 3d 20 66 63 6e 74 6c 28 68 2c 20   err = fcntl(h, 
21ac0 46 5f 47 45 54 4c 4b 2c 20 26 6c 6b 29 3b 0a 20  F_GETLK, &lk);. 
21ad0 20 7d 0a 20 20 0a 20 20 69 66 28 20 65 72 72 3d   }.  .  if( err=
21ae0 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 66 70 72  =(-1) ){.    fpr
21af0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 63  intf(stderr, "fc
21b00 6e 74 6c 28 25 64 29 20 66 61 69 6c 65 64 3a 20  ntl(%d) failed: 
21b10 65 72 72 6e 6f 3d 25 64 5c 6e 22 2c 20 68 2c 20  errno=%d\n", h, 
21b20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75  errno);.    retu
21b30 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  rn -1;.  }.  .  
21b40 69 66 28 20 6c 6b 2e 6c 5f 74 79 70 65 21 3d 46  if( lk.l_type!=F
21b50 5f 55 4e 4c 43 4b 20 26 26 20 28 70 69 64 3d 3d  _UNLCK && (pid==
21b60 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45  SQLITE_LOCKSTATE
21b70 5f 41 4e 59 50 49 44 20 7c 7c 20 6c 6b 2e 6c 5f  _ANYPID || lk.l_
21b80 70 69 64 3d 3d 70 69 64 29 20 29 7b 0a 23 69 66  pid==pid) ){.#if
21b90 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
21ba0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
21bb0 65 72 72 2c 20 22 25 73 20 6c 6f 63 6b 20 68 65  err, "%s lock he
21bc0 6c 64 20 62 79 20 25 64 5c 6e 22 2c 20 7a 54 79  ld by %d\n", zTy
21bd0 70 65 2c 20 28 69 6e 74 29 6c 6b 2e 6c 5f 70 69  pe, (int)lk.l_pi
21be0 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  d);.#endif.    r
21bf0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 20 0a 20 20  eturn 1;.  } .  
21c00 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
21c10 2a 2a 20 54 68 69 73 20 74 65 73 74 20 6f 6e 6c  ** This test onl
21c20 79 20 77 6f 72 6b 73 20 66 6f 72 20 6c 6f 63 6b  y works for lock
21c30 20 74 65 73 74 69 6e 67 20 6f 6e 20 75 6e 69 78   testing on unix
21c40 2f 70 6f 73 69 78 20 56 46 53 2e 0a 2a 2a 20 41  /posix VFS..** A
21c50 64 61 70 74 65 64 20 66 72 6f 6d 20 74 6f 6f 6c  dapted from tool
21c60 2f 67 65 74 6c 6f 63 6b 2e 63 20 66 34 63 33 39  /getlock.c f4c39
21c70 62 36 35 31 33 37 30 31 35 36 63 61 65 39 37 39  b651370156cae979
21c80 35 30 31 61 37 62 31 35 36 62 64 62 61 35 30 65  501a7b156bdba50e
21c90 37 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  7ce.*/.static in
21ca0 74 20 75 6e 69 78 4c 6f 63 6b 73 74 61 74 65 50  t unixLockstateP
21cb0 69 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  id(unixFile *pFi
21cc0 6c 65 2c 20 70 69 64 5f 74 20 70 69 64 2c 20 69  le, pid_t pid, i
21cd0 6e 74 20 2a 70 4c 6f 63 6b 73 74 61 74 65 29 7b  nt *pLockstate){
21ce0 0a 20 20 69 6e 74 20 68 44 62 3b 20 20 20 20 20  .  int hDb;     
21cf0 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
21d00 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 6f 70  iptor for the op
21d10 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
21d20 20 2a 2f 0a 20 20 69 6e 74 20 68 53 68 6d 20 3d   */.  int hShm =
21d30 20 2d 31 3b 20 20 2f 2a 20 46 69 6c 65 20 64 65   -1;  /* File de
21d40 73 63 72 69 70 74 6f 72 20 66 6f 72 20 57 41 4c  scriptor for WAL
21d50 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
21d60 69 6c 65 20 2a 2f 0a 20 20 73 73 69 7a 65 5f 74  ile */.  ssize_t
21d70 20 67 6f 74 3b 20 20 20 20 2f 2a 20 42 79 74 65   got;    /* Byte
21d80 73 20 72 65 61 64 20 66 72 6f 6d 20 68 65 61 64  s read from head
21d90 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 57 61  er */.  int isWa
21da0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
21db0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e     /* True if in
21dc0 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 20 20 69   WAL mode */.  i
21dd0 6e 74 20 6e 4c 6f 63 6b 20 3d 20 30 3b 20 20 20  nt nLock = 0;   
21de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
21df0 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ber of locks hel
21e00 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  d */.  unsigned 
21e10 63 68 61 72 20 61 48 64 72 5b 31 30 30 5d 3b 20  char aHdr[100]; 
21e20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65    /* Database he
21e30 61 64 65 72 20 2a 2f 0a 20 20 0a 20 20 61 73 73  ader */.  .  ass
21e40 65 72 74 28 70 4c 6f 63 6b 73 74 61 74 65 29 3b  ert(pLockstate);
21e50 0a 20 20 0a 20 20 2f 2a 20 6d 61 6b 65 20 73 75  .  .  /* make su
21e60 72 65 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  re we are dealin
21e70 67 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73  g with a databas
21e80 65 20 66 69 6c 65 20 2a 2f 0a 20 20 68 44 62 20  e file */.  hDb 
21e90 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 69 66  = pFile->h;.  if
21ea0 28 20 68 44 62 3c 30 20 29 7b 0a 20 20 20 20 2a  ( hDb<0 ){.    *
21eb0 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53 51 4c  pLockstate = SQL
21ec0 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 45 52  ITE_LOCKSTATE_ER
21ed0 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ROR;.    return 
21ee0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
21ef0 7d 0a 20 20 61 73 73 65 72 74 28 20 28 73 74 72  }.  assert( (str
21f00 6c 65 6e 28 53 51 4c 49 54 45 5f 46 49 4c 45 5f  len(SQLITE_FILE_
21f10 48 45 41 44 45 52 29 2b 31 29 3d 3d 53 51 4c 49  HEADER)+1)==SQLI
21f20 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 5f 4c  TE_FILE_HEADER_L
21f30 45 4e 20 29 3b 0a 20 20 67 6f 74 20 3d 20 70 72  EN );.  got = pr
21f40 65 61 64 28 68 44 62 2c 20 61 48 64 72 2c 20 31  ead(hDb, aHdr, 1
21f50 30 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 67 6f  00, 0);.  if( go
21f60 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 4c 6f 63  t<0 ){.    *pLoc
21f70 6b 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  kstate = SQLITE_
21f80 4c 4f 43 4b 53 54 41 54 45 5f 45 52 52 4f 52 3b  LOCKSTATE_ERROR;
21f90 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
21fa0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
21fb0 69 66 28 20 67 6f 74 21 3d 31 30 30 20 7c 7c 20  if( got!=100 || 
21fc0 6d 65 6d 63 6d 70 28 61 48 64 72 2c 20 53 51 4c  memcmp(aHdr, SQL
21fd0 49 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 2c  ITE_FILE_HEADER,
21fe0 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41   SQLITE_FILE_HEA
21ff0 44 45 52 5f 4c 45 4e 29 21 3d 30 20 29 7b 0a 20  DER_LEN)!=0 ){. 
22000 20 20 20 2a 70 4c 6f 63 6b 73 74 61 74 65 20 3d     *pLockstate =
22010 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54   SQLITE_LOCKSTAT
22020 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 72 65  E_NOTADB;.    re
22030 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 41  turn SQLITE_NOTA
22040 44 42 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  DB;.  }.  .  /* 
22050 46 69 72 73 74 20 63 68 65 63 6b 20 66 6f 72 20  First check for 
22060 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
22070 6b 20 2a 2f 0a 20 20 6e 4c 6f 63 6b 20 2b 3d 20  k */.  nLock += 
22080 75 6e 69 78 49 73 4c 6f 63 6b 65 64 28 70 69 64  unixIsLocked(pid
22090 2c 20 68 44 62 2c 20 46 5f 52 44 4c 43 4b 2c 20  , hDb, F_RDLCK, 
220a0 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53 48  SHARED_FIRST, SH
220b0 41 52 45 44 5f 53 49 5a 45 2c 20 22 45 58 43 4c  ARED_SIZE, "EXCL
220c0 55 53 49 56 45 22 29 3b 0a 20 20 69 73 57 61 6c  USIVE");.  isWal
220d0 20 3d 20 61 48 64 72 5b 31 38 5d 3d 3d 32 3b 0a   = aHdr[18]==2;.
220e0 20 20 69 66 28 20 6e 4c 6f 63 6b 3d 3d 30 20 26    if( nLock==0 &
220f0 26 20 69 73 57 61 6c 3d 3d 30 20 29 7b 0a 20 20  & isWal==0 ){.  
22100 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 6d 6f    /* Rollback mo
22110 64 65 20 2a 2f 0a 20 20 20 20 6e 4c 6f 63 6b 20  de */.    nLock 
22120 2b 3d 20 75 6e 69 78 49 73 4c 6f 63 6b 65 64 28  += unixIsLocked(
22130 70 69 64 2c 20 68 44 62 2c 20 46 5f 57 52 4c 43  pid, hDb, F_WRLC
22140 4b 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  K, PENDING_BYTE,
22150 20 53 48 41 52 45 44 5f 53 49 5a 45 2b 32 2c 20   SHARED_SIZE+2, 
22160 22 50 45 4e 44 49 4e 47 7c 52 45 53 45 52 56 45  "PENDING|RESERVE
22170 44 7c 53 48 41 52 45 44 22 29 3b 0a 20 20 7d 0a  D|SHARED");.  }.
22180 20 20 69 66 28 20 6e 4c 6f 63 6b 3d 3d 30 20 26    if( nLock==0 &
22190 26 20 69 73 57 61 6c 21 3d 30 20 29 7b 0a 20 20  & isWal!=0 ){.  
221a0 20 20 2f 2a 20 6c 6f 6f 6b 75 70 20 74 68 65 20    /* lookup the 
221b0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
221c0 66 6f 72 20 74 68 65 20 73 68 61 72 65 64 20 6d  for the shared m
221d0 65 6d 6f 72 79 20 66 69 6c 65 20 69 66 20 77 65  emory file if we
221e0 20 68 61 76 65 20 69 74 20 6f 70 65 6e 20 69 6e   have it open in
221f0 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f   this process */
22200 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
22210 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73  tex(); /* Becaus
22220 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  e pFile->pInode 
22230 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
22240 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 20 20   threads */.    
22250 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
22260 6d 4e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  mNode = pFile->p
22270 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
22280 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  .    if( pShmNod
22290 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
222a0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
222b0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
222c0 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 68 53  .      .      hS
222d0 68 6d 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  hm = pShmNode->h
222e0 3b 0a 20 20 20 20 20 20 69 66 28 20 68 53 68 6d  ;.      if( hShm
222f0 20 3e 3d 20 30 29 7b 0a 20 20 20 20 20 20 20 20   >= 0){.        
22300 69 66 28 20 75 6e 69 78 49 73 4c 6f 63 6b 65 64  if( unixIsLocked
22310 28 70 69 64 2c 20 68 53 68 6d 2c 20 46 5f 52 44  (pid, hShm, F_RD
22320 4c 43 4b 2c 20 53 48 4d 5f 52 45 43 4f 56 45 52  LCK, SHM_RECOVER
22330 2c 20 31 2c 20 22 57 41 4c 2d 52 45 43 4f 56 45  , 1, "WAL-RECOVE
22340 52 59 22 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  RY") ||.        
22350 20 20 20 75 6e 69 78 49 73 4c 6f 63 6b 65 64 28     unixIsLocked(
22360 70 69 64 2c 20 68 53 68 6d 2c 20 46 5f 52 44 4c  pid, hShm, F_RDL
22370 43 4b 2c 20 53 48 4d 5f 57 52 49 54 45 2c 20 31  CK, SHM_WRITE, 1
22380 2c 20 22 57 41 4c 2d 57 52 49 54 45 22 29 20 29  , "WAL-WRITE") )
22390 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 63  {.          nLoc
223a0 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  k = 1;.        }
223b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
223c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
223d0 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
223e0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  de->mutex);.    
223f0 7d 20 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  } .    .    if( 
22400 68 53 68 6d 3c 30 20 29 7b 0a 20 20 20 20 20 20  hShm<0 ){.      
22410 2f 2a 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  /* the shared me
22420 6d 6f 72 79 20 66 69 6c 65 20 69 73 6e 27 74 20  mory file isn't 
22430 6f 70 65 6e 20 69 6e 20 74 68 69 73 20 70 72 6f  open in this pro
22440 63 65 73 73 20 73 70 61 63 65 2c 20 6f 70 65 6e  cess space, open
22450 20 6f 75 72 20 6f 77 6e 20 46 44 20 2a 2f 0a 20   our own FD */. 
22460 20 20 20 20 20 63 68 61 72 20 7a 53 68 6d 5b 4d       char zShm[M
22470 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 20 20  AXPATHLEN];.    
22480 20 20 0a 20 20 20 20 20 20 2f 2a 20 57 41 4c 20    .      /* WAL 
22490 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 73 74  mode */.      st
224a0 72 6c 63 70 79 28 7a 53 68 6d 2c 20 70 46 69 6c  rlcpy(zShm, pFil
224b0 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58 50 41 54  e->zPath, MAXPAT
224c0 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 73 74 72  HLEN);.      str
224d0 6c 63 61 74 28 7a 53 68 6d 2c 20 22 2d 73 68 6d  lcat(zShm, "-shm
224e0 22 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  ", MAXPATHLEN);.
224f0 20 20 20 20 20 20 68 53 68 6d 20 3d 20 6f 70 65        hShm = ope
22500 6e 28 7a 53 68 6d 2c 20 4f 5f 52 44 4f 4e 4c 59  n(zShm, O_RDONLY
22510 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
22520 68 53 68 6d 3c 30 20 29 7b 0a 20 20 20 20 20 20  hShm<0 ){.      
22530 20 20 2a 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20    *pLockstate = 
22540 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45  SQLITE_LOCKSTATE
22550 5f 4f 46 46 3b 0a 20 20 20 20 20 20 20 20 75 6e  _OFF;.        un
22560 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
22570 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
22580 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
22590 7d 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78  }.      if( unix
225a0 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 53  IsLocked(pid, hS
225b0 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48 4d  hm, F_RDLCK, SHM
225c0 5f 52 45 43 4f 56 45 52 2c 20 31 2c 20 22 57 41  _RECOVER, 1, "WA
225d0 4c 2d 52 45 43 4f 56 45 52 59 22 29 20 7c 7c 0a  L-RECOVERY") ||.
225e0 20 20 20 20 20 20 20 20 20 75 6e 69 78 49 73 4c           unixIsL
225f0 6f 63 6b 65 64 28 70 69 64 2c 20 68 53 68 6d 2c  ocked(pid, hShm,
22600 20 46 5f 52 44 4c 43 4b 2c 20 53 48 4d 5f 57 52   F_RDLCK, SHM_WR
22610 49 54 45 2c 20 31 2c 20 22 57 41 4c 2d 57 52 49  ITE, 1, "WAL-WRI
22620 54 45 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20  TE") ){.        
22630 6e 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20  nLock = 1;.     
22640 20 7d 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 68   }.      close(h
22650 53 68 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Shm);.    }.    
22660 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
22670 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 63  ;.  }.  if( nLoc
22680 6b 3e 30 20 29 7b 0a 20 20 20 20 2a 70 4c 6f 63  k>0 ){.    *pLoc
22690 6b 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  kstate = SQLITE_
226a0 4c 4f 43 4b 53 54 41 54 45 5f 4f 4e 3b 0a 20 20  LOCKSTATE_ON;.  
226b0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2a 70 4c  } else {.    *pL
226c0 6f 63 6b 73 74 61 74 65 20 3d 20 53 51 4c 49 54  ockstate = SQLIT
226d0 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4f 46 46 3b  E_LOCKSTATE_OFF;
226e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
226f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64  LITE_OK;.}..#end
22700 69 66 20 2f 2a 20 28 53 51 4c 49 54 45 5f 45 4e  if /* (SQLITE_EN
22710 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30  ABLE_APPLE_SPI>0
22720 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  ) && defined(__A
22730 50 50 4c 45 5f 5f 29 20 2a 2f 0a 0a 0a 2f 2a 0a  PPLE__) */.../*.
22740 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ** Information a
22750 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e  nd control of an
22760 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c   open file handl
22770 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
22780 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   unixFileControl
22790 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
227a0 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  d, int op, void 
227b0 2a 70 41 72 67 29 7b 0a 20 20 75 6e 69 78 46 69  *pArg){.  unixFi
227c0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
227d0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69  xFile*)id;.  swi
227e0 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
227f0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
22800 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20  _LOCKSTATE: {.  
22810 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
22820 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  = pFile->eFileLo
22830 63 6b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ck;.      return
22840 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
22850 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
22860 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a  E_LAST_ERRNO: {.
22870 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
22880 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  g = pFile->lastE
22890 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75  rrno;.      retu
228a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
228b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
228c0 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f  ITE_FCNTL_CHUNK_
228d0 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46  SIZE: {.      pF
228e0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a  ile->szChunk = *
228f0 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20  (int *)pArg;.   
22900 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22910 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
22920 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
22930 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20  _SIZE_HINT: {.  
22940 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
22950 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
22960 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
22970 20 20 72 63 20 3d 20 66 63 6e 74 6c 53 69 7a 65    rc = fcntlSize
22980 48 69 6e 74 28 70 46 69 6c 65 2c 20 2a 28 69 36  Hint(pFile, *(i6
22990 34 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20  4 *)pArg);.     
229a0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
229b0 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
229c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
229d0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
229e0 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f  E_FCNTL_PERSIST_
229f0 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  WAL: {.      int
22a00 20 62 50 65 72 73 69 73 74 20 3d 20 2a 28 69 6e   bPersist = *(in
22a10 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69  t*)pArg;.      i
22a20 66 28 20 62 50 65 72 73 69 73 74 3c 30 20 29 7b  f( bPersist<0 ){
22a30 0a 20 20 20 20 20 20 20 20 2a 28 69 6e 74 2a 29  .        *(int*)
22a40 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63  pArg = (pFile->c
22a50 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
22a60 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 29  ILE_PERSIST_WAL)
22a70 21 3d 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  !=0;.      }else
22a80 20 69 66 28 20 62 50 65 72 73 69 73 74 3d 3d 30   if( bPersist==0
22a90 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
22aa0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20  e->ctrlFlags &= 
22ab0 7e 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53  ~UNIXFILE_PERSIS
22ac0 54 5f 57 41 4c 3b 0a 20 20 20 20 20 20 7d 65 6c  T_WAL;.      }el
22ad0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  se{.        pFil
22ae0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  e->ctrlFlags |= 
22af0 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54  UNIXFILE_PERSIST
22b00 5f 57 41 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _WAL;.      }.  
22b10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22b20 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  E_OK;.    }.#ifn
22b30 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f  def NDEBUG.    /
22b40 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 6c 6c  * The pager call
22b50 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f  s this method to
22b60 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69 74 20   signal that it 
22b70 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20  has done.    ** 
22b80 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74  a rollback and t
22b90 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
22ba0 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 75 6e   is therefore un
22bb0 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20 20 20  changed and.    
22bc0 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74 20 69  ** it hence it i
22bd0 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74 72 61  s OK for the tra
22be0 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67 65 20  nsaction change 
22bf0 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a 20 20  counter to be.  
22c00 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a    ** unchanged..
22c10 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
22c20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
22c30 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20  UNCHANGED: {.   
22c40 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
22c50 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30  d)->dbUpdate = 0
22c60 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
22c70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
22c80 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
22c90 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
22ca0 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
22cb0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20  d(__APPLE__).   
22cc0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
22cd0 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TL_SET_LOCKPROXY
22ce0 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53  FILE:.    case S
22cf0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f  QLITE_FCNTL_GET_
22d00 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b  LOCKPROXYFILE: {
22d10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 72  .      return pr
22d20 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69  oxyFileControl(i
22d30 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20 20  d,op,pArg);.    
22d40 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
22d50 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
22d60 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
22d70 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f  ed(__APPLE__) */
22d80 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 45 4e 41  .#if (SQLITE_ENA
22d90 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29  BLE_APPLE_SPI>0)
22da0 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
22db0 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73 65 20  PLE__).    case 
22dc0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 52 55  SQLITE_FCNTL_TRU
22dd0 4e 43 41 54 45 5f 44 41 54 41 42 41 53 45 3a 20  NCATE_DATABASE: 
22de0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 75  {.      return u
22df0 6e 69 78 54 72 75 6e 63 61 74 65 44 61 74 61 62  nixTruncateDatab
22e00 61 73 65 28 70 46 69 6c 65 2c 20 28 70 41 72 67  ase(pFile, (pArg
22e10 20 3f 20 28 2a 28 69 6e 74 20 2a 29 70 41 72 67   ? (*(int *)pArg
22e20 29 20 3a 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20  ) : 0));.    }. 
22e30 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
22e40 43 4e 54 4c 5f 52 45 50 4c 41 43 45 5f 44 41 54  CNTL_REPLACE_DAT
22e50 41 42 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 72  ABASE: {.      r
22e60 65 74 75 72 6e 20 75 6e 69 78 52 65 70 6c 61 63  eturn unixReplac
22e70 65 44 61 74 61 62 61 73 65 28 70 46 69 6c 65 2c  eDatabase(pFile,
22e80 20 28 73 71 6c 69 74 65 33 20 2a 29 70 41 72 67   (sqlite3 *)pArg
22e90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
22ea0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
22eb0 4f 43 4b 53 54 41 54 45 5f 50 49 44 3a 20 7b 0a  OCKSTATE_PID: {.
22ec0 20 20 20 20 20 20 4c 6f 63 6b 73 74 61 74 65 50        LockstateP
22ed0 49 44 20 2a 70 4c 6f 63 6b 73 74 61 74 65 3b 0a  ID *pLockstate;.
22ee0 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
22ef0 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 70      .      if( p
22f00 41 72 67 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  Arg==NULL ){.   
22f10 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
22f20 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 20 20 20  TE_MISUSE;.     
22f30 20 7d 0a 20 20 20 20 20 20 70 4c 6f 63 6b 73 74   }.      pLockst
22f40 61 74 65 20 3d 20 28 4c 6f 63 6b 73 74 61 74 65  ate = (Lockstate
22f50 50 49 44 20 2a 29 70 41 72 67 3b 0a 20 20 20 20  PID *)pArg;.    
22f60 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 63 6b 73    rc = unixLocks
22f70 74 61 74 65 50 69 64 28 70 46 69 6c 65 2c 20 70  tatePid(pFile, p
22f80 4c 6f 63 6b 73 74 61 74 65 2d 3e 70 69 64 2c 20  Lockstate->pid, 
22f90 26 28 70 4c 6f 63 6b 73 74 61 74 65 2d 3e 73 74  &(pLockstate->st
22fa0 61 74 65 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ate));.      ret
22fb0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
22fc0 20 20 20 20 0a 23 65 6e 64 69 66 20 2f 2a 20 28      .#endif /* (
22fd0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
22fe0 50 4c 45 5f 53 50 49 3e 30 29 20 26 26 20 64 65  PLE_SPI>0) && de
22ff0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
23000 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
23010 49 54 45 5f 46 43 4e 54 4c 5f 53 59 4e 43 5f 4f  ITE_FCNTL_SYNC_O
23020 4d 49 54 54 45 44 3a 20 7b 0a 20 20 20 20 20 20  MITTED: {.      
23030 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23040 3b 20 20 2f 2a 20 41 20 6e 6f 2d 6f 70 20 2a 2f  ;  /* A no-op */
23050 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
23060 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
23070 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  UND;.}../*.** Re
23080 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20  turn the sector 
23090 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
230a0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
230b0 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72  block device for
230c0 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65  .** the specifie
230d0 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  d file. This is 
230e0 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31  almost always 51
230f0 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79  2 bytes, but may
23100 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f   be.** larger fo
23110 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a  r some devices..
23120 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64  **.** SQLite cod
23130 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20 66  e assumes this f
23140 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66  unction cannot f
23150 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73  ail. It also ass
23160 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20  umes that.** if 
23170 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72  two files are cr
23180 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d  eated in the sam
23190 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69  e file-system di
231a0 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a  rectory (i.e..**
231b0 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64 20   a database and 
231c0 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  its journal file
231d0 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f  ) that the secto
231e0 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74  r size will be t
231f0 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62  he.** same for b
23200 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  oth..*/.static i
23210 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a  nt unixSectorSiz
23220 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
23230 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
23240 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
23250 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
23260 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
23270 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f  ECTOR_SIZE;.}../
23280 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
23290 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
232a0 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20 66  istics for the f
232b0 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 77  ile. This is alw
232c0 61 79 73 20 30 20 66 6f 72 20 75 6e 69 78 2e 0a  ays 0 for unix..
232d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
232e0 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ixDeviceCharacte
232f0 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f  ristics(sqlite3_
23300 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a  file *NotUsed){.
23310 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
23320 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
23330 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e  eturn 0;.}..#ifn
23340 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
23350 57 41 4c 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65  WAL.../*.** Obje
23360 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ct used to repre
23370 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20 6d  sent an shared m
23380 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20 0a  emory buffer.  .
23390 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74 69  **.** When multi
233a0 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20  ple threads all 
233b0 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61  reference the sa
233c0 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65 61  me wal-index, ea
233d0 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61 73  ch thread.** has
233e0 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68 6d   its own unixShm
233f0 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65   object, but the
23400 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 61  y all point to a
23410 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65   single instance
23420 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69 78  .** of this unix
23430 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e 20  ShmNode object. 
23440 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
23450 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78 20   each wal-index 
23460 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c  is opened.** onl
23470 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65  y once per proce
23480 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 75  ss..**.** Each u
23490 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
234a0 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74  t is connected t
234b0 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78 49  o a single unixI
234c0 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  nodeInfo object.
234d0 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f 61  .** We could coa
234e0 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65 63  lesce this objec
234f0 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64 65  t into unixInode
23500 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20 77  Info, but that w
23510 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76 65  ould mean.** eve
23520 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68 61  ry open file tha
23530 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 73  t does not use s
23540 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69 6e  hared memory (in
23550 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 6f   other words, mo
23560 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65 73  st.** open files
23570 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f 20  ) would have to 
23580 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68 69  carry around thi
23590 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  s extra informat
235a0 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65 20  ion.  So.** the 
235b0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
235c0 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  ject contains a 
235d0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
235e0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
235f0 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75 6e  ct.** and the un
23600 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
23610 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c 79   is created only
23620 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a   when needed..**
23630 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  .** unixMutexHel
23640 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65  d() must be true
23650 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f   when creating o
23660 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20  r destroying.** 
23670 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77  this object or w
23680 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20  hile reading or 
23690 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c  writing the foll
236a0 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a  owing fields:.**
236b0 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a  .**      nRef.**
236c0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
236d0 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  g fields are rea
236e0 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65  d-only after the
236f0 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
23700 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20  ed:.** .**      
23710 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c  fid.**      zFil
23720 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68  ename.**.** Eith
23730 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6d  er unixShmNode.m
23740 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
23750 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65  d or unixShmNode
23760 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20  .nRef==0 and.** 
23770 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
23780 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61  is true when rea
23790 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
237a0 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a  any other field.
237b0 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ** in this struc
237c0 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ture..*/.struct 
237d0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20 20  unixShmNode {.  
237e0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
237f0 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75 6e  Inode;     /* un
23800 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61 74  ixInodeInfo that
23810 20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20 6e   owns this SHM n
23820 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
23830 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20  _mutex *mutex;  
23840 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20      /* Mutex to 
23850 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65  access this obje
23860 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  ct */.  char *zF
23870 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
23880 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
23890 65 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a  e mmapped file *
238a0 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20  /.  int h;      
238b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
238c0 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  * Open file desc
238d0 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  riptor */.  int 
238e0 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  szRegion;       
238f0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
23900 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  f shared-memory 
23910 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31 36  regions */.  u16
23920 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20   nRegion;       
23930 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
23940 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69 6f  of array apRegio
23950 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52 65 61 64  n */.  u8 isRead
23960 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20  only;           
23970 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61    /* True if rea
23980 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68 61 72  d-only */.  char
23990 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20 20   **apRegion;    
239a0 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
239b0 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72 65 64  of mapped shared
239c0 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20  -memory regions 
239d0 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
239e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69  /* Number of uni
23a00 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69  xShm objects poi
23a10 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f  nting to this */
23a20 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69 72  .  unixShm *pFir
23a30 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
23a40 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62 6a   All unixShm obj
23a50 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ects pointing to
23a60 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66 20   this */.#ifdef 
23a70 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75  SQLITE_DEBUG.  u
23a80 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20  8 exclMask;     
23a90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
23aa0 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c  k of exclusive l
23ab0 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
23ac0 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20  8 sharedMask;   
23ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
23ae0 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b  k of shared lock
23af0 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 6e  s held */.  u8 n
23b00 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20  extShmId;       
23b10 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61         /* Next a
23b20 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68 6d  vailable unixShm
23b30 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e  .id value */.#en
23b40 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74  dif.};../*.** St
23b50 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74  ructure used int
23b60 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20  ernally by this 
23b70 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68  VFS to record th
23b80 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a  e state of an.**
23b90 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d   open shared mem
23ba0 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ory connection..
23bb0 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
23bc0 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 69  ing fields are i
23bd0 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20  nitialized when 
23be0 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63  this object is c
23bf0 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72  reated and.** ar
23c00 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72  e read-only ther
23c10 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20  eafter:.**.**   
23c20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a 2a   unixShm.pFile.*
23c30 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64 0a  *    unixShm.id.
23c40 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20  **.** All other 
23c50 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f  fields are read/
23c60 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e 69 78  write.  The unix
23c70 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65 78  Shm.pFile->mutex
23c80 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a   must be held.**
23c90 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67   while accessing
23ca0 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20   any read/write 
23cb0 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63  fields..*/.struc
23cc0 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75 6e  t unixShm {.  un
23cd0 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
23ce0 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ode;     /* The 
23cf0 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69 78 53  underlying unixS
23d00 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f  hmNode object */
23d10 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65 78  .  unixShm *pNex
23d20 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
23d30 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20 77 69   Next unixShm wi
23d40 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e 69 78  th the same unix
23d50 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20  ShmNode */.  u8 
23d60 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20  hasMutex;       
23d70 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
23d80 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 75  if holding the u
23d90 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78  nixShmNode mutex
23da0 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20 20 20   */.  u8 id;    
23db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23dc0 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63   /* Id of this c
23dd0 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 69 6e  onnection within
23de0 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65   its unixShmNode
23df0 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64   */.  u16 shared
23e00 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
23e10 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
23e20 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
23e30 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b  .  u16 exclMask;
23e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23e50 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
23e60 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
23e70 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  .};../*.** Const
23e80 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f  ants used for lo
23e90 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65  cking.*/.#define
23ea0 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20 20   UNIX_SHM_BASE  
23eb0 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d   ((22+SQLITE_SHM
23ec0 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20  _NLOCK)*4)      
23ed0 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b     /* first lock
23ee0 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65   byte */.#define
23ef0 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20   UNIX_SHM_DMS   
23f00 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2b   (UNIX_SHM_BASE+
23f10 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
23f20 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77  )  /* deadman sw
23f30 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  itch */../*.** A
23f40 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69 73  pply posix advis
23f50 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c  ory locks for al
23f60 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66 73  l bytes from ofs
23f70 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b 6e  t through ofst+n
23f80 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20  -1..**.** Locks 
23f90 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61 73  block if the mas
23fa0 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e 49  k is exactly UNI
23fb0 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65 20  X_SHM_C and are 
23fc0 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  non-blocking.** 
23fd0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
23fe0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
23ff0 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e  SystemLock(.  un
24000 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
24010 6f 64 65 2c 20 2f 2a 20 41 70 70 6c 79 20 6c 6f  ode, /* Apply lo
24020 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e  cks to this open
24030 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
24040 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  egment */.  int 
24050 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20  lockType,       
24060 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46     /* F_UNLCK, F
24070 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52 4c  _RDLCK, or F_WRL
24080 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74  CK */.  int ofst
24090 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
240a0 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
240b0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67  the locking rang
240c0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20 20  e */.  int n    
240d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
240e0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
240f0 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20   to lock */.){. 
24100 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b   struct flock f;
24110 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f         /* The po
24120 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  six advisory loc
24130 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 2a  king structure *
24140 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
24150 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 52 65 73  ITE_OK;   /* Res
24160 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 66 63  ult code form fc
24170 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41  ntl() */..  /* A
24180 63 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e 69  ccess to the uni
24190 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
241a0 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79  is serialized by
241b0 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20   the caller */. 
241c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
241d0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 53 68 6d  _mutex_held(pShm
241e0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20  Node->mutex) || 
241f0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  pShmNode->nRef==
24200 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 68 61 72 65  0 );..  /* Share
24210 64 20 6c 6f 63 6b 73 20 6e 65 76 65 72 20 73 70  d locks never sp
24220 61 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  an more than one
24230 20 62 79 74 65 20 2a 2f 0a 20 20 61 73 73 65 72   byte */.  asser
24240 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54  t( n==1 || lockT
24250 79 70 65 21 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a  ype!=F_RDLCK );.
24260 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20 61 72 65 20  .  /* Locks are 
24270 77 69 74 68 69 6e 20 72 61 6e 67 65 20 2a 2f 0a  within range */.
24280 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 26    assert( n>=1 &
24290 26 20 6e 3c 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  & n<SQLITE_SHM_N
242a0 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70  LOCK );..  if( p
242b0 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b  ShmNode->h>=0 ){
242c0 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
242d0 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70  ze the locking p
242e0 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20  arameters */.   
242f0 20 6d 65 6d 73 65 74 28 26 66 2c 20 30 2c 20 73   memset(&f, 0, s
24300 69 7a 65 6f 66 28 66 29 29 3b 0a 20 20 20 20 66  izeof(f));.    f
24310 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f 63 6b 54 79  .l_type = lockTy
24320 70 65 3b 0a 20 20 20 20 66 2e 6c 5f 77 68 65 6e  pe;.    f.l_when
24330 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
24340 20 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20 6f     f.l_start = o
24350 66 73 74 3b 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e  fst;.    f.l_len
24360 20 3d 20 6e 3b 0a 0a 20 20 20 20 72 63 20 3d 20   = n;..    rc = 
24370 6f 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65  osFcntl(pShmNode
24380 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 66  ->h, F_SETLK, &f
24390 29 3b 0a 20 20 20 20 72 63 20 3d 20 28 72 63 21  );.    rc = (rc!
243a0 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45 5f  =(-1)) ? SQLITE_
243b0 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59  OK : SQLITE_BUSY
243c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  ;.  }..  /* Upda
243d0 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 6f  te the global lo
243e0 63 6b 20 73 74 61 74 65 20 61 6e 64 20 64 6f 20  ck state and do 
243f0 64 65 62 75 67 20 74 72 61 63 69 6e 67 20 2a 2f  debug tracing */
24400 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
24410 45 42 55 47 0a 20 20 7b 20 75 31 36 20 6d 61 73  EBUG.  { u16 mas
24420 6b 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  k;.  OSTRACE(("S
24430 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20 20 6d  HM-LOCK "));.  m
24440 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b  ask = (1<<(ofst+
24450 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b  n)) - (1<<ofst);
24460 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
24470 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
24480 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43  lockType==F_UNLC
24490 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  K ){.      OSTRA
244a0 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 6f  CE(("unlock %d o
244b0 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  k", ofst));.    
244c0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c    pShmNode->excl
244d0 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
244e0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
244f0 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61  haredMask &= ~ma
24500 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  sk;.    }else if
24510 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44  ( lockType==F_RD
24520 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  LCK ){.      OST
24530 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b  RACE(("read-lock
24540 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b   %d ok", ofst));
24550 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
24560 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61  >exclMask &= ~ma
24570 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  sk;.      pShmNo
24580 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c  de->sharedMask |
24590 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73  = mask;.    }els
245a0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
245b0 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c   lockType==F_WRL
245c0 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  CK );.      OSTR
245d0 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b  ACE(("write-lock
245e0 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b   %d ok", ofst));
245f0 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
24600 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73  >exclMask |= mas
24610 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  k;.      pShmNod
24620 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d  e->sharedMask &=
24630 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20   ~mask;.    }.  
24640 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6c  }else{.    if( l
24650 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  ockType==F_UNLCK
24660 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
24670 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 66 61  E(("unlock %d fa
24680 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20  iled", ofst));. 
24690 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63     }else if( loc
246a0 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  kType==F_RDLCK )
246b0 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
246c0 28 22 72 65 61 64 2d 6c 6f 63 6b 20 66 61 69 6c  ("read-lock fail
246d0 65 64 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ed"));.    }else
246e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
246f0 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43  lockType==F_WRLC
24700 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  K );.      OSTRA
24710 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20  CE(("write-lock 
24720 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74  %d failed", ofst
24730 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
24740 4f 53 54 52 41 43 45 28 28 22 20 2d 20 61 66 74  OSTRACE((" - aft
24750 65 72 77 61 72 64 73 20 25 30 33 78 2c 25 30 33  erwards %03x,%03
24760 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  x\n",.          
24770 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
24780 64 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d  dMask, pShmNode-
24790 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d  >exclMask));.  }
247a0 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
247b0 6e 20 72 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a  n rc;        .}.
247c0 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68  ../*.** Purge th
247d0 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 4c 69 73  e unixShmNodeLis
247e0 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e  t list of all en
247f0 74 72 69 65 73 20 77 69 74 68 20 75 6e 69 78 53  tries with unixS
24800 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a  hmNode.nRef==0..
24810 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
24820 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d  t a VFS shared-m
24830 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74  emory method; it
24840 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 75   is a utility fu
24850 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a  nction called.**
24860 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d   by VFS shared-m
24870 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a  emory methods..*
24880 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
24890 69 78 53 68 6d 50 75 72 67 65 28 75 6e 69 78 46  ixShmPurge(unixF
248a0 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 75 6e 69  ile *pFd){.  uni
248b0 78 53 68 6d 4e 6f 64 65 20 2a 70 20 3d 20 70 46  xShmNode *p = pF
248c0 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
248d0 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75  ode;.  assert( u
248e0 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
248f0 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
24900 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69  nRef==0 ){.    i
24910 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74  nt i;.    assert
24920 28 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64  ( p->pInode==pFd
24930 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20  ->pInode );.    
24940 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
24950 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  ee(p->mutex);.  
24960 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
24970 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20  nRegion; i++){. 
24980 20 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30       if( p->h>=0
24990 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 75 6e 6d   ){.        munm
249a0 61 70 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69  ap(p->apRegion[i
249b0 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b  ], p->szRegion);
249c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
249d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
249e0 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69  ee(p->apRegion[i
249f0 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
24a00 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
24a10 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29 3b  ee(p->apRegion);
24a20 0a 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30  .    if( p->h>=0
24a30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74   ){.      robust
24a40 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e 68  _close(pFd, p->h
24a50 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
24a60 20 20 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20     p->h = -1;.  
24a70 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f 64    }.    p->pInod
24a80 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b  e->pShmNode = 0;
24a90 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
24aa0 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  e(p);.  }.}..sta
24ab0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
24ac0 70 72 6f 78 79 53 68 61 72 65 64 4d 65 6d 6f 72  proxySharedMemor
24ad0 79 42 61 73 65 50 61 74 68 28 75 6e 69 78 46 69  yBasePath(unixFi
24ae0 6c 65 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 70  le *);../*.** Op
24af0 65 6e 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f  en a shared-memo
24b00 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74  ry area associat
24b10 65 64 20 77 69 74 68 20 6f 70 65 6e 20 64 61 74  ed with open dat
24b20 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64  abase file pDbFd
24b30 2e 20 20 0a 2a 2a 20 54 68 69 73 20 70 61 72 74  .  .** This part
24b40 69 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74  icular implement
24b50 61 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61 70 70  ation uses mmapp
24b60 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ed files..**.** 
24b70 54 68 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f  The file used to
24b80 20 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61 72 65   implement share
24b90 64 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20 74  d-memory is in t
24ba0 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
24bb0 79 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70 65 6e  y.** as the open
24bc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
24bd0 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  nd has the same 
24be0 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 70 65 6e  name as the open
24bf0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
24c00 65 20 77 69 74 68 20 74 68 65 20 22 2d 73 68 6d  e with the "-shm
24c10 22 20 73 75 66 66 69 78 20 61 64 64 65 64 2e 20  " suffix added. 
24c20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
24c30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
24c40 6c 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65 2f  le.** is "/home/
24c50 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 22  user1/config.db"
24c60 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 74   then the file t
24c70 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20 61  hat is created a
24c80 6e 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20 66 6f  nd mmapped.** fo
24c90 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  r shared memory 
24ca0 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 22  will be called "
24cb0 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66  /home/user1/conf
24cc0 69 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a  ig.db-shm".  .**
24cd0 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70 70 72  .** Another appr
24ce0 6f 61 63 68 20 74 6f 20 69 73 20 74 6f 20 75 73  oach to is to us
24cf0 65 20 66 69 6c 65 73 20 69 6e 20 2f 64 65 76 2f  e files in /dev/
24d00 73 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d 70 20  shm or /dev/tmp 
24d10 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74  or an.** some ot
24d20 68 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e 74 2e  her tmpfs mount.
24d30 20 42 75 74 20 69 66 20 61 20 66 69 6c 65 20 69   But if a file i
24d40 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 64 69  n a different di
24d50 72 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20  rectory.** from 
24d60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
24d70 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e 20  e is used, then 
24d80 64 69 66 66 65 72 69 6e 67 20 61 63 63 65 73 73  differing access
24d90 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20   permissions.** 
24da0 6f 72 20 61 20 63 68 72 6f 6f 74 28 29 20 6d 69  or a chroot() mi
24db0 67 68 74 20 63 61 75 73 65 20 74 77 6f 20 64 69  ght cause two di
24dc0 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 65  fferent processe
24dd0 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  s on the same.**
24de0 20 64 61 74 61 62 61 73 65 20 74 6f 20 65 6e 64   database to end
24df0 20 75 70 20 75 73 69 6e 67 20 64 69 66 66 65 72   up using differ
24e00 65 6e 74 20 66 69 6c 65 73 20 66 6f 72 20 73 68  ent files for sh
24e10 61 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a  ared memory - .*
24e20 2a 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74  * meaning that t
24e30 68 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f 75 6c  heir memory woul
24e40 64 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20  d not really be 
24e50 73 68 61 72 65 64 20 2d 20 72 65 73 75 6c 74 69  shared - resulti
24e60 6e 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73  ng.** in databas
24e70 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 4e  e corruption.  N
24e80 65 76 65 72 74 68 65 6c 65 73 73 2c 20 74 68 69  evertheless, thi
24e90 73 20 74 6d 70 66 73 20 66 69 6c 65 20 75 73 61  s tmpfs file usa
24ea0 67 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65 6e 61  ge.** can be ena
24eb0 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  bled at compile-
24ec0 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c  time using -DSQL
24ed0 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
24ee0 59 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a 20  Y="/dev/shm".** 
24ef0 6f 72 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  or the equivalen
24f00 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 74  t.  The use of t
24f10 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  he SQLITE_SHM_DI
24f20 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d  RECTORY compile-
24f30 74 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72  time.** option r
24f40 65 73 75 6c 74 73 20 69 6e 20 61 6e 20 69 6e 63  esults in an inc
24f50 6f 6d 70 61 74 69 62 6c 65 20 62 75 69 6c 64 20  ompatible build 
24f60 6f 66 20 53 51 4c 69 74 65 3b 20 20 62 75 69 6c  of SQLite;  buil
24f70 64 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a 20  ds of SQLite.** 
24f80 74 68 61 74 20 77 69 74 68 20 64 69 66 66 65 72  that with differ
24f90 69 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  ing SQLITE_SHM_D
24fa0 49 52 45 43 54 4f 52 59 20 73 65 74 74 69 6e 67  IRECTORY setting
24fb0 73 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  s attempt to use
24fc0 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64 61 74   the.** same dat
24fd0 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68  abase file at th
24fe0 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 61 74  e same time, dat
24ff0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
25000 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
25010 72 65 73 75 6c 74 2e 20 54 68 65 20 53 51 4c 49  result. The SQLI
25020 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
25030 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
25040 74 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65 72  tion is consider
25050 65 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72 74  ed.** "unsupport
25060 65 64 22 20 61 6e 64 20 6d 61 79 20 67 6f 20 61  ed" and may go a
25070 77 61 79 20 69 6e 20 61 20 66 75 74 75 72 65 20  way in a future 
25080 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65 2e 0a  SQLite release..
25090 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69  **.** When openi
250a0 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d  ng a new shared-
250b0 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20  memory file, if 
250c0 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63  no other instanc
250d0 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69  es of that.** fi
250e0 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  le are currently
250f0 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70   open, in this p
25100 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68  rocess or in oth
25110 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68  er processes, th
25120 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d  en.** the file m
25130 75 73 74 20 62 65 20 74 72 75 6e 63 61 74 65 64  ust be truncated
25140 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20   to zero length 
25150 6f 72 20 68 61 76 65 20 69 74 73 20 68 65 61 64  or have its head
25160 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a  er cleared..**.*
25170 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61  * If the origina
25180 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  l database file 
25190 28 70 44 62 46 64 29 20 69 73 20 75 73 69 6e 67  (pDbFd) is using
251a0 20 74 68 65 20 22 75 6e 69 78 2d 65 78 63 6c 22   the "unix-excl"
251b0 20 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d 65 61   VFS.** that mea
251c0 6e 73 20 74 68 61 74 20 61 6e 20 65 78 63 6c 75  ns that an exclu
251d0 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c  sive lock is hel
251e0 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
251f0 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68  e file and.** th
25200 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63  at no other proc
25210 65 73 73 65 73 20 61 72 65 20 61 62 6c 65 20 74  esses are able t
25220 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
25230 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
25240 6e 0a 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20  n.** that case, 
25250 77 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79  we do not really
25260 20 6e 65 65 64 20 73 68 61 72 65 64 20 6d 65 6d   need shared mem
25270 6f 72 79 2e 20 20 4e 6f 20 73 68 61 72 65 64 20  ory.  No shared 
25280 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65 20 69  memory.** file i
25290 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20  s created.  The 
252a0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69  shared memory wi
252b0 6c 6c 20 62 65 20 73 69 6d 75 6c 61 74 65 64 20  ll be simulated 
252c0 77 69 74 68 20 68 65 61 70 20 6d 65 6d 6f 72 79  with heap memory
252d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
252e0 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65  unixOpenSharedMe
252f0 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a 70  mory(unixFile *p
25300 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20  DbFd){.  struct 
25310 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20  unixShm *p = 0; 
25320 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
25330 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
25340 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72   opened */.  str
25350 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
25360 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20  *pShmNode;   /* 
25370 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d  The underlying m
25380 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
25390 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
253a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253b0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
253c0 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
253d0 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20  fo *pInode;     
253e0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64       /* The inod
253f0 65 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68 61  e of fd */.  cha
25400 72 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 3b  r *zShmFilename;
25410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25420 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
25430 20 75 73 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f   used for SHM */
25440 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e  .  int nShmFilen
25450 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
25460 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
25470 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69  e SHM filename i
25480 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a  n bytes */..  /*
25490 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
254a0 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78  for the new unix
254b0 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20  Shm object. */. 
254c0 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   p = sqlite3_mal
254d0 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20  loc( sizeof(*p) 
254e0 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
254f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
25500 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  MEM;.  memset(p,
25510 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b   0, sizeof(*p));
25520 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64  .  assert( pDbFd
25530 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20  ->pShm==0 );..  
25540 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
25550 69 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65  if a unixShmNode
25560 20 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20   object already 
25570 65 78 69 73 74 73 2e 20 52 65 75 73 65 20 61 6e  exists. Reuse an
25580 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f   existing.  ** o
25590 6e 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20 43  ne if present. C
255a0 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
255b0 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  if necessary..  
255c0 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
255d0 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
255e0 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b  = pDbFd->pInode;
255f0 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49  .  pShmNode = pI
25600 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a  node->pShmNode;.
25610 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d    if( pShmNode==
25620 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
25630 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
25640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
25650 73 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72 20  stat() info for 
25660 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
25670 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73  ..    /* Call fs
25680 74 61 74 28 29 20 74 6f 20 66 69 67 75 72 65 20  tat() to figure 
25690 6f 75 74 20 74 68 65 20 70 65 72 6d 69 73 73 69  out the permissi
256a0 6f 6e 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ons on the datab
256b0 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 20 20 20  ase file. If.   
256c0 20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20   ** a new *-shm 
256d0 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c  file is created,
256e0 20 61 6e 20 61 74 74 65 6d 70 74 20 77 69 6c 6c   an attempt will
256f0 20 62 65 20 6d 61 64 65 20 74 6f 20 63 72 65 61   be made to crea
25700 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 77 69 74  te it.    ** wit
25710 68 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69  h the same permi
25720 73 73 69 6f 6e 73 2e 20 54 68 65 20 61 63 74 75  ssions. The actu
25730 61 6c 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 74  al permissions t
25740 68 65 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  he file is creat
25750 65 64 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 61  ed.    ** with a
25760 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  re subject to th
25770 65 20 63 75 72 72 65 6e 74 20 75 6d 61 73 6b 20  e current umask 
25780 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a  setting..    */.
25790 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
257a0 70 44 62 46 64 2d 3e 68 2c 20 26 73 53 74 61 74  pDbFd->h, &sStat
257b0 29 20 26 26 20 70 49 6e 6f 64 65 2d 3e 62 50 72  ) && pInode->bPr
257c0 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  ocessLock==0 ){.
257d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
257e0 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
257f0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
25800 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20  en_err;.    }.. 
25810 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
25820 42 61 73 65 50 61 74 68 20 3d 20 70 44 62 46 64  BasePath = pDbFd
25830 2d 3e 7a 50 61 74 68 3b 0a 23 69 66 20 64 65 66  ->zPath;.#if def
25840 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
25850 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
25860 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
25870 20 20 20 2f 2a 20 49 66 20 70 44 62 46 64 20 69     /* If pDbFd i
25880 73 20 63 6f 6e 66 69 67 75 72 65 64 20 77 69 74  s configured wit
25890 68 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  h proxy locking 
258a0 6d 6f 64 65 2c 20 75 73 65 20 74 68 65 20 6c 6f  mode, use the lo
258b0 63 61 6c 20 0a 20 20 20 20 20 2a 2a 20 6c 6f 63  cal .     ** loc
258c0 6b 20 66 69 6c 65 20 70 61 74 68 20 74 6f 20 64  k file path to d
258d0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 2d 73 68  etermine the -sh
258e0 6d 20 66 69 6c 65 20 70 61 74 68 0a 20 20 20 20  m file path.    
258f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 50 72   */.    if( isPr
25900 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70  oxyLockingMode(p
25910 44 62 46 64 29 20 29 7b 0a 20 20 20 20 20 20 7a  DbFd) ){.      z
25920 42 61 73 65 50 61 74 68 20 3d 20 70 72 6f 78 79  BasePath = proxy
25930 53 68 61 72 65 64 4d 65 6d 6f 72 79 42 61 73 65  SharedMemoryBase
25940 50 61 74 68 28 70 44 62 46 64 29 3b 0a 20 20 20  Path(pDbFd);.   
25950 20 20 20 69 66 28 20 21 7a 42 61 73 65 50 61 74     if( !zBasePat
25960 68 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  h ){.        rc 
25970 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
25980 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  N_BKPT;.        
25990 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
259a0 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
259b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 23 69 66  .#endif.    .#if
259c0 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  def SQLITE_SHM_D
259d0 49 52 45 43 54 4f 52 59 0a 20 20 20 20 6e 53 68  IRECTORY.    nSh
259e0 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65  mFilename = size
259f0 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  of(SQLITE_SHM_DI
25a00 52 45 43 54 4f 52 59 29 20 2b 20 33 30 3b 0a 23  RECTORY) + 30;.#
25a10 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c  else.    nShmFil
25a20 65 6e 61 6d 65 20 3d 20 35 20 2b 20 28 69 6e 74  ename = 5 + (int
25a30 29 73 74 72 6c 65 6e 28 7a 42 61 73 65 50 61 74  )strlen(zBasePat
25a40 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  h);.#endif.    p
25a50 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65  ShmNode = sqlite
25a60 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
25a70 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53  (*pShmNode) + nS
25a80 68 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20  hmFilename );.  
25a90 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d    if( pShmNode==
25aa0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
25ab0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
25ac0 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
25ad0 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20  n_err;.    }.   
25ae0 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64 65   memset(pShmNode
25af0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 68  , 0, sizeof(*pSh
25b00 6d 4e 6f 64 65 29 29 3b 0a 20 20 20 20 7a 53 68  mNode));.    zSh
25b10 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 70 53 68 6d  mFilename = pShm
25b20 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  Node->zFilename 
25b30 3d 20 28 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f  = (char*)&pShmNo
25b40 64 65 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51  de[1];.#ifdef SQ
25b50 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
25b60 52 59 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  RY.    sqlite3_s
25b70 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65  nprintf(nShmFile
25b80 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  name, zShmFilena
25b90 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  me, .           
25ba0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
25bb0 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 22  _SHM_DIRECTORY "
25bc0 2f 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25  /sqlite-shm-%x-%
25bd0 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  x",.            
25be0 20 20 20 20 20 20 20 20 20 28 75 33 32 29 73 53           (u32)sS
25bf0 74 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32  tat.st_ino, (u32
25c00 29 73 53 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a  )sStat.st_dev);.
25c10 23 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74 65  #else.    sqlite
25c20 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46  3_snprintf(nShmF
25c30 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c  ilename, zShmFil
25c40 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c  ename, "%s-shm",
25c50 20 7a 42 61 73 65 50 61 74 68 29 3b 0a 20 20 20   zBasePath);.   
25c60 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
25c70 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  ix3(pDbFd->zPath
25c80 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b  , zShmFilename);
25c90 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d  .#endif.    pShm
25ca0 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  Node->h = -1;.  
25cb0 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d    pDbFd->pInode-
25cc0 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d  >pShmNode = pShm
25cd0 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f  Node;.    pShmNo
25ce0 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70 44 62  de->pInode = pDb
25cf0 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20 20  Fd->pInode;.    
25d00 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
25d10 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
25d20 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
25d30 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66  EX_FAST);.    if
25d40 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  ( pShmNode->mute
25d50 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  x==0 ){.      rc
25d60 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
25d70 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
25d80 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
25d90 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
25da0 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
25db0 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
25dc0 63 68 61 72 20 2a 7a 52 4f 3b 0a 20 20 20 20 20  char *zRO;.     
25dd0 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d   int openFlags =
25de0 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41   O_RDWR | O_CREA
25df0 54 3b 0a 20 20 20 20 20 20 7a 52 4f 20 3d 20 73  T;.      zRO = s
25e00 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
25e10 65 74 65 72 28 70 44 62 46 64 2d 3e 7a 50 61 74  eter(pDbFd->zPat
25e20 68 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d  h, "readonly_shm
25e30 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52  ");.      if( zR
25e40 4f 20 26 26 20 73 71 6c 69 74 65 33 47 65 74 42  O && sqlite3GetB
25e50 6f 6f 6c 65 61 6e 28 7a 52 4f 29 20 29 7b 0a 20  oolean(zRO) ){. 
25e60 20 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73         openFlags
25e70 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20   = O_RDONLY;.   
25e80 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69       pShmNode->i
25e90 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20  sReadonly = 1;. 
25ea0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68       }.      pSh
25eb0 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73  mNode->h = robus
25ec0 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 6c 65 6e  t_open(zShmFilen
25ed0 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ame, openFlags, 
25ee0 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 26 30  (sStat.st_mode&0
25ef0 37 37 37 29 29 3b 0a 20 20 20 20 20 20 69 66 28  777));.      if(
25f00 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29   pShmNode->h<0 )
25f10 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
25f20 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
25f30 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
25f40 2c 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d 46 69  , "open", zShmFi
25f50 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  lename);.       
25f60 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
25f70 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20  rr;.      }.  . 
25f80 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
25f90 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20   see if another 
25fa0 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
25fb0 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20  ng the dead-man 
25fc0 73 77 69 74 63 68 2e 0a 20 20 20 20 20 20 2a 2a  switch..      **
25fd0 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74   If not, truncat
25fe0 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65  e the file to ze
25ff0 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20  ro length. .    
26000 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
26010 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
26020 20 69 66 28 20 75 6e 69 78 53 68 6d 53 79 73 74   if( unixShmSyst
26030 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
26040 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53   F_WRLCK, UNIX_S
26050 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49  HM_DMS, 1)==SQLI
26060 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
26070 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75   if( robust_ftru
26080 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  ncate(pShmNode->
26090 68 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  h, 0) ){.       
260a0 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
260b0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
260c0 52 5f 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75  R_SHMOPEN, "ftru
260d0 6e 63 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65  ncate", zShmFile
260e0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  name);.        }
260f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26100 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 61 73  /* If running as
26110 20 72 6f 6f 74 20 73 65 74 20 74 68 65 20 75 69   root set the ui
26120 64 2f 67 69 64 20 6f 66 20 74 68 65 20 73 68 6d  d/gid of the shm
26130 20 66 69 6c 65 20 74 6f 20 6d 61 74 63 68 20 74   file to match t
26140 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
26150 20 20 20 20 20 20 20 20 20 75 69 64 5f 74 20 65           uid_t e
26160 75 69 64 20 3d 20 67 65 74 65 75 69 64 28 29 3b  uid = geteuid();
26170 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
26180 75 69 64 3d 3d 30 20 26 26 20 28 65 75 69 64 21  uid==0 && (euid!
26190 3d 73 53 74 61 74 2e 73 74 5f 75 69 64 20 7c 7c  =sStat.st_uid ||
261a0 20 67 65 74 65 67 69 64 28 29 21 3d 73 53 74 61   getegid()!=sSta
261b0 74 2e 73 74 5f 67 69 64 29 20 29 7b 0a 20 20 20  t.st_gid) ){.   
261c0 20 20 20 20 20 20 20 20 20 69 66 28 20 66 63 68           if( fch
261d0 6f 77 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  own(pShmNode->h,
261e0 20 73 53 74 61 74 2e 73 74 5f 75 69 64 2c 20 73   sStat.st_uid, s
261f0 53 74 61 74 2e 73 74 5f 67 69 64 29 20 29 7b 0a  Stat.st_gid) ){.
26200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
26210 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
26220 53 48 4d 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20  SHMOPEN;.       
26230 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26240 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
26250 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
26260 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26270 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
26280 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
26290 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b  ShmNode, F_RDLCK
262a0 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20  , UNIX_SHM_DMS, 
262b0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
262c0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
262d0 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
262e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61    }.  }..  /* Ma
262f0 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65  ke the new conne
26300 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66  ction a child of
26310 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
26320 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64   */.  p->pShmNod
26330 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69  e = pShmNode;.#i
26340 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
26350 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d  G.  p->id = pShm
26360 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b  Node->nextShmId+
26370 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d  +;.#endif.  pShm
26380 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  Node->nRef++;.  
26390 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b  pDbFd->pShm = p;
263a0 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
263b0 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72  x();..  /* The r
263c0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
263d0 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61  n pShmNode has a
263e0 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
263f0 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20  emented under.  
26400 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20  ** the cover of 
26410 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  the unixEnterMut
26420 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74  ex() mutex and t
26430 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20  he pointer from 
26440 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74  the.  ** new (st
26450 72 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62  ruct unixShm) ob
26460 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d  ject to the pShm
26470 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65  Node has been se
26480 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20  t. All that is. 
26490 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69   ** left to do i
264a0 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65  s to link the ne
264b0 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68  w object into th
264c0 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74  e linked list st
264d0 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70  arting.  ** at p
264e0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e  ShmNode->pFirst.
264f0 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f   This must be do
26500 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67  ne while holding
26510 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d   the pShmNode->m
26520 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78  utex .  ** mutex
26530 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
26540 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
26550 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
26560 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d   p->pNext = pShm
26570 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20  Node->pFirst;.  
26580 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
26590 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = p;.  sqlite3_
265a0 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
265b0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
265c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
265d0 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
265e0 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a  e on any error *
265f0 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a  /.shm_open_err:.
26600 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70    unixShmPurge(p
26610 44 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20  DbFd);       /* 
26620 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20  This call frees 
26630 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75  pShmNode if requ
26640 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ired */.  sqlite
26650 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69  3_free(p);.  uni
26660 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
26670 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
26680 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
26690 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
266a0 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72  obtain a pointer
266b0 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69   to region iRegi
266c0 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68  on of the .** sh
266d0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f  ared-memory asso
266e0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
266f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64  database file fd
26700 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  . Shared-memory 
26710 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20  regions .** are 
26720 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e  numbered startin
26730 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63  g from zero. Eac
26740 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  h shared-memory 
26750 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69  region is szRegi
26760 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20  on .** bytes in 
26770 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  size..**.** If a
26780 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
26790 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
267a0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
267b0 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  p is set to NULL
267c0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
267d0 65 2c 20 69 66 20 74 68 65 20 62 45 78 74 65 6e  e, if the bExten
267e0 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  d parameter is 0
267f0 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
26800 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
26810 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e  .** region has n
26820 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ot been allocate
26830 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74  d (by any client
26840 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20  , including one 
26850 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20  running in a.** 
26860 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73  separate process
26870 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73  ), then *pp is s
26880 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53  et to NULL and S
26890 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
268a0 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e  d. If .** bExten
268b0 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e  d is non-zero an
268c0 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
268d0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
268e0 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74  gion has not yet
268f0 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61   .** been alloca
26900 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63  ted, it is alloc
26910 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ated by this fun
26920 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
26930 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  the shared-memor
26940 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72  y region has alr
26950 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
26960 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61  ted or is alloca
26970 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63  ted by.** this c
26980 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64  all as described
26990 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20   above, then it 
269a0 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74  is mapped into t
269b0 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a  his processes .*
269c0 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20  * address space 
269d0 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
269e0 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73  ready), *pp is s
269f0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
26a00 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65  he mapped .** me
26a10 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  mory and SQLITE_
26a20 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
26a30 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
26a40 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33  hmMap(.  sqlite3
26a50 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
26a60 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
26a70 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62  le open on datab
26a80 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
26a90 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20  t iRegion,      
26aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26ab0 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69   Region to retri
26ac0 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52  eve */.  int szR
26ad0 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20  egion,          
26ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
26af0 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20   of regions */. 
26b00 20 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20   int bExtend,   
26b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65   /* True to exte
26b30 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73  nd file if neces
26b40 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76  sary */.  void v
26b50 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20  olatile **pp    
26b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
26b70 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20  : Mapped memory 
26b80 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  */.){.  unixFile
26b90 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46   *pDbFd = (unixF
26ba0 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53  ile*)fd;.  unixS
26bb0 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d  hm *p;.  unixShm
26bc0 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a  Node *pShmNode;.
26bd0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
26be0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  E_OK;..  /* If t
26bf0 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
26c00 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65   file has not ye
26c10 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
26c20 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20  pen it now. */. 
26c30 20 69 66 28 20 70 44 62 46 64 2d 3e 70 53 68 6d   if( pDbFd->pShm
26c40 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
26c50 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65  unixOpenSharedMe
26c60 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20  mory(pDbFd);.   
26c70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26c80 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
26c90 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46 64    }..  p = pDbFd
26ca0 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f  ->pShm;.  pShmNo
26cb0 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
26cc0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
26cd0 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
26ce0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
26cf0 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53  rt( szRegion==pS
26d00 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e  hmNode->szRegion
26d10 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   || pShmNode->nR
26d20 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73  egion==0 );.  as
26d30 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
26d40 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  pInode==pDbFd->p
26d50 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72  Inode );.  asser
26d60 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  t( pShmNode->h>=
26d70 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f  0 || pDbFd->pIno
26d80 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
26d90 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
26da0 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c   pShmNode->h<0 |
26db0 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  | pDbFd->pInode-
26dc0 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
26dd0 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e   );..  if( pShmN
26de0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52  ode->nRegion<=iR
26df0 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61  egion ){.    cha
26e00 72 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20 20  r **apNew;      
26e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e20 2f 2a 20 4e 65 77 20 61 70 52 65 67 69 6f 6e 5b  /* New apRegion[
26e30 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69  ] array */.    i
26e40 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67  nt nByte = (iReg
26e50 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b  ion+1)*szRegion;
26e60 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71    /* Minimum req
26e70 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20  uired file size 
26e80 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  */.    struct st
26e90 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20  at sStat;       
26ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
26eb0 64 20 62 79 20 66 73 74 61 74 28 29 20 2a 2f 0a  d by fstat() */.
26ec0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73  .    pShmNode->s
26ed0 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69  zRegion = szRegi
26ee0 6f 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 68  on;..    if( pSh
26ef0 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  mNode->h>=0 ){. 
26f00 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75       /* The requ
26f10 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20  ested region is 
26f20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20  not mapped into 
26f30 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
26f40 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20  ddress space..  
26f50 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20      ** Check to 
26f60 73 65 65 20 69 66 20 69 74 20 68 61 73 20 62 65  see if it has be
26f70 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e  en allocated (i.
26f80 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e  e. if the wal-in
26f90 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20  dex file is.    
26fa0 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67    ** large enoug
26fb0 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  h to contain the
26fc0 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
26fd0 6e 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  n)..      */.   
26fe0 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70     if( osFstat(p
26ff0 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74  ShmNode->h, &sSt
27000 61 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  at) ){.        r
27010 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
27020 5f 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20  _SHMSIZE;.      
27030 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
27040 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20  ut;.      }.  . 
27050 20 20 20 20 20 69 66 28 20 73 53 74 61 74 2e 73       if( sStat.s
27060 74 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b 0a  t_size<nByte ){.
27070 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
27080 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
27090 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  region does not 
270a0 65 78 69 73 74 2e 20 49 66 20 62 45 78 74 65 6e  exist. If bExten
270b0 64 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20  d is set to.    
270c0 20 20 20 20 2a 2a 20 66 61 6c 73 65 2c 20 65 78      ** false, ex
270d0 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69  it early. *pp wi
270e0 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c  ll be set to NUL
270f0 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  L and SQLITE_OK 
27100 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20  returned..      
27110 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
27120 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69  Alternatively, i
27130 66 20 62 45 78 74 65 6e 64 20 69 73 20 74 72 75  f bExtend is tru
27140 65 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74 65  e, use ftruncate
27150 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20  () to allocate. 
27160 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65         ** the re
27170 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
27180 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  egion..        *
27190 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 62  /.        if( !b
271a0 45 78 74 65 6e 64 20 29 20 67 6f 74 6f 20 73 68  Extend ) goto sh
271b0 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
271c0 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74     if( robust_ft
271d0 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65  runcate(pShmNode
271e0 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20  ->h, nByte) ){. 
271f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
27200 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
27210 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c  E_IOERR_SHMSIZE,
27220 20 22 66 74 72 75 6e 63 61 74 65 22 2c 0a 20 20   "ftruncate",.  
27230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27240 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f            pShmNo
27250 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  de->zFilename);.
27260 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
27270 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
27280 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
27290 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20    }..    /* Map 
272a0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  the requested me
272b0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f  mory region into
272c0 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
272d0 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a  address space. *
272e0 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 63  /.    apNew = (c
272f0 68 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72  har **)sqlite3_r
27300 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
27310 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
27320 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a  on, (iRegion+1)*
27330 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a 20  sizeof(char *). 
27340 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61     );.    if( !a
27350 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63  pNew ){.      rc
27360 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
27370 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
27380 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
27390 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64     }.    pShmNod
273a0 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61 70  e->apRegion = ap
273b0 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c 65 28 70  New;.    while(p
273c0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
273d0 3c 3d 69 52 65 67 69 6f 6e 29 7b 0a 20 20 20 20  <=iRegion){.    
273e0 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20    void *pMem;.  
273f0 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
27400 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
27410 20 20 70 4d 65 6d 20 3d 20 6d 6d 61 70 28 30 2c    pMem = mmap(0,
27420 20 73 7a 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20   szRegion,.     
27430 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
27440 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50 52  >isReadonly ? PR
27450 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f 52  OT_READ : PROT_R
27460 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20  EAD|PROT_WRITE, 
27470 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d 41 50  .            MAP
27480 5f 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64  _SHARED, pShmNod
27490 65 2d 3e 68 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  e->h, pShmNode->
274a0 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e  nRegion*szRegion
274b0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
274c0 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41      if( pMem==MA
274d0 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  P_FAILED ){.    
274e0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
274f0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
27500 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d  OERR_SHMMAP, "mm
27510 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a  ap", pShmNode->z
27520 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
27530 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
27540 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  e_out;.        }
27550 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
27560 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 73 71 6c        pMem = sql
27570 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 7a 52 65  ite3_malloc(szRe
27580 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 69  gion);.        i
27590 66 28 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20  f( pMem==0 ){.  
275a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
275b0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
275c0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
275d0 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  e_out;.        }
275e0 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
275f0 70 4d 65 6d 2c 20 30 2c 20 73 7a 52 65 67 69 6f  pMem, 0, szRegio
27600 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
27610 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65    pShmNode->apRe
27620 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e  gion[pShmNode->n
27630 52 65 67 69 6f 6e 5d 20 3d 20 70 4d 65 6d 3b 0a  Region] = pMem;.
27640 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
27650 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d  nRegion++;.    }
27660 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75  .  }..shmpage_ou
27670 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  t:.  if( pShmNod
27680 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69  e->nRegion>iRegi
27690 6f 6e 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20  on ){.    *pp = 
276a0 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
276b0 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d  on[iRegion];.  }
276c0 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20  else{.    *pp = 
276d0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68  0;.  }.  if( pSh
276e0 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c  mNode->isReadonl
276f0 79 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  y && rc==SQLITE_
27700 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  OK ) rc = SQLITE
27710 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c  _READONLY;.  sql
27720 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
27730 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
27740 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
27750 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
27760 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66  the lock state f
27770 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f  or a shared-memo
27780 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a  ry segment..**.*
27790 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
277a0 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74  relationship bet
277b0 77 65 65 6e 20 53 48 41 52 45 64 20 61 6e 64 20  ween SHAREd and 
277c0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20  EXCLUSIVE locks 
277d0 69 73 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 64  is a little.** d
277e0 69 66 66 65 72 65 6e 74 20 68 65 72 65 20 74 68  ifferent here th
277f0 61 6e 20 69 6e 20 70 6f 73 69 78 2e 20 20 49 6e  an in posix.  In
27800 20 78 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65   xShmLock(), one
27810 20 63 61 6e 20 67 6f 20 66 72 6f 6d 20 75 6e 6c   can go from unl
27820 6f 63 6b 65 64 0a 2a 2a 20 74 6f 20 73 68 61 72  ocked.** to shar
27830 65 64 20 61 6e 64 20 62 61 63 6b 20 6f 72 20 66  ed and back or f
27840 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20  rom unlocked to 
27850 65 78 63 6c 75 73 69 76 65 20 61 6e 64 20 62 61  exclusive and ba
27860 63 6b 2e 20 20 42 75 74 20 6f 6e 65 20 6d 61 79  ck.  But one may
27870 0a 2a 2a 20 6e 6f 74 20 67 6f 20 66 72 6f 6d 20  .** not go from 
27880 73 68 61 72 65 64 20 74 6f 20 65 78 63 6c 75 73  shared to exclus
27890 69 76 65 20 6f 72 20 66 72 6f 6d 20 65 78 63 6c  ive or from excl
278a0 75 73 69 76 65 20 74 6f 20 73 68 61 72 65 64 2e  usive to shared.
278b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
278c0 6e 69 78 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71  nixShmLock(.  sq
278d0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
278e0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
278f0 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e  base file holdin
27900 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
27910 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  ory */.  int ofs
27920 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
27930 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63      /* First loc
27940 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  k to acquire or 
27950 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
27960 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   n,             
27970 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
27980 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63  r of locks to ac
27990 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65  quire or release
279a0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
279b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279c0 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
279d0 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a  ith the lock */.
279e0 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
279f0 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65  DbFd = (unixFile
27a00 2a 29 66 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f  *)fd;      /* Co
27a10 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67  nnection holding
27a20 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
27a30 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d  /.  unixShm *p =
27a40 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20   pDbFd->pShm;   
27a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
27a60 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62   shared memory b
27a70 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20  eing locked */. 
27a80 20 75 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20 20   unixShm *pX;   
27a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27aa0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
27ab0 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73  oping over all s
27ac0 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 75 6e 69  iblings */.  uni
27ad0 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
27ae0 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
27af0 3b 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c  ;  /* The underl
27b00 79 69 6e 67 20 66 69 6c 65 20 69 4e 6f 64 65 20  ying file iNode 
27b10 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
27b20 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
27b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
27b40 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75  sult code */.  u
27b50 31 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20  16 mask;        
27b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b70 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
27b80 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72  locks to take or
27b90 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61   release */..  a
27ba0 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d  ssert( pShmNode=
27bb0 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e  =pDbFd->pInode->
27bc0 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73  pShmNode );.  as
27bd0 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
27be0 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  pInode==pDbFd->p
27bf0 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72  Inode );.  asser
27c00 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66  t( ofst>=0 && of
27c10 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d  st+n<=SQLITE_SHM
27c20 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  _NLOCK );.  asse
27c30 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73  rt( n>=1 );.  as
27c40 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51  sert( flags==(SQ
27c50 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
27c60 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
27c70 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  D).       || fla
27c80 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
27c90 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
27ca0 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20  M_EXCLUSIVE).   
27cb0 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
27cc0 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
27cd0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   | SQLITE_SHM_SH
27ce0 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  ARED).       || 
27cf0 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
27d00 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
27d10 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
27d20 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
27d30 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==1 || (flags & 
27d40 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
27d50 53 49 56 45 29 21 3d 30 20 29 3b 0a 20 20 61 73  SIVE)!=0 );.  as
27d60 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
27d70 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70  h>=0 || pDbFd->p
27d80 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
27d90 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  ock==1 );.  asse
27da0 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c  rt( pShmNode->h<
27db0 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f  0 || pDbFd->pIno
27dc0 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
27dd0 3d 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d  ==0 );..  mask =
27de0 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d   (1<<(ofst+n)) -
27df0 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 61 73   (1<<ofst);.  as
27e00 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73  sert( n>1 || mas
27e10 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a  k==(1<<ofst) );.
27e20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
27e30 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
27e40 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c  mutex);.  if( fl
27e50 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
27e60 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75  _UNLOCK ){.    u
27e70 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20  16 allMask = 0; 
27e80 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73  /* Mask of locks
27e90 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
27ea0 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65  s */..    /* See
27eb0 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73   if any siblings
27ec0 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20   hold this same 
27ed0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28  lock */.    for(
27ee0 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
27ef0 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
27f00 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
27f10 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e  ( pX==p ) contin
27f20 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ue;.      assert
27f30 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
27f40 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70  & (p->exclMask|p
27f50 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d  ->sharedMask))==
27f60 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61  0 );.      allMa
27f70 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64  sk |= pX->shared
27f80 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Mask;.    }..   
27f90 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73   /* Unlock the s
27fa0 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b  ystem-level lock
27fb0 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61  s */.    if( (ma
27fc0 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30  sk & allMask)==0
27fd0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75   ){.      rc = u
27fe0 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
27ff0 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 55 4e 4c  (pShmNode, F_UNL
28000 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48  CK, ofst+UNIX_SH
28010 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
28020 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
28030 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
28040 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20   }..    /* Undo 
28050 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20  the local locks 
28060 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
28070 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28080 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d    p->exclMask &=
28090 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d   ~mask;.      p-
280a0 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e  >sharedMask &= ~
280b0 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d  mask;.    } .  }
280c0 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
280d0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
280e0 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c  ED ){.    u16 al
280f0 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a  lShared = 0;  /*
28100 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20   Union of locks 
28110 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
28120 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22  ons other than "
28130 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69  p" */..    /* Fi
28140 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61  nd out which sha
28150 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c  red locks are al
28160 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69  ready held by si
28170 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
28180 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79  s..    ** If any
28190 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79   sibling already
281a0 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73   holds an exclus
281b0 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65  ive lock, go ahe
281c0 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ad and return.  
281d0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59    ** SQLITE_BUSY
281e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
281f0 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
28200 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
28210 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
28220 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  f( (pX->exclMask
28230 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20   & mask)!=0 ){. 
28240 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
28250 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
28260 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
28270 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20        allShared 
28280 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  |= pX->sharedMas
28290 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
282a0 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   Get shared lock
282b0 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  s at the system 
282c0 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73  level, if necess
282d0 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  ary */.    if( r
282e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
282f0 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68        if( (allSh
28300 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20  ared & mask)==0 
28310 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
28320 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
28330 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44  k(pShmNode, F_RD
28340 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53  LCK, ofst+UNIX_S
28350 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
28360 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28370 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
28380 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
28390 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
283a0 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63  local shared loc
283b0 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
283c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
283d0 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
283e0 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
283f0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
28400 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73  * Make sure no s
28410 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
28420 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68  ns hold locks th
28430 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68  at will block th
28440 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20  is.    ** lock. 
28450 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75   If any do, retu
28460 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72  rn SQLITE_BUSY r
28470 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a  ight away..    *
28480 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
28490 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
284a0 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
284b0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
284c0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
284d0 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61  )!=0 || (pX->sha
284e0 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  redMask & mask)!
284f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
28500 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
28510 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
28520 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
28530 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65      /* Get the e
28540 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61  xclusive locks a
28550 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
28560 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63  el.  Then if suc
28570 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61  cessful.    ** a
28580 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63  lso mark the loc
28590 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73  al connection as
285a0 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20   being locked.. 
285b0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
285c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
285d0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68       rc = unixSh
285e0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
285f0 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f  Node, F_WRLCK, o
28600 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53  fst+UNIX_SHM_BAS
28610 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  E, n);.      if(
28620 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28630 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
28640 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  ( (p->sharedMask
28650 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20   & mask)==0 );. 
28660 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61         p->exclMa
28670 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
28680 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
28690 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
286a0 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
286b0 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  tex);.  OSTRACE(
286c0 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64  ("SHM-LOCK shmid
286d0 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20  -%d, pid-%d got 
286e0 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20  %03x,%03x\n",.  
286f0 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20           p->id, 
28700 67 65 74 70 69 64 28 29 2c 20 70 2d 3e 73 68 61  getpid(), p->sha
28710 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c  redMask, p->excl
28720 4d 61 73 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e  Mask));.  return
28730 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
28740 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79  plement a memory
28750 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f   barrier or memo
28760 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72  ry fence on shar
28770 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a  ed memory.  .**.
28780 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64  ** All loads and
28790 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65   stores begun be
287a0 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72  fore the barrier
287b0 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62   must complete b
287c0 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61  efore.** any loa
287d0 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e  d or store begun
287e0 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69   after the barri
287f0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
28800 69 64 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65  id unixShmBarrie
28810 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  r(.  sqlite3_fil
28820 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 20  e *fd           
28830 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
28840 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68   file holding th
28850 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
28860 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  */.){.  UNUSED_P
28870 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20  ARAMETER(fd);.  
28880 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
28890 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
288a0 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ex();.}../*.** C
288b0 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f  lose a connectio
288c0 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f  n to shared-memo
288d0 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20  ry.  Delete the 
288e0 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73  underlying .** s
288f0 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74 65  torage if delete
28900 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a  Flag is true..**
28910 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
28920 6e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  no shared memory
28930 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
28940 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
28950 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75  then this.** rou
28960 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65  tine is a harmle
28970 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61  ss no-op..*/.sta
28980 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 55  tic int unixShmU
28990 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  nmap(.  sqlite3_
289a0 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
289b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
289c0 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
289d0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
289e0 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20   deleteFlag     
289f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28a00 44 65 6c 65 74 65 20 73 68 61 72 65 64 2d 6d 65  Delete shared-me
28a10 6d 6f 72 79 20 69 66 20 74 72 75 65 20 2a 2f 0a  mory if true */.
28a20 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b  ){.  unixShm *p;
28a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a40 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
28a50 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f  ection to be clo
28a60 73 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  sed */.  unixShm
28a70 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
28a80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28a90 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65  underlying share
28aa0 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  d-memory file */
28ab0 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b  .  unixShm **pp;
28ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ad0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
28ae0 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63  g over sibling c
28af0 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
28b00 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 3b  unixFile *pDbFd;
28b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
28b30 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
28b40 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 75  */..  pDbFd = (u
28b50 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70  nixFile*)fd;.  p
28b60 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
28b70 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
28b80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
28b90 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70   pShmNode = p->p
28ba0 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65  ShmNode;..  asse
28bb0 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44  rt( pShmNode==pD
28bc0 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  bFd->pInode->pSh
28bd0 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72  mNode );.  asser
28be0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e  t( pShmNode->pIn
28bf0 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
28c00 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f  de );..  /* Remo
28c10 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  ve connection p 
28c20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20  from the set of 
28c30 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f  connections asso
28c40 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68  ciated.  ** with
28c50 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73   pShmNode */.  s
28c60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
28c70 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
28c80 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70  ex);.  for(pp=&p
28c90 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
28ca0 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20   (*pp)!=p; pp = 
28cb0 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d  &(*pp)->pNext){}
28cc0 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78  .  *pp = p->pNex
28cd0 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68  t;..  /* Free th
28ce0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a  e connection p *
28cf0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
28d00 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  (p);.  pDbFd->pS
28d10 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  hm = 0;.  sqlite
28d20 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
28d30 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
28d40 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64  .  /* If pShmNod
28d50 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63  e->nRef has reac
28d60 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73  hed 0, then clos
28d70 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
28d80 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d  .  ** shared-mem
28d90 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f  ory file, too */
28da0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
28db0 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x();.  assert( p
28dc0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20  ShmNode->nRef>0 
28dd0 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  );.  pShmNode->n
28de0 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68  Ref--;.  if( pSh
28df0 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  mNode->nRef==0 )
28e00 7b 0a 20 20 20 20 69 66 28 20 64 65 6c 65 74 65  {.    if( delete
28e10 46 6c 61 67 20 26 26 20 70 53 68 6d 4e 6f 64 65  Flag && pShmNode
28e20 2d 3e 68 3e 3d 30 20 29 20 6f 73 55 6e 6c 69 6e  ->h>=0 ) osUnlin
28e30 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  k(pShmNode->zFil
28e40 65 6e 61 6d 65 29 3b 0a 20 20 20 20 75 6e 69 78  ename);.    unix
28e50 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b  ShmPurge(pDbFd);
28e60 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65  .  }.  unixLeave
28e70 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75  Mutex();..  retu
28e80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
28e90 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ..#else.# define
28ea0 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20 20   unixShmMap     
28eb0 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  0.# define unixS
28ec0 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65  hmLock    0.# de
28ed0 66 69 6e 65 20 75 6e 69 78 53 68 6d 42 61 72 72  fine unixShmBarr
28ee0 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20 75  ier 0.# define u
28ef0 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a  nixShmUnmap   0.
28f00 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
28f10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
28f20 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65  L */../*.** Here
28f30 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d   ends the implem
28f40 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  entation of all 
28f50 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
28f60 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  hods..**.*******
28f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
28f80 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  End sqlite3_file
28f90 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   Methods *******
28fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28fb0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
28fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29000 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
29010 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f  This division co
29020 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f  ntains definitio
29030 6e 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f  ns of sqlite3_io
29040 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73  _methods objects
29050 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65   that.** impleme
29060 6e 74 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20  nt various file 
29070 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69  locking strategi
29080 65 73 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e  es.  It also con
29090 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e  tains definition
290a0 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22  s.** of "finder"
290b0 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66   functions.  A f
290c0 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69  inder-function i
290d0 73 20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65  s used to locate
290e0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
290f0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  .** sqlite3_io_m
29100 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f  ethods object fo
29110 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64  r a particular d
29120 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
29130 68 65 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66  he pAppData.** f
29140 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69  ield of the sqli
29150 74 65 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65  te3_vfs VFS obje
29160 63 74 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69  cts are initiali
29170 7a 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65  zed to be pointe
29180 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72  rs to.** the cor
29190 72 65 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63  rect finder-func
291a0 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46  tion for that VF
291b0 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69  S..**.** Most fi
291c0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72  nder functions r
291d0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
291e0 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69 74  to a fixed sqlit
291f0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a  e3_io_methods.**
29200 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e   object.  The on
29210 6c 79 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66  ly interesting f
29220 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69  inder-function i
29230 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  s autolockIoFind
29240 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f  er, which.** loo
29250 6b 73 20 61 74 20 74 68 65 20 66 69 6c 65 73 79  ks at the filesy
29260 73 74 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72  stem type and tr
29270 69 65 73 20 74 6f 20 67 75 65 73 73 20 74 68 65  ies to guess the
29280 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   best locking.**
29290 20 73 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74   strategy from t
292a0 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66  hat..**.** For f
292b0 69 6e 64 65 72 2d 66 75 6e 74 69 6f 6e 20 46 2c  inder-funtion F,
292c0 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65   two objects are
292d0 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20   created:.**.** 
292e0 20 20 20 28 31 29 20 54 68 65 20 72 65 61 6c 20     (1) The real 
292f0 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
29300 6e 61 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e  named "FImpt()".
29310 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20  .**.**    (2) A 
29320 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72  constant pointer
29330 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
29340 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22  n named just "F"
29350 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69  ..**.**.** A poi
29360 6e 74 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f  nter to the F po
29370 69 6e 74 65 72 20 69 73 20 75 73 65 64 20 61 73  inter is used as
29380 20 74 68 65 20 70 41 70 70 44 61 74 61 20 76 61   the pAppData va
29390 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f  lue for VFS.** o
293a0 62 6a 65 63 74 73 2e 20 20 57 65 20 68 61 76 65  bjects.  We have
293b0 20 74 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74   to do this inst
293c0 65 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70  ead of letting p
293d0 41 70 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a  AppData point.**
293e0 20 64 69 72 65 63 74 6c 79 20 61 74 20 74 68 65   directly at the
293f0 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
29400 20 73 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73   since C90 rules
29410 20 70 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a   prevent a void*
29420 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74  .** from be cast
29430 20 69 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e   into a function
29440 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a   pointer..**.**.
29450 2a 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65  ** Each instance
29460 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67   of this macro g
29470 65 6e 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a  enerates two obj
29480 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ects:.**.**   * 
29490 20 41 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69   A constant sqli
294a0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
294b0 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f  bject call METHO
294c0 44 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69  D that has locki
294d0 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f  ng.**      metho
294e0 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20  ds CLOSE, LOCK, 
294f0 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43  UNLOCK, CKRESLOC
29500 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e  K..**.**   *  An
29510 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64   I/O method find
29520 65 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  er function call
29530 65 64 20 46 49 4e 44 45 52 20 74 68 61 74 20 72  ed FINDER that r
29540 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
29550 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
29560 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e  METHOD object in
29570 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 75   the previous bu
29580 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  llet..*/.#define
29590 20 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45   IOMETHODS(FINDE
295a0 52 2c 20 4d 45 54 48 4f 44 2c 20 56 45 52 53 49  R, METHOD, VERSI
295b0 4f 4e 2c 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c  ON, CLOSE, LOCK,
295c0 20 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29   UNLOCK, CKLOCK)
295d0 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63        \.static c
295e0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
295f0 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d  methods METHOD =
29600 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
29610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29620 20 20 20 20 20 5c 0a 20 20 20 56 45 52 53 49 4f       \.   VERSIO
29630 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N,              
29640 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
29650 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  n */            
29660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29670 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20      \.   CLOSE, 
29680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29690 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a       /* xClose *
296a0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
296b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
296c0 20 20 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64     \.   unixRead
296d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
296e0 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20      /* xRead */ 
296f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29710 20 20 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65    \.   unixWrite
29720 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29730 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20     /* xWrite */ 
29740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29760 20 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61   \.   unixTrunca
29770 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
29780 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a    /* xTruncate *
29790 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
297a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297b0 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20  \.   unixSync,  
297c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297d0 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20   /* xSync */    
297e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
29800 0a 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65  .   unixFileSize
29810 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29820 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20  /* xFileSize */ 
29830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
29850 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20     LOCK,        
29860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29870 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  * xLock */      
29880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29890 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
298a0 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20    UNLOCK,       
298b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
298c0 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20   xUnlock */     
298d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298e0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
298f0 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20   CKLOCK,        
29900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29910 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
29920 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
29930 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
29940 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c  unixFileControl,
29950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29960 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20  FileControl */  
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 20 5c 0a 20 20 20 75            \.   u
29990 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20  nixSectorSize,  
299a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
299b0 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20  ectorSize */    
299c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299d0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
299e0 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ixDeviceCharacte
299f0 72 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65  ristics,  /* xDe
29a00 76 69 63 65 43 61 70 61 62 69 6c 69 74 69 65 73  viceCapabilities
29a10 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
29a20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
29a30 78 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20  xShmMap,        
29a40 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
29a50 4d 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20  Map */          
29a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a70 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
29a80 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ShmLock,        
29a90 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c          /* xShmL
29aa0 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
29ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ac0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
29ad0 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20  hmBarrier,      
29ae0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61         /* xShmBa
29af0 72 72 69 65 72 20 2a 2f 20 20 20 20 20 20 20 20  rrier */        
29b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b10 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
29b20 6d 55 6e 6d 61 70 20 20 20 20 20 20 20 20 20 20  mUnmap          
29b30 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d        /* xShmUnm
29b40 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ap */           
29b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b60 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20      \.};        
29b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bb0 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73     \.static cons
29bc0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
29bd0 68 6f 64 73 20 2a 46 49 4e 44 45 52 23 23 49 6d  hods *FINDER##Im
29be0 70 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  pl(const char *z
29bf0 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20  , unixFile *p){ 
29c00 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52    \.  UNUSED_PAR
29c10 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55 53 45  AMETER(z); UNUSE
29c20 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20  D_PARAMETER(p); 
29c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c50 20 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d 45 54   \.  return &MET
29c60 48 4f 44 3b 20 20 20 20 20 20 20 20 20 20 20 20  HOD;            
29c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ca0 5c 0a 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  \.}             
29cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
29cf0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
29d00 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
29d10 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52   *(*const FINDER
29d20 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
29d30 69 78 46 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a  ixFile *p)    \.
29d40 20 20 20 20 3d 20 46 49 4e 44 45 52 23 23 49 6d      = FINDER##Im
29d50 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20  pl;../*.** Here 
29d60 61 72 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73  are all of the s
29d70 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
29d80 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61  s objects for ea
29d90 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63  ch of the.** loc
29da0 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e  king strategies.
29db0 20 20 46 75 6e 63 74 69 6f 6e 73 20 74 68 61 74    Functions that
29dc0 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 73   return pointers
29dd0 20 74 6f 20 74 68 65 73 65 20 6d 65 74 68 6f 64   to these method
29de0 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63 72  s.** are also cr
29df0 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48  eated..*/.IOMETH
29e00 4f 44 53 28 0a 20 20 70 6f 73 69 78 49 6f 46 69  ODS(.  posixIoFi
29e10 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
29e20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
29e30 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f  ion name */.  po
29e40 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  sixIoMethods,   
29e50 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
29e60 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
29e70 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 32  ject name */.  2
29e80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29e90 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
29ea0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 65 6e 61  ed memory is ena
29eb0 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c  bled */.  unixCl
29ec0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
29ed0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
29ee0 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f  thod */.  unixLo
29ef0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
29f00 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
29f10 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c  hod */.  unixUnl
29f20 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
29f30 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
29f40 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68  thod */.  unixCh
29f50 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
29f60 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
29f70 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
29f80 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28   */.).IOMETHODS(
29f90 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  .  nolockIoFinde
29fa0 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r,           /* 
29fb0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
29fc0 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  name */.  nolock
29fd0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
29fe0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
29ff0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
2a000 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
2a010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a020 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
2a030 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
2a040 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f  d */.  nolockClo
2a050 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
2a060 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
2a070 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63  d */.  nolockLoc
2a080 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2a090 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
2a0a0 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f   */.  nolockUnlo
2a0b0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
2a0c0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
2a0d0 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65  d */.  nolockChe
2a0e0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
2a0f0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
2a100 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
2a110 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  .).IOMETHODS(.  
2a120 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c  dotlockIoFinder,
2a130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
2a140 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
2a150 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f  e */.  dotlockIo
2a160 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
2a170 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
2a180 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
2a190 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
2a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1b0 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
2a1c0 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
2a1d0 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65  /.  dotlockClose
2a1e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2a1f0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
2a200 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c  /.  dotlockLock,
2a210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a220 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
2a230 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b  .  dotlockUnlock
2a240 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2a250 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
2a260 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b  /.  dotlockCheck
2a270 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 2f 2a  ReservedLock  /*
2a280 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
2a290 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
2a2a0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
2a2b0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2a2c0 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a   && !OS_VXWORKS.
2a2d0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f  IOMETHODS(.  flo
2a2e0 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ckIoFinder,     
2a2f0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
2a300 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
2a310 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f  /.  flockIoMetho
2a320 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ds,           /*
2a330 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2a340 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
2a350 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
2a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a370 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
2a380 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
2a390 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20   flockClose,    
2a3a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
2a3b0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
2a3c0 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20   flockLock,     
2a3d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
2a3e0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2a3f0 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20  flockUnlock,    
2a400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
2a410 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
2a420 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72   flockCheckReser
2a430 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43  vedLock    /* xC
2a440 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2a450 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
2a460 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f  dif..#if OS_VXWO
2a470 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  RKS.IOMETHODS(. 
2a480 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20   semIoFinder,   
2a490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2a4a0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
2a4b0 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74  me */.  semIoMet
2a4c0 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
2a4d0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
2a4e0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
2a4f0 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
2a500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a510 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
2a520 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
2a530 2a 2f 0a 20 20 73 65 6d 43 6c 6f 73 65 2c 20 20  */.  semClose,  
2a540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a550 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
2a560 2a 2f 0a 20 20 73 65 6d 4c 6f 63 6b 2c 20 20 20  */.  semLock,   
2a570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a580 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
2a590 2f 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20  /.  semUnlock,  
2a5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a5b0 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
2a5c0 2a 2f 0a 20 20 73 65 6d 43 68 65 63 6b 52 65 73  */.  semCheckRes
2a5d0 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f  ervedLock      /
2a5e0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
2a5f0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
2a600 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
2a610 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
2a620 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
2a630 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49  _LOCKING_STYLE.I
2a640 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70 49  OMETHODS(.  afpI
2a650 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
2a660 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
2a670 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
2a680 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c  .  afpIoMethods,
2a690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a6a0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2a6b0 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
2a6c0 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
2a6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a6e0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
2a6f0 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
2a700 61 66 70 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  afpClose,       
2a710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
2a720 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
2a730 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  afpLock,        
2a740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
2a750 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61  ck method */.  a
2a760 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  fpUnlock,       
2a770 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
2a780 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2a790 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64  afpCheckReserved
2a7a0 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68  Lock      /* xCh
2a7b0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
2a7c0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
2a7d0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72  if../*.** The pr
2a7e0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  oxy locking meth
2a7f0 6f 64 20 69 73 20 61 20 22 73 75 70 65 72 2d 6d  od is a "super-m
2a800 65 74 68 6f 64 22 20 69 6e 20 74 68 65 20 73 65  ethod" in the se
2a810 6e 73 65 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f  nse that it.** o
2a820 70 65 6e 73 20 73 65 63 6f 6e 64 61 72 79 20 66  pens secondary f
2a830 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
2a840 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 61 6e  for the conch an
2a850 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64  d lock files and
2a860 0a 2a 2a 20 69 74 20 75 73 65 73 20 70 72 6f 78  .** it uses prox
2a870 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50  y, dot-file, AFP
2a880 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f  , and flock() lo
2a890 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e  cking methods on
2a8a0 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64   those.** second
2a8b0 61 72 79 20 66 69 6c 65 73 2e 20 20 46 6f 72 20  ary files.  For 
2a8c0 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65  this reason, the
2a8d0 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69   division that i
2a8e0 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f  mplements.** pro
2a8f0 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f  xy locking is lo
2a900 63 61 74 65 64 20 6d 75 63 68 20 66 75 72 74 68  cated much furth
2a910 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 66  er down in the f
2a920 69 6c 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65  ile.  But we nee
2a930 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61 64  d.** to go ahead
2a940 20 61 6e 64 20 64 65 66 69 6e 65 20 74 68 65 20   and define the 
2a950 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2a960 64 73 20 61 6e 64 20 66 69 6e 64 65 72 20 66 75  ds and finder fu
2a970 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72  nction.** for pr
2a980 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65  oxy locking here
2a990 2e 20 20 53 6f 20 77 65 20 66 6f 72 77 61 72 64  .  So we forward
2a9a0 20 64 65 63 6c 61 72 65 20 74 68 65 20 49 2f 4f   declare the I/O
2a9b0 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66   methods..*/.#if
2a9c0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2a9d0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
2a9e0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2a9f0 4c 45 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  LE.static int pr
2aa00 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  oxyClose(sqlite3
2aa10 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20  _file*);.static 
2aa20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71  int proxyLock(sq
2aa30 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
2aa40 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
2aa50 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  oxyUnlock(sqlite
2aa60 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73  3_file*, int);.s
2aa70 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
2aa80 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2aa90 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
2aaa0 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53  int*);.IOMETHODS
2aab0 28 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65  (.  proxyIoFinde
2aac0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
2aad0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
2aae0 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79   name */.  proxy
2aaf0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
2ab00 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
2ab10 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
2ab20 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c 20 20  t name */.  2,  
2ab30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab40 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
2ab50 6d 65 6d 6f 72 79 20 69 73 20 65 6e 61 62 6c 65  memory is enable
2ab60 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73  d */.  proxyClos
2ab70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2ab80 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
2ab90 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  d */.  proxyLock
2aba0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2abb0 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
2abc0 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63   */.  proxyUnloc
2abd0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2abe0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
2abf0 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65 63  d */.  proxyChec
2ac00 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
2ac10 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
2ac20 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
2ac30 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66  .).#endif../* nf
2ac40 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31  s lockd on OSX 1
2ac50 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65  0.3+ doesn't cle
2ac60 61 72 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 77  ar write locks w
2ac70 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  hen a read lock 
2ac80 69 73 20 73 65 74 20 2a 2f 0a 23 69 66 20 64 65  is set */.#if de
2ac90 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2aca0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
2acb0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2acc0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66 73  IOMETHODS(.  nfs
2acd0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
2ace0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
2acf0 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
2ad00 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f 64  */.  nfsIoMethod
2ad10 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2ad20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
2ad30 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
2ad40 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
2ad50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad60 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
2ad70 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
2ad80 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20  /.  unixClose,  
2ad90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ada0 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
2adb0 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20  */.  unixLock,  
2adc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2add0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
2ade0 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20  */.  nfsUnlock, 
2adf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae00 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
2ae10 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b  d */.  unixCheck
2ae20 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20  ReservedLock    
2ae30 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
2ae40 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
2ae50 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  /.).#endif..#if 
2ae60 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2ae70 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
2ae80 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2ae90 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66  E./* .** This "f
2aea0 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20  inder" function 
2aeb0 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65  attempts to dete
2aec0 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c  rmine the best l
2aed0 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20  ocking strategy 
2aee0 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61  .** for the data
2aef0 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50  base file "fileP
2af00 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72  ath".  It then r
2af10 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74  eturns the sqlit
2af20 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a  e3_io_methods.**
2af30 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70   object that imp
2af40 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72  lements that str
2af50 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ategy..**.** Thi
2af60 73 20 69 73 20 66 6f 72 20 4d 61 63 4f 53 58 20  s is for MacOSX 
2af70 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  only..*/.static 
2af80 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2af90 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f  _methods *autolo
2afa0 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a  ckIoFinderImpl(.
2afb0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69    const char *fi
2afc0 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61  lePath,    /* na
2afd0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
2afe0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  se file */.  uni
2aff0 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20  xFile *pNew     
2b000 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e 20 66 69        /* open fi
2b010 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68  le object for th
2b020 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2b030 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63  */.){.  static c
2b040 6f 6e 73 74 20 73 74 72 75 63 74 20 4d 61 70 70  onst struct Mapp
2b050 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ing {.    const 
2b060 63 68 61 72 20 2a 7a 46 69 6c 65 73 79 73 74 65  char *zFilesyste
2b070 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
2b080 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d 20 74 79  /* Filesystem ty
2b090 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63  pe name */.    c
2b0a0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
2b0b0 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64  methods *pMethod
2b0c0 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70 72 69  s;   /* Appropri
2b0d0 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  ate locking meth
2b0e0 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d  od */.  } aMap[]
2b0f0 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66 73 22   = {.    { "hfs"
2b100 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74  ,    &posixIoMet
2b110 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75  hods },.    { "u
2b120 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f  fs",    &posixIo
2b130 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
2b140 20 22 61 66 70 66 73 22 2c 20 20 26 61 66 70 49   "afpfs",  &afpI
2b150 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
2b160 7b 20 22 73 6d 62 66 73 22 2c 20 20 26 61 66 70  { "smbfs",  &afp
2b170 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
2b180 20 7b 20 22 77 65 62 64 61 76 22 2c 20 26 6e 6f   { "webdav", &no
2b190 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  lockIoMethods },
2b1a0 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20  .    { 0, 0 }.  
2b1b0 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  };.  int i;.  st
2b1c0 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e  ruct statfs fsIn
2b1d0 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  fo;.  struct flo
2b1e0 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20  ck lockInfo;..  
2b1f0 69 66 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b  if( !filePath ){
2b200 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50  .    /* If fileP
2b210 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  ath==NULL that m
2b220 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c  eans we are deal
2b230 69 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e 73  ing with a trans
2b240 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a  ient file.    **
2b250 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
2b260 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  eed to be locked
2b270 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
2b280 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
2b290 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74  ;.  }.  if( stat
2b2a0 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26 66 73  fs(filePath, &fs
2b2b0 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20  Info) != -1 ){. 
2b2c0 20 20 20 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f     if( fsInfo.f_
2b2d0 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e  flags & MNT_RDON
2b2e0 4c 59 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  LY ){.      retu
2b2f0 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  rn &nolockIoMeth
2b300 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ods;.    }.    f
2b310 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e  or(i=0; aMap[i].
2b320 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b  zFilesystem; i++
2b330 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
2b340 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74  cmp(fsInfo.f_fst
2b350 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d  ypename, aMap[i]
2b360 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30  .zFilesystem)==0
2b370 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
2b380 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68  rn aMap[i].pMeth
2b390 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ods;.      }.   
2b3a0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66   }.  }..  /* Def
2b3b0 61 75 6c 74 20 63 61 73 65 2e 20 48 61 6e 64 6c  ault case. Handl
2b3c0 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65  es, amongst othe
2b3d0 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20  rs, "nfs"..  ** 
2b3e0 54 65 73 74 20 62 79 74 65 2d 72 61 6e 67 65 20  Test byte-range 
2b3f0 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c  lock using fcntl
2b400 28 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20  (). If the call 
2b410 73 75 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20  succeeds, .  ** 
2b420 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
2b430 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70  file-system supp
2b440 6f 72 74 73 20 50 4f 53 49 58 20 73 74 79 6c 65  orts POSIX style
2b450 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20   locks. .  */.  
2b460 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d  lockInfo.l_len =
2b470 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   1;.  lockInfo.l
2b480 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f  _start = 0;.  lo
2b490 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20  ckInfo.l_whence 
2b4a0 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f  = SEEK_SET;.  lo
2b4b0 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20  ckInfo.l_type = 
2b4c0 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f  F_RDLCK;.  if( o
2b4d0 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20  sFcntl(pNew->h, 
2b4e0 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e  F_GETLK, &lockIn
2b4f0 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20  fo)!=-1 ) {.    
2b500 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66  if( strcmp(fsInf
2b510 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
2b520 22 6e 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "nfs")==0 ){.   
2b530 20 20 20 72 65 74 75 72 6e 20 26 6e 66 73 49 6f     return &nfsIo
2b540 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 20 65  Methods;.    } e
2b550 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 65 74 75  lse {.      retu
2b560 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  rn &posixIoMetho
2b570 64 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ds;.    }.  }els
2b580 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 64  e{.    return &d
2b590 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  otlockIoMethods;
2b5a0 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f  .  }.}.static co
2b5b0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2b5c0 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e  ethods .  *(*con
2b5d0 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  st autolockIoFin
2b5e0 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  der)(const char*
2b5f0 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75  ,unixFile*) = au
2b600 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d  tolockIoFinderIm
2b610 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  pl;..#endif /* d
2b620 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2b630 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
2b640 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2b650 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f   */..#if OS_VXWO
2b660 52 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  RKS && SQLITE_EN
2b670 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2b680 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22  LE./* .** This "
2b690 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e  finder" function
2b6a0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74   attempts to det
2b6b0 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20  ermine the best 
2b6c0 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79  locking strategy
2b6d0 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74   .** for the dat
2b6e0 61 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65  abase file "file
2b6f0 50 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20  Path".  It then 
2b700 72 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69  returns the sqli
2b710 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a  te3_io_methods.*
2b720 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d  * object that im
2b730 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74  plements that st
2b740 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rategy..**.** Th
2b750 69 73 20 69 73 20 66 6f 72 20 56 58 57 6f 72 6b  is is for VXWork
2b760 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  s only..*/.stati
2b770 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
2b780 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f  io_methods *auto
2b790 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c  lockIoFinderImpl
2b7a0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
2b7b0 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20  filePath,    /* 
2b7c0 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
2b7d0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75  base file */.  u
2b7e0 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20  nixFile *pNew   
2b7f0 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 6f          /* the o
2b800 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20  pen file object 
2b810 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66  */.){.  struct f
2b820 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a  lock lockInfo;..
2b830 20 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20    if( !filePath 
2b840 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c  ){.    /* If fil
2b850 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74  ePath==NULL that
2b860 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65   means we are de
2b870 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72 61  aling with a tra
2b880 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20  nsient file.    
2b890 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ** that does not
2b8a0 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b   need to be lock
2b8b0 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ed. */.    retur
2b8c0 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  n &nolockIoMetho
2b8d0 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65  ds;.  }..  /* Te
2b8e0 73 74 20 69 66 20 66 63 6e 74 6c 28 29 20 69 73  st if fcntl() is
2b8f0 20 73 75 70 70 6f 72 74 65 64 20 61 6e 64 20 75   supported and u
2b900 73 65 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c  se POSIX style l
2b910 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74 68 65 72  ocks..  ** Other
2b920 77 69 73 65 20 66 61 6c 6c 20 62 61 63 6b 20 74  wise fall back t
2b930 6f 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61  o the named sema
2b940 70 68 6f 72 65 20 6d 65 74 68 6f 64 2e 0a 20 20  phore method..  
2b950 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  */.  lockInfo.l_
2b960 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49  len = 1;.  lockI
2b970 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b  nfo.l_start = 0;
2b980 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68  .  lockInfo.l_wh
2b990 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
2b9a0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79  .  lockInfo.l_ty
2b9b0 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
2b9c0 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77  if( osFcntl(pNew
2b9d0 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  ->h, F_GETLK, &l
2b9e0 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b  ockInfo)!=-1 ) {
2b9f0 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73  .    return &pos
2ba00 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ixIoMethods;.  }
2ba10 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
2ba20 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a   &semIoMethods;.
2ba30 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e    }.}.static con
2ba40 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
2ba50 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73  thods .  *(*cons
2ba60 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  t autolockIoFind
2ba70 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  er)(const char*,
2ba80 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75 74  unixFile*) = aut
2ba90 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70  olockIoFinderImp
2baa0 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53  l;..#endif /* OS
2bab0 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c 49  _VXWORKS && SQLI
2bac0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2bad0 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  G_STYLE */../*.*
2bae0 2a 20 41 6e 20 61 62 73 74 72 61 63 74 20 74 79  * An abstract ty
2baf0 70 65 20 66 6f 72 20 61 20 70 6f 69 6e 74 65 72  pe for a pointer
2bb00 20 74 6f 20 61 20 49 4f 20 6d 65 74 68 6f 64 20   to a IO method 
2bb10 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 3a  finder function:
2bb20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 63 6f 6e 73  .*/.typedef cons
2bb30 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
2bb40 68 6f 64 73 20 2a 28 2a 66 69 6e 64 65 72 5f 74  hods *(*finder_t
2bb50 79 70 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  ype)(const char*
2bb60 2c 75 6e 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f  ,unixFile*);.../
2bb70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bb80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bb90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bbb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
2bbc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bbd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65  ********* sqlite
2bbe0 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a  3_vfs methods **
2bbf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bc00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
2bc10 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63   This division c
2bc20 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c  ontains the impl
2bc30 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65  ementation of me
2bc40 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  thods on the.** 
2bc50 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65  sqlite3_vfs obje
2bc60 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ct..*/../*.** In
2bc70 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e  itialize the con
2bc80 74 65 6e 74 73 20 6f 66 20 74 68 65 20 75 6e 69  tents of the uni
2bc90 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  xFile structure 
2bca0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 49  pointed to by pI
2bcb0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2bcc0 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
2bcd0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2bce0 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 50 6f  pVfs,      /* Po
2bcf0 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a  inter to vfs obj
2bd00 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20  ect */.  int h, 
2bd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65   /* Open file de
2bd30 73 63 72 69 70 74 6f 72 20 6f 66 20 66 69 6c 65  scriptor of file
2bd40 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f   being opened */
2bd50 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 2c 20  .  int syncDir, 
2bd60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2bd70 75 65 20 74 6f 20 73 79 6e 63 20 64 69 72 65 63  ue to sync direc
2bd80 74 6f 72 79 20 6f 6e 20 66 69 72 73 74 20 73 79  tory on first sy
2bd90 6e 63 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  nc */.  sqlite3_
2bda0 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20  file *pId,      
2bdb0 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20  /* Write to the 
2bdc0 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
2bdd0 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
2bde0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
2bdf0 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
2be00 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f  the file being o
2be10 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  pened */.  int n
2be20 6f 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  oLock,          
2be30 20 20 20 2f 2a 20 4f 6d 69 74 20 6c 6f 63 6b 69     /* Omit locki
2be40 6e 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20  ng if true */.  
2be50 69 6e 74 20 69 73 44 65 6c 65 74 65 2c 20 20 20  int isDelete,   
2be60 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
2be70 65 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72  e on close if tr
2be80 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 65  ue */.  int isRe
2be90 61 64 4f 6e 6c 79 20 20 20 20 20 20 20 20 20 20  adOnly          
2bea0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 66  /* True if the f
2beb0 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65  ile is opened re
2bec0 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 29 7b 0a 20 20  ad-only */.){.  
2bed0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2bee0 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69  _methods *pLocki
2bef0 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46  ngStyle;.  unixF
2bf00 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69  ile *pNew = (uni
2bf10 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69  xFile *)pId;.  i
2bf20 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2bf30 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e  K;..  assert( pN
2bf40 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c  ew->pInode==NULL
2bf50 20 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 61 6d 65   );..  /* Parame
2bf60 74 65 72 20 69 73 44 65 6c 65 74 65 20 69 73 20  ter isDelete is 
2bf70 6f 6e 6c 79 20 75 73 65 64 20 6f 6e 20 76 78 77  only used on vxw
2bf80 6f 72 6b 73 2e 20 45 78 70 72 65 73 73 20 74 68  orks. Express th
2bf90 69 73 20 65 78 70 6c 69 63 69 74 6c 79 20 0a 20  is explicitly . 
2bfa0 20 2a 2a 20 68 65 72 65 20 74 6f 20 70 72 65 76   ** here to prev
2bfb0 65 6e 74 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  ent compiler war
2bfc0 6e 69 6e 67 73 20 61 62 6f 75 74 20 75 6e 75 73  nings about unus
2bfd0 65 64 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20  ed parameters.. 
2bfe0 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   */.  UNUSED_PAR
2bff0 41 4d 45 54 45 52 28 69 73 44 65 6c 65 74 65 29  AMETER(isDelete)
2c000 3b 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20  ;..  /* Usually 
2c010 74 68 65 20 70 61 74 68 20 7a 46 69 6c 65 6e 61  the path zFilena
2c020 6d 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  me should not be
2c030 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
2c040 6e 61 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20 65  name. The.  ** e
2c050 78 63 65 70 74 69 6f 6e 20 69 73 20 77 68 65 6e  xception is when
2c060 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 70 72 6f   opening the pro
2c070 78 79 20 22 63 6f 6e 63 68 22 20 66 69 6c 65 20  xy "conch" file 
2c080 69 6e 20 62 75 69 6c 64 73 20 74 68 61 74 0a 20  in builds that. 
2c090 20 2a 2a 20 69 6e 63 6c 75 64 65 20 74 68 65 20   ** include the 
2c0a0 73 70 65 63 69 61 6c 20 41 70 70 6c 65 20 6c 6f  special Apple lo
2c0b0 63 6b 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20 20  cking styles..  
2c0c0 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
2c0d0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
2c0e0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2c0f0 4e 47 5f 53 54 59 4c 45 0a 20 20 61 73 73 65 72  NG_STYLE.  asser
2c100 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  t( zFilename==0 
2c110 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  || zFilename[0]=
2c120 3d 27 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56 66  ='/' .    || pVf
2c130 73 2d 3e 70 41 70 70 44 61 74 61 3d 3d 28 76 6f  s->pAppData==(vo
2c140 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46  id*)&autolockIoF
2c150 69 6e 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a 20  inder );.#else. 
2c160 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
2c170 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61  me==0 || zFilena
2c180 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65  me[0]=='/' );.#e
2c190 6e 64 69 66 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f  ndif..  /* No lo
2c1a0 63 6b 69 6e 67 20 6f 63 63 75 72 73 20 69 6e 20  cking occurs in 
2c1b0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  temporary files 
2c1c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69  */.  assert( zFi
2c1d0 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c 20 6e 6f 4c  lename!=0 || noL
2c1e0 6f 63 6b 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  ock );..  OSTRAC
2c1f0 45 28 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64  E(("OPEN    %-3d
2c200 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65   %s\n", h, zFile
2c210 6e 61 6d 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  name));.  pNew->
2c220 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 7a  h = h;.  pNew->z
2c230 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  Path = zFilename
2c240 3b 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70  ;.  if( memcmp(p
2c250 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78  Vfs->zName,"unix
2c260 2d 65 78 63 6c 22 2c 31 30 29 3d 3d 30 20 29 7b  -excl",10)==0 ){
2c270 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46  .    pNew->ctrlF
2c280 6c 61 67 73 20 3d 20 55 4e 49 58 46 49 4c 45 5f  lags = UNIXFILE_
2c290 45 58 43 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  EXCL;.  }else{. 
2c2a0 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61     pNew->ctrlFla
2c2b0 67 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  gs = 0;.  }.  if
2c2c0 28 20 69 73 52 65 61 64 4f 6e 6c 79 20 29 7b 0a  ( isReadOnly ){.
2c2d0 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c      pNew->ctrlFl
2c2e0 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
2c2f0 52 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  RDONLY;.  }.  if
2c300 28 20 73 79 6e 63 44 69 72 20 29 7b 0a 20 20 20  ( syncDir ){.   
2c310 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73   pNew->ctrlFlags
2c320 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 49 52   |= UNIXFILE_DIR
2c330 53 59 4e 43 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f  SYNC;.  }..#if O
2c340 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77  S_VXWORKS.  pNew
2c350 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72 6b 73 46  ->pId = vxworksF
2c360 69 6e 64 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e  indFileId(zFilen
2c370 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  ame);.  if( pNew
2c380 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pId==0 ){.    
2c390 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20  noLock = 1;.    
2c3a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2c3b0 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  M;.  }.#endif.. 
2c3c0 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 7b 0a 20   if( noLock ){. 
2c3d0 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65     pLockingStyle
2c3e0 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68   = &nolockIoMeth
2c3f0 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ods;.  }else{.  
2c400 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20    pLockingStyle 
2c410 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70  = (**(finder_typ
2c420 65 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61 74  e*)pVfs->pAppDat
2c430 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e  a)(zFilename, pN
2c440 65 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ew);.#if SQLITE_
2c450 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2c460 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63 68  TYLE.    /* Cach
2c470 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74  e zFilename in t
2c480 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
2c490 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74 6c  xt (AFP and dotl
2c4a0 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66 6f  ock override) fo
2c4b0 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f  r.    ** proxyLo
2c4c0 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69 73  ck activation is
2c4d0 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f 74   possible (remot
2c4e0 65 20 70 72 6f 78 79 20 69 73 20 62 61 73 65 64  e proxy is based
2c4f0 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20 20   on db name).   
2c500 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65   ** zFilename re
2c510 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69  mains valid unti
2c520 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64  l file is closed
2c530 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a  , to support */.
2c540 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
2c550 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69 64  gContext = (void
2c560 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e  *)zFilename;.#en
2c570 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  dif.  }..  if( p
2c580 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
2c590 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a  &posixIoMethods.
2c5a0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
2c5b0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
2c5c0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2c5d0 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f  STYLE.    || pLo
2c5e0 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e  ckingStyle == &n
2c5f0 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64  fsIoMethods.#end
2c600 69 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69 78  if.  ){.    unix
2c610 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
2c620 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65    rc = findInode
2c630 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77  Info(pNew, &pNew
2c640 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69  ->pInode);.    i
2c650 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c660 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
2c670 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  an error occured
2c680 20 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66   in findInodeInf
2c690 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66  o(), close the f
2c6a0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20  ile descriptor. 
2c6b0 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74       ** immediat
2c6c0 65 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65  ely, before rele
2c6d0 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e  asing the mutex.
2c6e0 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
2c6f0 20 6d 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20   may fail.      
2c700 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72  ** in two scenar
2c710 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ios:.      **.  
2c720 20 20 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63      **   (a) A c
2c730 61 6c 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66  all to fstat() f
2c740 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20  ailed..      ** 
2c750 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66    (b) A malloc f
2c760 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  ailed..      **.
2c770 20 20 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69        ** Scenari
2c780 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f  o (b) may only o
2c790 63 63 75 72 20 69 66 20 74 68 65 20 70 72 6f 63  ccur if the proc
2c7a0 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e  ess is holding n
2c7b0 6f 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  o other.      **
2c7c0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2c7d0 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  s open on the sa
2c7e0 6d 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  me file. If ther
2c7f0 65 20 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c  e were other fil
2c800 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72  e.      ** descr
2c810 69 70 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66  iptors on this f
2c820 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c  ile, then no mal
2c830 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71  loc would be req
2c840 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a  uired by.      *
2c850 2a 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  * findInodeInfo(
2c860 29 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ). If this is th
2c870 65 20 63 61 73 65 2c 20 69 74 20 69 73 20 71 75  e case, it is qu
2c880 69 74 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73  ite safe to clos
2c890 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c  e.      ** handl
2c8a0 65 20 68 20 2d 20 61 73 20 69 74 20 69 73 20 67  e h - as it is g
2c8b0 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e  uaranteed that n
2c8c0 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69  o posix locks wi
2c8d0 6c 6c 20 62 65 20 72 65 6c 65 61 73 65 64 0a 20  ll be released. 
2c8e0 20 20 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67       ** by doing
2c8f0 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20   so..      **.  
2c900 20 20 20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72      ** If scenar
2c910 69 6f 20 28 61 29 20 63 61 75 73 65 64 20 74 68  io (a) caused th
2c920 65 20 65 72 72 6f 72 20 74 68 65 6e 20 74 68 69  e error then thi
2c930 6e 67 73 20 61 72 65 20 6e 6f 74 20 73 6f 20 73  ngs are not so s
2c940 61 66 65 2e 20 54 68 65 0a 20 20 20 20 20 20 2a  afe. The.      *
2c950 2a 20 69 6d 70 6c 69 63 69 74 20 61 73 73 75 6d  * implicit assum
2c960 70 74 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68  ption here is th
2c970 61 74 20 69 66 20 66 73 74 61 74 28 29 20 66 61  at if fstat() fa
2c980 69 6c 73 2c 20 74 68 69 6e 67 73 20 61 72 65 20  ils, things are 
2c990 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68  in.      ** such
2c9a0 20 62 61 64 20 73 68 61 70 65 20 74 68 61 74 20   bad shape that 
2c9b0 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20  dropping a lock 
2c9c0 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d  or two doesn't m
2c9d0 61 74 74 65 72 20 6d 75 63 68 2e 0a 20 20 20 20  atter much..    
2c9e0 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73    */.      robus
2c9f0 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c  t_close(pNew, h,
2ca00 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
2ca10 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a    h = -1;.    }.
2ca20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
2ca30 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53  ex();.  }..#if S
2ca40 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2ca50 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
2ca60 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2ca70 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63  .  else if( pLoc
2ca80 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61 66  kingStyle == &af
2ca90 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  pIoMethods ){.  
2caa0 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67    /* AFP locking
2cab0 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
2cac0 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
2cad0 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69  to be included i
2cae0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70  n.    ** the afp
2caf0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a  LockingContext..
2cb00 20 20 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f      */.    afpLo
2cb10 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
2cb20 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f  tx;.    pNew->lo
2cb30 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70  ckingContext = p
2cb40 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Ctx = sqlite3_ma
2cb50 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43  lloc( sizeof(*pC
2cb60 74 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  tx) );.    if( p
2cb70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ctx==0 ){.      
2cb80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2cb90 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
2cba0 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65      /* NB: zFile
2cbb0 6e 61 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20  name exists and 
2cbc0 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e  remains valid un
2cbd0 74 69 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20  til the file is 
2cbe0 63 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  closed.      ** 
2cbf0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71  according to req
2cc00 75 69 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e  uirement F11141.
2cc10 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e    So we do not n
2cc20 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20  eed to make a.  
2cc30 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74      ** copy of t
2cc40 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a  he filename. */.
2cc50 20 20 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61        pCtx->dbPa
2cc60 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  th = zFilename;.
2cc70 20 20 20 20 20 20 70 43 74 78 2d 3e 72 65 73 65        pCtx->rese
2cc80 72 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rved = 0;.      
2cc90 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20  srandomdev();.  
2cca0 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
2ccb0 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ex();.      rc =
2ccc0 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70   findInodeInfo(p
2ccd0 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f  New, &pNew->pIno
2cce0 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  de);.      if( r
2ccf0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2cd00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2cd10 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69  free(pNew->locki
2cd20 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  ngContext);.    
2cd30 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
2cd40 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45  (pNew, h, __LINE
2cd50 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 68 20 3d  __);.        h =
2cd60 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
2cd70 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
2cd80 78 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20  x();        .   
2cd90 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
2cda0 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
2cdb0 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c  ngStyle == &dotl
2cdc0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  ockIoMethods ){.
2cdd0 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c      /* Dotfile l
2cde0 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
2cdf0 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
2ce00 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c  needs to be incl
2ce10 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74  uded in.    ** t
2ce20 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  he dotlockLockin
2ce30 67 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f  gContext .    */
2ce40 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  .    char *zLock
2ce50 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46  File;.    int nF
2ce60 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 61 73 73  ilename;.    ass
2ce70 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d  ert( zFilename!=
2ce80 30 20 29 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61  0 );.    nFilena
2ce90 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  me = (int)strlen
2cea0 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b  (zFilename) + 6;
2ceb0 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d  .    zLockFile =
2cec0 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
2ced0 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d  _malloc(nFilenam
2cee0 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63  e);.    if( zLoc
2cef0 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  kFile==0 ){.    
2cf00 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2cf10 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
2cf20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
2cf30 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65  printf(nFilename
2cf40 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73  , zLockFile, "%s
2cf50 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58  " DOTLOCK_SUFFIX
2cf60 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
2cf70 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f    }.    pNew->lo
2cf80 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a  ckingContext = z
2cf90 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23  LockFile;.  }..#
2cfa0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
2cfb0 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
2cfc0 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f  gStyle == &semIo
2cfd0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
2cfe0 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  * Named semaphor
2cff0 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74  e locking uses t
2d000 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20  he file path so 
2d010 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  it needs to be. 
2d020 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69     ** included i
2d030 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67  n the semLocking
2d040 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20  Context.    */. 
2d050 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
2d060 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69  x();.    rc = fi
2d070 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77  ndInodeInfo(pNew
2d080 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29  , &pNew->pInode)
2d090 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53  ;.    if( (rc==S
2d0a0 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e  QLITE_OK) && (pN
2d0b0 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
2d0c0 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20  ==NULL) ){.     
2d0d0 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20   char *zSemName 
2d0e0 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e  = pNew->pInode->
2d0f0 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20  aSemName;.      
2d100 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c  int n;.      sql
2d110 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
2d120 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d  X_PATHNAME, zSem
2d130 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c  Name, "/%s.sem",
2d140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d150 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49          pNew->pI
2d160 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  d->zCanonicalNam
2d170 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 6e  e);.      for( n
2d180 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b  =1; zSemName[n];
2d190 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20 69   n++ ).        i
2d1a0 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d  f( zSemName[n]==
2d1b0 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e  '/' ) zSemName[n
2d1c0 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 70  ] = '_';.      p
2d1d0 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  New->pInode->pSe
2d1e0 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65  m = sem_open(zSe
2d1f0 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20  mName, O_CREAT, 
2d200 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20 20  0666, 1);.      
2d210 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  if( pNew->pInode
2d220 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41  ->pSem == SEM_FA
2d230 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  ILED ){.        
2d240 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2d250 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  M;.        pNew-
2d260 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d  >pInode->aSemNam
2d270 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  e[0] = '\0';.   
2d280 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75     }.    }.    u
2d290 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
2d2a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
2d2b0 20 70 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e 6f   pNew->lastErrno
2d2c0 20 3d 20 30 3b 0a 23 69 66 20 4f 53 5f 56 58 57   = 0;.#if OS_VXW
2d2d0 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53  ORKS.  if( rc!=S
2d2e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d2f0 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73  if( h>=0 ) robus
2d300 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c  t_close(pNew, h,
2d310 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
2d320 68 20 3d 20 2d 31 3b 0a 20 20 20 20 6f 73 55 6e  h = -1;.    osUn
2d330 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  link(zFilename);
2d340 0a 20 20 20 20 69 73 44 65 6c 65 74 65 20 3d 20  .    isDelete = 
2d350 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 69  0;.  }.  pNew->i
2d360 73 44 65 6c 65 74 65 20 3d 20 69 73 44 65 6c 65  sDelete = isDele
2d370 74 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  te;.#endif.  if(
2d380 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d390 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29  {.    if( h>=0 )
2d3a0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
2d3b0 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  ew, h, __LINE__)
2d3c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2d3d0 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70  New->pMethod = p
2d3e0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
2d3f0 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31    OpenCounter(+1
2d400 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2d410 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
2d420 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
2d430 61 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20 77  a directory in w
2d440 68 69 63 68 20 74 6f 20 70 75 74 20 74 65 6d 70  hich to put temp
2d450 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 20  orary files..** 
2d460 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 74  If no suitable t
2d470 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 64 69  emporary file di
2d480 72 65 63 74 6f 72 79 20 63 61 6e 20 62 65 20 66  rectory can be f
2d490 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c  ound, return NUL
2d4a0 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  L..*/.static con
2d4b0 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54 65 6d  st char *unixTem
2d4c0 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29 7b 0a  pFileDir(void){.
2d4d0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
2d4e0 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20  har *azDirs[] = 
2d4f0 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30  {.     0,.     0
2d500 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70  ,.     "/var/tmp
2d510 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d  ",.     "/usr/tm
2d520 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c  p",.     "/tmp",
2d530 0a 20 20 20 20 20 30 20 20 20 20 20 20 20 20 2f  .     0        /
2d540 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f  * List terminato
2d550 72 20 2a 2f 0a 20 20 7d 3b 0a 20 20 75 6e 73 69  r */.  };.  unsi
2d560 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 73 74  gned int i;.  st
2d570 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
2d580 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
2d590 72 20 3d 20 30 3b 0a 0a 20 20 61 7a 44 69 72 73  r = 0;..  azDirs
2d5a0 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74 65  [0] = sqlite3_te
2d5b0 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20  mp_directory;.  
2d5c0 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29  if( !azDirs[1] )
2d5d0 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74   azDirs[1] = get
2d5e0 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20  env("TMPDIR");. 
2d5f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
2d600 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f  of(azDirs)/sizeo
2d610 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44  f(azDirs[0]); zD
2d620 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b  ir=azDirs[i++]){
2d630 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30  .    if( zDir==0
2d640 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2d650 20 69 66 28 20 6f 73 53 74 61 74 28 7a 44 69 72   if( osStat(zDir
2d660 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e  , &buf) ) contin
2d670 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49  ue;.    if( !S_I
2d680 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65  SDIR(buf.st_mode
2d690 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
2d6a0 20 20 69 66 28 20 6f 73 41 63 63 65 73 73 28 7a    if( osAccess(z
2d6b0 44 69 72 2c 20 30 37 29 20 29 20 63 6f 6e 74 69  Dir, 07) ) conti
2d6c0 6e 75 65 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  nue;.    break;.
2d6d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 44 69    }.  return zDi
2d6e0 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  r;.}../*.** Crea
2d6f0 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  te a temporary f
2d700 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66  ile name in zBuf
2d710 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20  .  zBuf must be 
2d720 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20  allocated.** by 
2d730 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
2d740 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20  ess and must be 
2d750 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
2d760 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70  ld at least.** p
2d770 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
2d780 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
2d790 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70   int unixGetTemp
2d7a0 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63  name(int nBuf, c
2d7b0 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74  har *zBuf){.  st
2d7c0 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
2d7d0 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72 73 5b  ned char zChars[
2d7e0 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67  ] =.    "abcdefg
2d7f0 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
2d800 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46  xyz".    "ABCDEF
2d810 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
2d820 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34  WXYZ".    "01234
2d830 35 36 37 38 39 22 3b 0a 20 20 75 6e 73 69 67 6e  56789";.  unsign
2d840 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63  ed int i, j;.  c
2d850 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 3b  onst char *zDir;
2d860 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20  ..  /* It's odd 
2d870 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69  to simulate an i
2d880 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75  o-error here, bu
2d890 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73  t really this is
2d8a0 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67   just.  ** using
2d8b0 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e   the io-error in
2d8c0 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20  frastructure to 
2d8d0 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65  test that SQLite
2d8e0 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20   handles this.  
2d8f0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c  ** function fail
2d900 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d  ing. .  */.  Sim
2d910 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
2d920 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2d930 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20 75  R );..  zDir = u
2d940 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 29  nixTempFileDir()
2d950 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20  ;.  if( zDir==0 
2d960 29 20 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a 20  ) zDir = ".";.. 
2d970 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
2d980 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
2d990 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
2d9a0 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61   for the tempora
2d9b0 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61  ry file .  ** na
2d9c0 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  me. If it is not
2d9d0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
2d9e0 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66  ERROR..  */.  if
2d9f0 28 20 28 73 74 72 6c 65 6e 28 7a 44 69 72 29 20  ( (strlen(zDir) 
2da00 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f  + strlen(SQLITE_
2da10 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
2da20 29 20 2b 20 31 37 29 20 3e 3d 20 28 73 69 7a 65  ) + 17) >= (size
2da30 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 72  _t)nBuf ){.    r
2da40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2da50 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20  OR;.  }..  do{. 
2da60 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2da70 6e 74 66 28 6e 42 75 66 2d 31 37 2c 20 7a 42 75  ntf(nBuf-17, zBu
2da80 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f 54  f, "%s/"SQLITE_T
2da90 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c  EMP_FILE_PREFIX,
2daa0 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20   zDir);.    j = 
2dab0 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75 66  (int)strlen(zBuf
2dac0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
2dad0 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a  andomness(15, &z
2dae0 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72  Buf[j]);.    for
2daf0 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c  (i=0; i<15; i++,
2db00 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75   j++){.      zBu
2db10 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68  f[j] = (char)zCh
2db20 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20  ars[ ((unsigned 
2db30 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73  char)zBuf[j])%(s
2db40 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29  izeof(zChars)-1)
2db50 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42   ];.    }.    zB
2db60 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68  uf[j] = 0;.  }wh
2db70 69 6c 65 28 20 6f 73 41 63 63 65 73 73 28 7a 42  ile( osAccess(zB
2db80 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65  uf,0)==0 );.  re
2db90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2dba0 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  }..#if SQLITE_EN
2dbb0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2dbc0 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
2dbd0 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52  APPLE__)./*.** R
2dbe0 6f 75 74 69 6e 65 20 74 6f 20 74 72 61 6e 73 66  outine to transf
2dbf0 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c 65 20 69  orm a unixFile i
2dc00 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c 6f 63 6b  nto a proxy-lock
2dc10 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a  ing unixFile..**
2dc20 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
2dc30 69 6e 20 74 68 65 20 70 72 6f 78 79 2d 6c 6f 63  in the proxy-loc
2dc40 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62 75 74 20  k division, but 
2dc50 75 73 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e  used by unixOpen
2dc60 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f  ().** if SQLITE_
2dc70 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
2dc80 4b 49 4e 47 20 69 73 20 64 65 66 69 6e 65 64 2e  KING is defined.
2dc90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2dca0 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69  roxyTransformUni
2dcb0 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 2a 2c  xFile(unixFile*,
2dcc0 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 23   const char*);.#
2dcd0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  endif../*.** Sea
2dce0 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65  rch for an unuse
2dcf0 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
2dd00 72 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 65  r that was opene
2dd10 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2dd20 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f 74 20  e .** file (not 
2dd30 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d 61 73  a journal or mas
2dd40 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
2dd50 29 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  ) identified by 
2dd60 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74  pathname.** zPat
2dd70 68 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 50  h with SQLITE_OP
2dd80 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 6d 61 74  EN_XXX flags mat
2dd90 63 68 69 6e 67 20 74 68 6f 73 65 20 70 61 73 73  ching those pass
2dda0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
2ddb0 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  .** argument to 
2ddc0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
2ddd0 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66 69 6c 65  *.** Such a file
2dde0 20 64 65 73 63 72 69 70 74 6f 72 20 6d 61 79 20   descriptor may 
2ddf0 65 78 69 73 74 20 69 66 20 61 20 64 61 74 61 62  exist if a datab
2de00 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  ase connection w
2de10 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 75 74  as closed.** but
2de20 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
2de30 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2de40 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6c 6f  could not be clo
2de50 73 65 64 20 62 65 63 61 75 73 65 20 73 6f 6d 65  sed because some
2de60 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c 65 20 64  .** other file d
2de70 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f  escriptor open o
2de80 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  n the same file 
2de90 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 66 69 6c  is holding a fil
2dea0 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65 72  e-lock..** Refer
2deb0 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20   to comments in 
2dec0 74 68 65 20 75 6e 69 78 43 6c 6f 73 65 28 29 20  the unixClose() 
2ded0 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 74 68 65  function and the
2dee0 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d 65 6e 74   lengthy comment
2def0 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 22  .** describing "
2df00 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c  Posix Advisory L
2df10 6f 63 6b 69 6e 67 22 20 61 74 20 74 68 65 20 73  ocking" at the s
2df20 74 61 72 74 20 6f 66 20 74 68 69 73 20 66 69 6c  tart of this fil
2df30 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72 74 68 65  e for .** furthe
2df40 72 20 64 65 74 61 69 6c 73 2e 20 41 6c 73 6f 2c  r details. Also,
2df50 20 74 69 63 6b 65 74 20 23 34 30 31 38 2e 0a 2a   ticket #4018..*
2df60 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69 74 61 62  *.** If a suitab
2df70 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  le file descript
2df80 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65  or is found, the
2df90 6e 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  n it is returned
2dfa0 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 63 68 20  . If no.** such 
2dfb0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2dfc0 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d 31 20 69  is located, -1 i
2dfd0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
2dfe0 74 61 74 69 63 20 55 6e 69 78 55 6e 75 73 65 64  tatic UnixUnused
2dff0 46 64 20 2a 66 69 6e 64 52 65 75 73 61 62 6c 65  Fd *findReusable
2e000 46 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  Fd(const char *z
2e010 50 61 74 68 2c 20 69 6e 74 20 66 6c 61 67 73 29  Path, int flags)
2e020 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  {.  UnixUnusedFd
2e030 20 2a 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 0a   *pUnused = 0;..
2e040 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 65 61 72    /* Do not sear
2e050 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64  ch for an unused
2e060 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2e070 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 4e 6f 74   on vxworks. Not
2e080 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 76 78   because.  ** vx
2e090 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e 6f 74 20  works would not 
2e0a0 62 65 6e 65 66 69 74 20 66 72 6f 6d 20 74 68 65  benefit from the
2e0b0 20 63 68 61 6e 67 65 20 28 69 74 20 6d 69 67 68   change (it migh
2e0c0 74 2c 20 77 65 27 72 65 20 6e 6f 74 20 73 75 72  t, we're not sur
2e0d0 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20 62 65 63  e),.  ** but bec
2e0e0 61 75 73 65 20 6e 6f 20 77 61 79 20 74 6f 20 74  ause no way to t
2e0f0 65 73 74 20 69 74 20 69 73 20 63 75 72 72 65 6e  est it is curren
2e100 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 2e 20 49  tly available. I
2e110 74 20 69 73 20 62 65 74 74 65 72 20 0a 20 20 2a  t is better .  *
2e120 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b 20 62 72  * not to risk br
2e130 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b 73 20 73  eaking vxworks s
2e140 75 70 70 6f 72 74 20 66 6f 72 20 74 68 65 20 73  upport for the s
2e150 61 6b 65 20 6f 66 20 73 75 63 68 20 61 6e 20 6f  ake of such an o
2e160 62 73 63 75 72 65 20 0a 20 20 2a 2a 20 66 65 61  bscure .  ** fea
2e170 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66 20 21 4f  ture.  */.#if !O
2e180 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
2e190 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
2e1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1b0 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f 66 20 73   /* Results of s
2e1c0 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20  tat() call */.. 
2e1d0 20 2f 2a 20 41 20 73 74 61 74 28 29 20 63 61 6c   /* A stat() cal
2e1e0 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f 72 20 76  l may fail for v
2e1f0 61 72 69 6f 75 73 20 72 65 61 73 6f 6e 73 2e 20  arious reasons. 
2e200 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c  If this happens,
2e210 20 69 74 20 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f   it is.  ** almo
2e220 73 74 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  st certain that 
2e230 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 6f  an open() call o
2e240 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74 68 20  n the same path 
2e250 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69 6c 2e 0a  will also fail..
2e260 20 20 2a 2a 20 46 6f 72 20 74 68 69 73 20 72 65    ** For this re
2e270 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65 72 72 6f  ason, if an erro
2e280 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  r occurs in the 
2e290 73 74 61 74 28 29 20 63 61 6c 6c 20 68 65 72 65  stat() call here
2e2a0 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 67 6e  , it is.  ** ign
2e2b0 6f 72 65 64 20 61 6e 64 20 2d 31 20 69 73 20 72  ored and -1 is r
2e2c0 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c  eturned. The cal
2e2d0 6c 65 72 20 77 69 6c 6c 20 74 72 79 20 74 6f 20  ler will try to 
2e2e0 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 0a  open a new file.
2e2f0 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20    ** descriptor 
2e300 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74 68  on the same path
2e310 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72 65 74 75  , fail, and retu
2e320 72 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 53  rn an error to S
2e330 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  QLite..  **.  **
2e340 20 45 76 65 6e 20 69 66 20 61 20 73 75 62 73 65   Even if a subse
2e350 71 75 65 6e 74 20 6f 70 65 6e 28 29 20 63 61 6c  quent open() cal
2e360 6c 20 64 6f 65 73 20 73 75 63 63 65 65 64 2c 20  l does succeed, 
2e370 74 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 73  the consequences
2e380 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20 73 65 61   of.  ** not sea
2e390 72 63 68 69 6e 67 20 66 6f 72 20 61 20 72 65 73  rching for a res
2e3a0 75 73 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63  usable file desc
2e3b0 72 69 70 74 6f 72 20 61 72 65 20 6e 6f 74 20 64  riptor are not d
2e3c0 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 30  ire.  */.  if( 0
2e3d0 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20  ==osStat(zPath, 
2e3e0 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 75  &sStat) ){.    u
2e3f0 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
2e400 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e 69 78 45  node;..    unixE
2e410 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
2e420 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c   pInode = inodeL
2e430 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ist;.    while( 
2e440 70 49 6e 6f 64 65 20 26 26 20 28 70 49 6e 6f 64  pInode && (pInod
2e450 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21 3d 73  e->fileId.dev!=s
2e460 53 74 61 74 2e 73 74 5f 64 65 76 0a 20 20 20 20  Stat.st_dev.    
2e470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e480 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69 6c 65   || pInode->file
2e490 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74 2e 73 74  Id.ino!=sStat.st
2e4a0 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  _ino) ){.       
2e4b0 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d  pInode = pInode-
2e4c0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
2e4d0 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29 7b 0a    if( pInode ){.
2e4e0 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64        UnixUnused
2e4f0 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20 66  Fd **pp;.      f
2e500 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e 70  or(pp=&pInode->p
2e510 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26 20 28  Unused; *pp && (
2e520 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c 61  *pp)->flags!=fla
2e530 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e  gs; pp=&((*pp)->
2e540 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20 70  pNext));.      p
2e550 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20 20  Unused = *pp;.  
2e560 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20      if( pUnused 
2e570 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20 3d  ){.        *pp =
2e580 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74 3b   pUnused->pNext;
2e590 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2e5a0 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
2e5b0 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  x();.  }.#endif 
2e5c0 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58 57     /* if !OS_VXW
2e5d0 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ORKS */.  return
2e5e0 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a   pUnused;.}../*.
2e5f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2e600 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 75 6e   is called by un
2e610 69 78 4f 70 65 6e 28 29 20 74 6f 20 64 65 74 65  ixOpen() to dete
2e620 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78 20 70  rmine the unix p
2e630 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 74 6f  ermissions.** to
2e640 20 63 72 65 61 74 65 20 6e 65 77 20 66 69 6c 65   create new file
2e650 73 20 77 69 74 68 2e 20 49 66 20 6e 6f 20 65 72  s with. If no er
2e660 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
2e670 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2e680 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 20  turned.** and a 
2e690 76 61 6c 75 65 20 73 75 69 74 61 62 6c 65 20 66  value suitable f
2e6a0 6f 72 20 70 61 73 73 69 6e 67 20 61 73 20 74 68  or passing as th
2e6b0 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
2e6c0 20 74 6f 20 6f 70 65 6e 28 32 29 20 69 73 0a 2a   to open(2) is.*
2e6d0 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 4d  * written to *pM
2e6e0 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ode. If an IO er
2e6f0 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
2e700 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
2e710 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
2e720 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
2e730 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f 74 20  f *pMode is not 
2e740 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
2e750 49 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e  If the file bein
2e760 67 20 6f 70 65 6e 65 64 20 69 73 20 61 20 74 65  g opened is a te
2e770 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 20 69 74  mporary file, it
2e780 20 69 73 20 61 6c 77 61 79 73 20 63 72 65 61 74   is always creat
2e790 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6f  ed with.** the o
2e7a0 63 74 61 6c 20 70 65 72 6d 69 73 73 69 6f 6e 73  ctal permissions
2e7b0 20 30 36 30 30 20 28 72 65 61 64 2f 77 72 69 74   0600 (read/writ
2e7c0 61 62 6c 65 20 62 79 20 6f 77 6e 65 72 20 6f 6e  able by owner on
2e7d0 6c 79 29 2e 20 49 66 20 74 68 65 20 66 69 6c 65  ly). If the file
2e7e0 0a 2a 2a 20 69 73 20 61 20 64 61 74 61 62 61 73  .** is a databas
2e7f0 65 20 6f 72 20 6d 61 73 74 65 72 20 6a 6f 75 72  e or master jour
2e800 6e 61 6c 20 66 69 6c 65 2c 20 69 74 20 69 73 20  nal file, it is 
2e810 63 72 65 61 74 65 64 20 77 69 74 68 20 74 68 65  created with the
2e820 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a   permissions .**
2e830 20 6d 61 73 6b 20 53 51 4c 49 54 45 5f 44 45 46   mask SQLITE_DEF
2e840 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
2e850 53 49 4f 4e 53 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e  SIONS..**.** Fin
2e860 61 6c 6c 79 2c 20 69 66 20 74 68 65 20 66 69 6c  ally, if the fil
2e870 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69  e being opened i
2e880 73 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75 6c  s a WAL or regul
2e890 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ar journal file,
2e8a0 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66   then .** this f
2e8b0 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73 20  unction queries 
2e8c0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
2e8d0 66 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73 69  for the permissi
2e8e0 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63  ons on the .** c
2e8f0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74  orresponding dat
2e900 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 73  abase file and s
2e910 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68  ets *pMode to th
2e920 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65 76  is value. Whenev
2e930 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c  er .** possible,
2e940 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c   WAL and journal
2e950 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74   files are creat
2e960 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ed using the sam
2e970 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a  e permissions .*
2e980 2a 20 61 73 20 74 68 65 20 61 73 73 6f 63 69 61  * as the associa
2e990 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ted database fil
2e9a0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
2e9b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f  SQLITE_ENABLE_8_
2e9c0 33 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69  3_NAMES option i
2e9d0 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20  s enabled, then 
2e9e0 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
2e9f0 66 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e 61 76  filename is unav
2ea00 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 38 5f  ailable.  But 8_
2ea10 33 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20  3_NAMES is only 
2ea20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20  used for.** FAT 
2ea30 66 69 6c 65 73 79 73 74 65 6d 73 20 61 6e 64 20  filesystems and 
2ea40 70 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e  permissions do n
2ea50 6f 74 20 6d 61 74 74 65 72 20 74 68 65 72 65 2c  ot matter there,
2ea60 20 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20   so just use.** 
2ea70 74 68 65 20 64 65 66 61 75 6c 74 20 70 65 72 6d  the default perm
2ea80 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74  issions..*/.stat
2ea90 69 63 20 69 6e 74 20 66 69 6e 64 43 72 65 61 74  ic int findCreat
2eaa0 65 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e  eFileMode(.  con
2eab0 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
2eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ead0 50 61 74 68 20 6f 66 20 66 69 6c 65 20 28 70 6f  Path of file (po
2eae0 73 73 69 62 6c 79 29 20 62 65 69 6e 67 20 63 72  ssibly) being cr
2eaf0 65 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66  eated */.  int f
2eb00 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2eb10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
2eb20 61 67 73 20 70 61 73 73 65 64 20 61 73 20 34 74  ags passed as 4t
2eb30 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f  h argument to xO
2eb40 70 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f  pen() */.  mode_
2eb50 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20 20  t *pMode,       
2eb60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
2eb70 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74  T: Permissions t
2eb80 6f 20 6f 70 65 6e 20 66 69 6c 65 20 77 69 74 68  o open file with
2eb90 20 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55 69   */.  uid_t *pUi
2eba0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
2ebb0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69        /* OUT: ui
2ebc0 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65 20  d to set on the 
2ebd0 66 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20  file */.  gid_t 
2ebe0 2a 70 47 69 64 20 20 20 20 20 20 20 20 20 20 20  *pGid           
2ebf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2ec00 3a 20 67 69 64 20 74 6f 20 73 65 74 20 6f 6e 20  : gid to set on 
2ec10 74 68 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  the file */.){. 
2ec20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2ec30 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
2ec40 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
2ec50 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 53 51  */.  *pMode = SQ
2ec60 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
2ec70 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 3b 0a 20  E_PERMISSIONS;. 
2ec80 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 53 51   if( flags & (SQ
2ec90 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51  LITE_OPEN_WAL|SQ
2eca0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
2ecb0 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63  OURNAL) ){.    c
2ecc0 68 61 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48  har zDb[MAX_PATH
2ecd0 4e 41 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20  NAME+1];     /* 
2ece0 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61  Database file pa
2ecf0 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44  th */.    int nD
2ed00 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
2ed10 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2ed20 72 20 6f 66 20 76 61 6c 69 64 20 62 79 74 65 73  r of valid bytes
2ed30 20 69 6e 20 7a 44 62 20 2a 2f 0a 20 20 20 20 73   in zDb */.    s
2ed40 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
2ed50 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2ed60 4f 75 74 70 75 74 20 6f 66 20 73 74 61 74 28 29  Output of stat()
2ed70 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
2ed80 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61  e */..    /* zPa
2ed90 74 68 20 69 73 20 61 20 70 61 74 68 20 74 6f 20  th is a path to 
2eda0 61 20 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c  a WAL or journal
2edb0 20 66 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f   file. The follo
2edc0 77 69 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69 76  wing block deriv
2edd0 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  es.    ** the pa
2ede0 74 68 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69  th to the associ
2edf0 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69  ated database fi
2ee00 6c 65 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54  le from zPath. T
2ee10 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65  his block handle
2ee20 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c  s.    ** the fol
2ee30 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f  lowing naming co
2ee40 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a  nventions:.    *
2ee50 2a 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74  *.    **   "<pat
2ee60 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c  h to db>-journal
2ee70 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74  ".    **   "<pat
2ee80 68 20 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20  h to db>-wal".  
2ee90 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f    **   "<path to
2eea0 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a   db>-journalNN".
2eeb0 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20      **   "<path 
2eec0 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20  to db>-walNN".  
2eed0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72    **.    ** wher
2eee0 65 20 4e 4e 20 69 73 20 61 20 64 65 63 69 6d 61  e NN is a decima
2eef0 6c 20 6e 75 6d 62 65 72 2e 20 54 68 65 20 4e 4e  l number. The NN
2ef00 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65 73 20   naming schemes 
2ef10 61 72 65 20 0a 20 20 20 20 2a 2a 20 75 73 65 64  are .    ** used
2ef20 20 62 79 20 74 68 65 20 74 65 73 74 5f 6d 75 6c   by the test_mul
2ef30 74 69 70 6c 65 78 2e 63 20 6d 6f 64 75 6c 65 2e  tiplex.c module.
2ef40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 44 62 20  .    */.    nDb 
2ef50 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2ef60 30 28 7a 50 61 74 68 29 20 2d 20 31 3b 20 0a 23  0(zPath) - 1; .#
2ef70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2ef80 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 0a 20 20  BLE_8_3_NAMES.  
2ef90 20 20 77 68 69 6c 65 28 20 6e 44 62 3e 30 20 26    while( nDb>0 &
2efa0 26 20 21 73 71 6c 69 74 65 33 49 73 61 6c 6e 75  & !sqlite3Isalnu
2efb0 6d 28 7a 50 61 74 68 5b 6e 44 62 5d 29 20 29 20  m(zPath[nDb]) ) 
2efc0 6e 44 62 2d 2d 3b 0a 20 20 20 20 69 66 28 20 6e  nDb--;.    if( n
2efd0 44 62 3d 3d 30 20 7c 7c 20 7a 50 61 74 68 5b 6e  Db==0 || zPath[n
2efe0 44 62 5d 21 3d 27 2d 27 20 29 20 72 65 74 75 72  Db]!='-' ) retur
2eff0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c  n SQLITE_OK;.#el
2f000 73 65 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 50  se.    while( zP
2f010 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 7b  ath[nDb]!='-' ){
2f020 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
2f030 44 62 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73  Db>0 );.      as
2f040 73 65 72 74 28 20 7a 50 61 74 68 5b 6e 44 62 5d  sert( zPath[nDb]
2f050 21 3d 27 5c 6e 27 20 29 3b 0a 20 20 20 20 20 20  !='\n' );.      
2f060 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d 0a 23 65 6e  nDb--;.    }.#en
2f070 64 69 66 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  dif.    memcpy(z
2f080 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b  Db, zPath, nDb);
2f090 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20  .    zDb[nDb] = 
2f0a0 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66 28 20 30  '\0';..    if( 0
2f0b0 3d 3d 6f 73 53 74 61 74 28 7a 44 62 2c 20 26 73  ==osStat(zDb, &s
2f0c0 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 2a  Stat) ){.      *
2f0d0 70 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e 73 74  pMode = sStat.st
2f0e0 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a 20 20  _mode & 0777;.  
2f0f0 20 20 20 20 2a 70 55 69 64 20 3d 20 73 53 74 61      *pUid = sSta
2f100 74 2e 73 74 5f 75 69 64 3b 0a 20 20 20 20 20 20  t.st_uid;.      
2f110 2a 70 47 69 64 20 3d 20 73 53 74 61 74 2e 73 74  *pGid = sStat.st
2f120 5f 67 69 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  _gid;.    }else{
2f130 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2f140 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
2f150 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
2f160 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
2f170 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
2f180 4f 53 45 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64  OSE ){.    *pMod
2f190 65 20 3d 20 30 36 30 30 3b 0a 20 20 7d 0a 20 20  e = 0600;.  }.  
2f1a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2f1b0 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c  .** Open the fil
2f1c0 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20  e zPath..** .** 
2f1d0 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20  Previously, the 
2f1e0 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20  SQLite OS layer 
2f1f0 75 73 65 64 20 74 68 72 65 65 20 66 75 6e 63 74  used three funct
2f200 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66  ions in place of
2f210 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a   this.** one:.**
2f220 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
2f230 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 29  sOpenReadWrite()
2f240 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
2f250 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29  OsOpenReadOnly()
2f260 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
2f270 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
2f280 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  );.**.** These c
2f290 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20  alls correspond 
2f2a0 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
2f2b0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
2f2c0 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
2f2d0 20 20 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e    ReadWrite() ->
2f2e0 20 20 20 20 20 28 52 45 41 44 57 52 49 54 45 20       (READWRITE 
2f2f0 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20  | CREATE).**    
2f300 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20   ReadOnly()  -> 
2f310 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a      (READONLY) .
2f320 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75  **     OpenExclu
2f330 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57  sive() -> (READW
2f340 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20  RITE | CREATE | 
2f350 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a  EXCLUSIVE).**.**
2f360 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63   The old OpenExc
2f370 6c 75 73 69 76 65 28 29 20 61 63 63 65 70 74 65  lusive() accepte
2f380 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75  d a boolean argu
2f390 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22  ment - "delFlag"
2f3a0 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68  . If.** true, th
2f3b0 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69  e file was confi
2f3c0 67 75 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f  gured to be auto
2f3d0 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
2f3e0 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69  d when the.** fi
2f3f0 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64  le handle closed
2f400 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74 68 65  . To achieve the
2f410 20 73 61 6d 65 20 65 66 66 65 63 74 20 75 73 69   same effect usi
2f420 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20  ng this new .** 
2f430 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20 74  interface, add t
2f440 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  he DELETEONCLOSE
2f450 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73   flag to those s
2f460 70 65 63 69 66 69 65 64 20 61 62 6f 76 65 20 66  pecified above f
2f470 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75  or .** OpenExclu
2f480 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  sive()..*/.stati
2f490 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a  c int unixOpen(.
2f4a0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
2f4b0 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Vfs,           /
2f4c0 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20 77 68  * The VFS for wh
2f4d0 69 63 68 20 74 68 69 73 20 69 73 20 74 68 65 20  ich this is the 
2f4e0 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a  xOpen method */.
2f4f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
2f500 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ath,           /
2f510 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69  * Pathname of fi
2f520 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  le to be opened 
2f530 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
2f540 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
2f550 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
2f560 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66  scriptor to be f
2f570 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e  illed in */.  in
2f580 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
2f590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2f5a0 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e  put flags to con
2f5b0 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67  trol the opening
2f5c0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46   */.  int *pOutF
2f5d0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
2f5e0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61     /* Output fla
2f5f0 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  gs returned to S
2f600 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b  QLite core */.){
2f610 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d  .  unixFile *p =
2f620 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 46 69   (unixFile *)pFi
2f630 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  le;.  int fd = -
2f640 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
2f650 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
2f660 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64  criptor returned
2f670 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20   by open() */.  
2f680 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20  int openFlags = 
2f690 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2f6a0 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20  * Flags to pass 
2f6b0 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 69 66  to open() */.#if
2f6c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44   SQLITE_ENABLE_D
2f6d0 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20  ATA_PROTECTION. 
2f6e0 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61   int eType = fla
2f6f0 67 73 26 30 78 46 46 30 46 46 46 30 30 3b 20 20  gs&0xFF0FFF00;  
2f700 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20  /* Type of file 
2f710 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6c 73 65  to open */.#else
2f720 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66  .  int eType = f
2f730 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b  lags&0xFFFFFF00;
2f740 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c    /* Type of fil
2f750 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e  e to open */.#en
2f760 64 69 66 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b  dif.  int noLock
2f770 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f780 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
2f790 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69  omit locking pri
2f7a0 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74  mitives */.  int
2f7b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2f7c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2f7d0 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43  unction Return C
2f7e0 6f 64 65 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73  ode */..  int is
2f7f0 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c  Exclusive  = (fl
2f800 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2f810 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20  N_EXCLUSIVE);.  
2f820 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20  int isDelete    
2f830 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
2f840 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
2f850 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73  CLOSE);.  int is
2f860 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c  Create     = (fl
2f870 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2f880 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74  N_CREATE);.  int
2f890 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20   isReadonly   = 
2f8a0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
2f8b0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
2f8c0 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69 74    int isReadWrit
2f8d0 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  e  = (flags & SQ
2f8e0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
2f8f0 49 54 45 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  ITE);.#if SQLITE
2f900 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2f910 53 54 59 4c 45 0a 20 20 69 6e 74 20 69 73 41 75  STYLE.  int isAu
2f920 74 6f 50 72 6f 78 79 20 20 3d 20 28 66 6c 61 67  toProxy  = (flag
2f930 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2f940 41 55 54 4f 50 52 4f 58 59 29 3b 0a 23 65 6e 64  AUTOPROXY);.#end
2f950 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  if.#if defined(_
2f960 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c  _APPLE__) || SQL
2f970 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2f980 4e 47 5f 53 54 59 4c 45 0a 20 20 73 74 72 75 63  NG_STYLE.  struc
2f990 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b  t statfs fsInfo;
2f9a0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
2f9b0 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73 74   creating a mast
2f9c0 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20  er or main-file 
2f9d0 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66 75  journal, this fu
2f9e0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e  nction will open
2f9f0 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73  .  ** a file-des
2fa00 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 64  criptor on the d
2fa10 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68  irectory too. Th
2fa20 65 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e 69  e first time uni
2fa30 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20  xSync().  ** is 
2fa40 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65 63  called the direc
2fa50 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  tory file descri
2fa60 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73 79  ptor will be fsy
2fa70 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73 65  nc()ed and close
2fa80 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  ()d..  */.  int 
2fa90 73 79 6e 63 44 69 72 20 3d 20 28 69 73 43 72 65  syncDir = (isCre
2faa0 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20  ate && (.       
2fab0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2fac0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
2fad0 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
2fae0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
2faf0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  AIN_JOURNAL .   
2fb00 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
2fb10 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29  TE_OPEN_WAL.  ))
2fb20 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d  ;..  /* If argum
2fb30 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e  ent zPath is a N
2fb40 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69  ULL pointer, thi
2fb50 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  s function is re
2fb60 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20  quired to open. 
2fb70 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20   ** a temporary 
2fb80 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62  file. Use this b
2fb90 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74  uffer to store t
2fba0 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e  he file name in.
2fbb0 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d  .  */.  char zTm
2fbc0 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41  pname[MAX_PATHNA
2fbd0 4d 45 2b 31 5d 3b 0a 20 20 63 6f 6e 73 74 20 63  ME+1];.  const c
2fbe0 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61  har *zName = zPa
2fbf0 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  th;..  /* Check 
2fc00 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
2fc10 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75  atements are tru
2fc20 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  e: .  **.  **   
2fc30 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20  (a) Exactly one 
2fc40 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45  of the READWRITE
2fc50 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c   and READONLY fl
2fc60 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c  ags must be set,
2fc70 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29   and .  **   (b)
2fc80 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65   if CREATE is se
2fc90 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54  t, then READWRIT
2fca0 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
2fcb0 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28  et, and.  **   (
2fcc0 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20  c) if EXCLUSIVE 
2fcd0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
2fce0 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
2fcf0 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29   set..  **   (d)
2fd00 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53   if DELETEONCLOS
2fd10 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
2fd20 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
2fd30 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  be set..  */.  a
2fd40 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c  ssert((isReadonl
2fd50 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  y==0 || isReadWr
2fd60 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65  ite==0) && (isRe
2fd70 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61  adWrite || isRea
2fd80 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72  donly));.  asser
2fd90 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c  t(isCreate==0 ||
2fda0 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20   isReadWrite);. 
2fdb0 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73   assert(isExclus
2fdc0 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ive==0 || isCrea
2fdd0 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
2fde0 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43  Delete==0 || isC
2fdf0 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  reate);..  /* Th
2fe00 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20  e main DB, main 
2fe10 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c  journal, WAL fil
2fe20 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75  e and master jou
2fe30 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a  rnal are never .
2fe40 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
2fe50 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20  ly deleted. Nor 
2fe60 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65  are they ever te
2fe70 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20  mporary files.  
2fe80 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  */.  assert( (!i
2fe90 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
2fea0 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
2feb0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
2fec0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
2fed0 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
2fee0 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
2fef0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2ff00 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
2ff10 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
2ff20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
2ff30 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
2ff40 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  TER_JOURNAL );. 
2ff50 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
2ff60 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
2ff70 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
2ff80 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a  PEN_WAL );..  /*
2ff90 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
2ffa0 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73   upper layer has
2ffb0 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20   set one of the 
2ffc0 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67  "file-type" flag
2ffd0 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  s. */.  assert( 
2ffe0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2fff0 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20  EN_MAIN_DB      
30000 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
30010 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20  _OPEN_TEMP_DB . 
30020 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
30030 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
30040 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70  _JOURNAL || eTyp
30050 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
30060 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  EMP_JOURNAL .   
30070 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
30080 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
30090 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d  RNAL   || eType=
300a0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
300b0 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
300c0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
300d0 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
300e0 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d  ENT_DB || eType=
300f0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
30100 0a 20 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  .  );..  memset(
30110 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  p, 0, sizeof(uni
30120 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20  xFile));..  if( 
30130 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
30140 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20  EN_MAIN_DB ){.  
30150 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
30160 70 55 6e 75 73 65 64 3b 0a 20 20 20 20 70 55 6e  pUnused;.    pUn
30170 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61  used = findReusa
30180 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c 61  bleFd(zName, fla
30190 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e  gs);.    if( pUn
301a0 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 66 64  used ){.      fd
301b0 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a   = pUnused->fd;.
301c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
301d0 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74   pUnused = sqlit
301e0 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
301f0 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20  (*pUnused));.   
30200 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64 20     if( !pUnused 
30210 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
30220 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
30230 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
30240 20 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70    p->pUnused = p
30250 55 6e 75 73 65 64 3b 0a 20 20 7d 65 6c 73 65 20  Unused;.  }else 
30260 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20  if( !zName ){.  
30270 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73    /* If zName is
30280 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72   NULL, the upper
30290 20 6c 61 79 65 72 20 69 73 20 72 65 71 75 65 73   layer is reques
302a0 74 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65  ting a temp file
302b0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
302c0 69 73 44 65 6c 65 74 65 20 26 26 20 21 73 79 6e  isDelete && !syn
302d0 63 44 69 72 29 3b 0a 20 20 20 20 72 63 20 3d 20  cDir);.    rc = 
302e0 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28  unixGetTempname(
302f0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 2c 20  MAX_PATHNAME+1, 
30300 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69  zTmpname);.    i
30310 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
30320 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
30330 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   rc;.    }.    z
30340 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b  Name = zTmpname;
30350 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72  .  }..  /* Deter
30360 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20 6f  mine the value o
30370 66 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  f the flags para
30380 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20  meter passed to 
30390 50 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20  POSIX function. 
303a0 20 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65 73   ** open(). Thes
303b0 65 20 6d 75 73 74 20 62 65 20 63 61 6c 63 75 6c  e must be calcul
303c0 61 74 65 64 20 65 76 65 6e 20 69 66 20 6f 70 65  ated even if ope
303d0 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  n() is not calle
303e0 64 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65 79 20  d, as.  ** they 
303f0 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73  may be stored as
30400 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c   part of the fil
30410 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 75 73 65  e handle and use
30420 64 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 27  d by the .  ** '
30430 63 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b  conch file' lock
30440 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61  ing functions la
30450 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66  ter on.  */.  if
30460 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20  ( isReadonly )  
30470 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52  openFlags |= O_R
30480 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52  DONLY;.  if( isR
30490 65 61 64 57 72 69 74 65 20 29 20 6f 70 65 6e 46  eadWrite ) openF
304a0 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a  lags |= O_RDWR;.
304b0 20 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29    if( isCreate )
304c0 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d      openFlags |=
304d0 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28 20   O_CREAT;.  if( 
304e0 69 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f 70  isExclusive ) op
304f0 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58  enFlags |= (O_EX
30500 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a  CL|O_NOFOLLOW);.
30510 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28    openFlags |= (
30520 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49  O_LARGEFILE|O_BI
30530 4e 41 52 59 29 3b 0a 0a 23 69 66 20 53 51 4c 49  NARY);..#if SQLI
30540 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50  TE_ENABLE_DATA_P
30550 52 4f 54 45 43 54 49 4f 4e 0a 20 20 70 2d 3e 70  ROTECTION.  p->p
30560 72 6f 74 46 6c 61 67 73 20 3d 20 28 66 6c 61 67  rotFlags = (flag
30570 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
30580 46 49 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d  FILEPROTECTION_M
30590 41 53 4b 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ASK);.#endif.   
305a0 20 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a   .  if( fd<0 ){.
305b0 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d      mode_t openM
305c0 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
305d0 20 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73    /* Permissions
305e0 20 74 6f 20 63 72 65 61 74 65 20 66 69 6c 65 20   to create file 
305f0 77 69 74 68 20 2a 2f 0a 20 20 20 20 75 69 64 5f  with */.    uid_
30600 74 20 75 69 64 3b 0a 20 20 20 20 67 69 64 5f 74  t uid;.    gid_t
30610 20 67 69 64 3b 0a 20 20 20 20 72 63 20 3d 20 66   gid;.    rc = f
30620 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64  indCreateFileMod
30630 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20  e(zName, flags, 
30640 26 6f 70 65 6e 4d 6f 64 65 2c 20 26 75 69 64 2c  &openMode, &uid,
30650 20 26 67 69 64 29 3b 0a 20 20 20 20 69 66 28 20   &gid);.    if( 
30660 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30670 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
30680 70 2d 3e 70 55 6e 75 73 65 64 20 29 3b 0a 20 20  p->pUnused );.  
30690 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
306a0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
306b0 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  AL || eType==SQL
306c0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
306d0 55 52 4e 41 4c 20 29 3b 0a 20 20 20 20 20 20 72  URNAL );.      r
306e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
306f0 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
30700 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e  open(zName, open
30710 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29  Flags, openMode)
30720 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
30730 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25 73 20  OPENX   %-3d %s 
30740 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d  0%o\n", fd, zNam
30750 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a  e, openFlags));.
30760 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20      if( fd<0 && 
30770 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26  errno!=EISDIR &&
30780 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20   isReadWrite && 
30790 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a  !isExclusive ){.
307a0 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 65 64 20        /* Failed 
307b0 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65  to open the file
307c0 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
307d0 61 63 63 65 73 73 2e 20 54 72 79 20 72 65 61 64  access. Try read
307e0 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20  -only. */.      
307f0 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54  flags &= ~(SQLIT
30800 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
30810 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
30820 41 54 45 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e  ATE);.      open
30830 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57  Flags &= ~(O_RDW
30840 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20 20  R|O_CREAT);.    
30850 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
30860 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
30870 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  .      openFlags
30880 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20   |= O_RDONLY;.  
30890 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d      isReadonly =
308a0 20 31 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 72   1;.      fd = r
308b0 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65  obust_open(zName
308c0 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65  , openFlags, ope
308d0 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nMode);.    }.  
308e0 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
308f0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
30900 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
30910 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
30920 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n", zName);.    
30930 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
30940 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  shed;.    }.    
30950 2f 2a 20 69 66 20 77 65 27 72 65 20 6f 70 65 6e  /* if we're open
30960 69 6e 67 20 74 68 65 20 77 61 6c 20 6f 72 20 6a  ing the wal or j
30970 6f 75 72 6e 61 6c 20 61 6e 64 20 72 75 6e 6e 69  ournal and runni
30980 6e 67 20 61 73 20 72 6f 6f 74 2c 20 73 65 74 20  ng as root, set 
30990 74 68 65 20 6a 6f 75 72 6e 61 6c 20 75 69 64 2f  the journal uid/
309a0 67 69 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  gid */.    if( !
309b0 69 73 52 65 61 64 6f 6e 6c 79 20 26 26 20 28 66  isReadonly && (f
309c0 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f  lags & (SQLITE_O
309d0 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f  PEN_WAL|SQLITE_O
309e0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
309f0 29 29 20 29 7b 0a 20 20 20 20 20 20 75 69 64 5f  )) ){.      uid_
30a00 74 20 65 75 69 64 20 3d 20 67 65 74 65 75 69 64  t euid = geteuid
30a10 28 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 75  ();.      if( eu
30a20 69 64 3d 3d 30 20 26 26 20 28 65 75 69 64 21 3d  id==0 && (euid!=
30a30 75 69 64 20 7c 7c 20 67 65 74 65 67 69 64 28 29  uid || getegid()
30a40 21 3d 67 69 64 29 20 29 7b 0a 20 20 20 20 20 20  !=gid) ){.      
30a50 20 20 69 66 28 20 66 63 68 6f 77 6e 28 66 64 2c    if( fchown(fd,
30a60 20 75 69 64 2c 20 67 69 64 29 20 29 7b 0a 20 20   uid, gid) ){.  
30a70 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
30a80 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
30a90 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  T;.          got
30aa0 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b  o open_finished;
30ab0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30ac0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61   }.    }.  }.  a
30ad0 73 73 65 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a  ssert( fd>=0 );.
30ae0 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20    if( pOutFlags 
30af0 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  ){.    *pOutFlag
30b00 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a  s = flags;.  }..
30b10 20 20 69 66 28 20 70 2d 3e 70 55 6e 75 73 65 64    if( p->pUnused
30b20 20 29 7b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73   ){.    p->pUnus
30b30 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20  ed->fd = fd;.   
30b40 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 6c 61   p->pUnused->fla
30b50 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a  gs = flags;.  }.
30b60 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20  .  if( isDelete 
30b70 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ){.#if OS_VXWORK
30b80 53 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e  S.    zPath = zN
30b90 61 6d 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6f  ame;.#else.    o
30ba0 73 55 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a  sUnlink(zName);.
30bb0 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 20 53  #endif.  }.#if S
30bc0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
30bd0 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65 6c 73  KING_STYLE.  els
30be0 65 7b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 46 6c  e{.    p->openFl
30bf0 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b  ags = openFlags;
30c00 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
30c10 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20  def FD_CLOEXEC. 
30c20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 53   osFcntl(fd, F_S
30c30 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28 66 64  ETFD, osFcntl(fd
30c40 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20  , F_GETFD, 0) | 
30c50 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e  FD_CLOEXEC);.#en
30c60 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20  dif..  noLock = 
30c70 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
30c80 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a  EN_MAIN_DB;..  .
30c90 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
30ca0 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45  PLE__) || SQLITE
30cb0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
30cc0 53 54 59 4c 45 0a 20 20 69 66 28 20 66 73 74 61  STYLE.  if( fsta
30cd0 74 66 73 28 66 64 2c 20 26 66 73 49 6e 66 6f 29  tfs(fd, &fsInfo)
30ce0 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 28 28   == -1 ){.    ((
30cf0 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29  unixFile*)pFile)
30d00 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
30d10 72 6e 6f 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f  rno;.    robust_
30d20 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c  close(p, fd, __L
30d30 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 65 74 75  INE__);.    retu
30d40 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
30d50 41 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66  ACCESS;.  }.  if
30d60 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22   (0 == strncmp("
30d70 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66  msdos", fsInfo.f
30d80 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29  _fstypename, 5))
30d90 20 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c   {.    ((unixFil
30da0 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61  e*)pFile)->fsFla
30db0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46  gs |= SQLITE_FSF
30dc0 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20  LAGS_IS_MSDOS;. 
30dd0 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74   }.  if (0 == st
30de0 72 6e 63 6d 70 28 22 65 78 66 61 74 22 2c 20 66  rncmp("exfat", f
30df0 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
30e00 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28  me, 5)) {.    ((
30e10 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29  unixFile*)pFile)
30e20 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c  ->fsFlags |= SQL
30e30 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d  ITE_FSFLAGS_IS_M
30e40 53 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  SDOS;.  }.#endif
30e50 0a 20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .  .#if SQLITE_E
30e60 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
30e70 59 4c 45 0a 23 69 66 20 53 51 4c 49 54 45 5f 50  YLE.#if SQLITE_P
30e80 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b  REFER_PROXY_LOCK
30e90 49 4e 47 0a 20 20 69 73 41 75 74 6f 50 72 6f 78  ING.  isAutoProx
30ea0 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20  y = 1;.#endif.  
30eb0 69 66 28 20 69 73 41 75 74 6f 50 72 6f 78 79 20  if( isAutoProxy 
30ec0 26 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29  && (zPath!=NULL)
30ed0 20 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26   && (!noLock) &&
30ee0 20 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a   pVfs->xOpen ){.
30ef0 20 20 20 20 63 68 61 72 20 2a 65 6e 76 66 6f 72      char *envfor
30f00 63 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c  ce = getenv("SQL
30f10 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
30f20 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69  LOCKING");.    i
30f30 6e 74 20 75 73 65 50 72 6f 78 79 20 3d 20 30 3b  nt useProxy = 0;
30f40 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ..    /* SQLITE_
30f50 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
30f60 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72  ING==1 means for
30f70 63 65 20 61 6c 77 61 79 73 20 75 73 65 20 70 72  ce always use pr
30f80 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20  oxy, 0 means .  
30f90 20 20 2a 2a 20 6e 65 76 65 72 20 75 73 65 20 70    ** never use p
30fa0 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73  roxy, NULL means
30fb0 20 75 73 65 20 70 72 6f 78 79 20 66 6f 72 20 6e   use proxy for n
30fc0 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f  on-local files o
30fd0 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  nly.  */.    if(
30fe0 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20   envforce!=NULL 
30ff0 29 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78  ){.      useProx
31000 79 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72 63  y = atoi(envforc
31010 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e)>0;.    }else{
31020 0a 20 20 20 20 20 20 69 66 28 20 73 74 61 74 66  .      if( statf
31030 73 28 7a 50 61 74 68 2c 20 26 66 73 49 6e 66 6f  s(zPath, &fsInfo
31040 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20  ) == -1 ){.     
31050 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c     /* In theory,
31060 20 74 68 65 20 63 6c 6f 73 65 28 66 64 29 20 63   the close(fd) c
31070 61 6c 6c 20 69 73 20 73 75 62 2d 6f 70 74 69 6d  all is sub-optim
31080 61 6c 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20  al. If the file 
31090 6f 70 65 6e 65 64 0a 20 20 20 20 20 20 20 20 2a  opened.        *
310a0 2a 20 77 69 74 68 20 66 64 20 69 73 20 61 20 64  * with fd is a d
310b0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e  atabase file, an
310c0 64 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  d there are othe
310d0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 70  r connections op
310e0 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  en.        ** on
310f0 20 74 68 61 74 20 66 69 6c 65 20 74 68 61 74 20   that file that 
31100 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 68 6f  are currently ho
31110 6c 64 69 6e 67 20 61 64 76 69 73 6f 72 79 20 6c  lding advisory l
31120 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a 20 20 20 20  ocks on it,.    
31130 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
31140 63 61 6c 6c 20 74 6f 20 63 6c 6f 73 65 28 29 20  call to close() 
31150 77 69 6c 6c 20 63 61 6e 63 65 6c 20 74 68 6f 73  will cancel thos
31160 65 20 6c 6f 63 6b 73 2e 20 49 6e 20 70 72 61 63  e locks. In prac
31170 74 69 63 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  tice,.        **
31180 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20   we're assuming 
31190 74 68 61 74 20 73 74 61 74 66 73 28 29 20 64 6f  that statfs() do
311a0 65 73 6e 27 74 20 66 61 69 6c 20 76 65 72 79 20  esn't fail very 
311b0 6f 66 74 65 6e 2e 20 41 74 20 6c 65 61 73 74 0a  often. At least.
311c0 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 77          ** not w
311d0 68 69 6c 65 20 6f 74 68 65 72 20 66 69 6c 65 20  hile other file 
311e0 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e  descriptors open
311f0 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 20 70  ed by the same p
31200 72 6f 63 65 73 73 20 6f 6e 0a 20 20 20 20 20 20  rocess on.      
31210 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 66 69    ** the same fi
31220 6c 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 2e 20  le are working. 
31230 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c   */.        p->l
31240 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
31250 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73 74  ;.        robust
31260 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f  _close(p, fd, __
31270 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20  LINE__);.       
31280 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
31290 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20 20 20  RR_ACCESS;.     
312a0 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e     goto open_fin
312b0 69 73 68 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ished;.      }. 
312c0 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20       useProxy = 
312d0 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73  !(fsInfo.f_flags
312e0 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20  &MNT_LOCAL);.   
312f0 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65 50 72   }.    if( usePr
31300 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  oxy ){.      rc 
31310 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  = fillInUnixFile
31320 28 70 56 66 73 2c 20 66 64 2c 20 73 79 6e 63 44  (pVfs, fd, syncD
31330 69 72 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68  ir, pFile, zPath
31340 2c 20 6e 6f 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  , noLock,.      
31350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31360 20 20 20 20 69 73 44 65 6c 65 74 65 2c 20 69 73      isDelete, is
31370 52 65 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20 20  Readonly);.     
31380 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31390 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
313a0 20 63 61 63 68 65 20 74 68 65 20 70 4d 65 74 68   cache the pMeth
313b0 6f 64 20 69 6e 20 63 61 73 65 20 74 68 65 20 74  od in case the t
313c0 72 61 6e 73 66 6f 72 6d 20 66 61 69 6c 73 20 2a  ransform fails *
313d0 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  /.        const 
313e0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
313f0 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68  o_methods *pMeth
31400 6f 64 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74  od = pFile->pMet
31410 68 6f 64 73 3b 0a 20 20 20 20 20 20 20 20 72 63  hods;.        rc
31420 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72   = proxyTransfor
31430 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 78 46  mUnixFile((unixF
31440 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75  ile*)pFile, ":au
31450 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 69  to:");.        i
31460 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31470 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
31480 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65 20 74   Use unixClose t
31490 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72  o clean up the r
314a0 65 73 6f 75 72 63 65 73 20 61 64 64 65 64 20 69  esources added i
314b0 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  n fillInUnixFile
314c0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
314d0 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74 68 65  nd clear all the
314e0 20 73 74 72 75 63 74 75 72 65 27 73 20 72 65 66   structure's ref
314f0 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63 69 66  erences.  Specif
31500 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20  ically, .       
31510 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65     ** pFile->pMe
31520 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e 55  thods will be NU
31530 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f 73 43  LL so sqlite3OsC
31540 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61 20 6e  lose will be a n
31550 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20 20 20  o-op .          
31560 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
31570 20 70 4d 65 74 68 6f 64 21 3d 4e 55 4c 4c 20 29   pMethod!=NULL )
31580 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d  {.            pM
31590 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 70 46  ethod->xClose(pF
315a0 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ile);.          
315b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
315c0 20 20 20 75 6e 69 78 43 6c 6f 73 65 28 70 46 69     unixClose(pFi
315d0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  le);.          }
315e0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
315f0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
31600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
31610 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64  to open_finished
31620 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
31630 69 66 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c  if.  .  rc = fil
31640 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73  lInUnixFile(pVfs
31650 2c 20 66 64 2c 20 73 79 6e 63 44 69 72 2c 20 70  , fd, syncDir, p
31660 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c  File, zPath, noL
31670 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
31680 20 20 20 20 20 20 20 20 20 20 20 69 73 44 65 6c             isDel
31690 65 74 65 2c 20 69 73 52 65 61 64 6f 6e 6c 79 29  ete, isReadonly)
316a0 3b 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a  ;.open_finished:
316b0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
316c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
316d0 74 65 33 5f 66 72 65 65 28 70 2d 3e 70 55 6e 75  te3_free(p->pUnu
316e0 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  sed);.  }.  retu
316f0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
31700 20 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   Delete the file
31710 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74 68   at zPath. If th
31720 65 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d 65  e dirSync argume
31730 6e 74 20 69 73 20 74 72 75 65 2c 20 66 73 79 6e  nt is true, fsyn
31740 63 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65 63  c().** the direc
31750 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74  tory after delet
31760 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f  ing the file..*/
31770 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
31780 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65  Delete(.  sqlite
31790 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
317a0 20 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61      /* VFS conta
317b0 69 6e 69 6e 67 20 74 68 69 73 20 61 73 20 74 68  ining this as th
317c0 65 20 78 44 65 6c 65 74 65 20 6d 65 74 68 6f 64  e xDelete method
317d0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
317e0 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
317f0 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
31800 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f  to be deleted */
31810 0a 20 20 69 6e 74 20 64 69 72 53 79 6e 63 20 20  .  int dirSync  
31820 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31830 49 66 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29  If true, fsync()
31840 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72   directory after
31850 20 64 65 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a   deleting file *
31860 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
31870 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55  SQLITE_OK;.  UNU
31880 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
31890 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61  tUsed);.  Simula
318a0 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
318b0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
318c0 4c 45 54 45 29 3b 0a 20 20 69 66 28 20 6f 73 55  LETE);.  if( osU
318d0 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d 28 2d  nlink(zPath)==(-
318e0 31 29 20 26 26 20 65 72 72 6e 6f 21 3d 45 4e 4f  1) && errno!=ENO
318f0 45 4e 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ENT ){.    retur
31900 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  n unixLogError(S
31910 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
31920 54 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c 20 7a 50  TE, "unlink", zP
31930 61 74 68 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  ath);.  }.#ifnde
31940 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
31950 5f 44 49 52 53 59 4e 43 0a 20 20 69 66 28 20 64  _DIRSYNC.  if( d
31960 69 72 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 6e  irSync ){.    in
31970 74 20 66 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f  t fd;.    rc = o
31980 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a  sOpenDirectory(z
31990 50 61 74 68 2c 20 26 66 64 29 3b 0a 20 20 20 20  Path, &fd);.    
319a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
319b0 4b 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  K ){.#if OS_VXWO
319c0 52 4b 53 0a 20 20 20 20 20 20 69 66 28 20 66 73  RKS.      if( fs
319d0 79 6e 63 28 66 64 29 3d 3d 2d 31 20 29 0a 23 65  ync(fd)==-1 ).#e
319e0 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 66 73  lse.      if( fs
319f0 79 6e 63 28 66 64 29 20 29 0a 23 65 6e 64 69 66  ync(fd) ).#endif
31a00 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
31a10 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
31a20 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
31a30 44 49 52 5f 46 53 59 4e 43 2c 20 22 66 73 79 6e  DIR_FSYNC, "fsyn
31a40 63 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20  c", zPath);.    
31a50 20 20 7d 0a 23 69 66 20 4f 53 43 4c 4f 53 45 5f    }.#if OSCLOSE_
31a60 43 48 45 43 4b 5f 43 4c 4f 53 45 5f 49 4f 45 52  CHECK_CLOSE_IOER
31a70 52 0a 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73  R.      if( clos
31a80 65 28 66 64 29 26 26 21 72 63 20 29 7b 0a 20 20  e(fd)&&!rc ){.  
31a90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
31aa0 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53  E_IOERR_DIR_CLOS
31ab0 45 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73 65  E;.      }.#else
31ac0 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
31ad0 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e  ose(0, fd, __LIN
31ae0 45 5f 5f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  E__);.#endif.   
31af0 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
31b00 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29  QLITE_CANTOPEN )
31b10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
31b20 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
31b30 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
31b40 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
31b50 65 73 74 20 74 68 65 20 65 78 69 73 74 61 6e 63  est the existanc
31b60 65 20 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70  e of or access p
31b70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69  ermissions of fi
31b80 6c 65 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a  le zPath. The.**
31b90 20 74 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20   test performed 
31ba0 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76  depends on the v
31bb0 61 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a  alue of flags:.*
31bc0 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  *.**     SQLITE_
31bd0 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52  ACCESS_EXISTS: R
31be0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66  eturn 1 if the f
31bf0 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20  ile exists.**   
31c00 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f    SQLITE_ACCESS_
31c10 52 45 41 44 57 52 49 54 45 3a 20 52 65 74 75 72  READWRITE: Retur
31c20 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  n 1 if the file 
31c30 69 73 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  is read and writ
31c40 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c  able..**     SQL
31c50 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f  ITE_ACCESS_READO
31c60 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66  NLY: Return 1 if
31c70 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61   the file is rea
31c80 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  dable..**.** Oth
31c90 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e  erwise return 0.
31ca0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
31cb0 6e 69 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c  nixAccess(.  sql
31cc0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
31cd0 64 2c 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20  d,   /* The VFS 
31ce0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
31cf0 78 41 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a  xAccess method *
31d00 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
31d10 7a 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50  zPath,      /* P
31d20 61 74 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ath of the file 
31d30 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20  to examine */.  
31d40 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
31d50 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
31d60 64 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65  do we want to le
31d70 61 72 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50  arn about the zP
31d80 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69  ath file? */.  i
31d90 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20  nt *pResOut     
31da0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
31db0 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68  result boolean h
31dc0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
31dd0 61 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55  amode = 0;.  UNU
31de0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
31df0 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61  tUsed);.  Simula
31e00 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
31e10 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
31e20 43 43 45 53 53 3b 20 29 3b 0a 20 20 73 77 69 74  CCESS; );.  swit
31e30 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20  ch( flags ){.   
31e40 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
31e50 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20  ESS_EXISTS:.    
31e60 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a    amode = F_OK;.
31e70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
31e80 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
31e90 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20  ESS_READWRITE:. 
31ea0 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f       amode = W_O
31eb0 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72  K|R_OK;.      br
31ec0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
31ed0 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
31ee0 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20  :.      amode = 
31ef0 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61  R_OK;.      brea
31f00 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  k;..    default:
31f10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22  .      assert(!"
31f20 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72  Invalid flags ar
31f30 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20  gument");.  }.  
31f40 2a 70 52 65 73 4f 75 74 20 3d 20 28 6f 73 41 63  *pResOut = (osAc
31f50 63 65 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f 64  cess(zPath, amod
31f60 65 29 3d 3d 30 29 3b 0a 20 20 69 66 28 20 66 6c  e)==0);.  if( fl
31f70 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45  ags==SQLITE_ACCE
31f80 53 53 5f 45 58 49 53 54 53 20 26 26 20 2a 70 52  SS_EXISTS && *pR
31f90 65 73 4f 75 74 20 29 7b 0a 20 20 20 20 73 74 72  esOut ){.    str
31fa0 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
31fb0 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28    if( 0==osStat(
31fc0 7a 50 61 74 68 2c 20 26 62 75 66 29 20 26 26 20  zPath, &buf) && 
31fd0 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 29  buf.st_size==0 )
31fe0 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 4f 75 74  {.      *pResOut
31ff0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
32000 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32010 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75  OK;.}.../*.** Tu
32020 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  rn a relative pa
32030 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75  thname into a fu
32040 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65  ll pathname. The
32050 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a   relative path.*
32060 2a 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 61  * is stored as a
32070 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
32080 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75  string in the bu
32090 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
320a0 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a  by.** zPath. .**
320b0 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20  .** zOut points 
320c0 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61  to a buffer of a
320d0 74 20 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f  t least sqlite3_
320e0 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62  vfs.mxPathname b
320f0 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69  ytes .** (in thi
32100 73 20 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48  s case, MAX_PATH
32110 4e 41 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65  NAME bytes). The
32120 20 66 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72   full-path is wr
32130 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73  itten to.** this
32140 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 72   buffer before r
32150 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
32160 74 69 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c  tic int unixFull
32170 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69  Pathname(.  sqli
32180 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
32190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
321a0 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65  nter to vfs obje
321b0 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
321c0 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
321d0 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
321e0 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74  y relative input
321f0 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e   path */.  int n
32200 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Out,            
32210 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
32220 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65   of output buffe
32230 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  r in bytes */.  
32240 63 68 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20  char *zOut      
32250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32260 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   Output buffer *
32270 2f 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74 27 73 20  /.){..  /* It's 
32280 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
32290 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
322a0 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
322b0 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
322c0 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
322d0 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
322e0 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
322f0 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
32300 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
32310 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75  failing. This fu
32320 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69  nction could fai
32330 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c  l if, for exampl
32340 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  e, the.  ** curr
32350 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65  ent working dire
32360 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75  ctory has been u
32370 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20  nlinked..  */.  
32380 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
32390 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
323a0 52 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65 72  RROR );..  asser
323b0 74 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  t( pVfs->mxPathn
323c0 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d  ame==MAX_PATHNAM
323d0 45 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  E );.  UNUSED_PA
323e0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a  RAMETER(pVfs);..
323f0 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d    zOut[nOut-1] =
32400 20 27 5c 30 27 3b 0a 20 20 69 66 28 20 7a 50 61   '\0';.  if( zPa
32410 74 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  th[0]=='/' ){.  
32420 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
32430 74 66 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22  tf(nOut, zOut, "
32440 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d  %s", zPath);.  }
32450 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43  else{.    int nC
32460 77 64 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65  wd;.    if( osGe
32470 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d  tcwd(zOut, nOut-
32480 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  1)==0 ){.      r
32490 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72  eturn unixLogErr
324a0 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
324b0 45 4e 5f 42 4b 50 54 2c 20 22 67 65 74 63 77 64  EN_BKPT, "getcwd
324c0 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  ", zPath);.    }
324d0 0a 20 20 20 20 6e 43 77 64 20 3d 20 28 69 6e 74  .    nCwd = (int
324e0 29 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20  )strlen(zOut);. 
324f0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
32500 6e 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26  ntf(nOut-nCwd, &
32510 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73  zOut[nCwd], "/%s
32520 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20  ", zPath);.  }. 
32530 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
32540 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  K;.}...#ifndef S
32550 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
32560 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20  EXTENSION./*.** 
32570 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f  Interfaces for o
32580 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20  pening a shared 
32590 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67  library, finding
325a0 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a   entry points.**
325b0 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72   within the shar
325c0 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20  ed library, and 
325d0 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72  closing the shar
325e0 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23  ed library..*/.#
325f0 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68  include <dlfcn.h
32600 3e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75  >.static void *u
32610 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65  nixDlOpen(sqlite
32620 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
32630 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
32640 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44  ename){.  UNUSED
32650 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
32660 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c  ed);.  return dl
32670 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  open(zFilename, 
32680 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f  RTLD_NOW | RTLD_
32690 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  GLOBAL);.}../*.*
326a0 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74  * SQLite calls t
326b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d  his function imm
326c0 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 61  ediately after a
326d0 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53   call to unixDlS
326e0 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44  ym() or.** unixD
326f0 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72  lOpen() fails (r
32700 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f  eturns a null po
32710 69 6e 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72  inter). If a mor
32720 65 20 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72  e detailed error
32730 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61  .** message is a
32740 76 61 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20  vailable, it is 
32750 77 72 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f  written to zBufO
32760 75 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  ut. If no error 
32770 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76  message.** is av
32780 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74  ailable, zBufOut
32790 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66   is left unmodif
327a0 69 65 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75  ied and SQLite u
327b0 73 65 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a  ses a default.**
327c0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a   error message..
327d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
327e0 6e 69 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74  nixDlError(sqlit
327f0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
32800 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
32810 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e  *zBufOut){.  con
32820 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20  st char *zErr;. 
32830 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
32840 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e  R(NotUsed);.  un
32850 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
32860 20 20 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72    zErr = dlerror
32870 28 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29  ();.  if( zErr )
32880 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
32890 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75  printf(nBuf, zBu
328a0 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72  fOut, "%s", zErr
328b0 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61  );.  }.  unixLea
328c0 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61  veMutex();.}.sta
328d0 74 69 63 20 76 6f 69 64 20 28 2a 75 6e 69 78 44  tic void (*unixD
328e0 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73  lSym(sqlite3_vfs
328f0 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20   *NotUsed, void 
32900 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a  *p, const char*z
32910 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f  Sym))(void){.  /
32920 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77 69 74 68  * .  ** GCC with
32930 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72   -pedantic-error
32940 73 20 73 61 79 73 20 74 68 61 74 20 43 39 30 20  s says that C90 
32950 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  does not allow a
32960 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a   void* to be.  *
32970 2a 20 63 61 73 74 20 69 6e 74 6f 20 61 20 70 6f  * cast into a po
32980 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
32990 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20 74 68  ion.  And yet th
329a0 65 20 6c 69 62 72 61 72 79 20 64 6c 73 79 6d 28  e library dlsym(
329b0 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72  ) routine.  ** r
329c0 65 74 75 72 6e 73 20 61 20 76 6f 69 64 2a 20 77  eturns a void* w
329d0 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61  hich is really a
329e0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
329f0 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20  nction.  So how 
32a00 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65 20 64  do we.  ** use d
32a10 6c 73 79 6d 28 29 20 77 69 74 68 20 2d 70 65 64  lsym() with -ped
32a20 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20  antic-errors?.  
32a30 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65  **.  ** Variable
32a40 20 78 20 62 65 6c 6f 77 20 69 73 20 64 65 66 69   x below is defi
32a50 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 69 6e  ned to be a poin
32a60 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
32a70 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61  n taking.  ** pa
32a80 72 61 6d 65 74 65 72 73 20 76 6f 69 64 2a 20 61  rameters void* a
32a90 6e 64 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 61  nd const char* a
32aa0 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 20 70  nd returning a p
32ab0 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
32ac0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e  tion..  ** We in
32ad0 69 74 69 61 6c 69 7a 65 20 78 20 62 79 20 61 73  itialize x by as
32ae0 73 69 67 6e 69 6e 67 20 69 74 20 61 20 70 6f 69  signing it a poi
32af0 6e 74 65 72 20 74 6f 20 74 68 65 20 64 6c 73 79  nter to the dlsy
32b00 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  m() function..  
32b10 2a 2a 20 28 54 68 61 74 20 61 73 73 69 67 6e 6d  ** (That assignm
32b20 65 6e 74 20 72 65 71 75 69 72 65 73 20 61 20 63  ent requires a c
32b30 61 73 74 2e 29 20 20 54 68 65 6e 20 77 65 20 63  ast.)  Then we c
32b40 61 6c 6c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  all the function
32b50 20 74 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69   that.  ** x poi
32b60 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20  nts to.  .  **. 
32b70 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61 72   ** This work-ar
32b80 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79  ound is unlikely
32b90 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74   to work correct
32ba0 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d  ly on any system
32bb0 20 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20   where.  ** you 
32bc0 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61  really cannot ca
32bd0 73 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f  st a function po
32be0 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a  inter into void*
32bf0 2e 20 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20  .  But then, on 
32c00 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68  the.  ** other h
32c10 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c  and, dlsym() wil
32c20 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75  l not work on su
32c30 63 68 20 61 20 73 79 73 74 65 6d 20 65 69 74 68  ch a system eith
32c40 65 72 2c 20 73 6f 20 77 65 20 68 61 76 65 0a 20  er, so we have. 
32c50 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c   ** not really l
32c60 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20  ost anything..  
32c70 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78 29  */.  void (*(*x)
32c80 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
32c90 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e  r*))(void);.  UN
32ca0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
32cb0 6f 74 55 73 65 64 29 3b 0a 20 20 78 20 3d 20 28  otUsed);.  x = (
32cc0 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c  void(*(*)(void*,
32cd0 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f  const char*))(vo
32ce0 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74  id))dlsym;.  ret
32cf0 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d  urn (*x)(p, zSym
32d00 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
32d10 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c   unixDlClose(sql
32d20 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
32d30 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65  d, void *pHandle
32d40 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
32d50 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
32d60 20 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c    dlclose(pHandl
32d70 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69  e);.}.#else /* i
32d80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
32d90 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20  AD_EXTENSION is 
32da0 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64  defined: */.  #d
32db0 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e  efine unixDlOpen
32dc0 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e    0.  #define un
32dd0 69 78 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64  ixDlError 0.  #d
32de0 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20  efine unixDlSym 
32df0 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e    0.  #define un
32e00 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64  ixDlClose 0.#end
32e10 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
32e20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61  nBuf bytes of ra
32e30 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20 74 68 65  ndom data to the
32e40 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72   supplied buffer
32e50 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63   zBuf..*/.static
32e60 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e   int unixRandomn
32e70 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ess(sqlite3_vfs 
32e80 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42  *NotUsed, int nB
32e90 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
32ea0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
32eb0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
32ec0 61 73 73 65 72 74 28 28 73 69 7a 65 5f 74 29 6e  assert((size_t)n
32ed0 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d  Buf>=(sizeof(tim
32ee0 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29  e_t)+sizeof(int)
32ef0 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76  ));..  /* We hav
32f00 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
32f10 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20  zBuf to prevent 
32f20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65  valgrind from re
32f30 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72  porting.  ** err
32f40 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74  ors.  The report
32f50 73 20 69 73 73 75 65 64 20 62 79 20 76 61 6c 67  s issued by valg
32f60 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65  rind are incorre
32f70 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20  ct - we would.  
32f80 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74 20 74  ** prefer that t
32f90 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65  he randomness be
32fa0 20 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61   increased by ma
32fb0 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a  king use of the.
32fc0 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a    ** uninitializ
32fd0 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66  ed space in zBuf
32fe0 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20   - but valgrind 
32ff0 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77  errors tend to w
33000 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75  orry.  ** some u
33010 73 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68  sers.  Rather th
33020 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65  an argue, it see
33030 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74  ms easier just t
33040 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a  o initialize.  *
33050 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61  * the whole arra
33060 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61  y and silence va
33070 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20  lgrind, even if 
33080 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20  that means less 
33090 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20  randomness.  ** 
330a0 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65  in the random se
330b0 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  ed..  **.  ** Wh
330c0 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74  en testing, init
330d0 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20  ializing zBuf[] 
330e0 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77  to zero is all w
330f0 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e  e do.  That mean
33100 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61  s.  ** that we a
33110 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61  lways use the sa
33120 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  me random number
33130 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73   sequence.  This
33140 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20   makes the.  ** 
33150 74 65 73 74 73 20 72 65 70 65 61 74 61 62 6c 65  tests repeatable
33160 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
33170 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a  zBuf, 0, nBuf);.
33180 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
33190 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20  ITE_TEST).  {.  
331a0 20 20 69 6e 74 20 70 69 64 2c 20 66 64 3b 0a 20    int pid, fd;. 
331b0 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
331c0 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f  pen("/dev/urando
331d0 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29  m", O_RDONLY, 0)
331e0 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29  ;.    if( fd<0 )
331f0 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74  {.      time_t t
33200 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74 29  ;.      time(&t)
33210 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
33220 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28  Buf, &t, sizeof(
33230 74 29 29 3b 0a 20 20 20 20 20 20 70 69 64 20 3d  t));.      pid =
33240 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20 20 20   getpid();.     
33250 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69   memcpy(&zBuf[si
33260 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c 20  zeof(t)], &pid, 
33270 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20  sizeof(pid));.  
33280 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
33290 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 70 69 64  of(t)+sizeof(pid
332a0 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66 20  )<=(size_t)nBuf 
332b0 29 3b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20  );.      nBuf = 
332c0 73 69 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a 65  sizeof(t) + size
332d0 6f 66 28 70 69 64 29 3b 0a 20 20 20 20 7d 65 6c  of(pid);.    }el
332e0 73 65 7b 0a 20 20 20 20 20 20 64 6f 7b 20 6e 42  se{.      do{ nB
332f0 75 66 20 3d 20 6f 73 52 65 61 64 28 66 64 2c 20  uf = osRead(fd, 
33300 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20 7d 77 68  zBuf, nBuf); }wh
33310 69 6c 65 28 20 6e 42 75 66 3c 30 20 26 26 20 65  ile( nBuf<0 && e
33320 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
33330 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
33340 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  e(0, fd, __LINE_
33350 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  _);.    }.  }.#e
33360 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 42  ndif.  return nB
33370 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c  uf;.}.../*.** Sl
33380 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65  eep for a little
33390 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20   while.  Return 
333a0 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  the amount of ti
333b0 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65  me slept..** The
333c0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
333d0 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f   number of micro
333e0 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20  seconds we want 
333f0 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65  to sleep..** The
33400 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
33410 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
33420 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73  icroseconds of s
33430 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  leep actually.**
33440 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20   requested from 
33450 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f  the underlying o
33460 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2c  perating system,
33470 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63 68 0a   a number which.
33480 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72 65 61  ** might be grea
33490 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
334a0 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d 65 6e  l to the argumen
334b0 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a  t, but not less.
334c0 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72 67 75  ** than the argu
334d0 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
334e0 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28 73 71  int unixSleep(sq
334f0 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
33500 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63  ed, int microsec
33510 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58  onds){.#if OS_VX
33520 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74  WORKS.  struct t
33530 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20 20 73  imespec sp;..  s
33540 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f  p.tv_sec = micro
33550 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 30 30  seconds / 100000
33560 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63 20  0;.  sp.tv_nsec 
33570 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  = (microseconds 
33580 25 20 31 30 30 30 30 30 30 29 20 2a 20 31 30 30  % 1000000) * 100
33590 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26  0;.  nanosleep(&
335a0 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55  sp, NULL);.  UNU
335b0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
335c0 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
335d0 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23   microseconds;.#
335e0 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  elif defined(HAV
335f0 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41 56  E_USLEEP) && HAV
33600 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65  E_USLEEP.  uslee
33610 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b  p(microseconds);
33620 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
33630 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
33640 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f  return microseco
33650 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  nds;.#else.  int
33660 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72   seconds = (micr
33670 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29  oseconds+999999)
33680 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65  /1000000;.  slee
33690 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e  p(seconds);.  UN
336a0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
336b0 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
336c0 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30 30  n seconds*100000
336d0 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  0;.#endif.}../*.
336e0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
336f0 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65   variable, if se
33700 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  t to a non-zero 
33710 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70  value, is interp
33720 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20  reted as.** the 
33730 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64  number of second
33740 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64  s since 1970 and
33750 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20   is used to set 
33760 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
33770 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e   sqlite3OsCurren
33780 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74  tTime() during t
33790 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65  esting..*/.#ifde
337a0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
337b0 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  t sqlite3_curren
337c0 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20  t_time = 0;  /* 
337d0 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65  Fake system time
337e0 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   in seconds sinc
337f0 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69  e 1970. */.#endi
33800 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  f../*.** Find th
33810 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28  e current time (
33820 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f  in Universal Coo
33830 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20  rdinated Time). 
33840 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e   Write into *piN
33850 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  ow.** the curren
33860 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
33870 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
33880 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f  number times 86_
33890 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20  400_000.  In.** 
338a0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69  other words, wri
338b0 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74  te into *piNow t
338c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  he number of mil
338d0 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  liseconds since 
338e0 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70  the Julian.** ep
338f0 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47  och of noon in G
33900 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65  reenwich on Nove
33910 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e  mber 24, 4714 B.
33920 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  C according to t
33930 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20  he.** proleptic 
33940 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64  Gregorian calend
33950 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  ar..**.** On suc
33960 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  cess, return SQL
33970 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20  ITE_OK.  Return 
33980 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20  SQLITE_ERROR if 
33990 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
339a0 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  e .** cannot be 
339b0 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
339c0 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74   int unixCurrent
339d0 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65  TimeInt64(sqlite
339e0 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
339f0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
33a00 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69 63 20  iNow){.  static 
33a10 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e  const sqlite3_in
33a20 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20  t64 unixEpoch = 
33a30 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65  24405875*(sqlite
33a40 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b  3_int64)8640000;
33a50 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
33a60 54 45 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e  TE_OK;.#if defin
33a70 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20  ed(NO_GETTOD).  
33a80 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65  time_t t;.  time
33a90 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d  (&t);.  *piNow =
33aa0 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34   ((sqlite3_int64
33ab0 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69 78 45  )t)*1000 + unixE
33ac0 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f 56  poch;.#elif OS_V
33ad0 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
33ae0 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20  timespec sNow;. 
33af0 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43   clock_gettime(C
33b00 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26  LOCK_REALTIME, &
33b10 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77 20  sNow);.  *piNow 
33b20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30  = unixEpoch + 10
33b30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  00*(sqlite3_int6
33b40 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20  4)sNow.tv_sec + 
33b50 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30 30  sNow.tv_nsec/100
33b60 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74  0000;.#else.  st
33b70 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f  ruct timeval sNo
33b80 77 3b 0a 20 20 69 66 28 20 67 65 74 74 69 6d 65  w;.  if( gettime
33b90 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30 29 3d  ofday(&sNow, 0)=
33ba0 3d 30 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77  =0 ){.    *piNow
33bb0 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31   = unixEpoch + 1
33bc0 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
33bd0 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b  64)sNow.tv_sec +
33be0 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30   sNow.tv_usec/10
33bf0 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  00;.  }else{.   
33c00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
33c10 4f 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  OR;.  }.#endif..
33c20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
33c30 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ST.  if( sqlite3
33c40 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b  _current_time ){
33c50 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30  .    *piNow = 10
33c60 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  00*(sqlite3_int6
33c70 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  4)sqlite3_curren
33c80 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f  t_time + unixEpo
33c90 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ch;.  }.#endif. 
33ca0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
33cb0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
33cc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
33cd0 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
33ce0 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
33cf0 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
33d00 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
33d10 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74  the.** current t
33d20 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
33d30 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
33d40 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20  ber into *prNow 
33d50 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e  and.** return 0.
33d60 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
33d70 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  e time and date 
33d80 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
33d90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
33da0 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73  nixCurrentTime(s
33db0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
33dc0 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e  sed, double *prN
33dd0 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ow){.  sqlite3_i
33de0 6e 74 36 34 20 69 20 3d 20 30 3b 0a 20 20 69 6e  nt64 i = 0;.  in
33df0 74 20 72 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50  t rc;.  UNUSED_P
33e00 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
33e10 29 3b 0a 20 20 72 63 20 3d 20 75 6e 69 78 43 75  );.  rc = unixCu
33e20 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 30  rrentTimeInt64(0
33e30 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20  , &i);.  *prNow 
33e40 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a  = i/86400000.0;.
33e50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
33e60 2f 2a 0a 2a 2a 20 57 65 20 61 64 64 65 64 20 74  /*.** We added t
33e70 68 65 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  he xGetLastError
33e80 28 29 20 6d 65 74 68 6f 64 20 77 69 74 68 20 74  () method with t
33e90 68 65 20 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20  he intention of 
33ea0 70 72 6f 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74  providing.** bet
33eb0 74 65 72 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72  ter low-level er
33ec0 72 6f 72 20 6d 65 73 73 61 67 65 73 20 77 68 65  ror messages whe
33ed0 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73 79 73 74  n operating-syst
33ee0 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65  em problems come
33ef0 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51   up.** during SQ
33f00 4c 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20  Lite operation. 
33f10 20 42 75 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e   But so far, non
33f20 65 20 6f 66 20 74 68 61 74 20 68 61 73 20 62 65  e of that has be
33f30 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a  en implemented.*
33f40 2a 20 69 6e 20 74 68 65 20 63 6f 72 65 2e 20 20  * in the core.  
33f50 53 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  So this routine 
33f60 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e  is never called.
33f70 20 20 46 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73    For now, it is
33f80 20 6d 65 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61   merely.** a pla
33f90 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74  ce-holder..*/.st
33fa0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74  atic int unixGet
33fb0 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65  LastError(sqlite
33fc0 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
33fd0 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20 63 68  int NotUsed2, ch
33fe0 61 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20  ar *NotUsed3){. 
33ff0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
34000 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e  R(NotUsed);.  UN
34010 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
34020 6f 74 55 73 65 64 32 29 3b 0a 20 20 55 4e 55 53  otUsed2);.  UNUS
34030 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
34040 55 73 65 64 33 29 3b 0a 20 20 72 65 74 75 72 6e  Used3);.  return
34050 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a   0;.}.../*.*****
34060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34070 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69 74  *** End of sqlit
34080 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a  e3_vfs methods *
34090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
340a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
340b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
340c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
340d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
340e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
340f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
34100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
34150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34160 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f  ****** Begin Pro
34170 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  xy Locking *****
34180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
341a0 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * Proxy locking 
341b0 69 73 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69  is a "uber-locki
341c0 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68  ng-method" in th
341d0 69 73 20 73 65 6e 73 65 3a 20 20 49 74 20 75 73  is sense:  It us
341e0 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20  es the.** other 
341f0 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20  locking methods 
34200 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63  on secondary loc
34210 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f 78 79 20  k files.  Proxy 
34220 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20  locking is a.** 
34230 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76 65 72 20  meta-layer over 
34240 74 6f 70 20 6f 66 20 74 68 65 20 70 72 69 6d 69  top of the primi
34250 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70  tive locking imp
34260 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e 20  lemented above. 
34270 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65 61   For.** this rea
34280 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f  son, the divisio
34290 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  n that implement
342a0 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69  s of proxy locki
342b0 6e 67 20 69 73 20 64 65 66 65 72 72 65 64 0a 2a  ng is deferred.*
342c0 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20  * until late in 
342d0 74 68 65 20 66 69 6c 65 20 28 68 65 72 65 29 20  the file (here) 
342e0 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65  after all of the
342f0 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f   other I/O metho
34300 64 73 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  ds have.** been 
34310 64 65 66 69 6e 65 64 20 2d 20 73 6f 20 74 68 61  defined - so tha
34320 74 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20  t the primitive 
34330 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20  locking methods 
34340 61 72 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a  are available.**
34350 20 61 73 20 73 65 72 76 69 63 65 73 20 74 6f 20   as services to 
34360 68 65 6c 70 20 77 69 74 68 20 74 68 65 20 69 6d  help with the im
34370 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
34380 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a  proxy locking..*
34390 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  *.****.**.** The
343a0 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
343b0 20 73 63 68 65 6d 65 73 20 69 6e 20 53 51 4c 69   schemes in SQLi
343c0 74 65 20 75 73 65 20 62 79 74 65 2d 72 61 6e 67  te use byte-rang
343d0 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a  e locks on the.*
343e0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
343f0 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 73 61  to coordinate sa
34400 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 61  fe, concurrent a
34410 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c  ccess by multipl
34420 65 20 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64  e readers.** and
34430 20 77 72 69 74 65 72 73 20 5b 68 74 74 70 3a 2f   writers [http:/
34440 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b  /sqlite.org/lock
34450 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68  ingv3.html].  Th
34460 65 20 66 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b  e five file lock
34470 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20 28 55  ing.** states (U
34480 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47  NLOCKED, PENDING
34490 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56  , SHARED, RESERV
344a0 45 44 2c 20 45 58 43 4c 55 53 49 56 45 29 20 61  ED, EXCLUSIVE) a
344b0 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a  re implemented.*
344c0 2a 20 61 73 20 50 4f 53 49 58 20 72 65 61 64 20  * as POSIX read 
344d0 26 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76  & write locks ov
344e0 65 72 20 66 69 78 65 64 20 73 65 74 20 6f 66 20  er fixed set of 
344f0 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69 61 20 66  locations (via f
34500 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50  sctl),.** on AFP
34510 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78   and SMB only ex
34520 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e  clusive byte-ran
34530 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 61 76 61  ge locks are ava
34540 69 6c 61 62 6c 65 20 76 69 61 20 66 73 63 74 6c  ilable via fsctl
34550 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52 28 27  .** with _IOWR('
34560 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42  z', 23, struct B
34570 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29  yteRangeLockPB2)
34580 20 74 6f 20 74 72 61 63 6b 20 74 68 65 20 73 61   to track the sa
34590 6d 65 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20  me 5 states..** 
345a0 54 6f 20 73 69 6d 75 6c 61 74 65 20 61 20 46 5f  To simulate a F_
345b0 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68 61  RDLCK on the sha
345c0 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46  red range, on AF
345d0 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c  P a randomly sel
345e0 65 63 74 65 64 0a 2a 2a 20 61 64 64 72 65 73 73  ected.** address
345f0 20 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 72   in the shared r
34600 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f  ange is taken fo
34610 72 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  r a SHARED lock,
34620 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73   the entire.** s
34630 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74  hared range is t
34640 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c  aken for an EXCL
34650 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a  USIVE lock):.**.
34660 2a 2a 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f  **      PENDING_
34670 42 59 54 45 20 20 20 20 20 20 20 20 30 78 34 30  BYTE        0x40
34680 30 30 30 30 30 30 09 09 20 20 20 09 0a 2a 2a 20  000000..   ..** 
34690 20 20 20 20 20 52 45 53 45 52 56 45 44 5f 42 59       RESERVED_BY
346a0 54 45 20 20 20 20 20 20 20 30 78 34 30 30 30 30  TE       0x40000
346b0 30 30 31 0a 2a 2a 20 20 20 20 20 20 53 48 41 52  001.**      SHAR
346c0 45 44 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20  ED_RANGE        
346d0 30 78 34 30 30 30 30 30 30 32 20 2d 3e 20 30 78  0x40000002 -> 0x
346e0 34 30 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54  40000200.**.** T
346f0 68 69 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f  his works well o
34700 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65  n the local file
34710 20 73 79 73 74 65 6d 2c 20 62 75 74 20 73 68 6f   system, but sho
34720 77 73 20 61 20 6e 65 61 72 6c 79 20 31 30 30 78  ws a nearly 100x
34730 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20  .** slowdown in 
34740 72 65 61 64 20 70 65 72 66 6f 72 6d 61 6e 63 65  read performance
34750 20 6f 6e 20 41 46 50 20 62 65 63 61 75 73 65 20   on AFP because 
34760 74 68 65 20 41 46 50 20 63 6c 69 65 6e 74 20 64  the AFP client d
34770 69 73 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72  isables.** the r
34780 65 61 64 20 63 61 63 68 65 20 77 68 65 6e 20 62  ead cache when b
34790 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20  yte-range locks 
347a0 61 72 65 20 70 72 65 73 65 6e 74 2e 20 20 45 6e  are present.  En
347b0 61 62 6c 69 6e 67 20 74 68 65 20 72 65 61 64 0a  abling the read.
347c0 2a 2a 20 63 61 63 68 65 20 65 78 70 6f 73 65 73  ** cache exposes
347d0 20 61 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e   a cache coheren
347e0 63 79 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20  cy problem that 
347f0 69 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c  is present on al
34800 6c 20 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72  l OS X.** suppor
34810 74 65 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65  ted network file
34820 20 73 79 73 74 65 6d 73 2e 20 20 4e 46 53 20 61   systems.  NFS a
34830 6e 64 20 41 46 50 20 62 6f 74 68 20 6f 62 73 65  nd AFP both obse
34840 72 76 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65  rve the.** close
34850 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69  -to-open semanti
34860 63 73 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20  cs for ensuring 
34870 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 0a  cache coherency.
34880 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73  ** [http://nfs.s
34890 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23  ourceforge.net/#
348a0 66 61 71 5f 61 38 5d 2c 20 77 68 69 63 68 20 64  faq_a8], which d
348b0 6f 65 73 20 6e 6f 74 20 65 66 66 65 63 74 69 76  oes not effectiv
348c0 65 6c 79 0a 2a 2a 20 61 64 64 72 65 73 73 20 74  ely.** address t
348d0 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20  he requirements 
348e0 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e 74 20 64  for concurrent d
348f0 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 62  atabase access b
34900 79 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65  y multiple.** re
34910 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72  aders and writer
34920 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77  s.** [http://www
34930 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69  .nabble.com/SQLi
34940 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d  te-on-NFS-cache-
34950 63 6f 68 65 72 65 6e 63 79 2d 74 64 31 35 36 35  coherency-td1565
34960 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a  5701.html]..**.*
34970 2a 20 54 6f 20 61 64 64 72 65 73 73 20 74 68 65  * To address the
34980 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64   performance and
34990 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79   cache coherency
349a0 20 69 73 73 75 65 73 2c 20 70 72 6f 78 79 20 66   issues, proxy f
349b0 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63  ile locking.** c
349c0 68 61 6e 67 65 73 20 74 68 65 20 77 61 79 20 64  hanges the way d
349d0 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 69  atabase access i
349e0 73 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20  s controlled by 
349f0 6c 69 6d 69 74 69 6e 67 20 61 63 63 65 73 73 20  limiting access 
34a00 74 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68  to a.** single h
34a10 6f 73 74 20 61 74 20 61 20 74 69 6d 65 20 61 6e  ost at a time an
34a20 64 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f  d moving file lo
34a30 63 6b 73 20 6f 66 66 20 6f 66 20 74 68 65 20 64  cks off of the d
34a40 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20  atabase file.** 
34a50 61 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79  and onto a proxy
34a60 20 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63   file on the loc
34a70 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20  al file system. 
34a80 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67   .**.**.** Using
34a90 20 70 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20   proxy locks.** 
34aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34ab0 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a  -.**.** C APIs.*
34ac0 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69  *.**  sqlite3_fi
34ad0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64  le_control(db, d
34ae0 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 53 45  bname, SQLITE_SE
34af0 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c  T_LOCKPROXYFILE,
34b00 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
34b10 20 20 20 20 20 20 20 20 20 20 3c 70 72 6f 78 79            <proxy
34b20 5f 70 61 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a  _path> | ":auto:
34b30 22 29 3b 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f  ");.**  sqlite3_
34b40 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
34b50 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f   dbname, SQLITE_
34b60 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  GET_LOCKPROXYFIL
34b70 45 2c 20 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e  E, &<proxy_path>
34b80 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20  );.**.**.** SQL 
34b90 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50  pragmas.**.**  P
34ba0 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e  RAGMA [database.
34bb0 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65  ]lock_proxy_file
34bc0 3d 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20  =<proxy_path> | 
34bd0 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d  :auto:.**  PRAGM
34be0 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63  A [database.]loc
34bf0 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a  k_proxy_file.**.
34c00 2a 2a 20 53 70 65 63 69 66 79 69 6e 67 20 22 3a  ** Specifying ":
34c10 61 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61  auto:" means tha
34c20 74 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  t if there is a 
34c30 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 74 68 20  conch file with 
34c40 61 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f  a matching.** ho
34c50 73 74 20 49 44 20 69 6e 20 69 74 2c 20 74 68 65  st ID in it, the
34c60 20 70 72 6f 78 79 20 70 61 74 68 20 69 6e 20 74   proxy path in t
34c70 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69  he conch file wi
34c80 6c 6c 20 62 65 20 75 73 65 64 2c 20 6f 74 68 65  ll be used, othe
34c90 72 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79  rwise.** a proxy
34ca0 20 70 61 74 68 20 62 61 73 65 64 20 6f 6e 20 74   path based on t
34cb0 68 65 20 75 73 65 72 27 73 20 74 65 6d 70 20 64  he user's temp d
34cc0 69 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73  ir.** (via confs
34cd0 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53  tr(_CS_DARWIN_US
34ce0 45 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29  ER_TEMP_DIR,...)
34cf0 29 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61  ) will be used a
34d00 6e 64 20 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c  nd the.** actual
34d10 20 70 72 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65   proxy file name
34d20 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66 72   is generated fr
34d30 6f 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e 64 20  om the name and 
34d40 70 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64  path of the.** d
34d50 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 46  atabase file.  F
34d60 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
34d70 2a 20 20 20 20 20 20 20 46 6f 72 20 64 61 74 61  *       For data
34d80 62 61 73 65 20 70 61 74 68 20 22 2f 55 73 65 72  base path "/User
34d90 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a  s/me/foo.db" .**
34da0 20 20 20 20 20 20 20 54 68 65 20 6c 6f 63 6b 20         The lock 
34db0 70 61 74 68 20 77 69 6c 6c 20 62 65 20 22 3c 74  path will be "<t
34dc0 6d 70 64 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f  mpdir>/sqliteplo
34dd0 63 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f  cks/_Users_me_fo
34de0 6f 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a  o.db:auto:").**.
34df0 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70  ** Once a lock p
34e00 72 6f 78 79 20 69 73 20 63 6f 6e 66 69 67 75 72  roxy is configur
34e10 65 64 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  ed for a databas
34e20 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74  e connection, it
34e30 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72   can not.** be r
34e40 65 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65 72 20  emoved, however 
34e50 69 74 20 6d 61 79 20 62 65 20 73 77 69 74 63 68  it may be switch
34e60 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
34e70 74 20 70 72 6f 78 79 20 70 61 74 68 20 76 69 61  t proxy path via
34e80 0a 2a 2a 20 74 68 65 20 61 62 6f 76 65 20 41 50  .** the above AP
34e90 49 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65  Is (assuming the
34ea0 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 20 6e   conch file is n
34eb0 6f 74 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79  ot being held by
34ec0 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e   another.** conn
34ed0 65 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73  ection or proces
34ee0 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f  s). .**.**.** Ho
34ef0 77 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  w proxy locking 
34f00 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  works.** -------
34f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34f20 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c  .**.** Proxy fil
34f30 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73  e locking relies
34f40 20 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77   primarily on tw
34f50 6f 20 6e 65 77 20 73 75 70 70 6f 72 74 69 6e 67  o new supporting
34f60 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20   files: .**.**  
34f70 20 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65 20 74   *  conch file t
34f80 6f 20 6c 69 6d 69 74 20 61 63 63 65 73 73 20 74  o limit access t
34f90 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
34fa0 69 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  ile to a single 
34fb0 68 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61 74 20  host.**      at 
34fc0 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a  a time.**.**   *
34fd0 20 20 70 72 6f 78 79 20 66 69 6c 65 20 74 6f 20    proxy file to 
34fe0 61 63 74 20 61 73 20 61 20 70 72 6f 78 79 20 66  act as a proxy f
34ff0 6f 72 20 74 68 65 20 61 64 76 69 73 6f 72 79 20  or the advisory 
35000 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a  locks normally.*
35010 2a 20 20 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20  *      taken on 
35020 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a  the database.**.
35030 2a 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c  ** The conch fil
35040 65 20 2d 20 74 6f 20 75 73 65 20 61 20 70 72 6f  e - to use a pro
35050 78 79 20 66 69 6c 65 2c 20 73 71 6c 69 74 65 20  xy file, sqlite 
35060 6d 75 73 74 20 66 69 72 73 74 20 22 68 6f 6c 64  must first "hold
35070 20 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62   the conch".** b
35080 79 20 74 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69  y taking an sqli
35090 74 65 2d 73 74 79 6c 65 20 73 68 61 72 65 64 20  te-style shared 
350a0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63  lock on the conc
350b0 68 20 66 69 6c 65 2c 20 72 65 61 64 69 6e 67 20  h file, reading 
350c0 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
350d0 61 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20 74 68  and comparing th
350e0 65 20 68 6f 73 74 27 73 20 75 6e 69 71 75 65 20  e host's unique 
350f0 68 6f 73 74 20 49 44 20 28 73 65 65 20 62 65 6c  host ID (see bel
35100 6f 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20  ow) and lock.** 
35110 70 72 6f 78 79 20 70 61 74 68 20 61 67 61 69 6e  proxy path again
35120 73 74 20 74 68 65 20 76 61 6c 75 65 73 20 73 74  st the values st
35130 6f 72 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 63  ored in the conc
35140 68 2e 20 20 54 68 65 20 63 6f 6e 63 68 20 66 69  h.  The conch fi
35150 6c 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20  le is.** stored 
35160 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65  in the same dire
35170 63 74 6f 72 79 20 61 73 20 74 68 65 20 64 61 74  ctory as the dat
35180 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
35190 68 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20  he file name.** 
351a0 69 73 20 70 61 74 74 65 72 6e 65 64 20 61 66 74  is patterned aft
351b0 65 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  er the database 
351c0 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c  file name as ".<
351d0 64 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f  databasename>-co
351e0 6e 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20  nch"..** If the 
351f0 63 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65 73 20  conch file does 
35200 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 69 74  not exist, or it
35210 27 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e  's contents do n
35220 6f 74 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20  ot match the.** 
35230 68 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72 20 70  host ID and/or p
35240 72 6f 78 79 20 70 61 74 68 2c 20 74 68 65 6e 20  roxy path, then 
35250 74 68 65 20 6c 6f 63 6b 20 69 73 20 65 73 63 61  the lock is esca
35260 6c 61 74 65 64 20 74 6f 20 61 6e 20 65 78 63 6c  lated to an excl
35270 75 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e  usive.** lock an
35280 64 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  d the conch file
35290 20 63 6f 6e 74 65 6e 74 73 20 69 73 20 75 70 64   contents is upd
352a0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 68 6f  ated with the ho
352b0 73 74 20 49 44 20 61 6e 64 20 70 72 6f 78 79 0a  st ID and proxy.
352c0 2a 2a 20 70 61 74 68 20 61 6e 64 20 74 68 65 20  ** path and the 
352d0 6c 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72 61 64  lock is downgrad
352e0 65 64 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c  ed to a shared l
352f0 6f 63 6b 20 61 67 61 69 6e 2e 20 20 49 66 20 74  ock again.  If t
35300 68 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68  he conch.** is h
35310 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20 70  eld by another p
35320 72 6f 63 65 73 73 20 28 77 69 74 68 20 61 20 73  rocess (with a s
35330 68 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65  hared lock), the
35340 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a   exclusive lock.
35350 2a 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64  ** will fail and
35360 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
35370 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
35380 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 2d  The proxy file -
35390 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 66   a single-byte f
353a0 69 6c 65 20 75 73 65 64 20 66 6f 72 20 61 6c 6c  ile used for all
353b0 20 61 64 76 69 73 6f 72 79 20 66 69 6c 65 20 6c   advisory file l
353c0 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79  ocks.** normally
353d0 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61   taken on the da
353e0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 20 54  tabase file.   T
353f0 68 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73  his allows for s
35400 61 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f  afe sharing.** o
35410 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
35420 69 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65  ile for multiple
35430 20 72 65 61 64 65 72 73 20 61 6e 64 20 77 72 69   readers and wri
35440 74 65 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ters on the same
35450 0a 2a 2a 20 68 6f 73 74 20 28 74 68 65 20 63 6f  .** host (the co
35460 6e 63 68 20 65 6e 73 75 72 65 73 20 74 68 61 74  nch ensures that
35470 20 74 68 65 79 20 61 6c 6c 20 75 73 65 20 74 68   they all use th
35480 65 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63  e same local loc
35490 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52  k file)..**.** R
354a0 65 71 75 65 73 74 69 6e 67 20 74 68 65 20 6c 6f  equesting the lo
354b0 63 6b 20 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f  ck proxy does no
354c0 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 61  t immediately ta
354d0 6b 65 20 74 68 65 20 63 6f 6e 63 68 2c 20 69 74  ke the conch, it
354e0 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65   is.** only take
354f0 6e 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74  n when the first
35500 20 72 65 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b   request to lock
35510 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
35520 73 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69  s made.  .** Thi
35530 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 73 65  s matches the se
35540 6d 61 6e 74 69 63 73 20 6f 66 20 74 68 65 20 74  mantics of the t
35550 72 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69  raditional locki
35560 6e 67 20 62 65 68 61 76 69 6f 72 2c 20 77 68 65  ng behavior, whe
35570 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20  re.** opening a 
35580 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20  connection to a 
35590 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 64 6f  database file do
355a0 65 73 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f  es not take a lo
355b0 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65  ck on it..** The
355c0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64   shared lock and
355d0 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64 65   an open file de
355e0 73 63 72 69 70 74 6f 72 20 61 72 65 20 6d 61 69  scriptor are mai
355f0 6e 74 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a  ntained until .*
35600 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * the connection
35610 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
35620 20 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a   is closed. .**.
35630 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c  ** The proxy fil
35640 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66  e and the lock f
35650 69 6c 65 20 61 72 65 20 6e 65 76 65 72 20 64 65  ile are never de
35660 6c 65 74 65 64 20 73 6f 20 74 68 65 79 20 6f 6e  leted so they on
35670 6c 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ly need.** to be
35680 20 63 72 65 61 74 65 64 20 74 68 65 20 66 69 72   created the fir
35690 73 74 20 74 69 6d 65 20 74 68 65 79 20 61 72 65  st time they are
356a0 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e   used..**.** Con
356b0 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f  figuration optio
356c0 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ns.** ----------
356d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a  -----------.**.*
356e0 2a 20 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  *  SQLITE_PREFER
356f0 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a  _PROXY_LOCKING.*
35700 2a 0a 2a 2a 20 20 20 20 20 20 20 44 61 74 61 62  *.**       Datab
35710 61 73 65 20 66 69 6c 65 73 20 61 63 63 65 73 73  ase files access
35720 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20  ed on non-local 
35730 66 69 6c 65 20 73 79 73 74 65 6d 73 20 61 72 65  file systems are
35740 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 6f 6d 61  .**       automa
35750 74 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72  tically configur
35760 65 64 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63  ed for proxy loc
35770 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73  king, lock files
35780 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61   are.**       na
35790 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  med automaticall
357a0 79 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  y using the same
357b0 20 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20 20   logic as.**    
357c0 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70     PRAGMA lock_p
357d0 72 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f  roxy_file=":auto
357e0 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51  :".**    .**  SQ
357f0 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47  LITE_PROXY_DEBUG
35800 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61  .**.**       Ena
35810 62 6c 65 73 20 74 68 65 20 6c 6f 67 67 69 6e 67  bles the logging
35820 20 6f 66 20 65 72 72 6f 72 20 6d 65 73 73 61 67   of error messag
35830 65 73 20 64 75 72 69 6e 67 20 68 6f 73 74 20 69  es during host i
35840 64 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20  d file.**       
35850 72 65 74 72 69 65 76 61 6c 20 61 6e 64 20 63 72  retrieval and cr
35860 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f  eation.**.**  LO
35870 43 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a  CKPROXYDIR.**.**
35880 20 20 20 20 20 20 20 4f 76 65 72 72 69 64 65 73         Overrides
35890 20 74 68 65 20 64 65 66 61 75 6c 74 20 64 69 72   the default dir
358a0 65 63 74 6f 72 79 20 75 73 65 64 20 66 6f 72 20  ectory used for 
358b0 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73  lock proxy files
358c0 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 61   that.**       a
358d0 72 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74  re named automat
358e0 69 63 61 6c 6c 79 20 76 69 61 20 74 68 65 20 22  ically via the "
358f0 3a 61 75 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a  :auto:" setting.
35900 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45  **.**  SQLITE_DE
35910 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50  FAULT_PROXYDIR_P
35920 45 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a  ERMISSIONS.**.**
35930 20 20 20 20 20 20 20 50 65 72 6d 69 73 73 69 6f         Permissio
35940 6e 73 20 74 6f 20 75 73 65 20 77 68 65 6e 20 63  ns to use when c
35950 72 65 61 74 69 6e 67 20 61 20 64 69 72 65 63 74  reating a direct
35960 6f 72 79 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ory for storing 
35970 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63  the.**       loc
35980 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f  k proxy files, o
35990 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 4c 4f  nly used when LO
359a0 43 4b 50 52 4f 58 59 44 49 52 20 69 73 20 6e 6f  CKPROXYDIR is no
359b0 74 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a  t set..**    .**
359c0 20 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69      .** As menti
359d0 6f 6e 65 64 20 61 62 6f 76 65 2c 20 77 68 65 6e  oned above, when
359e0 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53   compiled with S
359f0 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f  QLITE_PREFER_PRO
35a00 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73  XY_LOCKING,.** s
35a10 65 74 74 69 6e 67 20 74 68 65 20 65 6e 76 69 72  etting the envir
35a20 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20  onment variable 
35a30 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f  SQLITE_FORCE_PRO
35a40 58 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20  XY_LOCKING to 1 
35a50 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72  will.** force pr
35a60 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62  oxy locking to b
35a70 65 20 75 73 65 64 20 66 6f 72 20 65 76 65 72 79  e used for every
35a80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
35a90 70 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20  pened, and 0.** 
35aa0 77 69 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d  will force autom
35ab0 61 74 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69  atic proxy locki
35ac0 6e 67 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65  ng to be disable
35ad0 64 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61  d for all databa
35ae0 73 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78 70  se.** files (exp
35af0 6c 69 63 69 74 79 20 63 61 6c 6c 69 6e 67 20 74  licity calling t
35b00 68 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  he SQLITE_SET_LO
35b10 43 4b 50 52 4f 58 59 46 49 4c 45 20 70 72 61 67  CKPROXYFILE prag
35b20 6d 61 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f  ma or.** sqlite_
35b30 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49  file_control API
35b40 20 69 73 20 6e 6f 74 20 61 66 66 65 63 74 65 64   is not affected
35b50 20 62 79 20 53 51 4c 49 54 45 5f 46 4f 52 43 45   by SQLITE_FORCE
35b60 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e  _PROXY_LOCKING).
35b70 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79  .*/../*.** Proxy
35b80 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79   locking is only
35b90 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61   available on Ma
35ba0 63 4f 53 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66  cOSX .*/.#if def
35bb0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
35bc0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
35bd0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a  _LOCKING_STYLE..
35be0 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 4c  /*.** The proxyL
35bf0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 68 61  ockingContext ha
35c00 73 20 74 68 65 20 70 61 74 68 20 61 6e 64 20 66  s the path and f
35c10 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 66  ile structures f
35c20 6f 72 20 74 68 65 20 72 65 6d 6f 74 65 20 0a 2a  or the remote .*
35c30 2a 20 61 6e 64 20 6c 6f 63 61 6c 20 70 72 6f 78  * and local prox
35c40 79 20 66 69 6c 65 73 20 69 6e 20 69 74 0a 2a 2f  y files in it.*/
35c50 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
35c60 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
35c70 65 78 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  ext proxyLocking
35c80 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20  Context;.struct 
35c90 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
35ca0 65 78 74 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ext {.  unixFile
35cb0 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20   *conchFile;    
35cc0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e       /* Open con
35cd0 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  ch file */.  cha
35ce0 72 20 2a 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  r *conchFilePath
35cf0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ;         /* Nam
35d00 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66  e of the conch f
35d10 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ile */.  unixFil
35d20 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20 20 20  e *lockProxy;   
35d30 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 72        /* Open pr
35d40 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  oxy lock file */
35d50 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 72 6f  .  char *lockPro
35d60 78 79 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  xyPath;         
35d70 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70  /* Name of the p
35d80 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a  roxy lock file *
35d90 2f 0a 20 20 63 68 61 72 20 2a 64 62 50 61 74 68  /.  char *dbPath
35da0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35db0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
35dc0 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69  open file */.  i
35dd0 6e 74 20 63 6f 6e 63 68 48 65 6c 64 3b 20 20 20  nt conchHeld;   
35de0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
35df0 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73   if the conch is
35e00 20 68 65 6c 64 2c 20 2d 31 20 69 66 20 6c 6f 63   held, -1 if loc
35e10 6b 6c 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  kless */.  int n
35e20 46 61 69 6c 73 3b 20 20 20 20 20 20 20 20 20 20  Fails;          
35e30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
35e40 72 20 6f 66 20 63 6f 6e 63 68 20 74 61 6b 69 6e  r of conch takin
35e50 67 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20  g failures */.  
35e60 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e 67  void *oldLocking
35e70 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a 20  Context;     /* 
35e80 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67  Original locking
35e90 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73 74 6f  context to resto
35ea0 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 20  re on close */. 
35eb0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
35ec0 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c 64 4d  ods const *pOldM
35ed0 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20 4f 72  ethod;     /* Or
35ee0 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74 68 6f  iginal I/O metho
35ef0 64 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a 2f 0a  ds for close */.
35f00 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 70  };../* .** The p
35f10 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 70  roxy lock file p
35f20 61 74 68 20 66 6f 72 20 74 68 65 20 64 61 74 61  ath for the data
35f30 62 61 73 65 20 61 74 20 64 62 50 61 74 68 20 69  base at dbPath i
35f40 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6c  s written into l
35f50 50 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63 68 20  Path, .** which 
35f60 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 76 61  must point to va
35f70 6c 69 64 2c 20 77 72 69 74 61 62 6c 65 20 6d 65  lid, writable me
35f80 6d 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f 75 67  mory large enoug
35f90 68 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e 20 6c  h for a maxLen l
35fa0 65 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20 70 61  ength.** file pa
35fb0 74 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  th. .*/.static i
35fc0 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50  nt proxyGetLockP
35fd0 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ath(const char *
35fe0 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a 6c 50  dbPath, char *lP
35ff0 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61 78 4c  ath, size_t maxL
36000 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a  en){.  int len;.
36010 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20 20 69    int dbLen;.  i
36020 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 4c 4f  nt i;..#ifdef LO
36030 43 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c 65 6e  CKPROXYDIR.  len
36040 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68   = strlcpy(lPath
36050 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 2c 20  , LOCKPROXYDIR, 
36060 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a 23  maxLen);.#else.#
36070 20 69 66 64 65 66 20 5f 43 53 5f 44 41 52 57 49   ifdef _CS_DARWI
36080 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 0a  N_USER_TEMP_DIR.
36090 20 20 7b 0a 20 20 20 20 69 66 28 20 21 63 6f 6e    {.    if( !con
360a0 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f  fstr(_CS_DARWIN_
360b0 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 20 6c  USER_TEMP_DIR, l
360c0 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20 29 7b  Path, maxLen) ){
360d0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
360e0 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 66 61  "GETLOCKPATH  fa
360f0 69 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d 25 64  iled %s errno=%d
36100 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   pid=%d\n",.    
36110 20 20 20 20 20 20 20 20 20 20 20 6c 50 61 74 68             lPath
36120 2c 20 65 72 72 6e 6f 2c 20 67 65 74 70 69 64 28  , errno, getpid(
36130 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )));.      retur
36140 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
36150 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  OCK;.    }.    l
36160 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61  en = strlcat(lPa
36170 74 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f 63 6b  th, "sqliteplock
36180 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20 20 20  s", maxLen);    
36190 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20 6c 65  .  }.# else.  le
361a0 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74  n = strlcpy(lPat
361b0 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c  h, "/tmp/", maxL
361c0 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e  en);.# endif.#en
361d0 64 69 66 0a 0a 20 20 69 66 28 20 6c 50 61 74 68  dif..  if( lPath
361e0 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a  [len-1]!='/' ){.
361f0 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61      len = strlca
36200 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20 6d 61  t(lPath, "/", ma
36210 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  xLen);.  }.  .  
36220 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65  /* transform the
36230 20 64 62 20 70 61 74 68 20 74 6f 20 61 20 75 6e   db path to a un
36240 69 71 75 65 20 63 61 63 68 65 20 6e 61 6d 65 20  ique cache name 
36250 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28 69 6e  */.  dbLen = (in
36260 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29  t)strlen(dbPath)
36270 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c  ;.  for( i=0; i<
36280 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65 6e 2b  dbLen && (i+len+
36290 37 29 3c 28 69 6e 74 29 6d 61 78 4c 65 6e 3b 20  7)<(int)maxLen; 
362a0 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 63  i++){.    char c
362b0 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20   = dbPath[i];.  
362c0 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d    lPath[i+len] =
362d0 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b   (c=='/')?'_':c;
362e0 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69 2b 6c  .  }.  lPath[i+l
362f0 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74 72 6c  en]='\0';.  strl
36300 63 61 74 28 6c 50 61 74 68 2c 20 22 3a 61 75 74  cat(lPath, ":aut
36310 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20  o:", maxLen);.  
36320 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43  OSTRACE(("GETLOC
36330 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63  KPATH  proxy loc
36340 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64  k path=%s pid=%d
36350 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 67 65 74 70  \n", lPath, getp
36360 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  id()));.  return
36370 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
36380 2a 20 0a 20 2a 2a 20 43 72 65 61 74 65 73 20 74  * . ** Creates t
36390 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e 64  he lock file and
363a0 20 61 6e 79 20 6d 69 73 73 69 6e 67 20 64 69 72   any missing dir
363b0 65 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63 6b  ectories in lock
363c0 50 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63 20  Path. */.static 
363d0 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 4c  int proxyCreateL
363e0 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68  ockPath(const ch
363f0 61 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a 20  ar *lockPath){. 
36400 20 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20 63   int i, len;.  c
36410 68 61 72 20 62 75 66 5b 4d 41 58 50 41 54 48 4c  har buf[MAXPATHL
36420 45 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72 74  EN];.  int start
36430 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73 65 72   = 0;.  .  asser
36440 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c 4c  t(lockPath!=NULL
36450 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20 63  );.  /* try to c
36460 72 65 61 74 65 20 61 6c 6c 20 74 68 65 20 69 6e  reate all the in
36470 74 65 72 6d 65 64 69 61 74 65 20 64 69 72 65 63  termediate direc
36480 74 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e 20  tories */.  len 
36490 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c 6f  = (int)strlen(lo
364a0 63 6b 50 61 74 68 29 3b 0a 20 20 62 75 66 5b 30  ckPath);.  buf[0
364b0 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b  ] = lockPath[0];
364c0 0a 20 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c 6c  .  for( i=1; i<l
364d0 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 69  en; i++ ){.    i
364e0 66 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20 3d  f( lockPath[i] =
364f0 3d 20 27 2f 27 20 26 26 20 28 69 20 2d 20 73 74  = '/' && (i - st
36500 61 72 74 20 3e 20 30 29 20 29 7b 0a 20 20 20 20  art > 0) ){.    
36510 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72 20    /* only mkdir 
36520 69 66 20 6c 65 61 66 20 64 69 72 20 21 3d 20 22  if leaf dir != "
36530 2e 22 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e 2e  ." or "/" or "..
36540 22 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69  " */.      if( i
36550 2d 73 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d 73  -start>2 || (i-s
36560 74 61 72 74 3d 3d 31 20 26 26 20 62 75 66 5b 73  tart==1 && buf[s
36570 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20  tart] != '.' && 
36580 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2f  buf[start] != '/
36590 27 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ') .         || 
365a0 28 69 2d 73 74 61 72 74 3d 3d 32 20 26 26 20 62  (i-start==2 && b
365b0 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27  uf[start] != '.'
365c0 20 26 26 20 62 75 66 5b 73 74 61 72 74 2b 31 5d   && buf[start+1]
365d0 20 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20 20   != '.') ){.    
365e0 20 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27 3b      buf[i]='\0';
365f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 6b 64  .        if( mkd
36600 69 72 28 62 75 66 2c 20 53 51 4c 49 54 45 5f 44  ir(buf, SQLITE_D
36610 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
36620 50 45 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b 0a  PERMISSIONS) ){.
36630 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 65 72            int er
36640 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  r=errno;.       
36650 20 20 20 69 66 28 20 65 72 72 21 3d 45 45 58 49     if( err!=EEXI
36660 53 54 20 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ST ) {.         
36670 20 20 20 4f 53 54 52 41 43 45 28 28 22 43 52 45     OSTRACE(("CRE
36680 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 46 41 49  ATELOCKPATH  FAI
36690 4c 45 44 20 63 72 65 61 74 69 6e 67 20 25 73 2c  LED creating %s,
366a0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
366b0 20 20 20 20 20 20 20 20 22 27 25 73 27 20 70 72          "'%s' pr
366c0 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73  oxy lock path=%s
366d0 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   pid=%d\n",.    
366e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
366f0 20 62 75 66 2c 20 73 74 72 65 72 72 6f 72 28 65   buf, strerror(e
36700 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67  rr), lockPath, g
36710 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20 20  etpid()));.     
36720 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 65 72         return er
36730 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  r;.          }. 
36740 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
36750 0a 20 20 20 20 20 20 73 74 61 72 74 3d 69 2b 31  .      start=i+1
36760 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 75 66 5b  ;.    }.    buf[
36770 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 69 5d  i] = lockPath[i]
36780 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
36790 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48  ("CREATELOCKPATH
367a0 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74    proxy lock pat
367b0 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20  h=%s pid=%d\n", 
367c0 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64  lockPath, getpid
367d0 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ()));.  return 0
367e0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
367f0 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f  isProxyLockingMo
36800 64 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  de(unixFile *pFi
36810 6c 65 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 28  le) {.  return (
36820 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
36830 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64  = &proxyIoMethod
36840 73 29 20 3f 20 31 20 3a 20 30 3b 0a 7d 0a 0a 2f  s) ? 1 : 0;.}../
36850 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
36860 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 61  shared memory ba
36870 73 65 20 70 61 74 68 20 62 61 73 65 64 20 6f 6e  se path based on
36880 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20   the lock proxy 
36890 66 69 6c 65 20 69 66 20 74 68 65 20 0a 2a 2a 20  file if the .** 
368a0 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 20  lock proxy file 
368b0 69 73 20 68 6f 73 74 65 64 20 6f 6e 20 61 20 73  is hosted on a s
368c0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6d  hared memory com
368d0 70 61 74 69 62 6c 65 20 46 53 0a 2a 2f 0a 73 74  patible FS.*/.st
368e0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
368f0 2a 70 72 6f 78 79 53 68 61 72 65 64 4d 65 6d 6f  *proxySharedMemo
36900 72 79 42 61 73 65 50 61 74 68 28 75 6e 69 78 46  ryBasePath(unixF
36910 69 6c 65 20 2a 70 46 69 6c 65 29 20 7b 0a 20 20  ile *pFile) {.  
36920 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
36930 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 75 6e 69  ext *pCtx;.  uni
36940 78 46 69 6c 65 20 2a 70 4c 6f 63 6b 46 69 6c 65  xFile *pLockFile
36950 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 70 46  ;.  .  assert(pF
36960 69 6c 65 21 3d 4e 55 4c 4c 20 26 26 20 70 46 69  ile!=NULL && pFi
36970 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
36980 78 74 21 3d 4e 55 4c 4c 29 3b 0a 20 20 61 73 73  xt!=NULL);.  ass
36990 65 72 74 28 70 46 69 6c 65 2d 3e 70 4d 65 74 68  ert(pFile->pMeth
369a0 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65  od == &proxyIoMe
369b0 74 68 6f 64 73 29 3b 0a 20 20 70 43 74 78 20 3d  thods);.  pCtx =
369c0 20 28 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43   ((proxyLockingC
369d0 6f 6e 74 65 78 74 20 2a 29 28 70 46 69 6c 65 2d  ontext *)(pFile-
369e0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
369f0 29 3b 0a 20 20 70 4c 6f 63 6b 46 69 6c 65 20 3d  );.  pLockFile =
36a00 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
36a10 3b 0a 20 20 69 66 28 20 70 4c 6f 63 6b 46 69 6c  ;.  if( pLockFil
36a20 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 69 56 65 72  e->pMethod->iVer
36a30 73 69 6f 6e 3e 3d 32 20 26 26 20 70 4c 6f 63 6b  sion>=2 && pLock
36a40 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
36a50 53 68 6d 4d 61 70 21 3d 30 20 29 7b 0a 20 20 20  ShmMap!=0 ){.   
36a60 20 72 65 74 75 72 6e 20 70 43 74 78 2d 3e 6c 6f   return pCtx->lo
36a70 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 7d  ckProxyPath;.  }
36a80 0a 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  .  return NULL;.
36a90 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
36aa0 61 20 6e 65 77 20 56 46 53 20 66 69 6c 65 20 64  a new VFS file d
36ab0 65 73 63 72 69 70 74 6f 72 20 28 73 74 6f 72 65  escriptor (store
36ac0 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  d in memory obta
36ad0 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
36ae0 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64  ite3_malloc) and
36af0 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 6e   open the file n
36b00 61 6d 65 64 20 22 70 61 74 68 22 20 69 6e 20 74  amed "path" in t
36b10 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
36b20 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  or..**.** The ca
36b30 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
36b40 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72  ble not only for
36b50 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 66 69 6c   closing the fil
36b60 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20  e descriptor.** 
36b70 62 75 74 20 61 6c 73 6f 20 66 6f 72 20 66 72 65  but also for fre
36b80 65 69 6e 67 20 74 68 65 20 6d 65 6d 6f 72 79 20  eing the memory 
36b90 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
36ba0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
36bb0 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tor..*/.static i
36bc0 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e  nt proxyCreateUn
36bd0 69 78 46 69 6c 65 28 0a 20 20 20 20 63 6f 6e 73  ixFile(.    cons
36be0 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20  t char *path,   
36bf0 20 20 20 20 20 2f 2a 20 70 61 74 68 20 66 6f 72       /* path for
36c00 20 74 68 65 20 6e 65 77 20 75 6e 69 78 46 69 6c   the new unixFil
36c10 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78 46 69 6c  e */.    unixFil
36c20 65 20 2a 2a 70 70 46 69 6c 65 2c 20 20 20 20 20  e **ppFile,     
36c30 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 20 63 72    /* unixFile cr
36c40 65 61 74 65 64 20 61 6e 64 20 72 65 74 75 72 6e  eated and return
36c50 65 64 20 62 79 20 72 65 66 20 2a 2f 0a 20 20 20  ed by ref */.   
36c60 20 69 6e 74 20 69 73 6c 6f 63 6b 66 69 6c 65 20   int islockfile 
36c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20            /* if 
36c80 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73 73 69 6e 67  non zero missing
36c90 20 64 69 72 73 20 77 69 6c 6c 20 62 65 20 63 72   dirs will be cr
36ca0 65 61 74 65 64 20 2a 2f 0a 29 20 7b 0a 20 20 69  eated */.) {.  i
36cb0 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 75 6e  nt fd = -1;.  un
36cc0 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20  ixFile *pNew;.  
36cd0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
36ce0 4f 4b 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c  OK;.  int openFl
36cf0 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f  ags = O_RDWR | O
36d00 5f 43 52 45 41 54 3b 0a 20 20 73 71 6c 69 74 65  _CREAT;.  sqlite
36d10 33 5f 76 66 73 20 64 75 6d 6d 79 56 66 73 3b 0a  3_vfs dummyVfs;.
36d20 20 20 69 6e 74 20 74 65 72 72 6e 6f 20 3d 20 30    int terrno = 0
36d30 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
36d40 20 2a 70 55 6e 75 73 65 64 20 3d 20 4e 55 4c 4c   *pUnused = NULL
36d50 3b 0a 0a 20 20 2f 2a 20 31 2e 20 66 69 72 73 74  ;..  /* 1. first
36d60 20 74 72 79 20 74 6f 20 6f 70 65 6e 2f 63 72 65   try to open/cre
36d70 61 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20 2a  ate the file.  *
36d80 2a 20 32 2e 20 69 66 20 74 68 61 74 20 66 61 69  * 2. if that fai
36d90 6c 73 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20  ls, and this is 
36da0 61 20 6c 6f 63 6b 20 66 69 6c 65 20 28 6e 6f 74  a lock file (not
36db0 2d 63 6f 6e 63 68 29 2c 20 74 72 79 20 63 72 65  -conch), try cre
36dc0 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 70  ating.  ** the p
36dd0 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72 69 65  arent directorie
36de0 73 20 61 6e 64 20 74 68 65 6e 20 74 72 79 20 61  s and then try a
36df0 67 61 69 6e 2e 0a 20 20 2a 2a 20 33 2e 20 69 66  gain..  ** 3. if
36e00 20 74 68 61 74 20 66 61 69 6c 73 2c 20 74 72 79   that fails, try
36e10 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c   to open the fil
36e20 65 20 72 65 61 64 2d 6f 6e 6c 79 0a 20 20 2a 2a  e read-only.  **
36e30 20 6f 74 68 65 72 77 69 73 65 20 72 65 74 75 72   otherwise retur
36e40 6e 20 42 55 53 59 20 28 69 66 20 6c 6f 63 6b 20  n BUSY (if lock 
36e50 66 69 6c 65 29 20 6f 72 20 43 41 4e 54 4f 50 45  file) or CANTOPE
36e60 4e 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20  N for the conch 
36e70 66 69 6c 65 0a 20 20 2a 2f 0a 20 20 70 55 6e 75  file.  */.  pUnu
36e80 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62  sed = findReusab
36e90 6c 65 46 64 28 70 61 74 68 2c 20 6f 70 65 6e 46  leFd(path, openF
36ea0 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 70 55 6e  lags);.  if( pUn
36eb0 75 73 65 64 20 29 7b 0a 20 20 20 20 66 64 20 3d  used ){.    fd =
36ec0 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20   pUnused->fd;.  
36ed0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 55 6e 75 73  }else{.    pUnus
36ee0 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ed = sqlite3_mal
36ef0 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75  loc(sizeof(*pUnu
36f00 73 65 64 29 29 3b 0a 20 20 20 20 69 66 28 20 21  sed));.    if( !
36f10 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20  pUnused ){.     
36f20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
36f30 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
36f40 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
36f50 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
36f60 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  en(path, openFla
36f70 67 73 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  gs, SQLITE_DEFAU
36f80 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
36f90 4f 4e 53 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f  ONS);.    terrno
36fa0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66   = errno;.    if
36fb0 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( fd<0 && errno=
36fc0 3d 45 4e 4f 45 4e 54 20 26 26 20 69 73 6c 6f 63  =ENOENT && isloc
36fd0 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  kfile ){.      i
36fe0 66 28 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f  f( proxyCreateLo
36ff0 63 6b 50 61 74 68 28 70 61 74 68 29 20 3d 3d 20  ckPath(path) == 
37000 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
37010 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74       fd = robust
37020 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e  _open(path, open
37030 46 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45  Flags, SQLITE_DE
37040 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
37050 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20 7d  SSIONS);.      }
37060 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
37070 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6f 70 65   fd<0 ){.    ope
37080 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c  nFlags = O_RDONL
37090 59 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75  Y;.    fd = robu
370a0 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70  st_open(path, op
370b0 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f  enFlags, SQLITE_
370c0 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
370d0 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 74  MISSIONS);.    t
370e0 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  errno = errno;. 
370f0 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b   }.  if( fd<0 ){
37100 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
37110 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 20 20  e(pUnused);.    
37120 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29  if( islockfile )
37130 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
37140 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
37150 7d 0a 20 20 20 20 73 77 69 74 63 68 20 28 74 65  }.    switch (te
37160 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20 20 63 61  rrno) {.      ca
37170 73 65 20 45 41 43 43 45 53 3a 0a 20 20 20 20 20  se EACCES:.     
37180 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
37190 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 63 61 73  _PERM;.      cas
371a0 65 20 45 49 4f 3a 20 0a 20 20 20 20 20 20 20 20  e EIO: .        
371b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
371c0 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65  ERR_LOCK; /* eve
371d0 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 74  n though it is t
371e0 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20 20 20 20  he conch */.    
371f0 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
37200 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
37210 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
37220 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 70      }.  }.  .  p
37230 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  New = (unixFile 
37240 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
37250 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b  (sizeof(*pNew));
37260 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c  .  if( pNew==NUL
37270 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  L ){.    rc = SQ
37280 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
37290 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74 65 5f  goto end_create_
372a0 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d  proxy;.  }.  mem
372b0 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
372c0 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
372d0 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61 67    pNew->openFlag
372e0 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20  s = openFlags;. 
372f0 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 56 66   memset(&dummyVf
37300 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d  s, 0, sizeof(dum
37310 6d 79 56 66 73 29 29 3b 0a 20 20 64 75 6d 6d 79  myVfs));.  dummy
37320 56 66 73 2e 70 41 70 70 44 61 74 61 20 3d 20 28  Vfs.pAppData = (
37330 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49  void*)&autolockI
37340 6f 46 69 6e 64 65 72 3b 0a 20 20 64 75 6d 6d 79  oFinder;.  dummy
37350 56 66 73 2e 7a 4e 61 6d 65 20 3d 20 22 64 75 6d  Vfs.zName = "dum
37360 6d 79 22 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e  my";.  pUnused->
37370 66 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e 75 73  fd = fd;.  pUnus
37380 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70 65 6e  ed->flags = open
37390 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 70  Flags;.  pNew->p
373a0 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64  Unused = pUnused
373b0 3b 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c  ;.  .  rc = fill
373c0 49 6e 55 6e 69 78 46 69 6c 65 28 26 64 75 6d 6d  InUnixFile(&dumm
373d0 79 56 66 73 2c 20 66 64 2c 20 30 2c 20 28 73 71  yVfs, fd, 0, (sq
373e0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77  lite3_file*)pNew
373f0 2c 20 70 61 74 68 2c 20 30 2c 20 30 2c 20 30 29  , path, 0, 0, 0)
37400 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
37410 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70  TE_OK ){.    *pp
37420 46 69 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  File = pNew;.   
37430 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
37440 4b 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74  K;.  }.end_creat
37450 65 5f 70 72 6f 78 79 3a 20 20 20 20 0a 20 20 72  e_proxy:    .  r
37460 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
37470 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
37480 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
37490 70 4e 65 77 29 3b 0a 20 20 73 71 6c 69 74 65 33  pNew);.  sqlite3
374a0 5f 66 72 65 65 28 70 55 6e 75 73 65 64 29 3b 0a  _free(pUnused);.
374b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
374c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
374d0 53 54 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d  ST./* simulate m
374e0 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79  ultiple hosts by
374f0 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65   creating unique
37500 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74   hostid file pat
37510 68 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  hs */.int sqlite
37520 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30  3_hostid_num = 0
37530 3b 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ;.#endif..#defin
37540 65 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  e PROXY_HOSTIDLE
37550 4e 20 20 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63  N    16  /* conc
37560 68 20 66 69 6c 65 20 68 6f 73 74 20 69 64 20 6c  h file host id l
37570 65 6e 67 74 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74  ength */../* Not
37580 20 61 6c 77 61 79 73 20 64 65 66 69 6e 65 64 20   always defined 
37590 69 6e 20 74 68 65 20 68 65 61 64 65 72 73 20 61  in the headers a
375a0 73 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65  s it ought to be
375b0 20 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 67   */.extern int g
375c0 65 74 68 6f 73 74 75 75 69 64 28 75 75 69 64 5f  ethostuuid(uuid_
375d0 74 20 69 64 2c 20 63 6f 6e 73 74 20 73 74 72 75  t id, const stru
375e0 63 74 20 74 69 6d 65 73 70 65 63 20 2a 77 61 69  ct timespec *wai
375f0 74 29 3b 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20  t);../* get the 
37600 68 6f 73 74 20 49 44 20 76 69 61 20 67 65 74 68  host ID via geth
37610 6f 73 74 75 75 69 64 28 29 2c 20 70 48 6f 73 74  ostuuid(), pHost
37620 49 44 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ID must point to
37630 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
37640 20 0a 2a 2a 20 62 79 74 65 73 20 6f 66 20 77 72   .** bytes of wr
37650 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a  itable memory..*
37660 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
37670 78 79 47 65 74 48 6f 73 74 49 44 28 75 6e 73 69  xyGetHostID(unsi
37680 67 6e 65 64 20 63 68 61 72 20 2a 70 48 6f 73 74  gned char *pHost
37690 49 44 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72 29  ID, int *pError)
376a0 7b 0a 20 20 61 73 73 65 72 74 28 50 52 4f 58 59  {.  assert(PROXY
376b0 5f 48 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69  _HOSTIDLEN == si
376c0 7a 65 6f 66 28 75 75 69 64 5f 74 29 29 3b 0a 20  zeof(uuid_t));. 
376d0 20 6d 65 6d 73 65 74 28 70 48 6f 73 74 49 44 2c   memset(pHostID,
376e0 20 30 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44   0, PROXY_HOSTID
376f0 4c 45 4e 29 3b 0a 23 69 66 20 48 41 56 45 5f 47  LEN);.#if HAVE_G
37700 45 54 48 4f 53 54 55 55 49 44 0a 20 20 7b 0a 20  ETHOSTUUID.  {. 
37710 20 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70     struct timesp
37720 65 63 20 74 69 6d 65 6f 75 74 20 3d 20 7b 31 2c  ec timeout = {1,
37730 20 30 7d 3b 20 2f 2a 20 31 20 73 65 63 20 74 69   0}; /* 1 sec ti
37740 6d 65 6f 75 74 20 2a 2f 0a 20 20 20 20 0a 20 20  meout */.    .  
37750 20 20 69 66 28 20 67 65 74 68 6f 73 74 75 75 69    if( gethostuui
37760 64 28 70 48 6f 73 74 49 44 2c 20 26 74 69 6d 65  d(pHostID, &time
37770 6f 75 74 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  out) ){.      in
37780 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20  t err = errno;. 
37790 20 20 20 20 20 69 66 28 20 70 45 72 72 6f 72 20       if( pError 
377a0 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 45 72 72  ){.        *pErr
377b0 6f 72 20 3d 20 65 72 72 3b 0a 20 20 20 20 20 20  or = err;.      
377c0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
377d0 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
377e0 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55   }.  }.#else.  U
377f0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
37800 70 45 72 72 6f 72 29 3b 0a 23 65 6e 64 69 66 0a  pError);.#endif.
37810 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
37820 53 54 0a 20 20 2f 2a 20 73 69 6d 75 6c 61 74 65  ST.  /* simulate
37830 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20   multiple hosts 
37840 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71  by creating uniq
37850 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70  ue hostid file p
37860 61 74 68 73 20 2a 2f 0a 20 20 69 66 28 20 73 71  aths */.  if( sq
37870 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
37880 20 21 3d 20 30 29 7b 0a 20 20 20 20 70 48 6f 73   != 0){.    pHos
37890 74 49 44 5b 30 5d 20 3d 20 28 63 68 61 72 29 28  tID[0] = (char)(
378a0 70 48 6f 73 74 49 44 5b 30 5d 20 2b 20 28 63 68  pHostID[0] + (ch
378b0 61 72 29 28 73 71 6c 69 74 65 33 5f 68 6f 73 74  ar)(sqlite3_host
378c0 69 64 5f 6e 75 6d 20 26 20 30 78 46 46 29 29 3b  id_num & 0xFF));
378d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
378e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
378f0 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e  K;.}../* The con
37900 63 68 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  ch file contains
37910 20 74 68 65 20 68 65 61 64 65 72 2c 20 68 6f 73   the header, hos
37920 74 20 69 64 20 61 6e 64 20 6c 6f 63 6b 20 66 69  t id and lock fi
37930 6c 65 20 70 61 74 68 0a 20 2a 2f 0a 23 64 65 66  le path. */.#def
37940 69 6e 65 20 50 52 4f 58 59 5f 43 4f 4e 43 48 56  ine PROXY_CONCHV
37950 45 52 53 49 4f 4e 20 32 20 20 20 2f 2a 20 31 2d  ERSION 2   /* 1-
37960 62 79 74 65 20 68 65 61 64 65 72 2c 20 31 36 2d  byte header, 16-
37970 62 79 74 65 20 68 6f 73 74 20 69 64 2c 20 70 61  byte host id, pa
37980 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  th */.#define PR
37990 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 20 20 20  OXY_HEADERLEN   
379a0 20 31 20 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69   1   /* conch fi
379b0 6c 65 20 68 65 61 64 65 72 20 6c 65 6e 67 74 68  le header length
379c0 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58   */.#define PROX
379d0 59 5f 50 41 54 48 49 4e 44 45 58 20 20 20 20 28  Y_PATHINDEX    (
379e0 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b  PROXY_HEADERLEN+
379f0 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
37a00 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 4d  .#define PROXY_M
37a10 41 58 43 4f 4e 43 48 4c 45 4e 20 20 28 50 52 4f  AXCONCHLEN  (PRO
37a20 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f  XY_HEADERLEN+PRO
37a30 58 59 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d 41 58  XY_HOSTIDLEN+MAX
37a40 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a  PATHLEN)../* .**
37a50 20 54 61 6b 65 73 20 61 6e 20 6f 70 65 6e 20 63   Takes an open c
37a60 6f 6e 63 68 20 66 69 6c 65 2c 20 63 6f 70 69 65  onch file, copie
37a70 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 74  s the contents t
37a80 6f 20 61 20 6e 65 77 20 70 61 74 68 20 61 6e 64  o a new path and
37a90 20 74 68 65 6e 20 6d 6f 76 65 73 20 0a 2a 2a 20   then moves .** 
37aa0 69 74 20 62 61 63 6b 2e 20 20 54 68 65 20 6e 65  it back.  The ne
37ab0 77 6c 79 20 63 72 65 61 74 65 64 20 66 69 6c 65  wly created file
37ac0 27 73 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  's file descript
37ad0 6f 72 20 69 73 20 61 73 73 69 67 6e 65 64 20 74  or is assigned t
37ae0 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 63 68 20 66  o the.** conch f
37af0 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ile structure an
37b00 64 20 66 69 6e 61 6c 6c 79 20 74 68 65 20 6f 72  d finally the or
37b10 69 67 69 6e 61 6c 20 63 6f 6e 63 68 20 66 69 6c  iginal conch fil
37b20 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
37b30 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20 20 52 65 74  .** closed.  Ret
37b40 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 73 75 63  urns zero if suc
37b50 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74 61 74  cessful..*/.stat
37b60 69 63 20 69 6e 74 20 70 72 6f 78 79 42 72 65 61  ic int proxyBrea
37b70 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46  kConchLock(unixF
37b80 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64  ile *pFile, uuid
37b90 5f 74 20 6d 79 48 6f 73 74 49 44 29 7b 0a 20 20  _t myHostID){.  
37ba0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
37bb0 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
37bc0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
37bd0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
37be0 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69  gContext; .  uni
37bf0 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
37c00 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
37c10 6c 65 3b 0a 20 20 63 68 61 72 20 74 50 61 74 68  le;.  char tPath
37c20 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20  [MAXPATHLEN];.  
37c30 63 68 61 72 20 62 75 66 5b 50 52 4f 58 59 5f 4d  char buf[PROXY_M
37c40 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 63  AXCONCHLEN];.  c
37c50 68 61 72 20 2a 63 50 61 74 68 20 3d 20 70 43 74  har *cPath = pCt
37c60 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
37c70 3b 0a 20 20 73 69 7a 65 5f 74 20 72 65 61 64 4c  ;.  size_t readL
37c80 65 6e 20 3d 20 30 3b 0a 20 20 73 69 7a 65 5f 74  en = 0;.  size_t
37c90 20 70 61 74 68 4c 65 6e 20 3d 20 30 3b 0a 20 20   pathLen = 0;.  
37ca0 63 68 61 72 20 65 72 72 6d 73 67 5b 36 34 5d 20  char errmsg[64] 
37cb0 3d 20 22 22 3b 0a 20 20 69 6e 74 20 66 64 20 3d  = "";.  int fd =
37cc0 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   -1;.  int rc = 
37cd0 2d 31 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  -1;.  UNUSED_PAR
37ce0 41 4d 45 54 45 52 28 6d 79 48 6f 73 74 49 44 29  AMETER(myHostID)
37cf0 3b 0a 0a 20 20 2f 2a 20 63 72 65 61 74 65 20 61  ;..  /* create a
37d00 20 6e 65 77 20 70 61 74 68 20 62 79 20 72 65 70   new path by rep
37d10 6c 61 63 65 20 74 68 65 20 74 72 61 69 6c 69 6e  lace the trailin
37d20 67 20 27 2d 63 6f 6e 63 68 27 20 77 69 74 68 20  g '-conch' with 
37d30 27 2d 62 72 65 61 6b 27 20 2a 2f 0a 20 20 70 61  '-break' */.  pa
37d40 74 68 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28  thLen = strlcpy(
37d50 74 50 61 74 68 2c 20 63 50 61 74 68 2c 20 4d 41  tPath, cPath, MA
37d60 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 69 66 28  XPATHLEN);.  if(
37d70 20 70 61 74 68 4c 65 6e 3e 4d 41 58 50 41 54 48   pathLen>MAXPATH
37d80 4c 45 4e 20 7c 7c 20 70 61 74 68 4c 65 6e 3c 36  LEN || pathLen<6
37d90 20 7c 7c 20 0a 20 20 20 20 20 28 73 74 72 6c 63   || .     (strlc
37da0 70 79 28 26 74 50 61 74 68 5b 70 61 74 68 4c 65  py(&tPath[pathLe
37db0 6e 2d 35 5d 2c 20 22 62 72 65 61 6b 22 2c 20 36  n-5], "break", 6
37dc0 29 20 21 3d 20 35 29 20 29 7b 0a 20 20 20 20 73  ) != 5) ){.    s
37dd0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
37de0 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65  sizeof(errmsg),e
37df0 72 72 6d 73 67 2c 22 70 61 74 68 20 65 72 72 6f  rrmsg,"path erro
37e00 72 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74  r (len %d)",(int
37e10 29 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 67  )pathLen);.    g
37e20 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
37e30 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 72 65 61 64  k;.  }.  /* read
37e40 20 74 68 65 20 63 6f 6e 63 68 20 63 6f 6e 74 65   the conch conte
37e50 6e 74 20 2a 2f 0a 20 20 72 65 61 64 4c 65 6e 20  nt */.  readLen 
37e60 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e 63 68 46  = osPread(conchF
37e70 69 6c 65 2d 3e 68 2c 20 62 75 66 2c 20 50 52 4f  ile->h, buf, PRO
37e80 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20  XY_MAXCONCHLEN, 
37e90 30 29 3b 0a 20 20 69 66 28 20 72 65 61 64 4c 65  0);.  if( readLe
37ea0 6e 3c 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  n<PROXY_PATHINDE
37eb0 58 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  X ){.    sqlite3
37ec0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
37ed0 28 65 72 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c  (errmsg),errmsg,
37ee0 22 72 65 61 64 20 65 72 72 6f 72 20 28 6c 65 6e  "read error (len
37ef0 20 25 64 29 22 2c 28 69 6e 74 29 72 65 61 64 4c   %d)",(int)readL
37f00 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  en);.    goto en
37f10 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
37f20 0a 20 20 2f 2a 20 77 72 69 74 65 20 69 74 20 6f  .  /* write it o
37f30 75 74 20 74 6f 20 74 68 65 20 74 65 6d 70 6f 72  ut to the tempor
37f40 61 72 79 20 62 72 65 61 6b 20 66 69 6c 65 20 2a  ary break file *
37f50 2f 0a 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f  /.  fd = robust_
37f60 6f 70 65 6e 28 74 50 61 74 68 2c 20 28 4f 5f 52  open(tPath, (O_R
37f70 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58  DWR|O_CREAT|O_EX
37f80 43 4c 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  CL),.           
37f90 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
37fa0 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
37fb0 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66 28 20  ISSIONS);.  if( 
37fc0 66 64 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  fd<0 ){.    sqli
37fd0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
37fe0 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72  eof(errmsg), err
37ff0 6d 73 67 2c 20 22 63 72 65 61 74 65 20 66 61 69  msg, "create fai
38000 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f  led (%d)", errno
38010 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
38020 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  breaklock;.  }. 
38030 20 69 66 28 20 6f 73 50 77 72 69 74 65 28 66 64   if( osPwrite(fd
38040 2c 20 62 75 66 2c 20 72 65 61 64 4c 65 6e 2c 20  , buf, readLen, 
38050 30 29 20 21 3d 20 28 73 73 69 7a 65 5f 74 29 72  0) != (ssize_t)r
38060 65 61 64 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71  eadLen ){.    sq
38070 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
38080 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65  izeof(errmsg), e
38090 72 72 6d 73 67 2c 20 22 77 72 69 74 65 20 66 61  rrmsg, "write fa
380a0 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e  iled (%d)", errn
380b0 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  o);.    goto end
380c0 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a  _breaklock;.  }.
380d0 20 20 69 66 28 20 72 65 6e 61 6d 65 28 74 50 61    if( rename(tPa
380e0 74 68 2c 20 63 50 61 74 68 29 20 29 7b 0a 20 20  th, cPath) ){.  
380f0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
38100 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67  tf(sizeof(errmsg
38110 29 2c 20 65 72 72 6d 73 67 2c 20 22 72 65 6e 61  ), errmsg, "rena
38120 6d 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c  me failed (%d)",
38130 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74   errno);.    got
38140 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
38150 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20  .  }.  rc = 0;. 
38160 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
38170 20 22 62 72 6f 6b 65 20 73 74 61 6c 65 20 6c 6f   "broke stale lo
38180 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20 63 50 61  ck on %s\n", cPa
38190 74 68 29 3b 0a 20 20 72 6f 62 75 73 74 5f 63 6c  th);.  robust_cl
381a0 6f 73 65 28 70 46 69 6c 65 2c 20 63 6f 6e 63 68  ose(pFile, conch
381b0 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f  File->h, __LINE_
381c0 5f 29 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d  _);.  conchFile-
381d0 3e 68 20 3d 20 66 64 3b 0a 20 20 63 6f 6e 63 68  >h = fd;.  conch
381e0 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  File->openFlags 
381f0 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45  = O_RDWR | O_CRE
38200 41 54 3b 0a 0a 65 6e 64 5f 62 72 65 61 6b 6c 6f  AT;..end_breaklo
38210 63 6b 3a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  ck:.  if( rc ){.
38220 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b      if( fd>=0 ){
38230 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  .      osUnlink(
38240 74 50 61 74 68 29 3b 0a 20 20 20 20 20 20 72 6f  tPath);.      ro
38250 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
38260 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
38270 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
38280 74 66 28 73 74 64 65 72 72 2c 20 22 66 61 69 6c  tf(stderr, "fail
38290 65 64 20 74 6f 20 62 72 65 61 6b 20 73 74 61 6c  ed to break stal
382a0 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c 20 25 73  e lock on %s, %s
382b0 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65 72 72 6d  \n", cPath, errm
382c0 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sg);.  }.  retur
382d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65  n rc;.}../* Take
382e0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
382f0 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68  ock on the conch
38300 20 66 69 6c 65 20 61 6e 64 20 62 72 65 61 6b 20   file and break 
38310 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20 69 66 20  a stale lock if 
38320 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 69 64 20  the .** host id 
38330 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74  matches..*/.stat
38340 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6f 6e 63  ic int proxyConc
38350 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a  hLock(unixFile *
38360 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79  pFile, uuid_t my
38370 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c 6f 63 6b  HostID, int lock
38380 54 79 70 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f  Type){.  proxyLo
38390 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
383a0 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
383b0 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
383c0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
383d0 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  t; .  unixFile *
383e0 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78  conchFile = pCtx
383f0 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 69  ->conchFile;.  i
38400 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
38410 4b 3b 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  K;.  struct time
38420 73 70 65 63 20 63 6f 6e 63 68 4d 6f 64 54 69 6d  spec conchModTim
38430 65 3b 0a 20 20 0a 20 20 6d 65 6d 73 65 74 28 26  e;.  .  memset(&
38440 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2c 20 30 2c  conchModTime, 0,
38450 20 73 69 7a 65 6f 66 28 63 6f 6e 63 68 4d 6f 64   sizeof(conchMod
38460 54 69 6d 65 29 29 3b 0a 20 20 64 6f 20 7b 0a 20  Time));.  do {. 
38470 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c     rc = conchFil
38480 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63  e->pMethod->xLoc
38490 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
384a0 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b  )conchFile, lock
384b0 54 79 70 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Type);.    if( r
384c0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
384d0 7b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 6e 46  {.      pCtx->nF
384e0 61 69 6c 73 20 2b 2b 3b 0a 20 20 20 20 20 20 2f  ails ++;.      /
384f0 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 66 61  * If the lock fa
38500 69 6c 65 64 20 28 62 75 73 79 29 3a 0a 20 20 20  iled (busy):.   
38510 20 20 20 20 2a 20 31 73 74 20 74 72 79 3a 20 67      * 1st try: g
38520 65 74 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20  et the mod time 
38530 6f 66 20 74 68 65 20 63 6f 6e 63 68 2c 20 77 61  of the conch, wa
38540 69 74 20 30 2e 35 73 20 61 6e 64 20 74 72 79 20  it 0.5s and try 
38550 61 67 61 69 6e 2e 20 0a 20 20 20 20 20 20 20 2a  again. .       *
38560 20 32 6e 64 20 74 72 79 3a 20 66 61 69 6c 20 69   2nd try: fail i
38570 66 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 63  f the mod time c
38580 68 61 6e 67 65 64 20 6f 72 20 68 6f 73 74 20 69  hanged or host i
38590 64 20 69 73 20 64 69 66 66 65 72 65 6e 74 2c 20  d is different, 
385a0 77 61 69 74 20 0a 20 20 20 20 20 20 20 2a 20 20  wait .       *  
385b0 20 20 20 20 20 20 20 20 20 31 30 20 73 65 63