/ Hex Artifact Content
Login

Artifact df8e43477f40ddcf707a9f3fabf7a970b7a5c157:


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 73 74 61 6e 64 61 72  f../*.** standar
0b40: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
0b50: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0b60: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0b70: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0b80: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0b90: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e  .h>.#include <un
0ba0: 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  istd.h>.#include
0bb0: 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75   <time.h>.#inclu
0bc0: 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
0bd0: 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e  #include <errno.
0be0: 68 3e 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  h>.#if !defined(
0bf0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
0c00: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
0c10: 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 69 6e 63  MAP_SIZE>0.# inc
0c20: 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68  lude <sys/mman.h
0c30: 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  >.#endif..#if SQ
0c40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0c50: 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c  ING_STYLE.# incl
0c60: 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68  ude <sys/ioctl.h
0c70: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 75 69  >.# include <uui
0c80: 64 2f 75 75 69 64 2e 68 3e 0a 23 20 69 6e 63 6c  d/uuid.h>.# incl
0c90: 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e  ude <sys/file.h>
0ca0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  .# include <sys/
0cb0: 70 61 72 61 6d 2e 68 3e 0a 23 65 6e 64 69 66 20  param.h>.#endif 
0cc0: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
0cd0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
0ce0: 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  /..#if defined(_
0cf0: 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 28 28 5f  _APPLE__) && ((_
0d00: 5f 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f  _MAC_OS_X_VERSIO
0d10: 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 20 3e  N_MIN_REQUIRED >
0d20: 20 31 30 35 30 29 20 7c 7c 20 5c 0a 20 20 20 20   1050) || \.    
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 20 20 20 20 28 5f 5f 49 50 48 4f 4e 45         (__IPHONE
0d50: 5f 4f 53 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f  _OS_VERSION_MIN_
0d60: 52 45 51 55 49 52 45 44 20 3e 20 32 30 30 30 29  REQUIRED > 2000)
0d70: 29 0a 23 20 20 69 66 20 28 21 64 65 66 69 6e 65  ).#  if (!define
0d80: 64 28 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45  d(TARGET_OS_EMBE
0d90: 44 44 45 44 29 20 7c 7c 20 28 54 41 52 47 45 54  DDED) || (TARGET
0da0: 5f 4f 53 5f 45 4d 42 45 44 44 45 44 3d 3d 30 29  _OS_EMBEDDED==0)
0db0: 29 20 5c 0a 20 20 20 20 20 20 20 26 26 20 28 21  ) \.       && (!
0dc0: 64 65 66 69 6e 65 64 28 54 41 52 47 45 54 5f 49  defined(TARGET_I
0dd0: 50 48 4f 4e 45 5f 53 49 4d 55 4c 41 54 4f 52 29  PHONE_SIMULATOR)
0de0: 20 7c 7c 20 28 54 41 52 47 45 54 5f 49 50 48 4f   || (TARGET_IPHO
0df0: 4e 45 5f 53 49 4d 55 4c 41 54 4f 52 3d 3d 30 29  NE_SIMULATOR==0)
0e00: 29 0a 23 20 20 20 20 64 65 66 69 6e 65 20 48 41  ).#    define HA
0e10: 56 45 5f 47 45 54 48 4f 53 54 55 55 49 44 20 31  VE_GETHOSTUUID 1
0e20: 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 77 61  .#  else.#    wa
0e30: 72 6e 69 6e 67 20 22 67 65 74 68 6f 73 74 75 75  rning "gethostuu
0e40: 69 64 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  id() is disabled
0e50: 2e 22 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64  .".#  endif.#end
0e60: 69 66 0a 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f  if...#if OS_VXWO
0e70: 52 4b 53 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  RKS.# include <s
0e80: 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e  ys/ioctl.h>.# in
0e90: 63 6c 75 64 65 20 3c 73 65 6d 61 70 68 6f 72 65  clude <semaphore
0ea0: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 6c  .h>.# include <l
0eb0: 69 6d 69 74 73 2e 68 3e 0a 23 65 6e 64 69 66 20  imits.h>.#endif 
0ec0: 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
0ed0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
0ee0: 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49  APPLE__) || SQLI
0ef0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
0f00: 47 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64  G_STYLE.# includ
0f10: 65 20 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a  e <sys/mount.h>.
0f20: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 48  #endif..#ifdef H
0f30: 41 56 45 5f 55 54 49 4d 45 0a 23 20 69 6e 63 6c  AVE_UTIME.# incl
0f40: 75 64 65 20 3c 75 74 69 6d 65 2e 68 3e 0a 23 65  ude <utime.h>.#e
0f50: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ndif../*.** Allo
0f60: 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e  wed values of un
0f70: 69 78 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a  ixFile.fsFlags.*
0f80: 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  /.#define SQLITE
0f90: 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f  _FSFLAGS_IS_MSDO
0fa0: 53 20 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a  S     0x1../*.**
0fb0: 20 49 66 20 77 65 20 61 72 65 20 74 6f 20 62 65   If we are to be
0fc0: 20 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e   thread-safe, in
0fd0: 63 6c 75 64 65 20 74 68 65 20 70 74 68 72 65 61  clude the pthrea
0fe0: 64 73 20 68 65 61 64 65 72 20 61 6e 64 20 64 65  ds header and de
0ff0: 66 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49  fine.** the SQLI
1000: 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20  TE_UNIX_THREADS 
1010: 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51  macro..*/.#if SQ
1020: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
1030: 23 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65  # include <pthre
1040: 61 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53  ad.h>.# define S
1050: 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
1060: 44 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  DS 1.#endif../*.
1070: 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69  ** Default permi
1080: 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61  ssions when crea
1090: 74 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a  ting a new file.
10a0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
10b0: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
10c0: 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66  ERMISSIONS.# def
10d0: 69 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  ine SQLITE_DEFAU
10e0: 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
10f0: 4f 4e 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a  ONS 0644.#endif.
1100: 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70  ./*.** Default p
1110: 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20  ermissions when 
1120: 63 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72  creating auto pr
1130: 6f 78 79 20 64 69 72 0a 2a 2f 0a 23 69 66 6e 64  oxy dir.*/.#ifnd
1140: 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
1150: 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
1160: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
1170: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
1180: 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
1190: 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a  ONS 0755.#endif.
11a0: 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73  ./*.** Maximum s
11b0: 75 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65  upported path-le
11c0: 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ngth..*/.#define
11d0: 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31   MAX_PATHNAME 51
11e0: 32 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d  2../*.** Maximum
11f0: 20 73 75 70 70 6f 72 74 65 64 20 73 79 6d 62 6f   supported symbo
1200: 6c 69 63 20 6c 69 6e 6b 73 0a 2a 2f 0a 23 64 65  lic links.*/.#de
1210: 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f  fine SQLITE_MAX_
1220: 53 59 4d 4c 49 4e 4b 53 20 31 30 30 0a 0a 2f 2a  SYMLINKS 100../*
1230: 20 41 6c 77 61 79 73 20 63 61 73 74 20 74 68 65   Always cast the
1240: 20 67 65 74 70 69 64 28 29 20 72 65 74 75 72 6e   getpid() return
1250: 20 74 79 70 65 20 66 6f 72 20 63 6f 6d 70 61 74   type for compat
1260: 69 62 69 6c 69 74 79 20 77 69 74 68 0a 2a 2a 20  ibility with.** 
1270: 6b 65 72 6e 65 6c 20 6d 6f 64 75 6c 65 73 20 69  kernel modules i
1280: 6e 20 56 78 57 6f 72 6b 73 2e 20 2a 2f 0a 23 64  n VxWorks. */.#d
1290: 65 66 69 6e 65 20 6f 73 47 65 74 70 69 64 28 58  efine osGetpid(X
12a0: 29 20 28 70 69 64 5f 74 29 67 65 74 70 69 64 28  ) (pid_t)getpid(
12b0: 29 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65  )../*.** Only se
12c0: 74 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  t the lastErrno 
12d0: 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  if the error cod
12e0: 65 20 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f  e is a real erro
12f0: 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20  r and not .** a 
1300: 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20  normal expected 
1310: 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53  return code of S
1320: 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51  QLITE_BUSY or SQ
1330: 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69  LITE_OK.*/.#defi
1340: 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  ne IS_LOCK_ERROR
1350: 28 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49  (x)  ((x != SQLI
1360: 54 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20  TE_OK) && (x != 
1370: 53 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f  SQLITE_BUSY))../
1380: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
1390: 6e 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20  nces */.typedef 
13a0: 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75  struct unixShm u
13b0: 6e 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20  nixShm;         
13c0: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
13d0: 69 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ion shared memor
13e0: 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  y */.typedef str
13f0: 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
1400: 75 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20  unixShmNode;    
1410: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
1420: 6f 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a  ory instance */.
1430: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75  typedef struct u
1440: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69  nixInodeInfo uni
1450: 78 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a  xInodeInfo;   /*
1460: 20 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79   An i-node */.ty
1470: 70 65 64 65 66 20 73 74 72 75 63 74 20 55 6e 69  pedef struct Uni
1480: 78 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e  xUnusedFd UnixUn
1490: 75 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41  usedFd;     /* A
14a0: 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
14b0: 73 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a  scriptor */../*.
14c0: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66  ** Sometimes, af
14d0: 74 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c  ter a file handl
14e0: 65 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53  e is closed by S
14f0: 51 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20  QLite, the file 
1500: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61  descriptor.** ca
1510: 6e 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69  nnot be closed i
1520: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74  mmediately. In t
1530: 68 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74  hese cases, inst
1540: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c  ances of the fol
1550: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74  lowing.** struct
1560: 75 72 65 20 61 72 65 20 75 73 65 64 20 74 6f 20  ure are used to 
1570: 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64  store the file d
1580: 65 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20  escriptor while 
1590: 77 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a  waiting for an.*
15a0: 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  * opportunity to
15b0: 20 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72   either close or
15c0: 20 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74   reuse it..*/.st
15d0: 72 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46  ruct UnixUnusedF
15e0: 64 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20  d {.  int fd;   
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
1610: 6f 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20  or to close */. 
1620: 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20   int flags;     
1630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
1640: 61 67 73 20 74 68 69 73 20 66 69 6c 65 20 64 65  ags this file de
1650: 73 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65  scriptor was ope
1660: 6e 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e  ned with */.  Un
1670: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78  ixUnusedFd *pNex
1680: 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  t;      /* Next 
1690: 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
16a0: 72 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66  riptor on same f
16b0: 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ile */.};../*.**
16c0: 20 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   The unixFile st
16d0: 72 75 63 74 75 72 65 20 69 73 20 73 75 62 63 6c  ructure is subcl
16e0: 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66  ass of sqlite3_f
16f0: 69 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f 20  ile specific to 
1700: 74 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20  the unix.** VFS 
1710: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e  implementations.
1720: 0a 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 46 69 6c 65 20 75 6e 69 78  ct unixFile unix
1740: 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69  File;.struct uni
1750: 78 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65  xFile {.  sqlite
1760: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e  3_io_methods con
1770: 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a  st *pMethod;  /*
1780: 20 41 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   Always the firs
1790: 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c  t entry */.  sql
17a0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c0: 20 2f 2a 20 54 68 65 20 56 46 53 20 74 68 61 74   /* The VFS that
17d0: 20 63 72 65 61 74 65 64 20 74 68 69 73 20 75 6e   created this un
17e0: 69 78 46 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  ixFile */.  unix
17f0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
1800: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1810: 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f  /* Info about lo
1820: 63 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64  cks on this inod
1830: 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20  e */.  int h;   
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1850: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1860: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1870: 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
1880: 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20  char eFileLock; 
1890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
18a0: 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68  e type of lock h
18b0: 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a  eld on this fd *
18c0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 68 6f  /.  unsigned sho
18d0: 72 74 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73  rt int ctrlFlags
18e0: 3b 20 20 20 20 20 20 20 2f 2a 20 42 65 68 61 76  ;       /* Behav
18f0: 69 6f 72 61 6c 20 62 69 74 73 2e 20 20 55 4e 49  ioral bits.  UNI
1900: 58 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f  XFILE_* flags */
1910: 0a 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f  .  int lastErrno
1920: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1930: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
1940: 69 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61  ix errno from la
1950: 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a  st I/O error */.
1960: 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43    void *lockingC
1970: 6f 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20  ontext;         
1980: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67        /* Locking
1990: 20 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20   style specific 
19a0: 73 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55  state */.  UnixU
19b0: 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
19c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
19d0: 2a 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20  * Pre-allocated 
19e0: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a  UnixUnusedFd */.
19f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1a00: 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ath;            
1a10: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1a20: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75   the file */.  u
1a30: 6e 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20  nixShm *pShm;   
1a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a50: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
1a60: 6f 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f  ory segment info
1a70: 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  rmation */.  int
1a80: 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20   szChunk;       
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62   /* Configured b
1ab0: 79 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  y FCNTL_CHUNK_SI
1ac0: 5a 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  ZE */.#if SQLITE
1ad0: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1ae0: 0a 20 20 69 6e 74 20 6e 46 65 74 63 68 4f 75 74  .  int nFetchOut
1af0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b00: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1b10: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
1b20: 78 46 65 74 63 68 20 72 65 66 73 20 2a 2f 0a 20  xFetch refs */. 
1b30: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d   sqlite3_int64 m
1b40: 6d 61 70 53 69 7a 65 3b 20 20 20 20 20 20 20 20  mapSize;        
1b50: 20 20 20 20 20 2f 2a 20 55 73 61 62 6c 65 20 73       /* Usable s
1b60: 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61  ize of mapping a
1b70: 74 20 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a  t pMapRegion */.
1b80: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1b90: 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3b 20  mmapSizeActual; 
1ba0: 20 20 20 20 20 20 2f 2a 20 41 63 74 75 61 6c 20        /* Actual 
1bb0: 73 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20  size of mapping 
1bc0: 61 74 20 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f  at pMapRegion */
1bd0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1be0: 20 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 20 20 20   mmapSizeMax;   
1bf0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67         /* Config
1c00: 75 72 65 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f  ured FCNTL_MMAP_
1c10: 53 49 5a 45 20 76 61 6c 75 65 20 2a 2f 0a 20 20  SIZE value */.  
1c20: 76 6f 69 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e  void *pMapRegion
1c30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c40: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61      /* Memory ma
1c50: 70 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23  pped region */.#
1c60: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 51  endif.#ifdef __Q
1c70: 4e 58 4e 54 4f 5f 5f 0a 20 20 69 6e 74 20 73 65  NXNTO__.  int se
1c80: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ca0: 20 44 65 76 69 63 65 20 73 65 63 74 6f 72 20 73   Device sector s
1cb0: 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 76  ize */.  int dev
1cc0: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1cd0: 63 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  cs;          /* 
1ce0: 50 72 65 63 6f 6d 70 75 74 65 64 20 64 65 76 69  Precomputed devi
1cf0: 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
1d00: 63 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  cs */.#endif.#if
1d10: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1d20: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20  OCKING_STYLE || 
1d30: 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1d40: 5f 29 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  _).  int openFla
1d50: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1d60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1d70: 66 6c 61 67 73 20 73 70 65 63 69 66 69 65 64 20  flags specified 
1d80: 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65 6e  at open() */.#en
1d90: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
1da0: 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45  NABLE_DATA_PROTE
1db0: 43 54 49 4f 4e 0a 20 20 69 6e 74 20 70 72 6f 74  CTION.  int prot
1dc0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1de0: 61 74 61 20 70 72 6f 74 65 63 74 69 6f 6e 20 66  ata protection f
1df0: 6c 61 67 73 20 66 72 6f 6d 20 75 6e 69 78 4f 70  lags from unixOp
1e00: 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  en */.#endif.#if
1e10: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1e20: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20  OCKING_STYLE || 
1e30: 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1e40: 5f 29 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73  _).  unsigned fs
1e50: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
1e60: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68           /* cach
1e70: 65 64 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20  ed details from 
1e80: 73 74 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64  statfs() */.#end
1e90: 69 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  if.#if OS_VXWORK
1ea0: 53 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  S.  struct vxwor
1eb0: 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20  ksFileId *pId;  
1ec0: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75          /* Uniqu
1ed0: 65 20 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e  e file ID */.#en
1ee0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
1ef0: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
1f00: 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76   next group of v
1f10: 61 72 69 61 62 6c 65 73 20 61 72 65 20 75 73 65  ariables are use
1f20: 64 20 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68  d to track wheth
1f30: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20  er or not the.  
1f40: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
1f50: 6f 75 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20  ounter in bytes 
1f60: 32 34 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73  24-27 of databas
1f70: 65 20 66 69 6c 65 73 20 61 72 65 20 75 70 64 61  e files are upda
1f80: 74 65 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65  ted.  ** wheneve
1f90: 72 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68  r any part of th
1fa0: 65 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  e database chang
1fb0: 65 73 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f  es.  An assertio
1fc0: 6e 20 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a  n fault will.  *
1fd0: 2a 20 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c  * occur if a fil
1fe0: 65 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74  e is updated wit
1ff0: 68 6f 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69  hout also updati
2000: 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ng the transacti
2010: 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e  on.  ** counter.
2020: 20 20 54 68 69 73 20 74 65 73 74 20 69 73 20 6d    This test is m
2030: 61 64 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77  ade to avoid new
2040: 20 70 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61   problems simila
2050: 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e  r to the.  ** on
2060: 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20 74  e described by t
2070: 69 63 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20  icket #3584. .  
2080: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
2090: 61 72 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  ar transCntrChng
20a0: 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74  ;   /* True if t
20b0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
20c0: 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a  ounter changed *
20d0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
20e0: 72 20 64 62 55 70 64 61 74 65 3b 20 20 20 20 20  r dbUpdate;     
20f0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
2100: 79 20 70 61 72 74 20 6f 66 20 64 61 74 61 62 61  y part of databa
2110: 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20  se file changed 
2120: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
2130: 61 72 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  ar inNormalWrite
2140: 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69  ;   /* True if i
2150: 6e 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65  n a normal write
2160: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23   operation */..#
2170: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
2180: 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49  LITE_TEST.  /* I
2190: 6e 20 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63  n test mode, inc
21a0: 72 65 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f  rease the size o
21b0: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
21c0: 20 61 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a   a bit so that .
21d0: 20 20 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65    ** it is large
21e0: 72 20 74 68 61 6e 20 74 68 65 20 73 74 72 75 63  r than the struc
21f0: 74 20 43 72 61 73 68 46 69 6c 65 20 64 65 66 69  t CrashFile defi
2200: 6e 65 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a  ned in test6.c..
2210: 20 20 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64    */.  char aPad
2220: 64 69 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66  ding[32];.#endif
2230: 0a 7d 3b 0a 0a 2f 2a 20 54 68 69 73 20 76 61 72  .};../* This var
2240: 69 61 62 6c 65 20 68 6f 6c 64 73 20 74 68 65 20  iable holds the 
2250: 70 72 6f 63 65 73 73 20 69 64 20 28 70 69 64 29  process id (pid)
2260: 20 66 72 6f 6d 20 77 68 65 6e 20 74 68 65 20 78   from when the x
2270: 52 61 6e 64 6f 6d 6e 65 73 73 28 29 0a 2a 2a 20  Randomness().** 
2280: 6d 65 74 68 6f 64 20 77 61 73 20 63 61 6c 6c 65  method was calle
2290: 64 2e 20 20 49 66 20 78 4f 70 65 6e 28 29 20 69  d.  If xOpen() i
22a0: 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 20  s called from a 
22b0: 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73  different proces
22c0: 73 20 69 64 2c 0a 2a 2a 20 69 6e 64 69 63 61 74  s id,.** indicat
22d0: 69 6e 67 20 74 68 61 74 20 61 20 66 6f 72 6b 28  ing that a fork(
22e0: 29 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20  ) has occurred, 
22f0: 74 68 65 20 50 52 4e 47 20 77 69 6c 6c 20 62 65  the PRNG will be
2300: 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69   reset..*/.stati
2310: 63 20 70 69 64 5f 74 20 72 61 6e 64 6f 6d 6e 65  c pid_t randomne
2320: 73 73 50 69 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  ssPid = 0;../*.*
2330: 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  * Allowed values
2340: 20 66 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c   for the unixFil
2350: 65 2e 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d  e.ctrlFlags bitm
2360: 61 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ask:.*/.#define 
2370: 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20  UNIXFILE_EXCL   
2380: 20 20 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a       0x01     /*
2390: 20 43 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f   Connections fro
23a0: 6d 20 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e  m one process on
23b0: 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  ly */.#define UN
23c0: 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20  IXFILE_RDONLY   
23d0: 20 20 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43     0x02     /* C
23e0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61  onnection is rea
23f0: 64 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e  d only */.#defin
2400: 65 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49  e UNIXFILE_PERSI
2410: 53 54 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20  ST_WAL 0x04     
2420: 2f 2a 20 50 65 72 73 69 73 74 65 6e 74 20 57 41  /* Persistent WA
2430: 4c 20 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65  L mode */.#ifnde
2440: 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
2450: 5f 44 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e  _DIRSYNC.# defin
2460: 65 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59  e UNIXFILE_DIRSY
2470: 4e 43 20 20 20 20 30 78 30 38 20 20 20 20 20 2f  NC    0x08     /
2480: 2a 20 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63  * Directory sync
2490: 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65   needed */.#else
24a0: 0a 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49  .# define UNIXFI
24b0: 4c 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78  LE_DIRSYNC    0x
24c0: 30 30 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  00.#endif.#defin
24d0: 65 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20  e UNIXFILE_PSOW 
24e0: 20 20 20 20 20 20 20 30 78 31 30 20 20 20 20 20         0x10     
24f0: 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  /* SQLITE_IOCAP_
2500: 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
2510: 49 54 45 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55  ITE */.#define U
2520: 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 20  NIXFILE_DELETE  
2530: 20 20 20 20 30 78 32 30 20 20 20 20 20 2f 2a 20      0x20     /* 
2540: 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20  Delete on close 
2550: 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46  */.#define UNIXF
2560: 49 4c 45 5f 55 52 49 20 20 20 20 20 20 20 20 20  ILE_URI         
2570: 30 78 34 30 20 20 20 20 20 2f 2a 20 46 69 6c 65  0x40     /* File
2580: 6e 61 6d 65 20 6d 69 67 68 74 20 68 61 76 65 20  name might have 
2590: 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73  query parameters
25a0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
25b0: 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 20 20 20 20  FILE_NOLOCK     
25c0: 20 30 78 38 30 20 20 20 20 20 2f 2a 20 44 6f 20   0x80     /* Do 
25d0: 6e 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  no file locking 
25e0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64  */../*.** Includ
25f0: 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63  e code that is c
2600: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f  ommon to all os_
2610: 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e  *.c files.*/.#in
2620: 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e  clude "os_common
2630: 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e  .h"../*.** Defin
2640: 65 20 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73  e various macros
2650: 20 74 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e   that are missin
2660: 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74  g from some syst
2670: 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ems..*/.#ifndef 
2680: 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65  O_LARGEFILE.# de
2690: 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45  fine O_LARGEFILE
26a0: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   0.#endif.#ifdef
26b0: 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
26c0: 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41  LFS.# undef O_LA
26d0: 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65  RGEFILE.# define
26e0: 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23   O_LARGEFILE 0.#
26f0: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f  endif.#ifndef O_
2700: 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e  NOFOLLOW.# defin
2710: 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23  e O_NOFOLLOW 0.#
2720: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f  endif.#ifndef O_
2730: 42 49 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20  BINARY.# define 
2740: 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69  O_BINARY 0.#endi
2750: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72  f../*.** The thr
2760: 65 61 64 69 64 20 6d 61 63 72 6f 20 72 65 73 6f  eadid macro reso
2770: 6c 76 65 73 20 74 6f 20 74 68 65 20 74 68 72 65  lves to the thre
2780: 61 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20 20  ad-id or to 0.  
2790: 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  Used for.** test
27a0: 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
27b0: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53  g only..*/.#if S
27c0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
27d0: 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64 69  .#define threadi
27e0: 64 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29  d pthread_self()
27f0: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 74  .#else.#define t
2800: 68 72 65 61 64 69 64 20 30 0a 23 65 6e 64 69 66  hreadid 0.#endif
2810: 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45  ..#ifdef __APPLE
2820: 5f 5f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54  __.#define SQLIT
2830: 45 5f 45 4e 41 42 4c 45 5f 53 55 50 45 52 4c 4f  E_ENABLE_SUPERLO
2840: 43 4b 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66  CK 1.#endif..#if
2850: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
2860: 55 50 45 52 4c 4f 43 4b 0a 23 69 6e 63 6c 75 64  UPERLOCK.#includ
2870: 65 20 22 73 71 6c 69 74 65 33 2e 68 22 0a 23 69  e "sqlite3.h".#i
2880: 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68  nclude <string.h
2890: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65  >.#include <asse
28a0: 72 74 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 41 20 73  rt.h>../*.** A s
28b0: 74 72 75 63 74 75 72 65 20 74 6f 20 63 6f 6c 6c  tructure to coll
28c0: 65 63 74 20 61 20 62 75 73 79 2d 68 61 6e 64 6c  ect a busy-handl
28d0: 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64 20  er callback and 
28e0: 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 61 20 63  argument and a c
28f0: 6f 75 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6e  ount.** of the n
2900: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 69  umber of times i
2910: 74 20 68 61 73 20 62 65 65 6e 20 69 6e 76 6f 6b  t has been invok
2920: 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 75  ed..*/.struct Su
2930: 70 65 72 6c 6f 63 6b 42 75 73 79 20 7b 0a 20 20  perlockBusy {.  
2940: 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69  int (*xBusy)(voi
2950: 64 2a 2c 69 6e 74 29 3b 20 20 20 20 20 20 20 20  d*,int);        
2960: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
2970: 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy-handler funct
2980: 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
2990: 42 75 73 79 41 72 67 3b 20 20 20 20 20 20 20 20  BusyArg;        
29a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
29b0: 74 20 61 72 67 20 74 6f 20 70 61 73 73 20 74 6f  t arg to pass to
29c0: 20 78 42 75 73 79 20 2a 2f 0a 20 20 69 6e 74 20   xBusy */.  int 
29d0: 6e 42 75 73 79 3b 20 20 20 20 20 20 20 20 20 20  nBusy;          
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
29f0: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 78  umber of times x
2a00: 42 75 73 79 20 68 61 73 20 62 65 65 6e 20 69 6e  Busy has been in
2a10: 76 6f 6b 65 64 20 2a 2f 0a 7d 3b 0a 74 79 70 65  voked */.};.type
2a20: 64 65 66 20 73 74 72 75 63 74 20 53 75 70 65 72  def struct Super
2a30: 6c 6f 63 6b 42 75 73 79 20 53 75 70 65 72 6c 6f  lockBusy Superlo
2a40: 63 6b 42 75 73 79 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ckBusy;../*.** A
2a50: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
2a60: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
2a70: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
2a80: 65 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69  ed for each acti
2a90: 76 65 0a 2a 2a 20 73 75 70 65 72 6c 6f 63 6b 2e  ve.** superlock.
2aa0: 20 54 68 65 20 6f 70 61 71 75 65 20 68 61 6e 64   The opaque hand
2ab0: 6c 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  le returned by s
2ac0: 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72  qlite3demo_super
2ad0: 6c 6f 63 6b 28 29 20 69 73 0a 2a 2a 20 61 63 74  lock() is.** act
2ae0: 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  ually a pointer 
2af0: 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  to an instance o
2b00: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
2b10: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 75 70 65  ..*/.struct Supe
2b20: 72 6c 6f 63 6b 20 7b 0a 20 20 73 71 6c 69 74 65  rlock {.  sqlite
2b30: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
2b40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
2b50: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 75 73 65  abase handle use
2b60: 64 20 74 6f 20 6c 6f 63 6b 20 64 62 20 2a 2f 0a  d to lock db */.
2b70: 20 20 69 6e 74 20 62 57 61 6c 3b 20 20 20 20 20    int bWal;     
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 64 62 20    /* True if db 
2ba0: 69 73 20 61 20 57 41 4c 20 64 61 74 61 62 61 73  is a WAL databas
2bb0: 65 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65 66 20  e */.};.typedef 
2bc0: 73 74 72 75 63 74 20 53 75 70 65 72 6c 6f 63 6b  struct Superlock
2bd0: 20 53 75 70 65 72 6c 6f 63 6b 3b 0a 0a 2f 2a 0a   Superlock;../*.
2be0: 2a 2a 20 54 68 65 20 70 43 74 78 20 70 6f 69 6e  ** The pCtx poin
2bf0: 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 74 68  ter passed to th
2c00: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
2c10: 63 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65  ctually a pointe
2c20: 72 20 74 6f 20 61 0a 2a 2a 20 53 75 70 65 72 6c  r to a.** Superl
2c30: 6f 63 6b 42 75 73 79 20 73 74 72 75 63 74 75 72  ockBusy structur
2c40: 65 2e 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  e. Invoke the bu
2c50: 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy-handler funct
2c60: 69 6f 6e 20 65 6e 63 61 70 73 75 6c 61 74 65 64  ion encapsulated
2c70: 0a 2a 2a 20 62 79 20 74 68 65 20 73 74 72 75 63  .** by the struc
2c80: 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20  ture and return 
2c90: 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73  the result..*/.s
2ca0: 74 61 74 69 63 20 69 6e 74 20 73 75 70 65 72 6c  tatic int superl
2cb0: 6f 63 6b 42 75 73 79 48 61 6e 64 6c 65 72 28 76  ockBusyHandler(v
2cc0: 6f 69 64 20 2a 70 43 74 78 2c 20 69 6e 74 20 55  oid *pCtx, int U
2cd0: 4e 55 53 45 44 29 7b 0a 20 20 53 75 70 65 72 6c  NUSED){.  Superl
2ce0: 6f 63 6b 42 75 73 79 20 2a 70 42 75 73 79 20 3d  ockBusy *pBusy =
2cf0: 20 28 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20   (SuperlockBusy 
2d00: 2a 29 70 43 74 78 3b 0a 20 20 69 66 28 20 70 42  *)pCtx;.  if( pB
2d10: 75 73 79 2d 3e 78 42 75 73 79 3d 3d 30 20 29 20  usy->xBusy==0 ) 
2d20: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
2d30: 72 6e 20 70 42 75 73 79 2d 3e 78 42 75 73 79 28  rn pBusy->xBusy(
2d40: 70 42 75 73 79 2d 3e 70 42 75 73 79 41 72 67 2c  pBusy->pBusyArg,
2d50: 20 70 42 75 73 79 2d 3e 6e 42 75 73 79 2b 2b 29   pBusy->nBusy++)
2d60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2d70: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
2d80: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
2d90: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
2da0: 73 65 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20  se file for .** 
2db0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69 73  connection db is
2dc0: 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64   open in WAL mod
2dd0: 65 20 6f 72 20 6e 6f 74 2e 20 49 66 20 6e 6f 20  e or not. If no 
2de0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 64  error occurs and
2df0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
2e00: 20 66 69 6c 65 20 69 73 20 69 6e 20 57 41 4c 20   file is in WAL 
2e10: 6d 6f 64 65 2c 20 73 65 74 20 2a 70 62 57 61 6c  mode, set *pbWal
2e20: 20 74 6f 20 74 72 75 65 20 61 6e 64 20 72 65 74   to true and ret
2e30: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
2e40: 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 69  * If it is not i
2e50: 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 73 65 74 20  n WAL mode, set 
2e60: 2a 70 62 57 61 6c 20 74 6f 20 66 61 6c 73 65 2e  *pbWal to false.
2e70: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
2e80: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
2e90: 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
2ea0: 72 20 63 6f 64 65 2e 20 54 68 65 20 76 61 6c 75  r code. The valu
2eb0: 65 20 6f 66 20 2a 70 62 57 61 6c 0a 2a 2a 20 69  e of *pbWal.** i
2ec0: 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74  s undefined in t
2ed0: 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61  his case..*/.sta
2ee0: 74 69 63 20 69 6e 74 20 73 75 70 65 72 6c 6f 63  tic int superloc
2ef0: 6b 49 73 57 61 6c 28 53 75 70 65 72 6c 6f 63 6b  kIsWal(Superlock
2f00: 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20   *pLock){.  int 
2f10: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2f30: 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
2f40: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
2f50: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
2f60: 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 50 52 41 47  /* Compiled PRAG
2f70: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
2f80: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20  statement */..  
2f90: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
2fa0: 70 61 72 65 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20  pare(pLock->db, 
2fb0: 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75  "PRAGMA main.jou
2fc0: 72 6e 61 6c 5f 6d 6f 64 65 22 2c 20 2d 31 2c 20  rnal_mode", -1, 
2fd0: 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66  &pStmt, 0);.  if
2fe0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2ff0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
3000: 70 4c 6f 63 6b 2d 3e 62 57 61 6c 20 3d 20 30 3b  pLock->bWal = 0;
3010: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f  .  if( SQLITE_RO
3020: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
3030: 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 63 6f  pStmt) ){.    co
3040: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64 65 20  nst char *zMode 
3050: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
3060: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
3070: 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  ext(pStmt, 0);. 
3080: 20 20 20 69 66 28 20 7a 4d 6f 64 65 20 26 26 20     if( zMode && 
3090: 73 74 72 6c 65 6e 28 7a 4d 6f 64 65 29 3d 3d 33  strlen(zMode)==3
30a0: 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e   && sqlite3_strn
30b0: 69 63 6d 70 28 22 77 61 6c 22 2c 20 7a 4d 6f 64  icmp("wal", zMod
30c0: 65 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  e, 3)==0 ){.    
30d0: 20 20 70 4c 6f 63 6b 2d 3e 62 57 61 6c 20 3d 20    pLock->bWal = 
30e0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
30f0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 66  return sqlite3_f
3100: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
3110: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20  }../*.** Obtain 
3120: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 73 68 6d  an exclusive shm
3130: 2d 6c 6f 63 6b 20 6f 6e 20 6e 42 79 74 65 20 62  -lock on nByte b
3140: 79 74 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  ytes starting at
3150: 20 6f 66 66 73 65 74 20 69 64 78 0a 2a 2a 20 6f   offset idx.** o
3160: 66 20 74 68 65 20 66 69 6c 65 20 66 64 2e 20 49  f the file fd. I
3170: 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f  f the lock canno
3180: 74 20 62 65 20 6f 62 74 61 69 6e 65 64 20 69 6d  t be obtained im
3190: 6d 65 64 69 61 74 65 6c 79 2c 20 69 6e 76 6f 6b  mediately, invok
31a0: 65 0a 2a 2a 20 74 68 65 20 62 75 73 79 2d 68 61  e.** the busy-ha
31b0: 6e 64 6c 65 72 20 75 6e 74 69 6c 20 65 69 74 68  ndler until eith
31c0: 65 72 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65  er it is obtaine
31d0: 64 20 6f 72 20 74 68 65 20 62 75 73 79 2d 68 61  d or the busy-ha
31e0: 6e 64 6c 65 72 0a 2a 2a 20 63 61 6c 6c 62 61 63  ndler.** callbac
31f0: 6b 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2f 0a  k returns 0..*/.
3200: 73 74 61 74 69 63 20 69 6e 74 20 73 75 70 65 72  static int super
3210: 6c 6f 63 6b 53 68 6d 4c 6f 63 6b 28 0a 20 20 73  lockShmLock(.  s
3220: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
3230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3240: 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20  * Database file 
3250: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
3260: 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  idx,            
3270: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
3280: 66 66 73 65 74 20 6f 66 20 73 68 6d 2d 6c 6f 63  ffset of shm-loc
3290: 6b 20 74 6f 20 6f 62 74 61 69 6e 20 2a 2f 0a 20  k to obtain */. 
32a0: 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
32d0: 6e 73 65 63 74 69 76 65 20 62 79 74 65 73 20 74  nsective bytes t
32e0: 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 53 75 70 65  o lock */.  Supe
32f0: 72 6c 6f 63 6b 42 75 73 79 20 2a 70 42 75 73 79  rlockBusy *pBusy
3300: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
3310: 75 73 79 2d 68 61 6e 64 6c 65 72 20 77 72 61 70  usy-handler wrap
3320: 70 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  per object */.){
3330: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
3340: 20 28 2a 78 53 68 6d 4c 6f 63 6b 29 28 73 71 6c   (*xShmLock)(sql
3350: 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2c  ite3_file*, int,
3360: 20 69 6e 74 2c 20 69 6e 74 29 20 3d 20 66 64 2d   int, int) = fd-
3370: 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c  >pMethods->xShmL
3380: 6f 63 6b 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20  ock;.  do {.    
3390: 72 63 20 3d 20 78 53 68 6d 4c 6f 63 6b 28 66 64  rc = xShmLock(fd
33a0: 2c 20 69 64 78 2c 20 6e 42 79 74 65 2c 20 53 51  , idx, nByte, SQ
33b0: 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 7c 53 51  LITE_SHM_LOCK|SQ
33c0: 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
33d0: 56 45 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72  VE);.  }while( r
33e0: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
33f0: 26 20 73 75 70 65 72 6c 6f 63 6b 42 75 73 79 48  & superlockBusyH
3400: 61 6e 64 6c 65 72 28 28 76 6f 69 64 20 2a 29 70  andler((void *)p
3410: 42 75 73 79 2c 20 30 29 20 29 3b 0a 20 20 72 65  Busy, 0) );.  re
3420: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
3430: 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 65 78 74  * Obtain the ext
3440: 72 61 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  ra locks on the 
3450: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 72 65  database file re
3460: 71 75 69 72 65 64 20 66 6f 72 20 57 41 4c 20 64  quired for WAL d
3470: 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 49 6e 76  atabases..** Inv
3480: 6f 6b 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  oke the supplied
3490: 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 61 73   busy-handler as
34a0: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74   required..*/.st
34b0: 61 74 69 63 20 69 6e 74 20 73 75 70 65 72 6c 6f  atic int superlo
34c0: 63 6b 57 61 6c 4c 6f 63 6b 28 0a 20 20 73 71 6c  ckWalLock(.  sql
34d0: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34f0: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
3500: 6f 70 65 6e 20 6f 6e 20 57 41 4c 20 64 61 74 61  open on WAL data
3510: 62 61 73 65 20 2a 2f 0a 20 20 53 75 70 65 72 6c  base */.  Superl
3520: 6f 63 6b 42 75 73 79 20 2a 70 42 75 73 79 20 20  ockBusy *pBusy  
3530: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 73            /* Bus
3540: 79 20 68 61 6e 64 6c 65 72 20 77 72 61 70 70 65  y handler wrappe
3550: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  r object */.){. 
3560: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
3570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3580: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
3590: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
35a0: 65 20 2a 66 64 20 3d 20 30 3b 20 20 20 20 20 20  e *fd = 0;      
35b0: 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 64 61 74       /* Main dat
35c0: 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c  abase file handl
35d0: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61  e */.  void vola
35e0: 74 69 6c 65 20 2a 70 20 3d 20 30 3b 20 20 20 20  tile *p = 0;    
35f0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
3600: 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20  r to first page 
3610: 6f 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  of shared memory
3620: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e   */..  /* Obtain
3630: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
3640: 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f  e sqlite3_file o
3650: 62 6a 65 63 74 20 6f 70 65 6e 20 6f 6e 20 74 68  bject open on th
3660: 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 2e 20  e main db file. 
3670: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
3680: 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
3690: 62 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54  b, "main", SQLIT
36a0: 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49  E_FCNTL_FILE_POI
36b0: 4e 54 45 52 2c 20 28 76 6f 69 64 20 2a 29 26 66  NTER, (void *)&f
36c0: 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  d);.  if( rc!=SQ
36d0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
36e0: 20 72 63 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69   rc;..  /* Obtai
36f0: 6e 20 74 68 65 20 22 72 65 63 6f 76 65 72 79 22  n the "recovery"
3700: 20 6c 6f 63 6b 2e 20 4e 6f 72 6d 61 6c 6c 79 2c   lock. Normally,
3710: 20 74 68 69 73 20 6c 6f 63 6b 20 69 73 20 6f 6e   this lock is on
3720: 6c 79 20 6f 62 74 61 69 6e 65 64 20 62 79 0a 20  ly obtained by. 
3730: 20 2a 2a 20 63 6c 69 65 6e 74 73 20 72 75 6e 6e   ** clients runn
3740: 69 6e 67 20 64 61 74 61 62 61 73 65 20 72 65 63  ing database rec
3750: 6f 76 65 72 79 2e 20 20 0a 20 20 2a 2f 0a 20 20  overy.  .  */.  
3760: 72 63 20 3d 20 73 75 70 65 72 6c 6f 63 6b 53 68  rc = superlockSh
3770: 6d 4c 6f 63 6b 28 66 64 2c 20 32 2c 20 31 2c 20  mLock(fd, 2, 1, 
3780: 70 42 75 73 79 29 3b 0a 20 20 69 66 28 20 72 63  pBusy);.  if( rc
3790: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
37a0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 5a  turn rc;..  /* Z
37b0: 65 72 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66  ero the start of
37c0: 20 74 68 65 20 66 69 72 73 74 20 73 68 61 72 65   the first share
37d0: 64 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2e 20 54  d-memory page. T
37e0: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61  his means that a
37f0: 6e 79 0a 20 20 2a 2a 20 63 6c 69 65 6e 74 73 20  ny.  ** clients 
3800: 74 68 61 74 20 6f 70 65 6e 20 72 65 61 64 20 6f  that open read o
3810: 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
3820: 69 6f 6e 73 20 66 72 6f 6d 20 74 68 69 73 20 70  ions from this p
3830: 6f 69 6e 74 20 6f 6e 20 77 69 6c 6c 0a 20 20 2a  oint on will.  *
3840: 2a 20 68 61 76 65 20 74 6f 20 72 75 6e 20 72 65  * have to run re
3850: 63 6f 76 65 72 79 20 62 65 66 6f 72 65 20 70 72  covery before pr
3860: 6f 63 65 65 64 69 6e 67 2e 20 53 69 6e 63 65 20  oceeding. Since 
3870: 74 68 65 79 20 6e 65 65 64 20 74 68 65 20 22 72  they need the "r
3880: 65 63 6f 76 65 72 79 22 0a 20 20 2a 2a 20 6c 6f  ecovery".  ** lo
3890: 63 6b 20 74 68 61 74 20 74 68 69 73 20 70 72 6f  ck that this pro
38a0: 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
38b0: 74 6f 20 64 6f 20 74 68 61 74 2c 20 6e 6f 20 6e  to do that, no n
38c0: 65 77 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ew read or write
38d0: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
38e0: 6e 73 20 6d 61 79 20 6e 6f 77 20 62 65 20 6f 70  ns may now be op
38f0: 65 6e 65 64 2e 20 4e 6f 72 20 63 61 6e 20 61 20  ened. Nor can a 
3900: 63 68 65 63 6b 70 6f 69 6e 74 20 62 65 20 72 75  checkpoint be ru
3910: 6e 2c 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  n, for the.  ** 
3920: 73 61 6d 65 20 72 65 61 73 6f 6e 2e 0a 20 20 2a  same reason..  *
3930: 2f 0a 20 20 72 63 20 3d 20 66 64 2d 3e 70 4d 65  /.  rc = fd->pMe
3940: 74 68 6f 64 73 2d 3e 78 53 68 6d 4d 61 70 28 66  thods->xShmMap(f
3950: 64 2c 20 30 2c 20 33 32 2a 31 30 32 34 2c 20 31  d, 0, 32*1024, 1
3960: 2c 20 26 70 29 3b 0a 20 20 69 66 28 20 72 63 21  , &p);.  if( rc!
3970: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
3980: 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74  urn rc;.  memset
3990: 28 28 76 6f 69 64 20 2a 29 70 2c 20 30 2c 20 33  ((void *)p, 0, 3
39a0: 32 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e  2);..  /* Obtain
39b0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
39c0: 20 6f 6e 20 61 6c 6c 20 74 68 65 20 22 72 65 61   on all the "rea
39d0: 64 2d 6c 6f 63 6b 22 20 73 6c 6f 74 73 2e 20 4f  d-lock" slots. O
39e0: 6e 63 65 20 74 68 65 73 65 20 6c 6f 63 6b 73 0a  nce these locks.
39f0: 20 20 2a 2a 20 61 72 65 20 68 65 6c 64 2c 20 69    ** are held, i
3a00: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
3a10: 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e  that there are n
3a20: 6f 20 61 63 74 69 76 65 20 72 65 61 64 65 72 2c  o active reader,
3a30: 20 77 72 69 74 65 72 20 6f 72 20 0a 20 20 2a 2a   writer or .  **
3a40: 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 20 63 6c   checkpointer cl
3a50: 69 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  ients..  */.  rc
3a60: 20 3d 20 73 75 70 65 72 6c 6f 63 6b 53 68 6d 4c   = superlockShmL
3a70: 6f 63 6b 28 66 64 2c 20 33 2c 20 53 51 4c 49 54  ock(fd, 3, SQLIT
3a80: 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 2d 33 2c 20 70  E_SHM_NLOCK-3, p
3a90: 42 75 73 79 29 3b 0a 20 20 72 65 74 75 72 6e 20  Busy);.  return 
3aa0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  rc;.}../*.** Rel
3ab0: 65 61 73 65 20 61 20 73 75 70 65 72 6c 6f 63 6b  ease a superlock
3ac0: 20 68 65 6c 64 20 6f 6e 20 61 20 64 61 74 61 62   held on a datab
3ad0: 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72  ase file. The ar
3ae0: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
3af0: 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69   .** this functi
3b00: 6f 6e 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  on must have bee
3b10: 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  n obtained from 
3b20: 61 20 73 75 63 63 65 73 73 66 75 6c 20 63 61 6c  a successful cal
3b30: 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 64  l to.** sqlite3d
3b40: 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 29 2e  emo_superlock().
3b50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3b60: 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65  sqlite3demo_supe
3b70: 72 75 6e 6c 6f 63 6b 28 76 6f 69 64 20 2a 70 4c  runlock(void *pL
3b80: 6f 63 6b 29 7b 0a 20 20 53 75 70 65 72 6c 6f 63  ock){.  Superloc
3b90: 6b 20 2a 70 20 3d 20 28 53 75 70 65 72 6c 6f 63  k *p = (Superloc
3ba0: 6b 20 2a 29 70 4c 6f 63 6b 3b 0a 20 20 69 66 28  k *)pLock;.  if(
3bb0: 20 70 2d 3e 62 57 61 6c 20 29 7b 0a 20 20 20 20   p->bWal ){.    
3bc0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
3bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3be0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
3bf0: 2f 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  /.    int flags 
3c00: 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  = SQLITE_SHM_UNL
3c10: 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
3c20: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
3c30: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
3c40: 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
3c50: 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
3c60: 72 6f 6c 28 70 2d 3e 64 62 2c 20 22 6d 61 69 6e  rol(p->db, "main
3c70: 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ", SQLITE_FCNTL_
3c80: 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2c 0a 20 20  FILE_POINTER,.  
3c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ca0: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
3cb0: 20 2a 29 26 66 64 29 3b 0a 20 20 20 20 69 66 28   *)&fd);.    if(
3cc0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
3cd0: 7b 0a 20 20 20 20 20 20 66 64 2d 3e 70 4d 65 74  {.      fd->pMet
3ce0: 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28 66  hods->xShmLock(f
3cf0: 64 2c 20 32 2c 20 31 2c 20 66 6c 61 67 73 29 3b  d, 2, 1, flags);
3d00: 0a 20 20 20 20 20 20 66 64 2d 3e 70 4d 65 74 68  .      fd->pMeth
3d10: 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28 66 64  ods->xShmLock(fd
3d20: 2c 20 33 2c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  , 3, SQLITE_SHM_
3d30: 4e 4c 4f 43 4b 2d 33 2c 20 66 6c 61 67 73 29 3b  NLOCK-3, flags);
3d40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
3d50: 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62  ite3_close(p->db
3d60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3d70: 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  e(p);.}../*.** O
3d80: 62 74 61 69 6e 20 61 20 73 75 70 65 72 6c 6f 63  btain a superloc
3d90: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
3da0: 65 20 66 69 6c 65 20 69 64 65 6e 74 69 66 69 65  e file identifie
3db0: 64 20 62 79 20 7a 50 61 74 68 2c 20 75 73 69 6e  d by zPath, usin
3dc0: 67 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  g the.** locking
3dd0: 20 70 72 69 6d 69 74 69 76 65 73 20 70 72 6f 76   primitives prov
3de0: 69 64 65 64 20 62 79 20 56 46 53 20 7a 56 66 73  ided by VFS zVfs
3df0: 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
3e00: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a   SQLITE_OK is.**
3e10: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6f 75   returned and ou
3e20: 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70  tput variable *p
3e30: 70 4c 6f 63 6b 20 69 73 20 70 6f 70 75 6c 61 74  pLock is populat
3e40: 65 64 20 77 69 74 68 20 61 6e 20 6f 70 61 71 75  ed with an opaqu
3e50: 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 74 68 61 74  e handle.** that
3e60: 20 6d 61 79 20 62 65 20 75 73 65 64 20 77 69 74   may be used wit
3e70: 68 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75  h sqlite3demo_su
3e80: 70 65 72 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 72  perunlock() to r
3e90: 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 2e  elease the lock.
3ea0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
3eb0: 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 4c 6f  or occurs, *ppLo
3ec0: 63 6b 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  ck is set to 0 a
3ed0: 6e 64 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  nd an SQLite err
3ee0: 6f 72 20 63 6f 64 65 20 0a 2a 2a 20 28 65 2e 67  or code .** (e.g
3ef0: 2e 20 53 51 4c 49 54 45 5f 42 55 53 59 29 20 69  . SQLITE_BUSY) i
3f00: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
3f10: 2a 20 49 66 20 61 20 72 65 71 75 69 72 65 64 20  * If a required 
3f20: 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
3f30: 62 74 61 69 6e 65 64 20 69 6d 6d 65 64 69 61 74  btained immediat
3f40: 65 6c 79 20 61 6e 64 20 74 68 65 20 78 42 75 73  ely and the xBus
3f50: 79 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 74  y parameter.** t
3f60: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
3f70: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
3f80: 6e 20 78 42 75 73 79 20 69 73 20 69 6e 76 6f 6b  n xBusy is invok
3f90: 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77  ed in the same w
3fa0: 61 79 0a 2a 2a 20 61 73 20 61 20 62 75 73 79 2d  ay.** as a busy-
3fb0: 68 61 6e 64 6c 65 72 20 72 65 67 69 73 74 65 72  handler register
3fc0: 65 64 20 77 69 74 68 20 53 51 4c 69 74 65 20 28  ed with SQLite (
3fd0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 62 75  using sqlite3_bu
3fe0: 73 79 5f 68 61 6e 64 6c 65 72 28 29 29 0a 2a 2a  sy_handler()).**
3ff0: 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 74 68   until either th
4000: 65 20 6c 6f 63 6b 20 63 61 6e 20 62 65 20 6f 62  e lock can be ob
4010: 74 61 69 6e 65 64 20 6f 72 20 74 68 65 20 62 75  tained or the bu
4020: 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy-handler funct
4030: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 30  ion returns.** 0
4040: 20 28 69 6e 64 69 63 61 74 69 6e 67 20 22 67 69   (indicating "gi
4050: 76 65 20 75 70 22 29 2e 0a 2a 2f 0a 73 74 61 74  ve up")..*/.stat
4060: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 64 65  ic int sqlite3de
4070: 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 0a 20 20  mo_superlock(.  
4080: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
4090: 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
40a0: 2f 2a 20 50 61 74 68 20 74 6f 20 64 61 74 61 62  /* Path to datab
40b0: 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 6f 63 6b  ase file to lock
40c0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
40d0: 20 2a 7a 56 66 73 2c 20 20 20 20 20 20 20 20 20   *zVfs,         
40e0: 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20        /* VFS to 
40f0: 75 73 65 20 74 6f 20 61 63 63 65 73 73 20 64 61  use to access da
4100: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
4110: 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
4120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4130: 20 41 64 64 69 74 69 6f 6e 61 6c 20 66 6c 61 67   Additional flag
4140: 73 20 74 6f 20 70 61 73 73 20 74 6f 20 73 71 6c  s to pass to sql
4150: 69 74 65 33 5f 6f 70 65 6e 5f 76 32 20 2a 2f 0a  ite3_open_v2 */.
4160: 20 20 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76    int (*xBusy)(v
4170: 6f 69 64 2a 2c 69 6e 74 29 2c 20 20 20 20 20 20  oid*,int),      
4180: 20 20 2f 2a 20 42 75 73 79 20 68 61 6e 64 6c 65    /* Busy handle
4190: 72 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  r callback */.  
41a0: 76 6f 69 64 20 2a 70 42 75 73 79 41 72 67 2c 20  void *pBusyArg, 
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41c0: 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 20 66  /* Context arg f
41d0: 6f 72 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  or busy handler 
41e0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70 4c 6f  */.  void **ppLo
41f0: 63 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ck              
4200: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 6f 6e       /* OUT: Con
4210: 74 65 78 74 20 74 6f 20 70 61 73 73 20 74 6f 20  text to pass to 
4220: 73 75 70 65 72 75 6e 6c 6f 63 6b 28 29 20 2a 2f  superunlock() */
4230: 0a 29 7b 0a 20 20 53 75 70 65 72 6c 6f 63 6b 42  .){.  SuperlockB
4240: 75 73 79 20 62 75 73 79 20 3d 20 7b 30 2c 20 30  usy busy = {0, 0
4250: 2c 20 30 7d 3b 20 2f 2a 20 42 75 73 79 20 68 61  , 0}; /* Busy ha
4260: 6e 64 6c 65 72 20 77 72 61 70 70 65 72 20 6f 62  ndler wrapper ob
4270: 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ject */.  int rc
4280: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
42a0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 53 75  urn code */.  Su
42b0: 70 65 72 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a  perlock *pLock;.
42c0: 0a 20 20 70 4c 6f 63 6b 20 3d 20 73 71 6c 69 74  .  pLock = sqlit
42d0: 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
42e0: 28 53 75 70 65 72 6c 6f 63 6b 29 29 3b 0a 20 20  (Superlock));.  
42f0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 20 72 65 74  if( !pLock ) ret
4300: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
4310: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 4c 6f 63 6b  ;.  memset(pLock
4320: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 75 70 65  , 0, sizeof(Supe
4330: 72 6c 6f 63 6b 29 29 3b 0a 0a 20 20 2f 2a 20 4f  rlock));..  /* O
4340: 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 68  pen a database h
4350: 61 6e 64 6c 65 20 6f 6e 20 74 68 65 20 66 69 6c  andle on the fil
4360: 65 20 74 6f 20 73 75 70 65 72 6c 6f 63 6b 2e 20  e to superlock. 
4370: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
4380: 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 20 20 20  3_open_v2(.     
4390: 20 7a 50 61 74 68 2c 20 26 70 4c 6f 63 6b 2d 3e   zPath, &pLock->
43a0: 64 62 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  db, SQLITE_OPEN_
43b0: 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
43c0: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 66 6c 61  _OPEN_CREATE|fla
43d0: 67 73 2c 20 7a 56 66 73 0a 20 20 29 3b 0a 0a 20  gs, zVfs.  );.. 
43e0: 20 2f 2a 20 49 6e 73 74 61 6c 6c 20 61 20 62 75   /* Install a bu
43f0: 73 79 2d 68 61 6e 64 6c 65 72 20 61 6e 64 20 65  sy-handler and e
4400: 78 65 63 75 74 65 20 61 20 42 45 47 49 4e 20 45  xecute a BEGIN E
4410: 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68 69  XCLUSIVE. If thi
4420: 73 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 20  s is not.  ** a 
4430: 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68  WAL database, th
4440: 69 73 20 69 73 20 61 6c 6c 20 77 65 20 6e 65 65  is is all we nee
4450: 64 20 74 6f 20 64 6f 2e 20 20 0a 20 20 2a 2a 0a  d to do.  .  **.
4460: 20 20 2a 2a 20 41 20 77 72 61 70 70 65 72 20 66    ** A wrapper f
4470: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
4480: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  to invoke the bu
4490: 73 79 2d 68 61 6e 64 6c 65 72 20 69 6e 73 74 65  sy-handler inste
44a0: 61 64 20 6f 66 0a 20 20 2a 2a 20 72 65 67 69 73  ad of.  ** regis
44b0: 74 65 72 69 6e 67 20 74 68 65 20 62 75 73 79 2d  tering the busy-
44c0: 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
44d0: 20 73 75 70 70 6c 69 65 64 20 62 79 20 74 68 65   supplied by the
44e0: 20 75 73 65 72 20 64 69 72 65 63 74 6c 79 0a 20   user directly. 
44f0: 20 2a 2a 20 77 69 74 68 20 53 51 4c 69 74 65 2e   ** with SQLite.
4500: 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
4510: 20 74 68 65 20 73 61 6d 65 20 62 75 73 79 2d 68   the same busy-h
4520: 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
4530: 6d 61 79 20 62 65 0a 20 20 2a 2a 20 69 6e 76 6f  may be.  ** invo
4540: 6b 65 64 20 64 69 72 65 63 74 6c 79 20 6c 61 74  ked directly lat
4550: 65 72 20 6f 6e 20 77 68 65 6e 20 61 74 74 65 6d  er on when attem
4560: 70 74 69 6e 67 20 74 6f 20 6f 62 74 61 69 6e 20  pting to obtain 
4570: 74 68 65 20 65 78 74 72 61 20 6c 6f 63 6b 73 0a  the extra locks.
4580: 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 69 6e    ** required in
4590: 20 57 41 4c 20 6d 6f 64 65 2e 20 42 79 20 75 73   WAL mode. By us
45a0: 69 6e 67 20 74 68 65 20 77 72 61 70 70 65 72 2c  ing the wrapper,
45b0: 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20   we are able to 
45c0: 67 75 61 72 61 6e 74 65 65 0a 20 20 2a 2a 20 74  guarantee.  ** t
45d0: 68 61 74 20 74 68 65 20 22 6e 42 75 73 79 22 20  hat the "nBusy" 
45e0: 69 6e 74 65 67 65 72 20 70 61 72 61 6d 65 74 65  integer paramete
45f0: 72 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  r passed to the 
4600: 75 73 65 72 73 20 62 75 73 79 2d 68 61 6e 64 6c  users busy-handl
4610: 65 72 0a 20 20 2a 2a 20 72 65 70 72 65 73 65 6e  er.  ** represen
4620: 74 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  ts the total num
4630: 62 65 72 20 6f 66 20 62 75 73 79 2d 68 61 6e 64  ber of busy-hand
4640: 6c 65 72 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20  ler invocations 
4650: 6d 61 64 65 20 77 69 74 68 69 6e 0a 20 20 2a 2a  made within.  **
4660: 20 74 68 69 73 20 63 61 6c 6c 20 74 6f 20 73 71   this call to sq
4670: 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c  lite3demo_superl
4680: 6f 63 6b 28 29 2c 20 69 6e 63 6c 75 64 69 6e 67  ock(), including
4690: 20 61 6e 79 20 6d 61 64 65 20 64 75 72 69 6e 67   any made during
46a0: 20 74 68 65 0a 20 20 2a 2a 20 22 42 45 47 49 4e   the.  ** "BEGIN
46b0: 20 45 58 43 4c 55 53 49 56 45 22 2e 0a 20 20 2a   EXCLUSIVE"..  *
46c0: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
46d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 75 73  TE_OK ){.    bus
46e0: 79 2e 78 42 75 73 79 20 3d 20 78 42 75 73 79 3b  y.xBusy = xBusy;
46f0: 0a 20 20 20 20 62 75 73 79 2e 70 42 75 73 79 41  .    busy.pBusyA
4700: 72 67 20 3d 20 70 42 75 73 79 41 72 67 3b 0a 20  rg = pBusyArg;. 
4710: 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
4720: 68 61 6e 64 6c 65 72 28 70 4c 6f 63 6b 2d 3e 64  handler(pLock->d
4730: 62 2c 20 73 75 70 65 72 6c 6f 63 6b 42 75 73 79  b, superlockBusy
4740: 48 61 6e 64 6c 65 72 2c 20 28 76 6f 69 64 20 2a  Handler, (void *
4750: 29 26 62 75 73 79 29 3b 0a 20 20 20 20 72 63 20  )&busy);.    rc 
4760: 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
4770: 4c 6f 63 6b 2d 3e 64 62 2c 20 22 42 45 47 49 4e  Lock->db, "BEGIN
4780: 20 45 58 43 4c 55 53 49 56 45 22 2c 20 30 2c 20   EXCLUSIVE", 0, 
4790: 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  0, 0);.  }..  /*
47a0: 20 49 66 20 74 68 65 20 42 45 47 49 4e 20 45 58   If the BEGIN EX
47b0: 43 4c 55 53 49 56 45 20 77 61 73 20 65 78 65 63  CLUSIVE was exec
47c0: 75 74 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  uted successfull
47d0: 79 20 61 6e 64 20 74 68 69 73 20 69 73 20 61 20  y and this is a 
47e0: 57 41 4c 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  WAL.  ** databas
47f0: 65 2c 20 63 61 6c 6c 20 73 75 70 65 72 6c 6f 63  e, call superloc
4800: 6b 57 61 6c 4c 6f 63 6b 28 29 20 74 6f 20 6f 62  kWalLock() to ob
4810: 74 61 69 6e 20 74 68 65 20 65 78 74 72 61 20 6c  tain the extra l
4820: 6f 63 6b 73 20 72 65 71 75 69 72 65 64 0a 20 20  ocks required.  
4830: 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65  ** to prevent re
4840: 61 64 65 72 73 2c 20 77 72 69 74 65 72 73 20 61  aders, writers a
4850: 6e 64 2f 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74  nd/or checkpoint
4860: 65 72 73 20 66 72 6f 6d 20 61 63 63 65 73 73 69  ers from accessi
4870: 6e 67 20 74 68 65 0a 20 20 2a 2a 20 64 62 20 77  ng the.  ** db w
4880: 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
4890: 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  s is holding the
48a0: 20 73 75 70 65 72 6c 6f 63 6b 2e 0a 20 20 2a 2a   superlock..  **
48b0: 0a 20 20 2a 2a 20 42 65 66 6f 72 65 20 61 74 74  .  ** Before att
48c0: 65 6d 70 74 69 6e 67 20 61 6e 79 20 57 41 4c 20  empting any WAL 
48d0: 6c 6f 63 6b 73 2c 20 63 6f 6d 6d 69 74 20 74 68  locks, commit th
48e0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  e transaction st
48f0: 61 72 74 65 64 20 61 62 6f 76 65 0a 20 20 2a 2a  arted above.  **
4900: 20 74 6f 20 64 72 6f 70 20 74 68 65 20 57 41 4c   to drop the WAL
4910: 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   read and write 
4920: 6c 6f 63 6b 73 20 63 75 72 72 65 6e 74 6c 79 20  locks currently 
4930: 68 65 6c 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  held. Otherwise,
4940: 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 57 41   the.  ** new WA
4950: 4c 20 6c 6f 63 6b 73 20 6d 61 79 20 63 6f 6e 66  L locks may conf
4960: 6c 69 63 74 20 77 69 74 68 20 74 68 65 20 6f 6c  lict with the ol
4970: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  d..  */.  if( rc
4980: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
4990: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
49a0: 3d 3d 28 72 63 20 3d 20 73 75 70 65 72 6c 6f 63  ==(rc = superloc
49b0: 6b 49 73 57 61 6c 28 70 4c 6f 63 6b 29 29 20 26  kIsWal(pLock)) &
49c0: 26 20 70 4c 6f 63 6b 2d 3e 62 57 61 6c 20 29 7b  & pLock->bWal ){
49d0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
49e0: 74 65 33 5f 65 78 65 63 28 70 4c 6f 63 6b 2d 3e  te3_exec(pLock->
49f0: 64 62 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  db, "COMMIT", 0,
4a00: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
4a10: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4a20: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
4a30: 73 75 70 65 72 6c 6f 63 6b 57 61 6c 4c 6f 63 6b  superlockWalLock
4a40: 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20 26 62 75 73  (pLock->db, &bus
4a50: 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  y);.      }.    
4a60: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  }.  }..  if( rc!
4a70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4a80: 20 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75    sqlite3demo_su
4a90: 70 65 72 75 6e 6c 6f 63 6b 28 70 4c 6f 63 6b 29  perunlock(pLock)
4aa0: 3b 0a 20 20 20 20 2a 70 70 4c 6f 63 6b 20 3d 20  ;.    *ppLock = 
4ab0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
4ac0: 2a 70 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  *ppLock = pLock;
4ad0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
4ae0: 63 3b 0a 7d 0a 0a 2f 2a 20 41 20 63 6f 72 72 75  c;.}../* A corru
4af0: 70 74 20 44 42 20 77 6f 6e 27 74 20 77 6f 72 6b  pt DB won't work
4b00: 20 77 69 74 68 20 74 68 65 20 73 71 6c 2d 62 61   with the sql-ba
4b10: 73 65 64 20 6c 6f 63 6b 69 6e 67 20 61 74 74 65  sed locking atte
4b20: 6d 70 74 2c 20 67 72 61 62 20 61 6e 20 0a 2a 2a  mpt, grab an .**
4b30: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
4b40: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
4b50: 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 42  E_OK or SQLITE_B
4b60: 55 53 59 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  USY if the lock 
4b70: 66 61 69 6c 73 20 0a 2a 2a 20 72 65 74 75 72 6e  fails .** return
4b80: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  s the current lo
4b90: 63 6b 20 6c 65 76 65 6c 20 68 65 6c 64 20 6f 6e  ck level held on
4ba0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2f   sqlite3_file.*/
4bb0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
4bc0: 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63  te3demo_superloc
4bd0: 6b 5f 63 6f 72 72 75 70 74 28 0a 20 20 73 71 6c  k_corrupt(.  sql
4be0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 0a 20  ite3_file *id,. 
4bf0: 20 69 6e 74 20 65 54 61 72 67 65 74 46 69 6c 65   int eTargetFile
4c00: 4c 6f 63 6b 2c 0a 20 20 69 6e 74 20 2a 70 46 69  Lock,.  int *pFi
4c10: 6c 65 4c 6f 63 6b 0a 29 7b 0a 20 20 75 6e 69 78  leLock.){.  unix
4c20: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
4c30: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
4c40: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 70  nt eFileLock = p
4c50: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b  File->eFileLock;
4c60: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
4c70: 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20  TE_OK;.  .  if( 
4c80: 65 46 69 6c 65 4c 6f 63 6b 3c 65 54 61 72 67 65  eFileLock<eTarge
4c90: 74 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  tFileLock ){.   
4ca0: 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65   rc = pFile->pMe
4cb0: 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 69 64 2c 20  thod->xLock(id, 
4cc0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52  SQLITE_LOCK_SHAR
4cd0: 45 44 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  ED);.  }.  if( !
4ce0: 72 63 20 26 26 20 53 51 4c 49 54 45 5f 4c 4f 43  rc && SQLITE_LOC
4cf0: 4b 5f 53 48 41 52 45 44 3c 65 54 61 72 67 65 74  K_SHARED<eTarget
4d00: 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
4d10: 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74  rc = pFile->pMet
4d20: 68 6f 64 2d 3e 78 4c 6f 63 6b 28 69 64 2c 20 53  hod->xLock(id, S
4d30: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55  QLITE_LOCK_EXCLU
4d40: 53 49 56 45 29 3b 0a 20 20 7d 0a 20 20 69 66 28  SIVE);.  }.  if(
4d50: 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 70   rc ){.    if( p
4d60: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
4d70: 3e 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  > eFileLock ){. 
4d80: 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74       pFile->pMet
4d90: 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 69 64 2c  hod->xUnlock(id,
4da0: 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20   eFileLock);.   
4db0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
4dc0: 3b 0a 20 20 7d 0a 20 20 69 66 20 28 70 46 69 6c  ;.  }.  if (pFil
4dd0: 65 4c 6f 63 6b 29 20 7b 0a 20 20 20 20 2a 70 46  eLock) {.    *pF
4de0: 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
4df0: 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ock;.  }.  retur
4e00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
4e10: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
4e20: 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f  e3demo_superunlo
4e30: 63 6b 5f 63 6f 72 72 75 70 74 28 73 71 6c 69 74  ck_corrupt(sqlit
4e40: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
4e50: 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
4e60: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
4e70: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
4e80: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
4e90: 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20  TE_OK;.  .  if( 
4ea0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
4eb0: 20 3e 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a   > eFileLock ){.
4ec0: 20 20 20 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e      rc = pFile->
4ed0: 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b  pMethod->xUnlock
4ee0: 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  (id, SQLITE_LOCK
4ef0: 5f 53 48 41 52 45 44 29 3b 0a 20 20 7d 0a 20 20  _SHARED);.  }.  
4f00: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
4f10: 4c 6f 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63 6b  Lock > eFileLock
4f20: 20 29 7b 0a 20 20 20 20 69 6e 74 20 75 6e 6c 6f   ){.    int unlo
4f30: 63 6b 52 43 20 3d 20 70 46 69 6c 65 2d 3e 70 4d  ckRC = pFile->pM
4f40: 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 69  ethod->xUnlock(i
4f50: 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 4e  d, SQLITE_LOCK_N
4f60: 4f 4e 45 29 3b 0a 20 20 20 20 69 66 20 28 21 72  ONE);.    if (!r
4f70: 63 29 20 72 63 20 3d 20 75 6e 6c 6f 63 6b 52 43  c) rc = unlockRC
4f80: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4f90: 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  c;.}..#endif /* 
4fa0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 55  SQLITE_ENABLE_SU
4fb0: 50 45 52 4c 4f 43 4b 20 2a 2f 0a 0a 0a 2f 2a 0a  PERLOCK */.../*.
4fc0: 2a 2a 20 48 41 56 45 5f 4d 52 45 4d 41 50 20 64  ** HAVE_MREMAP d
4fd0: 65 66 61 75 6c 74 73 20 74 6f 20 74 72 75 65 20  efaults to true 
4fe0: 6f 6e 20 4c 69 6e 75 78 20 61 6e 64 20 66 61 6c  on Linux and fal
4ff0: 73 65 20 65 76 65 72 79 77 68 65 72 65 20 65 6c  se everywhere el
5000: 73 65 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  se..*/.#if !defi
5010: 6e 65 64 28 48 41 56 45 5f 4d 52 45 4d 41 50 29  ned(HAVE_MREMAP)
5020: 0a 23 20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  .# if defined(__
5030: 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64 65 66 69  linux__) && defi
5040: 6e 65 64 28 5f 47 4e 55 5f 53 4f 55 52 43 45 29  ned(_GNU_SOURCE)
5050: 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56 45 5f  .#  define HAVE_
5060: 4d 52 45 4d 41 50 20 31 0a 23 20 65 6c 73 65 0a  MREMAP 1.# else.
5070: 23 20 20 64 65 66 69 6e 65 20 48 41 56 45 5f 4d  #  define HAVE_M
5080: 52 45 4d 41 50 20 30 0a 23 20 65 6e 64 69 66 0a  REMAP 0.# endif.
5090: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78  #endif../*.** Ex
50a0: 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c 20 74 68  plicitly call th
50b0: 65 20 36 34 2d 62 69 74 20 76 65 72 73 69 6f 6e  e 64-bit version
50c0: 20 6f 66 20 6c 73 65 65 6b 28 29 20 6f 6e 20 41   of lseek() on A
50d0: 6e 64 72 6f 69 64 2e 20 4f 74 68 65 72 77 69 73  ndroid. Otherwis
50e0: 65 2c 20 6c 73 65 65 6b 28 29 0a 2a 2a 20 69 73  e, lseek().** is
50f0: 20 74 68 65 20 33 32 2d 62 69 74 20 76 65 72 73   the 32-bit vers
5100: 69 6f 6e 2c 20 65 76 65 6e 20 69 66 20 5f 46 49  ion, even if _FI
5110: 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 3d 36  LE_OFFSET_BITS=6
5120: 34 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  4 is defined..*/
5130: 0a 23 69 66 64 65 66 20 5f 5f 41 4e 44 52 4f 49  .#ifdef __ANDROI
5140: 44 5f 5f 0a 23 20 64 65 66 69 6e 65 20 6c 73 65  D__.# define lse
5150: 65 6b 20 6c 73 65 65 6b 36 34 0a 23 65 6e 64 69  ek lseek64.#endi
5160: 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 66 66 65 72 65  f../*.** Differe
5170: 6e 74 20 55 6e 69 78 20 73 79 73 74 65 6d 73 20  nt Unix systems 
5180: 64 65 63 6c 61 72 65 20 6f 70 65 6e 28 29 20 69  declare open() i
5190: 6e 20 64 69 66 66 65 72 65 6e 74 20 77 61 79 73  n different ways
51a0: 2e 20 20 53 61 6d 65 20 75 73 65 0a 2a 2a 20 6f  .  Same use.** o
51b0: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  pen(const char*,
51c0: 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e 20 20 4f 74  int,mode_t).  Ot
51d0: 68 65 72 73 20 75 73 65 20 6f 70 65 6e 28 63 6f  hers use open(co
51e0: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 2e 2e  nst char*,int,..
51f0: 2e 29 2e 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .)..** The diffe
5200: 72 65 6e 63 65 20 69 73 20 69 6d 70 6f 72 74 61  rence is importa
5210: 6e 74 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20  nt when using a 
5220: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66  pointer to the f
5230: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  unction..**.** T
5240: 68 65 20 73 61 66 65 73 74 20 77 61 79 20 74 6f  he safest way to
5250: 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 70   deal with the p
5260: 72 6f 62 6c 65 6d 20 69 73 20 74 6f 20 61 6c 77  roblem is to alw
5270: 61 79 73 20 75 73 65 20 74 68 69 73 20 77 72 61  ays use this wra
5280: 70 70 65 72 0a 2a 2a 20 77 68 69 63 68 20 61 6c  pper.** which al
5290: 77 61 79 73 20 68 61 73 20 74 68 65 20 73 61 6d  ways has the sam
52a0: 65 20 77 65 6c 6c 2d 64 65 66 69 6e 65 64 20 69  e well-defined i
52b0: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61  nterface..*/.sta
52c0: 74 69 63 20 69 6e 74 20 70 6f 73 69 78 4f 70 65  tic int posixOpe
52d0: 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  n(const char *zF
52e0: 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20  ile, int flags, 
52f0: 69 6e 74 20 6d 6f 64 65 29 7b 0a 20 20 72 65 74  int mode){.  ret
5300: 75 72 6e 20 6f 70 65 6e 28 7a 46 69 6c 65 2c 20  urn open(zFile, 
5310: 66 6c 61 67 73 2c 20 6d 6f 64 65 29 3b 0a 7d 0a  flags, mode);.}.
5320: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
5330: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
5340: 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72  int openDirector
5350: 79 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69  y(const char*, i
5360: 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  nt*);.static int
5370: 20 75 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65   unixGetpagesize
5380: 28 76 6f 69 64 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d  (void);../*.** M
5390: 61 6e 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  any system calls
53a0: 20 61 72 65 20 61 63 63 65 73 73 65 64 20 74 68   are accessed th
53b0: 72 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f  rough pointer-to
53c0: 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68  -functions so th
53d0: 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 62  at.** they may b
53e0: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20  e overridden at 
53f0: 72 75 6e 74 69 6d 65 20 74 6f 20 66 61 63 69 6c  runtime to facil
5400: 69 74 61 74 65 20 66 61 75 6c 74 20 69 6e 6a 65  itate fault inje
5410: 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20  ction during.** 
5420: 74 65 73 74 69 6e 67 20 61 6e 64 20 73 61 6e 64  testing and sand
5430: 62 6f 78 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c  boxing.  The fol
5440: 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c  lowing array hol
5450: 64 73 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64  ds the names and
5460: 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20   pointers.** to 
5470: 61 6c 6c 20 6f 76 65 72 72 69 64 65 61 62 6c 65  all overrideable
5480: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a   system calls..*
5490: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
54a0: 75 6e 69 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20  unix_syscall {. 
54b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
54c0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
54d0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79  * Name of the sy
54e0: 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73  stem call */.  s
54f0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
5500: 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20  tr pCurrent; /* 
5510: 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  Current value of
5520: 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   the system call
5530: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
5540: 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 75  scall_ptr pDefau
5550: 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 76  lt; /* Default v
5560: 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61  alue */.} aSysca
5570: 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70  ll[] = {.  { "op
5580: 65 6e 22 2c 20 20 20 20 20 20 20 20 20 28 73 71  en",         (sq
5590: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
55a0: 72 29 70 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20  r)posixOpen,  0 
55b0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70   },.#define osOp
55c0: 65 6e 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29  en      ((int(*)
55d0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
55e0: 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 30  ,int))aSyscall[0
55f0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5600: 20 22 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20   "close",       
5610: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
5620: 6c 5f 70 74 72 29 63 6c 6f 73 65 2c 20 20 20 20  l_ptr)close,    
5630: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
5640: 6f 73 43 6c 6f 73 65 20 20 20 20 20 28 28 69 6e  osClose     ((in
5650: 74 28 2a 29 28 69 6e 74 29 29 61 53 79 73 63 61  t(*)(int))aSysca
5660: 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[1].pCurrent).
5670: 0a 20 20 7b 20 22 61 63 63 65 73 73 22 2c 20 20  .  { "access",  
5680: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
5690: 73 63 61 6c 6c 5f 70 74 72 29 61 63 63 65 73 73  scall_ptr)access
56a0: 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66  ,     0  },.#def
56b0: 69 6e 65 20 6f 73 41 63 63 65 73 73 20 20 20 20  ine osAccess    
56c0: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
56d0: 68 61 72 2a 2c 69 6e 74 29 29 61 53 79 73 63 61  har*,int))aSysca
56e0: 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[2].pCurrent).
56f0: 0a 20 20 7b 20 22 67 65 74 63 77 64 22 2c 20 20  .  { "getcwd",  
5700: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
5710: 73 63 61 6c 6c 5f 70 74 72 29 67 65 74 63 77 64  scall_ptr)getcwd
5720: 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66  ,     0  },.#def
5730: 69 6e 65 20 6f 73 47 65 74 63 77 64 20 20 20 20  ine osGetcwd    
5740: 28 28 63 68 61 72 2a 28 2a 29 28 63 68 61 72 2a  ((char*(*)(char*
5750: 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c  ,size_t))aSyscal
5760: 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[3].pCurrent)..
5770: 20 20 7b 20 22 73 74 61 74 22 2c 20 20 20 20 20    { "stat",     
5780: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
5790: 63 61 6c 6c 5f 70 74 72 29 73 74 61 74 2c 20 20  call_ptr)stat,  
57a0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
57b0: 6e 65 20 6f 73 53 74 61 74 20 20 20 20 20 20 28  ne osStat      (
57c0: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
57d0: 61 72 2a 2c 73 74 72 75 63 74 20 73 74 61 74 2a  ar*,struct stat*
57e0: 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43  ))aSyscall[4].pC
57f0: 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54  urrent)../*.** T
5800: 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65  he DJGPP compile
5810: 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f  r environment lo
5820: 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20  oks mostly like 
5830: 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20  Unix, but it.** 
5840: 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28  lacks the fcntl(
5850: 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20  ) system call.  
5860: 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74  So redefine fcnt
5870: 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68  l() to be someth
5880: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61  ing.** that alwa
5890: 79 73 20 73 75 63 63 65 65 64 73 2e 20 20 54 68  ys succeeds.  Th
58a0: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f  is means that lo
58b0: 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f  cking does not o
58c0: 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a  ccur under.** DJ
58d0: 47 50 50 2e 20 20 42 75 74 20 69 74 20 69 73 20  GPP.  But it is 
58e0: 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20 79  DOS - what did y
58f0: 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69  ou expect?.*/.#i
5900: 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20  fdef __DJGPP__. 
5910: 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20 20   { "fstat",     
5920: 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
5930: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
5940: 69 6e 65 20 6f 73 46 73 74 61 74 28 61 2c 62 2c  ine osFstat(a,b,
5950: 63 29 20 20 20 20 30 0a 23 65 6c 73 65 20 20 20  c)    0.#else   
5960: 20 20 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20    .  { "fstat", 
5970: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
5980: 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 73 74 61  syscall_ptr)fsta
5990: 74 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  t,      0  },.#d
59a0: 65 66 69 6e 65 20 6f 73 46 73 74 61 74 20 20 20  efine osFstat   
59b0: 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73    ((int(*)(int,s
59c0: 74 72 75 63 74 20 73 74 61 74 2a 29 29 61 53 79  truct stat*))aSy
59d0: 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e  scall[5].pCurren
59e0: 74 29 0a 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22  t).#endif..  { "
59f0: 66 74 72 75 6e 63 61 74 65 22 2c 20 20 20 20 28  ftruncate",    (
5a00: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5a10: 70 74 72 29 66 74 72 75 6e 63 61 74 65 2c 20 20  ptr)ftruncate,  
5a20: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
5a30: 46 74 72 75 6e 63 61 74 65 20 28 28 69 6e 74 28  Ftruncate ((int(
5a40: 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53  *)(int,off_t))aS
5a50: 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65  yscall[6].pCurre
5a60: 6e 74 29 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22  nt)..  { "fcntl"
5a70: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
5a80: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63  3_syscall_ptr)fc
5a90: 6e 74 6c 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  ntl,      0  },.
5aa0: 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20  #define osFcntl 
5ab0: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
5ac0: 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61  ,int,...))aSysca
5ad0: 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[7].pCurrent).
5ae0: 0a 20 20 7b 20 22 72 65 61 64 22 2c 20 20 20 20  .  { "read",    
5af0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
5b00: 73 63 61 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20  scall_ptr)read, 
5b10: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
5b20: 69 6e 65 20 6f 73 52 65 61 64 20 20 20 20 20 20  ine osRead      
5b30: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
5b40: 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61  ,void*,size_t))a
5b50: 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72  Syscall[8].pCurr
5b60: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
5b70: 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20  d(USE_PREAD) || 
5b80: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
5b90: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20  CKING_STYLE.  { 
5ba0: 22 70 72 65 61 64 22 2c 20 20 20 20 20 20 20 20  "pread",        
5bb0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
5bc0: 5f 70 74 72 29 70 72 65 61 64 2c 20 20 20 20 20  _ptr)pread,     
5bd0: 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b   0  },.#else.  {
5be0: 20 22 70 72 65 61 64 22 2c 20 20 20 20 20 20 20   "pread",       
5bf0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
5c00: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
5c10: 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23    0  },.#endif.#
5c20: 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64 20 20  define osPread  
5c30: 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28     ((ssize_t(*)(
5c40: 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  int,void*,size_t
5c50: 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,off_t))aSyscall
5c60: 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [9].pCurrent)..#
5c70: 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
5c80: 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70 72 65  READ64).  { "pre
5c90: 61 64 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c  ad64",      (sql
5ca0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
5cb0: 29 70 72 65 61 64 36 34 2c 20 20 20 20 30 20 20  )pread64,    0  
5cc0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 72  },.#else.  { "pr
5cd0: 65 61 64 36 34 22 2c 20 20 20 20 20 20 28 73 71  ead64",      (sq
5ce0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5cf0: 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20  r)0,          0 
5d00: 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69   },.#endif.#defi
5d10: 6e 65 20 6f 73 50 72 65 61 64 36 34 20 20 20 28  ne osPread64   (
5d20: 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c  (ssize_t(*)(int,
5d30: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66  void*,size_t,off
5d40: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d  _t))aSyscall[10]
5d50: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
5d60: 22 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 20  "write",        
5d70: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
5d80: 5f 70 74 72 29 77 72 69 74 65 2c 20 20 20 20 20  _ptr)write,     
5d90: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
5da0: 73 57 72 69 74 65 20 20 20 20 20 28 28 73 73 69  sWrite     ((ssi
5db0: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73  ze_t(*)(int,cons
5dc0: 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29  t void*,size_t))
5dd0: 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75  aSyscall[11].pCu
5de0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
5df0: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c  ned(USE_PREAD) |
5e00: 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
5e10: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
5e20: 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20 20 20  { "pwrite",     
5e30: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
5e40: 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 2c 20 20  ll_ptr)pwrite,  
5e50: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
5e60: 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20 20   { "pwrite",    
5e70: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
5e80: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
5e90: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
5ea0: 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74  .#define osPwrit
5eb0: 65 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a  e    ((ssize_t(*
5ec0: 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  )(int,const void
5ed0: 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29  *,size_t,off_t))
5ee0: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
5ef0: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 31        aSyscall[1
5f00: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  2].pCurrent)..#i
5f10: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
5f20: 45 41 44 36 34 29 0a 20 20 7b 20 22 70 77 72 69  EAD64).  { "pwri
5f30: 74 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69  te64",     (sqli
5f40: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
5f50: 70 77 72 69 74 65 36 34 2c 20 20 20 30 20 20 7d  pwrite64,   0  }
5f60: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72  ,.#else.  { "pwr
5f70: 69 74 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c  ite64",     (sql
5f80: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
5f90: 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20  )0,          0  
5fa0: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
5fb0: 65 20 6f 73 50 77 72 69 74 65 36 34 20 20 28 28  e osPwrite64  ((
5fc0: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63  ssize_t(*)(int,c
5fd0: 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f  onst void*,size_
5fe0: 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20  t,off_t))\.     
5ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
6000: 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72  Syscall[13].pCur
6010: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 68 6d  rent)..  { "fchm
6020: 6f 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  od",       (sqli
6030: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
6040: 66 63 68 6d 6f 64 2c 20 20 20 20 20 20 20 20 20  fchmod,         
6050: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
6060: 73 46 63 68 6d 6f 64 20 20 20 20 28 28 69 6e 74  sFchmod    ((int
6070: 28 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f 74 29 29  (*)(int,mode_t))
6080: 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75  aSyscall[14].pCu
6090: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
60a0: 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46  ned(HAVE_POSIX_F
60b0: 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56  ALLOCATE) && HAV
60c0: 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54  E_POSIX_FALLOCAT
60d0: 45 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65  E.  { "fallocate
60e0: 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ",    (sqlite3_s
60f0: 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78  yscall_ptr)posix
6100: 5f 66 61 6c 6c 6f 63 61 74 65 2c 20 20 30 20 7d  _fallocate,  0 }
6110: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 61 6c  ,.#else.  { "fal
6120: 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c  locate",    (sql
6130: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
6140: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6150: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23     0 },.#endif.#
6160: 64 65 66 69 6e 65 20 6f 73 46 61 6c 6c 6f 63 61  define osFalloca
6170: 74 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c  te ((int(*)(int,
6180: 6f 66 66 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79  off_t,off_t))aSy
6190: 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65  scall[15].pCurre
61a0: 6e 74 29 0a 0a 20 20 7b 20 22 75 6e 6c 69 6e 6b  nt)..  { "unlink
61b0: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
61c0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 75 6e  3_syscall_ptr)un
61d0: 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20 20 20 20  link,           
61e0: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 55  0 },.#define osU
61f0: 6e 6c 69 6e 6b 20 20 20 20 28 28 69 6e 74 28 2a  nlink    ((int(*
6200: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61  )(const char*))a
6210: 53 79 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72  Syscall[16].pCur
6220: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6f 70 65 6e  rent)..  { "open
6230: 44 69 72 65 63 74 6f 72 79 22 2c 20 20 20 20 28  Directory",    (
6240: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
6250: 70 74 72 29 6f 70 65 6e 44 69 72 65 63 74 6f 72  ptr)openDirector
6260: 79 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65  y,      0 },.#de
6270: 66 69 6e 65 20 6f 73 4f 70 65 6e 44 69 72 65 63  fine osOpenDirec
6280: 74 6f 72 79 20 28 28 69 6e 74 28 2a 29 28 63 6f  tory ((int(*)(co
6290: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2a 29 29  nst char*,int*))
62a0: 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75  aSyscall[17].pCu
62b0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6d 6b 64  rrent)..  { "mkd
62c0: 69 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  ir",        (sql
62d0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
62e0: 29 6d 6b 64 69 72 2c 20 20 20 20 20 20 20 20 20  )mkdir,         
62f0: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
6300: 73 4d 6b 64 69 72 20 20 20 20 20 28 28 69 6e 74  sMkdir     ((int
6310: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  (*)(const char*,
6320: 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  mode_t))aSyscall
6330: 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [18].pCurrent)..
6340: 20 20 7b 20 22 72 6d 64 69 72 22 2c 20 20 20 20    { "rmdir",    
6350: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
6360: 63 61 6c 6c 5f 70 74 72 29 72 6d 64 69 72 2c 20  call_ptr)rmdir, 
6370: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6380: 64 65 66 69 6e 65 20 6f 73 52 6d 64 69 72 20 20  define osRmdir  
6390: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
63a0: 74 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c  t char*))aSyscal
63b0: 6c 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[19].pCurrent).
63c0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  .#if defined(HAV
63d0: 45 5f 46 43 48 4f 57 4e 29 0a 20 20 7b 20 22 66  E_FCHOWN).  { "f
63e0: 63 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28 73  chown",       (s
63f0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
6400: 74 72 29 66 63 68 6f 77 6e 2c 20 20 20 20 20 20  tr)fchown,      
6410: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6420: 20 7b 20 22 66 63 68 6f 77 6e 22 2c 20 20 20 20   { "fchown",    
6430: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
6440: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
6450: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6460: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46  ndif.#define osF
6470: 63 68 6f 77 6e 20 20 20 20 28 28 69 6e 74 28 2a  chown    ((int(*
6480: 29 28 69 6e 74 2c 75 69 64 5f 74 2c 67 69 64 5f  )(int,uid_t,gid_
6490: 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e  t))aSyscall[20].
64a0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
64b0: 67 65 74 65 75 69 64 22 2c 20 20 20 20 20 20 28  geteuid",      (
64c0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
64d0: 70 74 72 29 67 65 74 65 75 69 64 2c 20 20 20 20  ptr)geteuid,    
64e0: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
64f0: 65 20 6f 73 47 65 74 65 75 69 64 20 20 20 28 28  e osGeteuid   ((
6500: 75 69 64 5f 74 28 2a 29 28 76 6f 69 64 29 29 61  uid_t(*)(void))a
6510: 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72  Syscall[21].pCur
6520: 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69  rent)..#if !defi
6530: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
6540: 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  WAL) || SQLITE_M
6550: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
6560: 20 7b 20 22 6d 6d 61 70 22 2c 20 20 20 20 20 20   { "mmap",      
6570: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
6580: 61 6c 6c 5f 70 74 72 29 6d 6d 61 70 2c 20 20 20  all_ptr)mmap,   
6590: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
65a0: 6c 73 65 0a 20 20 7b 20 22 6d 6d 61 70 22 2c 20  lse.  { "mmap", 
65b0: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
65c0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20  _syscall_ptr)0, 
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
65e0: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
65f0: 65 20 6f 73 4d 6d 61 70 20 28 28 76 6f 69 64 2a  e osMmap ((void*
6600: 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  (*)(void*,size_t
6610: 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74 2c 6f 66 66  ,int,int,int,off
6620: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d  _t))aSyscall[22]
6630: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
6640: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6650: 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c  OMIT_WAL) || SQL
6660: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
6670: 45 3e 30 0a 20 20 7b 20 22 6d 75 6e 6d 61 70 22  E>0.  { "munmap"
6680: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
6690: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d 75 6e  _syscall_ptr)mun
66a0: 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 30 20  map,          0 
66b0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 6d 75  },.#else.  { "mu
66c0: 6e 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73 71  nmap",       (sq
66d0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
66e0: 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  r)0,            
66f0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23     0 },.#endif.#
6700: 64 65 66 69 6e 65 20 6f 73 4d 75 6e 6d 61 70 20  define osMunmap 
6710: 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a  ((void*(*)(void*
6720: 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c  ,size_t))aSyscal
6730: 6c 5b 32 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[23].pCurrent).
6740: 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50  .#if HAVE_MREMAP
6750: 20 26 26 20 28 21 64 65 66 69 6e 65 64 28 53 51   && (!defined(SQ
6760: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c  LITE_OMIT_WAL) |
6770: 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  | SQLITE_MAX_MMA
6780: 50 5f 53 49 5a 45 3e 30 29 0a 20 20 7b 20 22 6d  P_SIZE>0).  { "m
6790: 72 65 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73  remap",       (s
67a0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
67b0: 74 72 29 6d 72 65 6d 61 70 2c 20 20 20 20 20 20  tr)mremap,      
67c0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
67d0: 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20 20 20   { "mremap",    
67e0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
67f0: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
6800: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6810: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d  ndif.#define osM
6820: 72 65 6d 61 70 20 28 28 76 6f 69 64 2a 28 2a 29  remap ((void*(*)
6830: 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 73 69  (void*,size_t,si
6840: 7a 65 5f 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53  ze_t,int,...))aS
6850: 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72  yscall[24].pCurr
6860: 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e  ent)..#if !defin
6870: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
6880: 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  AL) || SQLITE_MA
6890: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
68a0: 7b 20 22 67 65 74 70 61 67 65 73 69 7a 65 22 2c  { "getpagesize",
68b0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
68c0: 6c 6c 5f 70 74 72 29 75 6e 69 78 47 65 74 70 61  ll_ptr)unixGetpa
68d0: 67 65 73 69 7a 65 2c 20 30 20 7d 2c 0a 23 65 6c  gesize, 0 },.#el
68e0: 73 65 0a 20 20 7b 20 22 67 65 74 70 61 67 65 73  se.  { "getpages
68f0: 69 7a 65 22 2c 20 20 28 73 71 6c 69 74 65 33 5f  ize",  (sqlite3_
6900: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
6910: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6920: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
6930: 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65 20 28   osGetpagesize (
6940: 28 69 6e 74 28 2a 29 28 76 6f 69 64 29 29 61 53  (int(*)(void))aS
6950: 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72  yscall[25].pCurr
6960: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
6970: 64 28 48 41 56 45 5f 52 45 41 44 4c 49 4e 4b 29  d(HAVE_READLINK)
6980: 0a 20 20 7b 20 22 72 65 61 64 6c 69 6e 6b 22 2c  .  { "readlink",
6990: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
69a0: 73 63 61 6c 6c 5f 70 74 72 29 72 65 61 64 6c 69  scall_ptr)readli
69b0: 6e 6b 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  nk,        0 },.
69c0: 23 65 6c 73 65 0a 20 20 7b 20 22 72 65 61 64 6c  #else.  { "readl
69d0: 69 6e 6b 22 2c 20 20 20 20 20 28 73 71 6c 69 74  ink",     (sqlit
69e0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
69f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6a00: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66  0 },.#endif.#def
6a10: 69 6e 65 20 6f 73 52 65 61 64 6c 69 6e 6b 20 28  ine osReadlink (
6a20: 28 73 73 69 7a 65 5f 74 28 2a 29 28 63 6f 6e 73  (ssize_t(*)(cons
6a30: 74 20 63 68 61 72 2a 2c 63 68 61 72 2a 2c 73 69  t char*,char*,si
6a40: 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32  ze_t))aSyscall[2
6a50: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
6a60: 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 4c  f defined(HAVE_L
6a70: 53 54 41 54 29 0a 20 20 7b 20 22 6c 73 74 61 74  STAT).  { "lstat
6a80: 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69  ",         (sqli
6a90: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
6aa0: 6c 73 74 61 74 2c 20 20 20 20 20 20 20 20 20 20  lstat,          
6ab0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6ac0: 6c 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 20  lstat",         
6ad0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
6ae0: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
6af0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6b00: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 73 74 61 74  .#define osLstat
6b10: 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63        ((int(*)(c
6b20: 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74 72 75 63  onst char*,struc
6b30: 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61 6c  t stat*))aSyscal
6b40: 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[27].pCurrent).
6b50: 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68  .}; /* End of th
6b60: 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73  e overrideable s
6b70: 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a  ystem calls */..
6b80: 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73  ./*.** On some s
6b90: 79 73 74 65 6d 73 2c 20 63 61 6c 6c 73 20 74 6f  ystems, calls to
6ba0: 20 66 63 68 6f 77 6e 28 29 20 77 69 6c 6c 20 74   fchown() will t
6bb0: 72 69 67 67 65 72 20 61 20 6d 65 73 73 61 67 65  rigger a message
6bc0: 20 69 6e 20 61 20 73 65 63 75 72 69 74 79 0a 2a   in a security.*
6bd0: 2a 20 6c 6f 67 20 69 66 20 74 68 65 79 20 63 6f  * log if they co
6be0: 6d 65 20 66 72 6f 6d 20 6e 6f 6e 2d 72 6f 6f 74  me from non-root
6bf0: 20 70 72 6f 63 65 73 73 65 73 2e 20 20 53 6f 20   processes.  So 
6c00: 61 76 6f 69 64 20 63 61 6c 6c 69 6e 67 20 66 63  avoid calling fc
6c10: 68 6f 77 6e 28 29 20 69 66 0a 2a 2a 20 77 65 20  hown() if.** we 
6c20: 61 72 65 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 20  are not running 
6c30: 61 73 20 72 6f 6f 74 2e 0a 2a 2f 0a 73 74 61 74  as root..*/.stat
6c40: 69 63 20 69 6e 74 20 72 6f 62 75 73 74 46 63 68  ic int robustFch
6c50: 6f 77 6e 28 69 6e 74 20 66 64 2c 20 75 69 64 5f  own(int fd, uid_
6c60: 74 20 75 69 64 2c 20 67 69 64 5f 74 20 67 69 64  t uid, gid_t gid
6c70: 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  ){.#if defined(H
6c80: 41 56 45 5f 46 43 48 4f 57 4e 29 0a 20 20 72 65  AVE_FCHOWN).  re
6c90: 74 75 72 6e 20 6f 73 47 65 74 65 75 69 64 28 29  turn osGeteuid()
6ca0: 20 3f 20 30 20 3a 20 6f 73 46 63 68 6f 77 6e 28   ? 0 : osFchown(
6cb0: 66 64 2c 75 69 64 2c 67 69 64 29 3b 0a 23 65 6c  fd,uid,gid);.#el
6cc0: 73 65 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23  se.  return 0;.#
6cd0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
6ce0: 68 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53  his is the xSetS
6cf0: 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68  ystemCall() meth
6d00: 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66  od of sqlite3_vf
6d10: 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  s for all of the
6d20: 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46 53 65 73  .** "unix" VFSes
6d30: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
6d40: 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73  _OK opon success
6d50: 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74  fully updating t
6d60: 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  he.** system cal
6d70: 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51  l pointer, or SQ
6d80: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66  LITE_NOTFOUND if
6d90: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e   there is no con
6da0: 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73  figurable.** sys
6db0: 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a  tem call named z
6dc0: 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Name..*/.static 
6dd0: 69 6e 74 20 75 6e 69 78 53 65 74 53 79 73 74 65  int unixSetSyste
6de0: 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33  mCall(.  sqlite3
6df0: 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20  _vfs *pNotUsed, 
6e00: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
6e10: 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20  S pointer.  Not 
6e20: 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  used */.  const 
6e30: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
6e40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
6e50: 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  of system call t
6e60: 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20  o override */.  
6e70: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
6e80: 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a  ptr pNewFunc  /*
6e90: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
6ea0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75  system call valu
6eb0: 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
6ec0: 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  ed int i;.  int 
6ed0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46  rc = SQLITE_NOTF
6ee0: 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  OUND;..  UNUSED_
6ef0: 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73  PARAMETER(pNotUs
6f00: 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ed);.  if( zName
6f10: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
6f20: 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76   no zName is giv
6f30: 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20  en, restore all 
6f40: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20  system calls to 
6f50: 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20  their default.  
6f60: 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e    ** settings an
6f70: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20  d return NULL.  
6f80: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51    */.    rc = SQ
6f90: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72  LITE_OK;.    for
6fa0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
6fb0: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
6fc0: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
6fd0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53  +){.      if( aS
6fe0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
6ff0: 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53  lt ){.        aS
7000: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
7010: 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nt = aSyscall[i]
7020: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
7030: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
7040: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  {.    /* If zNam
7050: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
7060: 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20  operate on only 
7070: 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63  the one system c
7080: 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69  all.    ** speci
7090: 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  fied..    */.   
70a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
70b0: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
70c0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
70d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
70e0: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
70f0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
7100: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
7110: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
7120: 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a  .pDefault==0 ){.
7130: 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61            aSysca
7140: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d  ll[i].pDefault =
7150: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
7160: 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d  rrent;.        }
7170: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
7180: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
7190: 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30   if( pNewFunc==0
71a0: 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53   ) pNewFunc = aS
71b0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
71c0: 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73  lt;.        aSys
71d0: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
71e0: 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20   = pNewFunc;.   
71f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7200: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
7210: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7220: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
7230: 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d  alue of a system
7240: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
7250: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20  ULL if zName is 
7260: 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69  not a.** recogni
7270: 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  zed system call 
7280: 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61  name.  NULL is a
7290: 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
72a0: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  the system call.
72b0: 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
72c0: 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
72d0: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73  atic sqlite3_sys
72e0: 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65 74  call_ptr unixGet
72f0: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
7300: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
7310: 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  sed,.  const cha
7320: 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e  r *zName.){.  un
7330: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20  signed int i;.. 
7340: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
7350: 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66  R(pNotUsed);.  f
7360: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
7370: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
7380: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
7390: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  i++){.    if( st
73a0: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
73b0: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
73c0: 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63  0 ) return aSysc
73d0: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b  all[i].pCurrent;
73e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
73f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
7400: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
7410: 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61   first system ca
7420: 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20  ll after zName. 
7430: 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a   If zName==NULL.
7440: 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  ** then return t
7450: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
7460: 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c  irst system call
7470: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
7480: 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68  f zName.** is th
7490: 65 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61  e last system ca
74a0: 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69  ll or if zName i
74b0: 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f  s not the name o
74c0: 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73  f a valid.** sys
74d0: 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61  tem call..*/.sta
74e0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
74f0: 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61  unixNextSystemCa
7500: 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ll(sqlite3_vfs *
7510: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
7520: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d  Name){.  int i =
7530: 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50   -1;..  UNUSED_P
7540: 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69  ARAMETER(p);.  i
7550: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
7560: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
7570: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31  Size(aSyscall)-1
7580: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
7590: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
75a0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
75b0: 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
75c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
75d0: 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  ++; i<ArraySize(
75e0: 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b  aSyscall); i++){
75f0: 0a 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c  .    if( aSyscal
7600: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30  l[i].pCurrent!=0
7610: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
7620: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d  ll[i].zName;.  }
7630: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
7640: 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 63 63  /*.** Do not acc
7650: 65 70 74 20 61 6e 79 20 66 69 6c 65 20 64 65 73  ept any file des
7660: 63 72 69 70 74 6f 72 20 6c 65 73 73 20 74 68 61  criptor less tha
7670: 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 69 6e  n this value, in
7680: 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 0a   order to avoid.
7690: 2a 2a 20 6f 70 65 6e 69 6e 67 20 64 61 74 61 62  ** opening datab
76a0: 61 73 65 20 66 69 6c 65 20 75 73 69 6e 67 20 66  ase file using f
76b0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
76c0: 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 6c  that are commonl
76d0: 79 20 75 73 65 64 20 66 6f 72 20 0a 2a 2a 20 73  y used for .** s
76e0: 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 6f  tandard input, o
76f0: 75 74 70 75 74 2c 20 61 6e 64 20 65 72 72 6f 72  utput, and error
7700: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
7710: 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45  ITE_MINIMUM_FILE
7720: 5f 44 45 53 43 52 49 50 54 4f 52 0a 23 20 64 65  _DESCRIPTOR.# de
7730: 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 49 4e 49  fine SQLITE_MINI
7740: 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50  MUM_FILE_DESCRIP
7750: 54 4f 52 20 33 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TOR 3.#endif../*
7760: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70 65 6e 28  .** Invoke open(
7770: 29 2e 20 20 44 6f 20 73 6f 20 6d 75 6c 74 69 70  ).  Do so multip
7780: 6c 65 20 74 69 6d 65 73 2c 20 75 6e 74 69 6c 20  le times, until 
7790: 69 74 20 65 69 74 68 65 72 20 73 75 63 63 65 65  it either succee
77a0: 64 73 20 6f 72 0a 2a 2a 20 66 61 69 6c 73 20 66  ds or.** fails f
77b0: 6f 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e 20 6f  or some reason o
77c0: 74 68 65 72 20 74 68 61 6e 20 45 49 4e 54 52 2e  ther than EINTR.
77d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
77e0: 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65  le creation mode
77f0: 20 22 6d 22 20 69 73 20 30 20 74 68 65 6e 20 73   "m" is 0 then s
7800: 65 74 20 69 74 20 74 6f 20 74 68 65 20 64 65 66  et it to the def
7810: 61 75 6c 74 20 66 6f 72 0a 2a 2a 20 53 51 4c 69  ault for.** SQLi
7820: 74 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  te.  The default
7830: 20 69 73 20 53 51 4c 49 54 45 5f 44 45 46 41 55   is SQLITE_DEFAU
7840: 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
7850: 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a  ONS (normally.**
7860: 20 30 36 34 34 29 20 61 73 20 6d 6f 64 69 66 69   0644) as modifi
7870: 65 64 20 62 79 20 74 68 65 20 73 79 73 74 65 6d  ed by the system
7880: 20 75 6d 61 73 6b 2e 20 20 49 66 20 6d 20 69 73   umask.  If m is
7890: 20 6e 6f 74 20 30 2c 20 74 68 65 6e 0a 2a 2a 20   not 0, then.** 
78a0: 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 63 72  make the file cr
78b0: 65 61 74 69 6f 6e 20 6d 6f 64 65 20 62 65 20 65  eation mode be e
78c0: 78 61 63 74 6c 79 20 6d 20 69 67 6e 6f 72 69 6e  xactly m ignorin
78d0: 67 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 0a  g the umask..**.
78e0: 2a 2a 20 54 68 65 20 6d 20 70 61 72 61 6d 65 74  ** The m paramet
78f0: 65 72 20 77 69 6c 6c 20 62 65 20 6e 6f 6e 2d 7a  er will be non-z
7900: 65 72 6f 20 6f 6e 6c 79 20 77 68 65 6e 20 63 72  ero only when cr
7910: 65 61 74 69 6e 67 20 2d 77 61 6c 2c 20 2d 6a 6f  eating -wal, -jo
7920: 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20 2d 73  urnal,.** and -s
7930: 68 6d 20 66 69 6c 65 73 2e 20 20 57 65 20 77 61  hm files.  We wa
7940: 6e 74 20 74 68 6f 73 65 20 66 69 6c 65 73 20 74  nt those files t
7950: 6f 20 68 61 76 65 20 2a 65 78 61 63 74 6c 79 2a  o have *exactly*
7960: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 70 65 72   the same.** per
7970: 6d 69 73 73 69 6f 6e 73 20 61 73 20 74 68 65 69  missions as thei
7980: 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  r original datab
7990: 61 73 65 2c 20 75 6e 61 64 75 6c 74 65 72 61 74  ase, unadulterat
79a0: 65 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e  ed by the umask.
79b0: 0a 2a 2a 20 49 6e 20 74 68 61 74 20 77 61 79 2c  .** In that way,
79c0: 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20 66   if a database f
79d0: 69 6c 65 20 69 73 20 2d 72 77 2d 72 77 2d 72 77  ile is -rw-rw-rw
79e0: 20 6f 72 20 2d 72 77 2d 72 77 2d 72 2d 2c 20 61   or -rw-rw-r-, a
79f0: 6e 64 20 61 0a 2a 2a 20 74 72 61 6e 73 61 63 74  nd a.** transact
7a00: 69 6f 6e 20 63 72 61 73 68 65 73 20 61 6e 64 20  ion crashes and 
7a10: 6c 65 61 76 65 73 20 62 65 68 69 6e 64 20 68 6f  leaves behind ho
7a20: 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e  t journals, then
7a30: 20 61 6e 79 0a 2a 2a 20 70 72 6f 63 65 73 73 20   any.** process 
7a40: 74 68 61 74 20 69 73 20 61 62 6c 65 20 74 6f 20  that is able to 
7a50: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 61 74  write to the dat
7a60: 61 62 61 73 65 20 77 69 6c 6c 20 61 6c 73 6f 20  abase will also 
7a70: 62 65 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 72 65  be able to.** re
7a80: 63 6f 76 65 72 20 74 68 65 20 68 6f 74 20 6a 6f  cover the hot jo
7a90: 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69  urnals..*/.stati
7aa0: 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f 70 65  c int robust_ope
7ab0: 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  n(const char *z,
7ac0: 20 69 6e 74 20 66 2c 20 6d 6f 64 65 5f 74 20 6d   int f, mode_t m
7ad0: 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 6d  ){.  int fd;.  m
7ae0: 6f 64 65 5f 74 20 6d 32 20 3d 20 6d 20 3f 20 6d  ode_t m2 = m ? m
7af0: 20 3a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   : SQLITE_DEFAUL
7b00: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
7b10: 4e 53 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a  NS;.  while(1){.
7b20: 23 69 66 20 64 65 66 69 6e 65 64 28 4f 5f 43 4c  #if defined(O_CL
7b30: 4f 45 58 45 43 29 0a 20 20 20 20 66 64 20 3d 20  OEXEC).    fd = 
7b40: 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43 4c 4f  osOpen(z,f|O_CLO
7b50: 45 58 45 43 2c 6d 32 29 3b 0a 23 65 6c 73 65 0a  EXEC,m2);.#else.
7b60: 20 20 20 20 66 64 20 3d 20 6f 73 4f 70 65 6e 28      fd = osOpen(
7b70: 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64 69 66 0a  z,f,m2);.#endif.
7b80: 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a      if( fd<0 ){.
7b90: 20 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d        if( errno=
7ba0: 3d 45 49 4e 54 52 20 29 20 63 6f 6e 74 69 6e 75  =EINTR ) continu
7bb0: 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;.      break;.
7bc0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64      }.    if( fd
7bd0: 3e 3d 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d  >=SQLITE_MINIMUM
7be0: 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52  _FILE_DESCRIPTOR
7bf0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6f 73   ) break;.    os
7c00: 43 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 73  Close(fd);.    s
7c10: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
7c20: 45 5f 57 41 52 4e 49 4e 47 2c 20 0a 20 20 20 20  E_WARNING, .    
7c30: 20 20 20 20 20 20 20 20 20 20 20 20 22 61 74 74              "att
7c40: 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 5c 22 25  empt to open \"%
7c50: 73 5c 22 20 61 73 20 66 69 6c 65 20 64 65 73 63  s\" as file desc
7c60: 72 69 70 74 6f 72 20 25 64 22 2c 20 7a 2c 20 66  riptor %d", z, f
7c70: 64 29 3b 0a 20 20 20 20 66 64 20 3d 20 2d 31 3b  d);.    fd = -1;
7c80: 0a 20 20 20 20 69 66 28 20 6f 73 4f 70 65 6e 28  .    if( osOpen(
7c90: 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 66 2c 20  "/dev/null", f, 
7ca0: 6d 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m)<0 ) break;.  
7cb0: 7d 0a 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b  }.  if( fd>=0 ){
7cc0: 0a 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b  .    if( m!=0 ){
7cd0: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74  .      struct st
7ce0: 61 74 20 73 74 61 74 62 75 66 3b 0a 20 20 20 20  at statbuf;.    
7cf0: 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 66 64    if( osFstat(fd
7d00: 2c 20 26 73 74 61 74 62 75 66 29 3d 3d 30 20 0a  , &statbuf)==0 .
7d10: 20 20 20 20 20 20 20 26 26 20 73 74 61 74 62 75         && statbu
7d20: 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a 20 20 20  f.st_size==0.   
7d30: 20 20 20 20 26 26 20 28 73 74 61 74 62 75 66 2e      && (statbuf.
7d40: 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 21 3d 6d  st_mode&0777)!=m
7d50: 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
7d60: 20 20 20 6f 73 46 63 68 6d 6f 64 28 66 64 2c 20     osFchmod(fd, 
7d70: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
7d80: 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 46 44  }.#if defined(FD
7d90: 5f 43 4c 4f 45 58 45 43 29 20 26 26 20 28 21 64  _CLOEXEC) && (!d
7da0: 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58 45 43  efined(O_CLOEXEC
7db0: 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45 43 3d 3d  ) || O_CLOEXEC==
7dc0: 30 29 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66  0).    osFcntl(f
7dd0: 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46 63  d, F_SETFD, osFc
7de0: 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c  ntl(fd, F_GETFD,
7df0: 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43   0) | FD_CLOEXEC
7e00: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
7e10: 72 65 74 75 72 6e 20 66 64 3b 0a 7d 0a 0a 2f 2a  return fd;.}../*
7e20: 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74  .** Helper funct
7e30: 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61  ions to obtain a
7e40: 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68  nd relinquish th
7e50: 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20  e global mutex. 
7e60: 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75  The.** global mu
7e70: 74 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70  tex is used to p
7e80: 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69 78 49  rotect the unixI
7e90: 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20  nodeInfo and.** 
7ea0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
7eb0: 6a 65 63 74 73 20 75 73 65 64 20 62 79 20 74 68  jects used by th
7ec0: 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20  is file, all of 
7ed0: 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a  which may be .**
7ee0: 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69   shared by multi
7ef0: 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a  ple threads..**.
7f00: 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78  ** Function unix
7f10: 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75  MutexHeld() is u
7f20: 73 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20  sed to assert() 
7f30: 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20  that the global 
7f40: 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c  mutex .** is hel
7f50: 64 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e  d when required.
7f60: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
7f70: 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70  s only used as p
7f80: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
7f90: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  .** statements. 
7fa0: 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69  e.g..**.**   uni
7fb0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a  xEnterMutex().**
7fc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69       assert( uni
7fd0: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
7fe0: 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4c 65  **   unixEnterLe
7ff0: 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ave().*/.static 
8000: 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72 4d 75  void unixEnterMu
8010: 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  tex(void){.  sql
8020: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
8030: 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
8040: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
8050: 53 54 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d  STATIC_VFS1));.}
8060: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
8070: 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64  xLeaveMutex(void
8080: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
8090: 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
80a0: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
80b0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 56  E_MUTEX_STATIC_V
80c0: 46 53 31 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20  FS1));.}.#ifdef 
80d0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61  SQLITE_DEBUG.sta
80e0: 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 75 74 65  tic int unixMute
80f0: 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20  xHeld(void) {.  
8100: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
8110: 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65  utex_held(sqlite
8120: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
8130: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
8140: 56 46 53 31 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  VFS1));.}.#endif
8150: 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
8160: 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45 0a 2f  _HAVE_OS_TRACE./
8170: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
8180: 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e  tion for printin
8190: 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f  g out trace info
81a0: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62  rmation from deb
81b0: 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69  ugging.** binari
81c0: 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73  es. This returns
81d0: 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72   the string repr
81e0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
81f0: 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e  e supplied.** in
8200: 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e  teger lock-type.
8210: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
8220: 20 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63   char *azFileLoc
8230: 6b 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  k(int eFileLock)
8240: 7b 0a 20 20 73 77 69 74 63 68 28 20 65 46 69 6c  {.  switch( eFil
8250: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73  eLock ){.    cas
8260: 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  e NO_LOCK: retur
8270: 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61  n "NONE";.    ca
8280: 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20  se SHARED_LOCK: 
8290: 72 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b  return "SHARED";
82a0: 0a 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56  .    case RESERV
82b0: 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  ED_LOCK: return 
82c0: 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20  "RESERVED";.    
82d0: 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  case PENDING_LOC
82e0: 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49  K: return "PENDI
82f0: 4e 47 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58  NG";.    case EX
8300: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65  CLUSIVE_LOCK: re
8310: 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22  turn "EXCLUSIVE"
8320: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22  ;.  }.  return "
8330: 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66  ERROR";.}.#endif
8340: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
8350: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  LOCK_TRACE./*.**
8360: 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72   Print out infor
8370: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c  mation about all
8380: 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69   locking operati
8390: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
83a0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
83b0: 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74  for troubleshoot
83c0: 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c  ing locks on mul
83d0: 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c  tithreaded.** pl
83e0: 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65  atforms.  Enable
83f0: 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69   by compiling wi
8400: 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f  th the -DSQLITE_
8410: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f  LOCK_TRACE.** co
8420: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f  mmand-line optio
8430: 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  n on the compile
8440: 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73  r.  This code is
8450: 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72   normally.** tur
8460: 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  ned off..*/.stat
8470: 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65  ic int lockTrace
8480: 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c  (int fd, int op,
8490: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70   struct flock *p
84a0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61  ){.  char *zOpNa
84b0: 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e  me, *zType;.  in
84c0: 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  t s;.  int saved
84d0: 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d  Errno;.  if( op=
84e0: 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20  =F_GETLK ){.    
84f0: 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b  zOpName = "GETLK
8500: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  ";.  }else if( o
8510: 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20  p==F_SETLK ){.  
8520: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54    zOpName = "SET
8530: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  LK";.  }else{.  
8540: 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64    s = osFcntl(fd
8550: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71  , op, p);.    sq
8560: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
8570: 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20  ("fcntl unknown 
8580: 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c  %d %d %d\n", fd,
8590: 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74   op, s);.    ret
85a0: 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28  urn s;.  }.  if(
85b0: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   p->l_type==F_RD
85c0: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
85d0: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65   = "RDLCK";.  }e
85e0: 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  lse if( p->l_typ
85f0: 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20  e==F_WRLCK ){.  
8600: 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b    zType = "WRLCK
8610: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
8620: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43  ->l_type==F_UNLC
8630: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
8640: 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "UNLCK";.  }els
8650: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  e{.    assert( 0
8660: 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
8670: 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53  ( p->l_whence==S
8680: 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d  EEK_SET );.  s =
8690: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c   osFcntl(fd, op,
86a0: 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e   p);.  savedErrn
86b0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c  o = errno;.  sql
86c0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
86d0: 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20  "fcntl %d %d %s 
86e0: 25 73 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e  %s %d %d %d %d\n
86f0: 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64 69 64  ",.     threadid
8700: 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a  , fd, zOpName, z
8710: 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f  Type, (int)p->l_
8720: 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c  start, (int)p->l
8730: 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29  _len,.     (int)
8740: 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20  p->l_pid, s);.  
8750: 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f  if( s==(-1) && o
8760: 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70  p==F_SETLK && (p
8770: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
8780: 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d  K || p->l_type==
8790: 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20  F_WRLCK) ){.    
87a0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b  struct flock l2;
87b0: 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20  .    l2 = *p;.  
87c0: 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f    osFcntl(fd, F_
87d0: 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20  GETLK, &l2);.   
87e0: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
87f0: 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
8800: 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22   zType = "RDLCK"
8810: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8820: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  l2.l_type==F_WRL
8830: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
8840: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20  e = "WRLCK";.   
8850: 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f   }else if( l2.l_
8860: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
8870: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
8880: 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  UNLCK";.    }els
8890: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
88a0: 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0 );.    }.    
88b0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
88c0: 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72  tf("fcntl-failur
88d0: 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20  e-reason: %s %d 
88e0: 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %d\n",.      
88f0: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e   zType, (int)l2.
8900: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32  l_start, (int)l2
8910: 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e  .l_len, (int)l2.
8920: 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72  l_pid);.  }.  er
8930: 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f  rno = savedErrno
8940: 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a  ;.  return s;.}.
8950: 23 75 6e 64 65 66 20 6f 73 46 63 6e 74 6c 0a 23  #undef osFcntl.#
8960: 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 6c  define osFcntl l
8970: 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20  ockTrace.#endif 
8980: 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  /* SQLITE_LOCK_T
8990: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  RACE */../*.** R
89a0: 65 74 72 79 20 66 74 72 75 6e 63 61 74 65 28 29  etry ftruncate()
89b0: 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c   calls that fail
89c0: 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2a   due to EINTR.**
89d0: 0a 2a 2a 20 41 6c 6c 20 63 61 6c 6c 73 20 74 6f  .** All calls to
89e0: 20 66 74 72 75 6e 63 61 74 65 28 29 20 77 69 74   ftruncate() wit
89f0: 68 69 6e 20 74 68 69 73 20 66 69 6c 65 20 73 68  hin this file sh
8a00: 6f 75 6c 64 20 62 65 20 6d 61 64 65 20 74 68 72  ould be made thr
8a10: 6f 75 67 68 0a 2a 2a 20 74 68 69 73 20 77 72 61  ough.** this wra
8a20: 70 70 65 72 2e 20 20 4f 6e 20 74 68 65 20 41 6e  pper.  On the An
8a30: 64 72 6f 69 64 20 70 6c 61 74 66 6f 72 6d 2c 20  droid platform, 
8a40: 62 79 70 61 73 73 69 6e 67 20 74 68 65 20 6c 6f  bypassing the lo
8a50: 67 69 63 20 62 65 6c 6f 77 0a 2a 2a 20 63 6f 75  gic below.** cou
8a60: 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 63 6f 72  ld lead to a cor
8a70: 72 75 70 74 20 64 61 74 61 62 61 73 65 2e 0a 2a  rupt database..*
8a80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62  /.static int rob
8a90: 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 69 6e  ust_ftruncate(in
8aa0: 74 20 68 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  t h, sqlite3_int
8ab0: 36 34 20 73 7a 29 7b 0a 20 20 69 6e 74 20 72 63  64 sz){.  int rc
8ac0: 3b 0a 23 69 66 64 65 66 20 5f 5f 41 4e 44 52 4f  ;.#ifdef __ANDRO
8ad0: 49 44 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 41 6e 64  ID__.  /* On And
8ae0: 72 6f 69 64 2c 20 66 74 72 75 6e 63 61 74 65 28  roid, ftruncate(
8af0: 29 20 61 6c 77 61 79 73 20 75 73 65 73 20 33 32  ) always uses 32
8b00: 2d 62 69 74 20 6f 66 66 73 65 74 73 2c 20 65 76  -bit offsets, ev
8b10: 65 6e 20 69 66 20 0a 20 20 2a 2a 20 5f 46 49 4c  en if .  ** _FIL
8b20: 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 3d 36 34  E_OFFSET_BITS=64
8b30: 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69   is defined. Thi
8b40: 73 20 6d 65 61 6e 73 20 69 74 20 69 73 20 75 6e  s means it is un
8b50: 73 61 66 65 20 74 6f 20 61 74 74 65 6d 70 74 20  safe to attempt 
8b60: 74 6f 0a 20 20 2a 2a 20 74 72 75 6e 63 61 74 65  to.  ** truncate
8b70: 20 61 20 66 69 6c 65 20 74 6f 20 61 6e 79 20 73   a file to any s
8b80: 69 7a 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ize larger than 
8b90: 32 47 69 42 2e 20 53 69 6c 65 6e 74 6c 79 20 69  2GiB. Silently i
8ba0: 67 6e 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 73  gnore any.  ** s
8bb0: 75 63 68 20 61 74 74 65 6d 70 74 73 2e 20 20 2a  uch attempts.  *
8bc0: 2f 0a 20 20 69 66 28 20 73 7a 3e 28 73 71 6c 69  /.  if( sz>(sqli
8bd0: 74 65 33 5f 69 6e 74 36 34 29 30 78 37 46 46 46  te3_int64)0x7FFF
8be0: 46 46 46 46 20 29 7b 0a 20 20 20 20 72 63 20 3d  FFFF ){.    rc =
8bf0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
8c00: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 64 6f 7b  lse.#endif.  do{
8c10: 20 72 63 20 3d 20 6f 73 46 74 72 75 6e 63 61 74   rc = osFtruncat
8c20: 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c 65 28  e(h,sz); }while(
8c30: 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
8c40: 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72  EINTR );.  retur
8c50: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
8c60: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61 6e  his routine tran
8c70: 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64 61 72  slates a standar
8c80: 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f  d POSIX errno co
8c90: 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e  de into somethin
8ca0: 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20 74  g.** useful to t
8cb0: 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20 74 68  he clients of th
8cc0: 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63 74 69  e sqlite3 functi
8cd0: 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c  ons.  Specifical
8ce0: 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74  ly, it is.** int
8cf0: 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73 6c 61  ended to transla
8d00: 74 65 20 61 20 76 61 72 69 65 74 79 20 6f 66 20  te a variety of 
8d10: 22 74 72 79 20 61 67 61 69 6e 22 20 65 72 72 6f  "try again" erro
8d20: 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42  rs into SQLITE_B
8d30: 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72  USY.** and a var
8d40: 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73 65 20  iety of "please 
8d50: 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64  close the file d
8d60: 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22 20 65  escriptor NOW" e
8d70: 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53  rrors into .** S
8d80: 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a  QLITE_IOERR.** .
8d90: 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69 6e 67  ** Errors during
8da0: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
8db0: 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c  of locks, or fil
8dc0: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
8dd0: 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73   for locks,.** s
8de0: 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f  hould handle ENO
8df0: 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f  LCK, ENOTSUP, EO
8e00: 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72 61 74  PNOTSUPP separat
8e10: 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ely..*/.static i
8e20: 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72  nt sqliteErrorFr
8e30: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74  omPosixError(int
8e40: 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e 74   posixError, int
8e50: 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a   sqliteIOErr) {.
8e60: 20 20 61 73 73 65 72 74 28 20 28 73 71 6c 69 74    assert( (sqlit
8e70: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
8e80: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20  _IOERR_LOCK) || 
8e90: 0a 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69  .          (sqli
8ea0: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
8eb0: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20  E_IOERR_UNLOCK) 
8ec0: 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 73  || .          (s
8ed0: 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51  qliteIOErr == SQ
8ee0: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
8ef0: 4b 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  K) ||.          
8f00: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
8f10: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
8f20: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 20  CKRESERVEDLOCK) 
8f30: 29 3b 0a 20 20 73 77 69 74 63 68 20 28 70 6f 73  );.  switch (pos
8f40: 69 78 45 72 72 6f 72 29 20 7b 0a 20 20 63 61 73  ixError) {.  cas
8f50: 65 20 45 41 43 43 45 53 3a 20 0a 20 20 63 61 73  e EACCES: .  cas
8f60: 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61 73 65  e EAGAIN:.  case
8f70: 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61   ETIMEDOUT:.  ca
8f80: 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61 73 65  se EBUSY:.  case
8f90: 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65 20 45   EINTR:.  case E
8fa0: 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20  NOLCK:  .    /* 
8fb0: 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74 72 79  random NFS retry
8fc0: 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64   error, unless d
8fd0: 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65  uring file syste
8fe0: 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20  m support .     
8ff0: 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c  * introspection,
9000: 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63 74   in which it act
9010: 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74  ually means what
9020: 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20 20 20   it says */.    
9030: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
9040: 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20  SY;.    .  case 
9050: 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65 74 75  EPERM: .    retu
9060: 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
9070: 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74 3a 20      .  default: 
9080: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
9090: 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a  teIOErr;.  }.}..
90a0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
90b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
90c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
90d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
90e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
90f0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
9100: 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71 75 65  *** Begin Unique
9110: 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79   File ID Utility
9120: 20 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73   Used By VxWorks
9130: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
9140: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76  .**.** On most v
9150: 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c  ersions of unix,
9160: 20 77 65 20 63 61 6e 20 67 65 74 20 61 20 75 6e   we can get a un
9170: 69 71 75 65 20 49 44 20 66 6f 72 20 61 20 66 69  ique ID for a fi
9180: 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e 61 74  le by concatenat
9190: 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76 69 63  ing.** the devic
91a0: 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  e number and the
91b0: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20   inode number.  
91c0: 42 75 74 20 74 68 69 73 20 64 6f 65 73 20 6e 6f  But this does no
91d0: 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b  t work on VxWork
91e0: 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73  s..** On VxWorks
91f0: 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20  , a unique file 
9200: 69 64 20 6d 75 73 74 20 62 65 20 62 61 73 65 64  id must be based
9210: 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61   on the canonica
9220: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a  l filename..**.*
9230: 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  * A pointer to a
9240: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
9250: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
9260: 63 74 75 72 65 20 63 61 6e 20 62 65 20 75 73 65  cture can be use
9270: 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65  d as a.** unique
9280: 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78 57 6f   file ID in VxWo
9290: 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73 74 61  rks.  Each insta
92a0: 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
92b0: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a  cture contains.*
92c0: 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  * a copy of the 
92d0: 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  canonical filena
92e0: 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20 61 6c  me.  There is al
92f0: 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65 20 63  so a reference c
9300: 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73  ount.  .** The s
9310: 74 72 75 63 74 75 72 65 20 69 73 20 72 65 63 6c  tructure is recl
9320: 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65 20 6e  aimed when the n
9330: 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72  umber of pointer
9340: 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20 74 6f  s to it drops to
9350: 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  .** zero..**.** 
9360: 54 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20  There are never 
9370: 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65 73 20  very many files 
9380: 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65  open at one time
9390: 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65   and lookups are
93a0: 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72   not.** a perfor
93b0: 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c 20 70  mance-critical p
93c0: 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20 73 75  ath, so it is su
93d0: 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75 74 20  fficient to put 
93e0: 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63 74 75  these.** structu
93f0: 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20  res on a linked 
9400: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  list..*/.struct 
9410: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a  vxworksFileId {.
9420: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
9430: 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20 20  FileId *pNext;  
9440: 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c 69 73  /* Next in a lis
9450: 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f  t of them all */
9460: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
9470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9480: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
9490: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73  ferences to this
94a0: 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e   one */.  int nN
94b0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
94c0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
94d0: 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69  h of the zCanoni
94e0: 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67  calName[] string
94f0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e   */.  char *zCan
9500: 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20  onicalName;     
9510: 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c      /* Canonical
9520: 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a   filename */.};.
9530: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
9540: 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75  /* .** All uniqu
9550: 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20  e filenames are 
9560: 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64  held on a linked
9570: 20 6c 69 73 74 20 68 65 61 64 65 64 20 62 79 20   list headed by 
9580: 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65  this.** variable
9590: 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  :.*/.static stru
95a0: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
95b0: 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73   *vxworksFileLis
95c0: 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69  t = 0;../*.** Si
95d0: 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d  mplify a filenam
95e0: 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e  e into its canon
95f0: 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20  ical form.** by 
9600: 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  making the follo
9610: 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a  wing changes:.**
9620: 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20  .**  * removing 
9630: 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61 6e 64  any trailing and
9640: 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20   duplicate /.** 
9650: 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69   * convert /./ i
9660: 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a  nto just /.**  *
9670: 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20   convert /A/../ 
9680: 77 68 65 72 65 20 41 20 69 73 20 61 6e 79 20 73  where A is any s
9690: 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20  imple name into 
96a0: 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61  just /.**.** Cha
96b0: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 6e  nges are made in
96c0: 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72 6e 20  -place.  Return 
96d0: 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e  the new name len
96e0: 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  gth..**.** The o
96f0: 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  riginal filename
9700: 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d   is in z[0..n-1]
9710: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
9720: 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61  mber of.** chara
9730: 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 69 6d  cters in the sim
9740: 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f  plified name..*/
9750: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78 77 6f  .static int vxwo
9760: 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28  rksSimplifyName(
9770: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b  char *z, int n){
9780: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77  .  int i, j;.  w
9790: 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e  hile( n>1 && z[n
97a0: 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b  -1]=='/' ){ n--;
97b0: 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20   }.  for(i=j=0; 
97c0: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<n; i++){.    i
97d0: 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a  f( z[i]=='/' ){.
97e0: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
97f0: 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65  =='/' ) continue
9800: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  ;.      if( z[i+
9810: 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e  1]=='.' && i+2<n
9820: 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20   && z[i+2]=='/' 
9830: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20  ){.        i += 
9840: 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  1;.        conti
9850: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
9860: 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27     if( z[i+1]=='
9870: 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a  .' && i+3<n && z
9880: 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b  [i+2]=='.' && z[
9890: 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i+3]=='/' ){.   
98a0: 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20       while( j>0 
98b0: 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29  && z[j-1]!='/' )
98c0: 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20  { j--; }.       
98d0: 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b   if( j>0 ){ j--;
98e0: 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20   }.        i += 
98f0: 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  2;.        conti
9900: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
9910: 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20   }.    z[j++] = 
9920: 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d  z[i];.  }.  z[j]
9930: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a   = 0;.  return j
9940: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
9950: 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44  a unique file ID
9960: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 61   for the given a
9970: 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65  bsolute pathname
9980: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  .  Return.** a p
9990: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 76 78  ointer to the vx
99a0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
99b0: 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 65  ct.  This pointe
99c0: 72 20 69 73 20 74 68 65 20 75 6e 69 71 75 65 0a  r is the unique.
99d0: 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a  ** file ID..**.*
99e0: 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65 6c 64  * The nRef field
99f0: 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b 73 46   of the vxworksF
9a00: 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20  ileId object is 
9a10: 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65 66 6f  incremented befo
9a20: 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74  re.** the object
9a30: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41   is returned.  A
9a40: 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69 6c 65   new vxworksFile
9a50: 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  Id object is cre
9a60: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65  ated.** and adde
9a70: 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20  d to the global 
9a80: 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73 61 72  list if necessar
9a90: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  y..**.** If a me
9aa0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
9ab0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
9ac0: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  turn NULL..*/.st
9ad0: 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77 6f  atic struct vxwo
9ae0: 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72  rksFileId *vxwor
9af0: 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e  ksFindFileId(con
9b00: 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75  st char *zAbsolu
9b10: 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75 63  teName){.  struc
9b20: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
9b30: 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 2f  *pNew;         /
9b40: 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61 6e 64  * search key and
9b50: 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a   new file ID */.
9b60: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
9b70: 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69 64 61  FileId *pCandida
9b80: 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f  te;   /* For loo
9b90: 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73 74 69  ping over existi
9ba0: 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20  ng file IDs */. 
9bb0: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bd0: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
9be0: 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20  f zAbsoluteName 
9bf0: 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73  string */..  ass
9c00: 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61  ert( zAbsoluteNa
9c10: 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20  me[0]=='/' );.  
9c20: 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
9c30: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a  zAbsoluteName);.
9c40: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
9c50: 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f  _malloc64( sizeo
9c60: 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29  f(*pNew) + (n+1)
9c70: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
9c80: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
9c90: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
9ca0: 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
9cb0: 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79  New[1];.  memcpy
9cc0: 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61  (pNew->zCanonica
9cd0: 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65  lName, zAbsolute
9ce0: 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20  Name, n+1);.  n 
9cf0: 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66  = vxworksSimplif
9d00: 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e  yName(pNew->zCan
9d10: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a  onicalName, n);.
9d20: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
9d30: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   an existing ent
9d40: 72 79 20 74 68 61 74 20 6d 61 74 63 68 69 6e 67  ry that matching
9d50: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e   the canonical n
9d60: 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75  ame..  ** If fou
9d70: 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  nd, increment th
9d80: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
9d90: 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  t and return a p
9da0: 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74  ointer to.  ** t
9db0: 68 65 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  he existing file
9dc0: 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78   ID..  */.  unix
9dd0: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
9de0: 66 6f 72 28 70 43 61 6e 64 69 64 61 74 65 3d 76  for(pCandidate=v
9df0: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20  xworksFileList; 
9e00: 70 43 61 6e 64 69 64 61 74 65 3b 20 70 43 61 6e  pCandidate; pCan
9e10: 64 69 64 61 74 65 3d 70 43 61 6e 64 69 64 61 74  didate=pCandidat
9e20: 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  e->pNext){.    i
9e30: 66 28 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e  f( pCandidate->n
9e40: 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26  Name==n .     &&
9e50: 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69 64 61   memcmp(pCandida
9e60: 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  te->zCanonicalNa
9e70: 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  me, pNew->zCanon
9e80: 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a  icalName, n)==0.
9e90: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71      ){.       sq
9ea0: 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
9eb0: 3b 0a 20 20 20 20 20 20 20 70 43 61 6e 64 69 64  ;.       pCandid
9ec0: 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  ate->nRef++;.   
9ed0: 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
9ee0: 65 78 28 29 3b 0a 20 20 20 20 20 20 20 72 65 74  ex();.       ret
9ef0: 75 72 6e 20 70 43 61 6e 64 69 64 61 74 65 3b 0a  urn pCandidate;.
9f00: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
9f10: 4e 6f 20 6d 61 74 63 68 20 77 61 73 20 66 6f 75  No match was fou
9f20: 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b  nd.  We will mak
9f30: 65 20 61 20 6e 65 77 20 66 69 6c 65 20 49 44 20  e a new file ID 
9f40: 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20  */.  pNew->nRef 
9f50: 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61  = 1;.  pNew->nNa
9f60: 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e  me = n;.  pNew->
9f70: 70 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b 73 46  pNext = vxworksF
9f80: 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72  ileList;.  vxwor
9f90: 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65  ksFileList = pNe
9fa0: 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  w;.  unixLeaveMu
9fb0: 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
9fc0: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  pNew;.}../*.** D
9fd0: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
9fe0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
9ff0: 61 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  a vxworksFileId 
a000: 6f 62 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a  object.  Free.**
a010: 20 74 68 65 20 6f 62 6a 65 63 74 20 77 68 65 6e   the object when
a020: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
a030: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
a040: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  o..*/.static voi
a050: 64 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65  d vxworksRelease
a060: 46 69 6c 65 49 64 28 73 74 72 75 63 74 20 76 78  FileId(struct vx
a070: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
a080: 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  ){.  unixEnterMu
a090: 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28  tex();.  assert(
a0a0: 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pId->nRef>0 );.
a0b0: 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pId->nRef--;. 
a0c0: 20 69 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d   if( pId->nRef==
a0d0: 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
a0e0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a  vxworksFileId **
a0f0: 70 70 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26  pp;.    for(pp=&
a100: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b  vxworksFileList;
a110: 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70 49 64   *pp && *pp!=pId
a120: 3b 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e  ; pp = &((*pp)->
a130: 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20 61 73  pNext)){}.    as
a140: 73 65 72 74 28 20 2a 70 70 3d 3d 70 49 64 20 29  sert( *pp==pId )
a150: 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 64 2d  ;.    *pp = pId-
a160: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
a170: 74 65 33 5f 66 72 65 65 28 70 49 64 29 3b 0a 20  te3_free(pId);. 
a180: 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
a190: 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  tex();.}.#endif 
a1a0: 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
a1b0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
a1c0: 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71 75 65 20  * End of Unique 
a1d0: 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20  File ID Utility 
a1e0: 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20  Used By VxWorks 
a1f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a200: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
a210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
a250: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
a260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a2a0: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
a2b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50  ************** P
a2c0: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
a2d0: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
a2e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a2f0: 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61  **.**.** POSIX a
a300: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72  dvisory locks ar
a310: 65 20 62 72 6f 6b 65 6e 20 62 79 20 64 65 73 69  e broken by desi
a320: 67 6e 2e 20 20 41 4e 53 49 20 53 54 44 20 31 30  gn.  ANSI STD 10
a330: 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73  03.1 (1996).** s
a340: 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c  ection 6.5.2.2 l
a350: 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67 68  ines 483 through
a360: 20 34 39 30 20 73 70 65 63 69 66 79 20 74 68 61   490 specify tha
a370: 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73  t when a process
a380: 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61  .** sets or clea
a390: 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20  rs a lock, that 
a3a0: 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69  operation overri
a3b0: 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f  des any prior lo
a3c0: 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68  cks set.** by th
a3d0: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20  e same process. 
a3e0: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70   It does not exp
a3f0: 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20  licitly say so, 
a400: 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73  but this implies
a410: 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72  .** that it over
a420: 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20  rides locks set 
a430: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
a440: 65 73 73 20 75 73 69 6e 67 20 61 20 64 69 66 66  ess using a diff
a450: 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65  erent.** file de
a460: 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69  scriptor.  Consi
a470: 64 65 72 20 74 68 69 73 20 74 65 73 74 20 63 61  der this test ca
a480: 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  se:.**.**       
a490: 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22  int fd1 = open("
a4a0: 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52  ./file1", O_RDWR
a4b0: 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b  |O_CREAT, 0644);
a4c0: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64  .**       int fd
a4d0: 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65  2 = open("./file
a4e0: 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  2", O_RDWR|O_CRE
a4f0: 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a  AT, 0644);.**.**
a500: 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31   Suppose ./file1
a510: 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65   and ./file2 are
a520: 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65   really the same
a530: 20 66 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a   file (because.*
a540: 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20  * one is a hard 
a550: 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b  or symbolic link
a560: 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74   to the other) t
a570: 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a  hen if you set.*
a580: 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  * an exclusive l
a590: 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e  ock on fd1, then
a5a0: 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65   try to get an e
a5b0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a  xclusive lock.**
a5c0: 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b   on fd2, it work
a5d0: 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65  s.  I would have
a5e0: 20 65 78 70 65 63 74 65 64 20 74 68 65 20 73 65   expected the se
a5f0: 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20  cond lock to.** 
a600: 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65  fail since there
a610: 20 77 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c   was already a l
a620: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
a630: 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42  due to fd1..** B
a640: 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63  ut not so.  Sinc
a650: 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d  e both locks cam
a660: 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20  e from the same 
a670: 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20  process, the.** 
a680: 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73  second overrides
a690: 20 74 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e   the first, even
a6a0: 20 74 68 6f 75 67 68 20 74 68 65 79 20 77 65 72   though they wer
a6b0: 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a  e on different.*
a6c0: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
a6d0: 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66  rs opened on dif
a6e0: 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65  ferent file name
a6f0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65  s..**.** This me
a700: 61 6e 73 20 74 68 61 74 20 77 65 20 63 61 6e 6e  ans that we cann
a710: 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63  ot use POSIX loc
a720: 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a  ks to synchroniz
a730: 65 20 66 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a  e file access.**
a740: 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67   among competing
a750: 20 74 68 72 65 61 64 73 20 6f 66 20 74 68 65 20   threads of the 
a760: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50  same process.  P
a770: 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20  OSIX locks will 
a780: 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20  work fine.** to 
a790: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65  synchronize acce
a7a0: 73 73 20 66 6f 72 20 74 68 72 65 61 64 73 20 69  ss for threads i
a7b0: 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  n separate proce
a7c0: 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a  sses, but not.**
a7d0: 20 74 68 72 65 61 64 73 20 77 69 74 68 69 6e 20   threads within 
a7e0: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
a7f0: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
a800: 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c  around the probl
a810: 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74  em, SQLite has t
a820: 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f  o manage file lo
a830: 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  cks internally.*
a840: 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57  * on its own.  W
a850: 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61  henever a new da
a860: 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
a870: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e  , we have to fin
a880: 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69  d the.** specifi
a890: 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64  c inode of the d
a8a0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 74 68  atabase file (th
a8b0: 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72  e inode is deter
a8c0: 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  mined by the.** 
a8d0: 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e  st_dev and st_in
a8e0: 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  o fields of the 
a8f0: 73 74 61 74 20 73 74 72 75 63 74 75 72 65 20 74  stat structure t
a900: 68 61 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c  hat fstat() fill
a910: 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65  s in).** and che
a920: 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72  ck for locks alr
a930: 65 61 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e  eady existing on
a940: 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68   that inode.  Wh
a950: 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20  en locks are.** 
a960: 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76  created or remov
a970: 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c  ed, we have to l
a980: 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69  ook at our own i
a990: 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f  nternal record o
a9a0: 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74  f the.** locks t
a9b0: 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
a9c0: 20 74 68 72 65 61 64 20 68 61 73 20 70 72 65 76   thread has prev
a9d0: 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63  iously set a loc
a9e0: 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a  k on that same.*
a9f0: 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28  * inode..**.** (
aa00: 41 73 69 64 65 3a 20 54 68 65 20 75 73 65 20 6f  Aside: The use o
aa10: 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20  f inode numbers 
aa20: 61 73 20 75 6e 69 71 75 65 20 49 44 73 20 64 6f  as unique IDs do
aa30: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56  es not work on V
aa40: 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56  xWorks..** For V
aa50: 78 57 6f 72 6b 73 2c 20 77 65 20 68 61 76 65 20  xWorks, we have 
aa60: 74 6f 20 75 73 65 20 74 68 65 20 61 6c 74 65 72  to use the alter
aa70: 6e 61 74 69 76 65 20 75 6e 69 71 75 65 20 49 44  native unique ID
aa80: 20 73 79 73 74 65 6d 20 62 61 73 65 64 20 6f 6e   system based on
aa90: 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  .** canonical fi
aaa0: 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65  lename and imple
aab0: 6d 65 6e 74 65 64 20 69 6e 20 74 68 65 20 70 72  mented in the pr
aac0: 65 76 69 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e  evious division.
aad0: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ).**.** The sqli
aae0: 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
aaf0: 72 65 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20  re for POSIX is 
ab00: 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61  no longer just a
ab10: 6e 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a  n integer file.*
ab20: 2a 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49  * descriptor.  I
ab30: 74 20 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63  t is now a struc
ab40: 74 75 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20  ture that holds 
ab50: 74 68 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65  the integer file
ab60: 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61  .** descriptor a
ab70: 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  nd a pointer to 
ab80: 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  a structure that
ab90: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69   describes the i
aba0: 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73  nternal.** locks
abb0: 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f   on the correspo
abc0: 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68  nding inode.  Th
abd0: 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69  ere is one locki
abe0: 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  ng structure.** 
abf0: 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66  per inode, so if
ac00: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
ac10: 69 73 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c  is opened twice,
ac20: 20 62 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73   both unixFile s
ac30: 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69  tructures.** poi
ac40: 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c  nt to the same l
ac50: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
ac60: 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73  .  The locking s
ac70: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a  tructure keeps.*
ac80: 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f  * a reference co
ac90: 75 6e 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20  unt (so we will 
aca0: 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c  know when to del
acb0: 65 74 65 20 69 74 29 20 61 6e 64 20 61 20 22 63  ete it) and a "c
acc0: 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61  nt".** field tha
acd0: 74 20 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69  t tells us its i
ace0: 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  nternal lock sta
acf0: 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61  tus.  cnt==0 mea
ad00: 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69  ns the.** file i
ad10: 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74  s unlocked.  cnt
ad20: 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66  ==-1 means the f
ad30: 69 6c 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75  ile has an exclu
ad40: 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e  sive lock..** cn
ad50: 74 3e 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20  t>0 means there 
ad60: 61 72 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c  are cnt shared l
ad70: 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65  ocks on the file
ad80: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65  ..**.** Any atte
ad90: 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75  mpt to lock or u
ada0: 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72  nlock a file fir
adb0: 73 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f  st checks the lo
adc0: 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  cking.** structu
add0: 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29  re.  The fcntl()
ade0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20   system call is 
adf0: 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20  only invoked to 
ae00: 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20  set a .** POSIX 
ae10: 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65  lock if the inte
ae20: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74  rnal lock struct
ae30: 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ure transitions 
ae40: 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63  between.** a loc
ae50: 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63  ked and an unloc
ae60: 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ked state..**.**
ae70: 20 42 75 74 20 77 61 69 74 3a 20 20 74 68 65 72   But wait:  ther
ae80: 65 20 61 72 65 20 79 65 74 20 6d 6f 72 65 20 70  e are yet more p
ae90: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 50 4f 53  roblems with POS
aea0: 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  IX advisory lock
aeb0: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20  s..**.** If you 
aec0: 63 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73  close a file des
aed0: 63 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69  criptor that poi
aee0: 6e 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68  nts to a file th
aef0: 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a  at has locks,.**
af00: 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68   all locks on th
af10: 61 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65  at file that are
af20: 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 75   owned by the cu
af30: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72  rrent process ar
af40: 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20  e.** released.  
af50: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
af60: 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63  his problem, eac
af70: 68 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  h unixInodeInfo 
af80: 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61  object.** mainta
af90: 69 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74  ins a count of t
afa0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e  he number of pen
afb0: 64 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ding locks on th
afc0: 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e  a inode..** When
afd0: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
afe0: 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20  ade to close an 
aff0: 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65  unixFile, if the
b000: 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20  re are.** other 
b010: 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e  unixFile open on
b020: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
b030: 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67  that are holding
b040: 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c   locks, the call
b050: 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74  .** to close() t
b060: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
b070: 6f 72 20 69 73 20 64 65 66 65 72 72 65 64 20 75  or is deferred u
b080: 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20  ntil all of the 
b090: 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20  locks clear..** 
b0a0: 54 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  The unixInodeInf
b0b0: 6f 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  o structure keep
b0c0: 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65  s a list of file
b0d0: 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 68 61   descriptors tha
b0e0: 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20  t need to.** be 
b0f0: 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20  closed and that 
b100: 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28  list is walked (
b110: 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77 68 65  and cleared) whe
b120: 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a  n the last lock.
b130: 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a  ** clears..**.**
b140: 20 59 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f   Yet another pro
b150: 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65  blem:  LinuxThre
b160: 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20  ads do not play 
b170: 77 65 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20  well with posix 
b180: 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e  locks..**.** Man
b190: 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  y older versions
b1a0: 20 6f 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68   of linux use th
b1b0: 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c  e LinuxThreads l
b1c0: 69 62 72 61 72 79 20 77 68 69 63 68 20 69 73 0a  ibrary which is.
b1d0: 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d  ** not posix com
b1e0: 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c  pliant.  Under L
b1f0: 69 6e 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c  inuxThreads, a l
b200: 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74  ock created by t
b210: 68 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f  hread.** A canno
b220: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72  t be modified or
b230: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 61   overridden by a
b240: 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61   different threa
b250: 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72  d B..** Only thr
b260: 65 61 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79  ead A can modify
b270: 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b   the lock.  Lock
b280: 69 6e 67 20 62 65 68 61 76 69 6f 72 20 69 73 20  ing behavior is 
b290: 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68  correct.** if th
b2a0: 65 20 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65  e appliation use
b2b0: 73 20 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69  s the newer Nati
b2c0: 76 65 20 50 6f 73 69 78 20 54 68 72 65 61 64 20  ve Posix Thread 
b2d0: 4c 69 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a  Library (NPTL).*
b2e0: 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74  * on linux - wit
b2f0: 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72  h NPTL a lock cr
b300: 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64 20  eated by thread 
b310: 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c  A can override l
b320: 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61  ocks.** in threa
b330: 64 20 42 2e 20 20 42 75 74 20 74 68 65 72 65 20  d B.  But there 
b340: 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f  is no way to kno
b350: 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  w at compile-tim
b360: 65 20 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61  e which.** threa
b370: 64 69 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20  ding library is 
b380: 62 65 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20  being used.  So 
b390: 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
b3a0: 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f  to know at.** co
b3b0: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68  mpile-time wheth
b3c0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
b3d0: 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20   A can override 
b3e0: 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20  locks on thread 
b3f0: 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f  B..** One has to
b400: 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63   do a run-time c
b410: 68 65 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72  heck to discover
b420: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   the behavior of
b430: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
b440: 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53  process..**.** S
b450: 51 4c 69 74 65 20 75 73 65 64 20 74 6f 20 73 75  QLite used to su
b460: 70 70 6f 72 74 20 4c 69 6e 75 78 54 68 72 65 61  pport LinuxThrea
b470: 64 73 2e 20 20 42 75 74 20 73 75 70 70 6f 72 74  ds.  But support
b480: 20 66 6f 72 20 4c 69 6e 75 78 54 68 72 65 61 64   for LinuxThread
b490: 73 0a 2a 2a 20 77 61 73 20 64 72 6f 70 70 65 64  s.** was dropped
b4a0: 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
b4b0: 76 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20  version 3.7.0.  
b4c0: 53 51 4c 69 74 65 20 77 69 6c 6c 20 73 74 69 6c  SQLite will stil
b4d0: 6c 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c  l work with.** L
b4e0: 69 6e 75 78 54 68 72 65 61 64 73 20 70 72 6f 76  inuxThreads prov
b4f0: 69 64 65 64 20 74 68 61 74 20 28 31 29 20 74 68  ided that (1) th
b500: 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74  ere is no more t
b510: 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69  han one connecti
b520: 6f 6e 20 0a 2a 2a 20 70 65 72 20 64 61 74 61 62  on .** per datab
b530: 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
b540: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 61 6e 64  same process and
b550: 20 28 32 29 20 64 61 74 61 62 61 73 65 20 63 6f   (2) database co
b560: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20  nnections.** do 
b570: 6e 6f 74 20 6d 6f 76 65 20 61 63 72 6f 73 73 20  not move across 
b580: 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a  threads..*/../*.
b590: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
b5a0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
b5b0: 73 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73  structure serves
b5c0: 20 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64   as the key used
b5d0: 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  .** to locate a 
b5e0: 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69 78 49  particular unixI
b5f0: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  nodeInfo object.
b600: 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 46  .*/.struct unixF
b610: 69 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f 74 20  ileId {.  dev_t 
b620: 64 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  dev;            
b630: 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20        /* Device 
b640: 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53  number */.#if OS
b650: 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
b660: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
b670: 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65  *pId;  /* Unique
b680: 20 66 69 6c 65 20 49 44 20 66 6f 72 20 76 78 77   file ID for vxw
b690: 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20  orks. */.#else. 
b6a0: 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20   ino_t ino;     
b6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b6c0: 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  Inode number */.
b6d0: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
b6e0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
b6f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
b700: 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
b710: 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70  ated for each op
b720: 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72  en.** inode.  Or
b730: 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64  , on LinuxThread
b740: 73 2c 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20  s, there is one 
b750: 6f 66 20 74 68 65 73 65 20 73 74 72 75 63 74 75  of these structu
b760: 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20  res for.** each 
b770: 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20  inode opened by 
b780: 65 61 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a  each thread..**.
b790: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64  ** A single inod
b7a0: 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69  e can have multi
b7b0: 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ple file descrip
b7c0: 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e  tors, so each un
b7d0: 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  ixFile.** struct
b7e0: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  ure contains a p
b7f0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
b800: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
b810: 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a  ject and this.**
b820: 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20   object keeps a 
b830: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
b840: 62 65 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20  ber of unixFile 
b850: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a  pointing to it..
b860: 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 49 6e  */.struct unixIn
b870: 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75  odeInfo {.  stru
b880: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69  ct unixFileId fi
b890: 6c 65 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54  leId;       /* T
b8a0: 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f  he lookup key */
b8b0: 0a 20 20 69 6e 74 20 6e 53 68 61 72 65 64 3b 20  .  int nShared; 
b8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
b8e0: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c  SHARED locks hel
b8f0: 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  d */.  unsigned 
b900: 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20  char eFileLock; 
b910: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
b920: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
b930: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e  SERVED_LOCK etc.
b940: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
b950: 68 61 72 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b  har bProcessLock
b960: 3b 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 63 6c  ;     /* An excl
b970: 75 73 69 76 65 20 70 72 6f 63 65 73 73 20 6c 6f  usive process lo
b980: 63 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0a 20 20  ck is held */.  
b990: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69  /* Number of poi
b9c0: 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20 73 74  nters to this st
b9d0: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69  ructure */.  uni
b9e0: 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
b9f0: 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  de;          /* 
ba00: 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73  Shared memory as
ba10: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
ba20: 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e  is inode */.  in
ba30: 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  t nLock;        
ba40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ba50: 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74   Number of outst
ba60: 61 6e 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b  anding file lock
ba70: 73 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65  s */.  UnixUnuse
ba80: 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20  dFd *pUnused;   
ba90: 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64         /* Unused
baa0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
bab0: 73 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20  s to close */.  
bac0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
bad0: 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Next;           
bae0: 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75  /* List of all u
baf0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
bb00: 65 63 74 73 20 2a 2f 0a 20 20 75 6e 69 78 49 6e  ects */.  unixIn
bb10: 6f 64 65 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20  odeInfo *pPrev; 
bb20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20            /*    
bb30: 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b  .... doubly link
bb40: 65 64 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  ed */.#if SQLITE
bb50: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
bb60: 53 54 59 4c 45 0a 20 20 75 6e 73 69 67 6e 65 64  STYLE.  unsigned
bb70: 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65   long long share
bb80: 64 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41  dByte;  /* for A
bb90: 46 50 20 73 69 6d 75 6c 61 74 65 64 20 73 68 61  FP simulated sha
bba0: 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64  red lock */.#end
bbb0: 69 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  if.#if OS_VXWORK
bbc0: 53 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b  S.  sem_t *pSem;
bbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbe0: 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53      /* Named POS
bbf0: 49 58 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a  IX semaphore */.
bc00: 20 20 63 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b    char aSemName[
bc10: 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b  MAX_PATHNAME+2];
bc20: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61    /* Name of tha
bc30: 74 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23  t semaphore */.#
bc40: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
bc50: 41 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20 75  A lists of all u
bc60: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
bc70: 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ects..*/.static 
bc80: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69  unixInodeInfo *i
bc90: 6e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f  nodeList = 0;../
bca0: 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  *.**.** This fun
bcb0: 63 74 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45  ction - unixLogE
bcc0: 72 72 6f 72 41 74 4c 69 6e 65 28 29 2c 20 69 73  rrorAtLine(), is
bcd0: 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65   only ever calle
bce0: 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a  d via the macro.
bcf0: 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  ** unixLogError(
bd00: 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  )..**.** It is i
bd10: 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20  nvoked after an 
bd20: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
bd30: 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 61  an OS function a
bd40: 6e 64 20 65 72 72 6e 6f 20 68 61 73 20 62 65 65  nd errno has bee
bd50: 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c 6f 67  n.** set. It log
bd60: 73 20 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e  s a message usin
bd70: 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  g sqlite3_log() 
bd80: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
bd90: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a  urrent value of.
bda0: 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20 69 66  ** errno and, if
bdb0: 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68   possible, the h
bdc0: 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71  uman-readable eq
bdd0: 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 73 74  uivalent from st
bde0: 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a 20 73  rerror() or.** s
bdf0: 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a  trerror_r()..**.
be00: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
be10: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
be20: 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64  the macro should
be30: 20 62 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f   be the error co
be40: 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20  de that.** will 
be50: 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  be returned to S
be60: 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49  QLite (e.g. SQLI
be70: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
be80: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
be90: 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73  ). .** The two s
bea0: 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65  ubsequent argume
beb0: 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68  nts should be th
bec0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53  e name of the OS
bed0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a   function that.*
bee0: 2a 20 66 61 69 6c 65 64 20 28 65 2e 67 2e 20 22  * failed (e.g. "
bef0: 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e 22 29  unlink", "open")
bf00: 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61   and the associa
bf10: 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ted file-system 
bf20: 70 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e  path,.** if any.
bf30: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69 78  .*/.#define unix
bf40: 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 29 20  LogError(a,b,c) 
bf50: 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72      unixLogError
bf60: 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c  AtLine(a,b,c,__L
bf70: 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e  INE__).static in
bf80: 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74  t unixLogErrorAt
bf90: 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63  Line(.  int errc
bfa0: 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
bfb0: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74          /* SQLit
bfc0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  e error code */.
bfd0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
bfe0: 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  unc,            
bff0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20    /* Name of OS 
c000: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61  function that fa
c010: 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  iled */.  const 
c020: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
c030: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
c040: 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74 65  e path associate
c050: 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a  d with error */.
c060: 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20    int iLine     
c070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c080: 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65    /* Source line
c090: 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65 72   number where er
c0a0: 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a  ror occurred */.
c0b0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b  ){.  char *zErr;
c0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0d0: 20 20 20 20 20 2f 2a 20 4d 65 73 73 61 67 65 20       /* Message 
c0e0: 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20  from strerror() 
c0f0: 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f  or equivalent */
c100: 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20  .  int iErrno = 
c110: 65 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  errno;          
c120: 20 20 20 2f 2a 20 53 61 76 65 64 20 73 79 73 63     /* Saved sysc
c130: 61 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65 72  all error number
c140: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   */..  /* If thi
c150: 73 20 69 73 20 6e 6f 74 20 61 20 74 68 72 65 61  s is not a threa
c160: 64 73 61 66 65 20 62 75 69 6c 64 20 28 53 51 4c  dsafe build (SQL
c170: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d  ITE_THREADSAFE==
c180: 30 29 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 2a  0), then use.  *
c190: 2a 20 74 68 65 20 73 74 72 65 72 72 6f 72 28 29  * the strerror()
c1a0: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74   function to obt
c1b0: 61 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72 65  ain the human-re
c1c0: 61 64 61 62 6c 65 20 65 72 72 6f 72 20 6d 65 73  adable error mes
c1d0: 73 61 67 65 0a 20 20 2a 2a 20 65 71 75 69 76 61  sage.  ** equiva
c1e0: 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f  lent to errno. O
c1f0: 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 73 74  therwise, use st
c200: 72 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f  rerror_r()..  */
c210: 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52   .#if SQLITE_THR
c220: 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e  EADSAFE && defin
c230: 65 64 28 48 41 56 45 5f 53 54 52 45 52 52 4f 52  ed(HAVE_STRERROR
c240: 5f 52 29 0a 20 20 63 68 61 72 20 61 45 72 72 5b  _R).  char aErr[
c250: 38 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45  80];.  memset(aE
c260: 72 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 45  rr, 0, sizeof(aE
c270: 72 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61  rr));.  zErr = a
c280: 45 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54  Err;..  /* If ST
c290: 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20  RERROR_R_CHAR_P 
c2a0: 28 73 65 74 20 62 79 20 61 75 74 6f 63 6f 6e 66  (set by autoconf
c2b0: 20 73 63 72 69 70 74 73 29 20 6f 72 20 5f 5f 55   scripts) or __U
c2c0: 53 45 5f 47 4e 55 20 69 73 20 64 65 66 69 6e 65  SE_GNU is define
c2d0: 64 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74  d,.  ** assume t
c2e0: 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70  hat the system p
c2f0: 72 6f 76 69 64 65 73 20 74 68 65 20 47 4e 55 20  rovides the GNU 
c300: 76 65 72 73 69 6f 6e 20 6f 66 20 73 74 72 65 72  version of strer
c310: 72 6f 72 5f 72 28 29 20 74 68 61 74 0a 20 20 2a  ror_r() that.  *
c320: 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  * returns a poin
c330: 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20  ter to a buffer 
c340: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65  containing the e
c350: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 54 68  rror message. Th
c360: 61 74 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a 2a  at pointer .  **
c370: 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 45   may point to aE
c380: 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20  rr[], or it may 
c390: 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74  point to some st
c3a0: 61 74 69 63 20 73 74 6f 72 61 67 65 20 73 6f 6d  atic storage som
c3b0: 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20 4f 74  ewhere. .  ** Ot
c3c0: 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20  herwise, assume 
c3d0: 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  that the system 
c3e0: 70 72 6f 76 69 64 65 73 20 74 68 65 20 50 4f 53  provides the POS
c3f0: 49 58 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20  IX version of . 
c400: 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29   ** strerror_r()
c410: 2c 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 77  , which always w
c420: 72 69 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d  rites an error m
c430: 65 73 73 61 67 65 20 69 6e 74 6f 20 61 45 72 72  essage into aErr
c440: 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  []..  **.  ** If
c450: 20 74 68 65 20 63 6f 64 65 20 69 6e 63 6f 72 72   the code incorr
c460: 65 63 74 6c 79 20 61 73 73 75 6d 65 73 20 74 68  ectly assumes th
c470: 61 74 20 69 74 20 69 73 20 74 68 65 20 50 4f 53  at it is the POS
c480: 49 58 20 76 65 72 73 69 6f 6e 20 74 68 61 74 20  IX version that 
c490: 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  is.  ** availabl
c4a0: 65 2c 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  e, the error mes
c4b0: 73 61 67 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20  sage will often 
c4c0: 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  be an empty stri
c4d0: 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a 20 68  ng. Not a.  ** h
c4e0: 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 63  uge problem. Inc
c4f0: 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64  orrectly conclud
c500: 69 6e 67 20 74 68 61 74 20 74 68 65 20 47 4e 55  ing that the GNU
c510: 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69   version is avai
c520: 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 75 6c  lable .  ** coul
c530: 64 20 6c 65 61 64 20 74 6f 20 61 20 73 65 67 66  d lead to a segf
c540: 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20 20 2a  ault though..  *
c550: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 54  /.#if defined(ST
c560: 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 29  RERROR_R_CHAR_P)
c570: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 55 53   || defined(__US
c580: 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20 3d 20  E_GNU).  zErr = 
c590: 0a 23 20 65 6e 64 69 66 0a 20 20 73 74 72 65 72  .# endif.  strer
c5a0: 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20 61 45  ror_r(iErrno, aE
c5b0: 72 72 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29  rr, sizeof(aErr)
c5c0: 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49  -1);..#elif SQLI
c5d0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20  TE_THREADSAFE.  
c5e0: 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74 68 72  /* This is a thr
c5f0: 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 62  eadsafe build, b
c600: 75 74 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20  ut strerror_r() 
c610: 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
c620: 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22  . */.  zErr = ""
c630: 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e  ;.#else.  /* Non
c640: 2d 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c  -threadsafe buil
c650: 64 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 28  d, use strerror(
c660: 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73  ). */.  zErr = s
c670: 74 72 65 72 72 6f 72 28 69 45 72 72 6e 6f 29 3b  trerror(iErrno);
c680: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 7a  .#endif..  if( z
c690: 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20  Path==0 ) zPath 
c6a0: 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f  = "";.  sqlite3_
c6b0: 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20  log(errcode,.   
c6c0: 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a 25 64     "os_unix.c:%d
c6d0: 3a 20 28 25 64 29 20 25 73 28 25 73 29 20 2d 20  : (%d) %s(%s) - 
c6e0: 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65  %s",.      iLine
c6f0: 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c  , iErrno, zFunc,
c700: 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20 20 29   zPath, zErr.  )
c710: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63  ;..  return errc
c720: 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ode;.}../*.** Cl
c730: 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72  ose a file descr
c740: 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  iptor..**.** We 
c750: 61 73 73 75 6d 65 20 74 68 61 74 20 63 6c 6f 73  assume that clos
c760: 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79  e() almost alway
c770: 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65 20 69  s works, since i
c780: 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a  t is only in a.*
c790: 2a 20 76 65 72 79 20 73 69 63 6b 20 61 70 70 6c  * very sick appl
c7a0: 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20 61 20  ication or on a 
c7b0: 76 65 72 79 20 73 69 63 6b 20 70 6c 61 74 66 6f  very sick platfo
c7c0: 72 6d 20 74 68 61 74 20 69 74 20 6d 69 67 68 74  rm that it might
c7d0: 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69 74 20   fail..** If it 
c7e0: 64 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d 70 6c  does fail, simpl
c7f0: 79 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20  y leak the file 
c800: 64 65 73 63 72 69 70 74 6f 72 2c 20 62 75 74 20  descriptor, but 
c810: 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20 65 72  do log the.** er
c820: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ror..**.** Note 
c830: 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 73  that it is not s
c840: 61 66 65 20 74 6f 20 72 65 74 72 79 20 63 6c 6f  afe to retry clo
c850: 73 65 28 29 20 61 66 74 65 72 20 45 49 4e 54 52  se() after EINTR
c860: 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 66 69   since the.** fi
c870: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 69  le descriptor mi
c880: 67 68 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ght have already
c890: 20 62 65 65 6e 20 72 65 75 73 65 64 20 62 79 20   been reused by 
c8a0: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 2e 0a  another thread..
c8b0: 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74 20 65  ** So we don't e
c8c0: 76 65 6e 20 74 72 79 20 74 6f 20 72 65 63 6f 76  ven try to recov
c8d0: 65 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e 54 52  er from an EINTR
c8e0: 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74 68 65 20  .  Just log the 
c8f0: 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76  error.** and mov
c900: 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e on..*/.static 
c910: 76 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73  void robust_clos
c920: 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  e(unixFile *pFil
c930: 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69  e, int h, int li
c940: 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f 73 43  neno){.  if( osC
c950: 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20 20 20 75  lose(h) ){.    u
c960: 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  nixLogErrorAtLin
c970: 65 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  e(SQLITE_IOERR_C
c980: 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c 0a 20  LOSE, "close",. 
c990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9a0: 20 20 20 20 20 20 70 46 69 6c 65 20 3f 20 70 46        pFile ? pF
c9b0: 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20  ile->zPath : 0, 
c9c0: 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  lineno);.  }.}..
c9d0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 46  /*.** Set the pF
c9e0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2e 20  ile->lastErrno. 
c9f0: 20 44 6f 20 74 68 69 73 20 69 6e 20 61 20 73 75   Do this in a su
ca00: 62 72 6f 75 74 69 6e 65 20 61 73 20 74 68 61 74  broutine as that
ca10: 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 61 20 63   provides.** a c
ca20: 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20  onvenient place 
ca30: 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f  to set a breakpo
ca40: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  int..*/.static v
ca50: 6f 69 64 20 73 74 6f 72 65 4c 61 73 74 45 72 72  oid storeLastErr
ca60: 6e 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  no(unixFile *pFi
ca70: 6c 65 2c 20 69 6e 74 20 65 72 72 6f 72 29 7b 0a  le, int error){.
ca80: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
ca90: 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a 7d 0a 0a 2f  no = error;.}../
caa0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66  *.** Close all f
cab0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
cac0: 61 63 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68  accumuated in th
cad0: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d  e unixInodeInfo-
cae0: 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a  >pUnused list..*
caf0: 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  / .static void c
cb00: 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 75  losePendingFds(u
cb10: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
cb20: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
cb30: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
cb40: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78  ->pInode;.  Unix
cb50: 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55  UnusedFd *p;.  U
cb60: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65  nixUnusedFd *pNe
cb70: 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f  xt;.  for(p=pIno
cb80: 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20  de->pUnused; p; 
cb90: 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  p=pNext){.    pN
cba0: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
cbb0: 23 69 66 20 4f 53 43 4c 4f 53 45 5f 43 48 45 43  #if OSCLOSE_CHEC
cbc0: 4b 5f 43 4c 4f 53 45 5f 49 4f 45 52 52 0a 20 20  K_CLOSE_IOERR.  
cbd0: 20 20 69 66 28 20 63 6c 6f 73 65 28 70 2d 3e 66    if( close(p->f
cbe0: 64 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  d) ){.      stor
cbf0: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
cc00: 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
cc10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
cc20: 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 70  R_CLOSE;.      p
cc30: 2d 3e 70 4e 65 78 74 20 3d 20 70 45 72 72 6f 72  ->pNext = pError
cc40: 3b 0a 20 20 20 20 20 20 70 45 72 72 6f 72 20 3d  ;.      pError =
cc50: 20 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   p;.    }else{. 
cc60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
cc70: 65 28 70 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  e(p);.    }.#els
cc80: 65 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f  e.    robust_clo
cc90: 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c  se(pFile, p->fd,
cca0: 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
ccb0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
ccc0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 49  .#endif.  }.  pI
ccd0: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  node->pUnused = 
cce0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  0;.}../*.** Rele
ccf0: 61 73 65 20 61 20 75 6e 69 78 49 6e 6f 64 65 49  ase a unixInodeI
cd00: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 72  nfo structure pr
cd10: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
cd20: 65 64 20 62 79 20 66 69 6e 64 49 6e 6f 64 65 49  ed by findInodeI
cd30: 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nfo()..**.** The
cd40: 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75   mutex entered u
cd50: 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74  sing the unixEnt
cd60: 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69  erMutex() functi
cd70: 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  on must be held.
cd80: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ** when this fun
cd90: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
cda0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
cdb0: 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f  releaseInodeInfo
cdc0: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
cdd0: 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ){.  unixInodeIn
cde0: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
cdf0: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
ce00: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
ce10: 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 41  eld() );.  if( A
ce20: 4c 57 41 59 53 28 70 49 6e 6f 64 65 29 20 29 7b  LWAYS(pInode) ){
ce30: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65  .    pInode->nRe
ce40: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  f--;.    if( pIn
ce50: 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ode->nRef==0 ){.
ce60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
ce70: 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d  node->pShmNode==
ce80: 30 20 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65  0 );.      close
ce90: 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65  PendingFds(pFile
cea0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  );.      if( pIn
ceb0: 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ode->pPrev ){.  
cec0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
ced0: 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  node->pPrev->pNe
cee0: 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  xt==pInode );.  
cef0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50        pInode->pP
cf00: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e  rev->pNext = pIn
cf10: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ode->pNext;.    
cf20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
cf30: 20 61 73 73 65 72 74 28 20 69 6e 6f 64 65 4c 69   assert( inodeLi
cf40: 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  st==pInode );.  
cf50: 20 20 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20        inodeList 
cf60: 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
cf70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
cf80: 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74  f( pInode->pNext
cf90: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
cfa0: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  rt( pInode->pNex
cfb0: 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65  t->pPrev==pInode
cfc0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   );.        pIno
cfd0: 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  de->pNext->pPrev
cfe0: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76   = pInode->pPrev
cff0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d000: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e  sqlite3_free(pIn
d010: 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ode);.    }.  }.
d020: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
d030: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
d040: 2c 20 6c 6f 63 61 74 65 20 74 68 65 20 75 6e 69  , locate the uni
d050: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
d060: 74 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69  t that.** descri
d070: 62 65 73 20 74 68 61 74 20 66 69 6c 65 20 64 65  bes that file de
d080: 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74  scriptor.  Creat
d090: 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
d0a0: 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a  ecessary.  The.*
d0b0: 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6d  * return value m
d0c0: 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61  ight be uninitia
d0d0: 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f  lized if an erro
d0e0: 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  r occurs..**.** 
d0f0: 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65  The mutex entere
d100: 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78  d using the unix
d110: 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e  EnterMutex() fun
d120: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65  ction must be he
d130: 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  ld.** when this 
d140: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
d150: 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
d160: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
d170: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
d180: 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e  tatic int findIn
d190: 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46  odeInfo(.  unixF
d1a0: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
d1b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69            /* Uni
d1c0: 78 20 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65  x file with file
d1d0: 20 64 65 73 63 20 75 73 65 64 20 69 6e 20 74 68   desc used in th
d1e0: 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78 49  e key */.  unixI
d1f0: 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f  nodeInfo **ppIno
d200: 64 65 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  de        /* Ret
d210: 75 72 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  urn the unixInod
d220: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65 72  eInfo object her
d230: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
d240: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d250: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 73 74           /* Syst
d260: 65 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e 20 63  em call return c
d270: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b  ode */.  int fd;
d280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d290: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
d2a0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
d2b0: 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74  or pFile */.  st
d2c0: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
d2d0: 66 69 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a 20  fileId;      /* 
d2e0: 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74  Lookup key for t
d2f0: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
d300: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61   */.  struct sta
d310: 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20  t statbuf;      
d320: 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65       /* Low-leve
d330: 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69  l file informati
d340: 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  on */.  unixInod
d350: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
d360: 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64 69 64  0;     /* Candid
d370: 61 74 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ate unixInodeInf
d380: 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61  o object */..  a
d390: 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
d3a0: 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20  Held() );..  /* 
d3b0: 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e  Get low-level in
d3c0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
d3d0: 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77 65  the file that we
d3e0: 20 63 61 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a   can used to.  *
d3f0: 2a 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  * create a uniqu
d400: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 66  e name for the f
d410: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d  ile..  */.  fd =
d420: 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20   pFile->h;.  rc 
d430: 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73  = osFstat(fd, &s
d440: 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72  tatbuf);.  if( r
d450: 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 6f 72  c!=0 ){.    stor
d460: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
d470: 2c 20 65 72 72 6e 6f 29 3b 0a 23 69 66 20 64 65  , errno);.#if de
d480: 66 69 6e 65 64 28 45 4f 56 45 52 46 4c 4f 57 29  fined(EOVERFLOW)
d490: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
d4a0: 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 29 0a  TE_DISABLE_LFS).
d4b0: 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c      if( pFile->l
d4c0: 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46  astErrno==EOVERF
d4d0: 4c 4f 57 20 29 20 72 65 74 75 72 6e 20 53 51 4c  LOW ) return SQL
d4e0: 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69  ITE_NOLFS;.#endi
d4f0: 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
d500: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a  ITE_IOERR;.  }..
d510: 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f  #ifdef __APPLE__
d520: 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e  .  /* On OS X on
d530: 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73 79   an msdos filesy
d540: 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20  stem, the inode 
d550: 6e 75 6d 62 65 72 20 69 73 20 72 65 70 6f 72 74  number is report
d560: 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63  ed.  ** incorrec
d570: 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a  tly for zero-siz
d580: 65 20 66 69 6c 65 73 2e 20 20 53 65 65 20 74 69  e files.  See ti
d590: 63 6b 65 74 20 23 33 32 36 30 2e 20 20 54 6f 20  cket #3260.  To 
d5a0: 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64  work.  ** around
d5b0: 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 77   this problem (w
d5c0: 65 20 63 6f 6e 73 69 64 65 72 20 69 74 20 61 20  e consider it a 
d5d0: 62 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74  bug in OS X, not
d5e0: 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65   SQLite).  ** we
d5f0: 20 61 6c 77 61 79 73 20 69 6e 63 72 65 61 73 65   always increase
d600: 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 74   the file size t
d610: 6f 20 31 20 62 79 20 77 72 69 74 69 6e 67 20 61  o 1 by writing a
d620: 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a   single byte.  *
d630: 2a 20 70 72 69 6f 72 20 74 6f 20 61 63 63 65 73  * prior to acces
d640: 73 69 6e 67 20 74 68 65 20 69 6e 6f 64 65 20 6e  sing the inode n
d650: 75 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e 65 20  umber.  The one 
d660: 62 79 74 65 20 77 72 69 74 74 65 6e 20 69 73 0a  byte written is.
d670: 20 20 2a 2a 20 61 6e 20 41 53 43 49 49 20 27 53    ** an ASCII 'S
d680: 27 20 63 68 61 72 61 63 74 65 72 20 77 68 69 63  ' character whic
d690: 68 20 61 6c 73 6f 20 68 61 70 70 65 6e 73 20 74  h also happens t
d6a0: 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20 62  o be the first b
d6b0: 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  yte.  ** in the 
d6c0: 68 65 61 64 65 72 20 6f 66 20 65 76 65 72 79 20  header of every 
d6d0: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e  SQLite database.
d6e0: 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 69    In this way, i
d6f0: 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20  f there.  ** is 
d700: 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  a race condition
d710: 20 73 75 63 68 20 74 68 61 74 20 61 6e 6f 74 68   such that anoth
d720: 65 72 20 74 68 72 65 61 64 20 68 61 73 20 61 6c  er thread has al
d730: 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 0a  ready populated.
d740: 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70    ** the first p
d750: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
d760: 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69  ase, no damage i
d770: 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  s done..  */.  i
d780: 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69  f( statbuf.st_si
d790: 7a 65 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d  ze==0 && (pFile-
d7a0: 3e 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  >fsFlags & SQLIT
d7b0: 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44  E_FSFLAGS_IS_MSD
d7c0: 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20 20 64 6f  OS)!=0 ){.    do
d7d0: 7b 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66  { rc = osWrite(f
d7e0: 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d 77 68 69  d, "S", 1); }whi
d7f0: 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
d800: 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20  o==EINTR );.    
d810: 69 66 28 20 72 63 21 3d 31 20 29 7b 0a 20 20 20  if( rc!=1 ){.   
d820: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
d830: 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
d840: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
d850: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
d860: 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74  }.    rc = osFst
d870: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
d880: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
d890: 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  ){.      storeLa
d8a0: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65  stErrno(pFile, e
d8b0: 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74  rrno);.      ret
d8c0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
d8d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
d8e0: 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69  if..  memset(&fi
d8f0: 6c 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  leId, 0, sizeof(
d900: 66 69 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c 65  fileId));.  file
d910: 49 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66  Id.dev = statbuf
d920: 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f  .st_dev;.#if OS_
d930: 56 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49 64  VXWORKS.  fileId
d940: 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70 49  .pId = pFile->pI
d950: 64 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65 49  d;.#else.  fileI
d960: 64 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e  d.ino = statbuf.
d970: 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20  st_ino;.#endif. 
d980: 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c   pInode = inodeL
d990: 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 49  ist;.  while( pI
d9a0: 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70 28 26  node && memcmp(&
d9b0: 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64 65 2d  fileId, &pInode-
d9c0: 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28  >fileId, sizeof(
d9d0: 66 69 6c 65 49 64 29 29 20 29 7b 0a 20 20 20 20  fileId)) ){.    
d9e0: 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d  pInode = pInode-
d9f0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
da00: 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20  ( pInode==0 ){. 
da10: 20 20 20 70 49 6e 6f 64 65 20 3d 20 73 71 6c 69     pInode = sqli
da20: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69  te3_malloc64( si
da30: 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b  zeof(*pInode) );
da40: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 3d  .    if( pInode=
da50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
da60: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
da70: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
da80: 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30  memset(pInode, 0
da90: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65  , sizeof(*pInode
daa0: 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ));.    memcpy(&
dab0: 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20  pInode->fileId, 
dac0: 26 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28  &fileId, sizeof(
dad0: 66 69 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49  fileId));.    pI
dae0: 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  node->nRef = 1;.
daf0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78      pInode->pNex
db00: 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20  t = inodeList;. 
db10: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76     pInode->pPrev
db20: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e   = 0;.    if( in
db30: 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c  odeList ) inodeL
db40: 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e  ist->pPrev = pIn
db50: 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69  ode;.    inodeLi
db60: 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d  st = pInode;.  }
db70: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65  else{.    pInode
db80: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
db90: 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64  *ppInode = pInod
dba0: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
dbb0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
dbc0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 70  Return TRUE if p
dbd0: 46 69 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65  File has been re
dbe0: 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65  named or unlinke
dbf0: 64 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 66  d since it was f
dc00: 69 72 73 74 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a  irst opened..*/.
dc10: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 48  static int fileH
dc20: 61 73 4d 6f 76 65 64 28 75 6e 69 78 46 69 6c 65  asMoved(unixFile
dc30: 20 2a 70 46 69 6c 65 29 7b 0a 23 69 66 20 4f 53   *pFile){.#if OS
dc40: 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72  _VXWORKS.  retur
dc50: 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21  n pFile->pInode!
dc60: 3d 30 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 64  =0 && pFile->pId
dc70: 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  !=pFile->pInode-
dc80: 3e 66 69 6c 65 49 64 2e 70 49 64 3b 0a 23 65 6c  >fileId.pId;.#el
dc90: 73 65 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  se.  struct stat
dca0: 20 62 75 66 3b 0a 20 20 72 65 74 75 72 6e 20 70   buf;.  return p
dcb0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20  File->pInode!=0 
dcc0: 26 26 0a 20 20 20 20 20 20 28 6f 73 53 74 61 74  &&.      (osStat
dcd0: 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26  (pFile->zPath, &
dce0: 62 75 66 29 21 3d 30 20 7c 7c 20 62 75 66 2e 73  buf)!=0 || buf.s
dcf0: 74 5f 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70 49  t_ino!=pFile->pI
dd00: 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f  node->fileId.ino
dd10: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  );.#endif.}.../*
dd20: 0a 2a 2a 20 43 68 65 63 6b 20 61 20 75 6e 69 78  .** Check a unix
dd30: 46 69 6c 65 20 74 68 61 74 20 69 73 20 61 20 64  File that is a d
dd40: 61 74 61 62 61 73 65 2e 20 20 56 65 72 69 66 79  atabase.  Verify
dd50: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
dd60: 2a 2a 0a 2a 2a 20 28 31 29 20 54 68 65 72 65 20  **.** (1) There 
dd70: 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 68  is exactly one h
dd80: 61 72 64 20 6c 69 6e 6b 20 6f 6e 20 74 68 65 20  ard link on the 
dd90: 66 69 6c 65 0a 2a 2a 20 28 32 29 20 54 68 65 20  file.** (2) The 
dda0: 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 73 79  file is not a sy
ddb0: 6d 62 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20 28  mbolic link.** (
ddc0: 33 29 20 54 68 65 20 66 69 6c 65 20 68 61 73 20  3) The file has 
ddd0: 6e 6f 74 20 62 65 65 6e 20 72 65 6e 61 6d 65 64  not been renamed
dde0: 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 0a   or unlinked.**.
ddf0: 2a 2a 20 49 73 73 75 65 20 73 71 6c 69 74 65 33  ** Issue sqlite3
de00: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e  _log(SQLITE_WARN
de10: 49 4e 47 2c 2e 2e 2e 29 20 6d 65 73 73 61 67 65  ING,...) message
de20: 73 20 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73  s if anything is
de30: 20 6e 6f 74 20 72 69 67 68 74 2e 0a 2a 2f 0a 73   not right..*/.s
de40: 74 61 74 69 63 20 76 6f 69 64 20 76 65 72 69 66  tatic void verif
de50: 79 44 62 46 69 6c 65 28 75 6e 69 78 46 69 6c 65  yDbFile(unixFile
de60: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 73 74 72 75   *pFile){.  stru
de70: 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 69  ct stat buf;.  i
de80: 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 6f 73  nt rc;.  rc = os
de90: 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20  Fstat(pFile->h, 
dea0: 26 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21  &buf);.  if( rc!
deb0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
dec0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52  3_log(SQLITE_WAR
ded0: 4e 49 4e 47 2c 20 22 63 61 6e 6e 6f 74 20 66 73  NING, "cannot fs
dee0: 74 61 74 20 64 62 20 66 69 6c 65 20 25 73 22 2c  tat db file %s",
def0: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
df00: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
df10: 20 20 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69    if( buf.st_nli
df20: 6e 6b 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d  nk==0 && (pFile-
df30: 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
df40: 58 46 49 4c 45 5f 44 45 4c 45 54 45 29 3d 3d 30  XFILE_DELETE)==0
df50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
df60: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
df70: 4e 47 2c 20 22 66 69 6c 65 20 75 6e 6c 69 6e 6b  NG, "file unlink
df80: 65 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25  ed while open: %
df90: 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  s", pFile->zPath
dfa0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
dfb0: 20 7d 0a 20 20 69 66 28 20 62 75 66 2e 73 74 5f   }.  if( buf.st_
dfc0: 6e 6c 69 6e 6b 3e 31 20 29 7b 0a 20 20 20 20 73  nlink>1 ){.    s
dfd0: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
dfe0: 45 5f 57 41 52 4e 49 4e 47 2c 20 22 6d 75 6c 74  E_WARNING, "mult
dff0: 69 70 6c 65 20 6c 69 6e 6b 73 20 74 6f 20 66 69  iple links to fi
e000: 6c 65 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e  le: %s", pFile->
e010: 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75  zPath);.    retu
e020: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 69  rn;.  }.  if( fi
e030: 6c 65 48 61 73 4d 6f 76 65 64 28 70 46 69 6c 65  leHasMoved(pFile
e040: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
e050: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e  _log(SQLITE_WARN
e060: 49 4e 47 2c 20 22 66 69 6c 65 20 72 65 6e 61 6d  ING, "file renam
e070: 65 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25  ed while open: %
e080: 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  s", pFile->zPath
e090: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
e0a0: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   }.}.../*.** Thi
e0b0: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
e0c0: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
e0d0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
e0e0: 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
e0f0: 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
e100: 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
e110: 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
e120: 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
e130: 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
e140: 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
e150: 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
e160: 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
e170: 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
e180: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
e190: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
e1a0: 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
e1b0: 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
e1c0: 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
e1d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e1e0: 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
e1f0: 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
e200: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
e210: 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  sOut){.  int rc 
e220: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
e230: 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
e240: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
e250: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
e260: 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
e270: 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
e280: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
e290: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
e2a0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
e2b0: 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
e2c0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
e2d0: 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
e2e0: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
e2f0: 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  x(); /* Because 
e300: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
e310: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
e320: 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20  hreads */..  /* 
e330: 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
e340: 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
e350: 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
e360: 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
e370: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
e380: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
e390: 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
e3a0: 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  d = 1;.  }..  /*
e3b0: 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
e3c0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
e3d0: 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20  cess holds it.. 
e3e0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a   */.#ifndef __DJ
e3f0: 47 50 50 5f 5f 0a 20 20 69 66 28 20 21 72 65 73  GPP__.  if( !res
e400: 65 72 76 65 64 20 26 26 20 21 70 46 69 6c 65 2d  erved && !pFile-
e410: 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
e420: 73 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74 72  sLock ){.    str
e430: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
e440: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
e450: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
e460: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
e470: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
e480: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
e490: 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   1;.    lock.l_t
e4a0: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
e4b0: 20 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70     if( osFcntl(p
e4c0: 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  File->h, F_GETLK
e4d0: 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 23 69 66 20  , &lock) ){.#if 
e4e0: 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f  OSLOCKING_CHECK_
e4f0: 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20  BUSY_IOERR.     
e500: 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
e510: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
e520: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
e530: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
e540: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  , SQLITE_IOERR_C
e550: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
e560: 29 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  );.      storeLa
e570: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
e580: 45 72 72 6e 6f 29 3b 0a 23 65 6c 73 65 0a 20 20  Errno);.#else.  
e590: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e5a0: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
e5b0: 56 45 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73  VEDLOCK;.      s
e5c0: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
e5d0: 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 23 65 6e  ile, errno);.#en
e5e0: 64 69 66 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  dif.    } else i
e5f0: 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d  f( lock.l_type!=
e600: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
e610: 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
e620: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
e630: 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75    .  unixLeaveMu
e640: 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
e650: 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
e660: 25 64 20 25 64 20 25 64 20 28 75 6e 69 78 29 5c  %d %d %d (unix)\
e670: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
e680: 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20  , reserved));.. 
e690: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
e6a0: 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
e6b0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  c;.}../*.** Atte
e6c0: 6d 70 74 20 74 6f 20 73 65 74 20 61 20 73 79 73  mpt to set a sys
e6d0: 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  tem-lock on the 
e6e0: 66 69 6c 65 20 70 46 69 6c 65 2e 20 20 54 68 65  file pFile.  The
e6f0: 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73   lock is .** des
e700: 63 72 69 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e  cribed by pLock.
e710: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 46  .**.** If the pF
e720: 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72  ile was opened r
e730: 65 61 64 2f 77 72 69 74 65 20 66 72 6f 6d 20 75  ead/write from u
e740: 6e 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74  nix-excl, then t
e750: 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20  he only lock.** 
e760: 65 76 65 72 20 6f 62 74 61 69 6e 65 64 20 69 73  ever obtained is
e770: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
e780: 63 6b 2c 20 61 6e 64 20 69 74 20 69 73 20 6f 62  ck, and it is ob
e790: 74 61 69 6e 65 64 20 65 78 61 63 74 6c 79 20 6f  tained exactly o
e7a0: 6e 63 65 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  nce.** the first
e7b0: 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69   time any lock i
e7c0: 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41 6c  s attempted.  Al
e7d0: 6c 20 73 75 62 73 65 71 75 65 6e 74 20 73 79 73  l subsequent sys
e7e0: 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f  tem locking.** o
e7f0: 70 65 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65  perations become
e800: 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e   no-ops.  Lockin
e810: 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 73 74 69  g operations sti
e820: 6c 6c 20 68 61 70 70 65 6e 20 69 6e 74 65 72 6e  ll happen intern
e830: 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65  ally,.** in orde
e840: 72 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20  r to coordinate 
e850: 61 63 63 65 73 73 20 62 65 74 77 65 65 6e 20 73  access between s
e860: 65 70 61 72 61 74 65 20 64 61 74 61 62 61 73 65  eparate database
e870: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
e880: 77 69 74 68 69 6e 20 74 68 69 73 20 70 72 6f 63  within this proc
e890: 65 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20  ess, but all of 
e8a0: 74 68 61 74 20 69 73 20 68 61 6e 64 6c 65 64 20  that is handled 
e8b0: 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68  in memory and th
e8c0: 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73  e.** operating s
e8d0: 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70  ystem does not p
e8e0: 61 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a  articipate..**.*
e8f0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
e900: 69 73 20 61 20 70 61 73 73 2d 74 68 72 6f 75 67  is a pass-throug
e910: 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54  h to fcntl(F_SET
e920: 4c 4b 29 20 69 66 20 70 46 69 6c 65 20 69 73 20  LK) if pFile is 
e930: 75 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53  using.** any VFS
e940: 20 6f 74 68 65 72 20 74 68 61 6e 20 22 75 6e 69   other than "uni
e950: 78 2d 65 78 63 6c 22 20 6f 72 20 69 66 20 70 46  x-excl" or if pF
e960: 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ile is opened on
e970: 20 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20   "unix-excl".** 
e980: 61 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  and is read-only
e990: 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ..**.** Zero is 
e9a0: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
e9b0: 63 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73  call completes s
e9c0: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20  uccessfully, or 
e9d0: 2d 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20  -1 if a call.** 
e9e0: 74 6f 20 66 63 6e 74 6c 28 29 20 66 61 69 6c 73  to fcntl() fails
e9f0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
ea00: 65 72 72 6e 6f 20 69 73 20 73 65 74 20 61 70 70  errno is set app
ea10: 72 6f 70 72 69 61 74 65 6c 79 20 28 62 79 20 66  ropriately (by f
ea20: 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74  cntl())..*/.stat
ea30: 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c  ic int unixFileL
ea40: 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ock(unixFile *pF
ea50: 69 6c 65 2c 20 73 74 72 75 63 74 20 66 6c 6f 63  ile, struct floc
ea60: 6b 20 2a 70 4c 6f 63 6b 2c 20 69 6e 74 20 6e 52  k *pLock, int nR
ea70: 65 74 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b  etry){.  int rc;
ea80: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
ea90: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
eaa0: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65  ->pInode;.  asse
eab0: 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  rt( unixMutexHel
eac0: 64 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  d() );.  assert(
ead0: 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20   pInode!=0 );.  
eae0: 69 66 28 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c  if( (pFile->ctrl
eaf0: 46 6c 61 67 73 20 26 20 28 55 4e 49 58 46 49 4c  Flags & (UNIXFIL
eb00: 45 5f 45 58 43 4c 7c 55 4e 49 58 46 49 4c 45 5f  E_EXCL|UNIXFILE_
eb10: 52 44 4f 4e 4c 59 29 29 3d 3d 55 4e 49 58 46 49  RDONLY))==UNIXFI
eb20: 4c 45 5f 45 58 43 4c 20 29 7b 0a 20 20 20 20 69  LE_EXCL ){.    i
eb30: 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  f( pInode->bProc
eb40: 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  essLock==0 ){.  
eb50: 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b      struct flock
eb60: 20 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73   lock;.      ass
eb70: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ert( pInode->nLo
eb80: 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6c  ck==0 );.      l
eb90: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
eba0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c  EEK_SET;.      l
ebb0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
ebc0: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
ebd0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
ebe0: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
ebf0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
ec00: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 20 20 72  F_WRLCK;.      r
ec10: 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c  c = osFcntl(pFil
ec20: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
ec30: 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 69 66 28  lock);.      if(
ec40: 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20 72   rc<0 ) return r
ec50: 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  c;.      pInode-
ec60: 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 3d 20  >bProcessLock = 
ec70: 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  1;.      pInode-
ec80: 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65  >nLock++;.    }e
ec90: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
eca0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  0;.    }.  }else
ecb0: 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b  {.    int i = 0;
ecc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecd0: 20 20 20 20 20 20 0a 20 20 20 20 66 6f 72 28 3b        .    for(;
ece0: 3b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f  ;){.      rc = o
ecf0: 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c  sFcntl(pFile->h,
ed00: 20 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29   F_SETLK, pLock)
ed10: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 26  ;.      if( rc &
ed20: 26 20 6e 52 65 74 72 79 2d 2d 20 29 7b 0a 20 20  & nRetry-- ){.  
ed30: 20 20 20 20 20 20 75 73 6c 65 65 70 28 31 30 30        usleep(100
ed40: 20 2a 20 28 2b 2b 69 29 29 3b 0a 20 20 20 20 20   * (++i));.     
ed50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ed60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
ed70: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
ed80: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
ed90: 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
eda0: 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
edb0: 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
edc0: 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
edd0: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
ede0: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
edf0: 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
ee00: 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
ee10: 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
ee20: 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
ee30: 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
ee40: 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
ee50: 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
ee60: 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
ee70: 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
ee80: 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
ee90: 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
eea0: 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
eeb0: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
eec0: 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
eed0: 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
eee0: 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
eef0: 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
ef00: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
ef10: 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
ef20: 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
ef30: 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
ef40: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
ef50: 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
ef60: 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
ef70: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
ef80: 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
ef90: 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
efa0: 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
efb0: 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
efc0: 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
efd0: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
efe0: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
eff0: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
f000: 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
f010: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
f020: 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
f030: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
f040: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
f050: 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
f060: 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
f070: 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
f080: 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
f090: 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
f0a0: 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
f0b0: 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b  tic int unixLock
f0c0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
f0d0: 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
f0e0: 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ){.  /* The foll
f0f0: 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65 73 20  owing describes 
f100: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
f110: 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75  on of the variou
f120: 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a  s locks and.  **
f130: 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e   lock transition
f140: 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  s in terms of th
f150: 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  e POSIX advisory
f160: 20 73 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c   shared and excl
f170: 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20  usive.  ** lock 
f180: 70 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c  primitives (call
f190: 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e  ed read-locks an
f1a0: 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65  d write-locks be
f1b0: 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20  low, to avoid.  
f1c0: 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74  ** confusion wit
f1d0: 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61  h SQLite lock na
f1e0: 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69  mes). The algori
f1f0: 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63  thms are complic
f200: 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74  ated.  ** slight
f210: 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  ly in order to b
f220: 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  e compatible wit
f230: 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  h windows system
f240: 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79  s simultaneously
f250: 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20  .  ** accessing 
f260: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
f270: 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20  e file, in case 
f280: 74 68 61 74 20 69 73 20 65 76 65 72 20 72 65 71  that is ever req
f290: 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  uired..  **.  **
f2a0: 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64   Symbols defined
f2b0: 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69   in os.h indenti
f2c0: 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  fy the 'pending 
f2d0: 62 79 74 65 27 20 61 6e 64 20 74 68 65 20 27 72  byte' and the 'r
f2e0: 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74  eserved.  ** byt
f2f0: 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20  e', each single 
f300: 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e  bytes at well kn
f310: 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64  own offsets, and
f320: 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74   the 'shared byt
f330: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61  e.  ** range', a
f340: 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79   range of 510 by
f350: 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e  tes at a well kn
f360: 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a  own offset..  **
f370: 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20  .  ** To obtain 
f380: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61  a SHARED lock, a
f390: 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62   read-lock is ob
f3a0: 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70  tained on the 'p
f3b0: 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65  ending.  ** byte
f3c0: 27 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73  '.  If this is s
f3d0: 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72 61 6e  uccessful, a ran
f3e0: 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 74 68  dom byte from th
f3f0: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
f400: 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 72 65   ** range' is re
f410: 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68  ad-locked and th
f420: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70  e lock on the 'p
f430: 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65 6c  ending byte' rel
f440: 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  eased..  **.  **
f450: 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f   A process may o
f460: 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53  nly obtain a RES
f470: 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72  ERVED lock after
f480: 20 69 74 20 68 61 73 20 61 20 53 48 41 52 45 44   it has a SHARED
f490: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45   lock..  ** A RE
f4a0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69  SERVED lock is i
f4b0: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72  mplemented by gr
f4c0: 61 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  abbing a write-l
f4d0: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
f4e0: 27 72 65 73 65 72 76 65 64 20 62 79 74 65 27 2e  'reserved byte'.
f4f0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72   .  **.  ** A pr
f500: 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f  ocess may only o
f510: 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20  btain a PENDING 
f520: 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61  lock after it ha
f530: 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a  s obtained a.  *
f540: 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41  * SHARED lock. A
f550: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
f560: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
f570: 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74  obtaining a writ
f580: 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74  e-lock.  ** on t
f590: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
f5a0: 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  '. This ensures 
f5b0: 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52  that no new SHAR
f5c0: 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a  ED locks can be.
f5d0: 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62    ** obtained, b
f5e0: 75 74 20 65 78 69 73 74 69 6e 67 20 53 48 41 52  ut existing SHAR
f5f0: 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c  ED locks are all
f600: 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e  owed to persist.
f610: 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20   A process.  ** 
f620: 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
f630: 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   obtain a RESERV
f640: 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77  ED lock on the w
f650: 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20  ay to a PENDING 
f660: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20  lock..  ** This 
f670: 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64  property is used
f680: 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68   by the algorith
f690: 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  m for rolling ba
f6a0: 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ck a journal fil
f6b0: 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63  e.  ** after a c
f6c0: 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rash..  **.  ** 
f6d0: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  An EXCLUSIVE loc
f6e0: 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65  k, obtained afte
f6f0: 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  r a PENDING lock
f700: 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a   is held, is.  *
f710: 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  * implemented by
f720: 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69   obtaining a wri
f730: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65  te-lock on the e
f740: 6e 74 69 72 65 20 27 73 68 61 72 65 64 20 62 79  ntire 'shared by
f750: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20  te.  ** range'. 
f760: 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20  Since all other 
f770: 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61 20  locks require a 
f780: 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65  read-lock on one
f790: 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20 20   of the bytes.  
f7a0: 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 72  ** within this r
f7b0: 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72  ange, this ensur
f7c0: 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  es that no other
f7d0: 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20   locks are held 
f7e0: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
f7f0: 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  base. .  **.  **
f800: 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20 73 69   The reason a si
f810: 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f 74  ngle byte cannot
f820: 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64   be used instead
f830: 20 6f 66 20 74 68 65 20 27 73 68 61 72 65 64 20   of the 'shared 
f840: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
f850: 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20 76 65   is that some ve
f860: 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77  rsions of window
f870: 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  s do not support
f880: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a   read-locks. By.
f890: 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72    ** locking a r
f8a0: 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20  andom byte from 
f8b0: 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72  a range, concurr
f8c0: 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  ent SHARED locks
f8d0: 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a 2a 20   may exist.  ** 
f8e0: 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b  even if the lock
f8f0: 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20 75 73  ing primitive us
f900: 65 64 20 69 73 20 61 6c 77 61 79 73 20 61 20 77  ed is always a w
f910: 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a  rite-lock..  */.
f920: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
f930: 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
f940: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
f950: 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
f960: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
f970: 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
f980: 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72   lock;.  int tEr
f990: 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  rno = 0;..  asse
f9a0: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
f9b0: 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
f9c0: 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73   %d %s was %s(%s
f9d0: 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69  ,%d) pid=%d (uni
f9e0: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
f9f0: 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63  .      azFileLoc
fa00: 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a  k(eFileLock), az
fa10: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e  FileLock(pFile->
fa20: 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20  eFileLock),.    
fa30: 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69    azFileLock(pFi
fa40: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
fa50: 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e 70  eLock), pFile->p
fa60: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a  Inode->nShared,.
fa70: 20 20 20 20 20 20 6f 73 47 65 74 70 69 64 28 30        osGetpid(0
fa80: 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  )));..  /* If th
fa90: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
faa0: 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
fab0: 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
fac0: 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
fad0: 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20  ** unixFile, do 
fae0: 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
faf0: 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a  se the end_lock:
fb00: 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
fb10: 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74   ** unixEnterMut
fb20: 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
fb30: 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
fb40: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
fb50: 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c  FileLock>=eFileL
fb60: 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ock ){.    OSTRA
fb70: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
fb80: 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68  %s ok (already h
fb90: 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20  eld) (unix)\n", 
fba0: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
fbb0: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
fbc0: 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20  (eFileLock)));. 
fbd0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fbe0: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
fbf0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
fc00: 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
fc10: 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20   correct..  **  
fc20: 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76  (1) We never mov
fc30: 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20  e from unlocked 
fc40: 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68  to anything high
fc50: 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c  er than shared l
fc60: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53  ock..  **  (2) S
fc70: 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c  QLite never expl
fc80: 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20  icitly requests 
fc90: 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20  a pendig lock.. 
fca0: 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65   **  (3) A share
fcb0: 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73  d lock is always
fcc0: 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73   held when a res
fcd0: 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71  erve lock is req
fce0: 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  uested..  */.  a
fcf0: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
fd00: 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b  ileLock!=NO_LOCK
fd10: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   || eFileLock==S
fd20: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
fd30: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
fd40: 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k!=PENDING_LOCK 
fd50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
fd60: 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44  leLock!=RESERVED
fd70: 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
fd80: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
fd90: 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  D_LOCK );..  /* 
fda0: 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65  This mutex is ne
fdb0: 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69  eded because pFi
fdc0: 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
fdd0: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
fde0: 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ads.  */.  unixE
fdf0: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
fe00: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
fe10: 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  Inode;..  /* If 
fe20: 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
fe30: 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61  g this PID has a
fe40: 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66   lock via a diff
fe50: 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a  erent unixFile*.
fe60: 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74    ** handle that
fe70: 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72   precludes the r
fe80: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72  equested lock, r
fe90: 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f  eturn BUSY..  */
fea0: 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65  .  if( (pFile->e
feb0: 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65  FileLock!=pInode
fec0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a  ->eFileLock && .
fed0: 20 20 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64            (pInod
fee0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
fef0: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46  NDING_LOCK || eF
ff00: 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
ff10: 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  OCK)).  ){.    r
ff20: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
ff30: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
ff40: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ck;.  }..  /* If
ff50: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
ff60: 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64  s requested, and
ff70: 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
ff80: 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65  ng this PID alre
ff90: 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53  ady.  ** has a S
ffa0: 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45  HARED or RESERVE
ffb0: 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63  D lock, then inc
ffc0: 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  rement reference
ffd0: 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a   counts and.  **
ffe0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
fff0: 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  K..  */.  if( eF
10000 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
10010 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28  LOCK && .      (
10020 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
10030 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
10040 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  | pInode->eFileL
10050 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
10060 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  CK) ){.    asser
10070 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  t( eFileLock==SH
10080 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
10090 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
100a0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
100b0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
100c0 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b  de->nShared>0 );
100d0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
100e0 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
100f0 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
10100 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20  >nShared++;.    
10110 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
10120 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
10130 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41  ck;.  }...  /* A
10140 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
10150 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61   needed before a
10160 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
10170 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72  D lock and befor
10180 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67  e.  ** acquiring
10190 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
101a0 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41  ck.  For the SHA
101b0 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45  RED lock, the PE
101c0 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20  NDING will.  ** 
101d0 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  be released..  *
101e0 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  /.  lock.l_len =
101f0 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68   1L;.  lock.l_wh
10200 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
10210 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
10220 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20  ==SHARED_LOCK . 
10230 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f       || (eFileLo
10240 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
10250 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
10260 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c  leLock<PENDING_L
10270 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f  OCK).  ){.    lo
10280 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46 69  ck.l_type = (eFi
10290 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
102a0 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52  OCK?F_RDLCK:F_WR
102b0 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  LCK);.    lock.l
102c0 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
102d0 5f 42 59 54 45 3b 0a 20 20 20 20 69 66 28 20 75  _BYTE;.    if( u
102e0 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
102f0 65 2c 20 26 6c 6f 63 6b 2c 20 30 29 20 29 7b 0a  e, &lock, 0) ){.
10300 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
10310 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
10320 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
10330 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
10340 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
10350 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
10360 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
10370 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  c) ){.        st
10380 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
10390 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
103a0 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
103b0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  end_lock;.    }.
103c0 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f    }...  /* If co
103d0 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68  ntrol gets to th
103e0 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61  is point, then a
103f0 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64  ctually go ahead
10400 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f   and make.  ** o
10410 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
10420 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70  calls for the sp
10430 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20  ecified lock..  
10440 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
10450 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
10460 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
10470 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d  Inode->nShared==
10480 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
10490 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
104a0 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ck==0 );.    ass
104b0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
104c0 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f  OK );..    /* No
104d0 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c  w get the read-l
104e0 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e  ock */.    lock.
104f0 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
10500 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b  _FIRST;.    lock
10510 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
10520 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20 75 6e  SIZE;.    if( un
10530 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
10540 2c 20 26 6c 6f 63 6b 2c 20 30 29 20 29 7b 0a 20  , &lock, 0) ){. 
10550 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
10560 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
10570 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
10580 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
10590 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
105a0 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OCK);.    }..   
105b0 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d   /* Drop the tem
105c0 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c  porary PENDING l
105d0 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e  ock */.    lock.
105e0 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
105f0 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  G_BYTE;.    lock
10600 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20  .l_len = 1L;.   
10610 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
10620 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20  _UNLCK;.    if( 
10630 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
10640 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 20 26  le, &lock, 10) &
10650 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
10660 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
10670 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69   could happen wi
10680 74 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75  th a network mou
10690 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74 45 72 72  nt */.      tErr
106a0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 20  no = errno;.#if 
106b0 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f  OSLOCKING_CHECK_
106c0 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20  BUSY_IOERR.     
106d0 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
106e0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
106f0 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
10700 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 23  OERR_UNLOCK); .#
10710 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20  else.      rc = 
10720 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
10730 4f 43 4b 3b 20 0a 23 65 6e 64 69 66 0a 20 20 20  OCK; .#endif.   
10740 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 20 29   }..    if( rc )
10750 7b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c  {.      if( IS_L
10760 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
10770 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
10780 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
10790 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  Errno);.      }.
107a0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c        goto end_l
107b0 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ock;.    }else{.
107c0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
107d0 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
107e0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  LOCK;.      pIno
107f0 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
10800 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
10810 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
10820 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
10830 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
10840 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e  OCK && pInode->n
10850 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20  Shared>1 ){.    
10860 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
10870 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
10880 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
10890 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
108a0 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72  s.    ** same pr
108b0 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
108c0 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
108d0 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20  lock. */.    rc 
108e0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
108f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
10900 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66  he request was f
10910 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  or a RESERVED or
10920 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
10930 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61    It is.    ** a
10940 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72  ssumed that ther
10950 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72  e is a SHARED or
10960 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
10970 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
10980 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
10990 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
109a0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
109b0 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   );.    lock.l_t
109c0 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a  ype = F_WRLCK;..
109d0 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c      assert( eFil
109e0 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
109f0 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
10a00 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
10a10 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 65 46 69  K );.    if( eFi
10a20 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
10a30 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c  _LOCK ){.      l
10a40 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
10a50 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
10a60 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
10a70 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1L;.    }else{. 
10a80 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
10a90 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
10aa0 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ;.      lock.l_l
10ab0 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
10ac0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
10ad0 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
10ae0 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 30 29 20 29  ile, &lock, 0) )
10af0 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  {.      tErrno =
10b00 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
10b10 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
10b20 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
10b30 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
10b40 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
10b50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55  f( rc!=SQLITE_BU
10b60 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  SY ){.        st
10b70 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
10b80 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
10b90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
10ba0 20 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   ..#ifdef SQLITE
10bb0 5f 44 45 42 55 47 0a 20 20 2f 2a 20 53 65 74 20  _DEBUG.  /* Set 
10bc0 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  up the transacti
10bd0 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e 67  on-counter chang
10be0 65 20 63 68 65 63 6b 69 6e 67 20 66 6c 61 67 73  e checking flags
10bf0 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73   when.  ** trans
10c00 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20  itioning from a 
10c10 53 48 41 52 45 44 20 74 6f 20 61 20 52 45 53 45  SHARED to a RESE
10c20 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20  RVED lock.  The 
10c30 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d  change.  ** from
10c40 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52   SHARED to RESER
10c50 56 45 44 20 6d 61 72 6b 73 20 74 68 65 20 62 65  VED marks the be
10c60 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72  ginning of a nor
10c70 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f  mal.  ** write o
10c80 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20  peration (not a 
10c90 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot journal roll
10ca0 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  back)..  */.  if
10cb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  ( rc==SQLITE_OK.
10cc0 20 20 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69     && pFile->eFi
10cd0 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
10ce0 4f 43 4b 0a 20 20 20 26 26 20 65 46 69 6c 65 4c  OCK.   && eFileL
10cf0 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
10d00 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46 69 6c  CK.  ){.    pFil
10d10 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  e->transCntrChng
10d20 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d   = 0;.    pFile-
10d30 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20  >dbUpdate = 0;. 
10d40 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d     pFile->inNorm
10d50 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d  alWrite = 1;.  }
10d60 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20  .#endif...  if( 
10d70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10d80 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
10d90 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
10da0 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  k;.    pInode->e
10db0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
10dc0 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Lock;.  }else if
10dd0 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
10de0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
10df0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
10e00 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ock = PENDING_LO
10e10 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
10e20 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44  eFileLock = PEND
10e30 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65  ING_LOCK;.  }..e
10e40 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c  nd_lock:.  unixL
10e50 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
10e60 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
10e70 20 25 64 20 25 73 20 25 73 20 28 75 6e 69 78 29   %d %s %s (unix)
10e80 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61  \n", pFile->h, a
10e90 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
10ea0 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 72 63 3d  ock), .      rc=
10eb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
10ec0 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
10ed0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10ee0 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 66 69  /*.** Add the fi
10ef0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 75 73  le descriptor us
10f00 65 64 20 62 79 20 66 69 6c 65 20 68 61 6e 64 6c  ed by file handl
10f10 65 20 70 46 69 6c 65 20 74 6f 20 74 68 65 20 63  e pFile to the c
10f20 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
10f30 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f  pUnused list..*/
10f40 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
10f50 50 65 6e 64 69 6e 67 46 64 28 75 6e 69 78 46 69  PendingFd(unixFi
10f60 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e  le *pFile){.  un
10f70 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
10f80 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
10f90 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65  ode;.  UnixUnuse
10fa0 64 46 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e  dFd *p = pFile->
10fb0 70 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70 4e  pUnused;.  p->pN
10fc0 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55  ext = pInode->pU
10fd0 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d  nused;.  pInode-
10fe0 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20  >pUnused = p;.  
10ff0 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  pFile->h = -1;. 
11000 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 20   pFile->pUnused 
11010 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  = 0;.}../*.** Lo
11020 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
11030 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
11040 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
11050 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
11060 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
11070 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
11080 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
11090 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
110a0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
110b0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
110c0 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
110d0 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
110e0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
110f0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
11100 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
11110 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68 61  op..** .** If ha
11120 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69 73  ndleNFSUnlock is
11130 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20 64   true, then on d
11140 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e 20 45 58  owngrading an EX
11150 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f 20  CLUSIVE_LOCK to 
11160 53 48 41 52 45 44 0a 2a 2a 20 74 68 65 20 62 79  SHARED.** the by
11170 74 65 20 72 61 6e 67 65 20 69 73 20 64 69 76 69  te range is divi
11180 64 65 64 20 69 6e 74 6f 20 32 20 70 61 72 74 73  ded into 2 parts
11190 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 70   and the first p
111a0 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20  art is unlocked 
111b0 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20 61  then.** set to a
111c0 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65 6e   read lock, then
111d0 20 74 68 65 20 6f 74 68 65 72 20 70 61 72 74 20   the other part 
111e0 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b  is simply unlock
111f0 65 64 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20  ed.  This works 
11200 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62 75 67  .** around a bug
11210 20 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63 6b   in BSD NFS lock
11220 64 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e 20  d (also seen on 
11230 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29 20 74 68  MacOSX 10.3+) th
11240 61 74 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a 20  at fails to .** 
11250 72 65 6d 6f 76 65 20 74 68 65 20 77 72 69 74 65  remove the write
11260 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69 6f   lock on a regio
11270 6e 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f  n when a read lo
11280 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73 74  ck is set..*/.st
11290 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 55 6e  atic int posixUn
112a0 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
112b0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
112c0 4c 6f 63 6b 2c 20 69 6e 74 20 68 61 6e 64 6c 65  Lock, int handle
112d0 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e  NFSUnlock){.  un
112e0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
112f0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
11300 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
11310 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74  pInode;.  struct
11320 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69   flock lock;.  i
11330 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
11340 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  K;..  assert( pF
11350 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
11360 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  (("UNLOCK  %d %d
11370 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70   was %d(%d,%d) p
11380 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c  id=%d (unix)\n",
11390 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
113a0 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46 69 6c  Lock,.      pFil
113b0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46  e->eFileLock, pF
113c0 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
113d0 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
113e0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a  Inode->nShared,.
113f0 20 20 20 20 20 20 6f 73 47 65 74 70 69 64 28 30        osGetpid(0
11400 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )));..  assert( 
11410 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
11420 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  D_LOCK );.  if( 
11430 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
11440 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  <=eFileLock ){. 
11450 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11460 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45  _OK;.  }.  unixE
11470 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
11480 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
11490 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
114a0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
114b0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
114c0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
114d0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
114e0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
114f0 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c  >eFileLock==pFil
11500 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
11510 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
11520 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e  EBUG.    /* When
11530 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b   reducing a lock
11540 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72   such that other
11550 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73   processes can s
11560 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64  tart.    ** read
11570 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
11580 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b   file again, mak
11590 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a  e sure that the.
115a0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
115b0 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75  on counter was u
115c0 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61  pdated if any pa
115d0 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
115e0 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  se.    ** file c
115f0 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20  hanged.  If the 
11600 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
11610 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74  ter is not updat
11620 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  ed,.    ** other
11630 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20   connections to 
11640 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69  the same file mi
11650 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20  ght not realize 
11660 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
11670 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64  file has changed
11680 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74   and hence might
11690 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75   not know to flu
116a0 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20  sh their.    ** 
116b0 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20  cache.  The use 
116c0 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65  of a stale cache
116d0 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
116e0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
116f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 46 69  ..    */.    pFi
11700 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
11710 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  e = 0;.#endif.. 
11720 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e     /* downgradin
11730 67 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f  g to a shared lo
11740 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76  ck on NFS involv
11750 65 73 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  es clearing the 
11760 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a  write lock.    *
11770 2a 20 62 65 66 6f 72 65 20 65 73 74 61 62 6c 69  * before establi
11780 73 68 69 6e 67 20 74 68 65 20 72 65 61 64 6c 6f  shing the readlo
11790 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20  ck - to avoid a 
117a0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77  race condition w
117b0 65 20 64 6f 77 6e 67 72 61 64 65 0a 20 20 20 20  e downgrade.    
117c0 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32  ** the lock in 2
117d0 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74   blocks, so that
117e0 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e   part of the ran
117f0 67 65 20 77 69 6c 6c 20 62 65 20 63 6f 76 65 72  ge will be cover
11800 65 64 20 62 79 20 61 20 0a 20 20 20 20 2a 2a 20  ed by a .    ** 
11810 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c  write lock until
11820 20 74 68 65 20 72 65 73 74 20 69 73 20 63 6f 76   the rest is cov
11830 65 72 65 64 20 62 79 20 61 20 72 65 61 64 20 6c  ered by a read l
11840 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20  ock:.    **  1: 
11850 20 20 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a    [WWWWW].    **
11860 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20    2:   [....W]. 
11870 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52     **  3:   [RRR
11880 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20  RW].    **  4:  
11890 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a   [RRRR.].    */.
118a0 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63      if( eFileLoc
118b0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
118c0 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f  {.#if !defined(_
118d0 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53 51  _APPLE__) || !SQ
118e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
118f0 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20  ING_STYLE.      
11900 28 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53 55  (void)handleNFSU
11910 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73  nlock;.      ass
11920 65 72 74 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e  ert( handleNFSUn
11930 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  lock==0 );.#endi
11940 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  f.#if defined(__
11950 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
11960 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
11970 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69 66  G_STYLE.      if
11980 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  ( handleNFSUnloc
11990 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  k ){.        int
119a0 20 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20   tErrno;        
119b0 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
119c0 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65 6d  code from system
119d0 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a   call errors */.
119e0 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 64 69          off_t di
119f0 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44 5f 53  vSize = SHARED_S
11a00 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  IZE - 1;.       
11a10 20 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   .        lock.l
11a20 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
11a30 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
11a40 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
11a50 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
11a60 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
11a70 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20  _FIRST;.        
11a80 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76  lock.l_len = div
11a90 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
11aa0 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
11ab0 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29  File, &lock, 10)
11ac0 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
11ad0 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
11ae0 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e  no;.#if OSLOCKIN
11af0 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45  G_CHECK_BUSY_IOE
11b00 52 52 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  RR.          rc 
11b10 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
11b20 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
11b30 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
11b40 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65 0a  _UNLOCK);.#else.
11b50 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
11b60 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
11b70 43 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  CK;.#endif.     
11b80 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
11b90 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
11ba0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  o);.          go
11bb0 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
11bc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11bd0 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
11be0 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _RDLCK;.        
11bf0 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
11c00 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
11c10 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
11c20 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
11c30 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
11c40 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20  n = divSize;.   
11c50 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
11c60 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
11c70 63 6b 2c 20 31 30 29 3d 3d 28 2d 31 29 20 29 7b  ck, 10)==(-1) ){
11c80 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e  .          tErrn
11c90 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 20 4f  o = errno;.#if O
11ca0 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42  SLOCKING_CHECK_B
11cb0 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20  USY_IOERR.      
11cc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
11cd0 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
11ce0 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
11cf0 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b  E_IOERR_RDLOCK);
11d00 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20  .#else.         
11d10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
11d20 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69  RR_UNLOCK;.#endi
11d30 66 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  f.          if( 
11d40 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
11d50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
11d60 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
11d70 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
11d80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
11d90 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
11da0 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
11db0 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
11dc0 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
11dd0 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77          lock.l_w
11de0 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
11df0 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
11e00 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
11e10 46 49 52 53 54 2b 64 69 76 53 69 7a 65 3b 0a 20  FIRST+divSize;. 
11e20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
11e30 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 2d  n = SHARED_SIZE-
11e40 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
11e50 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
11e60 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20  k(pFile, &lock, 
11e70 31 30 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  10)==(-1) ){.   
11e80 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
11e90 65 72 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43  errno;.#if OSLOC
11ea0 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f  KING_CHECK_BUSY_
11eb0 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20  IOERR.          
11ec0 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
11ed0 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
11ee0 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
11ef0 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6c  ERR_UNLOCK);.#el
11f00 73 65 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  se.          rc 
11f10 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
11f20 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a 20 20  NLOCK;.#endif.  
11f30 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
11f40 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
11f50 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 6f  .            sto
11f60 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
11f70 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
11f80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11f90 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
11fa0 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
11fb0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
11fc0 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
11fd0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
11fe0 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  e.#endif /* defi
11ff0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
12000 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
12010 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
12020 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
12030 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
12040 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _RDLCK;.        
12050 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
12060 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
12070 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
12080 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
12090 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
120a0 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
120b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69  .        if( uni
120c0 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
120d0 20 26 6c 6f 63 6b 2c 20 31 30 29 20 29 7b 0a 20   &lock, 10) ){. 
120e0 20 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72           int tEr
120f0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66  rno = errno;.#if
12100 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b   OSLOCKING_CHECK
12110 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20  _BUSY_IOERR.    
12120 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12130 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
12140 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
12150 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
12160 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  );.#else.       
12170 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c     /* In theory,
12180 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 69   the call to uni
12190 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63 61 6e 6e  xFileLock() cann
121a0 6f 74 20 66 61 69 6c 20 62 65 63 61 75 73 65 20  ot fail because 
121b0 61 6e 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20  another.        
121c0 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20    ** process is 
121d0 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 63 6f 6d  holding an incom
121e0 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e 20 49 66  patible lock. If
121f0 20 69 74 20 64 6f 65 73 2c 20 74 68 69 73 20 0a   it does, this .
12200 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64            ** ind
12210 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
12220 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
12230 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   not following t
12240 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20 20 20 20  he locking.     
12250 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c       ** protocol
12260 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
12270 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  s, return SQLITE
12280 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 2e 20 52  _IOERR_RDLOCK. R
12290 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20 20 20  eturning.       
122a0 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53     ** SQLITE_BUS
122b0 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75 73 65 20  Y would confuse 
122c0 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
122d0 28 69 6e 20 70 72 61 63 74 69 63 65 20 69 74 20  (in practice it 
122e0 63 61 75 73 65 73 20 0a 20 20 20 20 20 20 20 20  causes .        
122f0 20 20 2a 2a 20 61 6e 20 61 73 73 65 72 74 20 74    ** an assert t
12300 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a 20 20 20  o fail). */ .   
12310 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
12320 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b  TE_IOERR_RDLOCK;
12330 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65  .          store
12340 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
12350 20 74 45 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66   tErrno);.#endif
12360 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49  .          if( I
12370 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
12380 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12390 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
123a0 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
123b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
123c0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
123d0 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
123e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
123f0 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
12400 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63  F_UNLCK;.    loc
12410 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
12420 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  K_SET;.    lock.
12430 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
12440 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  G_BYTE;.    lock
12450 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73  .l_len = 2L;  as
12460 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42 59  sert( PENDING_BY
12470 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f 42  TE+1==RESERVED_B
12480 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20 75  YTE );.    if( u
12490 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
124a0 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d 30  e, &lock, 10)==0
124b0 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65   ){.      pInode
124c0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
124d0 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  ARED_LOCK;.    }
124e0 65 6c 73 65 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b  else{.#if OSLOCK
124f0 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49  ING_CHECK_BUSY_I
12500 4f 45 52 52 0a 20 20 20 20 20 20 74 45 72 72 6e  OERR.      tErrn
12510 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
12520 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
12530 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
12540 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
12550 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20  OERR_UNLOCK);.  
12560 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
12570 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
12580 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
12590 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
125a0 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73  o);.      }.#els
125b0 65 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  e.      rc = SQL
125c0 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
125d0 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  ;.      storeLas
125e0 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
125f0 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  rno);.#endif.   
12600 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
12610 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ck;.    }.  }.  
12620 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e  if( eFileLock==N
12630 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a  O_LOCK ){.    /*
12640 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73   Decrement the s
12650 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74  hared lock count
12660 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65  er.  Release the
12670 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20   lock using an. 
12680 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e     ** OS call on
12690 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65  ly when all thre
126a0 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65  ads in this same
126b0 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65   process have re
126c0 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68  leased.    ** th
126d0 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  e lock..    */. 
126e0 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
126f0 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49  ed--;.    if( pI
12700 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30  node->nShared==0
12710 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   ){.      lock.l
12720 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
12730 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  .      lock.l_wh
12740 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
12750 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
12760 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  art = lock.l_len
12770 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69 66 28   = 0L;.      if(
12780 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
12790 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 3d  ile, &lock, 10)=
127a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  =0 ){.        pI
127b0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
127c0 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
127d0 20 7d 65 6c 73 65 7b 0a 23 69 66 20 4f 53 4c 4f   }else{.#if OSLO
127e0 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59  CKING_CHECK_BUSY
127f0 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 74  _IOERR.        t
12800 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
12810 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12820 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
12830 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
12840 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
12850 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  K);.        if( 
12860 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
12870 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
12880 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
12890 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
128a0 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20        }.#else.  
128b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
128c0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
128d0 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
128e0 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
128f0 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  rno);.#endif.   
12900 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
12910 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
12920 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
12930 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
12940 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOCK;.      }.  
12950 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72    }..    /* Decr
12960 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20  ement the count 
12970 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74  of locks against
12980 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e   this same file.
12990 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a    When the.    *
129a0 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  * count reaches 
129b0 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20  zero, close any 
129c0 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72  other file descr
129d0 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f  iptors whose clo
129e0 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65  se.    ** was de
129f0 66 65 72 72 65 64 20 62 65 63 61 75 73 65 20 6f  ferred because o
12a00 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  f outstanding lo
12a10 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  cks..    */.    
12a20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b  pInode->nLock--;
12a30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
12a40 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  ode->nLock>=0 );
12a50 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
12a60 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  >nLock==0 ){.   
12a70 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46     closePendingF
12a80 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d  ds(pFile);.    }
12a90 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63 6b  .  }..end_unlock
12aa0 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
12ab0 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ex();.  if( rc==
12ac0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c  SQLITE_OK ) pFil
12ad0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
12ae0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75  FileLock;.  retu
12af0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12b00 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
12b10 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
12b20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
12b30 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
12b40 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
12b50 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
12b60 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
12b70 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
12b80 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
12b90 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
12ba0 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
12bb0 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
12bc0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
12bd0 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
12be0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
12bf0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
12c00 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73  int unixUnlock(s
12c10 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
12c20 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
12c30 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
12c40 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 61 73  MMAP_SIZE>0.  as
12c50 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
12c60 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
12c70 28 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 29  ((unixFile *)id)
12c80 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29  ->nFetchOut==0 )
12c90 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
12ca0 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64  n posixUnlock(id
12cb0 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b  , eFileLock, 0);
12cc0 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .}..#if SQLITE_M
12cd0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73  AX_MMAP_SIZE>0.s
12ce0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 61  tatic int unixMa
12cf0 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  pfile(unixFile *
12d00 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65 29 3b  pFd, i64 nByte);
12d10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
12d20 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78 46  xUnmapfile(unixF
12d30 69 6c 65 20 2a 70 46 64 29 3b 0a 23 65 6e 64 69  ile *pFd);.#endi
12d40 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
12d50 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20  nction performs 
12d60 74 68 65 20 70 61 72 74 73 20 6f 66 20 74 68 65  the parts of the
12d70 20 22 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70   "close file" op
12d80 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d  eration .** comm
12d90 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e  on to all lockin
12da0 67 20 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c  g schemes. It cl
12db0 6f 73 65 73 20 74 68 65 20 64 69 72 65 63 74 6f  oses the directo
12dc0 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68  ry and file.** h
12dd0 61 6e 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20  andles, if they 
12de0 61 72 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73  are valid, and s
12df0 65 74 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f  ets all fields o
12e00 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a  f the unixFile.*
12e10 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 30  * structure to 0
12e20 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e  ..**.** It is *n
12e30 6f 74 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f  ot* necessary to
12e40 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 20   hold the mutex 
12e50 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
12e60 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20  e is called,.** 
12e70 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  even on VxWorks.
12e80 20 20 41 20 6d 75 74 65 78 20 77 69 6c 6c 20 62    A mutex will b
12e90 65 20 61 63 71 75 69 72 65 64 20 6f 6e 20 56 78  e acquired on Vx
12ea0 57 6f 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20  Works by the.** 
12eb0 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69  vxworksReleaseFi
12ec0 6c 65 49 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a  leId() routine..
12ed0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
12ee0 6f 73 65 55 6e 69 78 46 69 6c 65 28 73 71 6c 69  oseUnixFile(sqli
12ef0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
12f00 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
12f10 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
12f20 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
12f30 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75  _MMAP_SIZE>0.  u
12f40 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 69  nixUnmapfile(pFi
12f50 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  le);.#endif.  if
12f60 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b  ( pFile->h>=0 ){
12f70 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73  .    robust_clos
12f80 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  e(pFile, pFile->
12f90 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
12fa0 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b    pFile->h = -1;
12fb0 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f  .  }.#if OS_VXWO
12fc0 52 4b 53 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  RKS.  if( pFile-
12fd0 3e 70 49 64 20 29 7b 0a 20 20 20 20 69 66 28 20  >pId ){.    if( 
12fe0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
12ff0 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45   & UNIXFILE_DELE
13000 54 45 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e  TE ){.      osUn
13010 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d  link(pFile->pId-
13020 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29  >zCanonicalName)
13030 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 78 77 6f  ;.    }.    vxwo
13040 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64  rksReleaseFileId
13050 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20  (pFile->pId);.  
13060 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30    pFile->pId = 0
13070 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ;.  }.#endif.#if
13080 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 4c 49 4e  def SQLITE_UNLIN
13090 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45 0a 20 20  K_AFTER_CLOSE.  
130a0 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46  if( pFile->ctrlF
130b0 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
130c0 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6f 73  DELETE ){.    os
130d0 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 7a 50  Unlink(pFile->zP
130e0 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ath);.    sqlite
130f0 33 5f 66 72 65 65 28 2a 28 63 68 61 72 2a 2a 29  3_free(*(char**)
13100 26 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a  &pFile->zPath);.
13110 20 20 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68      pFile->zPath
13120 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
13130 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f  .  OSTRACE(("CLO
13140 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46  SE   %-3d\n", pF
13150 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e  ile->h));.  Open
13160 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73  Counter(-1);.  s
13170 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
13180 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 6d  e->pUnused);.  m
13190 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20  emset(pFile, 0, 
131a0 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
131b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
131c0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
131d0 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f  Close a file..*/
131e0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
131f0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
13200 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72  le *id){.  int r
13210 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
13220 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
13230 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69   = (unixFile *)i
13240 64 3b 0a 20 20 76 65 72 69 66 79 44 62 46 69 6c  d;.  verifyDbFil
13250 65 28 70 46 69 6c 65 29 3b 0a 20 20 75 6e 69 78  e(pFile);.  unix
13260 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
13270 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  CK);.  unixEnter
13280 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 75  Mutex();..  /* u
13290 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64 65 20 69  nixFile.pInode i
132a0 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 68  s always valid h
132b0 65 72 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ere. Otherwise, 
132c0 61 20 64 69 66 66 65 72 65 6e 74 20 63 6c 6f 73  a different clos
132d0 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 28  e.  ** routine (
132e0 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65  e.g. nolockClose
132f0 28 29 29 20 77 6f 75 6c 64 20 62 65 20 63 61 6c  ()) would be cal
13300 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a  led instead..  *
13310 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
13320 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  e->pInode->nLock
13330 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 49 6e  >0 || pFile->pIn
13340 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
13350 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 41 4c  k==0 );.  if( AL
13360 57 41 59 53 28 70 46 69 6c 65 2d 3e 70 49 6e 6f  WAYS(pFile->pIno
13370 64 65 29 20 26 26 20 70 46 69 6c 65 2d 3e 70 49  de) && pFile->pI
13380 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20  node->nLock ){. 
13390 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
133a0 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
133b0 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
133c0 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
133d0 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a  file just.    **
133e0 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61   yet because tha
133f0 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68  t would clear th
13400 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74  ose locks.  Inst
13410 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c  ead, add the fil
13420 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70  e.    ** descrip
13430 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70  tor to pInode->p
13440 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20 49 74  Unused list.  It
13450 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
13460 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20  ically closed . 
13470 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c     ** when the l
13480 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
13490 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
134a0 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69  setPendingFd(pFi
134b0 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  le);.  }.  relea
134c0 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c  seInodeInfo(pFil
134d0 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65  e);.  rc = close
134e0 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
134f0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
13500 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13510 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
13520 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70 6f 73  * End of the pos
13530 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix advisory lock
13540 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
13550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13560 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
13570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
135a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
135b0 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
135c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
135d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
135e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
135f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13600 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
13610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13620 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20  * No-op Locking 
13630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13650 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20  **.**.** Of the 
13660 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20  various locking 
13670 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
13680 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20  available, this 
13690 69 73 20 62 79 20 66 61 72 20 74 68 65 0a 2a 2a  is by far the.**
136a0 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b   simplest:  lock
136b0 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ing is ignored. 
136c0 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d   No attempt is m
136d0 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  ade to lock the 
136e0 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
136f0 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
13700 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  writing..**.** T
13710 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  his locking mode
13720 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
13730 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61 64 2d  for use on read-
13740 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73 0a 2a  only databases.*
13750 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73 65 73  * (ex: databases
13760 20 74 68 61 74 20 61 72 65 20 62 75 72 6e 65 64   that are burned
13770 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f   into CD-ROM, fo
13780 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49 74 20  r example.)  It 
13790 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75  can.** also be u
137a0 73 65 64 20 69 66 20 74 68 65 20 61 70 70 6c 69  sed if the appli
137b0 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73  cation employs s
137c0 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d 65 63  ome external mec
137d0 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65  hanism to.** pre
137e0 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75  vent simultaneou
137f0 73 20 61 63 63 65 73 73 20 6f 66 20 74 68 65 20  s access of the 
13800 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 62 79  same database by
13810 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   two or more.** 
13820 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
13830 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65 72 65  ions.  But there
13840 20 69 73 20 61 20 73 65 72 69 6f 75 73 20 72 69   is a serious ri
13850 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 0a 2a  sk of database.*
13860 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 66 20  * corruption if 
13870 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  this locking mod
13880 65 20 69 73 20 75 73 65 64 20 69 6e 20 73 69 74  e is used in sit
13890 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 75  uations where mu
138a0 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61  ltiple.** databa
138b0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  se connections a
138c0 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  re accessing the
138d0 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
138e0 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 0a  ile at the same.
138f0 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20  ** time and one 
13900 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65  or more of those
13910 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
13920 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74   writing..*/..st
13930 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43  atic int nolockC
13940 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
13950 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e  (sqlite3_file *N
13960 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a 70 52 65  otUsed, int *pRe
13970 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sOut){.  UNUSED_
13980 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
13990 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  d);.  *pResOut =
139a0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
139b0 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63  ITE_OK;.}.static
139c0 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28   int nolockLock(
139d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
139e0 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73  tUsed, int NotUs
139f0 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
13a00 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
13a10 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
13a20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13a30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  ;.}.static int n
13a40 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69  olockUnlock(sqli
13a50 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
13a60 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29  d, int NotUsed2)
13a70 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
13a80 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
13a90 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
13aa0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
13ab0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
13ac0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
13ad0 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65   int nolockClose
13ae0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
13af0 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  d) {.  int rc = 
13b00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
13b10 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
13b20 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20  unixFile *)id;. 
13b30 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
13b40 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
13b50 70 49 6e 6f 64 65 20 29 7b 20 20 0a 20 20 20 20  pInode ){  .    
13b60 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
13b70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c  Inode->nLock>0 |
13b80 7c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  | pFile->pInode-
13b90 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
13ba0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c   );.    if( pFil
13bb0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  e->pInode->nLock
13bc0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
13bd0 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
13be0 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20  nding locks, do 
13bf0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f  not actually clo
13c00 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74  se the file just
13c10 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20 62 65  .      ** yet be
13c20 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64  cause that would
13c30 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63   clear those loc
13c40 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64  ks.  Instead, ad
13c50 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20  d the file.     
13c60 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74   ** descriptor t
13c70 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  o pInode->pUnuse
13c80 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c  d list.  It will
13c90 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
13ca0 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20 20 20  y closed .      
13cb0 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ** when the last
13cc0 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64   lock is cleared
13cd0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
13ce0 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46   setPendingFd(pF
13cf0 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ile);.    }.    
13d00 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f  releaseInodeInfo
13d10 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72  (pFile);.  }.  r
13d20 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
13d30 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61  e(id);.  unixLea
13d40 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
13d50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  urn rc;.}../****
13d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
13d70 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70  End of the no-op
13d80 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
13d90 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
13da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
13db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
13e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
13e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e60 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f 74 2d  ***** Begin dot-
13e70 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  file Locking ***
13e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
13ea0 2a 20 54 68 65 20 64 6f 74 66 69 6c 65 20 6c 6f  * The dotfile lo
13eb0 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61  cking implementa
13ec0 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 65 78  tion uses the ex
13ed0 69 73 74 65 6e 63 65 20 6f 66 20 73 65 70 61 72  istence of separ
13ee0 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65  ate lock.** file
13ef0 73 20 28 72 65 61 6c 6c 79 20 61 20 64 69 72 65  s (really a dire
13f00 63 74 6f 72 79 29 20 74 6f 20 63 6f 6e 74 72 6f  ctory) to contro
13f10 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20  l access to the 
13f20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
13f30 77 6f 72 6b 73 0a 2a 2a 20 6f 6e 20 6a 75 73 74  works.** on just
13f40 20 61 62 6f 75 74 20 65 76 65 72 79 20 66 69 6c   about every fil
13f50 65 73 79 73 74 65 6d 20 69 6d 61 67 69 6e 61 62  esystem imaginab
13f60 6c 65 2e 20 20 42 75 74 20 74 68 65 72 65 20 61  le.  But there a
13f70 72 65 20 73 65 72 69 6f 75 73 20 64 6f 77 6e 73  re serious downs
13f80 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ides:.**.**    (
13f90 31 29 20 20 54 68 65 72 65 20 69 73 20 7a 65 72  1)  There is zer
13fa0 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e 20 20  o concurrency.  
13fb0 41 20 73 69 6e 67 6c 65 20 72 65 61 64 65 72 20  A single reader 
13fc0 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68 65 72  blocks all other
13fd0 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 6e  .**         conn
13fe0 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72 65 61  ections from rea
13ff0 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
14000 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
14010 0a 2a 2a 20 20 20 20 28 32 29 20 20 41 6e 20 61  .**    (2)  An a
14020 70 70 6c 69 63 61 74 69 6f 6e 20 63 72 61 73 68  pplication crash
14030 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73 20 63   or power loss c
14040 61 6e 20 6c 65 61 76 65 20 73 74 61 6c 65 20 6c  an leave stale l
14050 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20 20 20  ock files.**    
14060 20 20 20 20 20 73 69 74 74 69 6e 67 20 61 72 6f       sitting aro
14070 75 6e 64 20 74 68 61 74 20 6e 65 65 64 20 74 6f  und that need to
14080 20 62 65 20 63 6c 65 61 72 65 64 20 6d 61 6e 75   be cleared manu
14090 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65  ally..**.** Neve
140a0 72 74 68 65 6c 65 73 73 2c 20 61 20 64 6f 74 6c  rtheless, a dotl
140b0 6f 63 6b 20 69 73 20 61 6e 20 61 70 70 72 6f 70  ock is an approp
140c0 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f  riate locking mo
140d0 64 65 20 66 6f 72 20 75 73 65 20 69 66 20 6e 6f  de for use if no
140e0 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  .** other lockin
140f0 67 20 73 74 72 61 74 65 67 79 20 69 73 20 61 76  g strategy is av
14100 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44  ailable..**.** D
14110 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 77  otfile locking w
14120 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69 6e 67  orks by creating
14130 20 61 20 73 75 62 64 69 72 65 63 74 6f 72 79 20   a subdirectory 
14140 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65  in the same dire
14150 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68 65 20  ctory as.** the 
14160 64 61 74 61 62 61 73 65 20 61 6e 64 20 77 69 74  database and wit
14170 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  h the same name 
14180 62 75 74 20 77 69 74 68 20 61 20 22 2e 6c 6f 63  but with a ".loc
14190 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20 61 64 64  k" extension add
141a0 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69 73 74  ed..** The exist
141b0 65 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b 20 64  ence of a lock d
141c0 69 72 65 63 74 6f 72 79 20 69 6d 70 6c 69 65 73  irectory implies
141d0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
141e0 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72 0a 2a  ck.  All other.*
141f0 2a 20 6c 6f 63 6b 20 74 79 70 65 73 20 28 53 48  * lock types (SH
14200 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20  ARED, RESERVED, 
14210 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d 61 70  PENDING) are map
14220 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55 53 49  ped into EXCLUSI
14230 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  VE..*/../*.** Th
14240 65 20 66 69 6c 65 20 73 75 66 66 69 78 20 61 64  e file suffix ad
14250 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 20  ded to the data 
14260 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 69 6e  base filename in
14270 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65   order to create
14280 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 64 69 72   the.** lock dir
14290 65 63 74 6f 72 79 2e 0a 2a 2f 0a 23 64 65 66 69  ectory..*/.#defi
142a0 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49  ne DOTLOCK_SUFFI
142b0 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a  X ".lock"../*.**
142c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
142d0 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
142e0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
142f0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
14300 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
14310 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
14320 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
14330 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
14340 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
14350 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
14360 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
14370 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
14380 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
14390 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
143a0 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
143b0 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
143c0 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
143d0 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
143e0 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64  king..**.** In d
143f0 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20  otfile locking, 
14400 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20 65 78  either a lock ex
14410 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65 73 20  ists or it does 
14420 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68 69 73  not.  So in this
14430 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f 66  .** variation of
14440 20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f   CheckReservedLo
14450 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74 20 69  ck(), *pResOut i
14460 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66  s set to true if
14470 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20   any lock.** is 
14480 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
14490 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68   and false if th
144a0 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
144b0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
144c0 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65  t dotlockCheckRe
144d0 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
144e0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
144f0 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69   *pResOut) {.  i
14500 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14510 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
14520 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
14530 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
14540 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
14550 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
14560 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
14570 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
14580 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
14590 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
145a0 72 65 73 65 72 76 65 64 20 3d 20 6f 73 41 63 63  reserved = osAcc
145b0 65 73 73 28 28 63 6f 6e 73 74 20 63 68 61 72 2a  ess((const char*
145c0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
145d0 6f 6e 74 65 78 74 2c 20 30 29 3d 3d 30 3b 0a 20  ontext, 0)==0;. 
145e0 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
145f0 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
14600 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70   (dotlock)\n", p
14610 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
14620 65 72 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73  erved));.  *pRes
14630 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
14640 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14650 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
14660 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
14670 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
14680 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
14690 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
146a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
146b0 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
146c0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
146d0 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
146e0 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
146f0 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
14700 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
14710 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
14720 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
14730 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
14740 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
14750 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
14760 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
14770 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
14780 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
14790 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
147a0 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
147b0 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
147c0 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
147d0 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
147e0 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
147f0 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
14800 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
14810 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
14820 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
14830 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
14840 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
14850 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
14860 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
14870 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
14880 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
14890 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
148a0 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
148b0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
148c0 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
148d0 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
148e0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
148f0 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
14900 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
14910 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
14920 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
14930 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
14940 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
14950 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
14960 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
14970 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66  .**.** With dotf
14980 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20  ile locking, we 
14990 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70  really only supp
149a0 6f 72 74 20 73 74 61 74 65 20 28 34 29 3a 20 45  ort state (4): E
149b0 58 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74  XCLUSIVE..** But
149c0 20 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74   we track the ot
149d0 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  her locking leve
149e0 6c 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a  ls internally..*
149f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
14a00 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
14a10 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
14a20 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
14a30 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
14a40 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
14a50 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
14a60 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65   = (char *)pFile
14a70 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
14a80 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
14a90 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49  ITE_OK;...  /* I
14aa0 66 20 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f  f we have any lo
14ab0 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63  ck, then the loc
14ac0 6b 20 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65  k file already e
14ad0 78 69 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68  xists.  All we h
14ae0 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69  ave.  ** to do i
14af0 73 20 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74  s adjust our int
14b00 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20  ernal record of 
14b10 74 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a  the lock level..
14b20 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
14b30 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f  ->eFileLock > NO
14b40 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
14b50 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
14b60 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f  eFileLock;.    /
14b70 2a 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20  * Always update 
14b80 74 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e  the timestamp on
14b90 20 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f   the old file */
14ba0 0a 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49  .#ifdef HAVE_UTI
14bb0 4d 45 0a 20 20 20 20 75 74 69 6d 65 28 7a 4c 6f  ME.    utime(zLo
14bc0 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23  ckFile, NULL);.#
14bd0 65 6c 73 65 0a 20 20 20 20 75 74 69 6d 65 73 28  else.    utimes(
14be0 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29  zLockFile, NULL)
14bf0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
14c00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14c10 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20   }.  .  /* grab 
14c20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
14c30 6b 20 2a 2f 0a 20 20 72 63 20 3d 20 6f 73 4d 6b  k */.  rc = osMk
14c40 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30  dir(zLockFile, 0
14c50 37 37 37 29 3b 0a 20 20 69 66 28 20 72 63 3c 30  777);.  if( rc<0
14c60 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65   ){.    /* faile
14c70 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65  d to open/create
14c80 20 74 68 65 20 6c 6f 63 6b 20 64 69 72 65 63 74   the lock direct
14c90 6f 72 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74  ory */.    int t
14ca0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
14cb0 20 20 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d     if( EEXIST ==
14cc0 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20   tErrno ){.     
14cd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
14ce0 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  Y;.    } else {.
14cf0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14d00 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
14d10 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
14d20 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
14d30 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
14d40 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
14d50 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
14d60 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
14d70 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  no);.      }.   
14d80 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
14d90 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f 2a 20 67  ;.  } .  .  /* g
14da0 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
14db0 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
14dc0 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46  k */.  pFile->eF
14dd0 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
14de0 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ock;.  return rc
14df0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
14e00 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
14e10 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
14e20 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
14e30 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
14e40 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
14e50 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
14e60 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
14e70 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
14e80 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
14e90 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
14ea0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
14eb0 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
14ec0 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
14ed0 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
14ee0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
14ef0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  .**.** When the 
14f00 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65  locking level re
14f10 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64  aches NO_LOCK, d
14f20 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66  elete the lock f
14f30 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
14f40 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b  nt dotlockUnlock
14f50 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
14f60 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
14f70 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
14f80 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
14f90 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a  e*)id;.  char *z
14fa0 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
14fb0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
14fc0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20  gContext;.  int 
14fd0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  rc;..  assert( p
14fe0 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
14ff0 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
15000 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20  d was %d pid=%d 
15010 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  (dotlock)\n", pF
15020 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
15030 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  k,.           pF
15040 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
15050 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20  osGetpid(0)));. 
15060 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
15070 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
15080 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
15090 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
150a0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
150b0 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63  leLock==eFileLoc
150c0 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
150d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
150e0 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64    /* To downgrad
150f0 65 20 74 6f 20 73 68 61 72 65 64 2c 20 73 69 6d  e to shared, sim
15100 70 6c 79 20 75 70 64 61 74 65 20 6f 75 72 20 69  ply update our i
15110 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f  nternal notion o
15120 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20  f the.  ** lock 
15130 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20  state.  No need 
15140 74 6f 20 6d 65 73 73 20 77 69 74 68 20 74 68 65  to mess with the
15150 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20   file on disk.. 
15160 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
15170 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
15180 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
15190 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
151a0 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75  D_LOCK;.    retu
151b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
151c0 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75 6c  }.  .  /* To ful
151d0 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ly unlock the da
151e0 74 61 62 61 73 65 2c 20 64 65 6c 65 74 65 20 74  tabase, delete t
151f0 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a  he lock file */.
15200 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
15210 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a  ock==NO_LOCK );.
15220 20 20 72 63 20 3d 20 6f 73 52 6d 64 69 72 28 7a    rc = osRmdir(z
15230 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66 28  LockFile);.  if(
15240 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 69 6e 74   rc<0 ){.    int
15250 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
15260 0a 20 20 20 20 69 66 28 20 74 45 72 72 6e 6f 3d  .    if( tErrno=
15270 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20  =ENOENT ){.     
15280 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15290 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 20  .    }else{.#if 
152a0 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f  OSLOCKING_CHECK_
152b0 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20  BUSY_IOERR.     
152c0 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
152d0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
152e0 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
152f0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65  OERR_UNLOCK);.#e
15300 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 53  lse.      rc = S
15310 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
15320 43 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  CK;.#endif.     
15330 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
15340 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
15350 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
15360 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c   rc; .  }.  pFil
15370 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
15380 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e  O_LOCK;.  return
15390 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
153a0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
153b0 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  e.  Make sure th
153c0 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  e lock has been 
153d0 72 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20  released before 
153e0 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  closing..*/.stat
153f0 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c  ic int dotlockCl
15400 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
15410 20 2a 69 64 29 20 7b 0a 20 20 75 6e 69 78 46 69   *id) {.  unixFi
15420 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
15430 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73  xFile*)id;.  ass
15440 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
15450 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64  dotlockUnlock(id
15460 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 73 71  , NO_LOCK);.  sq
15470 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
15480 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
15490 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73  );.  return clos
154a0 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d  eUnixFile(id);.}
154b0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
154c0 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
154d0 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d  dot-file lock im
154e0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
154f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15500 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
15510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
15550 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
15560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
155a0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
155b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
155c0 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67  in flock Locking
155d0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
155e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
155f0 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  *.**.** Use the 
15600 66 6c 6f 63 6b 28 29 20 73 79 73 74 65 6d 20 63  flock() system c
15610 61 6c 6c 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c  all to do file l
15620 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c  ocking..**.** fl
15630 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73  ock() locking is
15640 20 6c 69 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c   like dot-file l
15650 6f 63 6b 69 6e 67 20 69 6e 20 74 68 61 74 20 74  ocking in that t
15660 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69  he various.** fi
15670 6e 65 2d 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67  ne-grain locking
15680 20 6c 65 76 65 6c 73 20 73 75 70 70 6f 72 74 65   levels supporte
15690 64 20 62 79 20 53 51 4c 69 74 65 20 61 72 65 20  d by SQLite are 
156a0 63 6f 6c 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a  collapsed into.*
156b0 2a 20 61 20 73 69 6e 67 6c 65 20 65 78 63 6c 75  * a single exclu
156c0 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f  sive lock.  In o
156d0 74 68 65 72 20 77 6f 72 64 73 2c 20 53 48 41 52  ther words, SHAR
156e0 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 61 6e  ED, RESERVED, an
156f0 64 0a 2a 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63  d.** PENDING loc
15700 6b 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ks are the same 
15710 74 68 69 6e 67 20 61 73 20 61 6e 20 45 58 43 4c  thing as an EXCL
15720 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c  USIVE lock.  SQL
15730 69 74 65 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72  ite.** still wor
15740 6b 73 20 77 68 65 6e 20 79 6f 75 20 64 6f 20 74  ks when you do t
15750 68 69 73 2c 20 62 75 74 20 63 6f 6e 63 75 72 72  his, but concurr
15760 65 6e 63 79 20 69 73 20 72 65 64 75 63 65 64 20  ency is reduced 
15770 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20  since.** only a 
15780 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63  single process c
15790 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 74 68  an be reading th
157a0 65 20 64 61 74 61 62 61 73 65 20 61 74 20 61 20  e database at a 
157b0 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74  time..**.** Omit
157c0 20 74 68 69 73 20 73 65 63 74 69 6f 6e 20 69 66   this section if
157d0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
157e0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73 20  OCKING_STYLE is 
157f0 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23 69  turned off.*/.#i
15800 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
15810 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f  LOCKING_STYLE../
15820 2a 0a 2a 2a 20 52 65 74 72 79 20 66 6c 6f 63 6b  *.** Retry flock
15830 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61  () calls that fa
15840 69 6c 20 77 69 74 68 20 45 49 4e 54 52 0a 2a 2f  il with EINTR.*/
15850 0a 23 69 66 64 65 66 20 45 49 4e 54 52 0a 73 74  .#ifdef EINTR.st
15860 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f  atic int robust_
15870 66 6c 6f 63 6b 28 69 6e 74 20 66 64 2c 20 69 6e  flock(int fd, in
15880 74 20 6f 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  t op){.  int rc;
15890 0a 20 20 64 6f 7b 20 72 63 20 3d 20 66 6c 6f 63  .  do{ rc = floc
158a0 6b 28 66 64 2c 6f 70 29 3b 20 7d 77 68 69 6c 65  k(fd,op); }while
158b0 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
158c0 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75  =EINTR );.  retu
158d0 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23  rn rc;.}.#else.#
158e0 20 64 65 66 69 6e 65 20 72 6f 62 75 73 74 5f 66   define robust_f
158f0 6c 6f 63 6b 28 61 2c 62 29 20 66 6c 6f 63 6b 28  lock(a,b) flock(
15900 61 2c 62 29 0a 23 65 6e 64 69 66 0a 20 20 20 20  a,b).#endif.    
15910 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f   ../*.** This ro
15920 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
15930 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
15940 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
15950 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
15960 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
15970 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
15980 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
15990 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
159a0 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
159b0 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
159c0 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
159d0 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
159e0 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
159f0 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
15a00 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
15a10 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
15a20 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
15a30 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
15a40 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
15a50 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
15a60 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
15a70 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
15a80 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
15a90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
15aa0 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
15ab0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
15ac0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
15ad0 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  .  .  SimulateIO
15ae0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
15af0 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
15b00 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
15b10 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
15b20 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43  ile );.  .  /* C
15b30 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
15b40 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
15b50 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
15b60 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
15b70 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
15b80 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
15b90 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
15ba0 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
15bb0 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
15bc0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
15bd0 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  lds it. */.  if(
15be0 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20   !reserved ){.  
15bf0 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20    /* attempt to 
15c00 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a  get the lock */.
15c10 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 72 6f      int lrc = ro
15c20 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
15c30 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c  ->h, LOCK_EX | L
15c40 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66 28  OCK_NB);.    if(
15c50 20 21 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f   !lrc ){.      /
15c60 2a 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20  * got the lock, 
15c70 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20  unlock it */.   
15c80 20 20 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f     lrc = robust_
15c90 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
15ca0 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20  LOCK_UN);.      
15cb0 69 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20 20  if ( lrc ) {.   
15cc0 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
15cd0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
15ce0 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65   /* unlock faile
15cf0 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20  d with an error 
15d00 2a 2f 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47  */.#if OSLOCKING
15d10 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52  _CHECK_BUSY_IOER
15d20 52 0a 20 20 20 20 20 20 20 20 6c 72 63 20 3d 20  R.        lrc = 
15d30 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
15d40 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
15d50 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
15d60 4e 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65 20 0a 20  NLOCK);.#else . 
15d70 20 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51 4c         lrc = SQL
15d80 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
15d90 3b 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  ; .#endif.      
15da0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
15db0 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20  ROR(lrc) ){.    
15dc0 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
15dd0 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
15de0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  no);.          r
15df0 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20  c = lrc;.       
15e00 20 7d 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65   }.        store
15e10 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
15e20 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
15e30 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20    rc = lrc;.    
15e40 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b    }.    } else {
15e50 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e  .      int tErrn
15e60 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
15e70 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
15e80 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20       /* someone 
15e90 65 6c 73 65 20 6d 69 67 68 74 20 68 61 76 65 20  else might have 
15ea0 69 74 20 72 65 73 65 72 76 65 64 20 2a 2f 0a 20  it reserved */. 
15eb0 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74       lrc = sqlit
15ec0 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
15ed0 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
15ee0 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
15ef0 20 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c   .      if( IS_L
15f00 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29  OCK_ERROR(lrc) )
15f10 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c  {.        storeL
15f20 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
15f30 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20  tErrno);.       
15f40 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20   rc = lrc;.     
15f50 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f   }.    }.  }.  O
15f60 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
15f70 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
15f80 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  flock)\n", pFile
15f90 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
15fa0 64 29 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  d));..#ifdef SQL
15fb0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
15fc0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69  _LOCK_ERRORS.  i
15fd0 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f  f( (rc & SQLITE_
15fe0 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45  IOERR) == SQLITE
15ff0 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63  _IOERR ){.    rc
16000 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
16010 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20 20    reserved=1;.  
16020 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
16030 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
16040 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
16050 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
16060 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
16070 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
16080 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
16090 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
160a0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
160b0 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
160c0 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
160d0 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
160e0 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
160f0 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
16100 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
16110 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
16120 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
16130 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
16140 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
16150 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
16160 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
16170 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
16180 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
16190 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
161a0 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
161b0 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
161c0 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
161d0 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
161e0 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
161f0 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
16200 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
16210 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
16220 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
16230 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
16240 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
16250 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
16260 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
16270 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
16280 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
16290 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
162a0 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
162b0 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
162c0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
162d0 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
162e0 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
162f0 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
16300 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
16310 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
16320 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66  XCLUSIVE.**.** f
16330 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c  lock() only real
16340 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55  ly support EXCLU
16350 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20  SIVE locks.  We 
16360 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61  track intermedia
16370 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  te.** lock state
16380 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  s in the sqlite3
16390 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c  _file structure,
163a0 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53   but all locks S
163b0 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76  HARED or.** abov
163c0 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43  e are really EXC
163d0 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64  LUSIVE locks and
163e0 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68   exclude all oth
163f0 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f  er processes fro
16400 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20  m.** access the 
16410 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
16420 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
16430 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
16440 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
16450 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
16460 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
16470 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
16480 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
16490 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69  t flockLock(sqli
164a0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
164b0 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
164c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
164d0 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
164e0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
164f0 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
16500 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  t( pFile );..  /
16510 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20  * if we already 
16520 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20  have a lock, it 
16530 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a  is exclusive.  .
16540 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74    ** Just adjust
16550 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20   level and punt 
16560 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a  on outta here. *
16570 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65  /.  if (pFile->e
16580 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f  FileLock > NO_LO
16590 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
165a0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
165b0 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
165c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
165d0 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61  }.  .  /* grab a
165e0 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
165f0 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f 62   */.  .  if (rob
16600 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
16610 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f  >h, LOCK_EX | LO
16620 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e  CK_NB)) {.    in
16630 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
16640 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20  ;.    /* didn't 
16650 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73  get, must be bus
16660 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  y */.    rc = sq
16670 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
16680 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
16690 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
166a0 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  K);.    if( IS_L
166b0 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
166c0 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
166d0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
166e0 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  rno);.    }.  } 
166f0 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f  else {.    /* go
16700 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
16710 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
16720 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   */.    pFile->e
16730 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
16740 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  Lock;.  }.  OSTR
16750 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
16760 20 25 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e   %s %s (flock)\n
16770 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46  ", pFile->h, azF
16780 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
16790 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  k), .           
167a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
167b0 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
167c0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
167d0 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
167e0 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20  CK_ERRORS.  if( 
167f0 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  (rc & SQLITE_IOE
16800 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
16810 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ERR ){.    rc = 
16820 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
16830 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
16840 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
16850 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
16860 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
16870 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
16880 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
16890 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
168a0 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
168b0 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
168c0 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
168d0 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
168e0 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
168f0 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
16900 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
16910 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
16920 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
16930 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
16940 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
16950 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
16960 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
16970 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e  atic int flockUn
16980 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
16990 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
169a0 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
169b0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
169c0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20  xFile*)id;.  .  
169d0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
169e0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
169f0 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
16a00 64 20 70 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29  d pid=%d (flock)
16a10 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
16a20 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
16a30 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
16a40 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28  eLock, osGetpid(
16a50 30 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0)));.  assert( 
16a60 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
16a70 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
16a80 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
16a90 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
16aa0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
16ab0 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
16ac0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16ad0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68  ;.  }.  .  /* sh
16ae0 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65  ared can just be
16af0 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20   set because we 
16b00 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65  always have an e
16b10 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66  xclusive */.  if
16b20 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
16b30 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  RED_LOCK) {.    
16b40 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16b50 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
16b60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16b70 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
16b80 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f  no, really, unlo
16b90 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72 6f 62  ck. */.  if( rob
16ba0 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
16bb0 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a  >h, LOCK_UN) ){.
16bc0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
16bd0 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
16be0 45 52 52 4f 52 53 0a 20 20 20 20 72 65 74 75 72  ERRORS.    retur
16bf0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
16c00 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
16c10 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
16c20 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 72 65  ERRORS */.    re
16c30 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
16c40 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73  R_UNLOCK;.  }els
16c50 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  e{.    pFile->eF
16c60 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
16c70 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  K;.    return SQ
16c80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
16c90 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
16ca0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
16cb0 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c  t flockClose(sql
16cc0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
16cd0 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
16ce0 20 29 3b 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63   );.  flockUnloc
16cf0 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
16d00 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e    return closeUn
16d10 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23  ixFile(id);.}..#
16d20 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
16d30 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
16d40 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
16d50 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  RK */../********
16d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
16d70 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63  of the flock loc
16d80 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
16d90 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
16da0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
16db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16df0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
16e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e40 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
16e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e60 20 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d   Begin Named Sem
16e70 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a  aphore Locking *
16e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e90 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61  *******.**.** Na
16ea0 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
16eb0 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75  cking is only su
16ec0 70 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f 72  pported on VxWor
16ed0 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68  ks..**.** Semaph
16ee0 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c  ore locking is l
16ef0 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64  ike dot-lock and
16f00 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20 69   flock in that i
16f10 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a  t really only.**
16f20 20 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55 53   supports EXCLUS
16f30 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e  IVE locking.  On
16f40 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63  ly a single proc
16f50 65 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72 20  ess can read or 
16f60 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61 74  write.** the dat
16f70 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 61 20  abase file at a 
16f80 74 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64 75  time.  This redu
16f90 63 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f  ces potential co
16fa0 6e 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a 2a  ncurrency, but.*
16fb0 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63 6b  * makes the lock
16fc0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
16fd0 6d 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f 0a  much easier..*/.
16fe0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a  #if OS_VXWORKS..
16ff0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
17000 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
17010 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
17020 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
17030 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
17040 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
17050 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
17060 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
17070 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
17080 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
17090 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
170a0 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
170b0 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
170c0 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
170d0 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
170e0 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
170f0 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
17100 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
17110 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
17120 61 74 69 63 20 69 6e 74 20 73 65 6d 58 43 68 65  atic int semXChe
17130 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
17140 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
17150 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b   int *pResOut) {
17160 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
17170 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
17180 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
17190 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
171a0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
171b0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
171c0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
171d0 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
171e0 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
171f0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
17200 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  ;..  /* Check if
17210 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
17220 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
17230 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
17240 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
17250 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
17260 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
17270 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  d = 1;.  }.  .  
17280 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
17290 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
172a0 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
172b0 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72   */.  if( !reser
172c0 76 65 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74  ved ){.    sem_t
172d0 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
172e0 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20  pInode->pSem;.. 
172f0 20 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61     if( sem_trywa
17300 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a  it(pSem)==-1 ){.
17310 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
17320 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
17330 69 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74 45  if( EAGAIN != tE
17340 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  rrno ){.        
17350 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
17360 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
17370 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
17380 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
17390 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  DLOCK);.        
173a0 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
173b0 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
173c0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
173d0 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65        /* someone
173e0 20 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f   else has the lo
173f0 63 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20 69  ck when we are i
17400 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20  n NO_LOCK */.   
17410 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
17420 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
17430 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  k < SHARED_LOCK)
17440 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
17450 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65  lse{.      /* we
17460 20 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69   could have it i
17470 66 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a  f we want it */.
17480 20 20 20 20 20 20 73 65 6d 5f 70 6f 73 74 28 70        sem_post(p
17490 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Sem);.    }.  }.
174a0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
174b0 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
174c0 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c  d (sem)\n", pFil
174d0 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
174e0 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75  ed));..  *pResOu
174f0 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
17500 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17510 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
17520 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
17530 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
17540 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
17550 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
17560 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
17570 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
17580 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
17590 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
175a0 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
175b0 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
175c0 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
175d0 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
175e0 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
175f0 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
17600 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
17610 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
17620 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
17630 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
17640 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
17650 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
17660 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
17670 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
17680 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
17690 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
176a0 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
176b0 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
176c0 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
176d0 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
176e0 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
176f0 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
17700 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
17710 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
17720 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
17730 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
17740 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
17750 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
17760 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
17770 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
17780 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
17790 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
177a0 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
177b0 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
177c0 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65  .**.** Semaphore
177d0 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c   locks only real
177e0 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55  ly support EXCLU
177f0 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20  SIVE locks.  We 
17800 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61  track intermedia
17810 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  te.** lock state
17820 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  s in the sqlite3
17830 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c  _file structure,
17840 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53   but all locks S
17850 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76  HARED or.** abov
17860 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43  e are really EXC
17870 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64  LUSIVE locks and
17880 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68   exclude all oth
17890 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f  er processes fro
178a0 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20  m.** access the 
178b0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
178c0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
178d0 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
178e0 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
178f0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
17900 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
17910 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
17920 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
17930 74 20 73 65 6d 58 4c 6f 63 6b 28 73 71 6c 69 74  t semXLock(sqlit
17940 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
17950 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
17960 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
17970 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
17980 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d  .  sem_t *pSem =
17990 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
179a0 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pSem;.  int rc =
179b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
179c0 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20  * if we already 
179d0 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20  have a lock, it 
179e0 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a  is exclusive.  .
179f0 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74    ** Just adjust
17a00 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20   level and punt 
17a10 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a  on outta here. *
17a20 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65  /.  if (pFile->e
17a30 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f  FileLock > NO_LO
17a40 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
17a50 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
17a60 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d  leLock;.    rc =
17a70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
17a80 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63  goto sem_end_loc
17a90 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c  k;.  }.  .  /* l
17aa0 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f  ock semaphore no
17ab0 77 20 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77  w but bail out w
17ac0 68 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b  hen already lock
17ad0 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d  ed. */.  if( sem
17ae0 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d  _trywait(pSem)==
17af0 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  -1 ){.    rc = S
17b00 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
17b10 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63  goto sem_end_loc
17b20 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74  k;.  }..  /* got
17b30 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70   it, set the typ
17b40 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20  e and return ok 
17b50 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  */.  pFile->eFil
17b60 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
17b70 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63  k;.. sem_end_loc
17b80 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  k:.  return rc;.
17b90 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
17ba0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
17bb0 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
17bc0 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
17bd0 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
17be0 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
17bf0 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
17c00 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
17c10 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
17c20 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
17c30 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
17c40 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
17c50 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
17c60 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
17c70 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
17c80 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
17c90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
17ca0 58 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  XUnlock(sqlite3_
17cb0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
17cc0 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
17cd0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
17ce0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
17cf0 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46  sem_t *pSem = pF
17d00 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  ile->pInode->pSe
17d10 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  m;..  assert( pF
17d20 69 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ile );.  assert(
17d30 20 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41   pSem );.  OSTRA
17d40 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
17d50 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
17d60 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65   (sem)\n", pFile
17d70 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
17d80 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
17d90 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47  ->eFileLock, osG
17da0 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20 61 73  etpid(0)));.  as
17db0 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
17dc0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
17dd0 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66    .  /* no-op if
17de0 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69   possible */.  i
17df0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
17e00 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock==eFileLock )
17e10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
17e20 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
17e30 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a   /* shared can j
17e40 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75  ust be set becau
17e50 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76  se we always hav
17e60 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a  e an exclusive *
17e70 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63  /.  if (eFileLoc
17e80 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20  k==SHARED_LOCK) 
17e90 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
17ea0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
17eb0 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ck;.    return S
17ec0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
17ed0 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79  .  /* no, really
17ee0 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66   unlock. */.  if
17ef0 20 28 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d   ( sem_post(pSem
17f00 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e  )==-1 ) {.    in
17f10 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65  t rc, tErrno = e
17f20 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 73  rrno;.    rc = s
17f30 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
17f40 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
17f50 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
17f60 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49  LOCK);.    if( I
17f70 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
17f80 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
17f90 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
17fa0 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20  tErrno);.    }. 
17fb0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20     return rc; . 
17fc0 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c   }.  pFile->eFil
17fd0 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
17fe0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17ff0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43  _OK;.}../*. ** C
18000 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f  lose a file.. */
18010 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58  .static int semX
18020 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
18030 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20  le *id) {.  if( 
18040 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
18050 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
18060 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73  xFile*)id;.    s
18070 65 6d 58 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  emXUnlock(id, NO
18080 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65  _LOCK);.    asse
18090 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20  rt( pFile );.   
180a0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
180b0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e  );.    releaseIn
180c0 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a  odeInfo(pFile);.
180d0 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
180e0 65 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55  ex();.    closeU
180f0 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d  nixFile(id);.  }
18100 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18110 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  _OK;.}..#endif /
18120 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
18130 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61  /*.** Named sema
18140 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73  phore locking is
18150 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
18160 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a  on VxWorks..**.*
18170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
18180 6e 64 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20  nd of the named 
18190 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69  semaphore lock i
181a0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
181b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
181c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
181d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
181e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
181f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
18210 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
18220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18260 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
18270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
18280 69 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a  in AFP Locking *
18290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
182a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
182b0 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74 68  .**.** AFP is th
182c0 65 20 41 70 70 6c 65 20 46 69 6c 69 6e 67 20 50  e Apple Filing P
182d0 72 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73  rotocol.  AFP is
182e0 20 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73   a network files
182f0 79 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f  ystem found.** o
18300 6e 20 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73  n Apple Macintos
18310 68 20 63 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f  h computers - bo
18320 74 68 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a  th OS9 and OSX..
18330 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72 74  **.** Third-part
18340 79 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  y implementation
18350 73 20 6f 66 20 41 46 50 20 61 72 65 20 61 76 61  s of AFP are ava
18360 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 74 68 69  ilable.  But thi
18370 73 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f  s code here.** o
18380 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58  nly works on OSX
18390 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ..*/..#if define
183a0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
183b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
183c0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a  CKING_STYLE./*.*
183d0 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67  * The afpLocking
183e0 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72  Context structur
183f0 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61  e contains all a
18400 66 70 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63  fp lock specific
18410 20 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65   state.*/.typede
18420 66 20 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b  f struct afpLock
18430 69 6e 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f  ingContext afpLo
18440 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74  ckingContext;.st
18450 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43  ruct afpLockingC
18460 6f 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 72  ontext {.  int r
18470 65 73 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74  eserved;.  const
18480 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20   char *dbPath;  
18490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
184a0 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66  me of the open f
184b0 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63  ile */.};..struc
184c0 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50  t ByteRangeLockP
184d0 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  B2.{.  unsigned 
184e0 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74  long long offset
184f0 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73  ;        /* offs
18500 65 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65  et to first byte
18510 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e   to lock */.  un
18520 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
18530 20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20   length;        
18540 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20  /* nbr of bytes 
18550 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73  to lock */.  uns
18560 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
18570 72 65 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f  retRangeStart; /
18580 2a 20 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74  * nbr of 1st byt
18590 65 20 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63  e locked if succ
185a0 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69  essful */.  unsi
185b0 67 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b  gned char unLock
185c0 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  Flag;         /*
185d0 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d   1 = unlock, 0 =
185e0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
185f0 6e 65 64 20 63 68 61 72 20 73 74 61 72 74 45 6e  ned char startEn
18600 64 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  dFlag;       /* 
18610 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20  1=rel to end of 
18620 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73  fork, 0=rel to s
18630 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64  tart */.  int fd
18640 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
18660 69 6c 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f  ile desc to asso
18670 63 20 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68  c this lock with
18680 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20   */.};..#define 
18690 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f  afpfsByteRangeLo
186a0 63 6b 32 46 53 43 54 4c 20 20 20 20 20 20 20 20  ck2FSCTL        
186b0 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73  _IOWR('z', 23, s
186c0 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
186d0 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54  ockPB2)../*.** T
186e0 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79  his is a utility
186f0 20 66 6f 72 20 73 65 74 74 69 6e 67 20 6f 72 20   for setting or 
18700 63 6c 65 61 72 69 6e 67 20 61 20 62 69 74 2d 72  clearing a bit-r
18710 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a  ange lock on an.
18720 2a 2a 20 41 46 50 20 66 69 6c 65 73 79 73 74 65  ** AFP filesyste
18730 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e  m..** .** Return
18740 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
18750 63 63 65 73 73 2c 20 53 51 4c 49 54 45 5f 42 55  ccess, SQLITE_BU
18760 53 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  SY on failure..*
18770 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
18780 53 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74  SetLock(.  const
18790 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20   char *path,    
187a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
187b0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  e of the file to
187c0 20 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e   be locked or un
187d0 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78  locked */.  unix
187e0 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  File *pFile,    
187f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
18800 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
18810 6f 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20  or on path */.  
18820 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
18830 6e 67 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f  ng offset,     /
18840 2a 20 46 69 72 73 74 20 62 79 74 65 20 74 6f 20  * First byte to 
18850 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
18860 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
18870 67 20 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a  g length,     /*
18880 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
18890 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e   to lock */.  in
188a0 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20  t setLockFlag   
188b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
188c0 54 72 75 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b  True to set lock
188d0 2e 20 20 46 61 6c 73 65 20 74 6f 20 63 6c 65 61  .  False to clea
188e0 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73  r lock */.){.  s
188f0 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
18900 6f 63 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e 74  ockPB2 pb;.  int
18910 20 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e   err;.  .  pb.un
18920 4c 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f  LockFlag = setLo
18930 63 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a  ckFlag ? 0 : 1;.
18940 20 20 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61    pb.startEndFla
18950 67 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73  g = 0;.  pb.offs
18960 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70  et = offset;.  p
18970 62 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74  b.length = lengt
18980 68 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46  h; .  pb.fd = pF
18990 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54  ile->h;.  .  OST
189a0 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43  RACE(("AFPSETLOC
189b0 4b 20 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20  K [%s] for %d%s 
189c0 69 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c  in range %llx:%l
189d0 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74  lx\n", .    (set
189e0 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f  LockFlag?"ON":"O
189f0 46 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  FF"), pFile->h, 
18a00 28 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73  (pb.fd==-1?"[tes
18a10 74 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20  tval-1]":""),.  
18a20 20 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68    offset, length
18a30 29 29 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74  ));.  err = fsct
18a40 6c 28 70 61 74 68 2c 20 61 66 70 66 73 42 79 74  l(path, afpfsByt
18a50 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c  eRangeLock2FSCTL
18a60 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20  , &pb, 0);.  if 
18a70 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20  ( err==-1 ) {.  
18a80 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e    int rc;.    in
18a90 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
18aa0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
18ab0 41 46 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65  AFPSETLOCK faile
18ac0 64 20 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73  d to fsctl() '%s
18ad0 27 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  ' %d %s\n",.    
18ae0 20 20 20 20 20 20 20 20 20 70 61 74 68 2c 20 74           path, t
18af0 45 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28  Errno, strerror(
18b00 74 45 72 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65  tErrno)));.#ifde
18b10 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
18b20 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  AFP_LOCK_ERRORS.
18b30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18b40 42 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20  BUSY;.#else.    
18b50 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
18b60 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
18b70 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
18b80 20 20 20 20 20 20 20 20 20 20 20 73 65 74 4c 6f             setLo
18b90 63 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f  ckFlag ? SQLITE_
18ba0 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c  IOERR_LOCK : SQL
18bb0 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
18bc0 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
18bd0 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c  ITE_IGNORE_AFP_L
18be0 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
18bf0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
18c00 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
18c10 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
18c20 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
18c30 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
18c40 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a   rc;.  } else {.
18c50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18c60 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
18c70 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
18c80 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
18c90 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
18ca0 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
18cb0 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
18cc0 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
18cd0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
18ce0 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
18cf0 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
18d00 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
18d10 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
18d20 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
18d30 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
18d40 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
18d50 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
18d60 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
18d70 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
18d80 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
18d90 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
18da0 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65  c int afpCheckRe
18db0 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
18dc0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
18dd0 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
18de0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
18df0 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
18e00 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
18e10 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
18e20 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f  ile*)id;.  afpLo
18e30 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
18e40 6e 74 65 78 74 3b 0a 20 20 0a 20 20 53 69 6d 75  ntext;.  .  Simu
18e50 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
18e60 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
18e70 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
18e80 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
18e90 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 63  rt( pFile );.  c
18ea0 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63  ontext = (afpLoc
18eb0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70  kingContext *) p
18ec0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
18ed0 74 65 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74  text;.  if( cont
18ee0 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b  ext->reserved ){
18ef0 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  .    *pResOut = 
18f00 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
18f10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75  LITE_OK;.  }.  u
18f20 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
18f30 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c   /* Because pFil
18f40 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61  e->pInode is sha
18f50 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
18f60 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43 68  ds */.  .  /* Ch
18f70 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
18f80 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
18f90 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
18fa0 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
18fb0 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
18fc0 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
18fd0 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
18fe0 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
18ff0 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
19000 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
19010 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20  cess holds it.. 
19020 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65    */.  if( !rese
19030 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c  rved ){.    /* l
19040 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56 45 44  ock the RESERVED
19050 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74   byte */.    int
19060 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63   lrc = afpSetLoc
19070 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
19080 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
19090 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20  ED_BYTE, 1,1);  
190a0 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
190b0 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20  OK==lrc ){.     
190c0 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65 65   /* if we succee
190d0 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68  ded in taking th
190e0 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c  e reserved lock,
190f0 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65   unlock it to re
19100 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74  store.      ** t
19110 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  he original stat
19120 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  e */.      lrc =
19130 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
19140 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
19150 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
19160 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20  E, 1, 0);.    } 
19170 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20  else {.      /* 
19180 69 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  if we failed to 
19190 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65  get the lock the
191a0 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d  n someone else m
191b0 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20  ust have it */. 
191c0 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
191d0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
191e0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
191f0 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d  rc) ){.      rc=
19200 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  lrc;.    }.  }. 
19210 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74   .  unixLeaveMut
19220 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
19230 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
19240 64 20 25 64 20 25 64 20 28 61 66 70 29 5c 6e 22  d %d %d (afp)\n"
19250 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
19260 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20 0a 20  reserved));.  . 
19270 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
19280 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
19290 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
192a0 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
192b0 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
192c0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
192d0 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
192e0 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
192f0 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
19300 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
19310 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
19320 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
19330 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
19340 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
19350 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
19360 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
19370 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
19380 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
19390 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
193a0 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
193b0 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
193c0 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
193d0 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
193e0 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
193f0 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
19400 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
19410 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
19420 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
19430 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
19440 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
19450 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
19460 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
19470 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
19480 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
19490 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
194a0 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
194b0 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
194c0 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
194d0 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
194e0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
194f0 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
19500 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
19510 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
19520 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
19530 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
19540 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
19550 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
19560 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
19570 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
19580 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
19590 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
195a0 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
195b0 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
195c0 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c   int afpLock(sql
195d0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
195e0 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
195f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
19600 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
19610 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
19620 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
19630 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
19640 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
19650 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
19660 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20  text *context = 
19670 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
19680 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
19690 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a  kingContext;.  .
196a0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
196b0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
196c0 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73  OCK    %d %s was
196d0 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25   %s(%s,%d) pid=%
196e0 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
196f0 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
19700 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
19710 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f  eLock), azFileLo
19720 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  ck(pFile->eFileL
19730 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ock),.          
19740 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f   azFileLock(pIno
19750 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  de->eFileLock), 
19760 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20  pInode->nShared 
19770 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b  , osGetpid(0)));
19780 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
19790 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  is already a loc
197a0 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f  k of this type o
197b0 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69  r more restricti
197c0 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75  ve on the.  ** u
197d0 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68  nixFile, do noth
197e0 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74  ing. Don't use t
197f0 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a  he afp_end_lock:
19800 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
19810 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74   ** unixEnterMut
19820 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
19830 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
19840 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
19850 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c  FileLock>=eFileL
19860 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ock ){.    OSTRA
19870 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
19880 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68  %s ok (already h
19890 65 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c 20 70  eld) (afp)\n", p
198a0 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
198b0 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65      azFileLock(e
198c0 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20  FileLock)));.   
198d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
198e0 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
198f0 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
19900 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
19910 6f 72 72 65 63 74 0a 20 20 2a 2a 20 20 28 31 29  orrect.  **  (1)
19920 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66   We never move f
19930 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20  rom unlocked to 
19940 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20  anything higher 
19950 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b  than shared lock
19960 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69  ..  **  (2) SQLi
19970 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69  te never explici
19980 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 70  tly requests a p
19990 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  endig lock..  **
199a0 20 20 28 33 29 20 41 20 73 68 61 72 65 64 20 6c    (3) A shared l
199b0 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65  ock is always he
199c0 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 72 76  ld when a reserv
199d0 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  e lock is reques
199e0 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ted..  */.  asse
199f0 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
19a00 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock!=NO_LOCK ||
19a10 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
19a20 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
19a30 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d  ert( eFileLock!=
19a40 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a  PENDING_LOCK );.
19a50 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
19a60 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock!=RESERVED_LO
19a70 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69  CK || pFile->eFi
19a80 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
19a90 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54  OCK );.  .  /* T
19aa0 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65  his mutex is nee
19ab0 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c  ded because pFil
19ac0 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61  e->pInode is sha
19ad0 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
19ae0 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e  ds.  */.  unixEn
19af0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49  terMutex();.  pI
19b00 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
19b10 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73  node;..  /* If s
19b20 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
19b30 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20   this PID has a 
19b40 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65  lock via a diffe
19b50 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20  rent unixFile*. 
19b60 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20   ** handle that 
19b70 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65  precludes the re
19b80 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65  quested lock, re
19b90 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a  turn BUSY..  */.
19ba0 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46    if( (pFile->eF
19bb0 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d  ileLock!=pInode-
19bc0 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20  >eFileLock && . 
19bd0 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65        (pInode->e
19be0 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e  FileLock>=PENDIN
19bf0 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  G_LOCK || eFileL
19c00 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ock>SHARED_LOCK)
19c10 29 0a 20 20 20 20 20 29 7b 0a 20 20 20 20 72 63  ).     ){.    rc
19c20 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
19c30 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
19c40 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20  _lock;.  }.  .  
19c50 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c  /* If a SHARED l
19c60 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
19c70 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61  , and some threa
19c80 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
19c90 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61   already.  ** ha
19ca0 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45  s a SHARED or RE
19cb0 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SERVED lock, the
19cc0 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65  n increment refe
19cd0 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64  rence counts and
19ce0 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
19cf0 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69  ITE_OK..  */.  i
19d00 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
19d10 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20  ARED_LOCK && .  
19d20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c     (pInode->eFil
19d30 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
19d40 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46  CK || pInode->eF
19d50 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ileLock==RESERVE
19d60 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61  D_LOCK) ){.    a
19d70 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
19d80 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
19d90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
19da0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30  le->eFileLock==0
19db0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
19dc0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
19dd0 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 );.    pFile->
19de0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
19df0 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  ED_LOCK;.    pIn
19e00 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a  ode->nShared++;.
19e10 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
19e20 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66  k++;.    goto af
19e30 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  p_end_lock;.  }.
19e40 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44      .  /* A PEND
19e50 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64  ING lock is need
19e60 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72  ed before acquir
19e70 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
19e80 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a  k and before.  *
19e90 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45  * acquiring an E
19ea0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
19eb0 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c  For the SHARED l
19ec0 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47  ock, the PENDING
19ed0 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65   will.  ** be re
19ee0 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  leased..  */.  i
19ef0 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
19f00 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20  ARED_LOCK .     
19f10 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   || (eFileLock==
19f20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
19f30 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
19f40 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29  ck<PENDING_LOCK)
19f50 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61  .  ){.    int fa
19f60 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64  iled;.    failed
19f70 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
19f80 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
19f90 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59  File, PENDING_BY
19fa0 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69  TE, 1, 1);.    i
19fb0 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20  f (failed) {.   
19fc0 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a     rc = failed;.
19fd0 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
19fe0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  nd_lock;.    }. 
19ff0 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f   }.  .  /* If co
1a000 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68  ntrol gets to th
1a010 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61  is point, then a
1a020 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64  ctually go ahead
1a030 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f   and make.  ** o
1a040 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
1a050 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70  calls for the sp
1a060 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20  ecified lock..  
1a070 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
1a080 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
1a090 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63 31 2c  ){.    int lrc1,
1a0a0 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f   lrc2, lrc1Errno
1a0b0 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c   = 0;.    long l
1a0c0 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20  k, mask;.    .  
1a0d0 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
1a0e0 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a  ->nShared==0 );.
1a0f0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
1a100 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30  de->eFileLock==0
1a110 20 29 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20   );.        .   
1a120 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66 28   mask = (sizeof(
1a130 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52 47  long)==8) ? LARG
1a140 45 53 54 5f 49 4e 54 36 34 20 3a 20 30 78 37 66  EST_INT64 : 0x7f
1a150 66 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20 4e  ffffff;.    /* N
1a160 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d  ow get the read-
1a170 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b  lock SHARED_LOCK
1a180 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20   */.    /* note 
1a190 74 68 61 74 20 74 68 65 20 71 75 61 6c 69 74 79  that the quality
1a1a0 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65   of the randomne
1a1b0 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  ss doesn't matte
1a1c0 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20  r that much */. 
1a1d0 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29     lk = random()
1a1e0 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73  ; .    pInode->s
1a1f0 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c 6b 20  haredByte = (lk 
1a200 26 20 6d 61 73 6b 29 25 28 53 48 41 52 45 44 5f  & mask)%(SHARED_
1a210 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c  SIZE - 1);.    l
1a220 72 63 31 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  rc1 = afpSetLock
1a230 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
1a240 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20  , pFile, .      
1a250 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54      SHARED_FIRST
1a260 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42  +pInode->sharedB
1a270 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  yte, 1, 1);.    
1a280 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
1a290 52 28 6c 72 63 31 29 20 29 7b 0a 20 20 20 20 20  R(lrc1) ){.     
1a2a0 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70 46 69   lrc1Errno = pFi
1a2b0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  le->lastErrno;. 
1a2c0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70     }.    /* Drop
1a2d0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50   the temporary P
1a2e0 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20  ENDING lock */. 
1a2f0 20 20 20 6c 72 63 32 20 3d 20 61 66 70 53 65 74     lrc2 = afpSet
1a300 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
1a310 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e  Path, pFile, PEN
1a320 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29  DING_BYTE, 1, 0)
1a330 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 49  ;.    .    if( I
1a340 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
1a350 31 29 20 29 20 7b 0a 20 20 20 20 20 20 73 74 6f  1) ) {.      sto
1a360 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
1a370 65 2c 20 6c 72 63 31 45 72 72 6e 6f 29 3b 0a 20  e, lrc1Errno);. 
1a380 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a       rc = lrc1;.
1a390 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
1a3a0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65  nd_lock;.    } e
1a3b0 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f  lse if( IS_LOCK_
1a3c0 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20  ERROR(lrc2) ){. 
1a3d0 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a       rc = lrc2;.
1a3e0 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
1a3f0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65  nd_lock;.    } e
1a400 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d 20  lse if( lrc1 != 
1a410 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20  SQLITE_OK ) {.  
1a420 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20      rc = lrc1;. 
1a430 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
1a440 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
1a450 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
1a460 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
1a470 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70  nLock++;.      p
1a480 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d  Inode->nShared =
1a490 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
1a4a0 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  e if( eFileLock=
1a4b0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
1a4c0 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  && pInode->nShar
1a4d0 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57  ed>1 ){.    /* W
1a4e0 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72  e are trying for
1a4f0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
1a500 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74  ck but another t
1a510 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20  hread in this.  
1a520 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65     ** same proce
1a530 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64  ss is still hold
1a540 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ing a shared loc
1a550 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  k. */.    rc = S
1a560 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65  QLITE_BUSY;.  }e
1a570 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
1a580 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20  request was for 
1a590 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
1a5a0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49  CLUSIVE lock.  I
1a5b0 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75  t is.    ** assu
1a5c0 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69  med that there i
1a5d0 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72  s a SHARED or gr
1a5e0 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
1a5f0 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c  e file.    ** al
1a600 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
1a610 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30    int failed = 0
1a620 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21  ;.    assert( 0!
1a630 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
1a640 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65 46 69  k );.    if (eFi
1a650 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56  leLock >= RESERV
1a660 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  ED_LOCK && pFile
1a670 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45  ->eFileLock < RE
1a680 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SERVED_LOCK) {. 
1a690 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72         /* Acquir
1a6a0 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  e a RESERVED loc
1a6b0 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69  k */.        fai
1a6c0 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
1a6d0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
1a6e0 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
1a6f0 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20  D_BYTE, 1,1);.  
1a700 20 20 20 20 69 66 28 20 21 66 61 69 6c 65 64 20      if( !failed 
1a710 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65  ){.        conte
1a720 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 31  xt->reserved = 1
1a730 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a740 20 20 20 20 69 66 20 28 21 66 61 69 6c 65 64 20      if (!failed 
1a750 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20  && eFileLock == 
1a760 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20  EXCLUSIVE_LOCK) 
1a770 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69  {.      /* Acqui
1a780 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  re an EXCLUSIVE 
1a790 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
1a7a0 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  .      /* Remove
1a7b0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
1a7c0 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74   before trying t
1a7d0 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c  he range.  we'll
1a7e0 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20 20   need to .      
1a7f0 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20 74  ** reestablish t
1a800 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69  he shared lock i
1a810 66 20 77 65 20 63 61 6e 27 74 20 67 65 74 20 74  f we can't get t
1a820 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20  he  afpUnlock.  
1a830 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1a840 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66 70 53   !(failed = afpS
1a850 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
1a860 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53  dbPath, pFile, S
1a870 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20  HARED_FIRST +.  
1a880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a890 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73         pInode->s
1a8a0 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30 29  haredByte, 1, 0)
1a8b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
1a8c0 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49 54   failed2 = SQLIT
1a8d0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a  E_OK;.        /*
1a8e0 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f   now attemmpt to
1a8f0 20 67 65 74 20 74 68 65 20 65 78 63 6c 75 73 69   get the exclusi
1a900 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f  ve lock range */
1a910 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20  .        failed 
1a920 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
1a930 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
1a940 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ile, SHARED_FIRS
1a950 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  T, .            
1a960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a970 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20     SHARED_SIZE, 
1a980 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
1a990 66 61 69 6c 65 64 20 26 26 20 28 66 61 69 6c 65  failed && (faile
1a9a0 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  d2 = afpSetLock(
1a9b0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
1a9c0 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20   pFile, .       
1a9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9e0 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 70  SHARED_FIRST + p
1a9f0 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
1aa00 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20 20  e, 1, 1)) ){.   
1aa10 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74 20         /* Can't 
1aa20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  reestablish the 
1aa30 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71  shared lock.  Sq
1aa40 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c 2c  lite can't deal,
1aa50 20 74 68 69 73 20 69 73 0a 20 20 20 20 20 20 20   this is.       
1aa60 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61 6c     ** a critical
1aa70 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20 20   I/O error.     
1aa80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1aa90 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64 20    rc = ((failed 
1aaa0 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  & SQLITE_IOERR) 
1aab0 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  == SQLITE_IOERR)
1aac0 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20   ? failed2 : .  
1aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1aae0 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
1aaf0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61            goto a
1ab00 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
1ab10 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65       } .      }e
1ab20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
1ab30 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20  = failed; .     
1ab40 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1ab50 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20   failed ){.     
1ab60 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20   rc = failed;.  
1ab70 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28    }.  }.  .  if(
1ab80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ab90 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
1aba0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
1abb0 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ck;.    pInode->
1abc0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
1abd0 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69  eLock;.  }else i
1abe0 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
1abf0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
1ac00 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
1ac10 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
1ac20 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
1ac30 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
1ac40 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20  DING_LOCK;.  }. 
1ac50 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a   .afp_end_lock:.
1ac60 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
1ac70 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ();.  OSTRACE(("
1ac80 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73  LOCK    %d %s %s
1ac90 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
1aca0 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ->h, azFileLock(
1acb0 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20  eFileLock), .   
1acc0 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
1acd0 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
1ace0 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
1acf0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
1ad00 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
1ad10 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
1ad20 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
1ad30 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
1ad40 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
1ad50 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
1ad60 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
1ad70 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
1ad80 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
1ad90 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
1ada0 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
1adb0 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
1adc0 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
1add0 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
1ade0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
1adf0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
1ae00 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c  nt afpUnlock(sql
1ae10 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1ae20 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
1ae30 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1ae40 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
1ae50 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
1ae60 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
1ae70 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
1ae80 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
1ae90 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
1aea0 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
1aeb0 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
1aec0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
1aed0 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d  int skipShared =
1aee0 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
1aef0 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d  E_TEST.  int h =
1af00 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69   pFile->h;.#endi
1af10 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  f..  assert( pFi
1af20 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
1af30 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
1af40 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69  was %d(%d,%d) pi
1af50 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70  d=%d (afp)\n", p
1af60 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
1af70 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
1af80 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
1af90 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
1afa0 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
1afb0 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
1afc0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  d,.           os
1afd0 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20  Getpid(0)));..  
1afe0 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
1aff0 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
1b000 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
1b010 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c  FileLock<=eFileL
1b020 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
1b030 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1b040 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
1b050 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
1b060 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
1b070 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
1b080 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20  >nShared!=0 );. 
1b090 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
1b0a0 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
1b0b0 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
1b0c0 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
1b0d0 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65  ck==pFile->eFile
1b0e0 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75  Lock );.    Simu
1b0f0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1b100 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  n(1);.    Simula
1b110 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31  teIOError( h=(-1
1b120 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  ) ).    Simulate
1b130 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
1b140 3b 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53 51  ;.    .#ifdef SQ
1b150 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
1b160 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20  * When reducing 
1b170 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74  a lock such that
1b180 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
1b190 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a   can start.    *
1b1a0 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  * reading the da
1b1b0 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69  tabase file agai
1b1c0 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  n, make sure tha
1b1d0 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  t the.    ** tra
1b1e0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1b1f0 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20   was updated if 
1b200 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1b210 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
1b220 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49  file changed.  I
1b230 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1b240 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74  n counter is not
1b250 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a   updated,.    **
1b260 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
1b270 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66  ns to the same f
1b280 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65  ile might not re
1b290 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a  alize that.    *
1b2a0 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63  * the file has c
1b2b0 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65  hanged and hence
1b2c0 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20   might not know 
1b2d0 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20  to flush their. 
1b2e0 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68     ** cache.  Th
1b2f0 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65  e use of a stale
1b300 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20   cache can lead 
1b310 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
1b320 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  uption..    */. 
1b330 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
1b340 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d  ->inNormalWrite=
1b350 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
1b360 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
1b370 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
1b380 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e  | pFile->transCn
1b390 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20  trChng==1 );.   
1b3a0 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
1b3b0 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
1b3c0 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 70  f.    .    if( p
1b3d0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
1b3e0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
1b3f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66  ){.      rc = af
1b400 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
1b410 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
1b420 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53   SHARED_FIRST, S
1b430 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
1b440 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1b450 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c  LITE_OK && (eFil
1b460 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
1b470 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK || pInode->nS
1b480 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20 20 20  hared>1) ){.    
1b490 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65      /* only re-e
1b4a0 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
1b4b0 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65  red lock if nece
1b4c0 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20  ssary */.       
1b4d0 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42   int sharedLockB
1b4e0 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52  yte = SHARED_FIR
1b4f0 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65  ST+pInode->share
1b500 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72  dByte;.        r
1b510 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
1b520 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
1b530 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63  pFile, sharedLoc
1b540 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  kByte, 1, 1);.  
1b550 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
1b560 20 20 20 20 20 73 6b 69 70 53 68 61 72 65 64 20       skipShared 
1b570 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1b580 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
1b590 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c  QLITE_OK && pFil
1b5a0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
1b5b0 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20  NDING_LOCK ){.  
1b5c0 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
1b5d0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
1b5e0 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
1b5f0 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  ING_BYTE, 1, 0);
1b600 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28 20  .    } .    if( 
1b610 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1b620 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
1b630 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
1b640 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73   && context->res
1b650 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20 20 72  erved ){.      r
1b660 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
1b670 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
1b680 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
1b690 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
1b6a0 20 20 20 69 66 28 20 21 72 63 20 29 7b 20 0a 20     if( !rc ){ . 
1b6b0 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e         context->
1b6c0 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20 0a 20  reserved = 0; . 
1b6d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1b6e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b6f0 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b  OK && (eFileLock
1b700 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
1b710 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
1b720 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  >1)){.      pIno
1b730 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
1b740 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
1b750 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
1b760 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46  =SQLITE_OK && eF
1b770 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ileLock==NO_LOCK
1b780 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72   ){..    /* Decr
1b790 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64  ement the shared
1b7a0 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20   lock counter.  
1b7b0 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
1b7c0 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
1b7d0 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68   OS call only wh
1b7e0 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69  en all threads i
1b7f0 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63  n this same proc
1b800 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65  ess have release
1b810 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  d.    ** the loc
1b820 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e  k..    */.    un
1b830 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
1b840 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20   sharedLockByte 
1b850 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70  = SHARED_FIRST+p
1b860 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
1b870 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  e;.    pInode->n
1b880 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66  Shared--;.    if
1b890 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
1b8a0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 69  d==0 ){.      Si
1b8b0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1b8c0 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69  ign(1);.      Si
1b8d0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68  mulateIOError( h
1b8e0 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69  =(-1) ).      Si
1b8f0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1b900 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66  ign(0);.      if
1b910 28 20 21 73 6b 69 70 53 68 61 72 65 64 20 29 7b  ( !skipShared ){
1b920 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66  .        rc = af
1b930 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
1b940 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
1b950 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c   sharedLockByte,
1b960 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   1, 0);.      }.
1b970 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b        if( !rc ){
1b980 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
1b990 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
1b9a0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46  LOCK;.        pF
1b9b0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
1b9c0 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
1b9d0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1b9e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1b9f0 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
1ba00 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73  Lock--;.      as
1ba10 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c  sert( pInode->nL
1ba20 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  ock>=0 );.      
1ba30 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  if( pInode->nLoc
1ba40 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
1ba50 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
1ba60 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pFile);.      }.
1ba70 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75      }.  }.  .  u
1ba80 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
1ba90 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1baa0 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46  E_OK ) pFile->eF
1bab0 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
1bac0 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ock;.  return rc
1bad0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
1bae0 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75   a file & cleanu
1baf0 70 20 41 46 50 20 73 70 65 63 69 66 69 63 20 6c  p AFP specific l
1bb00 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a  ocking context .
1bb10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
1bb20 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  pClose(sqlite3_f
1bb30 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
1bb40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1bb50 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1bb60 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1bb70 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  id;.  assert( id
1bb80 21 3d 30 20 29 3b 0a 20 20 61 66 70 55 6e 6c 6f  !=0 );.  afpUnlo
1bb90 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
1bba0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
1bbb0 78 28 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  x();.  if( pFile
1bbc0 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70 46 69 6c  ->pInode && pFil
1bbd0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  e->pInode->nLock
1bbe0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
1bbf0 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
1bc00 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f  ing locks, do no
1bc10 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65  t actually close
1bc20 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20   the file just. 
1bc30 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73     ** yet becaus
1bc40 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65  e that would cle
1bc50 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20  ar those locks. 
1bc60 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68   Instead, add th
1bc70 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65  e file.    ** de
1bc80 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f  scriptor to pIno
1bc90 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49  de->aPending.  I
1bca0 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  t will be automa
1bcb0 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77  tically closed w
1bcc0 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  hen.    ** the l
1bcd0 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
1bce0 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
1bcf0 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69  setPendingFd(pFi
1bd00 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  le);.  }.  relea
1bd10 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c  seInodeInfo(pFil
1bd20 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
1bd30 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
1bd40 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 72 63 20  gContext);.  rc 
1bd50 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  = closeUnixFile(
1bd60 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  id);.  unixLeave
1bd70 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
1bd80 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  n rc;.}..#endif 
1bd90 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
1bda0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
1bdb0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1bdc0 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  TYLE */./*.** Th
1bdd0 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20  e code above is 
1bde0 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70  the AFP lock imp
1bdf0 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68  lementation.  Th
1be00 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66  e code is specif
1be10 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20  ic.** to MacOSX 
1be20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  and does not wor
1be30 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20  k on other unix 
1be40 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61  platforms.  No a
1be50 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73  lternative.** is
1be60 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20   available.  If 
1be70 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c  you don't compil
1be80 65 20 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65  e for a mac, the
1be90 6e 20 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22  n the "unix-afp"
1bea0 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61  .** VFS is not a
1beb0 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a  vailable..**.***
1bec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bed0 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46  ** End of the AF
1bee0 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  P lock implement
1bef0 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
1bf00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
1bf10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bf20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bf30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bf40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bf50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
1bf60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bf70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bf80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bf90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bfa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
1bfb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bfc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
1bfd0 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  NFS Locking ****
1bfe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23  ************/..#
1c000 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
1c010 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
1c020 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1c030 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65  TYLE./*. ** Lowe
1c040 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
1c050 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
1c060 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
1c070 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
1c080 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62  eLock. ** must b
1c090 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
1c0a0 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
1c0b0 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20  . **. ** If the 
1c0c0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
1c0d0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
1c0e0 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
1c0f0 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20  at or below. ** 
1c100 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
1c110 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
1c120 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
1c130 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  o-op.. */.static
1c140 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73   int nfsUnlock(s
1c150 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1c160 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
1c170 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55  .  return posixU
1c180 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c  nlock(id, eFileL
1c190 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64  ock, 1);.}..#end
1c1a0 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
1c1b0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
1c1c0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1c1d0 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a  G_STYLE */./*.**
1c1e0 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20   The code above 
1c1f0 69 73 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20  is the NFS lock 
1c200 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
1c210 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65   The code is spe
1c220 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f  cific.** to MacO
1c230 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  SX and does not 
1c240 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e  work on other un
1c250 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e  ix platforms.  N
1c260 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a  o alternative.**
1c270 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   is available.  
1c280 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
1c290 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
1c2a0 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d   the NFS lock im
1c2b0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
1c2c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c2d0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
1c2e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c2f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c320 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
1c330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c370 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
1c380 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e  ***** Non-lockin
1c390 67 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d  g sqlite3_file m
1c3a0 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
1c3b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c3c0 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ****.**.** The n
1c3d0 65 78 74 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  ext division con
1c3e0 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61  tains implementa
1c3f0 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65  tions for all me
1c400 74 68 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a  thods of the .**
1c410 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62   sqlite3_file ob
1c420 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20  ject other than 
1c430 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  the locking meth
1c440 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  ods.  The lockin
1c450 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65 72  g.** methods wer
1c460 65 20 64 65 66 69 6e 65 64 20 69 6e 20 64 69 76  e defined in div
1c470 69 73 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e  isions above (on
1c480 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
1c490 20 70 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e   per.** division
1c4a0 29 2e 20 20 54 68 6f 73 65 20 6d 65 74 68 6f 64  ).  Those method
1c4b0 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f  s that are commo
1c4c0 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67  n to all locking
1c4d0 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67 61   modes.** are ga
1c4e0 74 68 65 72 20 74 6f 67 65 74 68 65 72 20 69 6e  ther together in
1c4f0 74 6f 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e  to this division
1c500 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  ..*/../*.** Seek
1c510 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70   to the offset p
1c520 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
1c530 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68  ond argument, th
1c540 65 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20  en read cnt .** 
1c550 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e  bytes into pBuf.
1c560 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1c570 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
1c580 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ally read..**.**
1c590 20 4e 42 3a 20 20 49 66 20 79 6f 75 20 64 65 66   NB:  If you def
1c5a0 69 6e 65 20 55 53 45 5f 50 52 45 41 44 20 6f 72  ine USE_PREAD or
1c5b0 20 55 53 45 5f 50 52 45 41 44 36 34 2c 20 74 68   USE_PREAD64, th
1c5c0 65 6e 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f  en it might also
1c5d0 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79  .** be necessary
1c5e0 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45   to define _XOPE
1c5f0 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62 65 20 35  N_SOURCE to be 5
1c600 30 30 2e 20 20 54 68 69 73 20 76 61 72 69 65 73  00.  This varies
1c610 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73   from.** one sys
1c620 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20  tem to another. 
1c630 20 53 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f   Since SQLite do
1c640 65 73 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53  es not define US
1c650 45 5f 50 52 45 41 44 0a 2a 2a 20 69 6e 20 61 6e  E_PREAD.** in an
1c660 79 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c  y form by defaul
1c670 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61  t, we will not a
1c680 74 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65  ttempt to define
1c690 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a   _XOPEN_SOURCE..
1c6a0 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20 23  ** See tickets #
1c6b0 32 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a  2741 and #2681..
1c6c0 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73  **.** To avoid s
1c6d0 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e  tomping the errn
1c6e0 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69  o value on a fai
1c6f0 6c 65 64 20 72 65 61 64 20 74 68 65 20 6c 61 73  led read the las
1c700 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20  tErrno value.** 
1c710 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65  is set before re
1c720 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
1c730 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65  ic int seekAndRe
1c740 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c  ad(unixFile *id,
1c750 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
1c760 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75  ffset, void *pBu
1c770 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69  f, int cnt){.  i
1c780 6e 74 20 67 6f 74 3b 0a 20 20 69 6e 74 20 70 72  nt got;.  int pr
1c790 69 6f 72 20 3d 20 30 3b 0a 23 69 66 20 28 21 64  ior = 0;.#if (!d
1c7a0 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
1c7b0 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 55 53  ) && !defined(US
1c7c0 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69 36  E_PREAD64)).  i6
1c7d0 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e  4 newOffset;.#en
1c7e0 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41 52  dif.  TIMER_STAR
1c7f0 54 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74  T;.  assert( cnt
1c800 3d 3d 28 63 6e 74 26 30 78 31 66 66 66 66 29 20  ==(cnt&0x1ffff) 
1c810 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d  );.  assert( id-
1c820 3e 68 3e 32 20 29 3b 0a 20 20 64 6f 7b 0a 23 69  >h>2 );.  do{.#i
1c830 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
1c840 45 41 44 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f  EAD).    got = o
1c850 73 50 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42  sPread(id->h, pB
1c860 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
1c870 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
1c880 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20  Error( got = -1 
1c890 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
1c8a0 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20  (USE_PREAD64).  
1c8b0 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 36    got = osPread6
1c8c0 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  4(id->h, pBuf, c
1c8d0 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  nt, offset);.   
1c8e0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1c8f0 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65  ( got = -1 );.#e
1c900 6c 73 65 0a 20 20 20 20 6e 65 77 4f 66 66 73 65  lse.    newOffse
1c910 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c  t = lseek(id->h,
1c920 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45   offset, SEEK_SE
1c930 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  T);.    Simulate
1c940 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73  IOError( newOffs
1c950 65 74 20 3d 20 2d 31 20 29 3b 0a 20 20 20 20 69  et = -1 );.    i
1c960 66 28 20 6e 65 77 4f 66 66 73 65 74 3c 30 20 29  f( newOffset<0 )
1c970 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
1c980 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65  tErrno((unixFile
1c990 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  *)id, errno);.  
1c9a0 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1c9b0 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f     }.    got = o
1c9c0 73 52 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75  sRead(id->h, pBu
1c9d0 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a  f, cnt);.#endif.
1c9e0 20 20 20 20 69 66 28 20 67 6f 74 3d 3d 63 6e 74      if( got==cnt
1c9f0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
1ca00 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 20  ( got<0 ){.     
1ca10 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e 54   if( errno==EINT
1ca20 52 20 29 7b 20 67 6f 74 20 3d 20 31 3b 20 63 6f  R ){ got = 1; co
1ca30 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20 20 20 20  ntinue; }.      
1ca40 70 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  prior = 0;.     
1ca50 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
1ca60 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 20  (unixFile*)id,  
1ca70 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 62 72  errno);.      br
1ca80 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  eak;.    }else i
1ca90 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20  f( got>0 ){.    
1caa0 20 20 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a 20 20    cnt -= got;.  
1cab0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 67 6f      offset += go
1cac0 74 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 20 2b  t;.      prior +
1cad0 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 42 75  = got;.      pBu
1cae0 66 20 3d 20 28 76 6f 69 64 2a 29 28 67 6f 74 20  f = (void*)(got 
1caf0 2b 20 28 63 68 61 72 2a 29 70 42 75 66 29 3b 0a  + (char*)pBuf);.
1cb00 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
1cb10 67 6f 74 3e 30 20 29 3b 0a 20 20 54 49 4d 45 52  got>0 );.  TIMER
1cb20 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28  _END;.  OSTRACE(
1cb30 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25  ("READ    %-3d %
1cb40 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
1cb50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 64  ,.            id
1cb60 2d 3e 68 2c 20 67 6f 74 2b 70 72 69 6f 72 2c 20  ->h, got+prior, 
1cb70 6f 66 66 73 65 74 2d 70 72 69 6f 72 2c 20 54 49  offset-prior, TI
1cb80 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20  MER_ELAPSED));. 
1cb90 20 72 65 74 75 72 6e 20 67 6f 74 2b 70 72 69 6f   return got+prio
1cba0 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  r;.}../*.** Read
1cbb0 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c   data from a fil
1cbc0 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e  e into a buffer.
1cbd0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
1cbe0 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74  OK if all.** byt
1cbf0 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63  es were read suc
1cc00 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51  cessfully and SQ
1cc10 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e  LITE_IOERR if an
1cc20 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
1cc30 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
1cc40 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20  int unixRead(.  
1cc50 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1cc60 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  , .  void *pBuf,
1cc70 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
1cc80 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
1cc90 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c  set.){.  unixFil
1cca0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1ccb0 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74  File *)id;.  int
1ccc0 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20   got;.  assert( 
1ccd0 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  id );.  assert( 
1cce0 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 61  offset>=0 );.  a
1ccf0 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
1cd00 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
1cd10 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
1cd20 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c   (not a journal,
1cd30 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
1cd40 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c  or temp.  ** fil
1cd50 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e  e), the bytes in
1cd60 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
1cd70 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ge should never 
1cd80 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1cd90 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  en. */.#if 0.  a
1cda0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55  ssert( pFile->pU
1cdb0 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  nused==0.       
1cdc0 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49  || offset>=PENDI
1cdd0 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20  NG_BYTE+512.    
1cde0 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74     || offset+amt
1cdf0 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a  <=PENDING_BYTE .
1ce00 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66    );.#endif..#if
1ce10 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
1ce20 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61  _SIZE>0.  /* Dea
1ce30 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f  l with as much o
1ce40 66 20 74 68 69 73 20 72 65 61 64 20 72 65 71 75  f this read requ
1ce50 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20  est as possible 
1ce60 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20  by transfering. 
1ce70 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68   ** data from th
1ce80 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  e memory mapping
1ce90 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e   using memcpy().
1cea0 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65    */.  if( offse
1ceb0 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  t<pFile->mmapSiz
1cec0 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66  e ){.    if( off
1ced0 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65  set+amt <= pFile
1cee0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1cef0 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
1cf00 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d   &((u8 *)(pFile-
1cf10 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66  >pMapRegion))[of
1cf20 66 73 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20  fset], amt);.   
1cf30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1cf40 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
1cf50 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20        int nCopy 
1cf60 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
1cf70 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
1cf80 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26    memcpy(pBuf, &
1cf90 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
1cfa0 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
1cfb0 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20  et], nCopy);.   
1cfc0 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20     pBuf = &((u8 
1cfd0 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a  *)pBuf)[nCopy];.
1cfe0 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f        amt -= nCo
1cff0 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  py;.      offset
1d000 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d   += nCopy;.    }
1d010 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 67  .  }.#endif..  g
1d020 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  ot = seekAndRead
1d030 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20  (pFile, offset, 
1d040 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66  pBuf, amt);.  if
1d050 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20  ( got==amt ){.  
1d060 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d070 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
1d080 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20  got<0 ){.    /* 
1d090 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79  lastErrno set by
1d0a0 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a   seekAndRead */.
1d0b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d0c0 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20  E_IOERR_READ;.  
1d0d0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 6f 72 65  }else{.    store
1d0e0 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
1d0f0 20 30 29 3b 20 20 20 2f 2a 20 6e 6f 74 20 61 20   0);   /* not a 
1d100 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a  system error */.
1d110 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61      /* Unread pa
1d120 72 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65  rts of the buffe
1d130 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66  r must be zero-f
1d140 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d  illed */.    mem
1d150 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75  set(&((char*)pBu
1d160 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d  f)[got], 0, amt-
1d170 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  got);.    return
1d180 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
1d190 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a  ORT_READ;.  }.}.
1d1a0 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
1d1b0 6f 20 73 65 65 6b 20 74 68 65 20 66 69 6c 65 2d  o seek the file-
1d1c0 64 65 73 63 72 69 70 74 6f 72 20 70 61 73 73 65  descriptor passe
1d1d0 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
1d1e0 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20 61 62  rgument to.** ab
1d1f0 73 6f 6c 75 74 65 20 6f 66 66 73 65 74 20 69 4f  solute offset iO
1d200 66 66 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74  ff, then attempt
1d210 20 74 6f 20 77 72 69 74 65 20 6e 42 75 66 20 62   to write nBuf b
1d220 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 72 6f  ytes of data fro
1d230 6d 0a 2a 2a 20 70 42 75 66 20 74 6f 20 69 74 2e  m.** pBuf to it.
1d240 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1d250 75 72 73 2c 20 72 65 74 75 72 6e 20 2d 31 20 61  urs, return -1 a
1d260 6e 64 20 73 65 74 20 2a 70 69 45 72 72 6e 6f 2e  nd set *piErrno.
1d270 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20   Otherwise, .** 
1d280 72 65 74 75 72 6e 20 74 68 65 20 61 63 74 75 61  return the actua
1d290 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
1d2a0 73 20 77 72 69 74 74 65 6e 20 28 77 68 69 63 68  s written (which
1d2b0 20 6d 61 79 20 62 65 20 6c 65 73 73 20 74 68 61   may be less tha
1d2c0 6e 0a 2a 2a 20 6e 42 75 66 29 2e 0a 2a 2f 0a 73  n.** nBuf)..*/.s
1d2d0 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e  tatic int seekAn
1d2e0 64 57 72 69 74 65 46 64 28 0a 20 20 69 6e 74 20  dWriteFd(.  int 
1d2f0 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fd,             
1d300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1d310 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
1d320 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20  o write to */.  
1d330 69 36 34 20 69 4f 66 66 2c 20 20 20 20 20 20 20  i64 iOff,       
1d340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d350 2f 2a 20 46 69 6c 65 20 6f 66 66 73 65 74 20 74  /* File offset t
1d360 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20  o begin writing 
1d370 61 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  at */.  const vo
1d380 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
1d390 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
1d3a0 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 62  data from this b
1d3b0 75 66 66 65 72 20 74 6f 20 74 68 65 20 66 69 6c  uffer to the fil
1d3c0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 75 66 2c  e */.  int nBuf,
1d3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3e0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1d3f0 66 20 62 75 66 66 65 72 20 70 42 75 66 20 69 6e  f buffer pBuf in
1d400 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
1d410 2a 70 69 45 72 72 6e 6f 20 20 20 20 20 20 20 20  *piErrno        
1d420 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1d430 55 54 3a 20 45 72 72 6f 72 20 6e 75 6d 62 65 72  UT: Error number
1d440 20 69 66 20 65 72 72 6f 72 20 6f 63 63 75 72 73   if error occurs
1d450 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
1d460 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1d470 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
1d480 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 79  e returned by sy
1d490 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20  stem call */..  
1d4a0 61 73 73 65 72 74 28 20 6e 42 75 66 3d 3d 28 6e  assert( nBuf==(n
1d4b0 42 75 66 26 30 78 31 66 66 66 66 29 20 29 3b 0a  Buf&0x1ffff) );.
1d4c0 20 20 61 73 73 65 72 74 28 20 66 64 3e 32 20 29    assert( fd>2 )
1d4d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 69 45 72  ;.  assert( piEr
1d4e0 72 6e 6f 21 3d 30 20 29 3b 0a 20 20 6e 42 75 66  rno!=0 );.  nBuf
1d4f0 20 26 3d 20 30 78 31 66 66 66 66 3b 0a 20 20 54   &= 0x1ffff;.  T
1d500 49 4d 45 52 5f 53 54 41 52 54 3b 0a 0a 23 69 66  IMER_START;..#if
1d510 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
1d520 41 44 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20 28  AD).  do{ rc = (
1d530 69 6e 74 29 6f 73 50 77 72 69 74 65 28 66 64 2c  int)osPwrite(fd,
1d540 20 70 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66   pBuf, nBuf, iOf
1d550 66 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30  f); }while( rc<0
1d560 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
1d570 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65   );.#elif define
1d580 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
1d590 20 64 6f 7b 20 72 63 20 3d 20 28 69 6e 74 29 6f   do{ rc = (int)o
1d5a0 73 50 77 72 69 74 65 36 34 28 66 64 2c 20 70 42  sPwrite64(fd, pB
1d5b0 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b  uf, nBuf, iOff);
1d5c0 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
1d5d0 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23  errno==EINTR);.#
1d5e0 65 6c 73 65 0a 20 20 64 6f 7b 0a 20 20 20 20 69  else.  do{.    i
1d5f0 36 34 20 69 53 65 65 6b 20 3d 20 6c 73 65 65 6b  64 iSeek = lseek
1d600 28 66 64 2c 20 69 4f 66 66 2c 20 53 45 45 4b 5f  (fd, iOff, SEEK_
1d610 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  SET);.    Simula
1d620 74 65 49 4f 45 72 72 6f 72 28 20 69 53 65 65 6b  teIOError( iSeek
1d630 20 3d 20 2d 31 20 29 3b 0a 20 20 20 20 69 66 28   = -1 );.    if(
1d640 20 69 53 65 65 6b 3c 30 20 29 7b 0a 20 20 20 20   iSeek<0 ){.    
1d650 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1d660 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1d670 20 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66    rc = osWrite(f
1d680 64 2c 20 70 42 75 66 2c 20 6e 42 75 66 29 3b 0a  d, pBuf, nBuf);.
1d690 20 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26    }while( rc<0 &
1d6a0 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
1d6b0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 54 49 4d 45  ;.#endif..  TIME
1d6c0 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45  R_END;.  OSTRACE
1d6d0 28 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20  (("WRITE   %-3d 
1d6e0 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e  %5d %7lld %llu\n
1d6f0 22 2c 20 66 64 2c 20 72 63 2c 20 69 4f 66 66 2c  ", fd, rc, iOff,
1d700 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29   TIMER_ELAPSED))
1d710 3b 0a 0a 20 20 69 66 28 20 72 63 3c 30 20 29 20  ;..  if( rc<0 ) 
1d720 2a 70 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  *piErrno = errno
1d730 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1d740 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f  .../*.** Seek to
1d750 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69   the offset in i
1d760 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72  d->offset then r
1d770 65 61 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e  ead cnt bytes in
1d780 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75  to pBuf..** Retu
1d790 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1d7a0 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
1d7b0 72 65 61 64 2e 20 20 55 70 64 61 74 65 20 74 68  read.  Update th
1d7c0 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  e offset..**.** 
1d7d0 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e  To avoid stompin
1d7e0 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75  g the errno valu
1d7f0 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 77 72  e on a failed wr
1d800 69 74 65 20 74 68 65 20 6c 61 73 74 45 72 72 6e  ite the lastErrn
1d810 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  o value.** is se
1d820 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  t before returni
1d830 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
1d840 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75  t seekAndWrite(u
1d850 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69 36 34  nixFile *id, i64
1d860 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74 20 76   offset, const v
1d870 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63  oid *pBuf, int c
1d880 6e 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 65  nt){.  return se
1d890 65 6b 41 6e 64 57 72 69 74 65 46 64 28 69 64 2d  ekAndWriteFd(id-
1d8a0 3e 68 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66  >h, offset, pBuf
1d8b0 2c 20 63 6e 74 2c 20 26 69 64 2d 3e 6c 61 73 74  , cnt, &id->last
1d8c0 45 72 72 6e 6f 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Errno);.}.../*.*
1d8d0 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f  * Write data fro
1d8e0 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20  m a buffer into 
1d8f0 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20  a file.  Return 
1d900 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
1d910 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  cess.** or some 
1d920 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
1d930 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   on failure..*/.
1d940 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 57  static int unixW
1d950 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  rite(.  sqlite3_
1d960 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e  file *id, .  con
1d970 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a  st void *pBuf, .
1d980 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c    int amt,.  sql
1d990 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
1d9a0 74 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  t .){.  unixFile
1d9b0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
1d9c0 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 77  ile*)id;.  int w
1d9d0 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65  rote = 0;.  asse
1d9e0 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65  rt( id );.  asse
1d9f0 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20  rt( amt>0 );..  
1da00 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
1da10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
1da20 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61  ot a journal, ma
1da30 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20  ster-journal or 
1da40 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c  temp.  ** file),
1da50 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
1da60 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20  e locking range 
1da70 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20  should never be 
1da80 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
1da90 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65   */.#if 0.  asse
1daa0 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73  rt( pFile->pUnus
1dab0 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ed==0.       || 
1dac0 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f  offset>=PENDING_
1dad0 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20  BYTE+512.       
1dae0 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50  || offset+amt<=P
1daf0 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29  ENDING_BYTE .  )
1db00 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
1db10 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1db20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  /* If we are doi
1db30 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74  ng a normal writ
1db40 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  e to a database 
1db50 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64  file (as opposed
1db60 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61   to.  ** doing a
1db70 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
1db80 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65  lback or a write
1db90 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74   to some file ot
1dba0 68 65 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20  her than a.  ** 
1dbb0 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20  normal database 
1dbc0 66 69 6c 65 29 20 74 68 65 6e 20 72 65 63 6f 72  file) then recor
1dbd0 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
1dbe0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
1dbf0 2a 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20  * has changed.  
1dc00 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
1dc10 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f  on counter is mo
1dc20 64 69 66 69 65 64 2c 20 72 65 63 6f 72 64 20 74  dified, record t
1dc30 68 61 74 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f  hat.  ** fact to
1dc40 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  o..  */.  if( pF
1dc50 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
1dc60 74 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  te ){.    pFile-
1dc70 3e 64 62 55 70 64 61 74 65 20 3d 20 31 3b 20 20  >dbUpdate = 1;  
1dc80 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1dc90 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
1dca0 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 66  d */.    if( off
1dcb0 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66 73 65  set<=24 && offse
1dcc0 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20  t+amt>=27 ){.   
1dcd0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
1dce0 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d   char oldCntr[4]
1dcf0 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
1dd00 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
1dd10 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 65  ;.      rc = see
1dd20 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20  kAndRead(pFile, 
1dd30 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b  24, oldCntr, 4);
1dd40 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
1dd50 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
1dd60 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 34  .      if( rc!=4
1dd70 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e   || memcmp(oldCn
1dd80 74 72 2c 20 26 28 28 63 68 61 72 2a 29 70 42 75  tr, &((char*)pBu
1dd90 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34  f)[24-offset], 4
1dda0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1ddb0 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
1ddc0 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68  Chng = 1;  /* Th
1ddd0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
1dde0 75 6e 74 65 72 20 68 61 73 20 63 68 61 6e 67 65  unter has change
1ddf0 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  d */.      }.   
1de00 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23   }.  }.#endif..#
1de10 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1de20 45 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45  E_MMAP_READWRITE
1de30 29 20 26 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) && SQLITE_MAX_
1de40 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a  MMAP_SIZE>0.  /*
1de50 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75   Deal with as mu
1de60 63 68 20 6f 66 20 74 68 69 73 20 77 72 69 74 65  ch of this write
1de70 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73   request as poss
1de80 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72  ible by transfer
1de90 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72  ing.  ** data fr
1dea0 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61  om the memory ma
1deb0 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63  pping using memc
1dec0 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20  py().  */.  if( 
1ded0 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d  offset<pFile->mm
1dee0 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66  apSize ){.    if
1def0 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20  ( offset+amt <= 
1df00 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1df10 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
1df20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
1df30 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
1df40 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29  set], pBuf, amt)
1df50 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1df60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1df70 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
1df80 43 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d  Copy = pFile->mm
1df90 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  apSize - offset;
1dfa0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28  .      memcpy(&(
1dfb0 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
1dfc0 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
1dfd0 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29  t], pBuf, nCopy)
1dfe0 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26  ;.      pBuf = &
1dff0 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f  ((u8 *)pBuf)[nCo
1e000 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d  py];.      amt -
1e010 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f  = nCopy;.      o
1e020 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a  ffset += nCopy;.
1e030 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1e040 0a 20 0a 20 20 77 68 69 6c 65 28 20 28 77 72 6f  . .  while( (wro
1e050 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74  te = seekAndWrit
1e060 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c  e(pFile, offset,
1e070 20 70 42 75 66 2c 20 61 6d 74 29 29 3c 61 6d 74   pBuf, amt))<amt
1e080 20 26 26 20 77 72 6f 74 65 3e 30 20 29 7b 0a 20   && wrote>0 ){. 
1e090 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b     amt -= wrote;
1e0a0 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77  .    offset += w
1e0b0 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d  rote;.    pBuf =
1e0c0 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b   &((char*)pBuf)[
1e0d0 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69  wrote];.  }.  Si
1e0e0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20  mulateIOError(( 
1e0f0 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d  wrote=(-1), amt=
1e100 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  1 ));.  Simulate
1e110 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20  DiskfullError(( 
1e120 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29  wrote=0, amt=1 )
1e130 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e 77 72  );..  if( amt>wr
1e140 6f 74 65 20 29 7b 0a 20 20 20 20 69 66 28 20 77  ote ){.    if( w
1e150 72 6f 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d  rote<0 && pFile-
1e160 3e 6c 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53  >lastErrno!=ENOS
1e170 50 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c  PC ){.      /* l
1e180 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20  astErrno set by 
1e190 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a  seekAndWrite */.
1e1a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e1b0 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
1e1c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e1d0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
1e1e0 28 70 46 69 6c 65 2c 20 30 29 3b 20 2f 2a 20 6e  (pFile, 0); /* n
1e1f0 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f  ot a system erro
1e200 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  r */.      retur
1e210 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
1e220 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
1e230 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1e240 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1e250 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  EST./*.** Count 
1e260 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75  the number of fu
1e270 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d  llsyncs and norm
1e280 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20  al syncs.  This 
1e290 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a  is used to test.
1e2a0 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e  ** that syncs an
1e2b0 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20  d fullsyncs are 
1e2c0 6f 63 63 75 72 72 69 6e 67 20 61 74 20 74 68 65  occurring at the
1e2d0 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f   right times..*/
1e2e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e  .int sqlite3_syn
1e2f0 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74  c_count = 0;.int
1e300 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
1e310 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  c_count = 0;.#en
1e320 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f  dif../*.** We do
1e330 20 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74 65   not trust syste
1e340 6d 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20  ms to provide a 
1e350 77 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79 6e  working fdatasyn
1e360 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a  c().  Some do..*
1e370 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20  * Others do no. 
1e380 20 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65 20   To be safe, we 
1e390 77 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68 20  will stick with 
1e3a0 74 68 65 20 28 73 6c 69 67 68 74 6c 79 20 73 6c  the (slightly sl
1e3b0 6f 77 65 72 29 0a 2a 2a 20 66 73 79 6e 63 28 29  ower).** fsync()
1e3c0 2e 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68  . If you know th
1e3d0 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64  at your system d
1e3e0 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74  oes support fdat
1e3f0 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c  async() correctl
1e400 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c  y,.** then simpl
1e410 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d  y compile with -
1e420 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61  Dfdatasync=fdata
1e430 73 79 6e 63 20 6f 72 20 2d 44 48 41 56 45 5f 46  sync or -DHAVE_F
1e440 44 41 54 41 53 59 4e 43 0a 2a 2f 0a 23 69 66 20  DATASYNC.*/.#if 
1e450 21 64 65 66 69 6e 65 64 28 66 64 61 74 61 73 79  !defined(fdatasy
1e460 6e 63 29 20 26 26 20 21 48 41 56 45 5f 46 44 41  nc) && !HAVE_FDA
1e470 54 41 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  TASYNC.# define 
1e480 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a  fdatasync fsync.
1e490 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
1e4a0 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
1e4b0 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65  YNC to 0 or 1 de
1e4c0 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
1e4d0 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65  er or not.** the
1e4e0 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63   F_FULLFSYNC mac
1e4f0 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20  ro is defined.  
1e500 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63  F_FULLFSYNC is c
1e510 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79  urrently.** only
1e520 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61   available on Ma
1e530 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61  c OS X.  But tha
1e540 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a  t could change..
1e550 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c  */.#ifdef F_FULL
1e560 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48  FSYNC.# define H
1e570 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a  AVE_FULLFSYNC 1.
1e580 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48  #else.# define H
1e590 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a  AVE_FULLFSYNC 0.
1e5a0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1e5b0 51 4c 49 54 45 5f 55 53 45 5f 52 45 51 55 45 53  QLITE_USE_REQUES
1e5c0 54 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 69 6d 70  T_FULLFSYNC.#imp
1e5d0 6f 72 74 20 3c 6e 6f 74 69 66 79 2e 68 3e 0a 23  ort <notify.h>.#
1e5e0 69 6d 70 6f 72 74 20 3c 6c 69 62 6b 65 72 6e 2f  import <libkern/
1e5f0 4f 53 41 74 6f 6d 69 63 2e 68 3e 0a 73 74 61 74  OSAtomic.h>.stat
1e600 69 63 20 4f 53 53 70 69 6e 4c 6f 63 6b 20 6e 6f  ic OSSpinLock no
1e610 74 69 66 79 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 23  tify_lock = 0;.#
1e620 64 65 66 69 6e 65 20 52 45 51 55 45 53 54 5f 46  define REQUEST_F
1e630 55 4c 4c 53 59 4e 43 5f 4e 4f 54 49 46 49 43 41  ULLSYNC_NOTIFICA
1e640 54 49 4f 4e 20 20 20 20 22 63 6f 6d 2e 61 70 70  TION    "com.app
1e650 6c 65 2e 72 65 71 73 79 6e 63 22 0a 23 65 6e 64  le.reqsync".#end
1e660 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73  if../*.** The fs
1e670 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ync() system cal
1e680 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  l does not work 
1e690 61 73 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e  as advertised on
1e6a0 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79   many.** unix sy
1e6b0 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c  stems.  The foll
1e6c0 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20  owing procedure 
1e6d0 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
1e6e0 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b   make.** it work
1e6f0 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   better..**.** T
1e700 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
1e710 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73  C macro disables
1e720 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20   all fsync()s.  
1e730 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a  This is useful.*
1e740 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68  * for testing wh
1e750 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75  en we want to ru
1e760 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 65  n through the te
1e770 73 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79  st suite quickly
1e780 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72  ..** You are str
1e790 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e  ongly advised *n
1e7a0 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69  ot* to deploy wi
1e7b0 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  th SQLITE_NO_SYN
1e7c0 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f  C.** enabled, ho
1e7d0 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74  wever, since wit
1e7e0 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  h SQLITE_NO_SYNC
1e7f0 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20   enabled, an OS 
1e800 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65  crash.** or powe
1e810 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c  r failure will l
1e820 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68  ikely corrupt th
1e830 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1e840 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65  .**.** SQLite se
1e850 74 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20  ts the dataOnly 
1e860 66 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a 65  flag if the size
1e870 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
1e880 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68  unchanged..** Th
1e890 65 20 69 64 65 61 20 62 65 68 69 6e 64 20 64 61  e idea behind da
1e8a0 74 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69  taOnly is that i
1e8b0 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72  t should only wr
1e8c0 69 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e  ite the file con
1e8d0 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c  tent.** to disk,
1e8e0 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20   not the inode. 
1e8f0 20 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74   We only set dat
1e900 61 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c  aOnly if the fil
1e910 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e  e size is .** un
1e920 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68  changed since th
1e930 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70  e file size is p
1e940 61 72 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65  art of the inode
1e950 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20  .  However, .** 
1e960 54 65 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75  Ted Ts'o tells u
1e970 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63  s that fdatasync
1e980 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69  () will also wri
1e990 74 65 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20  te the inode if 
1e9a0 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65  the.** file size
1e9b0 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54   has changed.  T
1e9c0 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66  he only real dif
1e9d0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
1e9e0 66 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61  fdatasync().** a
1e9f0 6e 64 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20  nd fsync(), Ted 
1ea00 74 65 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61  tells us, is tha
1ea10 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69  t fdatasync() wi
1ea20 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65  ll not flush the
1ea30 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65  .** inode if the
1ea40 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20   mtime or owner 
1ea50 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61  or other inode a
1ea60 74 74 72 69 62 75 74 65 73 20 68 61 76 65 20 63  ttributes have c
1ea70 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e  hanged..** We on
1ea80 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ly care about th
1ea90 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74  e file size, not
1eaa0 20 74 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20   the other file 
1eab0 61 74 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a  attributes, so.*
1eac0 2a 20 61 73 20 66 61 72 20 61 73 20 53 51 4c 69  * as far as SQLi
1ead0 74 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c  te is concerned,
1eae0 20 61 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20   an fdatasync() 
1eaf0 69 73 20 61 6c 77 61 79 73 20 61 64 65 71 75 61  is always adequa
1eb00 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c  te..** So, we al
1eb10 77 61 79 73 20 75 73 65 20 66 64 61 74 61 73 79  ways use fdatasy
1eb20 6e 63 28 29 20 69 66 20 69 74 20 69 73 20 61 76  nc() if it is av
1eb30 61 69 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c  ailable, regardl
1eb40 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61  ess of.** the va
1eb50 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f  lue of the dataO
1eb60 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61  nly flag..*/.sta
1eb70 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79  tic int full_fsy
1eb80 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66  nc(int fd, int f
1eb90 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74  ullSync, int dat
1eba0 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63  aOnly){.  int rc
1ebb0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
1ebc0 6f 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69  owing "ifdef/eli
1ebd0 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68  f/else/" block h
1ebe0 61 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 75  as the same stru
1ebf0 63 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68  cture as.  ** th
1ec00 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20  e one below. It 
1ec10 69 73 20 72 65 70 6c 69 63 61 74 65 64 20 68 65  is replicated he
1ec20 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f  re solely to avo
1ec30 69 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20  id cluttering . 
1ec40 20 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20   ** up the real 
1ec50 63 6f 64 65 20 77 69 74 68 20 74 68 65 20 55 4e  code with the UN
1ec60 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29  USED_PARAMETER()
1ec70 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69   macros..  */.#i
1ec80 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
1ec90 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  YNC.  UNUSED_PAR
1eca0 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e  AMETER(fd);.  UN
1ecb0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
1ecc0 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53  ullSync);.  UNUS
1ecd0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
1ece0 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41  aOnly);.#elif HA
1ecf0 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55  VE_FULLFSYNC.  U
1ed00 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1ed10 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65  dataOnly);.#else
1ed20 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1ed30 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  TER(fullSync);. 
1ed40 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1ed50 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e  R(dataOnly);.#en
1ed60 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64  dif..  /* Record
1ed70 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
1ed80 69 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20  imes that we do 
1ed90 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29  a normal fsync()
1eda0 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53   and .  ** FULLS
1edb0 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73  YNC.  This is us
1edc0 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ed during testin
1edd0 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  g to verify that
1ede0 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a   this procedure.
1edf0 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64    ** gets called
1ee00 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
1ee10 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a  t arguments..  *
1ee20 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1ee30 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53  TEST.  if( fullS
1ee40 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75  ync ) sqlite3_fu
1ee50 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  llsync_count++;.
1ee60 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63    sqlite3_sync_c
1ee70 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ount++;.#endif..
1ee80 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69    /* If we compi
1ee90 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c  led with the SQL
1eea0 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67  ITE_NO_SYNC flag
1eeb0 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69  , then syncing i
1eec0 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 2e 20  s a.  ** no-op. 
1eed0 20 42 75 74 20 67 6f 20 61 68 65 61 64 20 61 6e   But go ahead an
1eee0 64 20 63 61 6c 6c 20 66 73 74 61 74 28 29 20 74  d call fstat() t
1eef0 6f 20 76 61 6c 69 64 61 74 65 20 74 68 65 20 66  o validate the f
1ef00 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70  ile.  ** descrip
1ef10 74 6f 72 20 61 73 20 77 65 20 6e 65 65 64 20 61  tor as we need a
1ef20 20 6d 65 74 68 6f 64 20 74 6f 20 70 72 6f 76 6f   method to provo
1ef30 6b 65 20 61 20 66 61 69 6c 75 72 65 20 64 75 72  ke a failure dur
1ef40 69 6e 67 0a 20 20 2a 2a 20 63 6f 76 65 72 61 74  ing.  ** coverat
1ef50 65 20 74 65 73 74 69 6e 67 2e 0a 20 20 2a 2f 0a  e testing..  */.
1ef60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  #ifdef SQLITE_NO
1ef70 5f 53 59 4e 43 0a 20 20 7b 0a 20 20 20 20 73 74  _SYNC.  {.    st
1ef80 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
1ef90 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28     rc = osFstat(
1efa0 66 64 2c 20 26 62 75 66 29 3b 0a 20 20 7d 0a 23  fd, &buf);.  }.#
1efb0 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53  elif HAVE_FULLFS
1efc0 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  YNC.  if( fullSy
1efd0 6e 63 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  nc ){.#ifdef SQL
1efe0 49 54 45 5f 55 53 45 5f 52 45 51 55 45 53 54 5f  ITE_USE_REQUEST_
1eff0 46 55 4c 4c 46 53 59 4e 43 0a 20 20 20 20 72 63  FULLFSYNC.    rc
1f000 20 3d 20 6f 73 46 73 79 6e 63 28 66 64 29 3b 0a   = osFsync(fd);.
1f010 20 20 20 20 69 66 20 28 21 72 63 29 20 7b 0a 20      if (!rc) {. 
1f020 20 20 20 20 20 4f 53 53 70 69 6e 4c 6f 63 6b 4c       OSSpinLockL
1f030 6f 63 6b 28 26 6e 6f 74 69 66 79 5f 6c 6f 63 6b  ock(&notify_lock
1f040 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 6f  );.      rc = no
1f050 74 69 66 79 5f 70 6f 73 74 28 52 45 51 55 45 53  tify_post(REQUES
1f060 54 5f 46 55 4c 4c 53 59 4e 43 5f 4e 4f 54 49 46  T_FULLSYNC_NOTIF
1f070 49 43 41 54 49 4f 4e 29 3b 0a 20 20 20 20 20 20  ICATION);.      
1f080 4f 53 53 70 69 6e 4c 6f 63 6b 55 6e 6c 6f 63 6b  OSSpinLockUnlock
1f090 28 26 6e 6f 74 69 66 79 5f 6c 6f 63 6b 29 3b 0a  (&notify_lock);.
1f0a0 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
1f0b0 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c  rc = osFcntl(fd,
1f0c0 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29   F_FULLFSYNC, 0)
1f0d0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
1f0e0 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  {.    rc = 1;.  
1f0f0 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55  }.  /* If the FU
1f100 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20  LLFSYNC failed, 
1f110 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74  fall back to att
1f120 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63  empting an fsync
1f130 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75  ()..  ** It shou
1f140 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c  ldn't be possibl
1f150 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20  e for fullfsync 
1f160 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c  to fail on the l
1f170 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  ocal .  ** file 
1f180 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c  system (on OSX),
1f190 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69   so failure indi
1f1a0 63 61 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46  cates that FULLF
1f1b0 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20  SYNC.  ** isn't 
1f1c0 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68  supported for th
1f1d0 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20  is file system. 
1f1e0 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66  So, attempt an f
1f1f0 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28  sync .  ** and (
1f200 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20  for now) ignore 
1f210 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20  the overhead of 
1f220 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63  a superfluous fc
1f230 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a  ntl call.  .  **
1f240 20 49 74 27 64 20 62 65 20 62 65 74 74 65 72 20   It'd be better 
1f250 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73  to detect fullfs
1f260 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65  ync support once
1f270 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a   and avoid .  **
1f280 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20   the fcntl call 
1f290 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20  every time sync 
1f2a0 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a  is called..  */.
1f2b0 20 20 69 66 28 20 72 63 20 29 20 72 63 20 3d 20    if( rc ) rc = 
1f2c0 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69  fsync(fd);..#eli
1f2d0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1f2e0 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61 73  E__).  /* fdatas
1f2f0 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f  ync() on HFS+ do
1f300 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20  esn't yet flush 
1f310 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66  the file size if
1f320 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72   it changed corr
1f330 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75  ectly.  ** so cu
1f340 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75  rrently we defau
1f350 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20  lt to the macro 
1f360 74 68 61 74 20 72 65 64 65 66 69 6e 65 73 20 66  that redefines f
1f370 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e  datasync to fsyn
1f380 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73  c.  */.  rc = fs
1f390 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a  ync(fd);.#else .
1f3a0 20 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63    rc = fdatasync
1f3b0 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57  (fd);.#if OS_VXW
1f3c0 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d  ORKS.  if( rc==-
1f3d0 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54  1 && errno==ENOT
1f3e0 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  SUP ){.    rc = 
1f3f0 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23  fsync(fd);.  }.#
1f400 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
1f410 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  RKS */.#endif /*
1f420 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f   ifdef SQLITE_NO
1f430 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f  _SYNC elif HAVE_
1f440 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20  FULLFSYNC */..  
1f450 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26  if( OS_VXWORKS &
1f460 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20  & rc!= -1 ){.   
1f470 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72   rc = 0;.  }.  r
1f480 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1f490 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64  ** Open a file d
1f4a0 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
1f4b0 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
1f4c0 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65  ining file zFile
1f4d0 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63  name..** If succ
1f4e0 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20  essful, *pFd is 
1f4f0 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65  set to the opene
1f500 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
1f510 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  r and.** SQLITE_
1f520 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
1f530 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1f540 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54  rs, either SQLIT
1f550 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51  E_NOMEM.** or SQ
1f560 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73  LITE_CANTOPEN is
1f570 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1f580 46 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  Fd is set to an 
1f590 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c  undefined.** val
1f5a0 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  ue..**.** The di
1f5b0 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73  rectory file des
1f5c0 63 72 69 70 74 6f 72 20 69 73 20 75 73 65 64 20  criptor is used 
1f5d0 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20 74 68 69  for only one thi
1f5e0 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e 63  ng - to.** fsync
1f5f0 28 29 20 61 20 64 69 72 65 63 74 6f 72 79 20 74  () a directory t
1f600 6f 20 6d 61 6b 65 20 73 75 72 65 20 66 69 6c 65  o make sure file
1f610 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 64 65   creation and de
1f620 6c 65 74 69 6f 6e 20 65 76 65 6e 74 73 0a 2a 2a  letion events.**
1f630 20 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20   are flushed to 
1f640 64 69 73 6b 2e 20 20 53 75 63 68 20 66 73 79 6e  disk.  Such fsyn
1f650 63 73 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65  cs are not neede
1f660 64 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a 6f  d on newer.** jo
1f670 75 72 6e 61 6c 69 6e 67 20 66 69 6c 65 73 79 73  urnaling filesys
1f680 74 65 6d 73 2c 20 62 75 74 20 61 72 65 20 72 65  tems, but are re
1f690 71 75 69 72 65 64 20 6f 6e 20 6f 6c 64 65 72 20  quired on older 
1f6a0 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a  filesystems..**.
1f6b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f6c0 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65  can be overridde
1f6d0 6e 20 75 73 69 6e 67 20 74 68 65 20 78 53 65 74  n using the xSet
1f6e0 53 79 73 43 61 6c 6c 20 69 6e 74 65 72 66 61 63  SysCall interfac
1f6f0 65 2e 0a 2a 2a 20 54 68 65 20 61 62 69 6c 69 74  e..** The abilit
1f700 79 20 74 6f 20 6f 76 65 72 72 69 64 65 20 74 68  y to override th
1f710 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 61  is routine was a
1f720 64 64 65 64 20 69 6e 20 73 75 70 70 6f 72 74 20  dded in support 
1f730 6f 66 20 74 68 65 0a 2a 2a 20 63 68 72 6f 6d 69  of the.** chromi
1f740 75 6d 20 73 61 6e 64 62 6f 78 2e 20 20 4f 70 65  um sandbox.  Ope
1f750 6e 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79  ning a directory
1f760 20 69 73 20 61 20 73 65 63 75 72 69 74 79 20 72   is a security r
1f770 69 73 6b 20 28 77 65 20 61 72 65 0a 2a 2a 20 74  isk (we are.** t
1f780 6f 6c 64 29 20 73 6f 20 6d 61 6b 69 6e 67 20 69  old) so making i
1f790 74 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 61  t overrideable a
1f7a0 6c 6c 6f 77 73 20 74 68 65 20 63 68 72 6f 6d 69  llows the chromi
1f7b0 75 6d 20 73 61 6e 64 62 6f 78 20 74 6f 0a 2a 2a  um sandbox to.**
1f7c0 20 72 65 70 6c 61 63 65 20 74 68 69 73 20 72 6f   replace this ro
1f7d0 75 74 69 6e 65 20 77 69 74 68 20 61 20 68 61 72  utine with a har
1f7e0 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 20 54 6f  mless no-op.  To
1f7f0 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 75 74 69   make this routi
1f800 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20 72  ne.** a no-op, r
1f810 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 20 61  eplace it with a
1f820 20 73 74 75 62 20 74 68 61 74 20 72 65 74 75 72   stub that retur
1f830 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74  ns SQLITE_OK but
1f840 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 70 46 64 20   leaves.** *pFd 
1f850 73 65 74 20 74 6f 20 61 20 6e 65 67 61 74 69 76  set to a negativ
1f860 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
1f870 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
1f880 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61  returned, the ca
1f890 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
1f8a0 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a  ble for closing.
1f8b0 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ** the file desc
1f8c0 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e  riptor *pFd usin
1f8d0 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74  g close()..*/.st
1f8e0 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72  atic int openDir
1f8f0 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
1f900 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e  r *zFilename, in
1f910 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69  t *pFd){.  int i
1f920 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  i;.  int fd = -1
1f930 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d  ;.  char zDirnam
1f940 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  e[MAX_PATHNAME+1
1f950 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
1f960 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
1f970 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22  AME, zDirname, "
1f980 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  %s", zFilename);
1f990 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73  .  for(ii=(int)s
1f9a0 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b  trlen(zDirname);
1f9b0 20 69 69 3e 30 20 26 26 20 7a 44 69 72 6e 61 6d   ii>0 && zDirnam
1f9c0 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d  e[ii]!='/'; ii--
1f9d0 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b  );.  if( ii>0 ){
1f9e0 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69  .    zDirname[ii
1f9f0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 65 6c 73  ] = '\0';.  }els
1fa00 65 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72 6e  e{.    if( zDirn
1fa10 61 6d 65 5b 30 5d 21 3d 27 2f 27 20 29 20 7a 44  ame[0]!='/' ) zD
1fa20 69 72 6e 61 6d 65 5b 30 5d 20 3d 20 27 2e 27 3b  irname[0] = '.';
1fa30 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 31 5d  .    zDirname[1]
1fa40 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 64 20 3d   = 0;.  }.  fd =
1fa50 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44 69   robust_open(zDi
1fa60 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c  rname, O_RDONLY|
1fa70 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20  O_BINARY, 0);.  
1fa80 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20  if( fd>=0 ){.   
1fa90 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44   OSTRACE(("OPEND
1faa0 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66  IR %-3d %s\n", f
1fab0 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20  d, zDirname));. 
1fac0 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a   }.  *pFd = fd;.
1fad0 20 20 69 66 28 20 66 64 3e 3d 30 20 29 20 72 65    if( fd>=0 ) re
1fae0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1faf0 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
1fb00 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
1fb10 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
1fb20 6e 44 69 72 65 63 74 6f 72 79 22 2c 20 7a 44 69  nDirectory", zDi
1fb30 72 6e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rname);.}../*.**
1fb40 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
1fb50 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
1fb60 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
1fb70 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
1fb80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f  ..**.** If dataO
1fb90 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68  nly==0 then both
1fba0 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66   the file itself
1fbb0 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74   and its metadat
1fbc0 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c  a (file.** size,
1fbd0 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74   access time, et
1fbe0 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20  c) are synced.  
1fbf0 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74  If dataOnly!=0 t
1fc00 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  hen only the.** 
1fc10 66 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e  file data is syn
1fc20 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72  ced..**.** Under
1fc30 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65   Unix, also make
1fc40 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64   sure that the d
1fc50 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
1fc60 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68  or the file.** h
1fc70 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  as been created 
1fc80 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65  by fsync-ing the
1fc90 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
1fca0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c  contains the fil
1fcb0 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e  e..** If we do n
1fcc0 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77  ot do this and w
1fcd0 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f  e encounter a po
1fce0 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
1fcf0 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e   directory.** en
1fd00 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
1fd10 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78  nal might not ex
1fd20 69 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62  ist after we reb
1fd30 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a  oot.  The next.*
1fd40 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65  * SQLite to acce
1fd50 73 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c  ss the file will
1fd60 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74   not know that t
1fd70 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  he journal exist
1fd80 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  s (because.** th
1fd90 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
1fda0 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
1fdb0 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61  l was never crea
1fdc0 74 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61  ted) and the tra
1fdd0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c  nsaction.** will
1fde0 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d   not roll back -
1fdf0 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e   possibly leadin
1fe00 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  g to database co
1fe10 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
1fe20 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63  tic int unixSync
1fe30 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1fe40 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  d, int flags){. 
1fe50 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46   int rc;.  unixF
1fe60 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1fe70 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69  ixFile*)id;..  i
1fe80 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20  nt isDataOnly = 
1fe90 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59  (flags&SQLITE_SY
1fea0 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20  NC_DATAONLY);.  
1feb0 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d  int isFullsync =
1fec0 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
1fed0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
1fee0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
1fef0 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  t one of SQLITE_
1ff00 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46  SYNC_NORMAL or F
1ff10 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a  ULL was passed *
1ff20 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67  /.  assert((flag
1ff30 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
1ff40 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20  SYNC_NORMAL.    
1ff50 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46    || (flags&0x0F
1ff60 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
1ff70 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55  ULL.  );..  /* U
1ff80 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20  nix cannot, but 
1ff90 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79  some systems may
1ffa0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
1ffb0 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54  ULL from here. T
1ffc0 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73  his.  ** line is
1ffd0 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f   to test that do
1ffe0 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20  ing so does not 
1fff0 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65  cause any proble
20000 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ms..  */.  Simul
20010 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
20020 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
20030 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72  FULL );..  asser
20040 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
20050 54 52 41 43 45 28 28 22 53 59 4e 43 20 20 20 20  TRACE(("SYNC    
20060 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %-3d\n", pFile->
20070 68 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c  h));.  rc = full
20080 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c  _fsync(pFile->h,
20090 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44   isFullsync, isD
200a0 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75  ataOnly);.  Simu
200b0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
200c0 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  1 );.  if( rc ){
200d0 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
200e0 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
200f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e  );.    return un
20100 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
20110 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22  E_IOERR_FSYNC, "
20120 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46 69  full_fsync", pFi
20130 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
20140 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73 79 6e 63  .  /* Also fsync
20150 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63   the directory c
20160 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69  ontaining the fi
20170 6c 65 20 69 66 20 74 68 65 20 44 49 52 53 59 4e  le if the DIRSYN
20180 43 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73  C flag.  ** is s
20190 65 74 2e 20 20 54 68 69 73 20 69 73 20 61 20 6f  et.  This is a o
201a0 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72 72 65 6e  ne-time occurren
201b0 63 65 2e 20 20 4d 61 6e 79 20 73 79 73 74 65 6d  ce.  Many system
201c0 73 20 28 65 78 61 6d 70 6c 65 73 3a 20 41 49 58  s (examples: AIX
201d0 29 0a 20 20 2a 2a 20 61 72 65 20 75 6e 61 62 6c  ).  ** are unabl
201e0 65 20 74 6f 20 66 73 79 6e 63 20 61 20 64 69 72  e to fsync a dir
201f0 65 63 74 6f 72 79 2c 20 73 6f 20 69 67 6e 6f 72  ectory, so ignor
20200 65 20 65 72 72 6f 72 73 20 6f 6e 20 74 68 65 20  e errors on the 
20210 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69 66  fsync..  */.  if
20220 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ( pFile->ctrlFla
20230 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 49  gs & UNIXFILE_DI
20240 52 53 59 4e 43 20 29 7b 0a 20 20 20 20 69 6e 74  RSYNC ){.    int
20250 20 64 69 72 66 64 3b 0a 20 20 20 20 4f 53 54 52   dirfd;.    OSTR
20260 41 43 45 28 28 22 44 49 52 53 59 4e 43 20 25 73  ACE(("DIRSYNC %s
20270 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63   (have_fullfsync
20280 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29  =%d fullsync=%d)
20290 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  \n", pFile->zPat
202a0 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 48  h,.            H
202b0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69  AVE_FULLFSYNC, i
202c0 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 20 20 20  sFullsync));.   
202d0 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65   rc = osOpenDire
202e0 63 74 6f 72 79 28 70 46 69 6c 65 2d 3e 7a 50 61  ctory(pFile->zPa
202f0 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20  th, &dirfd);.   
20300 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20310 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 75 6c 6c  OK ){.      full
20320 5f 66 73 79 6e 63 28 64 69 72 66 64 2c 20 30 2c  _fsync(dirfd, 0,
20330 20 30 29 3b 0a 23 69 66 20 4f 53 43 4c 4f 53 45   0);.#if OSCLOSE
20340 5f 43 48 45 43 4b 5f 43 4c 4f 53 45 5f 49 4f 45  _CHECK_CLOSE_IOE
20350 52 52 0a 20 20 20 20 20 20 69 66 28 20 63 6c 6f  RR.      if( clo
20360 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 29  se(pFile->dirfd)
20370 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
20380 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
20390 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
203a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
203b0 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20  ERR_DIR_CLOSE;. 
203c0 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
203d0 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
203e0 70 46 69 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f  pFile, dirfd, __
203f0 4c 49 4e 45 5f 5f 29 3b 0a 23 65 6e 64 69 66 0a  LINE__);.#endif.
20400 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20410 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
20420 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 3b 0a  ITE_CANTOPEN );.
20430 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
20440 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
20450 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
20460 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 44 49   &= ~UNIXFILE_DI
20470 52 53 59 4e 43 3b 0a 0a 20 20 7d 0a 20 20 72 65  RSYNC;..  }.  re
20480 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
20490 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
204a0 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
204b0 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
204c0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72  tatic int unixTr
204d0 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
204e0 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79  ile *id, i64 nBy
204f0 74 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  te){.  unixFile 
20500 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
20510 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72  le *)id;.  int r
20520 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  c;.  assert( pFi
20530 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  le );.  Simulate
20540 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
20550 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
20560 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  NCATE );..  /* I
20570 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63  f the user has c
20580 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e  onfigured a chun
20590 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  k-size for this 
205a0 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74  file, truncate t
205b0 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20  he.  ** file so 
205c0 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73  that it consists
205d0 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e   of an integer n
205e0 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20  umber of chunks 
205f0 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61  (i.e. the.  ** a
20600 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20  ctual file size 
20610 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74  after the operat
20620 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65  ion may be large
20630 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
20640 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e  sted.  ** size).
20650 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
20660 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a  e->szChunk>0 ){.
20670 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42      nByte = ((nB
20680 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43  yte + pFile->szC
20690 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d  hunk - 1)/pFile-
206a0 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c  >szChunk) * pFil
206b0 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a  e->szChunk;.  }.
206c0 0a 20 20 72 63 20 3d 20 72 6f 62 75 73 74 5f 66  .  rc = robust_f
206d0 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e  truncate(pFile->
206e0 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  h, nByte);.  if(
206f0 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f 72 65   rc ){.    store
20700 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
20710 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74   errno);.    ret
20720 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
20730 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
20740 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61  UNCATE, "ftrunca
20750 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  te", pFile->zPat
20760 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66  h);.  }else{.#if
20770 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
20780 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
20790 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c  e doing a normal
207a0 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61   write to a data
207b0 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70  base file (as op
207c0 70 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  posed to.    ** 
207d0 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  doing a hot-jour
207e0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  nal rollback or 
207f0 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20  a write to some 
20800 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  file other than 
20810 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  a.    ** normal 
20820 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 61  database file) a
20830 6e 64 20 77 65 20 74 72 75 6e 63 61 74 65 20 74  nd we truncate t
20840 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  he file to zero 
20850 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74  length,.    ** t
20860 68 61 74 20 65 66 66 65 63 74 69 76 65 6c 79 20  hat effectively 
20870 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
20880 67 65 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69  ge counter.  Thi
20890 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 0a 20  s might happen. 
208a0 20 20 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f     ** when resto
208b0 72 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  ring a database 
208c0 75 73 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70  using the backup
208d0 20 41 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f   API from a zero
208e0 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73  -length.    ** s
208f0 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ource..    */.  
20900 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e    if( pFile->inN
20910 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20 6e 42  ormalWrite && nB
20920 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  yte==0 ){.      
20930 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
20940 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Chng = 1;.    }.
20950 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
20960 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
20970 3e 30 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  >0.    /* If the
20980 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 74   file was just t
20990 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69  runcated to a si
209a0 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ze smaller than 
209b0 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  the currently.  
209c0 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69    ** mapped regi
209d0 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65 20 65  on, reduce the e
209e0 66 66 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67  ffective mapping
209f0 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53   size as well. S
20a00 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 20 20 2a  QLite will.    *
20a10 2a 20 75 73 65 20 72 65 61 64 28 29 20 61 6e 64  * use read() and
20a20 20 77 72 69 74 65 28 29 20 74 6f 20 61 63 63 65   write() to acce
20a30 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74  ss data beyond t
20a40 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e  his point from n
20a50 6f 77 20 6f 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a  ow on.  .    */.
20a60 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c 70 46      if( nByte<pF
20a70 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
20a80 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d  .      pFile->mm
20a90 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a  apSize = nByte;.
20aa0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
20ab0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20ac0 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
20ad0 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63   Determine the c
20ae0 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61  urrent size of a
20af0 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a   file in bytes.*
20b00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
20b10 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  xFileSize(sqlite
20b20 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  3_file *id, i64 
20b30 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72  *pSize){.  int r
20b40 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  c;.  struct stat
20b50 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20   buf;.  assert( 
20b60 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46  id );.  rc = osF
20b70 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a  stat(((unixFile*
20b80 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a  )id)->h, &buf);.
20b90 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
20ba0 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28  r( rc=1 );.  if(
20bb0 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 74   rc!=0 ){.    st
20bc0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e  oreLastErrno((un
20bd0 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e  ixFile*)id, errn
20be0 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  o);.    return S
20bf0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
20c00 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20  T;.  }.  *pSize 
20c10 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a  = buf.st_size;..
20c20 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e    /* When openin
20c30 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61  g a zero-size da
20c40 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64  tabase, the find
20c50 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f 63  InodeInfo() proc
20c60 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65  edure.  ** write
20c70 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  s a single byte 
20c80 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69  into that file i
20c90 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20  n order to work 
20ca0 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a  around a bug.  *
20cb0 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73  * in the OS-X ms
20cc0 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20  dos filesystem. 
20cd0 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   In order to avo
20ce0 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  id problems with
20cf0 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65   upper.  ** laye
20d00 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72  rs, we need to r
20d10 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20  eport this file 
20d20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65  size as zero eve
20d30 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20  n though it is. 
20d40 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20   ** really 1.   
20d50 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20  Ticket #3260..  
20d60 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d  */.  if( *pSize=
20d70 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b  =1 ) *pSize = 0;
20d80 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ...  return SQLI
20d90 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
20da0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
20db0 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
20dc0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
20dd0 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f  /*.** Handler fo
20de0 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  r proxy-locking 
20df0 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72  file-control ver
20e00 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c  bs.  Defined bel
20e10 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f  ow in the.** pro
20e20 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69  xying locking di
20e30 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  vision..*/.stati
20e40 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43  c int proxyFileC
20e50 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
20e60 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b  ile*,int,void*);
20e70 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20  .#endif../* .** 
20e80 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
20e90 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c   called to handl
20ea0 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  e the SQLITE_FCN
20eb0 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a  TL_SIZE_HINT .**
20ec0 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70   file-control op
20ed0 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61 72 67  eration.  Enlarg
20ee0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
20ef0 6f 20 6e 42 79 74 65 73 20 69 6e 20 73 69 7a 65  o nBytes in size
20f00 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75 70 20  .** (rounded up 
20f10 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68 75 6e  to the next chun
20f20 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20 74 68 65  k-size).  If the
20f30 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
20f40 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73 20 6f  eady.** nBytes o
20f50 72 20 6c 61 72 67 65 72 2c 20 74 68 69 73 20 72  r larger, this r
20f60 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
20f70 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
20f80 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75   fcntlSizeHint(u
20f90 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
20fa0 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66  i64 nByte){.  if
20fb0 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
20fc0 3e 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 53  >0 ){.    i64 nS
20fd0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
20fe0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69          /* Requi
20ff0 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
21000 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
21010 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20   buf;           
21020 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f     /* Used to ho
21030 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73  ld return values
21040 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f 0a 20   of fstat() */. 
21050 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74    .    if( osFst
21060 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75  at(pFile->h, &bu
21070 66 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  f) ){.      stor
21080 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
21090 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
210a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
210b0 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d  ERR_FSTAT;.    }
210c0 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 28  ..    nSize = ((
210d0 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e 73 7a 43  nByte+pFile->szC
210e0 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69 6c 65 2d  hunk-1) / pFile-
210f0 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c  >szChunk) * pFil
21100 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20  e->szChunk;.    
21110 69 66 28 20 6e 53 69 7a 65 3e 28 69 36 34 29 62  if( nSize>(i64)b
21120 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b 0a 0a 23  uf.st_size ){..#
21130 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
21140 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29  POSIX_FALLOCATE)
21150 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46   && HAVE_POSIX_F
21160 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20 20 20 2f  ALLOCATE.      /
21170 2a 20 54 68 65 20 63 6f 64 65 20 62 65 6c 6f 77  * The code below
21180 20 69 73 20 68 61 6e 64 6c 69 6e 67 20 74 68 65   is handling the
21190 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
211a0 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 29 20 0a   osFallocate() .
211b0 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74        ** correct
211c0 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  ly. posix_falloc
211d0 61 74 65 28 29 20 69 73 20 64 65 66 69 6e 65 64  ate() is defined
211e0 20 74 6f 20 22 72 65 74 75 72 6e 73 20 7a 65 72   to "returns zer
211f0 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 0a 20  o on success, . 
21200 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e 20 65 72       ** or an er
21210 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e 20 20 66  ror number on  f
21220 61 69 6c 75 72 65 22 2e 20 53 65 65 20 74 68 65  ailure". See the
21230 20 6d 61 6e 70 61 67 65 20 66 6f 72 20 64 65 74   manpage for det
21240 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ails. */.      i
21250 6e 74 20 65 72 72 3b 0a 20 20 20 20 20 20 64 6f  nt err;.      do
21260 7b 0a 20 20 20 20 20 20 20 20 65 72 72 20 3d 20  {.        err = 
21270 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70 46 69 6c  osFallocate(pFil
21280 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 73 69 7a  e->h, buf.st_siz
21290 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e 73 74 5f  e, nSize-buf.st_
212a0 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 77 68  size);.      }wh
212b0 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e 54 52 20  ile( err==EINTR 
212c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72  );.      if( err
212d0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
212e0 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23 65  _IOERR_WRITE;.#e
212f0 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  lse.      /* If 
21300 74 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20  the OS does not 
21310 68 61 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f  have posix_fallo
21320 63 61 74 65 28 29 2c 20 66 61 6b 65 20 69 74 2e  cate(), fake it.
21330 20 57 72 69 74 65 20 61 20 0a 20 20 20 20 20 20   Write a .      
21340 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74  ** single byte t
21350 6f 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  o the last byte 
21360 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b 20 74 68  in each block th
21370 61 74 20 66 61 6c 6c 73 20 65 6e 74 69 72 65 6c  at falls entirel
21380 79 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 69  y.      ** withi
21390 6e 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72  n the extended r
213a0 65 67 69 6f 6e 2e 20 54 68 65 6e 2c 20 69 66 20  egion. Then, if 
213b0 72 65 71 75 69 72 65 64 2c 20 61 20 73 69 6e 67  required, a sing
213c0 6c 65 20 62 79 74 65 0a 20 20 20 20 20 20 2a 2a  le byte.      **
213d0 20 61 74 20 6f 66 66 73 65 74 20 28 6e 53 69 7a   at offset (nSiz
213e0 65 2d 31 29 2c 20 74 6f 20 73 65 74 20 74 68 65  e-1), to set the
213f0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
21400 65 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 20  e correctly..   
21410 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61 20     ** This is a 
21420 73 69 6d 69 6c 61 72 20 74 65 63 68 6e 69 71 75  similar techniqu
21430 65 20 74 6f 20 74 68 61 74 20 75 73 65 64 20 62  e to that used b
21440 79 20 67 6c 69 62 63 20 6f 6e 20 73 79 73 74 65  y glibc on syste
21450 6d 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ms.      ** that
21460 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 72   do not have a r
21470 65 61 6c 20 66 61 6c 6c 6f 63 61 74 65 28 29 20  eal fallocate() 
21480 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  call..      */. 
21490 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20       int nBlk = 
214a0 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20  buf.st_blksize; 
214b0 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74 65 6d 20   /* File-system 
214c0 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20  block size */.  
214d0 20 20 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d      int nWrite =
214e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
214f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
21500 65 73 20 77 72 69 74 74 65 6e 20 62 79 20 73 65  es written by se
21510 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20  ekAndWrite */.  
21520 20 20 20 20 69 36 34 20 69 57 72 69 74 65 3b 20      i64 iWrite; 
21530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21540 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65 74 20 74  /* Next offset t
21550 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20  o write to */.. 
21560 20 20 20 20 20 69 57 72 69 74 65 20 3d 20 28 62       iWrite = (b
21570 75 66 2e 73 74 5f 73 69 7a 65 2f 6e 42 6c 6b 29  uf.st_size/nBlk)
21580 2a 6e 42 6c 6b 20 2b 20 6e 42 6c 6b 20 2d 20 31  *nBlk + nBlk - 1
21590 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
215a0 69 57 72 69 74 65 3e 3d 62 75 66 2e 73 74 5f 73  iWrite>=buf.st_s
215b0 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
215c0 65 72 74 28 20 28 28 69 57 72 69 74 65 2b 31 29  ert( ((iWrite+1)
215d0 25 6e 42 6c 6b 29 3d 3d 30 20 29 3b 0a 20 20 20  %nBlk)==0 );.   
215e0 20 20 20 66 6f 72 28 2f 2a 6e 6f 2d 6f 70 2a 2f     for(/*no-op*/
215f0 3b 20 69 57 72 69 74 65 3c 6e 53 69 7a 65 2b 6e  ; iWrite<nSize+n
21600 42 6c 6b 2d 31 3b 20 69 57 72 69 74 65 2b 3d 6e  Blk-1; iWrite+=n
21610 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Blk ){.        i
21620 66 28 20 69 57 72 69 74 65 3e 3d 6e 53 69 7a 65  f( iWrite>=nSize
21630 20 29 20 69 57 72 69 74 65 20 3d 20 6e 53 69 7a   ) iWrite = nSiz
21640 65 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e  e - 1;.        n
21650 57 72 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57  Write = seekAndW
21660 72 69 74 65 28 70 46 69 6c 65 2c 20 69 57 72 69  rite(pFile, iWri
21670 74 65 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20 20  te, "", 1);.    
21680 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 21 3d      if( nWrite!=
21690 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
216a0 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20  E_IOERR_WRITE;. 
216b0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
216c0 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c    }.  }..#if SQL
216d0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
216e0 45 3e 30 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  E>0.  if( pFile-
216f0 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 26  >mmapSizeMax>0 &
21700 26 20 6e 42 79 74 65 3e 70 46 69 6c 65 2d 3e 6d  & nByte>pFile->m
21710 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69  mapSize ){.    i
21720 6e 74 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70  nt rc;.    if( p
21730 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3c 3d 30  File->szChunk<=0
21740 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 6f   ){.      if( ro
21750 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70  bust_ftruncate(p
21760 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 20  File->h, nByte) 
21770 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  ){.        store
21780 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
21790 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20   errno);.       
217a0 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
217b0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
217c0 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72  R_TRUNCATE, "ftr
217d0 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e  uncate", pFile->
217e0 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a  zPath);.      }.
217f0 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
21800 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69 6c  unixMapfile(pFil
21810 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 72  e, nByte);.    r
21820 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
21830 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53  ndif..  return S
21840 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69  QLITE_OK;.}...#i
21850 66 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  f (SQLITE_ENABLE
21860 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26  _APPLE_SPI>0) &&
21870 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
21880 5f 5f 29 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  __).#include "sq
21890 6c 69 74 65 33 5f 70 72 69 76 61 74 65 2e 68 22  lite3_private.h"
218a0 0a 23 69 6e 63 6c 75 64 65 20 3c 63 6f 70 79 66  .#include <copyf
218b0 69 6c 65 2e 68 3e 0a 73 74 61 74 69 63 20 69 6e  ile.h>.static in
218c0 74 20 70 72 6f 78 79 47 65 74 44 62 50 61 74 68  t proxyGetDbPath
218d0 46 6f 72 55 6e 69 78 46 69 6c 65 28 75 6e 69 78  ForUnixFile(unix
218e0 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 68 61  File *pFile, cha
218f0 72 20 2a 64 62 50 61 74 68 29 3b 0a 23 65 6e 64  r *dbPath);.#end
21900 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  if..#if SQLITE_E
21910 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
21920 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74 20 69  YLE.static int i
21930 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64  sProxyLockingMod
21940 65 28 75 6e 69 78 46 69 6c 65 20 2a 29 3b 0a 23  e(unixFile *);.#
21950 65 6e 64 69 66 0a 0a 23 69 66 20 28 53 51 4c 49  endif..#if (SQLI
21960 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f  TE_ENABLE_APPLE_
21970 53 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65  SPI>0) && define
21980 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 73 74 61  d(__APPLE__).sta
21990 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e  tic int unixTrun
219a0 63 61 74 65 44 61 74 61 62 61 73 65 28 75 6e 69  cateDatabase(uni
219b0 78 46 69 6c 65 20 2a 2c 20 69 6e 74 29 3b 0a 0a  xFile *, int);..
219c0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 49  static int unixI
219d0 6e 76 61 6c 69 64 61 74 65 53 75 70 70 6f 72 74  nvalidateSupport
219e0 46 69 6c 65 73 28 75 6e 69 78 46 69 6c 65 20 2a  Files(unixFile *
219f0 2c 20 69 6e 74 29 3b 0a 0a 73 74 61 74 69 63 20  , int);..static 
21a00 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46 69  int findCreateFi
21a10 6c 65 4d 6f 64 65 28 63 6f 6e 73 74 20 63 68 61  leMode(const cha
21a20 72 20 2a 2c 20 69 6e 74 2c 20 6d 6f 64 65 5f 74  r *, int, mode_t
21a30 2a 2c 20 75 69 64 5f 74 20 2a 2c 67 69 64 5f 74  *, uid_t *,gid_t
21a40 20 2a 29 3b 0a 0a 2f 2a 20 6f 70 65 6e 73 20 61   *);../* opens a
21a50 20 72 65 61 64 2f 77 72 69 74 65 20 63 6f 6e 6e   read/write conn
21a60 65 63 74 69 6f 6e 20 74 6f 20 61 20 66 69 6c 65  ection to a file
21a70 20 7a 4e 61 6d 65 20 69 6e 68 65 72 69 74 69 6e   zName inheritin
21a80 67 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  g the appropriat
21a90 65 0a 2a 2a 20 75 73 65 72 2f 70 65 72 6d 73 20  e.** user/perms 
21aa0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
21ab0 65 20 66 69 6c 65 20 69 66 20 72 75 6e 6e 69 6e  e file if runnin
21ac0 67 20 61 73 20 72 6f 6f 74 2e 20 20 52 65 74 75  g as root.  Retu
21ad0 72 6e 73 20 74 68 65 20 66 69 6c 65 20 0a 2a 2a  rns the file .**
21ae0 20 64 65 73 63 72 69 70 74 6f 72 20 62 79 20 72   descriptor by r
21af0 65 66 65 72 65 6e 63 65 0a 2a 2f 0a 73 74 61 74  eference.*/.stat
21b00 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 43  ic int unixOpenC
21b10 68 69 6c 64 46 69 6c 65 28 0a 20 20 63 6f 6e 73  hildFile(.  cons
21b20 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20  t char *zName,. 
21b30 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 2c 0a   int openFlags,.
21b40 20 20 69 6e 74 20 64 62 4f 70 65 6e 46 6c 61 67    int dbOpenFlag
21b50 73 2c 0a 20 20 69 6e 74 20 70 72 6f 74 46 6c 61  s,.  int protFla
21b60 67 73 2c 0a 20 20 69 6e 74 20 2a 70 46 64 0a 29  gs,.  int *pFd.)
21b70 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b  {.  int fd = -1;
21b80 0a 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f  .  mode_t openMo
21b90 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
21ba0 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20   /* Permissions 
21bb0 74 6f 20 63 72 65 61 74 65 20 66 69 6c 65 20 77  to create file w
21bc0 69 74 68 20 2a 2f 0a 20 20 75 69 64 5f 74 20 75  ith */.  uid_t u
21bd0 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
21be0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 72 69 64         /* Userid
21bf0 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f   for the file */
21c00 0a 20 20 67 69 64 5f 74 20 67 69 64 3b 20 20 20  .  gid_t gid;   
21c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c20 20 2f 2a 20 47 72 6f 75 70 69 64 20 66 6f 72 20   /* Groupid for 
21c30 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  the file */.  in
21c40 74 20 72 63 3b 0a 20 20 0a 20 20 61 73 73 65 72  t rc;.  .  asser
21c50 74 28 70 46 64 21 3d 4e 55 4c 4c 29 3b 0a 20 20  t(pFd!=NULL);.  
21c60 72 63 20 3d 20 66 69 6e 64 43 72 65 61 74 65 46  rc = findCreateF
21c70 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20 64  ileMode(zName, d
21c80 62 4f 70 65 6e 46 6c 61 67 73 2c 20 26 6f 70 65  bOpenFlags, &ope
21c90 6e 4d 6f 64 65 2c 20 26 75 69 64 2c 20 26 67 69  nMode, &uid, &gi
21ca0 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  d);.  if( rc!=SQ
21cb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
21cc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
21cd0 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
21ce0 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67  (zName, openFlag
21cf0 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20  s, openMode);.  
21d00 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 58 20  OSTRACE(("OPENX 
21d10 20 20 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22    %-3d %s 0%o\n"
21d20 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65  , fd, zName, ope
21d30 6e 46 6c 61 67 73 29 29 3b 0a 20 20 69 66 28 20  nFlags));.  if( 
21d40 66 64 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  fd<0 ){.    rc =
21d50 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
21d60 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
21d70 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d  PT, "open", zNam
21d80 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  e);.    return r
21d90 63 3b 0a 20 20 7d 0a 20 20 2f 2a 20 69 66 20 77  c;.  }.  /* if w
21da0 65 27 72 65 20 6f 70 65 6e 69 6e 67 20 74 68 65  e're opening the
21db0 20 77 61 6c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20   wal or journal 
21dc0 61 6e 64 20 72 75 6e 6e 69 6e 67 20 61 73 20 72  and running as r
21dd0 6f 6f 74 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68  oot, set.  ** th
21de0 65 20 6a 6f 75 72 6e 61 6c 20 75 69 64 2f 67 69  e journal uid/gi
21df0 64 20 2a 2f 0a 20 20 69 66 28 20 64 62 4f 70 65  d */.  if( dbOpe
21e00 6e 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45  nFlags & (SQLITE
21e10 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45  _OPEN_WAL|SQLITE
21e20 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
21e30 41 4c 29 20 29 7b 0a 20 20 20 20 75 69 64 5f 74  AL) ){.    uid_t
21e40 20 65 75 69 64 20 3d 20 67 65 74 65 75 69 64 28   euid = geteuid(
21e50 29 3b 0a 20 20 20 20 69 66 28 20 65 75 69 64 3d  );.    if( euid=
21e60 3d 30 20 26 26 20 28 65 75 69 64 21 3d 75 69 64  =0 && (euid!=uid
21e70 20 7c 7c 20 67 65 74 65 67 69 64 28 29 21 3d 67   || getegid()!=g
21e80 69 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  id) ){.      if(
21e90 20 66 63 68 6f 77 6e 28 66 64 2c 20 75 69 64 2c   fchown(fd, uid,
21ea0 20 67 69 64 29 20 29 7b 0a 20 20 20 20 20 20 20   gid) ){.       
21eb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
21ec0 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
21ed0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
21ee0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21ef0 4b 20 29 7b 0a 20 20 20 20 2a 70 46 64 20 3d 20  K ){.    *pFd = 
21f00 66 64 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  fd;.  } else {. 
21f10 20 20 20 2a 70 46 64 20 3d 20 2d 31 3b 0a 20 20     *pFd = -1;.  
21f20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 7d    close(fd);.  }
21f30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21f40 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
21f50 52 65 70 6c 61 63 65 44 61 74 61 62 61 73 65 28  ReplaceDatabase(
21f60 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
21f70 20 73 71 6c 69 74 65 33 20 2a 73 72 63 64 62 29   sqlite3 *srcdb)
21f80 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c   {.  sqlite3_fil
21f90 65 20 2a 69 64 20 3d 20 28 73 71 6c 69 74 65 33  e *id = (sqlite3
21fa0 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
21fb0 20 42 74 72 65 65 20 2a 70 53 72 63 42 74 72 65   Btree *pSrcBtre
21fc0 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 73 71 6c 69  e = NULL;.  sqli
21fd0 74 65 33 5f 66 69 6c 65 20 2a 73 72 63 5f 66 69  te3_file *src_fi
21fe0 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 75 6e 69  le = NULL;.  uni
21ff0 78 46 69 6c 65 20 2a 70 53 72 63 46 69 6c 65 20  xFile *pSrcFile 
22000 3d 20 4e 55 4c 4c 3b 0a 20 20 63 68 61 72 20 73  = NULL;.  char s
22010 72 63 57 61 6c 50 61 74 68 5b 4d 41 58 50 41 54  rcWalPath[MAXPAT
22020 48 4c 45 4e 2b 35 5d 3b 0a 20 20 69 6e 74 20 73  HLEN+5];.  int s
22030 72 63 57 61 6c 46 44 20 3d 20 2d 31 3b 0a 20 20  rcWalFD = -1;.  
22040 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22050 4f 4b 3b 0a 20 20 76 6f 69 64 20 2a 70 4c 6f 63  OK;.  void *pLoc
22060 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20  k = NULL;.  int 
22070 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 73 71 6c  flags = 0;.  sql
22080 69 74 65 33 20 2a 73 72 63 64 62 32 20 3d 20 4e  ite3 *srcdb2 = N
22090 55 4c 4c 3b 0a 20 20 63 6f 70 79 66 69 6c 65 5f  ULL;.  copyfile_
220a0 73 74 61 74 65 5f 74 20 73 3b 0a 20 20 69 6e 74  state_t s;.  int
220b0 20 63 6f 72 72 75 70 74 53 72 63 46 69 6c 65 4c   corruptSrcFileL
220c0 6f 63 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63  ock = 0;.  int c
220d0 6f 72 72 75 70 74 44 73 74 46 69 6c 65 4c 6f 63  orruptDstFileLoc
220e0 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 53  k = 0;.  int isS
220f0 72 63 43 6f 72 72 75 70 74 20 3d 20 30 3b 0a 20  rcCorrupt = 0;. 
22100 20 69 6e 74 20 69 73 44 73 74 43 6f 72 72 75 70   int isDstCorrup
22110 74 20 3d 20 30 3b 0a 20 20 0a 20 20 69 66 28 20  t = 0;.  .  if( 
22120 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
22130 65 63 6b 4f 6b 28 73 72 63 64 62 29 20 29 7b 0a  eckOk(srcdb) ){.
22140 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22150 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20  E_MISUSE;.  }.  
22160 20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e    .#if SQLITE_EN
22170 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43  ABLE_DATA_PROTEC
22180 54 49 4f 4e 0a 20 20 66 6c 61 67 73 20 7c 3d 20  TION.  flags |= 
22190 70 46 69 6c 65 2d 3e 70 72 6f 74 46 6c 61 67 73  pFile->protFlags
221a0 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
221b0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
221c0 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 69  NG_STYLE.  if( i
221d0 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64  sProxyLockingMod
221e0 65 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  e(pFile) ){.    
221f0 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
22200 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 3b 0a  OPEN_AUTOPROXY;.
22210 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
22220 72 63 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f  rc = sqlite3demo
22230 5f 73 75 70 65 72 6c 6f 63 6b 28 70 46 69 6c 65  _superlock(pFile
22240 2d 3e 7a 50 61 74 68 2c 20 30 2c 20 66 6c 61 67  ->zPath, 0, flag
22250 73 2c 20 30 2c 20 30 2c 20 26 70 4c 6f 63 6b 29  s, 0, 0, &pLock)
22260 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
22270 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22280 5f 43 4f 52 52 55 50 54 20 7c 7c 20 72 63 3d 3d  _CORRUPT || rc==
22290 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 29 7b  SQLITE_NOTADB ){
222a0 0a 20 20 20 20 20 20 69 73 44 73 74 43 6f 72 72  .      isDstCorr
222b0 75 70 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  upt = 1;.      r
222c0 63 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f  c = sqlite3demo_
222d0 73 75 70 65 72 6c 6f 63 6b 5f 63 6f 72 72 75 70  superlock_corrup
222e0 74 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  t(id, SQLITE_LOC
222f0 4b 5f 45 58 43 4c 55 53 49 56 45 2c 0a 20 20 20  K_EXCLUSIVE,.   
22300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22320 20 20 20 20 20 20 26 63 6f 72 72 75 70 74 44 73        &corruptDs
22330 74 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  tFileLock);.    
22340 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  }.    if( rc ){.
22350 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
22360 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
22370 67 65 74 20 74 68 65 20 73 72 63 20 66 69 6c 65  get the src file
22380 20 64 65 73 63 72 69 70 74 6f 72 20 61 64 68 65   descriptor adhe
22390 72 69 6e 67 20 74 6f 20 74 68 65 20 64 62 20 73  ring to the db s
223a0 74 72 75 63 74 20 61 63 63 65 73 73 20 72 75 6c  truct access rul
223b0 65 73 20 0a 20 20 20 2a 2a 20 74 68 69 73 20 63  es .   ** this c
223c0 6f 64 65 20 69 73 20 6d 6f 64 65 6c 65 64 20 61  ode is modeled a
223d0 66 74 65 72 20 73 71 6c 69 74 65 33 5f 66 69 6c  fter sqlite3_fil
223e0 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 69 6e 20 6d  e_control() in m
223f0 61 69 6e 2e 63 0a 20 20 20 2a 2f 20 0a 20 20 73  ain.c.   */ .  s
22400 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
22410 65 72 28 73 72 63 64 62 2d 3e 6d 75 74 65 78 29  er(srcdb->mutex)
22420 3b 0a 20 20 69 66 28 20 73 72 63 64 62 2d 3e 6e  ;.  if( srcdb->n
22430 44 62 3e 30 20 29 7b 0a 20 20 20 20 70 53 72 63  Db>0 ){.    pSrc
22440 42 74 72 65 65 20 3d 20 73 72 63 64 62 2d 3e 61  Btree = srcdb->a
22450 44 62 5b 30 5d 2e 70 42 74 3b 0a 20 20 7d 0a 20  Db[0].pBt;.  }. 
22460 20 69 66 28 20 70 53 72 63 42 74 72 65 65 20 29   if( pSrcBtree )
22470 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 53 72  {.    Pager *pSr
22480 63 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69  cPager;.    sqli
22490 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 53  te3BtreeEnter(pS
224a0 72 63 42 74 72 65 65 29 3b 0a 20 20 20 20 70 53  rcBtree);.    pS
224b0 72 63 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65  rcPager = sqlite
224c0 33 42 74 72 65 65 50 61 67 65 72 28 70 53 72 63  3BtreePager(pSrc
224d0 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65  Btree);.    asse
224e0 72 74 28 20 70 53 72 63 50 61 67 65 72 21 3d 30  rt( pSrcPager!=0
224f0 20 29 3b 0a 20 20 20 20 73 72 63 5f 66 69 6c 65   );.    src_file
22500 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46   = sqlite3PagerF
22510 69 6c 65 28 70 53 72 63 50 61 67 65 72 29 3b 0a  ile(pSrcPager);.
22520 20 20 20 20 61 73 73 65 72 74 28 20 73 72 63 5f      assert( src_
22530 66 69 6c 65 21 3d 30 20 29 3b 0a 20 20 20 20 69  file!=0 );.    i
22540 66 28 20 73 72 63 5f 66 69 6c 65 2d 3e 70 4d 65  f( src_file->pMe
22550 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 69  thods ){.      i
22560 6e 74 20 73 72 63 46 6c 61 67 73 20 3d 20 30 3b  nt srcFlags = 0;
22570 0a 20 20 20 20 20 20 70 53 72 63 46 69 6c 65 20  .      pSrcFile 
22580 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 73 72  = (unixFile *)sr
22590 63 5f 66 69 6c 65 3b 0a 23 69 66 20 53 51 4c 49  c_file;.#if SQLI
225a0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
225b0 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e  G_STYLE || defin
225c0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
225d0 20 20 20 20 69 66 20 28 28 70 53 72 63 46 69 6c      if ((pSrcFil
225e0 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f  e->openFlags & O
225f0 5f 52 44 57 52 29 20 3d 3d 20 4f 5f 52 44 57 52  _RDWR) == O_RDWR
22600 29 20 7b 0a 20 20 20 20 20 20 20 20 73 72 63 46  ) {.        srcF
22610 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
22620 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20  EN_READWRITE;.  
22630 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
22640 20 20 20 20 20 73 72 63 46 6c 61 67 73 20 3d 20       srcFlags = 
22650 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
22660 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ONLY;.      }.#e
22670 6c 73 65 0a 20 20 20 20 20 20 73 72 63 46 6c 61  lse.      srcFla
22680 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
22690 5f 52 45 41 44 57 52 49 54 45 3b 0a 23 65 6e 64  _READWRITE;.#end
226a0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  if.#if SQLITE_EN
226b0 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43  ABLE_DATA_PROTEC
226c0 54 49 4f 4e 0a 20 20 20 20 20 20 73 72 63 46 6c  TION.      srcFl
226d0 61 67 73 20 7c 3d 20 70 53 72 63 46 69 6c 65 2d  ags |= pSrcFile-
226e0 3e 70 72 6f 74 46 6c 61 67 73 3b 0a 23 65 6e 64  >protFlags;.#end
226f0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  if.#if SQLITE_EN
22700 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
22710 4c 45 0a 20 20 20 20 20 20 69 66 28 20 69 73 50  LE.      if( isP
22720 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28  roxyLockingMode(
22730 70 53 72 63 46 69 6c 65 29 20 29 7b 0a 20 20 20  pSrcFile) ){.   
22740 20 20 20 20 20 73 72 63 46 6c 61 67 73 20 7c 3d       srcFlags |=
22750 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54   SQLITE_OPEN_AUT
22760 4f 50 52 4f 58 59 3b 0a 20 20 20 20 20 20 7d 0a  OPROXY;.      }.
22770 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20  #endif.      rc 
22780 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  = sqlite3_open_v
22790 32 28 70 53 72 63 46 69 6c 65 2d 3e 7a 50 61 74  2(pSrcFile->zPat
227a0 68 2c 20 26 73 72 63 64 62 32 2c 20 73 72 63 46  h, &srcdb2, srcF
227b0 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20  lags, 0);.      
227c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
227d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
227e0 73 74 61 72 74 20 61 20 64 65 66 65 72 72 65 64  start a deferred
227f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
22800 20 72 65 61 64 20 74 6f 20 65 73 74 61 62 6c 69   read to establi
22810 73 68 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a  sh a read lock *
22820 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  /.        rc = s
22830 71 6c 69 74 65 33 5f 65 78 65 63 28 73 72 63 64  qlite3_exec(srcd
22840 62 32 2c 20 22 42 45 47 49 4e 20 44 45 46 45 52  b2, "BEGIN DEFER
22850 52 45 44 3b 20 50 52 41 47 4d 41 20 73 63 68 65  RED; PRAGMA sche
22860 6d 61 5f 76 65 72 73 69 6f 6e 22 2c 0a 20 20 20  ma_version",.   
22870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22880 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 29 3b         0, 0, 0);
22890 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
228a0 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
228b0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
228c0 54 41 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  TADB ){.        
228d0 20 20 69 73 53 72 63 43 6f 72 72 75 70 74 20 3d    isSrcCorrupt =
228e0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   1;.          rc
228f0 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73   = sqlite3demo_s
22900 75 70 65 72 6c 6f 63 6b 5f 63 6f 72 72 75 70 74  uperlock_corrupt
22910 28 73 72 63 5f 66 69 6c 65 2c 20 53 51 4c 49 54  (src_file, SQLIT
22920 45 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 2c 0a 20  E_LOCK_SHARED,. 
22930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22950 20 20 20 20 20 20 20 20 20 20 20 20 26 63 6f 72              &cor
22960 72 75 70 74 53 72 63 46 69 6c 65 4c 6f 63 6b 29  ruptSrcFileLock)
22970 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22980 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
22990 69 66 28 20 21 73 72 63 64 62 32 20 7c 7c 20 70  if( !srcdb2 || p
229a0 53 72 63 46 69 6c 65 3d 3d 4e 55 4c 4c 20 7c 7c  SrcFile==NULL ||
229b0 20 70 53 72 63 46 69 6c 65 2d 3e 68 3c 30 29 7b   pSrcFile->h<0){
229c0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
229d0 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d 0a 20  _INTERNAL;.  }. 
229e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
229f0 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  OK ){.    goto e
22a00 6e 64 5f 72 65 70 6c 61 63 65 5f 64 61 74 61 62  nd_replace_datab
22a10 61 73 65 3b 0a 20 20 7d 0a 20 20 2f 2a 20 62 6f  ase;.  }.  /* bo
22a20 74 68 20 64 61 74 61 62 61 73 65 73 20 61 72 65  th databases are
22a30 20 6c 6f 63 6b 65 64 20 61 70 70 72 6f 70 72 69   locked appropri
22a40 61 74 65 6c 79 2c 20 63 6f 70 79 20 74 68 65 20  ately, copy the 
22a50 73 72 63 20 77 61 6c 20 6a 6f 75 72 6e 61 6c 20  src wal journal 
22a60 69 66 20 0a 20 20 20 2a 2a 20 6f 6e 65 20 65 78  if .   ** one ex
22a70 69 73 74 73 20 61 6e 64 20 74 68 65 6e 20 74 68  ists and then th
22a80 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73  e actual databas
22a90 65 20 66 69 6c 65 0a 20 20 20 2a 2f 0a 20 20 73  e file.   */.  s
22aa0 74 72 6c 63 70 79 28 73 72 63 57 61 6c 50 61 74  trlcpy(srcWalPat
22ab0 68 2c 20 70 53 72 63 46 69 6c 65 2d 3e 7a 50 61  h, pSrcFile->zPa
22ac0 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 2b 35  th, MAXPATHLEN+5
22ad0 29 3b 0a 20 20 73 74 72 6c 63 61 74 28 73 72 63  );.  strlcat(src
22ae0 57 61 6c 50 61 74 68 2c 20 22 2d 77 61 6c 22 2c  WalPath, "-wal",
22af0 20 4d 41 58 50 41 54 48 4c 45 4e 2b 35 29 3b 0a   MAXPATHLEN+5);.
22b00 20 20 73 72 63 57 61 6c 46 44 20 3d 20 6f 70 65    srcWalFD = ope
22b10 6e 28 73 72 63 57 61 6c 50 61 74 68 2c 20 4f 5f  n(srcWalPath, O_
22b20 52 44 4f 4e 4c 59 29 3b 0a 20 20 69 66 28 20 21  RDONLY);.  if( !
22b30 28 73 72 63 57 61 6c 46 44 3c 30 29 20 29 7b 0a  (srcWalFD<0) ){.
22b40 20 20 20 20 63 68 61 72 20 64 73 74 57 61 6c 50      char dstWalP
22b50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 35  ath[MAXPATHLEN+5
22b60 5d 3b 0a 20 20 20 20 69 6e 74 20 64 73 74 57 61  ];.    int dstWa
22b70 6c 46 44 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e  lFD = -1;.    in
22b80 74 20 70 72 6f 74 46 6c 61 67 73 20 3d 20 30 3b  t protFlags = 0;
22b90 0a 20 20 20 20 73 74 72 6c 63 70 79 28 64 73 74  .    strlcpy(dst
22ba0 57 61 6c 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e  WalPath, pFile->
22bb0 7a 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  zPath, MAXPATHLE
22bc0 4e 2b 35 29 3b 0a 20 20 20 20 73 74 72 6c 63 61  N+5);.    strlca
22bd0 74 28 64 73 74 57 61 6c 50 61 74 68 2c 20 22 2d  t(dstWalPath, "-
22be0 77 61 6c 22 2c 20 4d 41 58 50 41 54 48 4c 45 4e  wal", MAXPATHLEN
22bf0 2b 35 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 75  +5);..    rc = u
22c00 6e 69 78 4f 70 65 6e 43 68 69 6c 64 46 69 6c 65  nixOpenChildFile
22c10 28 64 73 74 57 61 6c 50 61 74 68 2c 20 4f 5f 52  (dstWalPath, O_R
22c20 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 53 51 4c  DWR|O_CREAT, SQL
22c30 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 2c 0a 20 20  ITE_OPEN_WAL,.  
22c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c50 20 20 20 20 20 20 20 20 20 70 72 6f 74 46 6c 61           protFla
22c60 67 73 2c 20 26 64 73 74 57 61 6c 46 44 29 3b 0a  gs, &dstWalFD);.
22c70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
22c80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
22c90 20 3d 20 63 6f 70 79 66 69 6c 65 5f 73 74 61 74   = copyfile_stat
22ca0 65 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  e_alloc();.     
22cb0 20 6c 73 65 65 6b 28 73 72 63 57 61 6c 46 44 2c   lseek(srcWalFD,
22cc0 20 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20   0, SEEK_SET);. 
22cd0 20 20 20 20 20 6c 73 65 65 6b 28 64 73 74 57 61       lseek(dstWa
22ce0 6c 46 44 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54  lFD, 0, SEEK_SET
22cf0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63 6f  );.      if( fco
22d00 70 79 66 69 6c 65 28 73 72 63 57 61 6c 46 44 2c  pyfile(srcWalFD,
22d10 20 64 73 74 57 61 6c 46 44 2c 20 73 2c 20 43 4f   dstWalFD, s, CO
22d20 50 59 46 49 4c 45 5f 44 41 54 41 29 20 29 7b 0a  PYFILE_DATA) ){.
22d30 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 3d          int err=
22d40 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 73  errno;.        s
22d50 77 69 74 63 68 28 65 72 72 29 20 7b 0a 20 20 20  witch(err) {.   
22d60 20 20 20 20 20 20 20 63 61 73 65 20 45 4e 4f 4d         case ENOM
22d70 45 4d 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  EM:.            
22d80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
22d90 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  M;.            b
22da0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
22db0 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
22dc0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
22dd0 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 29 3b  rno(pFile, err);
22de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
22df0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  = SQLITE_IOERR;.
22e00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22e10 7d 0a 20 20 20 20 20 20 63 6f 70 79 66 69 6c 65  }.      copyfile
22e20 5f 73 74 61 74 65 5f 66 72 65 65 28 73 29 3b 0a  _state_free(s);.
22e30 20 20 20 20 20 20 63 6c 6f 73 65 28 64 73 74 57        close(dstW
22e40 61 6c 46 44 29 3b 0a 20 20 20 20 7d 0a 20 20 20  alFD);.    }.   
22e50 20 63 6c 6f 73 65 28 73 72 63 57 61 6c 46 44 29   close(srcWalFD)
22e60 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
22e70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22e80 20 2f 2a 20 62 65 66 6f 72 65 20 77 65 20 63 6f   /* before we co
22e90 70 79 2c 20 65 6e 73 75 72 65 20 74 68 61 74 20  py, ensure that 
22ea0 74 68 65 20 66 69 6c 65 20 63 68 61 6e 67 65 20  the file change 
22eb0 63 6f 75 6e 74 65 72 20 77 69 6c 6c 20 62 65 20  counter will be 
22ec0 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20  modified */.    
22ed0 75 69 6e 74 33 32 5f 74 20 73 72 63 43 68 61 6e  uint32_t srcChan
22ee0 67 65 20 3d 20 30 3b 0a 20 20 20 20 75 69 6e 74  ge = 0;.    uint
22ef0 33 32 5f 74 20 64 73 74 43 68 61 6e 67 65 20 3d  32_t dstChange =
22f00 20 30 3b 0a 20 20 20 20 70 72 65 61 64 28 70 53   0;.    pread(pS
22f10 72 63 46 69 6c 65 2d 3e 68 2c 20 26 73 72 63 43  rcFile->h, &srcC
22f20 68 61 6e 67 65 2c 20 34 2c 20 32 34 29 3b 0a 20  hange, 4, 24);. 
22f30 20 20 20 70 72 65 61 64 28 70 46 69 6c 65 2d 3e     pread(pFile->
22f40 68 2c 20 26 64 73 74 43 68 61 6e 67 65 2c 20 34  h, &dstChange, 4
22f50 2c 20 32 34 29 3b 0a 20 20 20 20 0a 20 20 20 20  , 24);.    .    
22f60 2f 2a 20 63 6f 70 79 20 74 68 65 20 61 63 74 75  /* copy the actu
22f70 61 6c 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  al database */. 
22f80 20 20 20 73 20 3d 20 63 6f 70 79 66 69 6c 65 5f     s = copyfile_
22f90 73 74 61 74 65 5f 61 6c 6c 6f 63 28 29 3b 0a 20  state_alloc();. 
22fa0 20 20 20 6c 73 65 65 6b 28 70 53 72 63 46 69 6c     lseek(pSrcFil
22fb0 65 2d 3e 68 2c 20 30 2c 20 53 45 45 4b 5f 53 45  e->h, 0, SEEK_SE
22fc0 54 29 3b 0a 20 20 20 20 6c 73 65 65 6b 28 70 46  T);.    lseek(pF
22fd0 69 6c 65 2d 3e 68 2c 20 30 2c 20 53 45 45 4b 5f  ile->h, 0, SEEK_
22fe0 53 45 54 29 3b 0a 20 20 20 20 69 66 28 20 66 63  SET);.    if( fc
22ff0 6f 70 79 66 69 6c 65 28 70 53 72 63 46 69 6c 65  opyfile(pSrcFile
23000 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73  ->h, pFile->h, s
23010 2c 20 43 4f 50 59 46 49 4c 45 5f 44 41 54 41 29  , COPYFILE_DATA)
23020 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72   ){.      int er
23030 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 73  r=errno;.      s
23040 77 69 74 63 68 28 65 72 72 29 20 7b 0a 20 20 20  witch(err) {.   
23050 20 20 20 20 20 63 61 73 65 20 45 4e 4f 4d 45 4d       case ENOMEM
23060 3a 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  :.          rc =
23070 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
23080 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
23090 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
230a0 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65  .          store
230b0 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
230c0 20 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20   err);.         
230d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
230e0 52 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  RR;.      }.    
230f0 7d 0a 20 20 20 20 63 6f 70 79 66 69 6c 65 5f 73  }.    copyfile_s
23100 74 61 74 65 5f 66 72 65 65 28 73 29 3b 0a 20 20  tate_free(s);.  
23110 20 20 0a 20 20 20 20 69 66 20 28 73 72 63 43 68    .    if (srcCh
23120 61 6e 67 65 20 3d 3d 20 64 73 74 43 68 61 6e 67  ange == dstChang
23130 65 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6d 6f  e) {.      /* mo
23140 64 69 66 79 20 74 68 65 20 63 68 61 6e 67 65 20  dify the change 
23150 63 6f 75 6e 74 65 72 20 74 6f 20 66 6f 72 63 65  counter to force
23160 20 70 61 67 65 20 7a 65 72 6f 20 74 6f 20 62 65   page zero to be
23170 20 72 65 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 20   reloaded */.   
23180 20 20 20 64 73 74 43 68 61 6e 67 65 20 2b 2b 3b     dstChange ++;
23190 0a 20 20 20 20 20 20 70 77 72 69 74 65 28 70 46  .      pwrite(pF
231a0 69 6c 65 2d 3e 68 2c 20 26 64 73 74 43 68 61 6e  ile->h, &dstChan
231b0 67 65 2c 20 34 2c 20 32 34 29 3b 0a 20 20 20 20  ge, 4, 24);.    
231c0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 53 72  }.  }.  if( isSr
231d0 63 43 6f 72 72 75 70 74 20 29 7b 0a 20 20 20 20  cCorrupt ){.    
231e0 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65  sqlite3demo_supe
231f0 72 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28  runlock_corrupt(
23200 73 72 63 5f 66 69 6c 65 2c 20 63 6f 72 72 75 70  src_file, corrup
23210 74 53 72 63 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20  tSrcFileLock);. 
23220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 64   }else{.    /* d
23230 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6f 75  one with the sou
23240 72 63 65 20 64 62 20 73 6f 20 65 6e 64 20 74 68  rce db so end th
23250 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  e transaction */
23260 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65  .    sqlite3_exe
23270 63 28 73 72 63 64 62 32 2c 20 22 43 4f 4d 4d 49  c(srcdb2, "COMMI
23280 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  T", 0, 0, 0);.  
23290 7d 0a 20 20 2f 2a 20 7a 65 72 6f 20 6f 75 74 20  }.  /* zero out 
232a0 61 6e 79 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20  any old journal 
232b0 63 6c 75 74 74 65 72 20 2a 2f 0a 20 20 69 66 28  clutter */.  if(
232c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
232d0 7b 0a 20 20 20 20 69 6e 74 20 73 6b 69 70 57 41  {.    int skipWA
232e0 4c 20 3d 20 28 73 72 63 57 61 6c 46 44 3c 30 29  L = (srcWalFD<0)
232f0 3f 30 3a 31 3b 0a 20 20 20 20 75 6e 69 78 49 6e  ?0:1;.    unixIn
23300 76 61 6c 69 64 61 74 65 53 75 70 70 6f 72 74 46  validateSupportF
23310 69 6c 65 73 28 70 46 69 6c 65 2c 20 73 6b 69 70  iles(pFile, skip
23320 57 41 4c 29 3b 0a 20 20 7d 0a 20 20 0a 65 6e 64  WAL);.  }.  .end
23330 5f 72 65 70 6c 61 63 65 5f 64 61 74 61 62 61 73  _replace_databas
23340 65 3a 0a 20 20 69 66 28 20 70 53 72 63 42 74 72  e:.  if( pSrcBtr
23350 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ee ){.    sqlite
23360 33 5f 63 6c 6f 73 65 28 73 72 63 64 62 32 29 3b  3_close(srcdb2);
23370 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
23380 65 4c 65 61 76 65 28 70 53 72 63 42 74 72 65 65  eLeave(pSrcBtree
23390 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
233a0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 72 63  _mutex_leave(src
233b0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
233c0 28 20 69 73 44 73 74 43 6f 72 72 75 70 74 20 29  ( isDstCorrupt )
233d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 64 65 6d  {.    sqlite3dem
233e0 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 5f 63 6f  o_superunlock_co
233f0 72 72 75 70 74 28 69 64 2c 20 63 6f 72 72 75 70  rrupt(id, corrup
23400 74 44 73 74 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20  tDstFileLock);. 
23410 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
23420 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c  te3demo_superunl
23430 6f 63 6b 28 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a  ock(pLock);.  }.
23440 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
23450 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 49  define SQLITE_FI
23460 4c 45 5f 48 45 41 44 45 52 5f 4c 45 4e 20 31 36  LE_HEADER_LEN 16
23470 0a 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20  ./* Check for a 
23480 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c 6f 63 6b  conflicting lock
23490 2e 20 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75  .  If one is fou
234a0 6e 64 2c 20 70 72 69 6e 74 20 61 6e 20 74 68 69  nd, print an thi
234b0 73 0a 20 2a 2a 20 6f 6e 20 73 74 61 6e 64 61 72  s. ** on standar
234c0 64 20 6f 75 74 70 75 74 20 75 73 69 6e 67 20 74  d output using t
234d0 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67  he format string
234e0 20 67 69 76 65 6e 20 61 6e 64 20 72 65 74 75 72   given and retur
234f0 6e 20 31 2e 0a 20 2a 2a 20 49 66 20 74 68 65 72  n 1.. ** If ther
23500 65 20 61 72 65 20 6e 6f 20 63 6f 6e 66 6c 69 63  e are no conflic
23510 74 69 6e 67 20 6c 6f 63 6b 73 2c 20 72 65 74 75  ting locks, retu
23520 72 6e 20 30 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  rn 0.. */.static
23530 20 69 6e 74 20 75 6e 69 78 49 73 4c 6f 63 6b 65   int unixIsLocke
23540 64 28 0a 20 20 70 69 64 5f 74 20 70 69 64 2c 20  d(.  pid_t pid, 
23550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 49             /* PI
23560 44 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6c 6f  D to test for lo
23570 63 6b 20 6f 77 6e 65 72 20 2a 2f 0a 20 20 69 6e  ck owner */.  in
23580 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  t h,            
23590 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
235a0 72 69 70 74 6f 72 20 74 6f 20 63 68 65 63 6b 20  riptor to check 
235b0 2a 2f 0a 20 20 69 6e 74 20 74 79 70 65 2c 20 20  */.  int type,  
235c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f             /* F_
235d0 52 44 4c 43 4b 20 6f 72 20 46 5f 57 52 4c 43 4b  RDLCK or F_WRLCK
235e0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   */.  unsigned i
235f0 6e 74 20 69 4f 66 73 74 2c 20 20 20 2f 2a 20 46  nt iOfst,   /* F
23600 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
23610 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
23620 6e 65 64 20 69 6e 74 20 69 43 6e 74 2c 20 20 20  ned int iCnt,   
23630 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
23640 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 20  tes in the lock 
23650 72 61 6e 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  range */.  const
23660 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20 20 20   char *zType    
23670 20 2f 2a 20 54 79 70 65 20 6f 66 20 6c 6f 63 6b   /* Type of lock
23680 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
23690 66 6c 6f 63 6b 20 6c 6b 3b 0a 20 20 69 6e 74 20  flock lk;.  int 
236a0 65 72 72 3b 0a 20 20 0a 20 20 6d 65 6d 73 65 74  err;.  .  memset
236b0 28 26 6c 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (&lk, 0, sizeof(
236c0 6c 6b 29 29 3b 0a 20 20 6c 6b 2e 6c 5f 74 79 70  lk));.  lk.l_typ
236d0 65 20 3d 20 74 79 70 65 3b 0a 20 20 6c 6b 2e 6c  e = type;.  lk.l
236e0 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
236f0 45 54 3b 0a 20 20 6c 6b 2e 6c 5f 73 74 61 72 74  ET;.  lk.l_start
23700 20 3d 20 69 4f 66 73 74 3b 0a 20 20 6c 6b 2e 6c   = iOfst;.  lk.l
23710 5f 6c 65 6e 20 3d 20 69 43 6e 74 3b 0a 20 20 0a  _len = iCnt;.  .
23720 20 20 69 66 28 20 70 69 64 21 3d 53 51 4c 49 54    if( pid!=SQLIT
23730 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 41 4e 59 50  E_LOCKSTATE_ANYP
23740 49 44 20 29 7b 0a 23 69 66 6e 64 65 66 20 46 5f  ID ){.#ifndef F_
23750 47 45 54 4c 4b 50 49 44 0a 23 20 77 61 72 6e 69  GETLKPID.# warni
23760 6e 67 20 46 5f 47 45 54 4c 4b 50 49 44 20 75 6e  ng F_GETLKPID un
23770 64 65 66 69 6e 65 64 2c 20 5f 73 71 6c 69 74 65  defined, _sqlite
23780 33 5f 6c 6f 63 6b 73 74 61 74 65 20 66 61 6c 6c  3_lockstate fall
23790 69 6e 67 20 62 61 63 6b 20 74 6f 20 46 5f 47 45  ing back to F_GE
237a0 54 4c 4b 0a 20 20 20 20 65 72 72 20 3d 20 66 63  TLK.    err = fc
237b0 6e 74 6c 28 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  ntl(h, F_GETLK, 
237c0 26 6c 6b 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  &lk);.#else.    
237d0 6c 6b 2e 6c 5f 70 69 64 20 3d 20 70 69 64 3b 0a  lk.l_pid = pid;.
237e0 20 20 20 20 65 72 72 20 3d 20 66 63 6e 74 6c 28      err = fcntl(
237f0 68 2c 20 46 5f 47 45 54 4c 4b 50 49 44 2c 20 26  h, F_GETLKPID, &
23800 6c 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  lk);.#endif.  }e
23810 6c 73 65 7b 0a 20 20 20 20 65 72 72 20 3d 20 66  lse{.    err = f
23820 63 6e 74 6c 28 68 2c 20 46 5f 47 45 54 4c 4b 2c  cntl(h, F_GETLK,
23830 20 26 6c 6b 29 3b 0a 20 20 7d 0a 20 20 0a 20 20   &lk);.  }.  .  
23840 69 66 28 20 65 72 72 3d 3d 28 2d 31 29 20 29 7b  if( err==(-1) ){
23850 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
23860 65 72 72 2c 20 22 66 63 6e 74 6c 28 25 64 29 20  err, "fcntl(%d) 
23870 66 61 69 6c 65 64 3a 20 65 72 72 6e 6f 3d 25 64  failed: errno=%d
23880 5c 6e 22 2c 20 68 2c 20 65 72 72 6e 6f 29 3b 0a  \n", h, errno);.
23890 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
238a0 20 7d 0a 20 20 0a 20 20 69 66 28 20 6c 6b 2e 6c   }.  .  if( lk.l
238b0 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 26  _type!=F_UNLCK &
238c0 26 20 28 70 69 64 3d 3d 53 51 4c 49 54 45 5f 4c  & (pid==SQLITE_L
238d0 4f 43 4b 53 54 41 54 45 5f 41 4e 59 50 49 44 20  OCKSTATE_ANYPID 
238e0 7c 7c 20 6c 6b 2e 6c 5f 70 69 64 3d 3d 70 69 64  || lk.l_pid==pid
238f0 29 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ) ){.#ifdef SQLI
23900 54 45 5f 44 45 42 55 47 0a 20 20 20 20 66 70 72  TE_DEBUG.    fpr
23910 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
23920 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79 20 25 64   lock held by %d
23930 5c 6e 22 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74  \n", zType, (int
23940 29 6c 6b 2e 6c 5f 70 69 64 29 3b 0a 23 65 6e 64  )lk.l_pid);.#end
23950 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  if.    return 1;
23960 0a 20 20 7d 20 0a 20 20 72 65 74 75 72 6e 20 30  .  } .  return 0
23970 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
23980 75 6e 69 78 4c 6f 63 6b 73 74 61 74 65 50 69 64  unixLockstatePid
23990 28 75 6e 69 78 46 69 6c 65 20 2a 2c 20 70 69 64  (unixFile *, pid
239a0 5f 74 2c 20 69 6e 74 20 2a 29 3b 0a 0a 23 65 6e  _t, int *);..#en
239b0 64 69 66 20 2f 2a 20 28 53 51 4c 49 54 45 5f 45  dif /* (SQLITE_E
239c0 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e  NABLE_APPLE_SPI>
239d0 30 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  0) && defined(__
239e0 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 0a 0a 2f 2a  APPLE__) */.../*
239f0 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20  .** If *pArg is 
23a00 69 6e 69 74 69 61 6c 6c 79 20 6e 65 67 61 74 69  initially negati
23a10 76 65 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  ve then this is 
23a20 61 20 71 75 65 72 79 2e 20 20 53 65 74 20 2a 70  a query.  Set *p
23a30 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30  Arg to.** 1 or 0
23a40 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
23a50 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62 69 74  ether or not bit
23a60 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e   mask of pFile->
23a70 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73 65 74  ctrlFlags is set
23a80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67  ..**.** If *pArg
23a90 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68 65 6e   is 0 or 1, then
23aa0 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20 74 68   clear or set th
23ab0 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20 70 46  e mask bit of pF
23ac0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a  ile->ctrlFlags..
23ad0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
23ae0 6e 69 78 4d 6f 64 65 42 69 74 28 75 6e 69 78 46  nixModeBit(unixF
23af0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69  ile *pFile, unsi
23b00 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20  gned char mask, 
23b10 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69 66  int *pArg){.  if
23b20 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20 20  ( *pArg<0 ){.   
23b30 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d   *pArg = (pFile-
23b40 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73  >ctrlFlags & mas
23b50 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69  k)!=0;.  }else i
23b60 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b  f( (*pArg)==0 ){
23b70 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
23b80 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a  Flags &= ~mask;.
23b90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
23ba0 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  le->ctrlFlags |=
23bb0 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   mask;.  }.}../*
23bc0 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
23bd0 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69  tion */.static i
23be0 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61  nt unixGetTempna
23bf0 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  me(int nBuf, cha
23c00 72 20 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a  r *zBuf);../*.**
23c10 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64   Information and
23c20 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f   control of an o
23c30 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e  pen file handle.
23c40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
23c50 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  nixFileControl(s
23c60 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
23c70 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70   int op, void *p
23c80 41 72 67 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  Arg){.  unixFile
23c90 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
23ca0 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69 74 63  ile*)id;.  switc
23cb0 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
23cc0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
23cd0 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20  OCKSTATE: {.    
23ce0 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
23cf0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
23d00 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
23d10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
23d20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
23d30 46 43 4e 54 4c 5f 4c 41 53 54 5f 45 52 52 4e 4f  FCNTL_LAST_ERRNO
23d40 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
23d50 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c  )pArg = pFile->l
23d60 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
23d70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23d80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
23d90 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48   SQLITE_FCNTL_CH
23da0 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  UNK_SIZE: {.    
23db0 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b    pFile->szChunk
23dc0 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b   = *(int *)pArg;
23dd0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
23de0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
23df0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
23e00 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20  CNTL_SIZE_HINT: 
23e10 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  {.      int rc;.
23e20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
23e30 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
23e40 20 20 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c        rc = fcntl
23e50 53 69 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c 20  SizeHint(pFile, 
23e60 2a 28 69 36 34 20 2a 29 70 41 72 67 29 3b 0a 20  *(i64 *)pArg);. 
23e70 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
23e80 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
23e90 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
23ea0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
23eb0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53  QLITE_FCNTL_PERS
23ec0 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20  IST_WAL: {.     
23ed0 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69   unixModeBit(pFi
23ee0 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 45 52  le, UNIXFILE_PER
23ef0 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29  SIST_WAL, (int*)
23f00 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74  pArg);.      ret
23f10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
23f20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
23f30 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52  LITE_FCNTL_POWER
23f40 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20  SAFE_OVERWRITE: 
23f50 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65  {.      unixMode
23f60 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46  Bit(pFile, UNIXF
23f70 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29  ILE_PSOW, (int*)
23f80 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74  pArg);.      ret
23f90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
23fa0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
23fb0 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41  LITE_FCNTL_VFSNA
23fc0 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68  ME: {.      *(ch
23fd0 61 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69  ar**)pArg = sqli
23fe0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
23ff0 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a  , pFile->pVfs->z
24000 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
24010 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
24020 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
24030 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46  LITE_FCNTL_TEMPF
24040 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20  ILENAME: {.     
24050 20 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20   char *zTFile = 
24060 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
24070 28 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d  ( pFile->pVfs->m
24080 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 20  xPathname );.   
24090 20 20 20 69 66 28 20 7a 54 46 69 6c 65 20 29 7b     if( zTFile ){
240a0 0a 20 20 20 20 20 20 20 20 75 6e 69 78 47 65 74  .        unixGet
240b0 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e  Tempname(pFile->
240c0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
240d0 2c 20 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20 20  , zTFile);.     
240e0 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
240f0 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20   = zTFile;.     
24100 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
24110 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
24120 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
24130 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44  _FCNTL_HAS_MOVED
24140 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
24150 29 70 41 72 67 20 3d 20 66 69 6c 65 48 61 73 4d  )pArg = fileHasM
24160 6f 76 65 64 28 70 46 69 6c 65 29 3b 0a 20 20 20  oved(pFile);.   
24170 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24180 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53  _OK;.    }.#if S
24190 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
241a0 49 5a 45 3e 30 0a 20 20 20 20 63 61 73 65 20 53  IZE>0.    case S
241b0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50  QLITE_FCNTL_MMAP
241c0 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69  _SIZE: {.      i
241d0 36 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28  64 newLimit = *(
241e0 69 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  i64*)pArg;.     
241f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24200 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  _OK;.      if( n
24210 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33 47  ewLimit>sqlite3G
24220 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d  lobalConfig.mxMm
24230 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  ap ){.        ne
24240 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  wLimit = sqlite3
24250 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d  GlobalConfig.mxM
24260 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  map;.      }.   
24270 20 20 20 2a 28 69 36 34 2a 29 70 41 72 67 20 3d     *(i64*)pArg =
24280 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
24290 4d 61 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  Max;.      if( n
242a0 65 77 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e 65  ewLimit>=0 && ne
242b0 77 4c 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e 6d  wLimit!=pFile->m
242c0 6d 61 70 53 69 7a 65 4d 61 78 20 26 26 20 70 46  mapSizeMax && pF
242d0 69 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  ile->nFetchOut==
242e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  0 ){.        pFi
242f0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  le->mmapSizeMax 
24300 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20 20  = newLimit;.    
24310 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d      if( pFile->m
24320 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20  mapSize>0 ){.   
24330 20 20 20 20 20 20 20 75 6e 69 78 55 6e 6d 61 70         unixUnmap
24340 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 20  file(pFile);.   
24350 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
24360 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 2d  Mapfile(pFile, -
24370 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
24380 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
24390 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e  rn rc;.    }.#en
243a0 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
243b0 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54  E_DEBUG.    /* T
243c0 68 65 20 70 61 67 65 72 20 63 61 6c 6c 73 20 74  he pager calls t
243d0 68 69 73 20 6d 65 74 68 6f 64 20 74 6f 20 73 69  his method to si
243e0 67 6e 61 6c 20 74 68 61 74 20 69 74 20 68 61 73  gnal that it has
243f0 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 20 72   done.    ** a r
24400 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68 61 74  ollback and that
24410 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
24420 20 74 68 65 72 65 66 6f 72 65 20 75 6e 63 68 61   therefore uncha
24430 6e 67 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20  nged and.    ** 
24440 69 74 20 68 65 6e 63 65 20 69 74 20 69 73 20 4f  it hence it is O
24450 4b 20 66 6f 72 20 74 68 65 20 74 72 61 6e 73 61  K for the transa
24460 63 74 69 6f 6e 20 63 68 61 6e 67 65 20 63 6f 75  ction change cou
24470 6e 74 65 72 20 74 6f 20 62 65 0a 20 20 20 20 2a  nter to be.    *
24480 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20  * unchanged..   
24490 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
244a0 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
244b0 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20 20 20 20  HANGED: {.      
244c0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
244d0 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20  >dbUpdate = 0;. 
244e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
244f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e  TE_OK;.    }.#en
24500 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
24510 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
24520 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
24530 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61  _APPLE__).    ca
24540 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
24550 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
24560 45 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  E:.    case SQLI
24570 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43  TE_FCNTL_GET_LOC
24580 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20  KPROXYFILE: {.  
24590 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79      return proxy
245a0 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f  FileControl(id,o
245b0 70 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23  p,pArg);.    }.#
245c0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
245d0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
245e0 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
245f0 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 23 69  __APPLE__) */.#i
24600 66 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  f (SQLITE_ENABLE
24610 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26  _APPLE_SPI>0) &&
24620 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
24630 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c  __).    case SQL
24640 49 54 45 5f 46 43 4e 54 4c 5f 54 52 55 4e 43 41  ITE_FCNTL_TRUNCA
24650 54 45 5f 44 41 54 41 42 41 53 45 3a 20 7b 0a 20  TE_DATABASE: {. 
24660 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78       return unix
24670 54 72 75 6e 63 61 74 65 44 61 74 61 62 61 73 65  TruncateDatabase
24680 28 70 46 69 6c 65 2c 20 28 70 41 72 67 20 3f 20  (pFile, (pArg ? 
24690 28 2a 28 69 6e 74 20 2a 29 70 41 72 67 29 20 3a  (*(int *)pArg) :
246a0 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0));.    }.    
246b0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
246c0 4c 5f 52 45 50 4c 41 43 45 5f 44 41 54 41 42 41  L_REPLACE_DATABA
246d0 53 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  SE: {.      retu
246e0 72 6e 20 75 6e 69 78 52 65 70 6c 61 63 65 44 61  rn unixReplaceDa
246f0 74 61 62 61 73 65 28 70 46 69 6c 65 2c 20 28 73  tabase(pFile, (s
24700 71 6c 69 74 65 33 20 2a 29 70 41 72 67 29 3b 0a  qlite3 *)pArg);.
24710 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
24720 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b  QLITE_FCNTL_LOCK
24730 53 54 41 54 45 5f 50 49 44 3a 20 7b 0a 20 20 20  STATE_PID: {.   
24740 20 20 20 4c 6f 63 6b 73 74 61 74 65 50 49 44 20     LockstatePID 
24750 2a 70 4c 6f 63 6b 73 74 61 74 65 3b 0a 20 20 20  *pLockstate;.   
24760 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
24770 20 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67   .      if( pArg
24780 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  ==NULL ){.      
24790 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
247a0 4d 49 53 55 53 45 3b 0a 20 20 20 20 20 20 7d 0a  MISUSE;.      }.
247b0 20 20 20 20 20 20 70 4c 6f 63 6b 73 74 61 74 65        pLockstate
247c0 20 3d 20 28 4c 6f 63 6b 73 74 61 74 65 50 49 44   = (LockstatePID
247d0 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72   *)pArg;.      r
247e0 63 20 3d 20 75 6e 69 78 4c 6f 63 6b 73 74 61 74  c = unixLockstat
247f0 65 50 69 64 28 70 46 69 6c 65 2c 20 70 4c 6f 63  ePid(pFile, pLoc
24800 6b 73 74 61 74 65 2d 3e 70 69 64 2c 20 26 28 70  kstate->pid, &(p
24810 4c 6f 63 6b 73 74 61 74 65 2d 3e 73 74 61 74 65  Lockstate->state
24820 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
24830 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 20   rc;.    }.     
24840 20 0a 23 65 6e 64 69 66 20 2f 2a 20 28 53 51 4c   .#endif /* (SQL
24850 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45  ITE_ENABLE_APPLE
24860 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e  _SPI>0) && defin
24870 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f  ed(__APPLE__) */
24880 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
24890 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d  LITE_NOTFOUND;.}
248a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
248b0 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  he sector size i
248c0 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75  n bytes of the u
248d0 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20  nderlying block 
248e0 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68  device for.** th
248f0 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
24900 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74  . This is almost
24910 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
24920 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a  s, but may be.**
24930 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65   larger for some
24940 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20   devices..**.** 
24950 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75  SQLite code assu
24960 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  mes this functio
24970 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49  n cannot fail. I
24980 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74  t also assumes t
24990 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69  hat.** if two fi
249a0 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20  les are created 
249b0 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  in the same file
249c0 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72  -system director
249d0 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74  y (i.e..** a dat
249e0 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f  abase and its jo
249f0 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74  urnal file) that
24a00 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
24a10 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20   will be the.** 
24a20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a  same for both..*
24a30 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 51 4e 58 4e  /.#ifndef __QNXN
24a40 54 4f 5f 5f 20 0a 73 74 61 74 69 63 20 69 6e 74  TO__ .static int
24a50 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28   unixSectorSize(
24a60 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
24a70 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44  tUsed){.  UNUSED
24a80 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
24a90 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ed);.  return SQ
24aa0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43  LITE_DEFAULT_SEC
24ab0 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 23 65 6e 64  TOR_SIZE;.}.#end
24ac0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
24ad0 6c 6c 6f 77 69 6e 67 20 76 65 72 73 69 6f 6e 20  llowing version 
24ae0 6f 66 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a  of unixSectorSiz
24af0 65 28 29 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  e() is optimized
24b00 20 66 6f 72 20 51 4e 58 2e 0a 2a 2f 0a 23 69 66   for QNX..*/.#if
24b10 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 23  def __QNXNTO__.#
24b20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 64 63 6d  include <sys/dcm
24b30 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63 6c 75 64  d_blk.h>.#includ
24b40 65 20 3c 73 79 73 2f 73 74 61 74 76 66 73 2e 68  e <sys/statvfs.h
24b50 3e 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  >.static int uni
24b60 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  xSectorSize(sqli
24b70 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
24b80 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
24b90 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
24ba0 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  ;.  if( pFile->s
24bb0 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20 30 20 29  ectorSize == 0 )
24bc0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
24bd0 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20  tvfs fsInfo;.   
24be0 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 65 74 20      .    /* Set 
24bf0 64 65 66 61 75 6c 74 73 20 66 6f 72 20 6e 6f 6e  defaults for non
24c00 2d 73 75 70 70 6f 72 74 65 64 20 66 69 6c 65 73  -supported files
24c10 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20 20 70 46  ystems */.    pF
24c20 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
24c30 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
24c40 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
24c50 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
24c60 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
24c70 20 30 3b 0a 20 20 20 20 69 66 28 20 66 73 74 61   0;.    if( fsta
24c80 74 76 66 73 28 70 46 69 6c 65 2d 3e 68 2c 20 26  tvfs(pFile->h, &
24c90 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20  fsInfo) == -1 ) 
24ca0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
24cb0 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
24cc0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
24cd0 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e   !strcmp(fsInfo.
24ce0 66 5f 62 61 73 65 74 79 70 65 2c 20 22 74 6d 70  f_basetype, "tmp
24cf0 22 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69  ") ) {.      pFi
24d00 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
24d10 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
24d20 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
24d30 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
24d40 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51  ics =.        SQ
24d50 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
24d60 43 34 4b 20 7c 20 20 20 20 20 20 20 2f 2a 20 41  C4K |       /* A
24d70 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  ll ram filesyste
24d80 6d 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f  m writes are ato
24d90 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  mic */.        S
24da0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
24db0 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20  _APPEND |    /* 
24dc0 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  growing the file
24dd0 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
24de0 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20  until.          
24df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e00 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
24e10 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64  he write succeed
24e20 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  s */.        SQL
24e30 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
24e40 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68  TIAL |     /* Th
24e50 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  e ram filesystem
24e60 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65   has no write be
24e70 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  hind.           
24e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e90 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
24ea0 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a   it is ordered *
24eb0 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
24ec0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73 74   }else if( strst
24ed0 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74  r(fsInfo.f_baset
24ee0 79 70 65 2c 20 22 65 74 66 73 22 29 20 29 7b 0a  ype, "etfs") ){.
24ef0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
24f00 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
24f10 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
24f20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
24f30 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
24f40 20 20 20 20 20 20 20 2f 2a 20 65 74 66 73 20 63         /* etfs c
24f50 6c 75 73 74 65 72 20 73 69 7a 65 20 77 72 69 74  luster size writ
24f60 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f  es are atomic */
24f70 0a 20 20 20 20 20 20 20 20 28 70 46 69 6c 65 2d  .        (pFile-
24f80 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31  >sectorSize / 51
24f90 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  2 * SQLITE_IOCAP
24fa0 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c 0a 20 20  _ATOMIC512) |.  
24fb0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
24fc0 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c  AP_SAFE_APPEND |
24fd0 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74      /* growing t
24fe0 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
24ff0 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20   occur until.   
25000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25020 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20     ** the write 
25030 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20  succeeds */.    
25040 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
25050 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20  _SEQUENTIAL |   
25060 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c    /* The ram fil
25070 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77  esystem has no w
25080 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20  rite behind.    
25090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250b0 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72    ** so it is or
250c0 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  dered */.       
250d0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
250e0 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  ( !strcmp(fsInfo
250f0 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71 6e  .f_basetype, "qn
25100 78 36 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46  x6") ){.      pF
25110 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
25120 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65  = fsInfo.f_bsize
25130 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  ;.      pFile->d
25140 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
25150 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53  tics =.        S
25160 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
25170 49 43 20 7c 20 20 20 20 20 20 20 20 20 2f 2a 20  IC |         /* 
25180 41 6c 6c 20 66 69 6c 65 73 79 73 74 65 6d 20 77  All filesystem w
25190 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63  rites are atomic
251a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
251b0 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
251c0 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f  PEND |    /* gro
251d0 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f  wing the file do
251e0 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74  es not occur unt
251f0 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  il.             
25200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25210 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
25220 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a  write succeeds *
25230 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
25240 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
25250 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
25260 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
25270 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
25280 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
25290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252a0 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
252b0 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
252c0 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
252d0 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d 70 28  lse if( !strcmp(
252e0 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70  fsInfo.f_basetyp
252f0 65 2c 20 22 71 6e 78 34 22 29 20 29 7b 0a 20 20  e, "qnx4") ){.  
25300 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
25310 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
25320 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
25330 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
25340 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
25350 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74       /* full bit
25360 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66  set of atomics f
25370 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73  rom max sector s
25380 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20  ize and smaller 
25390 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70 46 69  */.        ((pFi
253a0 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f  le->sectorSize /
253b0 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f   512 * SQLITE_IO
253c0 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c  CAP_ATOMIC512) <
253d0 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20  < 1) - 2 |.     
253e0 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
253f0 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20  SEQUENTIAL |    
25400 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65   /* The ram file
25410 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72  system has no wr
25420 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20  ite behind.     
25430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25450 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64   ** so it is ord
25460 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
25470 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
25480 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66   strstr(fsInfo.f
25490 5f 62 61 73 65 74 79 70 65 2c 20 22 64 6f 73 22  _basetype, "dos"
254a0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
254b0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66  ->sectorSize = f
254c0 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20  sInfo.f_bsize;. 
254d0 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69       pFile->devi
254e0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
254f0 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66  s =.        /* f
25500 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74  ull bitset of at
25510 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73  omics from max s
25520 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73  ector size and s
25530 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20  maller */.      
25540 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f    ((pFile->secto
25550 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51  rSize / 512 * SQ
25560 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
25570 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20  C512) << 1) - 2 
25580 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  |.        SQLITE
25590 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
255a0 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
255b0 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
255c0 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
255d0 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
255e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255f0 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
25600 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
25610 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
25620 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
25630 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
25640 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
25650 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41    SQLITE_IOCAP_A
25660 54 4f 4d 49 43 35 31 32 20 7c 20 20 20 20 20 20  TOMIC512 |      
25670 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65 20 61 74  /* blocks are at
25680 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20  omic */.        
25690 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
256a0 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a  E_APPEND |    /*
256b0 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c   growing the fil
256c0 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  e does not occur
256d0 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20   until.         
256e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
25700 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65  the write succee
25710 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ds */.        0;
25720 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
25730 4c 61 73 74 20 63 68 61 6e 63 65 20 76 65 72 69  Last chance veri
25740 66 69 63 61 74 69 6f 6e 2e 20 20 49 66 20 74 68  fication.  If th
25750 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
25760 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  n't a multiple o
25770 66 20 35 31 32 0a 20 20 2a 2a 20 74 68 65 6e 20  f 512.  ** then 
25780 69 74 20 69 73 6e 27 74 20 76 61 6c 69 64 2e 2a  it isn't valid.*
25790 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  /.  if( pFile->s
257a0 65 63 74 6f 72 53 69 7a 65 20 25 20 35 31 32 20  ectorSize % 512 
257b0 21 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  != 0 ){.    pFil
257c0 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
257d0 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20  eristics = 0;.  
257e0 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
257f0 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
25800 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
25810 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
25820 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
25830 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f  ;.}.#endif /* __
25840 51 4e 58 4e 54 4f 5f 5f 20 2a 2f 0a 0a 2f 2a 0a  QNXNTO__ */../*.
25850 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  ** Return the de
25860 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
25870 74 69 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c  tics for the fil
25880 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 56 46  e..**.** This VF
25890 53 20 69 73 20 73 65 74 20 75 70 20 74 6f 20 72  S is set up to r
258a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43  eturn SQLITE_IOC
258b0 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
258c0 52 57 52 49 54 45 20 62 79 20 64 65 66 61 75 6c  RWRITE by defaul
258d0 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74  t..** However, t
258e0 68 61 74 20 63 68 6f 69 63 65 20 69 73 20 63 6f  hat choice is co
258f0 6e 74 72 6f 76 65 72 73 69 61 6c 20 73 69 6e 63  ntroversial sinc
25900 65 20 74 65 63 68 6e 69 63 61 6c 6c 79 20 74 68  e technically th
25910 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20  e underlying.** 
25920 66 69 6c 65 20 73 79 73 74 65 6d 20 64 6f 65 73  file system does
25930 20 6e 6f 74 20 61 6c 77 61 79 73 20 70 72 6f 76   not always prov
25940 69 64 65 20 70 6f 77 65 72 73 61 66 65 20 6f 76  ide powersafe ov
25950 65 72 77 72 69 74 65 73 2e 20 20 28 49 6e 20 6f  erwrites.  (In o
25960 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61  ther.** words, a
25970 66 74 65 72 20 61 20 70 6f 77 65 72 2d 6c 6f 73  fter a power-los
25980 73 20 65 76 65 6e 74 2c 20 70 61 72 74 73 20 6f  s event, parts o
25990 66 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20  f the file that 
259a0 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20 77 72  were never.** wr
259b0 69 74 74 65 6e 20 6d 69 67 68 74 20 65 6e 64 20  itten might end 
259c0 75 70 20 62 65 69 6e 67 20 61 6c 74 65 72 65 64  up being altered
259d0 2e 29 20 20 48 6f 77 65 76 65 72 2c 20 6e 6f 6e  .)  However, non
259e0 2d 50 53 4f 57 20 62 65 68 61 76 69 6f 72 20 69  -PSOW behavior i
259f0 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72 79 20  s very,.** very 
25a00 72 61 72 65 2e 20 20 41 6e 64 20 61 73 73 65 72  rare.  And asser
25a10 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65 73 20  ting PSOW makes 
25a20 61 20 6c 61 72 67 65 20 72 65 64 75 63 74 69 6f  a large reductio
25a30 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a  n in the amount.
25a40 2a 2a 20 6f 66 20 72 65 71 75 69 72 65 64 20 49  ** of required I
25a50 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e  /O for journalin
25a60 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74 20 6f  g, since a lot o
25a70 66 20 70 61 64 64 69 6e 67 20 69 73 20 65 6c 69  f padding is eli
25a80 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48 65 6e  minated..**  Hen
25a90 63 65 2c 20 77 68 69 6c 65 20 50 4f 57 45 52 53  ce, while POWERS
25aa0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 69 73  AFE_OVERWRITE is
25ab0 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 2c 20   on by default, 
25ac0 74 68 65 72 65 20 69 73 20 61 20 66 69 6c 65 2d  there is a file-
25ad0 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c  control.** avail
25ae0 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20  able to turn it 
25af0 6f 66 66 20 61 6e 64 20 55 52 49 20 71 75 65 72  off and URI quer
25b00 79 20 70 61 72 61 6d 65 74 65 72 20 61 76 61 69  y parameter avai
25b10 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74  lable to turn it
25b20 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   off..*/.static 
25b30 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68  int unixDeviceCh
25b40 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
25b50 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
25b60 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d  .  unixFile *p =
25b70 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
25b80 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69    int rc = 0;.#i
25b90 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a  fdef __QNXNTO__.
25ba0 20 20 69 66 28 20 70 2d 3e 73 65 63 74 6f 72 53    if( p->sectorS
25bb0 69 7a 65 3d 3d 30 20 29 20 75 6e 69 78 53 65 63  ize==0 ) unixSec
25bc0 74 6f 72 53 69 7a 65 28 69 64 29 3b 0a 20 20 72  torSize(id);.  r
25bd0 63 20 3d 20 70 2d 3e 64 65 76 69 63 65 43 68 61  c = p->deviceCha
25be0 72 61 63 74 65 72 69 73 74 69 63 73 3b 0a 23 65  racteristics;.#e
25bf0 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 63 74  ndif.  if( p->ct
25c00 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
25c10 4c 45 5f 50 53 4f 57 20 29 7b 0a 20 20 20 20 72  LE_PSOW ){.    r
25c20 63 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41  c |= SQLITE_IOCA
25c30 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
25c40 57 52 49 54 45 3b 0a 20 20 7d 0a 20 20 72 65 74  WRITE;.  }.  ret
25c50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21  urn rc;.}..#if !
25c60 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
25c70 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
25c80 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
25c90 3e 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  >0../*.** Return
25ca0 20 74 68 65 20 73 79 73 74 65 6d 20 70 61 67 65   the system page
25cb0 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   size..**.** Thi
25cc0 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
25cd0 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20  d not be called 
25ce0 64 69 72 65 63 74 6c 79 20 62 79 20 6f 74 68 65  directly by othe
25cf0 72 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66  r code in this f
25d00 69 6c 65 2e 20 0a 2a 2a 20 49 6e 73 74 65 61 64  ile. .** Instead
25d10 2c 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 63  , it should be c
25d20 61 6c 6c 65 64 20 76 69 61 20 6d 61 63 72 6f 20  alled via macro 
25d30 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 2e  osGetpagesize().
25d40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
25d50 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65 28 76  nixGetpagesize(v
25d60 6f 69 64 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  oid){.#if OS_VXW
25d70 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 31 30  ORKS.  return 10
25d80 32 34 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  24;.#elif define
25d90 64 28 5f 42 53 44 5f 53 4f 55 52 43 45 29 0a 20  d(_BSD_SOURCE). 
25da0 20 72 65 74 75 72 6e 20 67 65 74 70 61 67 65 73   return getpages
25db0 69 7a 65 28 29 3b 0a 23 65 6c 73 65 0a 20 20 72  ize();.#else.  r
25dc0 65 74 75 72 6e 20 28 69 6e 74 29 73 79 73 63 6f  eturn (int)sysco
25dd0 6e 66 28 5f 53 43 5f 50 41 47 45 53 49 5a 45 29  nf(_SC_PAGESIZE)
25de0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 65 6e 64  ;.#endif.}..#end
25df0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
25e00 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20  QLITE_OMIT_WAL) 
25e10 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  || SQLITE_MAX_MM
25e20 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 23 69  AP_SIZE>0 */..#i
25e30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
25e40 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  T_WAL../*.** Obj
25e50 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72  ect used to repr
25e60 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20  esent an shared 
25e70 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20  memory buffer.  
25e80 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74  .**.** When mult
25e90 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
25ea0 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
25eb0 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65  ame wal-index, e
25ec0 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61  ach thread.** ha
25ed0 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68  s its own unixSh
25ee0 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68  m object, but th
25ef0 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20  ey all point to 
25f00 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63  a single instanc
25f10 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69  e.** of this uni
25f20 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e  xShmNode object.
25f30 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
25f40 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78  , each wal-index
25f50 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e   is opened.** on
25f60 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63  ly once per proc
25f70 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ess..**.** Each 
25f80 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
25f90 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20  ct is connected 
25fa0 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78  to a single unix
25fb0 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
25fc0 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f  ..** We could co
25fd0 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65  alesce this obje
25fe0 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64  ct into unixInod
25ff0 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20  eInfo, but that 
26000 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76  would mean.** ev
26010 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68  ery open file th
26020 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
26030 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69  shared memory (i
26040 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
26050 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65  ost.** open file
26060 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f  s) would have to
26070 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68   carry around th
26080 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  is extra informa
26090 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65  tion.  So.** the
260a0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
260b0 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61  bject contains a
260c0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
260d0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
260e0 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75  ect.** and the u
260f0 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
26100 74 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c  t is created onl
26110 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a  y when needed..*
26120 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65  *.** unixMutexHe
26130 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
26140 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
26150 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
26160 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
26170 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
26180 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
26190 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
261a0 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
261b0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
261c0 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  ng fields are re
261d0 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ad-only after th
261e0 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
261f0 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20  ted:.** .**     
26200 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
26210 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
26220 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e  her unixShmNode.
26230 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
26240 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64  ld or unixShmNod
26250 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a  e.nRef==0 and.**
26260 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
26270 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
26280 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
26290 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
262a0 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
262b0 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  cture..*/.struct
262c0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20   unixShmNode {. 
262d0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
262e0 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75  pInode;     /* u
262f0 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61  nixInodeInfo tha
26300 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20  t owns this SHM 
26310 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  node */.  sqlite
26320 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20  3_mutex *mutex; 
26330 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f       /* Mutex to
26340 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a   access this obj
26350 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ect */.  char *z
26360 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
26370 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
26380 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20  he mmapped file 
26390 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20  */.  int h;     
263a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263b0 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
263c0 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  criptor */.  int
263d0 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20   szRegion;      
263e0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
263f0 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
26400 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31   regions */.  u1
26410 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  6 nRegion;      
26420 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
26430 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69   of array apRegi
26440 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52 65 61  on */.  u8 isRea
26450 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  donly;          
26460 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
26470 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68 61  ad-only */.  cha
26480 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20  r **apRegion;   
26490 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
264a0 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72 65   of mapped share
264b0 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
264c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
264d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
264f0 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  ixShm objects po
26500 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
26510 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69  /.  unixShm *pFi
26520 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rst;           /
26530 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62  * All unixShm ob
26540 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
26550 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66  o this */.#ifdef
26560 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
26570 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  u8 exclMask;    
26580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
26590 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
265a0 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
265b0 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20  u8 sharedMask;  
265c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
265d0 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
265e0 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20  ks held */.  u8 
265f0 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20  nextShmId;      
26600 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
26610 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68  available unixSh
26620 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65  m.id value */.#e
26630 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53  ndif.};../*.** S
26640 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e  tructure used in
26650 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73  ternally by this
26660 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74   VFS to record t
26670 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a  he state of an.*
26680 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65  * open shared me
26690 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  mory connection.
266a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
266b0 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
266c0 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
266d0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
266e0 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61  created and.** a
266f0 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65  re read-only the
26700 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20  reafter:.**.**  
26710 20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a    unixShm.pFile.
26720 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64  **    unixShm.id
26730 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72  .**.** All other
26740 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
26750 2f 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e 69  /write.  The uni
26760 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65  xShm.pFile->mute
26770 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  x must be held.*
26780 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e  * while accessin
26790 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65  g any read/write
267a0 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75   fields..*/.stru
267b0 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75  ct unixShm {.  u
267c0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
267d0 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68 65  Node;     /* The
267e0 20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69 78   underlying unix
267f0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a  ShmNode object *
26800 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65  /.  unixShm *pNe
26810 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  xt;            /
26820 2a 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20 77  * Next unixShm w
26830 69 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e 69  ith the same uni
26840 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38  xShmNode */.  u8
26850 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20   hasMutex;      
26860 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
26870 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   if holding the 
26880 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65  unixShmNode mute
26890 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20 20  x */.  u8 id;   
268a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268b0 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20    /* Id of this 
268c0 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 69  connection withi
268d0 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64  n its unixShmNod
268e0 65 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65  e */.  u16 share
268f0 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  dMask;          
26900 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61    /* Mask of sha
26910 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  red locks held *
26920 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b  /.  u16 exclMask
26930 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
26940 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73  * Mask of exclus
26950 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  ive locks held *
26960 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  /.};../*.** Cons
26970 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c  tants used for l
26980 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e  ocking.*/.#defin
26990 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20  e UNIX_SHM_BASE 
269a0 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48    ((22+SQLITE_SH
269b0 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20  M_NLOCK)*4)     
269c0 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63      /* first loc
269d0 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e  k byte */.#defin
269e0 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20  e UNIX_SHM_DMS  
269f0 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45    (UNIX_SHM_BASE
26a00 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
26a10 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73  K)  /* deadman s
26a20 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  witch */../*.** 
26a30 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69  Apply posix advi
26a40 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61  sory locks for a
26a50 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66  ll bytes from of
26a60 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b  st through ofst+
26a70 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73  n-1..**.** Locks
26a80 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61   block if the ma
26a90 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e  sk is exactly UN
26aa0 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65  IX_SHM_C and are
26ab0 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a   non-blocking.**
26ac0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
26ad0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
26ae0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75  mSystemLock(.  u
26af0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
26b00 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f        /* Open co
26b10 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nnection to the 
26b20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  WAL file */.  in
26b30 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20  t lockType,     
26b40 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c       /* F_UNLCK,
26b50 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57   F_RDLCK, or F_W
26b60 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  RLCK */.  int of
26b70 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
26b80 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
26b90 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61  f the locking ra
26ba0 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20  nge */.  int n  
26bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bc0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
26bd0 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  es to lock */.){
26be0 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
26bf0 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 41 70 70  pShmNode; /* App
26c00 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73  ly locks to this
26c10 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d   open shared-mem
26c20 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  ory segment */. 
26c30 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b   struct flock f;
26c40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
26c50 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
26c60 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  cking structure 
26c70 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
26c80 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52  LITE_OK;    /* R
26c90 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20  esult code form 
26ca0 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a  fcntl() */..  /*
26cb0 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75   Access to the u
26cc0 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
26cd0 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20  t is serialized 
26ce0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f  by the caller */
26cf0 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 46  .  pShmNode = pF
26d00 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  ile->pInode->pSh
26d10 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  mNode;.  assert(
26d20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
26d30 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  eld(pShmNode->mu
26d40 74 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65  tex) || pShmNode
26d50 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->nRef==0 );..  
26d60 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20  /* Shared locks 
26d70 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20  never span more 
26d80 74 68 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f  than one byte */
26d90 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
26da0 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52  || lockType!=F_R
26db0 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  DLCK );..  /* Lo
26dc0 63 6b 73 20 61 72 65 20 77 69 74 68 69 6e 20 72  cks are within r
26dd0 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  ange */.  assert
26de0 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 3d 53 51 4c  ( n>=1 && n<=SQL
26df0 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b  ITE_SHM_NLOCK );
26e00 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ..  if( pShmNode
26e10 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ->h>=0 ){.    /*
26e20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
26e30 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65  locking paramete
26e40 72 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  rs */.    memset
26e50 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66  (&f, 0, sizeof(f
26e60 29 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65  ));.    f.l_type
26e70 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20   = lockType;.   
26e80 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45   f.l_whence = SE
26e90 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f  EK_SET;.    f.l_
26ea0 73 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20  start = ofst;.  
26eb0 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a    f.l_len = n;..
26ec0 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c      rc = osFcntl
26ed0 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f  (pShmNode->h, F_
26ee0 53 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20 20 20  SETLK, &f);.    
26ef0 72 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29 20  rc = (rc!=(-1)) 
26f00 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51  ? SQLITE_OK : SQ
26f10 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a  LITE_BUSY;.  }..
26f20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
26f30 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74  global lock stat
26f40 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20 74  e and do debug t
26f50 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66  racing */.#ifdef
26f60 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
26f70 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53  { u16 mask;.  OS
26f80 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
26f90 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 6f   "));.  mask = o
26fa0 66 73 74 3e 33 31 20 3f 20 30 78 66 66 66 66 20  fst>31 ? 0xffff 
26fb0 3a 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20  : (1<<(ofst+n)) 
26fc0 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69  - (1<<ofst);.  i
26fd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26fe0 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b   ){.    if( lock
26ff0 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  Type==F_UNLCK ){
27000 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
27010 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20  "unlock %d ok", 
27020 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53  ofst));.      pS
27030 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
27040 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
27050 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
27060 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
27070 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f      }else if( lo
27080 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  ckType==F_RDLCK 
27090 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
270a0 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20  (("read-lock %d 
270b0 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
270c0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
270d0 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
270e0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
270f0 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61  sharedMask |= ma
27100 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  sk;.    }else{. 
27110 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63       assert( loc
27120 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  kType==F_WRLCK )
27130 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
27140 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20  ("write-lock %d 
27150 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
27160 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
27170 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
27180 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
27190 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61  haredMask &= ~ma
271a0 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  sk;.    }.  }els
271b0 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54  e{.    if( lockT
271c0 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
271d0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
271e0 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64  unlock %d failed
271f0 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d  ", ofst));.    }
27200 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70  else if( lockTyp
27210 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
27220 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65      OSTRACE(("re
27230 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29  ad-lock failed")
27240 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
27250 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
27260 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b  Type==F_WRLCK );
27270 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
27280 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66  "write-lock %d f
27290 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a  ailed", ofst));.
272a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52      }.  }.  OSTR
272b0 41 43 45 28 28 22 20 2d 20 61 66 74 65 72 77 61  ACE((" - afterwa
272c0 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e 22  rds %03x,%03x\n"
272d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 68  ,.           pSh
272e0 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
272f0 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63  k, pShmNode->exc
27300 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e  lMask));.  }.#en
27310 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
27320 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a  ;        .}../*.
27330 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 69  ** Return the mi
27340 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  nimum number of 
27350 33 32 4b 42 20 73 68 6d 20 72 65 67 69 6f 6e 73  32KB shm regions
27360 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
27370 6d 61 70 70 65 64 20 61 74 0a 2a 2a 20 61 20 74  mapped at.** a t
27380 69 6d 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  ime, assuming th
27390 61 74 20 65 61 63 68 20 6d 61 70 70 69 6e 67 20  at each mapping 
273a0 6d 75 73 74 20 62 65 20 61 6e 20 69 6e 74 65 67  must be an integ
273b0 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74  er multiple of t
273c0 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 73 79  he.** current sy
273d0 73 74 65 6d 20 70 61 67 65 2d 73 69 7a 65 2e 0a  stem page-size..
273e0 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74  **.** Usually, t
273f0 68 69 73 20 69 73 20 31 2e 20 54 68 65 20 65 78  his is 1. The ex
27400 63 65 70 74 69 6f 6e 20 73 65 65 6d 73 20 74 6f  ception seems to
27410 20 62 65 20 73 79 73 74 65 6d 73 20 74 68 61 74   be systems that
27420 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64 0a   are configured.
27430 2a 2a 20 74 6f 20 75 73 65 20 36 34 4b 42 20 70  ** to use 64KB p
27440 61 67 65 73 20 2d 20 69 6e 20 74 68 69 73 20 63  ages - in this c
27450 61 73 65 20 65 61 63 68 20 6d 61 70 70 69 6e 67  ase each mapping
27460 20 6d 75 73 74 20 63 6f 76 65 72 20 61 74 20 6c   must cover at l
27470 65 61 73 74 20 74 77 6f 0a 2a 2a 20 73 68 6d 20  east two.** shm 
27480 72 65 67 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74  regions..*/.stat
27490 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 52 65  ic int unixShmRe
274a0 67 69 6f 6e 50 65 72 4d 61 70 28 76 6f 69 64 29  gionPerMap(void)
274b0 7b 0a 20 20 69 6e 74 20 73 68 6d 73 7a 20 3d 20  {.  int shmsz = 
274c0 33 32 2a 31 30 32 34 3b 20 20 20 20 20 20 20 20  32*1024;        
274d0 20 20 20 20 2f 2a 20 53 48 4d 20 72 65 67 69 6f      /* SHM regio
274e0 6e 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20  n size */.  int 
274f0 70 67 73 7a 20 3d 20 6f 73 47 65 74 70 61 67 65  pgsz = osGetpage
27500 73 69 7a 65 28 29 3b 20 20 20 2f 2a 20 53 79 73  size();   /* Sys
27510 74 65 6d 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  tem page size */
27520 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 67 73  .  assert( ((pgs
27530 7a 2d 31 29 26 70 67 73 7a 29 3d 3d 30 20 29 3b  z-1)&pgsz)==0 );
27540 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
27550 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  must be a power 
27560 6f 66 20 32 20 2a 2f 0a 20 20 69 66 28 20 70 67  of 2 */.  if( pg
27570 73 7a 3c 73 68 6d 73 7a 20 29 20 72 65 74 75 72  sz<shmsz ) retur
27580 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 67  n 1;.  return pg
27590 73 7a 2f 73 68 6d 73 7a 3b 0a 7d 0a 0a 2f 2a 0a  sz/shmsz;.}../*.
275a0 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e 69  ** Purge the uni
275b0 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73  xShmNodeList lis
275c0 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73  t of all entries
275d0 20 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64   with unixShmNod
275e0 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a  e.nRef==0..**.**
275f0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56   This is not a V
27600 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
27610 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61   method; it is a
27620 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f   utility functio
27630 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56  n called.** by V
27640 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
27650 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61   methods..*/.sta
27660 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d  tic void unixShm
27670 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20 2a  Purge(unixFile *
27680 70 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e  pFd){.  unixShmN
27690 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49  ode *p = pFd->pI
276a0 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a  node->pShmNode;.
276b0 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
276c0 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69  texHeld() );.  i
276d0 66 28 20 70 20 26 26 20 41 4c 57 41 59 53 28 70  f( p && ALWAYS(p
276e0 2d 3e 6e 52 65 66 3d 3d 30 29 20 29 7b 0a 20 20  ->nRef==0) ){.  
276f0 20 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d 61 70    int nShmPerMap
27700 20 3d 20 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e   = unixShmRegion
27710 50 65 72 4d 61 70 28 29 3b 0a 20 20 20 20 69 6e  PerMap();.    in
27720 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t i;.    assert(
27730 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d   p->pInode==pFd-
27740 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 73  >pInode );.    s
27750 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
27760 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  e(p->mutex);.   
27770 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
27780 52 65 67 69 6f 6e 3b 20 69 2b 3d 6e 53 68 6d 50  Region; i+=nShmP
27790 65 72 4d 61 70 29 7b 0a 20 20 20 20 20 20 69 66  erMap){.      if
277a0 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ( p->h>=0 ){.   
277b0 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 2d       osMunmap(p-
277c0 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d  >apRegion[i], p-
277d0 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  >szRegion);.    
277e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
277f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
27800 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20  >apRegion[i]);. 
27810 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
27820 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
27830 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  >apRegion);.    
27840 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20  if( p->h>=0 ){. 
27850 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
27860 65 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c  e(pFd, p->h, __L
27870 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d  INE__);.      p-
27880 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  >h = -1;.    }. 
27890 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53     p->pInode->pS
278a0 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  hmNode = 0;.    
278b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
278c0 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69  .  }.}..#if defi
278d0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
278e0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
278f0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74  LOCKING_STYLE.st
27900 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
27910 2a 70 72 6f 78 79 53 68 61 72 65 64 4d 65 6d 6f  *proxySharedMemo
27920 72 79 42 61 73 65 50 61 74 68 28 75 6e 69 78 46  ryBasePath(unixF
27930 69 6c 65 20 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a  ile *);.#endif..
27940 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61  /*.** Open a sha
27950 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20  red-memory area 
27960 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
27970 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
27980 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54  le pDbFd.  .** T
27990 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 69  his particular i
279a0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73  mplementation us
279b0 65 73 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73  es mmapped files
279c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ..**.** The file
279d0 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
279e0 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  nt shared-memory
279f0 20 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20   is in the same 
27a00 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20  directory.** as 
27a10 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
27a20 65 20 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74  e file and has t
27a30 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
27a40 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
27a50 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74  e.** file with t
27a60 68 65 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78  he "-shm" suffix
27a70 20 61 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61   added.  For exa
27a80 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74  mple, if the dat
27a90 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73  abase file.** is
27aa0 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f   "/home/user1/co
27ab0 6e 66 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68  nfig.db" then th
27ac0 65 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 63  e file that is c
27ad0 72 65 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70  reated and mmapp
27ae0 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64  ed.** for shared
27af0 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
27b00 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73  called "/home/us
27b10 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68  er1/config.db-sh
27b20 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74  m".  .**.** Anot
27b30 68 65 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20  her approach to 
27b40 69 73 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20  is to use files 
27b50 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f  in /dev/shm or /
27b60 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a  dev/tmp or an.**
27b70 20 73 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66   some other tmpf
27b80 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20  s mount. But if 
27b90 61 20 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66  a file in a diff
27ba0 65 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a  erent directory.
27bb0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ** from the data
27bc0 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 73 65  base file is use
27bd0 64 2c 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e  d, then differin
27be0 67 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  g access permiss
27bf0 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72  ions.** or a chr
27c00 6f 6f 74 28 29 20 6d 69 67 68 74 20 63 61 75 73  oot() might caus
27c10 65 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20  e two different 
27c20 70 72 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65  processes on the
27c30 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73   same.** databas
27c40 65 20 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e  e to end up usin
27c50 67 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  g different file
27c60 73 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d  s for shared mem
27c70 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e  ory - .** meanin
27c80 67 20 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d  g that their mem
27c90 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65  ory would not re
27ca0 61 6c 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d  ally be shared -
27cb0 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e   resulting.** in
27cc0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
27cd0 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c  tion.  Neverthel
27ce0 65 73 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20  ess, this tmpfs 
27cf0 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61  file usage.** ca
27d00 6e 20 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20  n be enabled at 
27d10 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69  compile-time usi
27d20 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f  ng -DSQLITE_SHM_
27d30 44 49 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f  DIRECTORY="/dev/
27d40 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65  shm".** or the e
27d50 71 75 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20  quivalent.  The 
27d60 75 73 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  use of the SQLIT
27d70 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
27d80 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20  compile-time.** 
27d90 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69  option results i
27da0 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n an incompatibl
27db0 65 20 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74  e build of SQLit
27dc0 65 3b 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51  e;  builds of SQ
27dd0 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74  Lite.** that wit
27de0 68 20 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49  h differing SQLI
27df0 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
27e00 20 73 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70   settings attemp
27e10 74 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20  t to use the.** 
27e20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
27e30 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
27e40 69 6d 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f  ime, database co
27e50 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69  rruption will li
27e60 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20  kely.** result. 
27e70 54 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  The SQLITE_SHM_D
27e80 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65  IRECTORY compile
27e90 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
27ea0 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75  considered.** "u
27eb0 6e 73 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20  nsupported" and 
27ec0 6d 61 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61  may go away in a
27ed0 20 66 75 74 75 72 65 20 53 51 4c 69 74 65 20 72   future SQLite r
27ee0 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68  elease..**.** Wh
27ef0 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77  en opening a new
27f00 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
27f10 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72  ile, if no other
27f20 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
27f30 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63  at.** file are c
27f40 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69  urrently open, i
27f50 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  n this process o
27f60 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65  r in other proce
27f70 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  sses, then.** th
27f80 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74  e file must be t
27f90 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
27fa0 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20   length or have 
27fb0 69 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72  its header clear
27fc0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
27fd0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
27fe0 73 65 20 66 69 6c 65 20 28 70 44 62 46 64 29 20  se file (pDbFd) 
27ff0 69 73 20 75 73 69 6e 67 20 74 68 65 20 22 75 6e  is using the "un
28000 69 78 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20  ix-excl" VFS.** 
28010 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
28020 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
28030 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  k is held on the
28040 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
28050 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74  nd.** that no ot
28060 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 72  her processes ar
28070 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6f  e able to read o
28080 72 20 77 72 69 74 65 20 74 68 65 20 64 61 74 61  r write the data
28090 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61  base.  In.** tha
280a0 74 20 63 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f  t case, we do no
280b0 74 20 72 65 61 6c 6c 79 20 6e 65 65 64 20 73 68  t really need sh
280c0 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f  ared memory.  No
280d0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a   shared memory.*
280e0 2a 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  * file is create
280f0 64 2e 20 20 54 68 65 20 73 68 61 72 65 64 20 6d  d.  The shared m
28100 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 73 69  emory will be si
28110 6d 75 6c 61 74 65 64 20 77 69 74 68 20 68 65 61  mulated with hea
28120 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  p memory..*/.sta
28130 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e  tic int unixOpen
28140 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69  SharedMemory(uni
28150 78 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20  xFile *pDbFd){. 
28160 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20   struct unixShm 
28170 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  *p = 0;         
28180 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
28190 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  on to be opened 
281a0 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
281b0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
281c0 65 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  e;   /* The unde
281d0 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66  rlying mmapped f
281e0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ile */.  int rc;
281f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28200 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
28210 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69  lt code */.  uni
28220 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
28230 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  de;          /* 
28240 54 68 65 20 69 6e 6f 64 65 20 6f 66 20 66 64 20  The inode of fd 
28250 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d 46  */.  char *zShmF
28260 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
28270 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
28280 74 68 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  the file used fo
28290 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e  r SHM */.  int n
282a0 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20  ShmFilename;    
282b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
282c0 7a 65 20 6f 66 20 74 68 65 20 53 48 4d 20 66 69  ze of the SHM fi
282d0 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20  lename in bytes 
282e0 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
282f0 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
28300 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65  new unixShm obje
28310 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  ct. */.  p = sql
28320 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73  ite3_malloc64( s
28330 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
28340 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
28350 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
28360 50 54 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  PT;.  memset(p, 
28370 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
28380 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d    assert( pDbFd-
28390 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >pShm==0 );..  /
283a0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
283b0 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  f a unixShmNode 
283c0 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65  object already e
283d0 78 69 73 74 73 2e 20 52 65 75 73 65 20 61 6e 20  xists. Reuse an 
283e0 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e  existing.  ** on
283f0 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20 43 72  e if present. Cr
28400 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
28410 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  f necessary..  *
28420 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
28430 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
28440 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a   pDbFd->pInode;.
28450 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e    pShmNode = pIn
28460 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode->pShmNode;. 
28470 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30   if( pShmNode==0
28480 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
28490 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
284a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 73             /* fs
284b0 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72 20 64  tat() info for d
284c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
284d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53  #ifndef SQLITE_S
284e0 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20  HM_DIRECTORY.   
284f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61   const char *zBa
28500 73 65 50 61 74 68 20 3d 20 70 44 62 46 64 2d 3e  sePath = pDbFd->
28510 7a 50 61 74 68 3b 0a 23 65 6e 64 69 66 0a 0a 20  zPath;.#endif.. 
28520 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61 74     /* Call fstat
28530 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74  () to figure out
28540 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73   the permissions
28550 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
28560 20 66 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a 2a   file. If.    **
28570 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69 6c   a new *-shm fil
28580 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 61 6e  e is created, an
28590 20 61 74 74 65 6d 70 74 20 77 69 6c 6c 20 62 65   attempt will be
285a0 20 6d 61 64 65 20 74 6f 20 63 72 65 61 74 65 20   made to create 
285b0 69 74 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74  it.    ** with t
285c0 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69  he same permissi
285d0 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ons..    */.    
285e0 69 66 28 20 6f 73 46 73 74 61 74 28 70 44 62 46  if( osFstat(pDbF
285f0 64 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b  d->h, &sStat) ){
28600 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
28610 45 72 72 6e 6f 28 70 44 62 46 64 2c 20 65 72 72  Errno(pDbFd, err
28620 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  no);.      rc = 
28630 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
28640 41 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  AT;.      goto s
28650 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
28660 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28   }..#if defined(
28670 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
28680 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
28690 49 4e 47 5f 53 54 59 4c 45 20 5c 0a 20 20 20 20  ING_STYLE \.    
286a0 20 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51    && !defined(SQ
286b0 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
286c0 52 59 29 0a 20 20 20 20 2f 2a 20 49 66 20 70 44  RY).    /* If pD
286d0 62 46 64 20 69 73 20 63 6f 6e 66 69 67 75 72 65  bFd is configure
286e0 64 20 77 69 74 68 20 70 72 6f 78 79 20 6c 6f 63  d with proxy loc
286f0 6b 69 6e 67 20 6d 6f 64 65 2c 20 75 73 65 20 74  king mode, use t
28700 68 65 20 6c 6f 63 61 6c 20 0a 20 20 20 20 2a 2a  he local .    **
28710 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20   lock file path 
28720 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
28730 20 2d 73 68 6d 20 66 69 6c 65 20 70 61 74 68 0a   -shm file path.
28740 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
28750 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64  sProxyLockingMod
28760 65 28 70 44 62 46 64 29 20 29 7b 0a 20 20 20 20  e(pDbFd) ){.    
28770 20 20 7a 42 61 73 65 50 61 74 68 20 3d 20 70 72    zBasePath = pr
28780 6f 78 79 53 68 61 72 65 64 4d 65 6d 6f 72 79 42  oxySharedMemoryB
28790 61 73 65 50 61 74 68 28 70 44 62 46 64 29 3b 0a  asePath(pDbFd);.
287a0 20 20 20 20 20 20 69 66 28 20 21 7a 42 61 73 65        if( !zBase
287b0 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
287c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
287d0 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OPEN_BKPT;.     
287e0 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
287f0 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
28800 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a    }.#endif.    .
28810 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48  #ifdef SQLITE_SH
28820 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20  M_DIRECTORY.    
28830 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73  nShmFilename = s
28840 69 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d  izeof(SQLITE_SHM
28850 5f 44 49 52 45 43 54 4f 52 59 29 20 2b 20 33 31  _DIRECTORY) + 31
28860 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d  ;.#else.    nShm
28870 46 69 6c 65 6e 61 6d 65 20 3d 20 36 20 2b 20 28  Filename = 6 + (
28880 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 61 73 65  int)strlen(zBase
28890 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Path);.#endif.  
288a0 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c    pShmNode = sql
288b0 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73  ite3_malloc64( s
288c0 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29  izeof(*pShmNode)
288d0 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20   + nShmFilename 
288e0 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  );.    if( pShmN
288f0 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
28900 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
28910 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  M_BKPT;.      go
28920 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
28930 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
28940 74 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73  t(pShmNode, 0, s
28950 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29  izeof(*pShmNode)
28960 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a  +nShmFilename);.
28970 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65      zShmFilename
28980 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69   = pShmNode->zFi
28990 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
289a0 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69  &pShmNode[1];.#i
289b0 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f  fdef SQLITE_SHM_
289c0 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71  DIRECTORY.    sq
289d0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
289e0 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68  ShmFilename, zSh
289f0 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20  mFilename, .    
28a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a10 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
28a20 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d 73  CTORY "/sqlite-s
28a30 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20 20  hm-%x-%x",.     
28a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a50 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 69 6e  (u32)sStat.st_in
28a60 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e 73 74  o, (u32)sStat.st
28a70 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20  _dev);.#else.   
28a80 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
28a90 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  f(nShmFilename, 
28aa0 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25  zShmFilename, "%
28ab0 73 2d 73 68 6d 22 2c 20 7a 42 61 73 65 50 61 74  s-shm", zBasePat
28ac0 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  h);.    sqlite3F
28ad0 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46 64  ileSuffix3(pDbFd
28ae0 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 46 69 6c  ->zPath, zShmFil
28af0 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20  ename);.#endif. 
28b00 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d     pShmNode->h =
28b10 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e   -1;.    pDbFd->
28b20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
28b30 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20   = pShmNode;.   
28b40 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
28b50 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64  e = pDbFd->pInod
28b60 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  e;.    pShmNode-
28b70 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
28b80 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
28b90 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
28ba0 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  .    if( pShmNod
28bb0 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  e->mutex==0 ){. 
28bc0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
28bd0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
28be0 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
28bf0 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
28c00 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72   if( pInode->bPr
28c10 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  ocessLock==0 ){.
28c20 20 20 20 20 20 20 69 6e 74 20 6f 70 65 6e 46 6c        int openFl
28c30 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f  ags = O_RDWR | O
28c40 5f 43 52 45 41 54 3b 0a 20 20 20 20 20 20 69 66  _CREAT;.      if
28c50 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  ( sqlite3_uri_bo
28c60 6f 6c 65 61 6e 28 70 44 62 46 64 2d 3e 7a 50 61  olean(pDbFd->zPa
28c70 74 68 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68  th, "readonly_sh
28c80 6d 22 2c 20 30 29 0a 23 69 66 20 64 65 66 69 6e  m", 0).#if defin
28c90 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
28ca0 5f 50 45 52 53 49 53 54 5f 57 41 4c 29 26 26 28  _PERSIST_WAL)&&(
28cb0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
28cc0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 5c 0a 20 20  CKING_STYLE \.  
28cd0 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41    || defined(__A
28ce0 50 50 4c 45 5f 5f 29 29 0a 20 20 20 20 20 20 20  PPLE__)).       
28cf0 20 20 7c 7c 20 28 70 44 62 46 64 2d 3e 6f 70 65    || (pDbFd->ope
28d00 6e 46 6c 61 67 73 20 26 20 4f 5f 52 44 57 52 29  nFlags & O_RDWR)
28d10 20 21 3d 20 4f 5f 52 44 57 52 0a 23 65 6e 64 69   != O_RDWR.#endi
28d20 66 0a 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  f.         ){.  
28d30 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20        openFlags 
28d40 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20  = O_RDONLY;.    
28d50 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73      pShmNode->is
28d60 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20  Readonly = 1;.  
28d70 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68 6d      }.      pShm
28d80 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73 74  Node->h = robust
28d90 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 6c 65 6e 61  _open(zShmFilena
28da0 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 28  me, openFlags, (
28db0 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 26 30 37  sStat.st_mode&07
28dc0 37 37 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  77));.      if( 
28dd0 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b  pShmNode->h<0 ){
28de0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
28df0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
28e00 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
28e10 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d 46 69 6c   "open", zShmFil
28e20 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
28e30 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
28e40 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  r;.      }..    
28e50 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 72 6f    /* If this pro
28e60 63 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 20  cess is running 
28e70 61 73 20 72 6f 6f 74 2c 20 6d 61 6b 65 20 73 75  as root, make su
28e80 72 65 20 74 68 61 74 20 74 68 65 20 53 48 4d 20  re that the SHM 
28e90 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  file.      ** is
28ea0 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 73 61   owned by the sa
28eb0 6d 65 20 75 73 65 72 20 74 68 61 74 20 6f 77 6e  me user that own
28ec0 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  s the original d
28ed0 61 74 61 62 61 73 65 2e 20 20 4f 74 68 65 72 77  atabase.  Otherw
28ee0 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ise,.      ** th
28ef0 65 20 6f 72 69 67 69 6e 61 6c 20 6f 77 6e 65 72  e original owner
28f00 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c   will not be abl
28f10 65 20 74 6f 20 63 6f 6e 6e 65 63 74 2e 0a 20 20  e to connect..  
28f20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62      */.      rob
28f30 75 73 74 46 63 68 6f 77 6e 28 70 53 68 6d 4e 6f  ustFchown(pShmNo
28f40 64 65 2d 3e 68 2c 20 73 53 74 61 74 2e 73 74 5f  de->h, sStat.st_
28f50 75 69 64 2c 20 73 53 74 61 74 2e 73 74 5f 67 69  uid, sStat.st_gi
28f60 64 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20  d);.  .      /* 
28f70 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
28f80 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
28f90 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64  is holding the d
28fa0 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a  ead-man switch..
28fb0 20 20 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c        ** If not,
28fc0 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   truncate the fi
28fd0 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  le to zero lengt
28fe0 68 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  h. .      */.   
28ff0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
29000 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69  K;.      if( uni
29010 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
29020 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b 2c 20 55  DbFd, F_WRLCK, U
29030 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d  NIX_SHM_DMS, 1)=
29040 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29050 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74        if( robust
29060 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e  _ftruncate(pShmN
29070 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a 20 20  ode->h, 0) ){.  
29080 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
29090 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
290a0 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20  _IOERR_SHMOPEN, 
290b0 22 66 74 72 75 6e 63 61 74 65 22 2c 20 7a 53 68  "ftruncate", zSh
290c0 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  mFilename);.    
290d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
290e0 20 20 20 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69       /* If runni
290f0 6e 67 20 61 73 20 72 6f 6f 74 20 73 65 74 20 74  ng as root set t
29100 68 65 20 75 69 64 2f 67 69 64 20 6f 66 20 74 68  he uid/gid of th
29110 65 20 73 68 6d 20 66 69 6c 65 20 74 6f 20 6d 61  e shm file to ma
29120 74 63 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  tch.          **
29130 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
29140 0a 20 20 20 20 20 20 20 20 20 20 75 69 64 5f 74  .          uid_t
29150 20 65 75 69 64 20 3d 20 67 65 74 65 75 69 64 28   euid = geteuid(
29160 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
29170 20 28 21 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52   (!pShmNode->isR
29180 65 61 64 6f 6e 6c 79 29 20 26 26 20 65 75 69 64  eadonly) && euid
29190 3d 3d 30 20 26 26 20 28 65 75 69 64 21 3d 73 53  ==0 && (euid!=sS
291a0 74 61 74 2e 73 74 5f 75 69 64 20 7c 7c 20 67 65  tat.st_uid || ge
291b0 74 65 67 69 64 28 29 21 3d 73 53 74 61 74 2e 73  tegid()!=sStat.s
291c0 74 5f 67 69 64 29 20 29 7b 0a 20 20 20 20 20 20  t_gid) ){.      
291d0 20 20 20 20 20 20 69 66 28 20 6f 73 46 63 68 6f        if( osFcho
291e0 77 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  wn(pShmNode->h, 
291f0 73 53 74 61 74 2e 73 74 5f 75 69 64 2c 20 73 53  sStat.st_uid, sS
29200 74 61 74 2e 73 74 5f 67 69 64 29 20 29 7b 0a 20  tat.st_gid) ){. 
29210 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
29220 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  = SQLITE_IOERR_S
29230 48 4d 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20  HMOPEN;.        
29240 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
29250 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
29260 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
29270 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
29280 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
29290 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44  ShmSystemLock(pD
292a0 62 46 64 2c 20 46 5f 52 44 4c 43 4b 2c 20 55 4e  bFd, F_RDLCK, UN
292b0 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a  IX_SHM_DMS, 1);.
292c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
292d0 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f  ( rc ) goto shm_
292e0 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
292f0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74    }..  /* Make t
29300 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f  he new connectio
29310 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65  n a child of the
29320 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a   unixShmNode */.
29330 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20    p->pShmNode = 
29340 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66  pShmNode;.#ifdef
29350 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
29360 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65  p->id = pShmNode
29370 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23  ->nextShmId++;.#
29380 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65  endif.  pShmNode
29390 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46  ->nRef++;.  pDbF
293a0 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75  d->pShm = p;.  u
293b0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
293c0 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72  ..  /* The refer
293d0 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53  ence count on pS
293e0 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61  hmNode has alrea
293f0 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e  dy been incremen
29400 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74  ted under.  ** t
29410 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20  he cover of the 
29420 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
29430 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70   mutex and the p
29440 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a  ointer from the.
29450 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74    ** new (struct
29460 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a 65 63 74   unixShm) object
29470 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65   to the pShmNode
29480 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41   has been set. A
29490 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  ll that is.  ** 
294a0 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f  left to do is to
294b0 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62   link the new ob
294c0 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  ject into the li
294d0 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69  nked list starti
294e0 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e  ng.  ** at pShmN
294f0 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69  ode->pFirst. Thi
29500 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77  s must be done w
29510 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  hile holding the
29520 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
29530 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20   .  ** mutex..  
29540 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
29550 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
29560 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e  e->mutex);.  p->
29570 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65  pNext = pShmNode
29580 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d  ->pFirst;.  pShm
29590 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70  Node->pFirst = p
295a0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
295b0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
295c0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
295d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
295e0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e   /* Jump here on
295f0 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68   any error */.sh
29600 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e  m_open_err:.  un
29610 69 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  ixShmPurge(pDbFd
29620 29 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  );       /* This
29630 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d   call frees pShm
29640 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64  Node if required
29650 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
29660 65 65 28 70 29 3b 0a 20 20 75 6e 69 78 4c 65 61  ee(p);.  unixLea
29670 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
29680 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
29690 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
296a0 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
296b0 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
296c0 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f  region iRegion o
296d0 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64  f the .** shared
296e0 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74  -memory associat
296f0 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
29700 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68  base file fd. Sh
29710 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
29720 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62  ons .** are numb
29730 65 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72  ered starting fr
29740 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68  om zero. Each sh
29750 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
29760 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a  on is szRegion .
29770 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
29780 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
29790 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
297a0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
297b0 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73  urned and *pp is
297c0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
297d0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
297e0 66 20 74 68 65 20 62 45 78 74 65 6e 64 20 70 61  f the bExtend pa
297f0 72 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64  rameter is 0 and
29800 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
29810 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  hared-memory.** 
29820 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62  region has not b
29830 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62  een allocated (b
29840 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e  y any client, in
29850 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e  cluding one runn
29860 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61  ing in a.** sepa
29870 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74  rate process), t
29880 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74  hen *pp is set t
29890 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54  o NULL and SQLIT
298a0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
298b0 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64 20 69 73  f .** bExtend is
298c0 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
298d0 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
298e0 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
298f0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a   has not yet .**
29900 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
29910 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64   it is allocated
29920 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
29930 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
29940 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
29950 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  gion has already
29960 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
29970 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  or is allocated 
29980 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  by.** this call 
29990 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
299a0 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d  ve, then it is m
299b0 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
299c0 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64  processes .** ad
299d0 64 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20  dress space (if 
299e0 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
299f0 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74  y), *pp is set t
29a00 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d  o point to the m
29a10 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79  apped .** memory
29a20 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
29a30 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
29a40 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4d 61  ic int unixShmMa
29a50 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  p(.  sqlite3_fil
29a60 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
29a70 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f       /* Handle o
29a80 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20  pen on database 
29a90 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  file */.  int iR
29aa0 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20  egion,          
29ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
29ac0 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20  ion to retrieve 
29ad0 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f  */.  int szRegio
29ae0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
29af0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
29b00 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  regions */.  int
29b10 20 62 45 78 74 65 6e 64 2c 20 20 20 20 20 20 20   bExtend,       
29b20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29b30 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66  True to extend f
29b40 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ile if necessary
29b50 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74   */.  void volat
29b60 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20  ile **pp        
29b70 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61        /* OUT: Ma
29b80 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  pped memory */.)
29b90 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44  {.  unixFile *pD
29ba0 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  bFd = (unixFile*
29bb0 29 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a  )fd;.  unixShm *
29bc0 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  p;.  unixShmNode
29bd0 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e   *pShmNode;.  in
29be0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
29bf0 3b 0a 20 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d  ;.  int nShmPerM
29c00 61 70 20 3d 20 75 6e 69 78 53 68 6d 52 65 67 69  ap = unixShmRegi
29c10 6f 6e 50 65 72 4d 61 70 28 29 3b 0a 20 20 69 6e  onPerMap();.  in
29c20 74 20 6e 52 65 71 52 65 67 69 6f 6e 3b 0a 0a 20  t nReqRegion;.. 
29c30 20 2f 2a 20 49 66 20 74 68 65 20 73 68 61 72 65   /* If the share
29c40 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 68 61  d-memory file ha
29c50 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  s not yet been o
29c60 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e  pened, open it n
29c70 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20 70 44 62  ow. */.  if( pDb
29c80 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 7b 0a 20  Fd->pShm==0 ){. 
29c90 20 20 20 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e     rc = unixOpen
29ca0 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62  SharedMemory(pDb
29cb0 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Fd);.    if( rc!
29cc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
29cd0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70  urn rc;.  }..  p
29ce0 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
29cf0 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e    pShmNode = p->
29d00 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73 71 6c 69  pShmNode;.  sqli
29d10 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
29d20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
29d30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52 65  ;.  assert( szRe
29d40 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e  gion==pShmNode->
29d50 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d  szRegion || pShm
29d60 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30  Node->nRegion==0
29d70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
29d80 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d  hmNode->pInode==
29d90 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  pDbFd->pInode );
29da0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
29db0 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62  ode->h>=0 || pDb
29dc0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
29dd0 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20  cessLock==1 );. 
29de0 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
29df0 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d  e->h<0 || pDbFd-
29e00 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
29e10 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 2f  sLock==0 );..  /
29e20 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72  * Minimum number
29e30 20 6f 66 20 72 65 67 69 6f 6e 73 20 72 65 71 75   of regions requ
29e40 69 72 65 64 20 74 6f 20 62 65 20 6d 61 70 70 65  ired to be mappe
29e50 64 2e 20 2a 2f 0a 20 20 6e 52 65 71 52 65 67 69  d. */.  nReqRegi
29e60 6f 6e 20 3d 20 28 28 69 52 65 67 69 6f 6e 2b 6e  on = ((iRegion+n
29e70 53 68 6d 50 65 72 4d 61 70 29 20 2f 20 6e 53 68  ShmPerMap) / nSh
29e80 6d 50 65 72 4d 61 70 29 20 2a 20 6e 53 68 6d 50  mPerMap) * nShmP
29e90 65 72 4d 61 70 3b 0a 0a 20 20 69 66 28 20 70 53  erMap;..  if( pS
29ea0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
29eb0 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b 0a 20 20  nReqRegion ){.  
29ec0 20 20 63 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20    char **apNew; 
29ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ee0 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 70 52 65       /* New apRe
29ef0 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  gion[] array */.
29f00 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
29f10 6e 52 65 71 52 65 67 69 6f 6e 2a 73 7a 52 65 67  nReqRegion*szReg
29f20 69 6f 6e 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75  ion;   /* Minimu
29f30 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c 65 20  m required file 
29f40 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75  size */.    stru
29f50 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
29f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29f70 2a 20 55 73 65 64 20 62 79 20 66 73 74 61 74 28  * Used by fstat(
29f80 29 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f  ) */..    pShmNo
29f90 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73  de->szRegion = s
29fa0 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 69 66  zRegion;..    if
29fb0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
29fc0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
29fd0 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
29fe0 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20  n is not mapped 
29ff0 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
2a000 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
2a010 65 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 65 63  e..      ** Chec
2a020 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 68  k to see if it h
2a030 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
2a040 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77  d (i.e. if the w
2a050 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73  al-index file is
2a060 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72 67 65 20  .      ** large 
2a070 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69  enough to contai
2a080 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
2a090 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 20 20 2a  region)..      *
2a0a0 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73  /.      if( osFs
2a0b0 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  tat(pShmNode->h,
2a0c0 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20   &sStat) ){.    
2a0d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2a0e0 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20  IOERR_SHMSIZE;. 
2a0f0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
2a100 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  age_out;.      }
2a110 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20 73 53  .  .      if( sS
2a120 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 74  tat.st_size<nByt
2a130 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
2a140 54 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  The requested me
2a150 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73  mory region does
2a160 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 62   not exist. If b
2a170 45 78 74 65 6e 64 20 69 73 20 73 65 74 20 74 6f  Extend is set to
2a180 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61 6c 73  .        ** fals
2a190 65 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a  e, exit early. *
2a1a0 70 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74  pp will be set t
2a1b0 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54  o NULL and SQLIT
2a1c0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20  E_OK returned.. 
2a1d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2a1e0 20 20 69 66 28 20 21 62 45 78 74 65 6e 64 20 29    if( !bExtend )
2a1f0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
2a200 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
2a210 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2a220 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c   /* Alternativel
2a230 79 2c 20 69 66 20 62 45 78 74 65 6e 64 20 69 73  y, if bExtend is
2a240 20 74 72 75 65 2c 20 65 78 74 65 6e 64 20 74 68   true, extend th
2a250 65 20 66 69 6c 65 2e 20 44 6f 20 74 68 69 73 20  e file. Do this 
2a260 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 72  by.        ** wr
2a270 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62  iting a single b
2a280 79 74 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  yte to the end o
2a290 66 20 65 61 63 68 20 28 4f 53 29 20 70 61 67 65  f each (OS) page
2a2a0 20 62 65 69 6e 67 0a 20 20 20 20 20 20 20 20 2a   being.        *
2a2b0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65  * allocated or e
2a2c0 78 74 65 6e 64 65 64 2e 20 54 65 63 68 6e 69 63  xtended. Technic
2a2d0 61 6c 6c 79 2c 20 77 65 20 6e 65 65 64 20 6f 6e  ally, we need on
2a2e0 6c 79 20 77 72 69 74 65 20 74 6f 20 74 68 65 0a  ly write to the.
2a2f0 20 20 20 20 20 20 20 20 2a 2a 20 6c 61 73 74 20          ** last 
2a300 70 61 67 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  page in order to
2a310 20 65 78 74 65 6e 64 20 74 68 65 20 66 69 6c 65   extend the file
2a320 2e 20 42 75 74 20 77 72 69 74 69 6e 67 20 74 6f  . But writing to
2a330 20 61 6c 6c 20 6e 65 77 0a 20 20 20 20 20 20 20   all new.       
2a340 20 2a 2a 20 70 61 67 65 73 20 66 6f 72 63 65 73   ** pages forces
2a350 20 74 68 65 20 4f 53 20 74 6f 20 61 6c 6c 6f 63   the OS to alloc
2a360 61 74 65 20 74 68 65 6d 20 69 6d 6d 65 64 69 61  ate them immedia
2a370 74 65 6c 79 2c 20 77 68 69 63 68 20 72 65 64 75  tely, which redu
2a380 63 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ces.        ** t
2a390 68 65 20 63 68 61 6e 63 65 73 20 6f 66 20 53 49  he chances of SI
2a3a0 47 42 55 53 20 77 68 69 6c 65 20 61 63 63 65 73  GBUS while acces
2a3b0 73 69 6e 67 20 74 68 65 20 6d 61 70 70 65 64 20  sing the mapped 
2a3c0 72 65 67 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e  region later on.
2a3d0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2a3e0 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
2a3f0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
2a400 20 69 6e 74 20 70 67 73 7a 20 3d 20 34 30 39 36   int pgsz = 4096
2a410 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
2a420 69 50 67 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  iPg;..          
2a430 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20  /* Write to the 
2a440 6c 61 73 74 20 62 79 74 65 20 6f 66 20 65 61 63  last byte of eac
2a450 68 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65  h newly allocate
2a460 64 20 6f 72 20 65 78 74 65 6e 64 65 64 20 70 61  d or extended pa
2a470 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ge */.          
2a480 61 73 73 65 72 74 28 20 28 6e 42 79 74 65 20 25  assert( (nByte %
2a490 20 70 67 73 7a 29 3d 3d 30 20 29 3b 0a 20 20 20   pgsz)==0 );.   
2a4a0 20 20 20 20 20 20 20 66 6f 72 28 69 50 67 3d 28         for(iPg=(
2a4b0 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 2f 70 67  sStat.st_size/pg
2a4c0 73 7a 29 3b 20 69 50 67 3c 28 6e 42 79 74 65 2f  sz); iPg<(nByte/
2a4d0 70 67 73 7a 29 3b 20 69 50 67 2b 2b 29 7b 0a 20  pgsz); iPg++){. 
2a4e0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 78             int x
2a4f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2a500 20 20 69 66 28 20 73 65 65 6b 41 6e 64 57 72 69    if( seekAndWri
2a510 74 65 46 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  teFd(pShmNode->h
2a520 2c 20 69 50 67 2a 70 67 73 7a 20 2b 20 70 67 73  , iPg*pgsz + pgs
2a530 7a 2d 31 2c 20 22 22 2c 20 31 2c 20 26 78 29 21  z-1, "", 1, &x)!
2a540 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
2a550 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2a560 7a 46 69 6c 65 20 3d 20 70 53 68 6d 4e 6f 64 65  zFile = pShmNode
2a570 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  ->zFilename;.   
2a580 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2a590 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
2a5a0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
2a5b0 45 2c 20 22 77 72 69 74 65 22 2c 20 7a 46 69 6c  E, "write", zFil
2a5c0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2a5d0 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
2a5e0 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut;.            
2a5f0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2a600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2a610 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
2a620 70 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  p the requested 
2a630 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e  memory region in
2a640 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
2a650 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
2a660 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20   */.    apNew = 
2a670 28 63 68 61 72 20 2a 2a 29 73 71 6c 69 74 65 33  (char **)sqlite3
2a680 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  _realloc(.      
2a690 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65    pShmNode->apRe
2a6a0 67 69 6f 6e 2c 20 6e 52 65 71 52 65 67 69 6f 6e  gion, nReqRegion
2a6b0 2a 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a  *sizeof(char *).
2a6c0 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
2a6d0 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72  apNew ){.      r
2a6e0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
2a6f0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
2a700 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
2a710 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
2a720 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
2a730 6e 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 77  n = apNew;.    w
2a740 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  hile( pShmNode->
2a750 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52 65 67 69  nRegion<nReqRegi
2a760 6f 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  on ){.      int 
2a770 6e 4d 61 70 20 3d 20 73 7a 52 65 67 69 6f 6e 2a  nMap = szRegion*
2a780 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20 20 20 20  nShmPerMap;.    
2a790 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 76    int i;.      v
2a7a0 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20  oid *pMem;.     
2a7b0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
2a7c0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  >=0 ){.        p
2a7d0 4d 65 6d 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20  Mem = osMmap(0, 
2a7e0 6e 4d 61 70 2c 0a 20 20 20 20 20 20 20 20 20 20  nMap,.          
2a7f0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65    pShmNode->isRe
2a800 61 64 6f 6e 6c 79 20 3f 20 50 52 4f 54 5f 52 45  adonly ? PROT_RE
2a810 41 44 20 3a 20 50 52 4f 54 5f 52 45 41 44 7c 50  AD : PROT_READ|P
2a820 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20 20 20 20  ROT_WRITE, .    
2a830 20 20 20 20 20 20 20 20 4d 41 50 5f 53 48 41 52          MAP_SHAR
2a840 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ED, pShmNode->h,
2a850 20 73 7a 52 65 67 69 6f 6e 2a 28 69 36 34 29 70   szRegion*(i64)p
2a860 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
2a870 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
2a880 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41      if( pMem==MA
2a890 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  P_FAILED ){.    
2a8a0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
2a8b0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
2a8c0 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d  OERR_SHMMAP, "mm
2a8d0 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a  ap", pShmNode->z
2a8e0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
2a8f0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
2a900 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  e_out;.        }
2a910 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2a920 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 73 71 6c        pMem = sql
2a930 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 7a  ite3_malloc64(sz
2a940 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20  Region);.       
2a950 20 69 66 28 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a   if( pMem==0 ){.
2a960 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2a970 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2a980 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2a990 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
2a9a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a9b0 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c 20  memset(pMem, 0, 
2a9c0 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20  szRegion);.     
2a9d0 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   }..      for(i=
2a9e0 30 3b 20 69 3c 6e 53 68 6d 50 65 72 4d 61 70 3b  0; i<nShmPerMap;
2a9f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
2aa00 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
2aa10 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  n[pShmNode->nReg
2aa20 69 6f 6e 2b 69 5d 20 3d 20 26 28 28 63 68 61 72  ion+i] = &((char
2aa30 2a 29 70 4d 65 6d 29 5b 73 7a 52 65 67 69 6f 6e  *)pMem)[szRegion
2aa40 2a 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  *i];.      }.   
2aa50 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65     pShmNode->nRe
2aa60 67 69 6f 6e 20 2b 3d 20 6e 53 68 6d 50 65 72 4d  gion += nShmPerM
2aa70 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73  ap;.    }.  }..s
2aa80 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66  hmpage_out:.  if
2aa90 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
2aaa0 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20  ion>iRegion ){. 
2aab0 20 20 20 2a 70 70 20 3d 20 70 53 68 6d 4e 6f 64     *pp = pShmNod
2aac0 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 52 65 67  e->apRegion[iReg
2aad0 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ion];.  }else{. 
2aae0 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a     *pp = 0;.  }.
2aaf0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
2ab00 69 73 52 65 61 64 6f 6e 6c 79 20 26 26 20 72 63  isReadonly && rc
2ab10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
2ab20 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
2ab30 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  LY;.  sqlite3_mu
2ab40 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
2ab50 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  de->mutex);.  re
2ab60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2ab70 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63  * Change the loc
2ab80 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20 73 68  k state for a sh
2ab90 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d  ared-memory segm
2aba0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ent..**.** Note 
2abb0 74 68 61 74 20 74 68 65 20 72 65 6c 61 74 69 6f  that the relatio
2abc0 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 53 48  nship between SH
2abd0 41 52 45 64 20 61 6e 64 20 45 58 43 4c 55 53 49  AREd and EXCLUSI
2abe0 56 45 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c 69  VE locks is a li
2abf0 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e  ttle.** differen
2ac00 74 20 68 65 72 65 20 74 68 61 6e 20 69 6e 20 70  t here than in p
2ac10 6f 73 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f  osix.  In xShmLo
2ac20 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f  ck(), one can go
2ac30 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a   from unlocked.*
2ac40 2a 20 74 6f 20 73 68 61 72 65 64 20 61 6e 64 20  * to shared and 
2ac50 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c  back or from unl
2ac60 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c 75 73 69  ocked to exclusi
2ac70 76 65 20 61 6e 64 20 62 61 63 6b 2e 20 20 42 75  ve and back.  Bu
2ac80 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74  t one may.** not
2ac90 20 67 6f 20 66 72 6f 6d 20 73 68 61 72 65 64 20   go from shared 
2aca0 74 6f 20 65 78 63 6c 75 73 69 76 65 20 6f 72 20  to exclusive or 
2acb0 66 72 6f 6d 20 65 78 63 6c 75 73 69 76 65 20 74  from exclusive t
2acc0 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74 61  o shared..*/.sta
2acd0 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4c  tic int unixShmL
2ace0 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ock(.  sqlite3_f
2acf0 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
2ad00 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
2ad10 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  le holding the s
2ad20 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
2ad30 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20    int ofst,     
2ad40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ad50 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63  First lock to ac
2ad60 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65  quire or release
2ad70 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20   */.  int n,    
2ad80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad90 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f   /* Number of lo
2ada0 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f  cks to acquire o
2adb0 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  r release */.  i
2adc0 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
2add0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61            /* Wha
2ade0 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65  t to do with the
2adf0 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e   lock */.){.  un
2ae00 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20  ixFile *pDbFd = 
2ae10 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 20 20  (unixFile*)fd;  
2ae20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
2ae30 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  n holding shared
2ae40 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e 69   memory */.  uni
2ae50 78 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d  xShm *p = pDbFd-
2ae60 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  >pShm;          
2ae70 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64     /* The shared
2ae80 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f   memory being lo
2ae90 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68  cked */.  unixSh
2aea0 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  m *pX;          
2aeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aec0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
2aed0 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73  ver all siblings
2aee0 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64   */.  unixShmNod
2aef0 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  e *pShmNode = p-
2af00 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54  >pShmNode;  /* T
2af10 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69  he underlying fi
2af20 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e  le iNode */.  in
2af30 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2af40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2af50 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
2af60 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b  de */.  u16 mask
2af70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2af80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2af90 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74   Mask of locks t
2afa0 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73  o take or releas
2afb0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
2afc0 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d  pShmNode==pDbFd-
2afd0 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
2afe0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
2aff0 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d  ShmNode->pInode=
2b000 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29  =pDbFd->pInode )
2b010 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74  ;.  assert( ofst
2b020 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53  >=0 && ofst+n<=S
2b030 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20  QLITE_SHM_NLOCK 
2b040 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d  );.  assert( n>=
2b050 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66  1 );.  assert( f
2b060 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
2b070 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  M_LOCK | SQLITE_
2b080 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20  SHM_SHARED).    
2b090 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
2b0a0 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
2b0b0 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
2b0c0 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20  SIVE).       || 
2b0d0 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
2b0e0 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
2b0f0 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
2b100 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
2b110 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  (SQLITE_SHM_UNLO
2b120 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
2b130 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20  EXCLUSIVE) );.  
2b140 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20  assert( n==1 || 
2b150 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
2b160 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  SHM_EXCLUSIVE)!=
2b170 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2b180 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c  ShmNode->h>=0 ||
2b190 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
2b1a0 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20  bProcessLock==1 
2b1b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
2b1c0 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44  mNode->h<0 || pD
2b1d0 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  bFd->pInode->bPr
2b1e0 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  ocessLock==0 );.
2b1f0 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f  .  mask = (1<<(o
2b200 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66  fst+n)) - (1<<of
2b210 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  st);.  assert( n
2b220 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c  >1 || mask==(1<<
2b230 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74  ofst) );.  sqlit
2b240 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
2b250 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
2b260 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
2b270 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
2b280 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d   ){.    u16 allM
2b290 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b  ask = 0; /* Mask
2b2a0 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
2b2b0 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20  y siblings */.. 
2b2c0 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79     /* See if any
2b2d0 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74   siblings hold t
2b2e0 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f  his same lock */
2b2f0 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
2b300 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
2b310 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
2b320 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70  .      if( pX==p
2b330 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2b340 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e     assert( (pX->
2b350 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65  exclMask & (p->e
2b360 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65  xclMask|p->share
2b370 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20  dMask))==0 );.  
2b380 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70      allMask |= p
2b390 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
2b3a0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c     }..    /* Unl
2b3b0 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c  ock the system-l
2b3c0 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  evel locks */.  
2b3d0 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c    if( (mask & al
2b3e0 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  lMask)==0 ){.   
2b3f0 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
2b400 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c  ystemLock(pDbFd,
2b410 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55   F_UNLCK, ofst+U
2b420 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  NIX_SHM_BASE, n)
2b430 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2b440 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2b450 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
2b460 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20   Undo the local 
2b470 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
2b480 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b490 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d  {.      p->exclM
2b4a0 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
2b4b0 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
2b4c0 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
2b4d0 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  } .  }else if( f
2b4e0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
2b4f0 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20  M_SHARED ){.    
2b500 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20  u16 allShared = 
2b510 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20  0;  /* Union of 
2b520 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f  locks held by co
2b530 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20  nnections other 
2b540 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20  than "p" */..   
2b550 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69   /* Find out whi
2b560 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  ch shared locks 
2b570 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64  are already held
2b580 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e   by sibling conn
2b590 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20  ections..    ** 
2b5a0 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61  If any sibling a
2b5b0 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20  lready holds an 
2b5c0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
2b5d0 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 74  go ahead and ret
2b5e0 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54  urn.    ** SQLIT
2b5f0 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20  E_BUSY..    */. 
2b600 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
2b610 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
2b620 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
2b630 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78       if( (pX->ex
2b640 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  clMask & mask)!=
2b650 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
2b660 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
2b670 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2b680 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53      }.      allS
2b690 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61  hared |= pX->sha
2b6a0 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a  redMask;.    }..
2b6b0 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65      /* Get share
2b6c0 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  d locks at the s
2b6d0 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20  ystem level, if 
2b6e0 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20  necessary */.   
2b6f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b700 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
2b710 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73  (allShared & mas
2b720 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
2b730 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
2b740 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46  temLock(pDbFd, F
2b750 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49  _RDLCK, ofst+UNI
2b760 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  X_SHM_BASE, n);.
2b770 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2b780 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2b790 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
2b7a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74   }..    /* Get t
2b7b0 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20  he local shared 
2b7c0 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
2b7d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b7e0 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  {.      p->share
2b7f0 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  dMask |= mask;. 
2b800 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2b810 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e    /* Make sure n
2b820 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  o sibling connec
2b830 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73  tions hold locks
2b840 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b   that will block
2b850 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63   this.    ** loc
2b860 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72  k.  If any do, r
2b870 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
2b880 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  Y right away..  
2b890 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
2b8a0 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
2b8b0 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
2b8c0 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
2b8d0 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
2b8e0 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e  ask)!=0 || (pX->
2b8f0 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73  sharedMask & mas
2b900 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
2b910 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
2b920 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  Y;.        break
2b930 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2b940 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68    .    /* Get th
2b950 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
2b960 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  s at the system 
2b970 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20  level.  Then if 
2b980 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a  successful.    *
2b990 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20  * also mark the 
2b9a0 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e  local connection
2b9b0 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64   as being locked
2b9c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2b9d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b9e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
2b9f0 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
2ba00 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f  DbFd, F_WRLCK, o
2ba10 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53  fst+UNIX_SHM_BAS
2ba20 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  E, n);.      if(
2ba30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ba40 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
2ba50 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  ( (p->sharedMask
2ba60 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20   & mask)==0 );. 
2ba70 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61         p->exclMa
2ba80 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
2ba90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2baa0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
2bab0 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
2bac0 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  tex);.  OSTRACE(
2bad0 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64  ("SHM-LOCK shmid
2bae0 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20  -%d, pid-%d got 
2baf0 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20  %03x,%03x\n",.  
2bb00 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20           p->id, 
2bb10 6f 73 47 65 74 70 69 64 28 30 29 2c 20 70 2d 3e  osGetpid(0), p->
2bb20 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65  sharedMask, p->e
2bb30 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72 65 74  xclMask));.  ret
2bb40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2bb50 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d   Implement a mem
2bb60 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d  ory barrier or m
2bb70 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73  emory fence on s
2bb80 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a  hared memory.  .
2bb90 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20  **.** All loads 
2bba0 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e  and stores begun
2bbb0 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72   before the barr
2bbc0 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74  ier must complet
2bbd0 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20  e before.** any 
2bbe0 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65  load or store be
2bbf0 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61  gun after the ba
2bc00 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrier..*/.static
2bc10 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 42 61 72   void unixShmBar
2bc20 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f  rier(.  sqlite3_
2bc30 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20  file *fd        
2bc40 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
2bc50 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67  ase file holding
2bc60 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
2bc70 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45  ry */.){.  UNUSE
2bc80 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
2bc90 0a 20 20 73 71 6c 69 74 65 33 4d 65 6d 6f 72 79  .  sqlite3Memory
2bca0 42 61 72 72 69 65 72 28 29 3b 20 20 20 20 20 20  Barrier();      
2bcb0 20 20 20 2f 2a 20 63 6f 6d 70 69 6c 65 72 2d 64     /* compiler-d
2bcc0 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79 20 62 61  efined memory ba
2bcd0 72 72 69 65 72 20 2a 2f 0a 20 20 75 6e 69 78 45  rrier */.  unixE
2bce0 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 20 20 20  nterMutex();    
2bcf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
2bd00 73 6f 20 6d 75 74 65 78 2c 20 66 6f 72 20 72 65  so mutex, for re
2bd10 64 75 6e 64 61 6e 63 79 20 2a 2f 0a 20 20 75 6e  dundancy */.  un
2bd20 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
2bd30 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
2bd40 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73   connection to s
2bd50 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44  hared-memory.  D
2bd60 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c  elete the underl
2bd70 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65  ying .** storage
2bd80 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69   if deleteFlag i
2bd90 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
2bda0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 68 61   there is no sha
2bdb0 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red memory assoc
2bdc0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 63  iated with the c
2bdd0 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65 6e 20 74  onnection then t
2bde0 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
2bdf0 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  s a harmless no-
2be00 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
2be10 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 28 0a  t unixShmUnmap(.
2be20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
2be30 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fd,             
2be40 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
2be50 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
2be60 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74  e */.  int delet
2be70 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  eFlag           
2be80 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65         /* Delete
2be90 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69   shared-memory i
2bea0 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75  f true */.){.  u
2beb0 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20 20 20 20  nixShm *p;      
2bec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bed0 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
2bee0 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f   to be closed */
2bef0 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
2bf00 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  pShmNode;       
2bf10 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
2bf20 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f  ying shared-memo
2bf30 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  ry file */.  uni
2bf40 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20  xShm **pp;      
2bf50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bf60 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
2bf70 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
2bf80 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46 69  ions */.  unixFi
2bf90 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20  le *pDbFd;      
2bfa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2bfb0 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
2bfc0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
2bfd0 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c  pDbFd = (unixFil
2bfe0 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62  e*)fd;.  p = pDb
2bff0 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20  Fd->pShm;.  if( 
2c000 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
2c010 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e  LITE_OK;.  pShmN
2c020 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
2c030 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  e;..  assert( pS
2c040 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  hmNode==pDbFd->p
2c050 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
2c060 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
2c070 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70  mNode->pInode==p
2c080 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  DbFd->pInode );.
2c090 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e  .  /* Remove con
2c0a0 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74  nection p from t
2c0b0 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63  he set of connec
2c0c0 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
2c0d0 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e  .  ** with pShmN
2c0e0 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
2c0f0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
2c100 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
2c110 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64   for(pp=&pShmNod
2c120 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29  e->pFirst; (*pp)
2c130 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29  !=p; pp = &(*pp)
2c140 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70  ->pNext){}.  *pp
2c150 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20   = p->pNext;..  
2c160 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e  /* Free the conn
2c170 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71  ection p */.  sq
2c180 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
2c190 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30   pDbFd->pShm = 0
2c1a0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
2c1b0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
2c1c0 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  ->mutex);..  /* 
2c1d0 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  If pShmNode->nRe
2c1e0 66 20 68 61 73 20 72 65 61 63 68 65 64 20 30 2c  f has reached 0,
2c1f0 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20   then close the 
2c200 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20  underlying.  ** 
2c210 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
2c220 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69  le, too */.  uni
2c230 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
2c240 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
2c250 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  e->nRef>0 );.  p
2c260 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b  ShmNode->nRef--;
2c270 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
2c280 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
2c290 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20 26  if( deleteFlag &
2c2a0 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  & pShmNode->h>=0
2c2b0 20 29 20 7b 0a 20 20 20 20 20 20 69 66 20 28 64   ) {.      if (d
2c2c0 65 6c 65 74 65 46 6c 61 67 20 3d 3d 20 31 29 20  eleteFlag == 1) 
2c2d0 7b 20 0a 20 20 20 20 20 20 20 20 6f 73 55 6e 6c  { .        osUnl
2c2e0 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46  ink(pShmNode->zF
2c2f0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
2c300 7d 20 65 6c 73 65 20 69 66 20 28 64 65 6c 65 74  } else if (delet
2c310 65 46 6c 61 67 20 3d 3d 20 32 29 20 7b 0a 20 20  eFlag == 2) {.  
2c320 20 20 20 20 20 20 2f 2a 20 66 74 72 75 6e 63 61        /* ftrunca
2c330 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  te(pShmNode->h, 
2c340 33 32 20 2a 20 31 30 32 34 29 3b 20 2a 2f 0a 20  32 * 1024); */. 
2c350 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2c360 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44   unixShmPurge(pD
2c370 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  bFd);.  }.  unix
2c380 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20  LeaveMutex();.. 
2c390 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2c3a0 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64  K;.}...#else.# d
2c3b0 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70  efine unixShmMap
2c3c0 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20       0.# define 
2c3d0 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30  unixShmLock    0
2c3e0 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
2c3f0 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66  mBarrier 0.# def
2c400 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70  ine unixShmUnmap
2c410 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23     0.#endif /* #
2c420 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2c430 49 54 5f 57 41 4c 20 2a 2f 0a 0a 23 69 66 20 28  IT_WAL */..#if (
2c440 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
2c450 50 4c 45 5f 53 50 49 3e 30 29 20 26 26 20 64 65  PLE_SPI>0) && de
2c460 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2c470 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
2c480 61 72 20 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65  ar *unixTempFile
2c490 44 69 72 28 76 6f 69 64 29 3b 0a 0a 73 74 61 74  Dir(void);..stat
2c4a0 69 63 20 69 6e 74 20 75 6e 69 78 49 6e 76 61 6c  ic int unixInval
2c4b0 69 64 61 74 65 53 75 70 70 6f 72 74 46 69 6c 65  idateSupportFile
2c4c0 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  s(unixFile *pFil
2c4d0 65 2c 20 69 6e 74 20 73 6b 69 70 57 41 4c 29 20  e, int skipWAL) 
2c4e0 7b 0a 20 20 63 68 61 72 20 6a 50 61 74 68 5b 4d  {.  char jPath[M
2c4f0 41 58 50 41 54 48 4c 45 4e 2b 39 5d 3b 0a 20 20  AXPATHLEN+9];.  
2c500 69 6e 74 20 7a 4c 65 6e 20 3d 20 73 74 72 6c 63  int zLen = strlc
2c510 70 79 28 6a 50 61 74 68 2c 20 70 46 69 6c 65 2d  py(jPath, pFile-
2c520 3e 7a 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  >zPath, MAXPATHL
2c530 45 4e 2b 39 29 3b 0a 20 20 69 66 28 20 7a 4c 65  EN+9);.  if( zLe
2c540 6e 3c 4d 41 58 50 41 54 48 4c 45 4e 20 29 7b 0a  n<MAXPATHLEN ){.
2c550 20 20 20 20 73 69 7a 65 5f 74 20 6a 4c 65 6e 3b      size_t jLen;
2c560 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2c570 65 78 74 65 6e 73 69 6f 6e 73 5b 33 5d 5b 39 5d  extensions[3][9]
2c580 20 3d 20 7b 20 22 2d 77 61 6c 22 2c 20 22 2d 6a   = { "-wal", "-j
2c590 6f 75 72 6e 61 6c 22 2c 20 22 2d 73 68 6d 22 20  ournal", "-shm" 
2c5a0 7d 3b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28  };.    int j = (
2c5b0 73 6b 69 70 57 41 4c 20 3f 20 31 20 3a 20 30 29  skipWAL ? 1 : 0)
2c5c0 3b 0a 20 20 20 20 66 6f 72 28 20 3b 20 6a 3c 33  ;.    for( ; j<3
2c5d0 3b 20 6a 2b 2b 20 29 7b 0a 20 20 20 20 20 20 0a  ; j++ ){.      .
2c5e0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
2c5f0 6f 20 73 65 65 20 69 66 20 74 68 65 20 73 68 6d  o see if the shm
2c600 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79   file is already
2c610 20 6f 70 65 6e 65 64 20 66 6f 72 20 74 68 69 73   opened for this
2c620 20 70 46 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20   pFile */.      
2c630 69 66 28 20 6a 3d 3d 32 20 29 7b 0a 20 20 20 20  if( j==2 ){.    
2c640 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
2c650 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  ex(); /* Because
2c660 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69   pFile->pInode i
2c670 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
2c680 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 20 20 20  threads */.     
2c690 20 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a     unixShmNode *
2c6a0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 46 69 6c 65  pShmNode = pFile
2c6b0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
2c6c0 64 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  de;.        if( 
2c6d0 70 53 68 6d 4e 6f 64 65 20 26 26 20 21 70 53 68  pShmNode && !pSh
2c6e0 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c  mNode->isReadonl
2c6f0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  y ){.          s
2c700 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
2c710 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
2c720 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
2c730 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
2c740 3b 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20 20  ;.          .   
2c750 20 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e         if( pShmN
2c760 6f 64 65 2d 3e 68 3e 3d 30 20 26 26 20 21 6f 73  ode->h>=0 && !os
2c770 46 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e  Fstat(pShmNode->
2c780 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20  h, &sStat) ){.  
2c790 20 20 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e            unsign
2c7a0 65 64 20 6c 6f 6e 67 20 73 69 7a 65 20 3d 20 28  ed long size = (
2c7b0 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 34 29  sStat.st_size<4)
2c7c0 20 3f 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65   ? sStat.st_size
2c7d0 20 3a 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20   : 4;.          
2c7e0 20 20 69 66 28 20 73 69 7a 65 3e 30 20 29 7b 0a    if( size>0 ){.
2c7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 7a                bz
2c800 65 72 6f 28 70 53 68 6d 4e 6f 64 65 2d 3e 61 70  ero(pShmNode->ap
2c810 52 65 67 69 6f 6e 5b 30 5d 2c 20 73 69 7a 65 29  Region[0], size)
2c820 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2c830 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
2c840 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
2c850 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tex);.          
2c860 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
2c870 65 78 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ex();.          
2c880 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2c890 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c8a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c8b0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2c8c0 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
2c8d0 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20  mutex);.        
2c8e0 7d 0a 20 20 20 20 20 20 20 20 75 6e 69 78 4c 65  }.        unixLe
2c8f0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
2c900 20 20 7d 0a 20 20 20 20 20 20 6a 4c 65 6e 20 3d    }.      jLen =
2c910 20 73 74 72 6c 63 70 79 28 26 6a 50 61 74 68 5b   strlcpy(&jPath[
2c920 7a 4c 65 6e 5d 2c 20 65 78 74 65 6e 73 69 6f 6e  zLen], extension
2c930 73 5b 6a 5d 2c 20 39 29 3b 0a 20 20 20 20 20 20  s[j], 9);.      
2c940 69 66 28 20 6a 4c 65 6e 20 3c 20 39 20 29 7b 0a  if( jLen < 9 ){.
2c950 20 20 20 20 20 20 20 20 69 6e 74 20 6a 66 6c 61          int jfla
2c960 67 73 20 3d 20 28 6a 3c 32 29 20 3f 20 4f 5f 54  gs = (j<2) ? O_T
2c970 52 55 4e 43 20 3a 20 4f 5f 52 44 57 52 3b 0a 20  RUNC : O_RDWR;. 
2c980 20 20 20 20 20 20 20 69 6e 74 20 6a 66 64 20 3d         int jfd =
2c990 20 6f 70 65 6e 28 6a 50 61 74 68 2c 20 6a 66 6c   open(jPath, jfl
2c9a0 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ags);.        if
2c9b0 28 20 6a 66 64 3d 3d 28 2d 31 29 20 29 7b 0a 20  ( jfd==(-1) ){. 
2c9c0 20 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72           if( err
2c9d0 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20  no!=ENOENT ){.  
2c9e0 20 20 20 20 20 20 20 20 20 20 70 65 72 72 6f 72            perror
2c9f0 28 6a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  (jPath);.       
2ca00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 65     }.        } e
2ca10 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
2ca20 69 66 28 20 6a 3d 3d 32 20 29 7b 0a 20 20 20 20  if( j==2 ){.    
2ca30 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
2ca40 74 61 74 20 73 53 74 61 74 3b 0a 20 20 20 20 20  tat sStat;.     
2ca50 20 20 20 20 20 20 20 69 66 28 20 21 6f 73 46 73         if( !osFs
2ca60 74 61 74 28 6a 66 64 2c 20 26 73 53 74 61 74 29  tat(jfd, &sStat)
2ca70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2ca80 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
2ca90 73 69 7a 65 20 3d 20 28 73 53 74 61 74 2e 73 74  size = (sStat.st
2caa0 5f 73 69 7a 65 3c 34 29 20 3f 20 73 53 74 61 74  _size<4) ? sStat
2cab0 2e 73 74 5f 73 69 7a 65 20 3a 20 34 3b 0a 20 20  .st_size : 4;.  
2cac0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2cad0 73 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  size>0 ){.      
2cae0 20 20 20 20 20 20 20 20 20 20 75 69 6e 74 33 32            uint32
2caf0 5f 74 20 7a 65 72 6f 20 3d 20 30 3b 0a 20 20 20  _t zero = 0;.   
2cb00 20 20 20 20 20 20 20 20 20 20 20 20 20 70 77 72               pwr
2cb10 69 74 65 28 6a 66 64 2c 20 26 7a 65 72 6f 2c 20  ite(jfd, &zero, 
2cb20 28 73 69 7a 65 5f 74 29 73 69 7a 65 2c 20 30 29  (size_t)size, 0)
2cb30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2cb40 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
2cb50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2cb60 20 20 20 20 20 20 66 73 79 6e 63 28 6a 66 64 29        fsync(jfd)
2cb70 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  ;.          clos
2cb80 65 28 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  e(jfd);.        
2cb90 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2cba0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2cbb0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69  ITE_OK;.}..stati
2cbc0 63 20 69 6e 74 20 75 6e 69 78 55 6e 73 61 66 65  c int unixUnsafe
2cbd0 54 72 75 6e 63 61 74 65 44 61 74 61 62 61 73 65  TruncateDatabase
2cbe0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
2cbf0 29 7b 0a 20 20 2f 2a 20 74 68 69 73 20 69 73 20  ){.  /* this is 
2cc00 6e 61 73 74 79 20 26 20 62 61 64 2e 20 20 64 65  nasty & bad.  de
2cc10 73 74 72 75 63 74 69 6f 6e 20 77 69 74 68 20 70  struction with p
2cc20 72 65 6a 75 64 69 63 65 2e 20 20 77 65 27 6c 6c  rejudice.  we'll
2cc30 20 6c 6f 73 65 20 61 6c 6c 20 74 68 65 0a 20 20   lose all the.  
2cc40 2a 2a 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e  ** file locks in
2cc50 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20 68   this process, h
2cc60 6f 77 65 76 65 72 2e 20 73 71 6c 69 74 65 33 5f  owever. sqlite3_
2cc70 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 77 6f 72  file_control wor
2cc80 6b 73 20 70 72 6f 70 65 72 6c 79 2e 0a 20 20 2a  ks properly..  *
2cc90 2a 20 42 75 74 20 69 66 20 69 74 20 66 61 69 6c  * But if it fail
2cca0 73 2c 20 74 68 69 73 20 77 6f 72 6b 73 20 61 70  s, this works ap
2ccb0 70 72 6f 78 69 6d 61 74 65 6c 79 0a 20 20 2a 2f  proximately.  */
2ccc0 0a 20 20 63 68 61 72 20 6a 6f 75 72 6e 61 6c 50  .  char journalP
2ccd0 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b  ath[MAXPATHLEN];
2cce0 0a 20 20 63 68 61 72 20 77 61 6c 50 61 74 68 5b  .  char walPath[
2ccf0 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69  MAXPATHLEN];.  i
2cd00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2cd10 4b 3b 0a 20 20 0a 23 69 66 64 65 66 20 44 45 42  K;.  .#ifdef DEB
2cd20 55 47 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  UG.  fprintf(std
2cd30 65 72 72 2c 20 22 46 6f 72 63 65 20 74 72 75 6e  err, "Force trun
2cd40 63 61 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  cating database 
2cd50 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  %s\n", pFile->zP
2cd60 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  ath);.#endif.  s
2cd70 74 72 6c 63 70 79 28 6a 6f 75 72 6e 61 6c 50 61  trlcpy(journalPa
2cd80 74 68 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  th, pFile->zPath
2cd90 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
2cda0 20 73 74 72 6c 63 61 74 28 6a 6f 75 72 6e 61 6c   strlcat(journal
2cdb0 50 61 74 68 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22  Path, "-journal"
2cdc0 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
2cdd0 20 73 74 72 6c 63 70 79 28 77 61 6c 50 61 74 68   strlcpy(walPath
2cde0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20  , pFile->zPath, 
2cdf0 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 73  MAXPATHLEN);.  s
2ce00 74 72 6c 63 61 74 28 77 61 6c 50 61 74 68 2c 20  trlcat(walPath, 
2ce10 22 2d 77 61 6c 22 2c 20 4d 41 58 50 41 54 48 4c  "-wal", MAXPATHL
2ce20 45 4e 29 3b 0a 20 20 69 6e 74 20 66 64 31 20 3d  EN);.  int fd1 =
2ce30 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 69 6e 74   pFile->h;.  int
2ce40 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 72   result = 0;.  r
2ce50 65 73 75 6c 74 20 3d 20 66 74 72 75 6e 63 61 74  esult = ftruncat
2ce60 65 28 66 64 31 2c 20 30 6c 6c 29 3b 0a 20 20 69  e(fd1, 0ll);.  i
2ce70 66 20 28 72 65 73 75 6c 74 29 20 7b 0a 20 20 20  f (result) {.   
2ce80 20 72 65 73 75 6c 74 20 3d 20 65 72 72 6e 6f 3b   result = errno;
2ce90 0a 20 20 7d 0a 20 20 69 66 20 28 72 65 73 75 6c  .  }.  if (resul
2cea0 74 29 20 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  t) {.    rc = SQ
2ceb0 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
2cec0 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
2ced0 46 69 6c 65 2c 20 72 65 73 75 6c 74 29 3b 0a 20  File, result);. 
2cee0 20 7d 0a 20 20 0a 20 20 69 6e 74 20 66 64 32 20   }.  .  int fd2 
2cef0 3d 20 6f 70 65 6e 28 6a 6f 75 72 6e 61 6c 50 61  = open(journalPa
2cf00 74 68 2c 20 4f 5f 52 44 57 52 29 3b 0a 20 20 69  th, O_RDWR);.  i
2cf10 6e 74 20 72 65 73 75 6c 74 32 20 3d 20 30 3b 0a  nt result2 = 0;.
2cf20 20 20 69 66 20 28 66 64 32 20 3c 20 30 29 20 7b    if (fd2 < 0) {
2cf30 0a 20 20 20 20 69 66 20 28 65 72 72 6e 6f 20 21  .    if (errno !
2cf40 3d 20 45 4e 4f 45 4e 54 29 20 7b 0a 20 20 20 20  = ENOENT) {.    
2cf50 20 20 72 65 73 75 6c 74 32 20 3d 20 65 72 72 6e    result2 = errn
2cf60 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  o;.    } else {.
2cf70 20 20 20 20 20 20 72 65 73 75 6c 74 32 20 3d 20        result2 = 
2cf80 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73  0;.    }.  } els
2cf90 65 20 7b 0a 20 20 20 20 72 65 73 75 6c 74 32 20  e {.    result2 
2cfa0 3d 20 66 74 72 75 6e 63 61 74 65 28 66 64 32 2c  = ftruncate(fd2,
2cfb0 20 30 6c 6c 29 3b 0a 20 20 20 20 69 66 20 28 72   0ll);.    if (r
2cfc0 65 73 75 6c 74 32 29 20 7b 0a 20 20 20 20 20 20  esult2) {.      
2cfd0 72 65 73 75 6c 74 32 20 3d 20 65 72 72 6e 6f 3b  result2 = errno;
2cfe0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 20  .    }.  }.  if 
2cff0 28 72 65 73 75 6c 74 32 20 26 26 20 21 72 65 73  (result2 && !res
2d000 75 6c 74 29 20 7b 0a 20 20 20 20 72 63 20 3d 20  ult) {.    rc = 
2d010 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
2d020 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
2d030 28 70 46 69 6c 65 2c 20 72 65 73 75 6c 74 32 29  (pFile, result2)
2d040 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 6e 74 20 66  ;.  }.  .  int f
2d050 64 33 20 3d 20 6f 70 65 6e 28 77 61 6c 50 61 74  d3 = open(walPat
2d060 68 2c 20 4f 5f 52 44 57 52 29 3b 0a 20 20 69 6e  h, O_RDWR);.  in
2d070 74 20 72 65 73 75 6c 74 33 20 3d 20 30 3b 0a 20  t result3 = 0;. 
2d080 20 69 66 20 28 66 64 33 20 3c 20 30 29 20 7b 0a   if (fd3 < 0) {.
2d090 20 20 20 20 69 66 20 28 65 72 72 6e 6f 20 21 3d      if (errno !=
2d0a0 20 45 4e 4f 45 4e 54 29 20 7b 0a 20 20 20 20 20   ENOENT) {.     
2d0b0 20 72 65 73 75 6c 74 33 20 3d 20 65 72 72 6e 6f   result3 = errno
2d0c0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
2d0d0 20 20 20 20 20 72 65 73 75 6c 74 33 20 3d 20 30       result3 = 0
2d0e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65  ;.    }.  } else
2d0f0 20 7b 0a 20 20 20 20 72 65 73 75 6c 74 33 20 3d   {.    result3 =
2d100 20 66 74 72 75 6e 63 61 74 65 28 66 64 33 2c 20   ftruncate(fd3, 
2d110 30 6c 6c 29 3b 0a 20 20 20 20 69 66 20 28 72 65  0ll);.    if (re
2d120 73 75 6c 74 33 29 20 7b 0a 20 20 20 20 20 20 72  sult3) {.      r
2d130 65 73 75 6c 74 33 20 3d 20 65 72 72 6e 6f 3b 0a  esult3 = errno;.
2d140 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 20 28      }.  }.  if (
2d150 72 65 73 75 6c 74 33 20 26 26 20 21 28 72 65 73  result3 && !(res
2d160 75 6c 74 20 7c 7c 20 72 65 73 75 6c 74 32 29 29  ult || result2))
2d170 20 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49   {.    rc = SQLI
2d180 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 73 74  TE_IOERR;.    st
2d190 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
2d1a0 6c 65 2c 20 72 65 73 75 6c 74 32 29 3b 0a 20 20  le, result2);.  
2d1b0 7d 0a 20 20 0a 20 20 69 66 20 28 66 64 33 20 3e  }.  .  if (fd3 >
2d1c0 3d 20 30 29 20 7b 0a 20 20 20 20 66 73 79 6e 63  = 0) {.    fsync
2d1d0 28 66 64 33 29 3b 0a 20 20 20 20 63 6c 6f 73 65  (fd3);.    close
2d1e0 28 66 64 33 29 3b 0a 20 20 7d 0a 20 20 69 66 20  (fd3);.  }.  if 
2d1f0 28 66 64 32 20 3e 3d 20 30 29 20 7b 0a 20 20 20  (fd2 >= 0) {.   
2d200 20 66 73 79 6e 63 28 66 64 32 29 3b 0a 20 20 20   fsync(fd2);.   
2d210 20 63 6c 6f 73 65 28 66 64 32 29 3b 0a 20 20 7d   close(fd2);.  }
2d220 0a 20 20 66 73 79 6e 63 28 66 64 31 29 3b 0a 09  .  fsync(fd1);..
2d230 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2d240 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2d250 54 72 75 6e 63 61 74 65 44 61 74 61 62 61 73 65  TruncateDatabase
2d260 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
2d270 2c 20 69 6e 74 20 62 46 6c 61 67 73 29 20 7b 0a  , int bFlags) {.
2d280 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
2d290 69 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  id = (sqlite3_fi
2d2a0 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e  le *)pFile;.  in
2d2b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2d2c0 3b 0a 20 20 76 6f 69 64 20 2a 70 4c 6f 63 6b 20  ;.  void *pLock 
2d2d0 3d 20 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20 66 6c  = NULL;.  int fl
2d2e0 61 67 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63  ags = 0;.  int c
2d2f0 6f 72 72 75 70 74 46 69 6c 65 4c 6f 63 6b 20 3d  orruptFileLock =
2d300 20 30 3b 0a 20 20 69 6e 74 20 69 73 43 6f 72 72   0;.  int isCorr
2d310 75 70 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 66  upt = 0;.  int f
2d320 6f 72 63 65 20 3d 20 28 62 46 6c 61 67 73 20 26  orce = (bFlags &
2d330 20 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45   SQLITE_TRUNCATE
2d340 5f 46 4f 52 43 45 29 3b 0a 20 20 69 6e 74 20 73  _FORCE);.  int s
2d350 61 66 65 46 61 69 6c 65 64 20 3d 20 30 3b 0a 0a  afeFailed = 0;..
2d360 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2d370 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f  E_DATA_PROTECTIO
2d380 4e 0a 20 20 66 6c 61 67 73 20 7c 3d 20 70 46 69  N.  flags |= pFi
2d390 6c 65 2d 3e 70 72 6f 74 46 6c 61 67 73 3b 0a 23  le->protFlags;.#
2d3a0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
2d3b0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2d3c0 53 54 59 4c 45 0a 20 20 69 66 28 20 69 73 50 72  STYLE.  if( isPr
2d3d0 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70  oxyLockingMode(p
2d3e0 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 66 6c 61  File) ){.    fla
2d3f0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
2d400 4e 5f 41 55 54 4f 50 52 4f 58 59 3b 0a 20 20 7d  N_AUTOPROXY;.  }
2d410 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63 20  .#endif.  .  rc 
2d420 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75  = sqlite3demo_su
2d430 70 65 72 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 7a  perlock(pFile->z
2d440 50 61 74 68 2c 20 30 2c 20 66 6c 61 67 73 2c 20  Path, 0, flags, 
2d450 30 2c 20 30 2c 20 26 70 4c 6f 63 6b 29 3b 0a 20  0, 0, &pLock);. 
2d460 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69   if( rc ){.    i
2d470 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f  f( rc==SQLITE_CO
2d480 52 52 55 50 54 20 7c 7c 20 72 63 3d 3d 53 51 4c  RRUPT || rc==SQL
2d490 49 54 45 5f 4e 4f 54 41 44 42 20 29 7b 0a 20 20  ITE_NOTADB ){.  
2d4a0 20 20 20 20 69 73 43 6f 72 72 75 70 74 20 3d 20      isCorrupt = 
2d4b0 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  1;.      rc = sq
2d4c0 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c  lite3demo_superl
2d4d0 6f 63 6b 5f 63 6f 72 72 75 70 74 28 69 64 2c 20  ock_corrupt(id, 
2d4e0 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c  SQLITE_LOCK_EXCL
2d4f0 55 53 49 56 45 2c 0a 20 20 20 20 20 20 20 20 20  USIVE,.         
2d500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d520 26 63 6f 72 72 75 70 74 46 69 6c 65 4c 6f 63 6b  &corruptFileLock
2d530 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2d540 20 72 63 20 26 26 20 21 66 6f 72 63 65 20 29 7b   rc && !force ){
2d550 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2d560 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
2d570 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 49   SQLITE_OK; /* I
2d580 67 6e 6f 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e  gnore the lockin
2d590 67 20 66 61 69 6c 75 72 65 20 69 66 20 66 6f 72  g failure if for
2d5a0 63 65 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20  ce is true */.  
2d5b0 7d 0a 20 20 69 66 28 20 28 62 46 6c 61 67 73 26  }.  if( (bFlags&
2d5c0 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f  SQLITE_TRUNCATE_
2d5d0 49 4e 49 54 49 41 4c 49 5a 45 5f 48 45 41 44 45  INITIALIZE_HEADE
2d5e0 52 5f 4d 41 53 4b 29 21 3d 30 20 29 7b 0a 20 20  R_MASK)!=0 ){.  
2d5f0 20 20 2f 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    /* initialize 
2d600 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69  a new database i
2d610 6e 20 54 4d 50 44 49 52 20 61 6e 64 20 63 6f 70  n TMPDIR and cop
2d620 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  y the contents o
2d630 76 65 72 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ver */.    const
2d640 20 63 68 61 72 20 2a 74 44 69 72 20 3d 20 75 6e   char *tDir = un
2d650 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 29 3b  ixTempFileDir();
2d660 0a 20 20 20 20 69 6e 74 20 74 44 69 72 4c 65 6e  .    int tDirLen
2d670 20 3d 20 73 74 72 6c 65 6e 28 74 44 69 72 29 3b   = strlen(tDir);
2d680 0a 20 20 20 20 69 6e 74 20 74 4c 65 6e 20 3d 20  .    int tLen = 
2d690 73 69 7a 65 6f 66 28 63 68 61 72 29 20 2a 20 28  sizeof(char) * (
2d6a0 74 44 69 72 4c 65 6e 20 2b 20 31 32 29 3b 0a 20  tDirLen + 12);. 
2d6b0 20 20 20 63 68 61 72 20 2a 74 44 62 50 61 74 68     char *tDbPath
2d6c0 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f   = (char *)mallo
2d6d0 63 28 74 4c 65 6e 29 3b 0a 20 20 20 20 69 6e 74  c(tLen);.    int
2d6e0 20 74 46 64 20 3d 20 2d 31 3b 0a 20 20 20 20 0a   tFd = -1;.    .
2d6f0 20 20 20 20 73 74 72 6c 63 70 79 28 74 44 62 50      strlcpy(tDbP
2d700 61 74 68 2c 20 74 44 69 72 2c 20 74 4c 65 6e 29  ath, tDir, tLen)
2d710 3b 0a 20 20 20 20 69 66 28 20 74 44 62 50 61 74  ;.    if( tDbPat
2d720 68 5b 28 74 44 69 72 4c 65 6e 2d 31 29 5d 20 21  h[(tDirLen-1)] !
2d730 3d 20 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 73  = '/' ){.      s
2d740 74 72 6c 63 61 74 28 74 44 62 50 61 74 68 2c 20  trlcat(tDbPath, 
2d750 22 2f 74 6d 70 64 62 58 58 58 58 58 22 2c 20 74  "/tmpdbXXXXX", t
2d760 4c 65 6e 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  Len);.    } else
2d770 20 7b 0a 20 20 20 20 20 20 73 74 72 6c 63 61 74   {.      strlcat
2d780 28 74 44 62 50 61 74 68 2c 20 22 74 6d 70 64 62  (tDbPath, "tmpdb
2d790 58 58 58 58 58 22 2c 20 74 4c 65 6e 29 3b 0a 20  XXXXX", tLen);. 
2d7a0 20 20 20 7d 0a 20 20 20 20 74 46 64 20 3d 20 6d     }.    tFd = m
2d7b0 6b 73 74 65 6d 70 28 74 44 62 50 61 74 68 29 3b  kstemp(tDbPath);
2d7c0 0a 20 20 20 20 69 66 28 20 74 46 64 3d 3d 2d 31  .    if( tFd==-1
2d7d0 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
2d7e0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
2d7f0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63  errno);.      rc
2d800 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b   = SQLITE_IOERR;
2d810 0a 20 20 20 20 20 20 73 61 66 65 46 61 69 6c 65  .      safeFaile
2d820 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 1;.    }else
2d830 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
2d840 2a 74 44 62 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  *tDb = NULL;.   
2d850 20 20 20 63 6f 70 79 66 69 6c 65 5f 73 74 61 74     copyfile_stat
2d860 65 5f 74 20 73 3b 0a 20 20 20 20 20 20 69 6e 74  e_t s;.      int
2d870 20 74 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f   trc = sqlite3_o
2d880 70 65 6e 5f 76 32 28 74 44 62 50 61 74 68 2c 20  pen_v2(tDbPath, 
2d890 26 74 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20  &tDb,.          
2d8a0 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
2d8b0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53  _OPEN_CREATE | S
2d8c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
2d8d0 52 49 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  RITE.           
2d8e0 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
2d8f0 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f  ITE_OPEN_AUTOPRO
2d900 58 59 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  XY), NULL);.    
2d910 20 20 63 68 61 72 20 2a 65 72 72 6d 73 67 20 3d    char *errmsg =
2d920 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 63 6f 6e   NULL;.      con
2d930 73 74 20 63 68 61 72 20 2a 73 71 6c 20 3d 20 22  st char *sql = "
2d940 22 3b 0a 20 20 20 20 20 20 69 66 28 20 21 74 72  ";.      if( !tr
2d950 63 20 26 26 20 28 62 46 6c 61 67 73 26 53 51 4c  c && (bFlags&SQL
2d960 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 50 41 47  ITE_TRUNCATE_PAG
2d970 45 53 49 5a 45 5f 4d 41 53 4b 29 20 29 7b 0a 20  ESIZE_MASK) ){. 
2d980 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
2d990 72 20 70 61 67 65 73 69 7a 65 5f 73 71 6c 5b 34  r pagesize_sql[4
2d9a0 5d 5b 32 32 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ][22] = {.      
2d9b0 20 20 20 20 22 70 72 61 67 6d 61 20 70 61 67 65      "pragma page
2d9c0 5f 73 69 7a 65 3d 31 30 32 34 22 2c 0a 20 20 20  _size=1024",.   
2d9d0 20 20 20 20 20 20 20 22 70 72 61 67 6d 61 20 70         "pragma p
2d9e0 61 67 65 5f 73 69 7a 65 3d 32 30 34 38 22 2c 0a  age_size=2048",.
2d9f0 20 20 20 20 20 20 20 20 20 20 22 70 72 61 67 6d            "pragm
2da00 61 20 70 61 67 65 5f 73 69 7a 65 3d 34 30 39 36  a page_size=4096
2da10 22 2c 0a 20 20 20 20 20 20 20 20 20 20 22 70 72  ",.          "pr
2da20 61 67 6d 61 20 70 61 67 65 5f 73 69 7a 65 3d 38  agma page_size=8
2da30 31 39 32 22 20 0a 20 20 20 20 20 20 20 20 7d 3b  192" .        };
2da40 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 61  .        int iPa
2da50 67 65 73 69 7a 65 20 3d 20 28 28 28 62 46 6c 61  gesize = (((bFla
2da60 67 73 26 53 51 4c 49 54 45 5f 54 52 55 4e 43 41  gs&SQLITE_TRUNCA
2da70 54 45 5f 50 41 47 45 53 49 5a 45 5f 4d 41 53 4b  TE_PAGESIZE_MASK
2da80 29 20 3e 3e 20 34 29 20 2d 20 31 29 3b 0a 20 20  ) >> 4) - 1);.  
2da90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 50        assert( iP
2daa0 61 67 65 73 69 7a 65 3e 3d 30 20 26 26 20 69 50  agesize>=0 && iP
2dab0 61 67 65 73 69 7a 65 3c 3d 34 20 29 3b 0a 20 20  agesize<=4 );.  
2dac0 20 20 20 20 20 20 73 71 6c 20 3d 20 70 61 67 65        sql = page
2dad0 73 69 7a 65 5f 73 71 6c 5b 69 50 61 67 65 73 69  size_sql[iPagesi
2dae0 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20 74 72 63  ze];.        trc
2daf0 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
2db00 74 44 62 2c 20 73 71 6c 2c 20 30 2c 20 30 2c 20  tDb, sql, 0, 0, 
2db10 26 65 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20  &errmsg);.      
2db20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 74 72 63  }.      if( !trc
2db30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
2db40 74 20 63 68 61 72 20 61 75 74 6f 76 61 63 75 75  t char autovacuu
2db50 6d 5f 73 71 6c 5b 33 5d 5b 32 31 5d 20 3d 20 7b  m_sql[3][21] = {
2db60 0a 20 20 20 20 20 20 20 20 20 20 22 70 72 61 67  .          "prag
2db70 6d 61 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 30  ma auto_vacuum=0
2db80 22 2c 0a 20 20 20 20 20 20 20 20 20 20 22 70 72  ",.          "pr
2db90 61 67 6d 61 20 61 75 74 6f 5f 76 61 63 75 75 6d  agma auto_vacuum
2dba0 3d 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20 22  =1",.          "
2dbb0 70 72 61 67 6d 61 20 61 75 74 6f 5f 76 61 63 75  pragma auto_vacu
2dbc0 75 6d 3d 32 22 0a 20 20 20 20 20 20 20 20 7d 3b  um=2".        };
2dbd0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 75  .        int iAu
2dbe0 74 6f 76 61 63 75 75 6d 20 3d 20 32 3b 20 2f 2a  tovacuum = 2; /*
2dbf0 20 64 65 66 61 75 6c 74 20 74 6f 20 69 6e 63 72   default to incr
2dc00 65 6d 65 6e 74 61 6c 20 2a 2f 0a 20 20 20 20 20  emental */.     
2dc10 20 20 20 69 66 28 20 28 62 46 6c 61 67 73 26 53     if( (bFlags&S
2dc20 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 41  QLITE_TRUNCATE_A
2dc30 55 54 4f 56 41 43 55 55 4d 5f 4d 41 53 4b 29 20  UTOVACUUM_MASK) 
2dc40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 41 75  ){.          iAu
2dc50 74 6f 76 61 63 75 75 6d 20 3d 20 28 28 28 62 46  tovacuum = (((bF
2dc60 6c 61 67 73 26 53 51 4c 49 54 45 5f 54 52 55 4e  lags&SQLITE_TRUN
2dc70 43 41 54 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  CATE_AUTOVACUUM_
2dc80 4d 41 53 4b 29 20 3e 3e 20 32 29 20 2d 20 31 29  MASK) >> 2) - 1)
2dc90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2dca0 20 20 20 20 61 73 73 65 72 74 28 20 69 41 75 74      assert( iAut
2dcb0 6f 76 61 63 75 75 6d 3e 3d 30 20 26 26 20 69 41  ovacuum>=0 && iA
2dcc0 75 74 6f 76 61 63 75 75 6d 3c 3d 32 20 29 3b 0a  utovacuum<=2 );.
2dcd0 20 20 20 20 20 20 20 20 73 71 6c 20 3d 20 61 75          sql = au
2dce0 74 6f 76 61 63 75 75 6d 5f 73 71 6c 5b 69 41 75  tovacuum_sql[iAu
2dcf0 74 6f 76 61 63 75 75 6d 5d 3b 0a 20 20 20 20 20  tovacuum];.     
2dd00 20 20 20 74 72 63 20 3d 20 73 71 6c 69 74 65 33     trc = sqlite3
2dd10 5f 65 78 65 63 28 74 44 62 2c 20 73 71 6c 2c 20  _exec(tDb, sql, 
2dd20 30 2c 20 30 2c 20 26 65 72 72 6d 73 67 29 3b 0a  0, 0, &errmsg);.
2dd30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2dd40 28 20 21 74 72 63 20 26 26 20 28 62 46 6c 61 67  ( !trc && (bFlag
2dd50 73 26 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54  s&SQLITE_TRUNCAT
2dd60 45 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  E_JOURNALMODE_WA
2dd70 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  L) ){.        sq
2dd80 6c 20 3d 20 22 70 72 61 67 6d 61 20 6a 6f 75 72  l = "pragma jour
2dd90 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 3b 0a 20  nal_mode=wal";. 
2dda0 20 20 20 20 20 20 20 74 72 63 20 3d 20 73 71 6c         trc = sql
2ddb0 69 74 65 33 5f 65 78 65 63 28 74 44 62 2c 20 73  ite3_exec(tDb, s
2ddc0 71 6c 2c 20 30 2c 20 30 2c 20 26 65 72 72 6d 73  ql, 0, 0, &errms
2ddd0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
2dde0 20 20 69 66 28 20 74 72 63 20 29 7b 0a 20 20 20    if( trc ){.   
2ddf0 20 20 20 20 20 69 66 28 20 21 74 44 62 20 29 7b       if( !tDb ){
2de00 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
2de10 74 66 28 73 74 64 65 72 72 2c 20 22 66 61 69 6c  tf(stderr, "fail
2de20 65 64 20 74 6f 20 6f 70 65 6e 20 74 65 6d 70 20  ed to open temp 
2de30 64 61 74 61 62 61 73 65 20 27 25 73 27 20 74 6f  database '%s' to
2de40 20 72 65 73 65 74 20 22 0a 20 20 20 20 20 20 20   reset ".       
2de50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de60 20 20 20 22 74 72 75 6e 63 61 74 65 64 20 64 61     "truncated da
2de70 74 61 62 61 73 65 20 25 73 20 77 69 74 68 20 66  tabase %s with f
2de80 6c 61 67 73 20 25 78 3a 20 25 64 5c 6e 22 2c 0a  lags %x: %d\n",.
2de90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dea0 20 20 20 20 20 20 20 20 20 20 20 74 44 62 50 61             tDbPa
2deb0 74 68 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  th, pFile->zPath
2dec0 2c 20 62 46 6c 61 67 73 2c 20 74 72 63 29 3b 0a  , bFlags, trc);.
2ded0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2dee0 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
2def0 28 73 74 64 65 72 72 2c 20 22 66 61 69 6c 65 64  (stderr, "failed
2df00 20 74 6f 20 73 65 74 20 27 25 73 27 20 6f 6e 20   to set '%s' on 
2df10 74 72 75 6e 63 61 74 65 64 20 64 61 74 61 62 61  truncated databa
2df20 73 65 20 25 73 2c 20 25 64 3a 20 22 0a 20 20 20  se %s, %d: ".   
2df30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df40 20 20 20 20 20 20 20 22 25 73 5c 6e 22 2c 20 73         "%s\n", s
2df50 71 6c 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  ql, pFile->zPath
2df60 2c 20 74 72 63 2c 20 65 72 72 6d 73 67 29 3b 0a  , trc, errmsg);.
2df70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2df80 7d 0a 20 20 20 20 20 20 69 66 28 20 74 44 62 20  }.      if( tDb 
2df90 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f  ){.        int o
2dfa0 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ff = 0;.        
2dfb0 2f 2a 20 6d 65 72 67 65 20 74 68 65 20 77 61 6c  /* merge the wal
2dfc0 20 69 6e 74 6f 20 74 68 65 20 64 62 20 2a 2f 0a   into the db */.
2dfd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2dfe0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 74 44 62  file_control(tDb
2dff0 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46  , NULL, SQLITE_F
2e000 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c  CNTL_PERSIST_WAL
2e010 2c 20 26 6f 66 66 29 3b 0a 20 20 20 20 20 20 20  , &off);.       
2e020 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 74   sqlite3_close(t
2e030 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Db);.      }.   
2e040 20 20 20 73 20 3d 20 63 6f 70 79 66 69 6c 65 5f     s = copyfile_
2e050 73 74 61 74 65 5f 61 6c 6c 6f 63 28 29 3b 0a 20  state_alloc();. 
2e060 20 20 20 20 20 6c 73 65 65 6b 28 74 46 64 2c 20       lseek(tFd, 
2e070 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  0, SEEK_SET);.  
2e080 20 20 20 20 6c 73 65 65 6b 28 70 46 69 6c 65 2d      lseek(pFile-
2e090 3e 68 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54 29  >h, 0, SEEK_SET)
2e0a0 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63 6f 70  ;.      if( fcop
2e0b0 79 66 69 6c 65 28 74 46 64 2c 20 70 46 69 6c 65  yfile(tFd, pFile
2e0c0 2d 3e 68 2c 20 73 2c 20 43 4f 50 59 46 49 4c 45  ->h, s, COPYFILE
2e0d0 5f 44 41 54 41 29 20 29 7b 0a 20 20 20 20 20 20  _DATA) ){.      
2e0e0 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b    int err=errno;
2e0f0 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28  .        switch(
2e100 65 72 72 29 20 7b 0a 20 20 20 20 20 20 20 20 20  err) {.         
2e110 20 63 61 73 65 20 45 4e 4f 4d 45 4d 3a 0a 20 20   case ENOMEM:.  
2e120 20 20 20 20 20 20 20 20 20 20 74 72 63 20 3d 20            trc = 
2e130 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2e140 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2e150 0a 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75  .          defau
2e160 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  lt:.            
2e170 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
2e180 46 69 6c 65 2c 20 65 72 72 29 3b 0a 20 20 20 20  File, err);.    
2e190 20 20 20 20 20 20 20 20 74 72 63 20 3d 20 53 51          trc = SQ
2e1a0 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
2e1b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2e1c0 20 20 20 20 63 6f 70 79 66 69 6c 65 5f 73 74 61      copyfile_sta
2e1d0 74 65 5f 66 72 65 65 28 73 29 3b 0a 20 20 20 20  te_free(s);.    
2e1e0 20 20 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68    fsync(pFile->h
2e1f0 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 74  );.      close(t
2e200 46 64 29 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e  Fd);.      unlin
2e210 6b 28 74 44 62 50 61 74 68 29 3b 0a 20 20 20 20  k(tDbPath);.    
2e220 20 20 69 66 28 20 74 72 63 21 3d 53 51 4c 49 54    if( trc!=SQLIT
2e230 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2e240 73 61 66 65 46 61 69 6c 65 64 20 3d 20 31 3b 0a  safeFailed = 1;.
2e250 20 20 20 20 20 20 20 20 72 63 20 3d 20 74 72 63          rc = trc
2e260 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2e270 20 20 20 20 66 72 65 65 28 74 44 62 50 61 74 68      free(tDbPath
2e280 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  );.  } else {.  
2e290 20 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d    rc = pFile->pM
2e2a0 65 74 68 6f 64 2d 3e 78 54 72 75 6e 63 61 74 65  ethod->xTruncate
2e2b0 28 69 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20  (id, .          
2e2c0 20 28 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67   ((pFile->fsFlag
2e2d0 73 20 26 20 53 51 4c 49 54 45 5f 46 53 46 4c 41  s & SQLITE_FSFLA
2e2e0 47 53 5f 49 53 5f 4d 53 44 4f 53 29 20 21 3d 20  GS_IS_MSDOS) != 
2e2f0 30 29 20 3f 20 31 4c 20 3a 20 30 4c 29 3b 0a 20  0) ? 1L : 0L);. 
2e300 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2e310 20 20 20 73 61 66 65 46 61 69 6c 65 64 20 3d 20     safeFailed = 
2e320 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  1;.    }.  }.  i
2e330 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e340 20 7c 7c 20 66 6f 72 63 65 20 29 7b 0a 20 20 20   || force ){.   
2e350 20 72 63 20 3d 20 75 6e 69 78 49 6e 76 61 6c 69   rc = unixInvali
2e360 64 61 74 65 53 75 70 70 6f 72 74 46 69 6c 65 73  dateSupportFiles
2e370 28 70 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20  (pFile, 0);.    
2e380 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2e390 73 61 66 65 46 61 69 6c 65 64 20 3d 20 31 3b 0a  safeFailed = 1;.
2e3a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 69 6c      }.  }.  pFil
2e3b0 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 53 79 6e  e->pMethod->xSyn
2e3c0 63 28 69 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  c(id, SQLITE_SYN
2e3d0 43 5f 46 55 4c 4c 29 3b 0a 0a 0a 20 20 69 66 28  C_FULL);...  if(
2e3e0 20 69 73 43 6f 72 72 75 70 74 20 29 7b 0a 20 20   isCorrupt ){.  
2e3f0 20 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75    sqlite3demo_su
2e400 70 65 72 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70  perunlock_corrup
2e410 74 28 69 64 2c 20 63 6f 72 72 75 70 74 46 69 6c  t(id, corruptFil
2e420 65 4c 6f 63 6b 29 3b 0a 20 20 7d 65 6c 73 65 20  eLock);.  }else 
2e430 69 66 28 20 70 4c 6f 63 6b 20 29 7b 0a 20 20 20  if( pLock ){.   
2e440 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70   sqlite3demo_sup
2e450 65 72 75 6e 6c 6f 63 6b 28 70 4c 6f 63 6b 29 3b  erunlock(pLock);
2e460 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
2e470 73 65 72 74 28 66 6f 72 63 65 29 3b 0a 20 20 7d  sert(force);.  }
2e480 0a 20 20 0a 20 20 69 66 28 20 66 6f 72 63 65 20  .  .  if( force 
2e490 26 26 20 73 61 66 65 46 61 69 6c 65 64 29 7b 0a  && safeFailed){.
2e4a0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 55 6e 73      rc = unixUns
2e4b0 61 66 65 54 72 75 6e 63 61 74 65 44 61 74 61 62  afeTruncateDatab
2e4c0 61 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a  ase(pFile);.  }.
2e4d0 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a    .  return rc;.
2e4e0 7d 0a 0a 2f 2a 0a 20 2a 2a 20 4c 6f 63 6b 20 6c  }../*. ** Lock l
2e4f0 6f 63 61 74 69 6f 6e 73 20 66 6f 72 20 73 68 61  ocations for sha
2e500 72 65 64 2d 6d 65 6d 6f 72 79 20 6c 6f 63 6b 73  red-memory locks
2e510 20 75 73 65 64 20 62 79 20 57 41 4c 20 6d 6f 64   used by WAL mod
2e520 65 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  e.. */.#ifndef S
2e530 48 4d 5f 42 41 53 45 0a 23 20 64 65 66 69 6e 65  HM_BASE.# define
2e540 20 53 48 4d 5f 42 41 53 45 20 20 20 20 20 20 20   SHM_BASE       
2e550 20 20 20 31 32 30 0a 23 20 64 65 66 69 6e 65 20     120.# define 
2e560 53 48 4d 5f 57 52 49 54 45 20 20 20 20 20 20 20  SHM_WRITE       
2e570 20 20 53 48 4d 5f 42 41 53 45 0a 23 20 64 65 66    SHM_BASE.# def
2e580 69 6e 65 20 53 48 4d 5f 43 48 45 43 4b 50 4f 49  ine SHM_CHECKPOI
2e590 4e 54 20 20 20 20 28 53 48 4d 5f 42 41 53 45 2b  NT    (SHM_BASE+
2e5a0 31 29 0a 23 20 64 65 66 69 6e 65 20 53 48 4d 5f  1).# define SHM_
2e5b0 52 45 43 4f 56 45 52 20 20 20 20 20 20 20 28 53  RECOVER       (S
2e5c0 48 4d 5f 42 41 53 45 2b 32 29 0a 23 20 64 65 66  HM_BASE+2).# def
2e5d0 69 6e 65 20 53 48 4d 5f 52 45 41 44 5f 46 49 52  ine SHM_READ_FIR
2e5e0 53 54 20 20 20 20 28 53 48 4d 5f 42 41 53 45 2b  ST    (SHM_BASE+
2e5f0 33 29 0a 23 20 64 65 66 69 6e 65 20 53 48 4d 5f  3).# define SHM_
2e600 52 45 41 44 5f 53 49 5a 45 20 20 20 20 20 35 0a  READ_SIZE     5.
2e610 23 65 6e 64 69 66 20 2f 2a 20 53 48 4d 5f 42 41  #endif /* SHM_BA
2e620 53 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  SE */../*.** Thi
2e630 73 20 74 65 73 74 20 6f 6e 6c 79 20 77 6f 72 6b  s test only work
2e640 73 20 66 6f 72 20 6c 6f 63 6b 20 74 65 73 74 69  s for lock testi
2e650 6e 67 20 6f 6e 20 75 6e 69 78 2f 70 6f 73 69 78  ng on unix/posix
2e660 20 56 46 53 2e 0a 2a 2a 20 41 64 61 70 74 65 64   VFS..** Adapted
2e670 20 66 72 6f 6d 20 74 6f 6f 6c 2f 67 65 74 6c 6f   from tool/getlo
2e680 63 6b 2e 63 20 66 34 63 33 39 62 36 35 31 33 37  ck.c f4c39b65137
2e690 30 31 35 36 63 61 65 39 37 39 35 30 31 61 37 62  0156cae979501a7b
2e6a0 31 35 36 62 64 62 61 35 30 65 37 63 65 0a 2a 2f  156bdba50e7ce.*/
2e6b0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2e6c0 4c 6f 63 6b 73 74 61 74 65 50 69 64 28 75 6e 69  LockstatePid(uni
2e6d0 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 70 69  xFile *pFile, pi
2e6e0 64 5f 74 20 70 69 64 2c 20 69 6e 74 20 2a 70 4c  d_t pid, int *pL
2e6f0 6f 63 6b 73 74 61 74 65 29 7b 0a 20 20 69 6e 74  ockstate){.  int
2e700 20 68 44 62 3b 20 20 20 20 20 20 20 20 2f 2a 20   hDb;        /* 
2e710 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
2e720 66 6f 72 20 74 68 65 20 6f 70 65 6e 20 64 61 74  for the open dat
2e730 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2e740 69 6e 74 20 68 53 68 6d 20 3d 20 2d 31 3b 20 20  int hShm = -1;  
2e750 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
2e760 6f 72 20 66 6f 72 20 57 41 4c 20 73 68 61 72 65  or for WAL share
2e770 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  d-memory file */
2e780 0a 20 20 73 73 69 7a 65 5f 74 20 67 6f 74 3b 20  .  ssize_t got; 
2e790 20 20 20 2f 2a 20 42 79 74 65 73 20 72 65 61 64     /* Bytes read
2e7a0 20 66 72 6f 6d 20 68 65 61 64 65 72 20 2a 2f 0a   from header */.
2e7b0 20 20 69 6e 74 20 69 73 57 61 6c 20 3d 20 30 3b    int isWal = 0;
2e7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e7d0 54 72 75 65 20 69 66 20 69 6e 20 57 41 4c 20 6d  True if in WAL m
2e7e0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f  ode */.  int nLo
2e7f0 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ck = 0;         
2e800 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2e810 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
2e820 20 69 6e 74 20 6e 6f 48 64 72 20 3d 20 30 3b 20   int noHdr = 0; 
2e830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5a              /* Z
2e840 65 72 6f 20 62 79 74 65 20 44 42 20 68 61 73 20  ero byte DB has 
2e850 6e 6f 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  no header */.  u
2e860 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 48 64  nsigned char aHd
2e870 72 5b 31 30 30 5d 3b 20 20 20 2f 2a 20 44 61 74  r[100];   /* Dat
2e880 61 62 61 73 65 20 68 65 61 64 65 72 20 2a 2f 0a  abase header */.
2e890 20 20 0a 20 20 61 73 73 65 72 74 28 70 4c 6f 63    .  assert(pLoc
2e8a0 6b 73 74 61 74 65 29 3b 0a 20 20 0a 20 20 2f 2a  kstate);.  .  /*
2e8b0 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20 61 72   make sure we ar
2e8c0 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
2e8d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2e8e0 2f 0a 20 20 68 44 62 20 3d 20 70 46 69 6c 65 2d  /.  hDb = pFile-
2e8f0 3e 68 3b 0a 20 20 69 66 28 20 68 44 62 3c 30 20  >h;.  if( hDb<0 
2e900 29 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61  ){.    *pLocksta
2e910 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  te = SQLITE_LOCK
2e920 53 54 41 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  STATE_ERROR;.   
2e930 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2e940 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65  RROR;.  }.  asse
2e950 72 74 28 20 28 73 74 72 6c 65 6e 28 53 51 4c 49  rt( (strlen(SQLI
2e960 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 29 2b  TE_FILE_HEADER)+
2e970 31 29 3d 3d 53 51 4c 49 54 45 5f 46 49 4c 45 5f  1)==SQLITE_FILE_
2e980 48 45 41 44 45 52 5f 4c 45 4e 20 29 3b 0a 20 20  HEADER_LEN );.  
2e990 67 6f 74 20 3d 20 70 72 65 61 64 28 68 44 62 2c  got = pread(hDb,
2e9a0 20 61 48 64 72 2c 20 31 30 30 2c 20 30 29 3b 0a   aHdr, 100, 0);.
2e9b0 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20    if( got<0 ){. 
2e9c0 20 20 20 2a 70 4c 6f 63 6b 73 74 61 74 65 20 3d     *pLockstate =
2e9d0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54   SQLITE_LOCKSTAT
2e9e0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74  E_ERROR;.    ret
2e9f0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
2ea00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 6f 74 3d  ;.  }.  if( got=
2ea10 3d 30 20 29 7b 0a 20 20 20 20 6e 6f 48 64 72 20  =0 ){.    noHdr 
2ea20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
2ea30 20 67 6f 74 21 3d 31 30 30 0a 20 20 20 20 20 20   got!=100.      
2ea40 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 48 64     || memcmp(aHd
2ea50 72 2c 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48  r, SQLITE_FILE_H
2ea60 45 41 44 45 52 2c 20 53 51 4c 49 54 45 5f 46 49  EADER, SQLITE_FI
2ea70 4c 45 5f 48 45 41 44 45 52 5f 4c 45 4e 29 21 3d  LE_HEADER_LEN)!=
2ea80 30 0a 20 20 29 7b 0a 20 20 20 20 2a 70 4c 6f 63  0.  ){.    *pLoc
2ea90 6b 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  kstate = SQLITE_
2eaa0 4c 4f 43 4b 53 54 41 54 45 5f 4e 4f 54 41 44 42  LOCKSTATE_NOTADB
2eab0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2eac0 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 7d 0a  ITE_NOTADB;.  }.
2ead0 20 20 0a 20 20 2f 2a 20 46 69 72 73 74 20 63 68    .  /* First ch
2eae0 65 63 6b 20 66 6f 72 20 61 6e 20 65 78 63 6c 75  eck for an exclu
2eaf0 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 6e  sive lock */.  n
2eb00 4c 6f 63 6b 20 2b 3d 20 75 6e 69 78 49 73 4c 6f  Lock += unixIsLo
2eb10 63 6b 65 64 28 70 69 64 2c 20 68 44 62 2c 20 46  cked(pid, hDb, F
2eb20 5f 52 44 4c 43 4b 2c 20 53 48 41 52 45 44 5f 46  _RDLCK, SHARED_F
2eb30 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a  IRST, SHARED_SIZ
2eb40 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
2eb50 20 20 20 20 20 20 20 20 20 20 20 22 45 58 43 4c             "EXCL
2eb60 55 53 49 56 45 22 29 3b 0a 20 20 69 66 20 28 21  USIVE");.  if (!
2eb70 6e 6f 48 64 72 29 20 7b 0a 20 20 20 20 69 73 57  noHdr) {.    isW
2eb80 61 6c 20 3d 20 61 48 64 72 5b 31 38 5d 3d 3d 32  al = aHdr[18]==2
2eb90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 63  ;.  }.  if( nLoc
2eba0 6b 3d 3d 30 20 26 26 20 69 73 57 61 6c 3d 3d 30  k==0 && isWal==0
2ebb0 20 29 7b 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c 62   ){.    /* Rollb
2ebc0 61 63 6b 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20  ack mode */.    
2ebd0 6e 4c 6f 63 6b 20 2b 3d 20 75 6e 69 78 49 73 4c  nLock += unixIsL
2ebe0 6f 63 6b 65 64 28 70 69 64 2c 20 68 44 62 2c 20  ocked(pid, hDb, 
2ebf0 46 5f 57 52 4c 43 4b 2c 20 50 45 4e 44 49 4e 47  F_WRLCK, PENDING
2ec00 5f 42 59 54 45 2c 20 53 48 41 52 45 44 5f 53 49  _BYTE, SHARED_SI
2ec10 5a 45 2b 32 2c 0a 20 20 20 20 20 20 20 20 20 20  ZE+2,.          
2ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec30 22 50 45 4e 44 49 4e 47 7c 52 45 53 45 52 56 45  "PENDING|RESERVE
2ec40 44 7c 53 48 41 52 45 44 22 29 3b 0a 20 20 7d 0a  D|SHARED");.  }.
2ec50 20 20 69 66 28 20 6e 4c 6f 63 6b 3d 3d 30 20 26    if( nLock==0 &
2ec60 26 20 69 73 57 61 6c 21 3d 30 20 29 7b 0a 20 20  & isWal!=0 ){.  
2ec70 20 20 2f 2a 20 6c 6f 6f 6b 75 70 20 74 68 65 20    /* lookup the 
2ec80 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2ec90 66 6f 72 20 74 68 65 20 73 68 61 72 65 64 20 6d  for the shared m
2eca0 65 6d 6f 72 79 20 66 69 6c 65 20 69 66 20 77 65  emory file if we
2ecb0 20 68 61 76 65 20 69 74 20 6f 70 65 6e 0a 20 20   have it open.  
2ecc0 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 70 72 6f    ** in this pro
2ecd0 63 65 73 73 20 2a 2f 0a 20 20 20 20 75 6e 69 78  cess */.    unix
2ece0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a  EnterMutex(); /*
2ecf0 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   Because pFile->
2ed00 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64  pInode is shared
2ed10 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 20   across threads 
2ed20 2a 2f 0a 20 20 20 20 75 6e 69 78 53 68 6d 4e 6f  */.    unixShmNo
2ed30 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70  de *pShmNode = p
2ed40 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  File->pInode->pS
2ed50 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 69 66 28 20  hmNode;.    if( 
2ed60 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20  pShmNode ){.    
2ed70 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2ed80 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
2ed90 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 0a 20  mutex);.      . 
2eda0 20 20 20 20 20 68 53 68 6d 20 3d 20 70 53 68 6d       hShm = pShm
2edb0 4e 6f 64 65 2d 3e 68 3b 0a 20 20 20 20 20 20 69  Node->h;.      i
2edc0 66 28 20 68 53 68 6d 20 3e 3d 20 30 29 7b 0a 20  f( hShm >= 0){. 
2edd0 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 49         if( unixI
2ede0 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 53 68  sLocked(pid, hSh
2edf0 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48 4d 5f  m, F_RDLCK, SHM_
2ee00 52 45 43 4f 56 45 52 2c 20 31 2c 20 22 57 41 4c  RECOVER, 1, "WAL
2ee10 2d 52 45 43 4f 56 45 52 59 22 29 20 7c 7c 0a 20  -RECOVERY") ||. 
2ee20 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 49 73            unixIs
2ee30 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 53 68 6d  Locked(pid, hShm
2ee40 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48 4d 5f 57  , F_RDLCK, SHM_W
2ee50 52 49 54 45 2c 20 31 2c 20 22 57 41 4c 2d 57 52  RITE, 1, "WAL-WR
2ee60 49 54 45 22 29 20 29 7b 0a 20 20 20 20 20 20 20  ITE") ){.       
2ee70 20 20 20 6e 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20     nLock = 1;.  
2ee80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2ee90 20 20 20 20 20 20 0a 20 20 20 20 20 20 73 71 6c        .      sql
2eea0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
2eeb0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
2eec0 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 0a 20  );.    } .    . 
2eed0 20 20 20 69 66 28 20 68 53 68 6d 3c 30 20 29 7b     if( hShm<0 ){
2eee0 0a 20 20 20 20 20 20 2f 2a 20 74 68 65 20 73 68  .      /* the sh
2eef0 61 72 65 64 20 6d 65 6d 6f 72 79 20 66 69 6c 65  ared memory file
2ef00 20 69 73 6e 27 74 20 6f 70 65 6e 20 69 6e 20 74   isn't open in t
2ef10 68 69 73 20 70 72 6f 63 65 73 73 20 73 70 61 63  his process spac
2ef20 65 2c 20 6f 70 65 6e 20 6f 75 72 0a 20 20 20 20  e, open our.    
2ef30 20 20 2a 2a 20 6f 77 6e 20 46 44 20 2a 2f 0a 20    ** own FD */. 
2ef40 20 20 20 20 20 63 68 61 72 20 7a 53 68 6d 5b 4d       char zShm[M
2ef50 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 20 20  AXPATHLEN];.    
2ef60 20 20 0a 20 20 20 20 20 20 2f 2a 20 57 41 4c 20    .      /* WAL 
2ef70 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 73 74  mode */.      st
2ef80 72 6c 63 70 79 28 7a 53 68 6d 2c 20 70 46 69 6c  rlcpy(zShm, pFil
2ef90 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58 50 41 54  e->zPath, MAXPAT
2efa0 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 73 74 72  HLEN);.      str
2efb0 6c 63 61 74 28 7a 53 68 6d 2c 20 22 2d 73 68 6d  lcat(zShm, "-shm
2efc0 22 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  ", MAXPATHLEN);.
2efd0 20 20 20 20 20 20 68 53 68 6d 20 3d 20 6f 70 65        hShm = ope
2efe0 6e 28 7a 53 68 6d 2c 20 4f 5f 52 44 4f 4e 4c 59  n(zShm, O_RDONLY
2eff0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2f000 68 53 68 6d 3c 30 20 29 7b 0a 20 20 20 20 20 20  hShm<0 ){.      
2f010 20 20 2a 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20    *pLockstate = 
2f020 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45  SQLITE_LOCKSTATE
2f030 5f 4f 46 46 3b 0a 20 20 20 20 20 20 20 20 75 6e  _OFF;.        un
2f040 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
2f050 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2f060 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2f070 7d 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78  }.      if( unix
2f080 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 53  IsLocked(pid, hS
2f090 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48 4d  hm, F_RDLCK, SHM
2f0a0 5f 52 45 43 4f 56 45 52 2c 20 31 2c 20 22 57 41  _RECOVER, 1, "WA
2f0b0 4c 2d 52 45 43 4f 56 45 52 59 22 29 20 7c 7c 0a  L-RECOVERY") ||.
2f0c0 20 20 20 20 20 20 20 20 20 75 6e 69 78 49 73 4c           unixIsL
2f0d0 6f 63 6b 65 64 28 70 69 64 2c 20 68 53 68 6d 2c  ocked(pid, hShm,
2f0e0 20 46 5f 52 44 4c 43 4b 2c 20 53 48 4d 5f 57 52   F_RDLCK, SHM_WR
2f0f0 49 54 45 2c 20 31 2c 20 22 57 41 4c 2d 57 52 49  ITE, 1, "WAL-WRI
2f100 54 45 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20  TE") ){.        
2f110 6e 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20  nLock = 1;.     
2f120 20 7d 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 68   }.      close(h
2f130 53 68 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Shm);.    }.    
2f140 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
2f150 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 63  ;.  }.  if( nLoc
2f160 6b 3e 30 20 29 7b 0a 20 20 20 20 2a 70 4c 6f 63  k>0 ){.    *pLoc
2f170 6b 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  kstate = SQLITE_
2f180 4c 4f 43 4b 53 54 41 54 45 5f 4f 4e 3b 0a 20 20  LOCKSTATE_ON;.  
2f190 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2a 70 4c  } else {.    *pL
2f1a0 6f 63 6b 73 74 61 74 65 20 3d 20 53 51 4c 49 54  ockstate = SQLIT
2f1b0 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4f 46 46 3b  E_LOCKSTATE_OFF;
2f1c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
2f1d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64  LITE_OK;.}..#end
2f1e0 69 66 20 2f 2a 20 28 53 51 4c 49 54 45 5f 45 4e  if /* (SQLITE_EN
2f1f0 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30  ABLE_APPLE_SPI>0
2f200 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  ) && defined(__A
2f210 50 50 4c 45 5f 5f 29 20 2a 2f 0a 0a 23 69 66 20  PPLE__) */..#if 
2f220 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
2f230 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20  SIZE>0./*.** If 
2f240 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
2f250 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2c 20 75  memory mapped, u
2f260 6e 6d 61 70 20 66 69 6c 65 20 70 46 64 2e 0a 2a  nmap file pFd..*
2f270 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
2f280 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78  ixUnmapfile(unix
2f290 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 61 73  File *pFd){.  as
2f2a0 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63  sert( pFd->nFetc
2f2b0 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28  hOut==0 );.  if(
2f2c0 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
2f2d0 20 29 7b 0a 20 20 20 20 6f 73 4d 75 6e 6d 61 70   ){.    osMunmap
2f2e0 28 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  (pFd->pMapRegion
2f2f0 2c 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41  , pFd->mmapSizeA
2f300 63 74 75 61 6c 29 3b 0a 20 20 20 20 70 46 64 2d  ctual);.    pFd-
2f310 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b  >pMapRegion = 0;
2f320 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69  .    pFd->mmapSi
2f330 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d  ze = 0;.    pFd-
2f340 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20  >mmapSizeActual 
2f350 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
2f360 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
2f370 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
2f380 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20   memory mapping 
2f390 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 66 69  maintained by fi
2f3a0 6c 65 20 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  le .** descripto
2f3b0 72 20 70 46 64 20 74 6f 20 6e 4e 65 77 20 62 79  r pFd to nNew by
2f3c0 74 65 73 2e 20 41 6e 79 20 65 78 69 73 74 69 6e  tes. Any existin
2f3d0 67 20 6d 61 70 70 69 6e 67 20 69 73 20 64 69 73  g mapping is dis
2f3e0 63 61 72 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  carded..**.** If
2f3f0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69   successful, thi
2f400 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  s function sets 
2f410 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  the following va
2f420 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  riables:.**.**  
2f430 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 70 4d       unixFile.pM
2f440 61 70 52 65 67 69 6f 6e 0a 2a 2a 20 20 20 20 20  apRegion.**     
2f450 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53    unixFile.mmapS
2f460 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69  ize.**       uni
2f470 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65 41 63  xFile.mmapSizeAc
2f480 74 75 61 6c 0a 2a 2a 0a 2a 2a 20 49 66 20 75 6e  tual.**.** If un
2f490 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 65  successful, an e
2f4a0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
2f4b0 6c 6f 67 67 65 64 20 76 69 61 20 73 71 6c 69 74  logged via sqlit
2f4c0 65 33 5f 6c 6f 67 28 29 20 61 6e 64 0a 2a 2a 20  e3_log() and.** 
2f4d0 74 68 65 20 74 68 72 65 65 20 76 61 72 69 61 62  the three variab
2f4e0 6c 65 73 20 61 62 6f 76 65 20 61 72 65 20 7a 65  les above are ze
2f4f0 72 6f 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  roed. In this ca
2f500 73 65 20 53 51 4c 69 74 65 20 73 68 6f 75 6c 64  se SQLite should
2f510 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 63 63  .** continue acc
2f520 65 73 73 69 6e 67 20 74 68 65 20 64 61 74 61 62  essing the datab
2f530 61 73 65 20 75 73 69 6e 67 20 74 68 65 20 78 52  ase using the xR
2f540 65 61 64 28 29 20 61 6e 64 20 78 57 72 69 74 65  ead() and xWrite
2f550 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 73 2e 0a 2a  ().** methods..*
2f560 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
2f570 69 78 52 65 6d 61 70 66 69 6c 65 28 0a 20 20 75  ixRemapfile(.  u
2f580 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 20 20  nixFile *pFd,   
2f590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f5a0 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
2f5b0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36  r object */.  i6
2f5c0 34 20 6e 4e 65 77 20 20 20 20 20 20 20 20 20 20  4 nNew          
2f5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f5e0 20 52 65 71 75 69 72 65 64 20 6d 61 70 70 69 6e   Required mappin
2f5f0 67 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 63  g size */.){.  c
2f600 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20  onst char *zErr 
2f610 3d 20 22 6d 6d 61 70 22 3b 0a 20 20 69 6e 74 20  = "mmap";.  int 
2f620 68 20 3d 20 70 46 64 2d 3e 68 3b 20 20 20 20 20  h = pFd->h;     
2f630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f640 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
2f650 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 64 62 20 66  tor open on db f
2f660 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 70 4f 72  ile */.  u8 *pOr
2f670 69 67 20 3d 20 28 75 38 20 2a 29 70 46 64 2d 3e  ig = (u8 *)pFd->
2f680 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20 2f 2a  pMapRegion;   /*
2f690 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72   Pointer to curr
2f6a0 65 6e 74 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  ent file mapping
2f6b0 20 2a 2f 0a 20 20 69 36 34 20 6e 4f 72 69 67 20   */.  i64 nOrig 
2f6c0 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41  = pFd->mmapSizeA
2f6d0 63 74 75 61 6c 3b 20 20 20 20 20 2f 2a 20 53 69  ctual;     /* Si
2f6e0 7a 65 20 6f 66 20 70 4f 72 69 67 20 72 65 67 69  ze of pOrig regi
2f6f0 6f 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  on in bytes */. 
2f700 20 75 38 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20   u8 *pNew = 0;  
2f710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f720 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f        /* Locatio
2f730 6e 20 6f 66 20 6e 65 77 20 6d 61 70 70 69 6e 67  n of new mapping
2f740 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
2f750 3d 20 50 52 4f 54 5f 52 45 41 44 3b 20 20 20 20  = PROT_READ;    
2f760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
2f770 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6d  ags to pass to m
2f780 6d 61 70 28 29 20 2a 2f 0a 0a 20 20 61 73 73 65  map() */..  asse
2f790 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f  rt( pFd->nFetchO
2f7a0 75 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ut==0 );.  asser
2f7b0 74 28 20 6e 4e 65 77 3e 70 46 64 2d 3e 6d 6d 61  t( nNew>pFd->mma
2f7c0 70 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  pSize );.  asser
2f7d0 74 28 20 6e 4e 65 77 3c 3d 70 46 64 2d 3e 6d 6d  t( nNew<=pFd->mm
2f7e0 61 70 53 69 7a 65 4d 61 78 20 29 3b 0a 20 20 61  apSizeMax );.  a
2f7f0 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b  ssert( nNew>0 );
2f800 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e  .  assert( pFd->
2f810 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3e 3d  mmapSizeActual>=
2f820 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b  pFd->mmapSize );
2f830 0a 20 20 61 73 73 65 72 74 28 20 4d 41 50 5f 46  .  assert( MAP_F
2f840 41 49 4c 45 44 21 3d 30 20 29 3b 0a 0a 23 69 66  AILED!=0 );..#if
2f850 64 65 66 20 53 51 4c 49 54 45 5f 4d 4d 41 50 5f  def SQLITE_MMAP_
2f860 52 45 41 44 57 52 49 54 45 0a 20 20 69 66 28 20  READWRITE.  if( 
2f870 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20  (pFd->ctrlFlags 
2f880 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c  & UNIXFILE_RDONL
2f890 59 29 3d 3d 30 20 29 20 66 6c 61 67 73 20 7c 3d  Y)==0 ) flags |=
2f8a0 20 50 52 4f 54 5f 57 52 49 54 45 3b 0a 23 65 6e   PROT_WRITE;.#en
2f8b0 64 69 66 0a 0a 20 20 69 66 28 20 70 4f 72 69 67  dif..  if( pOrig
2f8c0 20 29 7b 0a 23 69 66 20 48 41 56 45 5f 4d 52 45   ){.#if HAVE_MRE
2f8d0 4d 41 50 0a 20 20 20 20 69 36 34 20 6e 52 65 75  MAP.    i64 nReu
2f8e0 73 65 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69  se = pFd->mmapSi
2f8f0 7a 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63 6f  ze;.#else.    co
2f900 6e 73 74 20 69 6e 74 20 73 7a 53 79 73 70 61 67  nst int szSyspag
2f910 65 20 3d 20 6f 73 47 65 74 70 61 67 65 73 69 7a  e = osGetpagesiz
2f920 65 28 29 3b 0a 20 20 20 20 69 36 34 20 6e 52 65  e();.    i64 nRe
2f930 75 73 65 20 3d 20 28 70 46 64 2d 3e 6d 6d 61 70  use = (pFd->mmap
2f940 53 69 7a 65 20 26 20 7e 28 73 7a 53 79 73 70 61  Size & ~(szSyspa
2f950 67 65 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20  ge-1));.#endif. 
2f960 20 20 20 75 38 20 2a 70 52 65 71 20 3d 20 26 70     u8 *pReq = &p
2f970 4f 72 69 67 5b 6e 52 65 75 73 65 5d 3b 0a 0a 20  Orig[nReuse];.. 
2f980 20 20 20 2f 2a 20 55 6e 6d 61 70 20 61 6e 79 20     /* Unmap any 
2f990 70 61 67 65 73 20 6f 66 20 74 68 65 20 65 78 69  pages of the exi
2f9a0 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 74 68  sting mapping th
2f9b0 61 74 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 75  at cannot be reu
2f9c0 73 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  sed. */.    if( 
2f9d0 6e 52 65 75 73 65 21 3d 6e 4f 72 69 67 20 29 7b  nReuse!=nOrig ){
2f9e0 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28  .      osMunmap(
2f9f0 70 52 65 71 2c 20 6e 4f 72 69 67 2d 6e 52 65 75  pReq, nOrig-nReu
2fa00 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  se);.    }..#if 
2fa10 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20  HAVE_MREMAP.    
2fa20 70 4e 65 77 20 3d 20 6f 73 4d 72 65 6d 61 70 28  pNew = osMremap(
2fa30 70 4f 72 69 67 2c 20 6e 52 65 75 73 65 2c 20 6e  pOrig, nReuse, n
2fa40 4e 65 77 2c 20 4d 52 45 4d 41 50 5f 4d 41 59 4d  New, MREMAP_MAYM
2fa50 4f 56 45 29 3b 0a 20 20 20 20 7a 45 72 72 20 3d  OVE);.    zErr =
2fa60 20 22 6d 72 65 6d 61 70 22 3b 0a 23 65 6c 73 65   "mremap";.#else
2fa70 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d  .    pNew = osMm
2fa80 61 70 28 70 52 65 71 2c 20 6e 4e 65 77 2d 6e 52  ap(pReq, nNew-nR
2fa90 65 75 73 65 2c 20 66 6c 61 67 73 2c 20 4d 41 50  euse, flags, MAP
2faa0 5f 53 48 41 52 45 44 2c 20 68 2c 20 6e 52 65 75  _SHARED, h, nReu
2fab0 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  se);.    if( pNe
2fac0 77 21 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b  w!=MAP_FAILED ){
2fad0 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 21  .      if( pNew!
2fae0 3d 70 52 65 71 20 29 7b 0a 20 20 20 20 20 20 20  =pReq ){.       
2faf0 20 6f 73 4d 75 6e 6d 61 70 28 70 4e 65 77 2c 20   osMunmap(pNew, 
2fb00 6e 4e 65 77 20 2d 20 6e 52 65 75 73 65 29 3b 0a  nNew - nReuse);.
2fb10 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30          pNew = 0
2fb20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2fb30 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 4f         pNew = pO
2fb40 72 69 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rig;.      }.   
2fb50 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
2fb60 2a 20 54 68 65 20 61 74 74 65 6d 70 74 20 74 6f  * The attempt to
2fb70 20 65 78 74 65 6e 64 20 74 68 65 20 65 78 69 73   extend the exis
2fb80 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 66 61 69  ting mapping fai
2fb90 6c 65 64 2e 20 46 72 65 65 20 69 74 2e 20 2a 2f  led. Free it. */
2fba0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d  .    if( pNew==M
2fbb0 41 50 5f 46 41 49 4c 45 44 20 7c 7c 20 70 4e 65  AP_FAILED || pNe
2fbc0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73  w==0 ){.      os
2fbd0 4d 75 6e 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52  Munmap(pOrig, nR
2fbe0 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  euse);.    }.  }
2fbf0 0a 0a 20 20 2f 2a 20 49 66 20 70 4e 65 77 20 69  ..  /* If pNew i
2fc00 73 20 73 74 69 6c 6c 20 4e 55 4c 4c 2c 20 74 72  s still NULL, tr
2fc10 79 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 65  y to create an e
2fc20 6e 74 69 72 65 6c 79 20 6e 65 77 20 6d 61 70 70  ntirely new mapp
2fc30 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4e  ing. */.  if( pN
2fc40 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65  ew==0 ){.    pNe
2fc50 77 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4e  w = osMmap(0, nN
2fc60 65 77 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53  ew, flags, MAP_S
2fc70 48 41 52 45 44 2c 20 68 2c 20 30 29 3b 0a 20 20  HARED, h, 0);.  
2fc80 7d 0a 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d  }..  if( pNew==M
2fc90 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20  AP_FAILED ){.   
2fca0 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 6e   pNew = 0;.    n
2fcb0 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 75 6e 69  New = 0;.    uni
2fcc0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
2fcd0 5f 4f 4b 2c 20 7a 45 72 72 2c 20 70 46 64 2d 3e  _OK, zErr, pFd->
2fce0 7a 50 61 74 68 29 3b 0a 0a 20 20 20 20 2f 2a 20  zPath);..    /* 
2fcf0 49 66 20 74 68 65 20 6d 6d 61 70 28 29 20 61 62  If the mmap() ab
2fd00 6f 76 65 20 66 61 69 6c 65 64 2c 20 61 73 73 75  ove failed, assu
2fd10 6d 65 20 74 68 61 74 20 61 6c 6c 20 73 75 62 73  me that all subs
2fd20 65 71 75 65 6e 74 20 6d 6d 61 70 28 29 20 63 61  equent mmap() ca
2fd30 6c 6c 73 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  lls.    ** will 
2fd40 70 72 6f 62 61 62 6c 79 20 66 61 69 6c 20 74 6f  probably fail to
2fd50 6f 2e 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 20  o. Fall back to 
2fd60 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69  using xRead/xWri
2fd70 74 65 20 65 78 63 6c 75 73 69 76 65 6c 79 0a 20  te exclusively. 
2fd80 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 63 61     ** in this ca
2fd90 73 65 2e 20 20 2a 2f 0a 20 20 20 20 70 46 64 2d  se.  */.    pFd-
2fda0 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 30  >mmapSizeMax = 0
2fdb0 3b 0a 20 20 7d 0a 20 20 70 46 64 2d 3e 70 4d 61  ;.  }.  pFd->pMa
2fdc0 70 52 65 67 69 6f 6e 20 3d 20 28 76 6f 69 64 20  pRegion = (void 
2fdd0 2a 29 70 4e 65 77 3b 0a 20 20 70 46 64 2d 3e 6d  *)pNew;.  pFd->m
2fde0 6d 61 70 53 69 7a 65 20 3d 20 70 46 64 2d 3e 6d  mapSize = pFd->m
2fdf0 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20  mapSizeActual = 
2fe00 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  nNew;.}../*.** M
2fe10 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72 65 6d  emory map or rem
2fe20 61 70 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  ap the file open
2fe30 65 64 20 62 79 20 66 69 6c 65 2d 64 65 73 63 72  ed by file-descr
2fe40 69 70 74 6f 72 20 70 46 64 20 28 69 66 20 74 68  iptor pFd (if th
2fe50 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 6c 72  e file.** is alr
2fe60 65 61 64 79 20 6d 61 70 70 65 64 2c 20 74 68 65  eady mapped, the
2fe70 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
2fe80 67 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79  g is replaced by
2fe90 20 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c 20 69   the new). Or, i
2fea0 66 20 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72 65  f .** there alre
2feb0 61 64 79 20 65 78 69 73 74 73 20 61 20 6d 61 70  ady exists a map
2fec0 70 69 6e 67 20 66 6f 72 20 74 68 69 73 20 66 69  ping for this fi
2fed0 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  le, and there ar
2fee0 65 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f 75 74 73  e still .** outs
2fef0 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 28 29  tanding xFetch()
2ff00 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 69   references to i
2ff10 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  t, this function
2ff20 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
2ff30 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
2ff40 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e 65 67  nByte is non-neg
2ff50 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74 20 69  ative, then it i
2ff60 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
2ff70 73 69 7a 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20  size of .** the 
2ff80 6d 61 70 70 69 6e 67 20 74 6f 20 63 72 65 61 74  mapping to creat
2ff90 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
2ffa0 20 6e 42 79 74 65 20 69 73 20 6c 65 73 73 20 74   nByte is less t
2ffb0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
2ffc0 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64  he .** requested
2ffd0 20 73 69 7a 65 20 69 73 20 74 68 65 20 73 69 7a   size is the siz
2ffe0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  e of the file on
2fff0 20 64 69 73 6b 2e 20 54 68 65 20 61 63 74 75 61   disk. The actua
30000 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  l size of the.**
30010 20 63 72 65 61 74 65 64 20 6d 61 70 70 69 6e 67   created mapping
30020 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20 72   is either the r
30030 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 72  equested size or
30040 20 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69   the value confi
30050 67 75 72 65 64 20 0a 2a 2a 20 75 73 69 6e 67 20  gured .** using 
30060 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41  SQLITE_FCNTL_MMA
30070 50 5f 4c 49 4d 49 54 2c 20 77 68 69 63 68 65 76  P_LIMIT, whichev
30080 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a  er is smaller..*
30090 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
300a0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
300b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65   error occurs (e
300c0 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70 69  ven if the mappi
300d0 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63  ng is not.** rec
300e0 72 65 61 74 65 64 20 61 73 20 61 20 72 65 73 75  reated as a resu
300f0 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  lt of outstandin
30100 67 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f 72  g references) or
30110 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
30120 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69  .** code otherwi
30130 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
30140 74 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 75 6e  t unixMapfile(un
30150 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 69 36 34  ixFile *pFd, i64
30160 20 6e 4d 61 70 29 7b 0a 20 20 61 73 73 65 72 74   nMap){.  assert
30170 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64  ( nMap>=0 || pFd
30180 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29  ->nFetchOut==0 )
30190 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70  ;.  assert( nMap
301a0 3e 30 20 7c 7c 20 28 70 46 64 2d 3e 6d 6d 61 70  >0 || (pFd->mmap
301b0 53 69 7a 65 3d 3d 30 20 26 26 20 70 46 64 2d 3e  Size==0 && pFd->
301c0 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 29 20 29  pMapRegion==0) )
301d0 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46 65  ;.  if( pFd->nFe
301e0 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75 72  tchOut>0 ) retur
301f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
30200 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20  if( nMap<0 ){.  
30210 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
30220 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  atbuf;          
30230 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c  /* Low-level fil
30240 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
30250 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74  .    if( osFstat
30260 28 70 46 64 2d 3e 68 2c 20 26 73 74 61 74 62 75  (pFd->h, &statbu
30270 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  f) ){.      retu
30280 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
30290 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 20  FSTAT;.    }.   
302a0 20 6e 4d 61 70 20 3d 20 73 74 61 74 62 75 66 2e   nMap = statbuf.
302b0 73 74 5f 73 69 7a 65 3b 0a 20 20 7d 0a 20 20 69  st_size;.  }.  i
302c0 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61  f( nMap>pFd->mma
302d0 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20  pSizeMax ){.    
302e0 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70  nMap = pFd->mmap
302f0 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 0a 20 20  SizeMax;.  }..  
30300 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 30 20 7c  assert( nMap>0 |
30310 7c 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  | (pFd->mmapSize
30320 3d 3d 30 20 26 26 20 70 46 64 2d 3e 70 4d 61 70  ==0 && pFd->pMap
30330 52 65 67 69 6f 6e 3d 3d 30 29 20 29 3b 0a 20 20  Region==0) );.  
30340 69 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d  if( nMap!=pFd->m
30350 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 75  mapSize ){.    u
30360 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 70 46 64  nixRemapfile(pFd
30370 2c 20 6e 4d 61 70 29 3b 0a 20 20 7d 0a 0a 20 20  , nMap);.  }..  
30380 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
30390 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
303a0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
303b0 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ZE>0 */../*.** I
303c0 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 74 75  f possible, retu
303d0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
303e0 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69 6c  a mapping of fil
303f0 65 20 66 64 20 73 74 61 72 74 69 6e 67 20 61 74  e fd starting at
30400 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e   offset.** iOff.
30410 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d 75 73   The mapping mus
30420 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72 20 61  t be valid for a
30430 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62 79 74  t least nAmt byt
30440 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  es..**.** If suc
30450 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61 6e 20  h a pointer can 
30460 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f  be obtained, sto
30470 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61 6e 64  re it in *pp and
30480 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
30490 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65  K..** Or, if one
304a0 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65   cannot but no e
304b0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
304c0 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20 72 65   *pp to 0 and re
304d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
304e0 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61  ** Finally, if a
304f0 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  n error does occ
30500 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51  ur, return an SQ
30510 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
30520 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61   The final.** va
30530 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75 6e  lue of *pp is un
30540 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
30550 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
30560 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
30570 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  s return a point
30580 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d  er, the caller m
30590 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 20 0a  ust eventually .
305a0 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65 20 72  ** release the r
305b0 65 66 65 72 65 6e 63 65 20 62 79 20 63 61 6c 6c  eference by call
305c0 69 6e 67 20 75 6e 69 78 55 6e 66 65 74 63 68 28  ing unixUnfetch(
305d0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
305e0 20 75 6e 69 78 46 65 74 63 68 28 73 71 6c 69 74   unixFetch(sqlit
305f0 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
30600 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c   iOff, int nAmt,
30610 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66   void **pp){.#if
30620 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
30630 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69  _SIZE>0.  unixFi
30640 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46  le *pFd = (unixF
30650 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54  ile *)fd;   /* T
30660 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
30670 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23  tabase file */.#
30680 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b  endif.  *pp = 0;
30690 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
306a0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69  _MMAP_SIZE>0.  i
306b0 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  f( pFd->mmapSize
306c0 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  Max>0 ){.    if(
306d0 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
306e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
306f0 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c   rc = unixMapfil
30700 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20  e(pFd, -1);.    
30710 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30720 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
30730 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
30740 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20  Fd->mmapSize >= 
30750 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20  iOff+nAmt ){.   
30760 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a     *pp = &((u8 *
30770 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  )pFd->pMapRegion
30780 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70  )[iOff];.      p
30790 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b  Fd->nFetchOut++;
307a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
307b0 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
307c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
307d0 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  f the third argu
307e0 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  ment is non-NULL
307f0 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
30800 74 69 6f 6e 20 72 65 6c 65 61 73 65 73 20 61 20  tion releases a 
30810 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 62  .** reference ob
30820 74 61 69 6e 65 64 20 62 79 20 61 6e 20 65 61 72  tained by an ear
30830 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 75 6e 69  lier call to uni
30840 78 46 65 74 63 68 28 29 2e 20 54 68 65 20 73 65  xFetch(). The se
30850 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  cond.** argument
30860 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
30870 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
30880 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
30890 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
308a0 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61 74 20  * argument that 
308b0 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  was passed to th
308c0 65 20 75 6e 69 78 46 65 74 63 68 28 29 20 69 6e  e unixFetch() in
308d0 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  vocation. .**.**
308e0 20 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69 72   Or, if the thir
308f0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55  d argument is NU
30900 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  LL, then this fu
30910 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  nction is being 
30920 63 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20 69 6e  called .** to in
30930 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c 61 79  form the VFS lay
30940 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72 64 69  er that, accordi
30950 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79  ng to POSIX, any
30960 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
30970 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65  g .** may now be
30980 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f   invalid and sho
30990 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64 2e  uld be unmapped.
309a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
309b0 6e 69 78 55 6e 66 65 74 63 68 28 73 71 6c 69 74  nixUnfetch(sqlit
309c0 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
309d0 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b   iOff, void *p){
309e0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
309f0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e  MMAP_SIZE>0.  un
30a00 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75  ixFile *pFd = (u
30a10 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20 20  nixFile *)fd;   
30a20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
30a30 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
30a40 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
30a50 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a 0a 20 20  METER(iOff);..  
30a60 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61  /* If p==0 (unma
30a70 70 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c  p the entire fil
30a80 65 29 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e) then there mu
30a90 73 74 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e  st be no outstan
30aa0 64 69 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74 63  ding .  ** xFetc
30ab0 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72  h references. Or
30ac0 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69  , if p!=0 (meani
30ad0 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46 65 74  ng it is an xFet
30ae0 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20  ch reference),. 
30af0 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d   ** then there m
30b00 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
30b10 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e  one outstanding.
30b20 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
30b30 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65  p==0)==(pFd->nFe
30b40 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20  tchOut==0) );.. 
30b50 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20   /* If p!=0, it 
30b60 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65 20 69  must match the i
30b70 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  Off value. */.  
30b80 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20  assert( p==0 || 
30b90 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64 2d 3e  p==&((u8 *)pFd->
30ba0 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66  pMapRegion)[iOff
30bb0 5d 20 29 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b  ] );..  if( p ){
30bc0 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68  .    pFd->nFetch
30bd0 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Out--;.  }else{.
30be0 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c      unixUnmapfil
30bf0 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61  e(pFd);.  }..  a
30c00 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74  ssert( pFd->nFet
30c10 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6c 73  chOut>=0 );.#els
30c20 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
30c30 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53  ETER(fd);.  UNUS
30c40 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
30c50 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
30c60 54 45 52 28 69 4f 66 66 29 3b 0a 23 65 6e 64 69  TER(iOff);.#endi
30c70 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
30c80 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48  E_OK;.}../*.** H
30c90 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70  ere ends the imp
30ca0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
30cb0 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ll sqlite3_file 
30cc0 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  methods..**.****
30cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30ce0 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66  ** End sqlite3_f
30cf0 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a  ile Methods ****
30d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
30d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
30d70 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e  ** This division
30d80 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69   contains defini
30d90 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
30da0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
30db0 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c  cts that.** impl
30dc0 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66 69  ement various fi
30dd0 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  le locking strat
30de0 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f 20  egies.  It also 
30df0 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74  contains definit
30e00 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64  ions.** of "find
30e10 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  er" functions.  
30e20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  A finder-functio
30e30 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63  n is used to loc
30e40 61 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69  ate the appropri
30e50 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69  ate.** sqlite3_i
30e60 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
30e70 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61   for a particula
30e80 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  r database file.
30e90 20 20 54 68 65 20 70 41 70 70 44 61 74 61 0a 2a    The pAppData.*
30ea0 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73  * field of the s
30eb0 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20 6f  qlite3_vfs VFS o
30ec0 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74 69  bjects are initi
30ed0 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f 69  alized to be poi
30ee0 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  nters to.** the 
30ef0 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d 66  correct finder-f
30f00 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61 74  unction for that
30f10 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74   VFS..**.** Most
30f20 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
30f30 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  s return a point
30f40 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71  er to a fixed sq
30f50 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
30f60 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68 65  .** object.  The
30f70 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69 6e   only interestin
30f80 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  g finder-functio
30f90 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  n is autolockIoF
30fa0 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20  inder, which.** 
30fb0 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c  looks at the fil
30fc0 65 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e 64  esystem type and
30fd0 20 74 72 69 65 73 20 74 6f 20 67 75 65 73 73 20   tries to guess 
30fe0 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67  the best locking
30ff0 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72 6f  .** strategy fro
31000 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  m that..**.** Fo
31010 72 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  r finder-functio
31020 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73  n F, two objects
31030 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a   are created:.**
31040 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20 72  .**    (1) The r
31050 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  eal finder-funct
31060 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74  ion named "FImpt
31070 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  ()"..**.**    (2
31080 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69  ) A constant poi
31090 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e  nter to this fun
310a0 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74  ction named just
310b0 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41   "F"..**.**.** A
310c0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
310d0 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65  F pointer is use
310e0 64 20 61 73 20 74 68 65 20 70 41 70 70 44 61 74  d as the pAppDat
310f0 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a  a value for VFS.
31100 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20  ** objects.  We 
31110 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20  have to do this 
31120 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69  instead of letti
31130 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e  ng pAppData poin
31140 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74  t.** directly at
31150 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63   the finder-func
31160 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72  tion since C90 r
31170 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20 76  ules prevent a v
31180 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20  oid*.** from be 
31190 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63  cast into a func
311a0 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  tion pointer..**
311b0 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74  .**.** Each inst
311c0 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63  ance of this mac
311d0 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f  ro generates two
311e0 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20   objects:.**.** 
311f0 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20    *  A constant 
31200 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
31210 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d  ds object call M
31220 45 54 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c  ETHOD that has l
31230 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d  ocking.**      m
31240 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f  ethods CLOSE, LO
31250 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45  CK, UNLOCK, CKRE
31260 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  SLOCK..**.**   *
31270 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20    An I/O method 
31280 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  finder function 
31290 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68  called FINDER th
312a0 61 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  at returns a poi
312b0 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20  nter.**      to 
312c0 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63  the METHOD objec
312d0 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
312e0 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65  s bullet..*/.#de
312f0 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46  fine IOMETHODS(F
31300 49 4e 44 45 52 2c 4d 45 54 48 4f 44 2c 56 45 52  INDER,METHOD,VER
31310 53 49 4f 4e 2c 43 4c 4f 53 45 2c 4c 4f 43 4b 2c  SION,CLOSE,LOCK,
31320 55 4e 4c 4f 43 4b 2c 43 4b 4c 4f 43 4b 2c 53 48  UNLOCK,CKLOCK,SH
31330 4d 4d 41 50 29 20 20 20 20 20 5c 0a 73 74 61 74  MMAP)     \.stat
31340 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
31350 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48  _io_methods METH
31360 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20  OD = {          
31370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31380 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 56 45           \.   VE
31390 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20  RSION,          
313a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
313b0 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20  rsion */        
313c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
313d0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f          \.   CLO
313e0 53 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  SE,             
313f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
31400 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  se */           
31410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31420 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
31430 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  Read,           
31440 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64          /* xRead
31450 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
31460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31470 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57        \.   unixW
31480 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
31490 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65         /* xWrite
314a0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
314b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
314c0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72       \.   unixTr
314d0 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
314e0 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61        /* xTrunca
314f0 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  te */           
31500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31510 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e      \.   unixSyn
31520 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
31530 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f       /* xSync */
31540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31560 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65     \.   unixFile
31570 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
31580 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65      /* xFileSize
31590 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
315a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315b0 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20    \.   LOCK,    
315c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315d0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20     /* xLock */  
315e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31600 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20   \.   UNLOCK,   
31610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31620 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20    /* xUnlock */ 
31630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31650 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20  \.   CKLOCK,    
31660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31670 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
31680 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  edLock */       
31690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
316a0 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74  .   unixFileCont
316b0 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rol,            
316c0 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  /* xFileControl 
316d0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
316e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
316f0 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a     unixSectorSiz
31700 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
31710 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f  * xSectorSize */
31720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31730 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
31740 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72    unixDeviceChar
31750 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a  acteristics,  /*
31760 20 78 44 65 76 69 63 65 43 61 70 61 62 69 6c 69   xDeviceCapabili
31770 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20  ties */         
31780 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
31790 20 53 48 4d 4d 41 50 2c 20 20 20 20 20 20 20 20   SHMMAP,        
317a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
317b0 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20  xShmMap */      
317c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317d0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
317e0 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20  unixShmLock,    
317f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
31800 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  ShmLock */      
31810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31820 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
31830 6e 69 78 53 68 6d 42 61 72 72 69 65 72 2c 20 20  nixShmBarrier,  
31840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
31850 68 6d 42 61 72 72 69 65 72 20 2a 2f 20 20 20 20  hmBarrier */    
31860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31870 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
31880 69 78 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20  ixShmUnmap,     
31890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
318a0 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20 20  mUnmap */       
318b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318c0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
318d0 78 46 65 74 63 68 2c 20 20 20 20 20 20 20 20 20  xFetch,         
318e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74           /* xFet
318f0 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ch */           
31900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31910 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
31920 55 6e 66 65 74 63 68 2c 20 20 20 20 20 20 20 20  Unfetch,        
31930 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65          /* xUnfe
31940 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20  tch */          
31950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31960 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20        \.};      
31970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319b0 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f       \.static co
319c0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
319d0 65 74 68 6f 64 73 20 2a 46 49 4e 44 45 52 23 23  ethods *FINDER##
319e0 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61 72 20  Impl(const char 
319f0 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70 29  *z, unixFile *p)
31a00 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50  {   \.  UNUSED_P
31a10 41 52 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55  ARAMETER(z); UNU
31a20 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
31a30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a50 20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d     \.  return &M
31a60 45 54 48 4f 44 3b 20 20 20 20 20 20 20 20 20 20  ETHOD;          
31a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31aa0 20 20 5c 0a 7d 20 20 20 20 20 20 20 20 20 20 20    \.}           
31ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31af0 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20   \.static const 
31b00 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
31b10 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44  ds *(*const FIND
31b20 45 52 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ER)(const char*,
31b30 75 6e 69 78 46 69 6c 65 20 2a 70 29 20 20 20 20  unixFile *p)    
31b40 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45 52 23 23  \.    = FINDER##
31b50 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72  Impl;../*.** Her
31b60 65 20 61 72 65 20 61 6c 6c 20 6f 66 20 74 68 65  e are all of the
31b70 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
31b80 6f 64 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  ods objects for 
31b90 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  each of the.** l
31ba0 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65  ocking strategie
31bb0 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20 74 68  s.  Functions th
31bc0 61 74 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65  at return pointe
31bd0 72 73 20 74 6f 20 74 68 65 73 65 20 6d 65 74 68  rs to these meth
31be0 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20  ods.** are also 
31bf0 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45  created..*/.IOME
31c00 54 48 4f 44 53 28 0a 20 20 70 6f 73 69 78 49 6f  THODS(.  posixIo
31c10 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
31c20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
31c30 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
31c40 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20  posixIoMethods, 
31c50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
31c60 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
31c70 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
31c80 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   3,             
31c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
31ca0 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64 20  ared memory and 
31cb0 6d 6d 61 70 20 61 72 65 20 65 6e 61 62 6c 65 64  mmap are enabled
31cc0 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c   */.  unixClose,
31cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ce0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
31cf0 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20   */.  unixLock, 
31d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d10 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
31d20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c  */.  unixUnlock,
31d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31d40 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
31d50 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52   */.  unixCheckR
31d60 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
31d70 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
31d80 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
31d90 20 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20    unixShmMap    
31da0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
31db0 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
31dc0 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  .).IOMETHODS(.  
31dd0 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  nolockIoFinder, 
31de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
31df0 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
31e00 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d  e */.  nolockIoM
31e10 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
31e20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
31e30 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
31e40 6d 65 20 2a 2f 0a 20 20 32 2c 20 20 20 20 20 20  me */.  2,      
31e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e60 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
31e70 72 79 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  ry is enabled */
31e80 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20  .  nolockClose, 
31e90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31ea0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
31eb0 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20  .  nolockLock,  
31ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31ed0 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
31ee0 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20    nolockUnlock, 
31ef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
31f00 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
31f10 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65  .  nolockCheckRe
31f20 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 2f 2a 20  servedLock,  /* 
31f30 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
31f40 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30  ck method */.  0
31f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f60 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
31f70 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  Map method */.).
31f80 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f 74  IOMETHODS(.  dot
31f90 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20  lockIoFinder,   
31fa0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
31fb0 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
31fc0 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  /.  dotlockIoMet
31fd0 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 2f 2a  hods,         /*
31fe0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
31ff0 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
32000 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
32010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32020 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
32030 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
32040 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20   dotlockClose,  
32050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
32060 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
32070 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20   dotlockLock,   
32080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
32090 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
320a0 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20  dotlockUnlock,  
320b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
320c0 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
320d0 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73   dotlockCheckRes
320e0 65 72 76 65 64 4c 6f 63 6b 2c 20 2f 2a 20 78 43  ervedLock, /* xC
320f0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
32100 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20   method */.  0  
32110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32120 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
32130 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23  p method */.)..#
32140 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
32150 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49  _LOCKING_STYLE.I
32160 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63  OMETHODS(.  floc
32170 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
32180 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
32190 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
321a0 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  .  flockIoMethod
321b0 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
321c0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
321d0 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
321e0 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
321f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32200 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
32210 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
32220 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20  flockClose,     
32230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
32240 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
32250 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20  flockLock,      
32260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
32270 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66  ck method */.  f
32280 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  lockUnlock,     
32290 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
322a0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
322b0 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  flockCheckReserv
322c0 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78 43 68  edLock,   /* xCh
322d0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
322e0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20  method */.  0   
322f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32300 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
32310 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
32320 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f  dif..#if OS_VXWO
32330 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  RKS.IOMETHODS(. 
32340 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20   semIoFinder,   
32350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
32360 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
32370 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74  me */.  semIoMet
32380 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
32390 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
323a0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
323b0 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
323c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
323d0 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
323e0 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
323f0 2a 2f 0a 20 20 73 65 6d 58 43 6c 6f 73 65 2c 20  */.  semXClose, 
32400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32410 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
32420 2a 2f 0a 20 20 73 65 6d 58 4c 6f 63 6b 2c 20 20  */.  semXLock,  
32430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32440 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
32450 2f 0a 20 20 73 65 6d 58 55 6e 6c 6f 63 6b 2c 20  /.  semXUnlock, 
32460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32470 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
32480 2a 2f 0a 20 20 73 65 6d 58 43 68 65 63 6b 52 65  */.  semXCheckRe
32490 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 2f  servedLock,    /
324a0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
324b0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
324c0 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
324d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
324e0 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a  hmMap method */.
324f0 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  ).#endif..#if de
32500 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
32510 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
32520 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
32530 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70  IOMETHODS(.  afp
32540 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
32550 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
32560 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
32570 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73  /.  afpIoMethods
32580 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
32590 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
325a0 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
325b0 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
325c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
325d0 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
325e0 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
325f0 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20 20 20   afpClose,      
32600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
32610 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
32620 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20   afpLock,       
32630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
32640 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
32650 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  afpUnlock,      
32660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
32670 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
32680 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65   afpCheckReserve
32690 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43  dLock,     /* xC
326a0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
326b0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20   method */.  0  
326c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
326d0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
326e0 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  p method */.).#e
326f0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
32700 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65  proxy locking me
32710 74 68 6f 64 20 69 73 20 61 20 22 73 75 70 65 72  thod is a "super
32720 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 65 20  -method" in the 
32730 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a 2a 2a  sense that it.**
32740 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61 72 79   opens secondary
32750 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
32760 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20  s for the conch 
32770 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61  and lock files a
32780 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20 70 72  nd.** it uses pr
32790 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41  oxy, dot-file, A
327a0 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20  FP, and flock() 
327b0 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20  locking methods 
327c0 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f  on those.** seco
327d0 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20 46 6f  ndary files.  Fo
327e0 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74  r this reason, t
327f0 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74  he division that
32800 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70   implements.** p
32810 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
32820 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66 75 72  located much fur
32830 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65  ther down in the
32840 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65 20 6e   file.  But we n
32850 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65  eed.** to go ahe
32860 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20 74 68  ad and define th
32870 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
32880 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65 72 20  hods and finder 
32890 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  function.** for 
328a0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65  proxy locking he
328b0 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72 77 61  re.  So we forwa
328c0 72 64 20 64 65 63 6c 61 72 65 20 74 68 65 20 49  rd declare the I
328d0 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23  /O methods..*/.#
328e0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
328f0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
32900 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
32910 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74 20  TYLE.static int 
32920 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74  proxyClose(sqlit
32930 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69  e3_file*);.stati
32940 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28  c int proxyLock(
32950 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
32960 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  nt);.static int 
32970 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69  proxyUnlock(sqli
32980 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b  te3_file*, int);
32990 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
329a0 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  yCheckReservedLo
329b0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ck(sqlite3_file*
329c0 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f  , int*);.IOMETHO
329d0 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e  DS(.  proxyIoFin
329e0 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
329f0 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
32a00 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f  on name */.  pro
32a10 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  xyIoMethods,    
32a20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
32a30 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
32a40 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c  ect name */.  2,
32a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32a60 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
32a70 64 20 6d 65 6d 6f 72 79 20 69 73 20 65 6e 61 62  d memory is enab
32a80 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c  led */.  proxyCl
32a90 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
32aa0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
32ab0 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f  hod */.  proxyLo
32ac0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
32ad0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
32ae0 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c  od */.  proxyUnl
32af0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
32b00 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
32b10 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68  hod */.  proxyCh
32b20 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
32b30 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
32b40 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
32b50 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
32b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32b70 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64  * xShmMap method
32b80 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.).#endif../*
32b90 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53   nfs lockd on OS
32ba0 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20  X 10.3+ doesn't 
32bb0 63 6c 65 61 72 20 77 72 69 74 65 20 6c 6f 63 6b  clear write lock
32bc0 73 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f  s when a read lo
32bd0 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23 69 66  ck is set */.#if
32be0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
32bf0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
32c00 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
32c10 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  LE.IOMETHODS(.  
32c20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  nfsIoFinder,    
32c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
32c40 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
32c50 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74  me */.  nfsIoMet
32c60 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
32c70 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
32c80 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
32c90 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
32ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32cb0 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
32cc0 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
32cd0 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65  d */.  unixClose
32ce0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32cf0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
32d00 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b  od */.  unixLock
32d10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32d20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
32d30 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63  od */.  nfsUnloc
32d40 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
32d50 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
32d60 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68  thod */.  unixCh
32d70 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
32d80 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
32d90 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
32da0 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
32db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32dc0 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74    /* xShmMap met
32dd0 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
32de0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
32df0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
32e00 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
32e10 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68  _STYLE./* .** Th
32e20 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63  is "finder" func
32e30 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
32e40 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62   determine the b
32e50 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  est locking stra
32e60 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65  tegy .** for the
32e70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22   database file "
32e80 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74  filePath".  It t
32e90 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  hen returns the 
32ea0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
32eb0 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  ds.** object tha
32ec0 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61  t implements tha
32ed0 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a  t strategy..**.*
32ee0 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d 61  * This is for Ma
32ef0 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74  cOSX only..*/.st
32f00 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
32f10 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61  e3_io_methods *a
32f20 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49  utolockIoFinderI
32f30 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  mpl(.  const cha
32f40 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20  r *filePath,    
32f50 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* name of the d
32f60 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
32f70 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
32f80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 70             /* op
32f90 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 66  en file object f
32fa0 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
32fb0 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61  file */.){.  sta
32fc0 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
32fd0 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63   Mapping {.    c
32fe0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
32ff0 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20 20  system;         
33000 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73 74       /* Filesyst
33010 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a  em type name */.
33020 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65      const sqlite
33030 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d  3_io_methods *pM
33040 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70  ethods;   /* App
33050 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
33060 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61   method */.  } a
33070 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  Map[] = {.    { 
33080 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78  "hfs",    &posix
33090 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
330a0 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70 6f   { "ufs",    &po
330b0 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  sixIoMethods },.
330c0 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20 20      { "afpfs",  
330d0 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  &afpIoMethods },
330e0 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20  .    { "smbfs", 
330f0 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d   &afpIoMethods }
33100 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76 22  ,.    { "webdav"
33110 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  , &nolockIoMetho
33120 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30  ds },.    { 0, 0
33130 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b   }.  };.  int i;
33140 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73  .  struct statfs
33150 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   fsInfo;.  struc
33160 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f  t flock lockInfo
33170 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61  ;..  if( !filePa
33180 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  th ){.    /* If 
33190 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74  filePath==NULL t
331a0 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65  hat means we are
331b0 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
331c0 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20  transient file. 
331d0 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20     ** that does 
331e0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
331f0 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65  ocked. */.    re
33200 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  turn &nolockIoMe
33210 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28  thods;.  }.  if(
33220 20 73 74 61 74 66 73 28 66 69 6c 65 50 61 74 68   statfs(filePath
33230 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31  , &fsInfo) != -1
33240 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49 6e   ){.    if( fsIn
33250 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54  fo.f_flags & MNT
33260 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  _RDONLY ){.     
33270 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
33280 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a  oMethods;.    }.
33290 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61      for(i=0; aMa
332a0 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d  p[i].zFilesystem
332b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
332c0 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e  ( strcmp(fsInfo.
332d0 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d  f_fstypename, aM
332e0 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65  ap[i].zFilesyste
332f0 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)==0 ){.       
33300 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e   return aMap[i].
33310 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20  pMethods;.      
33320 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
33330 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20  * Default case. 
33340 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74  Handles, amongst
33350 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a   others, "nfs"..
33360 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d 72    ** Test byte-r
33370 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20  ange lock using 
33380 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65 20  fcntl(). If the 
33390 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20 0a  call succeeds, .
333a0 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74    ** assume that
333b0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
333c0 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58 20   supports POSIX 
333d0 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20  style locks. .  
333e0 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  */.  lockInfo.l_
333f0 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49  len = 1;.  lockI
33400 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b  nfo.l_start = 0;
33410 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68  .  lockInfo.l_wh
33420 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
33430 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79  .  lockInfo.l_ty
33440 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
33450 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77  if( osFcntl(pNew
33460 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  ->h, F_GETLK, &l
33470 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b  ockInfo)!=-1 ) {
33480 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
33490 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
334a0 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29  ame, "nfs")==0 )
334b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  {.      return &
334c0 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  nfsIoMethods;.  
334d0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
334e0 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f   return &posixIo
334f0 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20  Methods;.    }. 
33500 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
33510 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  rn &dotlockIoMet
33520 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  hods;.  }.}.stat
33530 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
33540 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a  _io_methods .  *
33550 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b  (*const autolock
33560 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20  IoFinder)(const 
33570 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
33580 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e   = autolockIoFin
33590 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66  derImpl;..#endif
335a0 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
335b0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
335c0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
335d0 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53  STYLE */..#if OS
335e0 5f 56 58 57 4f 52 4b 53 0a 2f 2a 0a 2a 2a 20 54  _VXWORKS./*.** T
335f0 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e  his "finder" fun
33600 63 74 69 6f 6e 20 66 6f 72 20 56 78 57 6f 72 6b  ction for VxWork
33610 73 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  s checks to see 
33620 69 66 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  if posix advisor
33630 79 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 77 6f 72  y.** locking wor
33640 6b 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c  ks.  If it does,
33650 20 74 68 65 6e 20 74 68 61 74 20 69 73 20 77 68   then that is wh
33660 61 74 20 69 73 20 75 73 65 64 2e 20 20 49 66 20  at is used.  If 
33670 69 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 77  it does not.** w
33680 6f 72 6b 2c 20 74 68 65 6e 20 66 61 6c 6c 62 61  ork, then fallba
33690 63 6b 20 74 6f 20 6e 61 6d 65 64 20 73 65 6d 61  ck to named sema
336a0 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a  phore locking..*
336b0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
336c0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
336d0 73 20 2a 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64  s *vxworksIoFind
336e0 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20  erImpl(.  const 
336f0 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20  char *filePath, 
33700 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68     /* name of th
33710 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
33720 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
33730 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a  New           /*
33740 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f   the open file o
33750 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74  bject */.){.  st
33760 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49  ruct flock lockI
33770 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c  nfo;..  if( !fil
33780 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20  ePath ){.    /* 
33790 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c  If filePath==NUL
337a0 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  L that means we 
337b0 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
337c0 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
337d0 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f  e.    ** that do
337e0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
337f0 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20  e locked. */.   
33800 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
33810 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20  oMethods;.  }.. 
33820 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74   /* Test if fcnt
33830 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74 65 64  l() is supported
33840 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73   and use POSIX s
33850 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a  tyle locks..  **
33860 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20   Otherwise fall 
33870 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65  back to the name
33880 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68  d semaphore meth
33890 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49  od..  */.  lockI
338a0 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  nfo.l_len = 1;. 
338b0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72   lockInfo.l_star
338c0 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66  t = 0;.  lockInf
338d0 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  o.l_whence = SEE
338e0 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66  K_SET;.  lockInf
338f0 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  o.l_type = F_RDL
33900 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74  CK;.  if( osFcnt
33910 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54  l(pNew->h, F_GET
33920 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d  LK, &lockInfo)!=
33930 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72  -1 ) {.    retur
33940 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  n &posixIoMethod
33950 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
33960 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74  return &semIoMet
33970 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  hods;.  }.}.stat
33980 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
33990 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a  _io_methods .  *
339a0 28 2a 63 6f 6e 73 74 20 76 78 77 6f 72 6b 73 49  (*const vxworksI
339b0 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63  oFinder)(const c
339c0 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20  har*,unixFile*) 
339d0 3d 20 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65  = vxworksIoFinde
339e0 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f  rImpl;..#endif /
339f0 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
33a00 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61  ./*.** An abstra
33a10 63 74 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f  ct type for a po
33a20 69 6e 74 65 72 20 74 6f 20 61 6e 20 49 4f 20 6d  inter to an IO m
33a30 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e  ethod finder fun
33a40 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65  ction:.*/.typede
33a50 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  f const sqlite3_
33a60 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69  io_methods *(*fi
33a70 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74  nder_type)(const
33a80 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
33a90 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.../**********
33aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33ae0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
33af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
33b00 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68  sqlite3_vfs meth
33b10 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
33b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33b30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69  .**.** This divi
33b40 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  sion contains th
33b50 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
33b60 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74   of methods on t
33b70 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  he.** sqlite3_vf
33b80 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a  s object..*/../*
33b90 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
33ba0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
33bb0 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
33bc0 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
33bd0 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74   by pId..*/.stat
33be0 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69  ic int fillInUni
33bf0 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33  xFile(.  sqlite3
33c00 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
33c10 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
33c20 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  fs object */.  i
33c30 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20  nt h,           
33c40 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66         /* Open f
33c50 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
33c60 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  f file being ope
33c70 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ned */.  sqlite3
33c80 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20  _file *pId,     
33c90 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65   /* Write to the
33ca0 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
33cb0 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
33cc0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
33cd0 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
33ce0 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20   the file being 
33cf0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  opened */.  int 
33d00 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20  ctrlFlags       
33d10 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d      /* Zero or m
33d20 6f 72 65 20 55 4e 49 58 46 49 4c 45 5f 2a 20 76  ore UNIXFILE_* v
33d30 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f  alues */.){.  co
33d40 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
33d50 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67  ethods *pLocking
33d60 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c  Style;.  unixFil
33d70 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46  e *pNew = (unixF
33d80 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74  ile *)pId;.  int
33d90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
33da0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ..  assert( pNew
33db0 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29  ->pInode==NULL )
33dc0 3b 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20  ;..  /* Usually 
33dd0 74 68 65 20 70 61 74 68 20 7a 46 69 6c 65 6e 61  the path zFilena
33de0 6d 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  me should not be
33df0 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
33e00 6e 61 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20 65  name. The.  ** e
33e10 78 63 65 70 74 69 6f 6e 20 69 73 20 77 68 65 6e  xception is when
33e20 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 70 72 6f   opening the pro
33e30 78 79 20 22 63 6f 6e 63 68 22 20 66 69 6c 65 20  xy "conch" file 
33e40 69 6e 20 62 75 69 6c 64 73 20 74 68 61 74 0a 20  in builds that. 
33e50 20 2a 2a 20 69 6e 63 6c 75 64 65 20 74 68 65 20   ** include the 
33e60 73 70 65 63 69 61 6c 20 41 70 70 6c 65 20 6c 6f  special Apple lo
33e70 63 6b 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20 20  cking styles..  
33e80 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
33e90 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
33ea0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
33eb0 4e 47 5f 53 54 59 4c 45 0a 20 20 61 73 73 65 72  NG_STYLE.  asser
33ec0 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  t( zFilename==0 
33ed0 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  || zFilename[0]=
33ee0 3d 27 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56 66  ='/' .    || pVf
33ef0 73 2d 3e 70 41 70 70 44 61 74 61 3d 3d 28 76 6f  s->pAppData==(vo
33f00 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46  id*)&autolockIoF
33f10 69 6e 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a 20  inder );.#else. 
33f20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
33f30 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61  me==0 || zFilena
33f40 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65  me[0]=='/' );.#e
33f50 6e 64 69 66 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f  ndif..  /* No lo
33f60 63 6b 69 6e 67 20 6f 63 63 75 72 73 20 69 6e 20  cking occurs in 
33f70 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  temporary files 
33f80 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69  */.  assert( zFi
33f90 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c 20 28 63 74  lename!=0 || (ct
33fa0 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
33fb0 4c 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29 3b  LE_NOLOCK)!=0 );
33fc0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50  ..  OSTRACE(("OP
33fd0 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22  EN    %-3d %s\n"
33fe0 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29  , h, zFilename))
33ff0 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b  ;.  pNew->h = h;
34000 0a 20 20 70 4e 65 77 2d 3e 70 56 66 73 20 3d 20  .  pNew->pVfs = 
34010 70 56 66 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50  pVfs;.  pNew->zP
34020 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b  ath = zFilename;
34030 0a 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61  .  pNew->ctrlFla
34040 67 73 20 3d 20 28 75 38 29 63 74 72 6c 46 6c 61  gs = (u8)ctrlFla
34050 67 73 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  gs;.#if SQLITE_M
34060 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
34070 20 70 4e 65 77 2d 3e 6d 6d 61 70 53 69 7a 65 4d   pNew->mmapSizeM
34080 61 78 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  ax = sqlite3Glob
34090 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b  alConfig.szMmap;
340a0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71  .#endif.  if( sq
340b0 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
340c0 6e 28 28 28 63 74 72 6c 46 6c 61 67 73 20 26 20  n(((ctrlFlags & 
340d0 55 4e 49 58 46 49 4c 45 5f 55 52 49 29 20 3f 20  UNIXFILE_URI) ? 
340e0 7a 46 69 6c 65 6e 61 6d 65 20 3a 20 30 29 2c 0a  zFilename : 0),.
340f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34100 20 20 20 20 20 20 20 20 20 20 20 22 70 73 6f 77             "psow
34110 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53  ", SQLITE_POWERS
34120 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29  AFE_OVERWRITE) )
34130 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c  {.    pNew->ctrl
34140 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
34150 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66  E_PSOW;.  }.  if
34160 28 20 73 74 72 63 6d 70 28 70 56 66 73 2d 3e 7a  ( strcmp(pVfs->z
34170 4e 61 6d 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22  Name,"unix-excl"
34180 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77  )==0 ){.    pNew
34190 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ->ctrlFlags |= U
341a0 4e 49 58 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20  NIXFILE_EXCL;.  
341b0 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  }..#if OS_VXWORK
341c0 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20  S.  pNew->pId = 
341d0 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49  vxworksFindFileI
341e0 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  d(zFilename);.  
341f0 69 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30  if( pNew->pId==0
34200 20 29 7b 0a 20 20 20 20 63 74 72 6c 46 6c 61 67   ){.    ctrlFlag
34210 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f  s |= UNIXFILE_NO
34220 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53  LOCK;.    rc = S
34230 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
34240 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
34250 69 66 28 20 63 74 72 6c 46 6c 61 67 73 20 26 20  if( ctrlFlags & 
34260 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20  UNIXFILE_NOLOCK 
34270 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53  ){.    pLockingS
34280 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f  tyle = &nolockIo
34290 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65  Methods;.  }else
342a0 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74  {.    pLockingSt
342b0 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72  yle = (**(finder
342c0 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41 70  _type*)pVfs->pAp
342d0 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65  pData)(zFilename
342e0 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c  , pNew);.#if SQL
342f0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
34300 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20  NG_STYLE.    /* 
34310 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  Cache zFilename 
34320 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  in the locking c
34330 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64 20  ontext (AFP and 
34340 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65  dotlock override
34350 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f  ) for.    ** pro
34360 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69 6f  xyLock activatio
34370 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28 72  n is possible (r
34380 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20 62  emote proxy is b
34390 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29  ased on db name)
343a0 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d  .    ** zFilenam
343b0 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20  e remains valid 
343c0 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63 6c  until file is cl
343d0 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72 74  osed, to support
343e0 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f   */.    pNew->lo
343f0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28  ckingContext = (
34400 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b  void*)zFilename;
34410 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69  .#endif.  }..  i
34420 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
34430 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74 68   == &posixIoMeth
34440 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ods.#if defined(
34450 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
34460 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
34470 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c  ING_STYLE.    ||
34480 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
34490 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a  = &nfsIoMethods.
344a0 23 65 6e 64 69 66 0a 20 20 20 20 20 2f 2a 20 73  #endif.     /* s
344b0 75 70 70 6f 72 74 20 57 41 4c 20 6d 6f 64 65 20  upport WAL mode 
344c0 6f 6e 20 72 65 61 64 20 6f 6e 6c 79 20 6d 6f 75  on read only mou
344d0 6e 74 65 64 20 66 69 6c 65 73 79 73 74 65 6d 20  nted filesystem 
344e0 2a 2f 0a 20 20 20 20 7c 7c 20 28 70 4c 6f 63 6b  */.    || (pLock
344f0 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e 6f 6c  ingStyle == &nol
34500 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 26 26 20  ockIoMethods && 
34510 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 29 0a 20 20  zFilename!=0).  
34520 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  ){.    unixEnter
34530 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20  Mutex();.    rc 
34540 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  = findInodeInfo(
34550 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e  pNew, &pNew->pIn
34560 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ode);.    if( rc
34570 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34580 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72       /* If an er
34590 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20  ror occurred in 
345a0 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c  findInodeInfo(),
345b0 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
345c0 64 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20 20  descriptor.     
345d0 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c   ** immediately,
345e0 20 62 65 66 6f 72 65 20 72 65 6c 65 61 73 69 6e   before releasin
345f0 67 20 74 68 65 20 6d 75 74 65 78 2e 20 66 69 6e  g the mutex. fin
34600 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79  dInodeInfo() may
34610 20 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69   fail.      ** i
34620 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a  n two scenarios:
34630 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
34640 2a 2a 20 20 20 28 61 29 20 41 20 63 61 6c 6c 20  **   (a) A call 
34650 74 6f 20 66 73 74 61 74 28 29 20 66 61 69 6c 65  to fstat() faile
34660 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 62  d..      **   (b
34670 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65  ) A malloc faile
34680 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
34690 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28 62    ** Scenario (b
346a0 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72  ) may only occur
346b0 20 69 66 20 74 68 65 20 70 72 6f 63 65 73 73 20   if the process 
346c0 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74  is holding no ot
346d0 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  her.      ** fil
346e0 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70  e descriptors op
346f0 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66  en on the same f
34700 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 77 65  ile. If there we
34710 72 65 20 6f 74 68 65 72 20 66 69 6c 65 0a 20 20  re other file.  
34720 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f      ** descripto
34730 72 73 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c  rs on this file,
34740 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20   then no malloc 
34750 77 6f 75 6c 64 20 62 65 20 72 65 71 75 69 72 65  would be require
34760 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 66 69  d by.      ** fi
34770 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49  ndInodeInfo(). I
34780 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
34790 73 65 2c 20 69 74 20 69 73 20 71 75 69 74 65 20  se, it is quite 
347a0 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20  safe to close.  
347b0 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20      ** handle h 
347c0 2d 20 61 73 20 69 74 20 69 73 20 67 75 61 72 61  - as it is guara
347d0 6e 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70 6f  nteed that no po
347e0 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62  six locks will b
347f0 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 20  e released.     
34800 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e   ** by doing so.
34810 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
34820 2a 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20 28  ** If scenario (
34830 61 29 20 63 61 75 73 65 64 20 74 68 65 20 65 72  a) caused the er
34840 72 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73 20  ror then things 
34850 61 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e  are not so safe.
34860 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d   The.      ** im
34870 70 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69 6f  plicit assumptio
34880 6e 20 68 65 72 65 20 69 73 20 74 68 61 74 20 69  n here is that i
34890 66 20 66 73 74 61 74 28 29 20 66 61 69 6c 73 2c  f fstat() fails,
348a0 20 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a 20   things are in. 
348b0 20 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61 64       ** such bad
348c0 20 73 68 61 70 65 20 74 68 61 74 20 64 72 6f 70   shape that drop
348d0 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74  ping a lock or t
348e0 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  wo doesn't matte
348f0 72 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f  r much..      */
34900 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
34910 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c  ose(pNew, h, __L
34920 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68 20  INE__);.      h 
34930 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
34940 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
34950 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54  ;.  }..#if SQLIT
34960 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
34970 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
34980 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 65  d(__APPLE__).  e
34990 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  lse if( pLocking
349a0 53 74 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f 4d  Style == &afpIoM
349b0 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
349c0 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65   AFP locking use
349d0 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20  s the file path 
349e0 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  so it needs to b
349f0 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20  e included in.  
34a00 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b    ** the afpLock
34a10 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20  ingContext..    
34a20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e  */.    afpLockin
34a30 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a  gContext *pCtx;.
34a40 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
34a50 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 20  gContext = pCtx 
34a60 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
34a70 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78  64( sizeof(*pCtx
34a80 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74  ) );.    if( pCt
34a90 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  x==0 ){.      rc
34aa0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
34ab0 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BKPT;.    }else{
34ac0 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46  .      /* NB: zF
34ad0 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20 61  ilename exists a
34ae0 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  nd remains valid
34af0 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65 20   until the file 
34b00 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20 20  is closed.      
34b10 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ** according to 
34b20 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31 31  requirement F111
34b30 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f  41.  So we do no
34b40 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61  t need to make a
34b50 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f  .      ** copy o
34b60 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20  f the filename. 
34b70 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 64  */.      pCtx->d
34b80 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d  bPath = zFilenam
34b90 65 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 72  e;.      pCtx->r
34ba0 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 20  eserved = 0;.   
34bb0 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b     srandomdev();
34bc0 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72  .      unixEnter
34bd0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 72  Mutex();.      r
34be0 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  c = findInodeInf
34bf0 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70  o(pNew, &pNew->p
34c00 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69 66  Inode);.      if
34c10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34c20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
34c30 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f  e3_free(pNew->lo
34c40 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20  ckingContext);. 
34c50 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c         robust_cl
34c60 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c  ose(pNew, h, __L
34c70 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20  INE__);.        
34c80 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  h = -1;.      }.
34c90 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d        unixLeaveM
34ca0 75 74 65 78 28 29 3b 20 20 20 20 20 20 20 20 0a  utex();        .
34cb0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
34cc0 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f  ..  else if( pLo
34cd0 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64  ckingStyle == &d
34ce0 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20  otlockIoMethods 
34cf0 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c  ){.    /* Dotfil
34d00 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74  e locking uses t
34d10 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20  he file path so 
34d20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69  it needs to be i
34d30 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a  ncluded in.    *
34d40 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63  * the dotlockLoc
34d50 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20 20  kingContext .   
34d60 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c   */.    char *zL
34d70 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74  ockFile;.    int
34d80 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20   nFilename;.    
34d90 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
34da0 65 21 3d 30 20 29 3b 0a 20 20 20 20 6e 46 69 6c  e!=0 );.    nFil
34db0 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72  ename = (int)str
34dc0 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b  len(zFilename) +
34dd0 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c   6;.    zLockFil
34de0 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  e = (char *)sqli
34df0 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 46 69  te3_malloc64(nFi
34e00 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  lename);.    if(
34e10 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b   zLockFile==0 ){
34e20 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
34e30 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
34e40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34e50 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
34e60 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63  (nFilename, zLoc
34e70 6b 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c  kFile, "%s" DOTL
34e80 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c  OCK_SUFFIX, zFil
34e90 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ename);.    }.  
34ea0 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43    pNew->lockingC
34eb0 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69  ontext = zLockFi
34ec0 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f  le;.  }..#if OS_
34ed0 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69  VXWORKS.  else i
34ee0 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
34ef0 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64   == &semIoMethod
34f00 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65  s ){.    /* Name
34f10 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
34f20 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
34f30 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
34f40 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ds to be.    ** 
34f50 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
34f60 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  semLockingContex
34f70 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69  t.    */.    uni
34f80 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
34f90 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64     rc = findInod
34fa0 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65  eInfo(pNew, &pNe
34fb0 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20  w->pInode);.    
34fc0 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  if( (rc==SQLITE_
34fd0 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 49  OK) && (pNew->pI
34fe0 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c  node->pSem==NULL
34ff0 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ) ){.      char 
35000 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77  *zSemName = pNew
35010 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61  ->pInode->aSemNa
35020 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b  me;.      int n;
35030 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
35040 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
35050 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20  NAME, zSemName, 
35060 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20  "/%s.sem",.     
35070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35080 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61    pNew->pId->zCa
35090 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20  nonicalName);.  
350a0 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53      for( n=1; zS
350b0 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29  emName[n]; n++ )
350c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 65  .        if( zSe
350d0 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20  mName[n]=='/' ) 
350e0 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f  zSemName[n] = '_
350f0 27 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  ';.      pNew->p
35100 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65  Inode->pSem = se
35110 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c  m_open(zSemName,
35120 20 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20   O_CREAT, 0666, 
35130 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  1);.      if( pN
35140 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
35150 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29   == SEM_FAILED )
35160 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
35170 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
35180 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
35190 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65  pInode->aSemName
351a0 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  [0] = '\0';.    
351b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e    }.    }.    un
351c0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
351d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
351e0 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
351f0 4e 65 77 2c 20 30 29 3b 0a 23 69 66 20 4f 53 5f  New, 0);.#if OS_
35200 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63  VXWORKS.  if( rc
35210 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
35220 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f     if( h>=0 ) ro
35230 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
35240 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20   h, __LINE__);. 
35250 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 6f     h = -1;.    o
35260 73 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d  sUnlink(zFilenam
35270 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74  e);.    pNew->ct
35280 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
35290 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 0a  ILE_DELETE;.  }.
352a0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21  #endif.  if( rc!
352b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
352c0 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62    if( h>=0 ) rob
352d0 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
352e0 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
352f0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d  }else{.    pNew-
35300 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b  >pMethod = pLock
35310 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70  ingStyle;.    Op
35320 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20  enCounter(+1);. 
35330 20 20 20 76 65 72 69 66 79 44 62 46 69 6c 65 28     verifyDbFile(
35340 70 4e 65 77 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pNew);.  }.  ret
35350 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
35360 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   Return the name
35370 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 20   of a directory 
35380 69 6e 20 77 68 69 63 68 20 74 6f 20 70 75 74 20  in which to put 
35390 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
353a0 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62  .** If no suitab
353b0 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  le temporary fil
353c0 65 20 64 69 72 65 63 74 6f 72 79 20 63 61 6e 20  e directory can 
353d0 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  be found, return
353e0 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
353f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69   const char *uni
35400 78 54 65 6d 70 46 69 6c 65 44 69 72 28 76 6f 69  xTempFileDir(voi
35410 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  d){.  static con
35420 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b  st char *azDirs[
35430 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20  ] = {.     0,.  
35440 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72     0,.     "/var
35450 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73  /tmp",.     "/us
35460 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74  r/tmp",.     "/t
35470 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22 0a 20 20  mp",.     ".".  
35480 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  };.  unsigned in
35490 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74  t i;.  struct st
354a0 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20  at buf;.  const 
354b0 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 73 71 6c  char *zDir = sql
354c0 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
354d0 6f 72 79 3b 0a 0a 20 20 69 66 28 20 21 61 7a 44  ory;..  if( !azD
354e0 69 72 73 5b 30 5d 20 29 20 61 7a 44 69 72 73 5b  irs[0] ) azDirs[
354f0 30 5d 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c  0] = getenv("SQL
35500 49 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20  ITE_TMPDIR");.  
35510 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29  if( !azDirs[1] )
35520 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74   azDirs[1] = get
35530 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20  env("TMPDIR");. 
35540 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
35550 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f  of(azDirs)/sizeo
35560 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44  f(azDirs[0]); zD
35570 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b  ir=azDirs[i++]){
35580 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30  .    if( zDir==0
35590 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
355a0 20 69 66 28 20 6f 73 53 74 61 74 28 7a 44 69 72   if( osStat(zDir
355b0 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e  , &buf) ) contin
355c0 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49  ue;.    if( !S_I
355d0 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65  SDIR(buf.st_mode
355e0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
355f0 20 20 69 66 28 20 6f 73 41 63 63 65 73 73 28 7a    if( osAccess(z
35600 44 69 72 2c 20 30 37 29 20 29 20 63 6f 6e 74 69  Dir, 07) ) conti
35610 6e 75 65 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  nue;.    break;.
35620 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 44 69    }.  return zDi
35630 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  r;.}../*.** Crea
35640 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  te a temporary f
35650 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66  ile name in zBuf
35660 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20  .  zBuf must be 
35670 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20  allocated.** by 
35680 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
35690 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20  ess and must be 
356a0 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
356b0 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70  ld at least.** p
356c0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
356d0 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
356e0 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70   int unixGetTemp
356f0 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63  name(int nBuf, c
35700 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 63 6f  har *zBuf){.  co
35710 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 3b 0a  nst char *zDir;.
35720 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30    int iLimit = 0
35730 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  ;..  /* It's odd
35740 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
35750 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
35760 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
35770 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
35780 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
35790 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
357a0 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
357b0 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
357c0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
357d0 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69  ling. .  */.  Si
357e0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
357f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
35800 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20  RR );..  zDir = 
35810 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28  unixTempFileDir(
35820 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 36 34  );.  do{.    u64
35830 20 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   r;.    sqlite3_
35840 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
35850 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20 61  f(r), &r);.    a
35860 73 73 65 72 74 28 20 6e 42 75 66 3e 32 20 29 3b  ssert( nBuf>2 );
35870 0a 20 20 20 20 7a 42 75 66 5b 6e 42 75 66 2d 32  .    zBuf[nBuf-2
35880 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
35890 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
358a0 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51 4c  , zBuf, "%s/"SQL
358b0 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
358c0 45 46 49 58 22 25 6c 6c 78 25 63 22 2c 0a 20 20  EFIX"%llx%c",.  
358d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
358e0 20 20 20 7a 44 69 72 2c 20 72 2c 20 30 29 3b 0a     zDir, r, 0);.
358f0 20 20 20 20 69 66 28 20 7a 42 75 66 5b 6e 42 75      if( zBuf[nBu
35900 66 2d 32 5d 21 3d 30 20 7c 7c 20 28 69 4c 69 6d  f-2]!=0 || (iLim
35910 69 74 2b 2b 29 3e 31 30 20 29 20 72 65 74 75 72  it++)>10 ) retur
35920 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
35930 20 20 7d 77 68 69 6c 65 28 20 6f 73 41 63 63 65    }while( osAcce
35940 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b  ss(zBuf,0)==0 );
35950 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35960 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  _OK;.}..#if SQLI
35970 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
35980 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
35990 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a  ed(__APPLE__)./*
359a0 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74  .** Routine to t
359b0 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46  ransform a unixF
359c0 69 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79  ile into a proxy
359d0 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c  -locking unixFil
359e0 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  e..** Implementa
359f0 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78  tion in the prox
35a00 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c  y-lock division,
35a10 20 62 75 74 20 75 73 65 64 20 62 79 20 75 6e 69   but used by uni
35a20 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51  xOpen().** if SQ
35a30 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
35a40 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66  Y_LOCKING is def
35a50 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
35a60 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f  int proxyTransfo
35a70 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46  rmUnixFile(unixF
35a80 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  ile*, const char
35a90 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  *);.#endif../*.*
35aa0 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
35ab0 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
35ac0 72 69 70 74 6f 72 20 74 68 61 74 20 77 61 73 20  riptor that was 
35ad0 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61  opened on the da
35ae0 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
35af0 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f  (not a journal o
35b00 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  r master-journal
35b10 20 66 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65   file) identifie
35b20 64 20 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a  d by pathname.**
35b30 20 7a 50 61 74 68 20 77 69 74 68 20 53 51 4c 49   zPath with SQLI
35b40 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67  TE_OPEN_XXX flag
35b50 73 20 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65  s matching those
35b60 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
35b70 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
35b80 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
35b90 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61  on..**.** Such a
35ba0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
35bb0 20 6d 61 79 20 65 78 69 73 74 20 69 66 20 61 20   may exist if a 
35bc0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
35bd0 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a  ion was closed.*
35be0 2a 20 62 75 74 20 74 68 65 20 61 73 73 6f 63 69  * but the associ
35bf0 61 74 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  ated file descri
35c00 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62  ptor could not b
35c10 65 20 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65  e closed because
35c20 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66   some.** other f
35c30 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
35c40 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
35c50 66 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20  file is holding 
35c60 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20  a file-lock..** 
35c70 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74  Refer to comment
35c80 73 20 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f  s in the unixClo
35c90 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e  se() function an
35ca0 64 20 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f  d the lengthy co
35cb0 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62  mment.** describ
35cc0 69 6e 67 20 22 50 6f 73 69 78 20 41 64 76 69 73  ing "Posix Advis
35cd0 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20  ory Locking" at 
35ce0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69  the start of thi
35cf0 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66  s file for .** f
35d00 75 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20  urther details. 
35d10 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30  Also, ticket #40
35d20 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73  18..**.** If a s
35d30 75 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73  uitable file des
35d40 63 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64  criptor is found
35d50 2c 20 74 68 65 6e 20 69 74 20 69 73 20 72 65 74  , then it is ret
35d60 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20  urned. If no.** 
35d70 73 75 63 68 20 66 69 6c 65 20 64 65 73 63 72 69  such file descri
35d80 70 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c  ptor is located,
35d90 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
35da0 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55  .*/.static UnixU
35db0 6e 75 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75  nusedFd *findReu
35dc0 73 61 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68  sableFd(const ch
35dd0 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66  ar *zPath, int f
35de0 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75  lags){.  UnixUnu
35df0 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d  sedFd *pUnused =
35e00 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   0;..  /* Do not
35e10 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75   search for an u
35e20 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
35e30 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73  iptor on vxworks
35e40 2e 20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20  . Not because.  
35e50 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64  ** vxworks would
35e60 20 6e 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f   not benefit fro
35e70 6d 20 74 68 65 20 63 68 61 6e 67 65 20 28 69 74  m the change (it
35e80 20 6d 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f   might, we're no
35e90 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75  t sure),.  ** bu
35ea0 74 20 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79  t because no way
35eb0 20 74 6f 20 74 65 73 74 20 69 74 20 69 73 20 63   to test it is c
35ec0 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62  urrently availab
35ed0 6c 65 2e 20 49 74 20 69 73 20 62 65 74 74 65 72  le. It is better
35ee0 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69   .  ** not to ri
35ef0 73 6b 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f  sk breaking vxwo
35f00 72 6b 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20  rks support for 
35f10 74 68 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68  the sake of such
35f20 20 61 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a   an obscure .  *
35f30 2a 20 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23  * feature.  */.#
35f40 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  if !OS_VXWORKS. 
35f50 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
35f60 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
35f70 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
35f80 20 6f 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20   of stat() call 
35f90 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28  */..  /* A stat(
35fa0 29 20 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20  ) call may fail 
35fb0 66 6f 72 20 76 61 72 69 6f 75 73 20 72 65 61 73  for various reas
35fc0 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 68 61 70  ons. If this hap
35fd0 70 65 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a  pens, it is.  **
35fe0 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20   almost certain 
35ff0 74 68 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63  that an open() c
36000 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  all on the same 
36010 70 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66  path will also f
36020 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68  ail..  ** For th
36030 69 73 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e  is reason, if an
36040 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
36050 20 74 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c   the stat() call
36060 20 68 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a   here, it is.  *
36070 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31  * ignored and -1
36080 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68   is returned. Th
36090 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72  e caller will tr
360a0 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20  y to open a new 
360b0 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69  file.  ** descri
360c0 70 74 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65  ptor on the same
360d0 20 70 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64   path, fail, and
360e0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
360f0 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a   to SQLite..  **
36100 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20  .  ** Even if a 
36110 73 75 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28  subsequent open(
36120 29 20 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63  ) call does succ
36130 65 65 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75  eed, the consequ
36140 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f  ences of.  ** no
36150 74 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20  t searching for 
36160 61 20 72 65 75 73 61 62 6c 65 20 66 69 6c 65 20  a reusable file 
36170 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6e  descriptor are n
36180 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69  ot dire.  */.  i
36190 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61  f( 0==osStat(zPa
361a0 74 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  th, &sStat) ){. 
361b0 20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f     unixInodeInfo
361c0 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 75   *pInode;..    u
361d0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
361e0 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e  .    pInode = in
361f0 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 68 69  odeList;.    whi
36200 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 28 70  le( pInode && (p
36210 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65  Inode->fileId.de
36220 76 21 3d 73 53 74 61 74 2e 73 74 5f 64 65 76 0a  v!=sStat.st_dev.
36230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36240 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e       || pInode->
36250 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61  fileId.ino!=sSta
36260 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20  t.st_ino) ){.   
36270 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e      pInode = pIn
36280 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ode->pNext;.    
36290 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  }.    if( pInode
362a0 20 29 7b 0a 20 20 20 20 20 20 55 6e 69 78 55 6e   ){.      UnixUn
362b0 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20  usedFd **pp;.   
362c0 20 20 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64     for(pp=&pInod
362d0 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70 20  e->pUnused; *pp 
362e0 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21  && (*pp)->flags!
362f0 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a 70  =flags; pp=&((*p
36300 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20  p)->pNext));.   
36310 20 20 20 70 55 6e 75 73 65 64 20 3d 20 2a 70 70     pUnused = *pp
36320 3b 0a 20 20 20 20 20 20 69 66 28 20 70 55 6e 75  ;.      if( pUnu
36330 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  sed ){.        *
36340 70 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e  pp = pUnused->pN
36350 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
36360 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65   }.    unixLeave
36370 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e  Mutex();.  }.#en
36380 64 69 66 20 20 20 20 2f 2a 20 69 66 20 21 4f 53  dif    /* if !OS
36390 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65  _VXWORKS */.  re
363a0 74 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a  turn pUnused;.}.
363b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
363c0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
363d0 79 20 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20  y unixOpen() to 
363e0 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 75 6e  determine the un
363f0 69 78 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a  ix permissions.*
36400 2a 20 74 6f 20 63 72 65 61 74 65 20 6e 65 77 20  * to create new 
36410 66 69 6c 65 73 20 77 69 74 68 2e 20 49 66 20 6e  files with. If n
36420 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
36430 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  then SQLITE_OK i
36440 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e  s returned.** an
36450 64 20 61 20 76 61 6c 75 65 20 73 75 69 74 61 62  d a value suitab
36460 6c 65 20 66 6f 72 20 70 61 73 73 69 6e 67 20 61  le for passing a
36470 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  s the third argu
36480 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32 29 20  ment to open(2) 
36490 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f  is.** written to
364a0 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49   *pMode. If an I
364b0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
364c0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
364d0 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75  code is .** retu
364e0 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c  rned and the val
364f0 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20  ue of *pMode is 
36500 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a  not modified..**
36510 0a 2a 2a 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  .** In most case
36520 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
36530 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 30  sets *pMode to 0
36540 2c 20 77 68 69 63 68 20 77 69 6c 6c 20 62 65 63  , which will bec
36550 6f 6d 65 0a 2a 2a 20 61 6e 20 69 6e 64 69 63 61  ome.** an indica
36560 74 69 6f 6e 20 74 6f 20 72 6f 62 75 73 74 5f 6f  tion to robust_o
36570 70 65 6e 28 29 20 74 6f 20 63 72 65 61 74 65 20  pen() to create 
36580 74 68 65 20 66 69 6c 65 20 75 73 69 6e 67 0a 2a  the file using.*
36590 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
365a0 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
365b0 53 20 61 64 6a 75 73 74 65 64 20 62 79 20 74 68  S adjusted by th
365c0 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20 42 75 74 20  e umask..** But 
365d0 69 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e  if the file bein
365e0 67 20 6f 70 65 6e 65 64 20 69 73 20 61 20 57 41  g opened is a WA
365f0 4c 20 6f 72 20 72 65 67 75 6c 61 72 20 6a 6f 75  L or regular jou
36600 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
36610 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
36620 6e 20 71 75 65 72 69 65 73 20 74 68 65 20 66 69  n queries the fi
36630 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  le-system for th
36640 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e  e permissions on
36650 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70   the .** corresp
36660 6f 6e 64 69 6e 67 20 64 61 74 61 62 61 73 65 20  onding database 
36670 66 69 6c 65 20 61 6e 64 20 73 65 74 73 20 2a 70  file and sets *p
36680 4d 6f 64 65 20 74 6f 20 74 68 69 73 20 76 61 6c  Mode to this val
36690 75 65 2e 20 57 68 65 6e 65 76 65 72 20 0a 2a 2a  ue. Whenever .**
366a0 20 70 6f 73 73 69 62 6c 65 2c 20 57 41 4c 20 61   possible, WAL a
366b0 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nd journal files
366c0 20 61 72 65 20 63 72 65 61 74 65 64 20 75 73 69   are created usi
366d0 6e 67 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d  ng the same perm
366e0 69 73 73 69 6f 6e 73 20 0a 2a 2a 20 61 73 20 74  issions .** as t
366f0 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61  he associated da
36700 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
36710 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45  ** If the SQLITE
36720 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45  _ENABLE_8_3_NAME
36730 53 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62  S option is enab
36740 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  led, then the.**
36750 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61   original filena
36760 6d 65 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c  me is unavailabl
36770 65 2e 20 20 42 75 74 20 38 5f 33 5f 4e 41 4d 45  e.  But 8_3_NAME
36780 53 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66  S is only used f
36790 6f 72 0a 2a 2a 20 46 41 54 20 66 69 6c 65 73 79  or.** FAT filesy
367a0 73 74 65 6d 73 20 61 6e 64 20 70 65 72 6d 69 73  stems and permis
367b0 73 69 6f 6e 73 20 64 6f 20 6e 6f 74 20 6d 61 74  sions do not mat
367c0 74 65 72 20 74 68 65 72 65 2c 20 73 6f 20 6a 75  ter there, so ju
367d0 73 74 20 75 73 65 0a 2a 2a 20 74 68 65 20 64 65  st use.** the de
367e0 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e  fault permission
367f0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
36800 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d   findCreateFileM
36810 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ode(.  const cha
36820 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
36830 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f         /* Path o
36840 66 20 66 69 6c 65 20 28 70 6f 73 73 69 62 6c 79  f file (possibly
36850 29 20 62 65 69 6e 67 20 63 72 65 61 74 65 64 20  ) being created 
36860 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
36870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36880 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
36890 73 73 65 64 20 61 73 20 34 74 68 20 61 72 67 75  ssed as 4th argu
368a0 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e 28 29 20  ment to xOpen() 
368b0 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f  */.  mode_t *pMo
368c0 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
368d0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72       /* OUT: Per
368e0 6d 69 73 73 69 6f 6e 73 20 74 6f 20 6f 70 65 6e  missions to open
368f0 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20   file with */.  
36900 75 69 64 5f 74 20 2a 70 55 69 64 2c 20 20 20 20  uid_t *pUid,    
36910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36920 2f 2a 20 4f 55 54 3a 20 75 69 64 20 74 6f 20 73  /* OUT: uid to s
36930 65 74 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a  et on the file *
36940 2f 0a 20 20 67 69 64 5f 74 20 2a 70 47 69 64 20  /.  gid_t *pGid 
36950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36960 20 20 20 20 2f 2a 20 4f 55 54 3a 20 67 69 64 20      /* OUT: gid 
36970 74 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69  to set on the fi
36980 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  le */.){.  int r
36990 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
369a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
369b0 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 2a  turn Code */.  *
369c0 70 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 2a 70 55  pMode = 0;.  *pU
369d0 69 64 20 3d 20 30 3b 0a 20 20 2a 70 47 69 64 20  id = 0;.  *pGid 
369e0 3d 20 30 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  = 0;.  if( flags
369f0 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   & (SQLITE_OPEN_
36a00 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  WAL|SQLITE_OPEN_
36a10 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b  MAIN_JOURNAL) ){
36a20 0a 20 20 20 20 63 68 61 72 20 7a 44 62 5b 4d 41  .    char zDb[MA
36a30 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 20 20  X_PATHNAME+1];  
36a40 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
36a50 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20  ile path */.    
36a60 69 6e 74 20 6e 44 62 3b 20 20 20 20 20 20 20 20  int nDb;        
36a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36a80 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   Number of valid
36a90 20 62 79 74 65 73 20 69 6e 20 7a 44 62 20 2a 2f   bytes in zDb */
36aa0 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
36ab0 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20   sStat;         
36ac0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f 66 20     /* Output of 
36ad0 73 74 61 74 28 29 20 6f 6e 20 64 61 74 61 62 61  stat() on databa
36ae0 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  se file */..    
36af0 2f 2a 20 7a 50 61 74 68 20 69 73 20 61 20 70 61  /* zPath is a pa
36b00 74 68 20 74 6f 20 61 20 57 41 4c 20 6f 72 20 6a  th to a WAL or j
36b10 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
36b20 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
36b30 20 64 65 72 69 76 65 73 0a 20 20 20 20 2a 2a 20   derives.    ** 
36b40 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20  the path to the 
36b50 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  associated datab
36b60 61 73 65 20 66 69 6c 65 20 66 72 6f 6d 20 7a 50  ase file from zP
36b70 61 74 68 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ath. This block 
36b80 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a 20 74  handles.    ** t
36b90 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d  he following nam
36ba0 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a  ing conventions:
36bb0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
36bc0 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a   "<path to db>-j
36bd0 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a 20 20  ournal".    **  
36be0 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77   "<path to db>-w
36bf0 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70  al".    **   "<p
36c00 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e  ath to db>-journ
36c10 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20 20 20 22  alNN".    **   "
36c20 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c  <path to db>-wal
36c30 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  NN".    **.    *
36c40 2a 20 77 68 65 72 65 20 4e 4e 20 69 73 20 61 20  * where NN is a 
36c50 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72 2e 20  decimal number. 
36c60 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67 20 73 63  The NN naming sc
36c70 68 65 6d 65 73 20 61 72 65 20 0a 20 20 20 20 2a  hemes are .    *
36c80 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 74 65  * used by the te
36c90 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63 20 6d  st_multiplex.c m
36ca0 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  odule..    */.  
36cb0 20 20 6e 44 62 20 3d 20 73 71 6c 69 74 65 33 53    nDb = sqlite3S
36cc0 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29 20 2d  trlen30(zPath) -
36cd0 20 31 3b 20 0a 20 20 20 20 77 68 69 6c 65 28 20   1; .    while( 
36ce0 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20  zPath[nDb]!='-' 
36cf0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
36d00 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d  E_ENABLE_8_3_NAM
36d10 45 53 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  ES.      /* In t
36d20 68 65 20 6e 6f 72 6d 61 6c 20 63 61 73 65 20 28  he normal case (
36d30 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 20 64 69  8+3 filenames di
36d40 73 61 62 6c 65 64 29 20 74 68 65 20 6a 6f 75 72  sabled) the jour
36d50 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 20 20 20  nal filename.   
36d60 20 20 20 2a 2a 20 69 73 20 67 75 61 72 61 6e 74     ** is guarant
36d70 65 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61  eed to contain a
36d80 20 27 2d 27 20 63 68 61 72 61 63 74 65 72 2e 20   '-' character. 
36d90 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
36da0 20 6e 44 62 3e 30 20 29 3b 0a 20 20 20 20 20 20   nDb>0 );.      
36db0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 49  assert( sqlite3I
36dc0 73 61 6c 6e 75 6d 28 7a 50 61 74 68 5b 6e 44 62  salnum(zPath[nDb
36dd0 5d 29 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ]) );.#else.    
36de0 20 20 2f 2a 20 49 66 20 38 2b 33 20 6e 61 6d 65    /* If 8+3 name
36df0 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 2c 20  s are possible, 
36e00 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
36e10 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20   file might not 
36e20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 2a 2a  contain.      **
36e30 20 61 20 27 2d 27 20 63 68 61 72 61 63 74 65 72   a '-' character
36e40 2e 20 20 53 6f 20 63 68 65 63 6b 20 66 6f 72 20  .  So check for 
36e50 74 68 61 74 20 63 61 73 65 20 61 6e 64 20 72 65  that case and re
36e60 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20  turn early. */. 
36e70 20 20 20 20 20 69 66 28 20 6e 44 62 3d 3d 30 20       if( nDb==0 
36e80 7c 7c 20 7a 50 61 74 68 5b 6e 44 62 5d 3d 3d 27  || zPath[nDb]=='
36e90 2e 27 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  .' ) return SQLI
36ea0 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 20 20  TE_OK;.#endif.  
36eb0 20 20 20 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d      nDb--;.    }
36ec0 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c  .    memcpy(zDb,
36ed0 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20   zPath, nDb);.  
36ee0 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30    zDb[nDb] = '\0
36ef0 27 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f  ';..    if( 0==o
36f00 73 53 74 61 74 28 7a 44 62 2c 20 26 73 53 74 61  sStat(zDb, &sSta
36f10 74 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 4d 6f  t) ){.      *pMo
36f20 64 65 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f  de = sStat.st_mo
36f30 64 65 20 26 20 30 37 37 37 3b 0a 20 20 20 20 20  de & 0777;.     
36f40 20 2a 70 55 69 64 20 3d 20 73 53 74 61 74 2e 73   *pUid = sStat.s
36f50 74 5f 75 69 64 3b 0a 20 20 20 20 20 20 2a 70 47  t_uid;.      *pG
36f60 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 67 69  id = sStat.st_gi
36f70 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  d;.    }else{.  
36f80 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
36f90 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20  IOERR_FSTAT;.   
36fa0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66   }.  }else if( f
36fb0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
36fc0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
36fd0 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d   ){.    *pMode =
36fe0 20 30 36 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74   0600;.  }.  ret
36ff0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
37000 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a   Open the file z
37010 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65  Path..** .** Pre
37020 76 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c  viously, the SQL
37030 69 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65  ite OS layer use
37040 64 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e  d three function
37050 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68  s in place of th
37060 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a  is.** one:.**.**
37070 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70       sqlite3OsOp
37080 65 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a  enReadWrite();.*
37090 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
370a0 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a  penReadOnly();.*
370b0 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
370c0 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a  penExclusive();.
370d0 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c  **.** These call
370e0 73 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20  s correspond to 
370f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
37100 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c  mbinations of fl
37110 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52  ags:.**.**     R
37120 65 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20  eadWrite() ->   
37130 20 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43    (READWRITE | C
37140 52 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65  REATE).**     Re
37150 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20  adOnly()  ->    
37160 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20   (READONLY) .** 
37170 20 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76      OpenExclusiv
37180 65 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54  e() -> (READWRIT
37190 45 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43  E | CREATE | EXC
371a0 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68  LUSIVE).**.** Th
371b0 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73  e old OpenExclus
371c0 69 76 65 28 29 20 61 63 63 65 70 74 65 64 20 61  ive() accepted a
371d0 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e   boolean argumen
371e0 74 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49  t - "delFlag". I
371f0 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66  f.** true, the f
37200 69 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72  ile was configur
37210 65 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74  ed to be automat
37220 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77  ically deleted w
37230 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  hen the.** file 
37240 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54  handle closed. T
37250 6f 20 61 63 68 69 65 76 65 20 74 68 65 20 73 61  o achieve the sa
37260 6d 65 20 65 66 66 65 63 74 20 75 73 69 6e 67 20  me effect using 
37270 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74  this new .** int
37280 65 72 66 61 63 65 2c 20 61 64 64 20 74 68 65 20  erface, add the 
37290 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c  DELETEONCLOSE fl
372a0 61 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63  ag to those spec
372b0 69 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20  ified above for 
372c0 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76  .** OpenExclusiv
372d0 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
372e0 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73  nt unixOpen(.  s
372f0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
37300 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
37310 68 65 20 56 46 53 20 66 6f 72 20 77 68 69 63 68  he VFS for which
37320 20 74 68 69 73 20 69 73 20 74 68 65 20 78 4f 70   this is the xOp
37330 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63  en method */.  c
37340 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
37350 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
37360 61 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20  athname of file 
37370 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a  to be opened */.
37380 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
37390 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 2f  pFile,         /
373a0 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
373b0 69 70 74 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c  iptor to be fill
373c0 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66  ed in */.  int f
373d0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
373e0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74          /* Input
373f0 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f   flags to contro
37400 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f  l the opening */
37410 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67  .  int *pOutFlag
37420 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
37430 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61 67 73 20  /* Output flags 
37440 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69  returned to SQLi
37450 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20  te core */.){.  
37460 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75  unixFile *p = (u
37470 6e 69 78 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b  nixFile *)pFile;
37480 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20  .  int fd = -1; 
37490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
374a0 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
374b0 70 74 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79  ptor returned by
374c0 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74   open() */.  int
374d0 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20   openFlags = 0; 
374e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
374f0 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20  lags to pass to 
37500 6f 70 65 6e 28 29 20 2a 2f 0a 23 69 66 20 53 51  open() */.#if SQ
37510 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41  LITE_ENABLE_DATA
37520 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 69 6e  _PROTECTION.  in
37530 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26  t eType = flags&
37540 30 78 46 46 30 46 46 46 30 30 3b 20 20 2f 2a 20  0xFF0FFF00;  /* 
37550 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Type of file to 
37560 6f 70 65 6e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20  open */.#else.  
37570 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67  int eType = flag
37580 73 26 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f  s&0xFFFFFF00;  /
37590 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74  * Type of file t
375a0 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e 64 69 66  o open */.#endif
375b0 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20  .  int noLock;  
375c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
375d0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69    /* True to omi
375e0 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74  t locking primit
375f0 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ives */.  int rc
37600 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
37610 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
37620 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65  tion Return Code
37630 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c   */.  int ctrlFl
37640 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ags = 0;        
37650 20 20 20 20 20 2f 2a 20 55 4e 49 58 46 49 4c 45       /* UNIXFILE
37660 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 69  _* flags */..  i
37670 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20  nt isExclusive  
37680 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
37690 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
376a0 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74  );.  int isDelet
376b0 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
376c0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
376d0 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69  ETEONCLOSE);.  i
376e0 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20  nt isCreate     
376f0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
37700 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
37710 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
37720 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
37730 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
37740 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61  LY);.  int isRea
37750 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73  dWrite  = (flags
37760 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
37770 45 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20 53  EADWRITE);.#if S
37780 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
37790 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74  KING_STYLE.  int
377a0 20 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d 20   isAutoProxy  = 
377b0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
377c0 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b  OPEN_AUTOPROXY);
377d0 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
377e0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
377f0 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
37800 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
37810 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
37820 49 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Info;.#endif..  
37830 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61  /* If creating a
37840 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d   master or main-
37850 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  file journal, th
37860 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
37870 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c   open.  ** a fil
37880 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  e-descriptor on 
37890 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f  the directory to
378a0 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  o. The first tim
378b0 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a  e unixSync().  *
378c0 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  * is called the 
378d0 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64  directory file d
378e0 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62  escriptor will b
378f0 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e 64 20  e fsync()ed and 
37900 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20  close()d..  */. 
37910 20 69 6e 74 20 73 79 6e 63 44 69 72 20 3d 20 28   int syncDir = (
37920 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20  isCreate && (.  
37930 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c        eType==SQL
37940 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
37950 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c  JOURNAL .     ||
37960 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
37970 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
37980 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d   .     || eType=
37990 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
379a0 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  .  ));..  /* If 
379b0 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69  argument zPath i
379c0 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
379d0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
379e0 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f  is required to o
379f0 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f  pen.  ** a tempo
37a00 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74  rary file. Use t
37a10 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74  his buffer to st
37a20 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  ore the file nam
37a30 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  e in..  */.  cha
37a40 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50  r zTmpname[MAX_P
37a50 41 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20 20 63 6f  ATHNAME+2];.  co
37a60 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
37a70 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43  = zPath;..  /* C
37a80 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69  heck the followi
37a90 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  ng statements ar
37aa0 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20  e true: .  **.  
37ab0 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c 79  **   (a) Exactly
37ac0 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44   one of the READ
37ad0 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e  WRITE and READON
37ae0 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65  LY flags must be
37af0 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20   set, and .  ** 
37b00 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20    (b) if CREATE 
37b10 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41  is set, then REA
37b20 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f  DWRITE must also
37b30 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a   be set, and.  *
37b40 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55  *   (c) if EXCLU
37b50 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65  SIVE is set, the
37b60 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
37b70 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20  so be set..  ** 
37b80 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f    (d) if DELETEO
37b90 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74  NCLOSE is set, t
37ba0 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
37bb0 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
37bc0 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65  /.  assert((isRe
37bd0 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52  adonly==0 || isR
37be0 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20  eadWrite==0) && 
37bf0 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20  (isReadWrite || 
37c00 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20  isReadonly));.  
37c10 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d  assert(isCreate=
37c20 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74  =0 || isReadWrit
37c30 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45  e);.  assert(isE
37c40 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69  xclusive==0 || i
37c50 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65  sCreate);.  asse
37c60 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c  rt(isDelete==0 |
37c70 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20  | isCreate);..  
37c80 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20  /* The main DB, 
37c90 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41  main journal, WA
37ca0 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65  L file and maste
37cb0 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65  r journal are ne
37cc0 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61  ver .  ** automa
37cd0 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e  tically deleted.
37ce0 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76   Nor are they ev
37cf0 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  er temporary fil
37d00 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  es.  */.  assert
37d10 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
37d20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
37d30 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
37d40 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  N_DB );.  assert
37d50 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
37d60 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
37d70 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
37d80 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61  N_JOURNAL );.  a
37d90 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
37da0 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
37db0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
37dc0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
37dd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
37de0 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
37df0 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
37e00 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a  ITE_OPEN_WAL );.
37e10 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
37e20 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  t the upper laye
37e30 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66  r has set one of
37e40 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22   the "file-type"
37e50 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73   flags. */.  ass
37e60 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49  ert( eType==SQLI
37e70 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
37e80 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
37e90 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
37ea0 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  DB .       || eT
37eb0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
37ec0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c  _MAIN_JOURNAL ||
37ed0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
37ee0 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
37ef0 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
37f00 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  e==SQLITE_OPEN_S
37f10 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65  UBJOURNAL   || e
37f20 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
37f30 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
37f40 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
37f50 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
37f60 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65  RANSIENT_DB || e
37f70 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
37f80 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a  N_WAL.  );..  /*
37f90 20 44 65 74 65 63 74 20 61 20 70 69 64 20 63 68   Detect a pid ch
37fa0 61 6e 67 65 20 61 6e 64 20 72 65 73 65 74 20 74  ange and reset t
37fb0 68 65 20 50 52 4e 47 2e 20 20 54 68 65 72 65 20  he PRNG.  There 
37fc0 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  is a race condit
37fd0 69 6f 6e 0a 20 20 2a 2a 20 68 65 72 65 20 73 75  ion.  ** here su
37fe0 63 68 20 74 68 61 74 20 74 77 6f 20 6f 72 20 6d  ch that two or m
37ff0 6f 72 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20  ore threads all 
38000 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 20 64  trying to open d
38010 61 74 61 62 61 73 65 73 20 61 74 0a 20 20 2a 2a  atabases at.  **
38020 20 74 68 65 20 73 61 6d 65 20 69 6e 73 74 61 6e   the same instan
38030 74 20 6d 69 67 68 74 20 61 6c 6c 20 72 65 73 65  t might all rese
38040 74 20 74 68 65 20 50 52 4e 47 2e 20 20 42 75 74  t the PRNG.  But
38050 20 6d 75 6c 74 69 70 6c 65 20 72 65 73 65 74 73   multiple resets
38060 0a 20 20 2a 2a 20 61 72 65 20 68 61 72 6d 6c 65  .  ** are harmle
38070 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ss..  */.  if( r
38080 61 6e 64 6f 6d 6e 65 73 73 50 69 64 21 3d 6f 73  andomnessPid!=os
38090 47 65 74 70 69 64 28 30 29 20 29 7b 0a 20 20 20  Getpid(0) ){.   
380a0 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d   randomnessPid =
380b0 20 6f 73 47 65 74 70 69 64 28 30 29 3b 0a 20 20   osGetpid(0);.  
380c0 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
380d0 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20 7d 0a 0a  ness(0,0);.  }..
380e0 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
380f0 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
38100 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  ;..  if( eType==
38110 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
38120 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55  _DB ){.    UnixU
38130 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
38140 3b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20  ;.    pUnused = 
38150 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a  findReusableFd(z
38160 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Name, flags);.  
38170 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b    if( pUnused ){
38180 0a 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75  .      fd = pUnu
38190 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c  sed->fd;.    }el
381a0 73 65 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65  se{.      pUnuse
381b0 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  d = sqlite3_mall
381c0 6f 63 36 34 28 73 69 7a 65 6f 66 28 2a 70 55 6e  oc64(sizeof(*pUn
381d0 75 73 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66  used));.      if
381e0 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  ( !pUnused ){.  
381f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
38200 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
38210 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
38220 20 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70    p->pUnused = p
38230 55 6e 75 73 65 64 3b 0a 0a 20 20 20 20 2f 2a 20  Unused;..    /* 
38240 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
38250 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65  es are double-ze
38260 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66  ro terminated if
38270 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20   they are not.  
38280 20 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70    ** URIs with p
38290 61 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63  arameters.  Henc
382a0 65 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61  e, they can alwa
382b0 79 73 20 62 65 20 70 61 73 73 65 64 20 69 6e 74  ys be passed int
382c0 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
382d0 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29  _uri_parameter()
382e0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
382f0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
38300 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 20 7a 4e  _OPEN_URI) || zN
38310 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  ame[strlen(zName
38320 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 7d 65  )+1]==0 );..  }e
38330 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d 65 20 29  lse if( !zName )
38340 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  {.    /* If zNam
38350 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75  e is NULL, the u
38360 70 70 65 72 20 6c 61 79 65 72 20 69 73 20 72 65  pper layer is re
38370 71 75 65 73 74 69 6e 67 20 61 20 74 65 6d 70 20  questing a temp 
38380 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  file. */.    ass
38390 65 72 74 28 69 73 44 65 6c 65 74 65 20 26 26 20  ert(isDelete && 
383a0 21 73 79 6e 63 44 69 72 29 3b 0a 20 20 20 20 72  !syncDir);.    r
383b0 63 20 3d 20 75 6e 69 78 47 65 74 54 65 6d 70 6e  c = unixGetTempn
383c0 61 6d 65 28 70 56 66 73 2d 3e 6d 78 50 61 74 68  ame(pVfs->mxPath
383d0 6e 61 6d 65 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b  name, zTmpname);
383e0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
383f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
38400 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
38410 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d  .    zName = zTm
38420 70 6e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47  pname;..    /* G
38430 65 6e 65 72 61 74 65 64 20 74 65 6d 70 6f 72 61  enerated tempora
38440 72 79 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65  ry filenames are
38450 20 61 6c 77 61 79 73 20 64 6f 75 62 6c 65 2d 7a   always double-z
38460 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 0a 20  ero terminated. 
38470 20 20 20 2a 2a 20 66 6f 72 20 75 73 65 20 62 79     ** for use by
38480 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72   sqlite3_uri_par
38490 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20  ameter(). */.   
384a0 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 5b 73   assert( zName[s
384b0 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d  trlen(zName)+1]=
384c0 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  =0 );.  }..  /* 
384d0 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61  Determine the va
384e0 6c 75 65 20 6f 66 20 74 68 65 20 66 6c 61 67 73  lue of the flags
384f0 20 70 61 72 61 6d 65 74 65 72 20 70 61 73 73 65   parameter passe
38500 64 20 74 6f 20 50 4f 53 49 58 20 66 75 6e 63 74  d to POSIX funct
38510 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28 29 2e  ion.  ** open().
38520 20 54 68 65 73 65 20 6d 75 73 74 20 62 65 20 63   These must be c
38530 61 6c 63 75 6c 61 74 65 64 20 65 76 65 6e 20 69  alculated even i
38540 66 20 6f 70 65 6e 28 29 20 69 73 20 6e 6f 74 20  f open() is not 
38550 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20 2a 2a 20  called, as.  ** 
38560 74 68 65 79 20 6d 61 79 20 62 65 20 73 74 6f 72  they may be stor
38570 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
38580 65 20 66 69 6c 65 20 68