/ Hex Artifact Content
Login

Artifact 4a58dfdfda7e72aab0e393953890a9b6d40a7ff4:


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 20 55 73 65 20 70 72 65 61 64 28  f../* Use pread(
0b40: 29 20 61 6e 64 20 70 77 72 69 74 65 28 29 20 69  ) and pwrite() i
0b50: 66 20 74 68 65 79 20 61 72 65 20 61 76 61 69 6c  f they are avail
0b60: 61 62 6c 65 20 2a 2f 0a 23 69 66 20 64 65 66 69  able */.#if defi
0b70: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23  ned(__APPLE__).#
0b80: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 50 52 45   define HAVE_PRE
0b90: 41 44 20 31 0a 23 20 64 65 66 69 6e 65 20 48 41  AD 1.# define HA
0ba0: 56 45 5f 50 57 52 49 54 45 20 31 0a 23 65 6e 64  VE_PWRITE 1.#end
0bb0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  if.#if defined(H
0bc0: 41 56 45 5f 50 52 45 41 44 36 34 29 20 26 26 20  AVE_PREAD64) && 
0bd0: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 57 52  defined(HAVE_PWR
0be0: 49 54 45 36 34 29 0a 23 20 75 6e 64 65 66 20 55  ITE64).# undef U
0bf0: 53 45 5f 50 52 45 41 44 0a 23 20 64 65 66 69 6e  SE_PREAD.# defin
0c00: 65 20 55 53 45 5f 50 52 45 41 44 36 34 20 31 0a  e USE_PREAD64 1.
0c10: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41  #elif defined(HA
0c20: 56 45 5f 50 52 45 41 44 29 20 26 26 20 64 65 66  VE_PREAD) && def
0c30: 69 6e 65 64 28 48 41 56 45 5f 50 57 52 49 54 45  ined(HAVE_PWRITE
0c40: 29 0a 23 20 75 6e 64 65 66 20 55 53 45 5f 50 52  ).# undef USE_PR
0c50: 45 41 44 36 34 0a 23 20 64 65 66 69 6e 65 20 55  EAD64.# define U
0c60: 53 45 5f 50 52 45 41 44 20 31 0a 23 65 6e 64 69  SE_PREAD 1.#endi
0c70: 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72  f../*.** standar
0c80: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
0c90: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0ca0: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0cb0: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0cc0: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0cd0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e  .h>.#include <un
0ce0: 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  istd.h>.#include
0cf0: 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75   <time.h>.#inclu
0d00: 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
0d10: 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e  #include <errno.
0d20: 68 3e 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  h>.#if !defined(
0d30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
0d40: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
0d50: 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 69 6e 63  MAP_SIZE>0.# inc
0d60: 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68  lude <sys/mman.h
0d70: 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  >.#endif..#if SQ
0d80: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0d90: 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c  ING_STYLE.# incl
0da0: 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68  ude <sys/ioctl.h
0db0: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 75 69  >.# include <uui
0dc0: 64 2f 75 75 69 64 2e 68 3e 0a 23 20 69 6e 63 6c  d/uuid.h>.# incl
0dd0: 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e  ude <sys/file.h>
0de0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  .# include <sys/
0df0: 70 61 72 61 6d 2e 68 3e 0a 23 65 6e 64 69 66 20  param.h>.#endif 
0e00: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
0e10: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
0e20: 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  /..#if defined(_
0e30: 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 28 28 5f  _APPLE__) && ((_
0e40: 5f 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f  _MAC_OS_X_VERSIO
0e50: 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 20 3e  N_MIN_REQUIRED >
0e60: 20 31 30 35 30 29 20 7c 7c 20 5c 0a 20 20 20 20   1050) || \.    
0e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e80: 20 20 20 20 20 20 20 28 5f 5f 49 50 48 4f 4e 45         (__IPHONE
0e90: 5f 4f 53 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f  _OS_VERSION_MIN_
0ea0: 52 45 51 55 49 52 45 44 20 3e 20 32 30 30 30 29  REQUIRED > 2000)
0eb0: 29 0a 23 20 20 69 66 20 28 21 64 65 66 69 6e 65  ).#  if (!define
0ec0: 64 28 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45  d(TARGET_OS_EMBE
0ed0: 44 44 45 44 29 20 7c 7c 20 28 54 41 52 47 45 54  DDED) || (TARGET
0ee0: 5f 4f 53 5f 45 4d 42 45 44 44 45 44 3d 3d 30 29  _OS_EMBEDDED==0)
0ef0: 29 20 5c 0a 20 20 20 20 20 20 20 26 26 20 28 21  ) \.       && (!
0f00: 64 65 66 69 6e 65 64 28 54 41 52 47 45 54 5f 49  defined(TARGET_I
0f10: 50 48 4f 4e 45 5f 53 49 4d 55 4c 41 54 4f 52 29  PHONE_SIMULATOR)
0f20: 20 7c 7c 20 28 54 41 52 47 45 54 5f 49 50 48 4f   || (TARGET_IPHO
0f30: 4e 45 5f 53 49 4d 55 4c 41 54 4f 52 3d 3d 30 29  NE_SIMULATOR==0)
0f40: 29 0a 23 20 20 20 20 64 65 66 69 6e 65 20 48 41  ).#    define HA
0f50: 56 45 5f 47 45 54 48 4f 53 54 55 55 49 44 20 31  VE_GETHOSTUUID 1
0f60: 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 77 61  .#  else.#    wa
0f70: 72 6e 69 6e 67 20 22 67 65 74 68 6f 73 74 75 75  rning "gethostuu
0f80: 69 64 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  id() is disabled
0f90: 2e 22 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64  .".#  endif.#end
0fa0: 69 66 0a 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f  if...#if OS_VXWO
0fb0: 52 4b 53 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  RKS.# include <s
0fc0: 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e  ys/ioctl.h>.# in
0fd0: 63 6c 75 64 65 20 3c 73 65 6d 61 70 68 6f 72 65  clude <semaphore
0fe0: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 6c  .h>.# include <l
0ff0: 69 6d 69 74 73 2e 68 3e 0a 23 65 6e 64 69 66 20  imits.h>.#endif 
1000: 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
1010: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
1020: 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49  APPLE__) || SQLI
1030: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1040: 47 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64  G_STYLE.# includ
1050: 65 20 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a  e <sys/mount.h>.
1060: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 48  #endif..#ifdef H
1070: 41 56 45 5f 55 54 49 4d 45 0a 23 20 69 6e 63 6c  AVE_UTIME.# incl
1080: 75 64 65 20 3c 75 74 69 6d 65 2e 68 3e 0a 23 65  ude <utime.h>.#e
1090: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ndif../*.** Allo
10a0: 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e  wed values of un
10b0: 69 78 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a  ixFile.fsFlags.*
10c0: 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  /.#define SQLITE
10d0: 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f  _FSFLAGS_IS_MSDO
10e0: 53 20 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a  S     0x1../*.**
10f0: 20 49 66 20 77 65 20 61 72 65 20 74 6f 20 62 65   If we are to be
1100: 20 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e   thread-safe, in
1110: 63 6c 75 64 65 20 74 68 65 20 70 74 68 72 65 61  clude the pthrea
1120: 64 73 20 68 65 61 64 65 72 20 61 6e 64 20 64 65  ds header and de
1130: 66 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49  fine.** the SQLI
1140: 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20  TE_UNIX_THREADS 
1150: 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51  macro..*/.#if SQ
1160: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
1170: 23 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65  # include <pthre
1180: 61 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53  ad.h>.# define S
1190: 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
11a0: 44 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  DS 1.#endif../*.
11b0: 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69  ** Default permi
11c0: 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61  ssions when crea
11d0: 74 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a  ting a new file.
11e0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
11f0: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
1200: 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66  ERMISSIONS.# def
1210: 69 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  ine SQLITE_DEFAU
1220: 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
1230: 4f 4e 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a  ONS 0644.#endif.
1240: 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70  ./*.** Default p
1250: 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20  ermissions when 
1260: 63 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72  creating auto pr
1270: 6f 78 79 20 64 69 72 0a 2a 2f 0a 23 69 66 6e 64  oxy dir.*/.#ifnd
1280: 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
1290: 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
12a0: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
12b0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
12c0: 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
12d0: 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a  ONS 0755.#endif.
12e0: 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73  ./*.** Maximum s
12f0: 75 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65  upported path-le
1300: 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ngth..*/.#define
1310: 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31   MAX_PATHNAME 51
1320: 32 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d  2../*.** Maximum
1330: 20 73 75 70 70 6f 72 74 65 64 20 73 79 6d 62 6f   supported symbo
1340: 6c 69 63 20 6c 69 6e 6b 73 0a 2a 2f 0a 23 64 65  lic links.*/.#de
1350: 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f  fine SQLITE_MAX_
1360: 53 59 4d 4c 49 4e 4b 53 20 31 30 30 0a 0a 2f 2a  SYMLINKS 100../*
1370: 20 41 6c 77 61 79 73 20 63 61 73 74 20 74 68 65   Always cast the
1380: 20 67 65 74 70 69 64 28 29 20 72 65 74 75 72 6e   getpid() return
1390: 20 74 79 70 65 20 66 6f 72 20 63 6f 6d 70 61 74   type for compat
13a0: 69 62 69 6c 69 74 79 20 77 69 74 68 0a 2a 2a 20  ibility with.** 
13b0: 6b 65 72 6e 65 6c 20 6d 6f 64 75 6c 65 73 20 69  kernel modules i
13c0: 6e 20 56 78 57 6f 72 6b 73 2e 20 2a 2f 0a 23 64  n VxWorks. */.#d
13d0: 65 66 69 6e 65 20 6f 73 47 65 74 70 69 64 28 58  efine osGetpid(X
13e0: 29 20 28 70 69 64 5f 74 29 67 65 74 70 69 64 28  ) (pid_t)getpid(
13f0: 29 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65  )../*.** Only se
1400: 74 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  t the lastErrno 
1410: 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  if the error cod
1420: 65 20 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f  e is a real erro
1430: 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20  r and not .** a 
1440: 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20  normal expected 
1450: 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53  return code of S
1460: 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51  QLITE_BUSY or SQ
1470: 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69  LITE_OK.*/.#defi
1480: 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  ne IS_LOCK_ERROR
1490: 28 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49  (x)  ((x != SQLI
14a0: 54 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20  TE_OK) && (x != 
14b0: 53 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f  SQLITE_BUSY))../
14c0: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
14d0: 6e 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20  nces */.typedef 
14e0: 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75  struct unixShm u
14f0: 6e 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20  nixShm;         
1500: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
1510: 69 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ion shared memor
1520: 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  y */.typedef str
1530: 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
1540: 75 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20  unixShmNode;    
1550: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
1560: 6f 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a  ory instance */.
1570: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75  typedef struct u
1580: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69  nixInodeInfo uni
1590: 78 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a  xInodeInfo;   /*
15a0: 20 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79   An i-node */.ty
15b0: 70 65 64 65 66 20 73 74 72 75 63 74 20 55 6e 69  pedef struct Uni
15c0: 78 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e  xUnusedFd UnixUn
15d0: 75 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41  usedFd;     /* A
15e0: 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
15f0: 73 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a  scriptor */../*.
1600: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66  ** Sometimes, af
1610: 74 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c  ter a file handl
1620: 65 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53  e is closed by S
1630: 51 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20  QLite, the file 
1640: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61  descriptor.** ca
1650: 6e 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69  nnot be closed i
1660: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74  mmediately. In t
1670: 68 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74  hese cases, inst
1680: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c  ances of the fol
1690: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74  lowing.** struct
16a0: 75 72 65 20 61 72 65 20 75 73 65 64 20 74 6f 20  ure are used to 
16b0: 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64  store the file d
16c0: 65 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20  escriptor while 
16d0: 77 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a  waiting for an.*
16e0: 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  * opportunity to
16f0: 20 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72   either close or
1700: 20 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74   reuse it..*/.st
1710: 72 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46  ruct UnixUnusedF
1720: 64 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20  d {.  int fd;   
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1740: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
1750: 6f 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20  or to close */. 
1760: 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20   int flags;     
1770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
1780: 61 67 73 20 74 68 69 73 20 66 69 6c 65 20 64 65  ags this file de
1790: 73 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65  scriptor was ope
17a0: 6e 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e  ned with */.  Un
17b0: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78  ixUnusedFd *pNex
17c0: 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  t;      /* Next 
17d0: 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
17e0: 72 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66  riptor on same f
17f0: 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ile */.};../*.**
1800: 20 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   The unixFile st
1810: 72 75 63 74 75 72 65 20 69 73 20 73 75 62 63 6c  ructure is subcl
1820: 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66  ass of sqlite3_f
1830: 69 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f 20  ile specific to 
1840: 74 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20  the unix.** VFS 
1850: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e  implementations.
1860: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1870: 63 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78  ct unixFile unix
1880: 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69  File;.struct uni
1890: 78 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65  xFile {.  sqlite
18a0: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e  3_io_methods con
18b0: 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a  st *pMethod;  /*
18c0: 20 41 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   Always the firs
18d0: 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c  t entry */.  sql
18e0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1900: 20 2f 2a 20 54 68 65 20 56 46 53 20 74 68 61 74   /* The VFS that
1910: 20 63 72 65 61 74 65 64 20 74 68 69 73 20 75 6e   created this un
1920: 69 78 46 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  ixFile */.  unix
1930: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
1940: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1950: 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f  /* Info about lo
1960: 63 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64  cks on this inod
1970: 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20  e */.  int h;   
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
19a0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
19b0: 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
19c0: 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20  char eFileLock; 
19d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
19e0: 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68  e type of lock h
19f0: 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a  eld on this fd *
1a00: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 68 6f  /.  unsigned sho
1a10: 72 74 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73  rt int ctrlFlags
1a20: 3b 20 20 20 20 20 20 20 2f 2a 20 42 65 68 61 76  ;       /* Behav
1a30: 69 6f 72 61 6c 20 62 69 74 73 2e 20 20 55 4e 49  ioral bits.  UNI
1a40: 58 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f  XFILE_* flags */
1a50: 0a 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f  .  int lastErrno
1a60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a70: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
1a80: 69 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61  ix errno from la
1a90: 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a  st I/O error */.
1aa0: 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43    void *lockingC
1ab0: 6f 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20  ontext;         
1ac0: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67        /* Locking
1ad0: 20 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20   style specific 
1ae0: 73 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55  state */.  UnixU
1af0: 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
1b00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1b10: 2a 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20  * Pre-allocated 
1b20: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a  UnixUnusedFd */.
1b30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1b40: 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ath;            
1b50: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1b60: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75   the file */.  u
1b70: 6e 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20  nixShm *pShm;   
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
1ba0: 6f 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f  ory segment info
1bb0: 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  rmation */.  int
1bc0: 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20   szChunk;       
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62   /* Configured b
1bf0: 79 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  y FCNTL_CHUNK_SI
1c00: 5a 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  ZE */.#if SQLITE
1c10: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1c20: 0a 20 20 69 6e 74 20 6e 46 65 74 63 68 4f 75 74  .  int nFetchOut
1c30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1c50: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
1c60: 78 46 65 74 63 68 20 72 65 66 73 20 2a 2f 0a 20  xFetch refs */. 
1c70: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d   sqlite3_int64 m
1c80: 6d 61 70 53 69 7a 65 3b 20 20 20 20 20 20 20 20  mapSize;        
1c90: 20 20 20 20 20 2f 2a 20 55 73 61 62 6c 65 20 73       /* Usable s
1ca0: 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61  ize of mapping a
1cb0: 74 20 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a  t pMapRegion */.
1cc0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1cd0: 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3b 20  mmapSizeActual; 
1ce0: 20 20 20 20 20 20 2f 2a 20 41 63 74 75 61 6c 20        /* Actual 
1cf0: 73 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20  size of mapping 
1d00: 61 74 20 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f  at pMapRegion */
1d10: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1d20: 20 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 20 20 20   mmapSizeMax;   
1d30: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67         /* Config
1d40: 75 72 65 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f  ured FCNTL_MMAP_
1d50: 53 49 5a 45 20 76 61 6c 75 65 20 2a 2f 0a 20 20  SIZE value */.  
1d60: 76 6f 69 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e  void *pMapRegion
1d70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d80: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61      /* Memory ma
1d90: 70 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23  pped region */.#
1da0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 51  endif.#ifdef __Q
1db0: 4e 58 4e 54 4f 5f 5f 0a 20 20 69 6e 74 20 73 65  NXNTO__.  int se
1dc0: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1de0: 20 44 65 76 69 63 65 20 73 65 63 74 6f 72 20 73   Device sector s
1df0: 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 76  ize */.  int dev
1e00: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1e10: 63 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  cs;          /* 
1e20: 50 72 65 63 6f 6d 70 75 74 65 64 20 64 65 76 69  Precomputed devi
1e30: 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
1e40: 63 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  cs */.#endif.#if
1e50: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1e60: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20  OCKING_STYLE || 
1e70: 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1e80: 5f 29 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  _).  int openFla
1e90: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1eb0: 66 6c 61 67 73 20 73 70 65 63 69 66 69 65 64 20  flags specified 
1ec0: 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65 6e  at open() */.#en
1ed0: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
1ee0: 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45  NABLE_DATA_PROTE
1ef0: 43 54 49 4f 4e 0a 20 20 69 6e 74 20 70 72 6f 74  CTION.  int prot
1f00: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1f20: 61 74 61 20 70 72 6f 74 65 63 74 69 6f 6e 20 66  ata protection f
1f30: 6c 61 67 73 20 66 72 6f 6d 20 75 6e 69 78 4f 70  lags from unixOp
1f40: 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  en */.#endif.#if
1f50: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1f60: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20  OCKING_STYLE || 
1f70: 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1f80: 5f 29 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73  _).  unsigned fs
1f90: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
1fa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68           /* cach
1fb0: 65 64 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20  ed details from 
1fc0: 73 74 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64  statfs() */.#end
1fd0: 69 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  if.#if OS_VXWORK
1fe0: 53 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  S.  struct vxwor
1ff0: 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20  ksFileId *pId;  
2000: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75          /* Uniqu
2010: 65 20 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e  e file ID */.#en
2020: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
2030: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
2040: 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76   next group of v
2050: 61 72 69 61 62 6c 65 73 20 61 72 65 20 75 73 65  ariables are use
2060: 64 20 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68  d to track wheth
2070: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20  er or not the.  
2080: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
2090: 6f 75 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20  ounter in bytes 
20a0: 32 34 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73  24-27 of databas
20b0: 65 20 66 69 6c 65 73 20 61 72 65 20 75 70 64 61  e files are upda
20c0: 74 65 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65  ted.  ** wheneve
20d0: 72 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68  r any part of th
20e0: 65 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  e database chang
20f0: 65 73 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f  es.  An assertio
2100: 6e 20 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a  n fault will.  *
2110: 2a 20 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c  * occur if a fil
2120: 65 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74  e is updated wit
2130: 68 6f 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69  hout also updati
2140: 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ng the transacti
2150: 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e  on.  ** counter.
2160: 20 20 54 68 69 73 20 74 65 73 74 20 69 73 20 6d    This test is m
2170: 61 64 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77  ade to avoid new
2180: 20 70 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61   problems simila
2190: 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e  r to the.  ** on
21a0: 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20 74  e described by t
21b0: 69 63 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20  icket #3584. .  
21c0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
21d0: 61 72 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  ar transCntrChng
21e0: 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74  ;   /* True if t
21f0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
2200: 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a  ounter changed *
2210: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
2220: 72 20 64 62 55 70 64 61 74 65 3b 20 20 20 20 20  r dbUpdate;     
2230: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
2240: 79 20 70 61 72 74 20 6f 66 20 64 61 74 61 62 61  y part of databa
2250: 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20  se file changed 
2260: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
2270: 61 72 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  ar inNormalWrite
2280: 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69  ;   /* True if i
2290: 6e 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65  n a normal write
22a0: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23   operation */..#
22b0: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
22c0: 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49  LITE_TEST.  /* I
22d0: 6e 20 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63  n test mode, inc
22e0: 72 65 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f  rease the size o
22f0: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
2300: 20 61 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a   a bit so that .
2310: 20 20 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65    ** it is large
2320: 72 20 74 68 61 6e 20 74 68 65 20 73 74 72 75 63  r than the struc
2330: 74 20 43 72 61 73 68 46 69 6c 65 20 64 65 66 69  t CrashFile defi
2340: 6e 65 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a  ned in test6.c..
2350: 20 20 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64    */.  char aPad
2360: 64 69 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66  ding[32];.#endif
2370: 0a 7d 3b 0a 0a 2f 2a 20 54 68 69 73 20 76 61 72  .};../* This var
2380: 69 61 62 6c 65 20 68 6f 6c 64 73 20 74 68 65 20  iable holds the 
2390: 70 72 6f 63 65 73 73 20 69 64 20 28 70 69 64 29  process id (pid)
23a0: 20 66 72 6f 6d 20 77 68 65 6e 20 74 68 65 20 78   from when the x
23b0: 52 61 6e 64 6f 6d 6e 65 73 73 28 29 0a 2a 2a 20  Randomness().** 
23c0: 6d 65 74 68 6f 64 20 77 61 73 20 63 61 6c 6c 65  method was calle
23d0: 64 2e 20 20 49 66 20 78 4f 70 65 6e 28 29 20 69  d.  If xOpen() i
23e0: 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 20  s called from a 
23f0: 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73  different proces
2400: 73 20 69 64 2c 0a 2a 2a 20 69 6e 64 69 63 61 74  s id,.** indicat
2410: 69 6e 67 20 74 68 61 74 20 61 20 66 6f 72 6b 28  ing that a fork(
2420: 29 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20  ) has occurred, 
2430: 74 68 65 20 50 52 4e 47 20 77 69 6c 6c 20 62 65  the PRNG will be
2440: 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69   reset..*/.stati
2450: 63 20 70 69 64 5f 74 20 72 61 6e 64 6f 6d 6e 65  c pid_t randomne
2460: 73 73 50 69 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  ssPid = 0;../*.*
2470: 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  * Allowed values
2480: 20 66 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c   for the unixFil
2490: 65 2e 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d  e.ctrlFlags bitm
24a0: 61 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ask:.*/.#define 
24b0: 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20  UNIXFILE_EXCL   
24c0: 20 20 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a       0x01     /*
24d0: 20 43 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f   Connections fro
24e0: 6d 20 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e  m one process on
24f0: 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  ly */.#define UN
2500: 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20  IXFILE_RDONLY   
2510: 20 20 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43     0x02     /* C
2520: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61  onnection is rea
2530: 64 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e  d only */.#defin
2540: 65 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49  e UNIXFILE_PERSI
2550: 53 54 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20  ST_WAL 0x04     
2560: 2f 2a 20 50 65 72 73 69 73 74 65 6e 74 20 57 41  /* Persistent WA
2570: 4c 20 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65  L mode */.#ifnde
2580: 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
2590: 5f 44 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e  _DIRSYNC.# defin
25a0: 65 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59  e UNIXFILE_DIRSY
25b0: 4e 43 20 20 20 20 30 78 30 38 20 20 20 20 20 2f  NC    0x08     /
25c0: 2a 20 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63  * Directory sync
25d0: 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65   needed */.#else
25e0: 0a 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49  .# define UNIXFI
25f0: 4c 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78  LE_DIRSYNC    0x
2600: 30 30 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  00.#endif.#defin
2610: 65 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20  e UNIXFILE_PSOW 
2620: 20 20 20 20 20 20 20 30 78 31 30 20 20 20 20 20         0x10     
2630: 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  /* SQLITE_IOCAP_
2640: 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
2650: 49 54 45 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55  ITE */.#define U
2660: 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 20  NIXFILE_DELETE  
2670: 20 20 20 20 30 78 32 30 20 20 20 20 20 2f 2a 20      0x20     /* 
2680: 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20  Delete on close 
2690: 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46  */.#define UNIXF
26a0: 49 4c 45 5f 55 52 49 20 20 20 20 20 20 20 20 20  ILE_URI         
26b0: 30 78 34 30 20 20 20 20 20 2f 2a 20 46 69 6c 65  0x40     /* File
26c0: 6e 61 6d 65 20 6d 69 67 68 74 20 68 61 76 65 20  name might have 
26d0: 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73  query parameters
26e0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
26f0: 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 20 20 20 20  FILE_NOLOCK     
2700: 20 30 78 38 30 20 20 20 20 20 2f 2a 20 44 6f 20   0x80     /* Do 
2710: 6e 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  no file locking 
2720: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64  */../*.** Includ
2730: 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63  e code that is c
2740: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f  ommon to all os_
2750: 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e  *.c files.*/.#in
2760: 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e  clude "os_common
2770: 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e  .h"../*.** Defin
2780: 65 20 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73  e various macros
2790: 20 74 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e   that are missin
27a0: 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74  g from some syst
27b0: 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ems..*/.#ifndef 
27c0: 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65  O_LARGEFILE.# de
27d0: 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45  fine O_LARGEFILE
27e0: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   0.#endif.#ifdef
27f0: 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
2800: 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41  LFS.# undef O_LA
2810: 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65  RGEFILE.# define
2820: 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23   O_LARGEFILE 0.#
2830: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f  endif.#ifndef O_
2840: 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e  NOFOLLOW.# defin
2850: 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23  e O_NOFOLLOW 0.#
2860: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f  endif.#ifndef O_
2870: 42 49 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20  BINARY.# define 
2880: 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69  O_BINARY 0.#endi
2890: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72  f../*.** The thr
28a0: 65 61 64 69 64 20 6d 61 63 72 6f 20 72 65 73 6f  eadid macro reso
28b0: 6c 76 65 73 20 74 6f 20 74 68 65 20 74 68 72 65  lves to the thre
28c0: 61 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20 20  ad-id or to 0.  
28d0: 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  Used for.** test
28e0: 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
28f0: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53  g only..*/.#if S
2900: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
2910: 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64 69  .#define threadi
2920: 64 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29  d pthread_self()
2930: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 74  .#else.#define t
2940: 68 72 65 61 64 69 64 20 30 0a 23 65 6e 64 69 66  hreadid 0.#endif
2950: 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45  ..#ifdef __APPLE
2960: 5f 5f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54  __.#define SQLIT
2970: 45 5f 45 4e 41 42 4c 45 5f 53 55 50 45 52 4c 4f  E_ENABLE_SUPERLO
2980: 43 4b 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66  CK 1.#endif..#if
2990: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
29a0: 55 50 45 52 4c 4f 43 4b 0a 23 69 6e 63 6c 75 64  UPERLOCK.#includ
29b0: 65 20 22 73 71 6c 69 74 65 33 2e 68 22 0a 23 69  e "sqlite3.h".#i
29c0: 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68  nclude <string.h
29d0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65  >.#include <asse
29e0: 72 74 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 41 20 73  rt.h>../*.** A s
29f0: 74 72 75 63 74 75 72 65 20 74 6f 20 63 6f 6c 6c  tructure to coll
2a00: 65 63 74 20 61 20 62 75 73 79 2d 68 61 6e 64 6c  ect a busy-handl
2a10: 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64 20  er callback and 
2a20: 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 61 20 63  argument and a c
2a30: 6f 75 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6e  ount.** of the n
2a40: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 69  umber of times i
2a50: 74 20 68 61 73 20 62 65 65 6e 20 69 6e 76 6f 6b  t has been invok
2a60: 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 75  ed..*/.struct Su
2a70: 70 65 72 6c 6f 63 6b 42 75 73 79 20 7b 0a 20 20  perlockBusy {.  
2a80: 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69  int (*xBusy)(voi
2a90: 64 2a 2c 69 6e 74 29 3b 20 20 20 20 20 20 20 20  d*,int);        
2aa0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
2ab0: 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy-handler funct
2ac0: 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
2ad0: 42 75 73 79 41 72 67 3b 20 20 20 20 20 20 20 20  BusyArg;        
2ae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2af0: 74 20 61 72 67 20 74 6f 20 70 61 73 73 20 74 6f  t arg to pass to
2b00: 20 78 42 75 73 79 20 2a 2f 0a 20 20 69 6e 74 20   xBusy */.  int 
2b10: 6e 42 75 73 79 3b 20 20 20 20 20 20 20 20 20 20  nBusy;          
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2b30: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 78  umber of times x
2b40: 42 75 73 79 20 68 61 73 20 62 65 65 6e 20 69 6e  Busy has been in
2b50: 76 6f 6b 65 64 20 2a 2f 0a 7d 3b 0a 74 79 70 65  voked */.};.type
2b60: 64 65 66 20 73 74 72 75 63 74 20 53 75 70 65 72  def struct Super
2b70: 6c 6f 63 6b 42 75 73 79 20 53 75 70 65 72 6c 6f  lockBusy Superlo
2b80: 63 6b 42 75 73 79 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ckBusy;../*.** A
2b90: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
2ba0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
2bb0: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
2bc0: 65 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69  ed for each acti
2bd0: 76 65 0a 2a 2a 20 73 75 70 65 72 6c 6f 63 6b 2e  ve.** superlock.
2be0: 20 54 68 65 20 6f 70 61 71 75 65 20 68 61 6e 64   The opaque hand
2bf0: 6c 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  le returned by s
2c00: 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72  qlite3demo_super
2c10: 6c 6f 63 6b 28 29 20 69 73 0a 2a 2a 20 61 63 74  lock() is.** act
2c20: 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  ually a pointer 
2c30: 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  to an instance o
2c40: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
2c50: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 75 70 65  ..*/.struct Supe
2c60: 72 6c 6f 63 6b 20 7b 0a 20 20 73 71 6c 69 74 65  rlock {.  sqlite
2c70: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
2c80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
2c90: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 75 73 65  abase handle use
2ca0: 64 20 74 6f 20 6c 6f 63 6b 20 64 62 20 2a 2f 0a  d to lock db */.
2cb0: 20 20 69 6e 74 20 62 57 61 6c 3b 20 20 20 20 20    int bWal;     
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 64 62 20    /* True if db 
2ce0: 69 73 20 61 20 57 41 4c 20 64 61 74 61 62 61 73  is a WAL databas
2cf0: 65 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65 66 20  e */.};.typedef 
2d00: 73 74 72 75 63 74 20 53 75 70 65 72 6c 6f 63 6b  struct Superlock
2d10: 20 53 75 70 65 72 6c 6f 63 6b 3b 0a 0a 2f 2a 0a   Superlock;../*.
2d20: 2a 2a 20 54 68 65 20 70 43 74 78 20 70 6f 69 6e  ** The pCtx poin
2d30: 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 74 68  ter passed to th
2d40: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
2d50: 63 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65  ctually a pointe
2d60: 72 20 74 6f 20 61 0a 2a 2a 20 53 75 70 65 72 6c  r to a.** Superl
2d70: 6f 63 6b 42 75 73 79 20 73 74 72 75 63 74 75 72  ockBusy structur
2d80: 65 2e 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  e. Invoke the bu
2d90: 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy-handler funct
2da0: 69 6f 6e 20 65 6e 63 61 70 73 75 6c 61 74 65 64  ion encapsulated
2db0: 0a 2a 2a 20 62 79 20 74 68 65 20 73 74 72 75 63  .** by the struc
2dc0: 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20  ture and return 
2dd0: 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73  the result..*/.s
2de0: 74 61 74 69 63 20 69 6e 74 20 73 75 70 65 72 6c  tatic int superl
2df0: 6f 63 6b 42 75 73 79 48 61 6e 64 6c 65 72 28 76  ockBusyHandler(v
2e00: 6f 69 64 20 2a 70 43 74 78 2c 20 69 6e 74 20 55  oid *pCtx, int U
2e10: 4e 55 53 45 44 29 7b 0a 20 20 53 75 70 65 72 6c  NUSED){.  Superl
2e20: 6f 63 6b 42 75 73 79 20 2a 70 42 75 73 79 20 3d  ockBusy *pBusy =
2e30: 20 28 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20   (SuperlockBusy 
2e40: 2a 29 70 43 74 78 3b 0a 20 20 69 66 28 20 70 42  *)pCtx;.  if( pB
2e50: 75 73 79 2d 3e 78 42 75 73 79 3d 3d 30 20 29 20  usy->xBusy==0 ) 
2e60: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
2e70: 72 6e 20 70 42 75 73 79 2d 3e 78 42 75 73 79 28  rn pBusy->xBusy(
2e80: 70 42 75 73 79 2d 3e 70 42 75 73 79 41 72 67 2c  pBusy->pBusyArg,
2e90: 20 70 42 75 73 79 2d 3e 6e 42 75 73 79 2b 2b 29   pBusy->nBusy++)
2ea0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2eb0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
2ec0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
2ed0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
2ee0: 73 65 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20  se file for .** 
2ef0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69 73  connection db is
2f00: 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64   open in WAL mod
2f10: 65 20 6f 72 20 6e 6f 74 2e 20 49 66 20 6e 6f 20  e or not. If no 
2f20: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 64  error occurs and
2f30: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
2f40: 20 66 69 6c 65 20 69 73 20 69 6e 20 57 41 4c 20   file is in WAL 
2f50: 6d 6f 64 65 2c 20 73 65 74 20 2a 70 62 57 61 6c  mode, set *pbWal
2f60: 20 74 6f 20 74 72 75 65 20 61 6e 64 20 72 65 74   to true and ret
2f70: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
2f80: 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 69  * If it is not i
2f90: 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 73 65 74 20  n WAL mode, set 
2fa0: 2a 70 62 57 61 6c 20 74 6f 20 66 61 6c 73 65 2e  *pbWal to false.
2fb0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
2fc0: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
2fd0: 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
2fe0: 72 20 63 6f 64 65 2e 20 54 68 65 20 76 61 6c 75  r code. The valu
2ff0: 65 20 6f 66 20 2a 70 62 57 61 6c 0a 2a 2a 20 69  e of *pbWal.** i
3000: 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74  s undefined in t
3010: 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61  his case..*/.sta
3020: 74 69 63 20 69 6e 74 20 73 75 70 65 72 6c 6f 63  tic int superloc
3030: 6b 49 73 57 61 6c 28 53 75 70 65 72 6c 6f 63 6b  kIsWal(Superlock
3040: 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20   *pLock){.  int 
3050: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
3060: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
3070: 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
3080: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
3090: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
30a0: 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 50 52 41 47  /* Compiled PRAG
30b0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
30c0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20  statement */..  
30d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
30e0: 70 61 72 65 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20  pare(pLock->db, 
30f0: 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75  "PRAGMA main.jou
3100: 72 6e 61 6c 5f 6d 6f 64 65 22 2c 20 2d 31 2c 20  rnal_mode", -1, 
3110: 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66  &pStmt, 0);.  if
3120: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
3130: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
3140: 70 4c 6f 63 6b 2d 3e 62 57 61 6c 20 3d 20 30 3b  pLock->bWal = 0;
3150: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f  .  if( SQLITE_RO
3160: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
3170: 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 63 6f  pStmt) ){.    co
3180: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64 65 20  nst char *zMode 
3190: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
31a0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
31b0: 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  ext(pStmt, 0);. 
31c0: 20 20 20 69 66 28 20 7a 4d 6f 64 65 20 26 26 20     if( zMode && 
31d0: 73 74 72 6c 65 6e 28 7a 4d 6f 64 65 29 3d 3d 33  strlen(zMode)==3
31e0: 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e   && sqlite3_strn
31f0: 69 63 6d 70 28 22 77 61 6c 22 2c 20 7a 4d 6f 64  icmp("wal", zMod
3200: 65 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  e, 3)==0 ){.    
3210: 20 20 70 4c 6f 63 6b 2d 3e 62 57 61 6c 20 3d 20    pLock->bWal = 
3220: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
3230: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 66  return sqlite3_f
3240: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
3250: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20  }../*.** Obtain 
3260: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 73 68 6d  an exclusive shm
3270: 2d 6c 6f 63 6b 20 6f 6e 20 6e 42 79 74 65 20 62  -lock on nByte b
3280: 79 74 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  ytes starting at
3290: 20 6f 66 66 73 65 74 20 69 64 78 0a 2a 2a 20 6f   offset idx.** o
32a0: 66 20 74 68 65 20 66 69 6c 65 20 66 64 2e 20 49  f the file fd. I
32b0: 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f  f the lock canno
32c0: 74 20 62 65 20 6f 62 74 61 69 6e 65 64 20 69 6d  t be obtained im
32d0: 6d 65 64 69 61 74 65 6c 79 2c 20 69 6e 76 6f 6b  mediately, invok
32e0: 65 0a 2a 2a 20 74 68 65 20 62 75 73 79 2d 68 61  e.** the busy-ha
32f0: 6e 64 6c 65 72 20 75 6e 74 69 6c 20 65 69 74 68  ndler until eith
3300: 65 72 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65  er it is obtaine
3310: 64 20 6f 72 20 74 68 65 20 62 75 73 79 2d 68 61  d or the busy-ha
3320: 6e 64 6c 65 72 0a 2a 2a 20 63 61 6c 6c 62 61 63  ndler.** callbac
3330: 6b 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2f 0a  k returns 0..*/.
3340: 73 74 61 74 69 63 20 69 6e 74 20 73 75 70 65 72  static int super
3350: 6c 6f 63 6b 53 68 6d 4c 6f 63 6b 28 0a 20 20 73  lockShmLock(.  s
3360: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
3370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3380: 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20  * Database file 
3390: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
33a0: 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  idx,            
33b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
33c0: 66 66 73 65 74 20 6f 66 20 73 68 6d 2d 6c 6f 63  ffset of shm-loc
33d0: 6b 20 74 6f 20 6f 62 74 61 69 6e 20 2a 2f 0a 20  k to obtain */. 
33e0: 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3400: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
3410: 6e 73 65 63 74 69 76 65 20 62 79 74 65 73 20 74  nsective bytes t
3420: 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 53 75 70 65  o lock */.  Supe
3430: 72 6c 6f 63 6b 42 75 73 79 20 2a 70 42 75 73 79  rlockBusy *pBusy
3440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
3450: 75 73 79 2d 68 61 6e 64 6c 65 72 20 77 72 61 70  usy-handler wrap
3460: 70 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  per object */.){
3470: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
3480: 20 28 2a 78 53 68 6d 4c 6f 63 6b 29 28 73 71 6c   (*xShmLock)(sql
3490: 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2c  ite3_file*, int,
34a0: 20 69 6e 74 2c 20 69 6e 74 29 20 3d 20 66 64 2d   int, int) = fd-
34b0: 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c  >pMethods->xShmL
34c0: 6f 63 6b 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20  ock;.  do {.    
34d0: 72 63 20 3d 20 78 53 68 6d 4c 6f 63 6b 28 66 64  rc = xShmLock(fd
34e0: 2c 20 69 64 78 2c 20 6e 42 79 74 65 2c 20 53 51  , idx, nByte, SQ
34f0: 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 7c 53 51  LITE_SHM_LOCK|SQ
3500: 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
3510: 56 45 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72  VE);.  }while( r
3520: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
3530: 26 20 73 75 70 65 72 6c 6f 63 6b 42 75 73 79 48  & superlockBusyH
3540: 61 6e 64 6c 65 72 28 28 76 6f 69 64 20 2a 29 70  andler((void *)p
3550: 42 75 73 79 2c 20 30 29 20 29 3b 0a 20 20 72 65  Busy, 0) );.  re
3560: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
3570: 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 65 78 74  * Obtain the ext
3580: 72 61 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  ra locks on the 
3590: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 72 65  database file re
35a0: 71 75 69 72 65 64 20 66 6f 72 20 57 41 4c 20 64  quired for WAL d
35b0: 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 49 6e 76  atabases..** Inv
35c0: 6f 6b 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  oke the supplied
35d0: 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 61 73   busy-handler as
35e0: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74   required..*/.st
35f0: 61 74 69 63 20 69 6e 74 20 73 75 70 65 72 6c 6f  atic int superlo
3600: 63 6b 57 61 6c 4c 6f 63 6b 28 0a 20 20 73 71 6c  ckWalLock(.  sql
3610: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
3620: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3630: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
3640: 6f 70 65 6e 20 6f 6e 20 57 41 4c 20 64 61 74 61  open on WAL data
3650: 62 61 73 65 20 2a 2f 0a 20 20 53 75 70 65 72 6c  base */.  Superl
3660: 6f 63 6b 42 75 73 79 20 2a 70 42 75 73 79 20 20  ockBusy *pBusy  
3670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 73            /* Bus
3680: 79 20 68 61 6e 64 6c 65 72 20 77 72 61 70 70 65  y handler wrappe
3690: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  r object */.){. 
36a0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
36b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36c0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
36d0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
36e0: 65 20 2a 66 64 20 3d 20 30 3b 20 20 20 20 20 20  e *fd = 0;      
36f0: 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 64 61 74       /* Main dat
3700: 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c  abase file handl
3710: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61  e */.  void vola
3720: 74 69 6c 65 20 2a 70 20 3d 20 30 3b 20 20 20 20  tile *p = 0;    
3730: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
3740: 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20  r to first page 
3750: 6f 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  of shared memory
3760: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e   */..  /* Obtain
3770: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
3780: 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f  e sqlite3_file o
3790: 62 6a 65 63 74 20 6f 70 65 6e 20 6f 6e 20 74 68  bject open on th
37a0: 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 2e 20  e main db file. 
37b0: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
37c0: 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
37d0: 62 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54  b, "main", SQLIT
37e0: 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49  E_FCNTL_FILE_POI
37f0: 4e 54 45 52 2c 20 28 76 6f 69 64 20 2a 29 26 66  NTER, (void *)&f
3800: 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  d);.  if( rc!=SQ
3810: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
3820: 20 72 63 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69   rc;..  /* Obtai
3830: 6e 20 74 68 65 20 22 72 65 63 6f 76 65 72 79 22  n the "recovery"
3840: 20 6c 6f 63 6b 2e 20 4e 6f 72 6d 61 6c 6c 79 2c   lock. Normally,
3850: 20 74 68 69 73 20 6c 6f 63 6b 20 69 73 20 6f 6e   this lock is on
3860: 6c 79 20 6f 62 74 61 69 6e 65 64 20 62 79 0a 20  ly obtained by. 
3870: 20 2a 2a 20 63 6c 69 65 6e 74 73 20 72 75 6e 6e   ** clients runn
3880: 69 6e 67 20 64 61 74 61 62 61 73 65 20 72 65 63  ing database rec
3890: 6f 76 65 72 79 2e 20 20 0a 20 20 2a 2f 0a 20 20  overy.  .  */.  
38a0: 72 63 20 3d 20 73 75 70 65 72 6c 6f 63 6b 53 68  rc = superlockSh
38b0: 6d 4c 6f 63 6b 28 66 64 2c 20 32 2c 20 31 2c 20  mLock(fd, 2, 1, 
38c0: 70 42 75 73 79 29 3b 0a 20 20 69 66 28 20 72 63  pBusy);.  if( rc
38d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
38e0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 5a  turn rc;..  /* Z
38f0: 65 72 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66  ero the start of
3900: 20 74 68 65 20 66 69 72 73 74 20 73 68 61 72 65   the first share
3910: 64 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2e 20 54  d-memory page. T
3920: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61  his means that a
3930: 6e 79 0a 20 20 2a 2a 20 63 6c 69 65 6e 74 73 20  ny.  ** clients 
3940: 74 68 61 74 20 6f 70 65 6e 20 72 65 61 64 20 6f  that open read o
3950: 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
3960: 69 6f 6e 73 20 66 72 6f 6d 20 74 68 69 73 20 70  ions from this p
3970: 6f 69 6e 74 20 6f 6e 20 77 69 6c 6c 0a 20 20 2a  oint on will.  *
3980: 2a 20 68 61 76 65 20 74 6f 20 72 75 6e 20 72 65  * have to run re
3990: 63 6f 76 65 72 79 20 62 65 66 6f 72 65 20 70 72  covery before pr
39a0: 6f 63 65 65 64 69 6e 67 2e 20 53 69 6e 63 65 20  oceeding. Since 
39b0: 74 68 65 79 20 6e 65 65 64 20 74 68 65 20 22 72  they need the "r
39c0: 65 63 6f 76 65 72 79 22 0a 20 20 2a 2a 20 6c 6f  ecovery".  ** lo
39d0: 63 6b 20 74 68 61 74 20 74 68 69 73 20 70 72 6f  ck that this pro
39e0: 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
39f0: 74 6f 20 64 6f 20 74 68 61 74 2c 20 6e 6f 20 6e  to do that, no n
3a00: 65 77 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ew read or write
3a10: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
3a20: 6e 73 20 6d 61 79 20 6e 6f 77 20 62 65 20 6f 70  ns may now be op
3a30: 65 6e 65 64 2e 20 4e 6f 72 20 63 61 6e 20 61 20  ened. Nor can a 
3a40: 63 68 65 63 6b 70 6f 69 6e 74 20 62 65 20 72 75  checkpoint be ru
3a50: 6e 2c 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  n, for the.  ** 
3a60: 73 61 6d 65 20 72 65 61 73 6f 6e 2e 0a 20 20 2a  same reason..  *
3a70: 2f 0a 20 20 72 63 20 3d 20 66 64 2d 3e 70 4d 65  /.  rc = fd->pMe
3a80: 74 68 6f 64 73 2d 3e 78 53 68 6d 4d 61 70 28 66  thods->xShmMap(f
3a90: 64 2c 20 30 2c 20 33 32 2a 31 30 32 34 2c 20 31  d, 0, 32*1024, 1
3aa0: 2c 20 26 70 29 3b 0a 20 20 69 66 28 20 72 63 21  , &p);.  if( rc!
3ab0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
3ac0: 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74  urn rc;.  memset
3ad0: 28 28 76 6f 69 64 20 2a 29 70 2c 20 30 2c 20 33  ((void *)p, 0, 3
3ae0: 32 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e  2);..  /* Obtain
3af0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
3b00: 20 6f 6e 20 61 6c 6c 20 74 68 65 20 22 72 65 61   on all the "rea
3b10: 64 2d 6c 6f 63 6b 22 20 73 6c 6f 74 73 2e 20 4f  d-lock" slots. O
3b20: 6e 63 65 20 74 68 65 73 65 20 6c 6f 63 6b 73 0a  nce these locks.
3b30: 20 20 2a 2a 20 61 72 65 20 68 65 6c 64 2c 20 69    ** are held, i
3b40: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
3b50: 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e  that there are n
3b60: 6f 20 61 63 74 69 76 65 20 72 65 61 64 65 72 2c  o active reader,
3b70: 20 77 72 69 74 65 72 20 6f 72 20 0a 20 20 2a 2a   writer or .  **
3b80: 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 20 63 6c   checkpointer cl
3b90: 69 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  ients..  */.  rc
3ba0: 20 3d 20 73 75 70 65 72 6c 6f 63 6b 53 68 6d 4c   = superlockShmL
3bb0: 6f 63 6b 28 66 64 2c 20 33 2c 20 53 51 4c 49 54  ock(fd, 3, SQLIT
3bc0: 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 2d 33 2c 20 70  E_SHM_NLOCK-3, p
3bd0: 42 75 73 79 29 3b 0a 20 20 72 65 74 75 72 6e 20  Busy);.  return 
3be0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  rc;.}../*.** Rel
3bf0: 65 61 73 65 20 61 20 73 75 70 65 72 6c 6f 63 6b  ease a superlock
3c00: 20 68 65 6c 64 20 6f 6e 20 61 20 64 61 74 61 62   held on a datab
3c10: 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72  ase file. The ar
3c20: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
3c30: 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69   .** this functi
3c40: 6f 6e 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  on must have bee
3c50: 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  n obtained from 
3c60: 61 20 73 75 63 63 65 73 73 66 75 6c 20 63 61 6c  a successful cal
3c70: 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 64  l to.** sqlite3d
3c80: 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 29 2e  emo_superlock().
3c90: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3ca0: 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65  sqlite3demo_supe
3cb0: 72 75 6e 6c 6f 63 6b 28 76 6f 69 64 20 2a 70 4c  runlock(void *pL
3cc0: 6f 63 6b 29 7b 0a 20 20 53 75 70 65 72 6c 6f 63  ock){.  Superloc
3cd0: 6b 20 2a 70 20 3d 20 28 53 75 70 65 72 6c 6f 63  k *p = (Superloc
3ce0: 6b 20 2a 29 70 4c 6f 63 6b 3b 0a 20 20 69 66 28  k *)pLock;.  if(
3cf0: 20 70 2d 3e 62 57 61 6c 20 29 7b 0a 20 20 20 20   p->bWal ){.    
3d00: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
3d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d20: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
3d30: 2f 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  /.    int flags 
3d40: 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  = SQLITE_SHM_UNL
3d50: 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
3d60: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
3d70: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
3d80: 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
3d90: 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
3da0: 72 6f 6c 28 70 2d 3e 64 62 2c 20 22 6d 61 69 6e  rol(p->db, "main
3db0: 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ", SQLITE_FCNTL_
3dc0: 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2c 0a 20 20  FILE_POINTER,.  
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3de0: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
3df0: 20 2a 29 26 66 64 29 3b 0a 20 20 20 20 69 66 28   *)&fd);.    if(
3e00: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
3e10: 7b 0a 20 20 20 20 20 20 66 64 2d 3e 70 4d 65 74  {.      fd->pMet
3e20: 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28 66  hods->xShmLock(f
3e30: 64 2c 20 32 2c 20 31 2c 20 66 6c 61 67 73 29 3b  d, 2, 1, flags);
3e40: 0a 20 20 20 20 20 20 66 64 2d 3e 70 4d 65 74 68  .      fd->pMeth
3e50: 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28 66 64  ods->xShmLock(fd
3e60: 2c 20 33 2c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  , 3, SQLITE_SHM_
3e70: 4e 4c 4f 43 4b 2d 33 2c 20 66 6c 61 67 73 29 3b  NLOCK-3, flags);
3e80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
3e90: 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62  ite3_close(p->db
3ea0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3eb0: 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  e(p);.}../*.** O
3ec0: 62 74 61 69 6e 20 61 20 73 75 70 65 72 6c 6f 63  btain a superloc
3ed0: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
3ee0: 65 20 66 69 6c 65 20 69 64 65 6e 74 69 66 69 65  e file identifie
3ef0: 64 20 62 79 20 7a 50 61 74 68 2c 20 75 73 69 6e  d by zPath, usin
3f00: 67 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  g the.** locking
3f10: 20 70 72 69 6d 69 74 69 76 65 73 20 70 72 6f 76   primitives prov
3f20: 69 64 65 64 20 62 79 20 56 46 53 20 7a 56 66 73  ided by VFS zVfs
3f30: 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
3f40: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a   SQLITE_OK is.**
3f50: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6f 75   returned and ou
3f60: 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70  tput variable *p
3f70: 70 4c 6f 63 6b 20 69 73 20 70 6f 70 75 6c 61 74  pLock is populat
3f80: 65 64 20 77 69 74 68 20 61 6e 20 6f 70 61 71 75  ed with an opaqu
3f90: 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 74 68 61 74  e handle.** that
3fa0: 20 6d 61 79 20 62 65 20 75 73 65 64 20 77 69 74   may be used wit
3fb0: 68 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75  h sqlite3demo_su
3fc0: 70 65 72 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 72  perunlock() to r
3fd0: 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 2e  elease the lock.
3fe0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
3ff0: 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 4c 6f  or occurs, *ppLo
4000: 63 6b 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  ck is set to 0 a
4010: 6e 64 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  nd an SQLite err
4020: 6f 72 20 63 6f 64 65 20 0a 2a 2a 20 28 65 2e 67  or code .** (e.g
4030: 2e 20 53 51 4c 49 54 45 5f 42 55 53 59 29 20 69  . SQLITE_BUSY) i
4040: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
4050: 2a 20 49 66 20 61 20 72 65 71 75 69 72 65 64 20  * If a required 
4060: 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
4070: 62 74 61 69 6e 65 64 20 69 6d 6d 65 64 69 61 74  btained immediat
4080: 65 6c 79 20 61 6e 64 20 74 68 65 20 78 42 75 73  ely and the xBus
4090: 79 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 74  y parameter.** t
40a0: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
40b0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
40c0: 6e 20 78 42 75 73 79 20 69 73 20 69 6e 76 6f 6b  n xBusy is invok
40d0: 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77  ed in the same w
40e0: 61 79 0a 2a 2a 20 61 73 20 61 20 62 75 73 79 2d  ay.** as a busy-
40f0: 68 61 6e 64 6c 65 72 20 72 65 67 69 73 74 65 72  handler register
4100: 65 64 20 77 69 74 68 20 53 51 4c 69 74 65 20 28  ed with SQLite (
4110: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 62 75  using sqlite3_bu
4120: 73 79 5f 68 61 6e 64 6c 65 72 28 29 29 0a 2a 2a  sy_handler()).**
4130: 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 74 68   until either th
4140: 65 20 6c 6f 63 6b 20 63 61 6e 20 62 65 20 6f 62  e lock can be ob
4150: 74 61 69 6e 65 64 20 6f 72 20 74 68 65 20 62 75  tained or the bu
4160: 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy-handler funct
4170: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 30  ion returns.** 0
4180: 20 28 69 6e 64 69 63 61 74 69 6e 67 20 22 67 69   (indicating "gi
4190: 76 65 20 75 70 22 29 2e 0a 2a 2f 0a 73 74 61 74  ve up")..*/.stat
41a0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 64 65  ic int sqlite3de
41b0: 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 0a 20 20  mo_superlock(.  
41c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
41d0: 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
41e0: 2f 2a 20 50 61 74 68 20 74 6f 20 64 61 74 61 62  /* Path to datab
41f0: 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 6f 63 6b  ase file to lock
4200: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
4210: 20 2a 7a 56 66 73 2c 20 20 20 20 20 20 20 20 20   *zVfs,         
4220: 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20        /* VFS to 
4230: 75 73 65 20 74 6f 20 61 63 63 65 73 73 20 64 61  use to access da
4240: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
4250: 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
4260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4270: 20 41 64 64 69 74 69 6f 6e 61 6c 20 66 6c 61 67   Additional flag
4280: 73 20 74 6f 20 70 61 73 73 20 74 6f 20 73 71 6c  s to pass to sql
4290: 69 74 65 33 5f 6f 70 65 6e 5f 76 32 20 2a 2f 0a  ite3_open_v2 */.
42a0: 20 20 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76    int (*xBusy)(v
42b0: 6f 69 64 2a 2c 69 6e 74 29 2c 20 20 20 20 20 20  oid*,int),      
42c0: 20 20 2f 2a 20 42 75 73 79 20 68 61 6e 64 6c 65    /* Busy handle
42d0: 72 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  r callback */.  
42e0: 76 6f 69 64 20 2a 70 42 75 73 79 41 72 67 2c 20  void *pBusyArg, 
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4300: 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 20 66  /* Context arg f
4310: 6f 72 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  or busy handler 
4320: 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70 4c 6f  */.  void **ppLo
4330: 63 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ck              
4340: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 6f 6e       /* OUT: Con
4350: 74 65 78 74 20 74 6f 20 70 61 73 73 20 74 6f 20  text to pass to 
4360: 73 75 70 65 72 75 6e 6c 6f 63 6b 28 29 20 2a 2f  superunlock() */
4370: 0a 29 7b 0a 20 20 53 75 70 65 72 6c 6f 63 6b 42  .){.  SuperlockB
4380: 75 73 79 20 62 75 73 79 20 3d 20 7b 30 2c 20 30  usy busy = {0, 0
4390: 2c 20 30 7d 3b 20 2f 2a 20 42 75 73 79 20 68 61  , 0}; /* Busy ha
43a0: 6e 64 6c 65 72 20 77 72 61 70 70 65 72 20 6f 62  ndler wrapper ob
43b0: 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ject */.  int rc
43c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
43d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
43e0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 53 75  urn code */.  Su
43f0: 70 65 72 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a  perlock *pLock;.
4400: 0a 20 20 70 4c 6f 63 6b 20 3d 20 73 71 6c 69 74  .  pLock = sqlit
4410: 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
4420: 28 53 75 70 65 72 6c 6f 63 6b 29 29 3b 0a 20 20  (Superlock));.  
4430: 69 66 28 20 21 70 4c 6f 63 6b 20 29 20 72 65 74  if( !pLock ) ret
4440: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
4450: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 4c 6f 63 6b  ;.  memset(pLock
4460: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 75 70 65  , 0, sizeof(Supe
4470: 72 6c 6f 63 6b 29 29 3b 0a 0a 20 20 2f 2a 20 4f  rlock));..  /* O
4480: 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 68  pen a database h
4490: 61 6e 64 6c 65 20 6f 6e 20 74 68 65 20 66 69 6c  andle on the fil
44a0: 65 20 74 6f 20 73 75 70 65 72 6c 6f 63 6b 2e 20  e to superlock. 
44b0: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
44c0: 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 20 20 20  3_open_v2(.     
44d0: 20 7a 50 61 74 68 2c 20 26 70 4c 6f 63 6b 2d 3e   zPath, &pLock->
44e0: 64 62 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  db, SQLITE_OPEN_
44f0: 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
4500: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 66 6c 61  _OPEN_CREATE|fla
4510: 67 73 2c 20 7a 56 66 73 0a 20 20 29 3b 0a 0a 20  gs, zVfs.  );.. 
4520: 20 2f 2a 20 49 6e 73 74 61 6c 6c 20 61 20 62 75   /* Install a bu
4530: 73 79 2d 68 61 6e 64 6c 65 72 20 61 6e 64 20 65  sy-handler and e
4540: 78 65 63 75 74 65 20 61 20 42 45 47 49 4e 20 45  xecute a BEGIN E
4550: 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68 69  XCLUSIVE. If thi
4560: 73 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 20  s is not.  ** a 
4570: 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68  WAL database, th
4580: 69 73 20 69 73 20 61 6c 6c 20 77 65 20 6e 65 65  is is all we nee
4590: 64 20 74 6f 20 64 6f 2e 20 20 0a 20 20 2a 2a 0a  d to do.  .  **.
45a0: 20 20 2a 2a 20 41 20 77 72 61 70 70 65 72 20 66    ** A wrapper f
45b0: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
45c0: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  to invoke the bu
45d0: 73 79 2d 68 61 6e 64 6c 65 72 20 69 6e 73 74 65  sy-handler inste
45e0: 61 64 20 6f 66 0a 20 20 2a 2a 20 72 65 67 69 73  ad of.  ** regis
45f0: 74 65 72 69 6e 67 20 74 68 65 20 62 75 73 79 2d  tering the busy-
4600: 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
4610: 20 73 75 70 70 6c 69 65 64 20 62 79 20 74 68 65   supplied by the
4620: 20 75 73 65 72 20 64 69 72 65 63 74 6c 79 0a 20   user directly. 
4630: 20 2a 2a 20 77 69 74 68 20 53 51 4c 69 74 65 2e   ** with SQLite.
4640: 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
4650: 20 74 68 65 20 73 61 6d 65 20 62 75 73 79 2d 68   the same busy-h
4660: 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
4670: 6d 61 79 20 62 65 0a 20 20 2a 2a 20 69 6e 76 6f  may be.  ** invo
4680: 6b 65 64 20 64 69 72 65 63 74 6c 79 20 6c 61 74  ked directly lat
4690: 65 72 20 6f 6e 20 77 68 65 6e 20 61 74 74 65 6d  er on when attem
46a0: 70 74 69 6e 67 20 74 6f 20 6f 62 74 61 69 6e 20  pting to obtain 
46b0: 74 68 65 20 65 78 74 72 61 20 6c 6f 63 6b 73 0a  the extra locks.
46c0: 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 69 6e    ** required in
46d0: 20 57 41 4c 20 6d 6f 64 65 2e 20 42 79 20 75 73   WAL mode. By us
46e0: 69 6e 67 20 74 68 65 20 77 72 61 70 70 65 72 2c  ing the wrapper,
46f0: 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20   we are able to 
4700: 67 75 61 72 61 6e 74 65 65 0a 20 20 2a 2a 20 74  guarantee.  ** t
4710: 68 61 74 20 74 68 65 20 22 6e 42 75 73 79 22 20  hat the "nBusy" 
4720: 69 6e 74 65 67 65 72 20 70 61 72 61 6d 65 74 65  integer paramete
4730: 72 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  r passed to the 
4740: 75 73 65 72 73 20 62 75 73 79 2d 68 61 6e 64 6c  users busy-handl
4750: 65 72 0a 20 20 2a 2a 20 72 65 70 72 65 73 65 6e  er.  ** represen
4760: 74 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  ts the total num
4770: 62 65 72 20 6f 66 20 62 75 73 79 2d 68 61 6e 64  ber of busy-hand
4780: 6c 65 72 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20  ler invocations 
4790: 6d 61 64 65 20 77 69 74 68 69 6e 0a 20 20 2a 2a  made within.  **
47a0: 20 74 68 69 73 20 63 61 6c 6c 20 74 6f 20 73 71   this call to sq
47b0: 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c  lite3demo_superl
47c0: 6f 63 6b 28 29 2c 20 69 6e 63 6c 75 64 69 6e 67  ock(), including
47d0: 20 61 6e 79 20 6d 61 64 65 20 64 75 72 69 6e 67   any made during
47e0: 20 74 68 65 0a 20 20 2a 2a 20 22 42 45 47 49 4e   the.  ** "BEGIN
47f0: 20 45 58 43 4c 55 53 49 56 45 22 2e 0a 20 20 2a   EXCLUSIVE"..  *
4800: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
4810: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 75 73  TE_OK ){.    bus
4820: 79 2e 78 42 75 73 79 20 3d 20 78 42 75 73 79 3b  y.xBusy = xBusy;
4830: 0a 20 20 20 20 62 75 73 79 2e 70 42 75 73 79 41  .    busy.pBusyA
4840: 72 67 20 3d 20 70 42 75 73 79 41 72 67 3b 0a 20  rg = pBusyArg;. 
4850: 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
4860: 68 61 6e 64 6c 65 72 28 70 4c 6f 63 6b 2d 3e 64  handler(pLock->d
4870: 62 2c 20 73 75 70 65 72 6c 6f 63 6b 42 75 73 79  b, superlockBusy
4880: 48 61 6e 64 6c 65 72 2c 20 28 76 6f 69 64 20 2a  Handler, (void *
4890: 29 26 62 75 73 79 29 3b 0a 20 20 20 20 72 63 20  )&busy);.    rc 
48a0: 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
48b0: 4c 6f 63 6b 2d 3e 64 62 2c 20 22 42 45 47 49 4e  Lock->db, "BEGIN
48c0: 20 45 58 43 4c 55 53 49 56 45 22 2c 20 30 2c 20   EXCLUSIVE", 0, 
48d0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  0, 0);.  }..  /*
48e0: 20 49 66 20 74 68 65 20 42 45 47 49 4e 20 45 58   If the BEGIN EX
48f0: 43 4c 55 53 49 56 45 20 77 61 73 20 65 78 65 63  CLUSIVE was exec
4900: 75 74 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  uted successfull
4910: 79 20 61 6e 64 20 74 68 69 73 20 69 73 20 61 20  y and this is a 
4920: 57 41 4c 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  WAL.  ** databas
4930: 65 2c 20 63 61 6c 6c 20 73 75 70 65 72 6c 6f 63  e, call superloc
4940: 6b 57 61 6c 4c 6f 63 6b 28 29 20 74 6f 20 6f 62  kWalLock() to ob
4950: 74 61 69 6e 20 74 68 65 20 65 78 74 72 61 20 6c  tain the extra l
4960: 6f 63 6b 73 20 72 65 71 75 69 72 65 64 0a 20 20  ocks required.  
4970: 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65  ** to prevent re
4980: 61 64 65 72 73 2c 20 77 72 69 74 65 72 73 20 61  aders, writers a
4990: 6e 64 2f 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74  nd/or checkpoint
49a0: 65 72 73 20 66 72 6f 6d 20 61 63 63 65 73 73 69  ers from accessi
49b0: 6e 67 20 74 68 65 0a 20 20 2a 2a 20 64 62 20 77  ng the.  ** db w
49c0: 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
49d0: 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  s is holding the
49e0: 20 73 75 70 65 72 6c 6f 63 6b 2e 0a 20 20 2a 2a   superlock..  **
49f0: 0a 20 20 2a 2a 20 42 65 66 6f 72 65 20 61 74 74  .  ** Before att
4a00: 65 6d 70 74 69 6e 67 20 61 6e 79 20 57 41 4c 20  empting any WAL 
4a10: 6c 6f 63 6b 73 2c 20 63 6f 6d 6d 69 74 20 74 68  locks, commit th
4a20: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  e transaction st
4a30: 61 72 74 65 64 20 61 62 6f 76 65 0a 20 20 2a 2a  arted above.  **
4a40: 20 74 6f 20 64 72 6f 70 20 74 68 65 20 57 41 4c   to drop the WAL
4a50: 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   read and write 
4a60: 6c 6f 63 6b 73 20 63 75 72 72 65 6e 74 6c 79 20  locks currently 
4a70: 68 65 6c 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  held. Otherwise,
4a80: 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 57 41   the.  ** new WA
4a90: 4c 20 6c 6f 63 6b 73 20 6d 61 79 20 63 6f 6e 66  L locks may conf
4aa0: 6c 69 63 74 20 77 69 74 68 20 74 68 65 20 6f 6c  lict with the ol
4ab0: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  d..  */.  if( rc
4ac0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
4ad0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
4ae0: 3d 3d 28 72 63 20 3d 20 73 75 70 65 72 6c 6f 63  ==(rc = superloc
4af0: 6b 49 73 57 61 6c 28 70 4c 6f 63 6b 29 29 20 26  kIsWal(pLock)) &
4b00: 26 20 70 4c 6f 63 6b 2d 3e 62 57 61 6c 20 29 7b  & pLock->bWal ){
4b10: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
4b20: 74 65 33 5f 65 78 65 63 28 70 4c 6f 63 6b 2d 3e  te3_exec(pLock->
4b30: 64 62 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  db, "COMMIT", 0,
4b40: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
4b50: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4b60: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
4b70: 73 75 70 65 72 6c 6f 63 6b 57 61 6c 4c 6f 63 6b  superlockWalLock
4b80: 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20 26 62 75 73  (pLock->db, &bus
4b90: 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  y);.      }.    
4ba0: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  }.  }..  if( rc!
4bb0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4bc0: 20 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75    sqlite3demo_su
4bd0: 70 65 72 75 6e 6c 6f 63 6b 28 70 4c 6f 63 6b 29  perunlock(pLock)
4be0: 3b 0a 20 20 20 20 2a 70 70 4c 6f 63 6b 20 3d 20  ;.    *ppLock = 
4bf0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
4c00: 2a 70 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  *ppLock = pLock;
4c10: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
4c20: 63 3b 0a 7d 0a 0a 2f 2a 20 41 20 63 6f 72 72 75  c;.}../* A corru
4c30: 70 74 20 44 42 20 77 6f 6e 27 74 20 77 6f 72 6b  pt DB won't work
4c40: 20 77 69 74 68 20 74 68 65 20 73 71 6c 2d 62 61   with the sql-ba
4c50: 73 65 64 20 6c 6f 63 6b 69 6e 67 20 61 74 74 65  sed locking atte
4c60: 6d 70 74 2c 20 67 72 61 62 20 61 6e 20 0a 2a 2a  mpt, grab an .**
4c70: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
4c80: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
4c90: 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 42  E_OK or SQLITE_B
4ca0: 55 53 59 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  USY if the lock 
4cb0: 66 61 69 6c 73 20 0a 2a 2a 20 72 65 74 75 72 6e  fails .** return
4cc0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  s the current lo
4cd0: 63 6b 20 6c 65 76 65 6c 20 68 65 6c 64 20 6f 6e  ck level held on
4ce0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2f   sqlite3_file.*/
4cf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
4d00: 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63  te3demo_superloc
4d10: 6b 5f 63 6f 72 72 75 70 74 28 0a 20 20 73 71 6c  k_corrupt(.  sql
4d20: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 0a 20  ite3_file *id,. 
4d30: 20 69 6e 74 20 65 54 61 72 67 65 74 46 69 6c 65   int eTargetFile
4d40: 4c 6f 63 6b 2c 0a 20 20 69 6e 74 20 2a 70 46 69  Lock,.  int *pFi
4d50: 6c 65 4c 6f 63 6b 0a 29 7b 0a 20 20 75 6e 69 78  leLock.){.  unix
4d60: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
4d70: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
4d80: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 70  nt eFileLock = p
4d90: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b  File->eFileLock;
4da0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
4db0: 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20  TE_OK;.  .  if( 
4dc0: 65 46 69 6c 65 4c 6f 63 6b 3c 65 54 61 72 67 65  eFileLock<eTarge
4dd0: 74 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  tFileLock ){.   
4de0: 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65   rc = pFile->pMe
4df0: 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 69 64 2c 20  thod->xLock(id, 
4e00: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52  SQLITE_LOCK_SHAR
4e10: 45 44 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  ED);.  }.  if( !
4e20: 72 63 20 26 26 20 53 51 4c 49 54 45 5f 4c 4f 43  rc && SQLITE_LOC
4e30: 4b 5f 53 48 41 52 45 44 3c 65 54 61 72 67 65 74  K_SHARED<eTarget
4e40: 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
4e50: 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74  rc = pFile->pMet
4e60: 68 6f 64 2d 3e 78 4c 6f 63 6b 28 69 64 2c 20 53  hod->xLock(id, S
4e70: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55  QLITE_LOCK_EXCLU
4e80: 53 49 56 45 29 3b 0a 20 20 7d 0a 20 20 69 66 28  SIVE);.  }.  if(
4e90: 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 70   rc ){.    if( p
4ea0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
4eb0: 3e 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  > eFileLock ){. 
4ec0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74       pFile->pMet
4ed0: 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 69 64 2c  hod->xUnlock(id,
4ee0: 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20   eFileLock);.   
4ef0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
4f00: 3b 0a 20 20 7d 0a 20 20 69 66 20 28 70 46 69 6c  ;.  }.  if (pFil
4f10: 65 4c 6f 63 6b 29 20 7b 0a 20 20 20 20 2a 70 46  eLock) {.    *pF
4f20: 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
4f30: 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ock;.  }.  retur
4f40: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
4f50: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
4f60: 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f  e3demo_superunlo
4f70: 63 6b 5f 63 6f 72 72 75 70 74 28 73 71 6c 69 74  ck_corrupt(sqlit
4f80: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
4f90: 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
4fa0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
4fb0: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
4fc0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
4fd0: 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20  TE_OK;.  .  if( 
4fe0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
4ff0: 20 3e 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a   > eFileLock ){.
5000: 20 20 20 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e      rc = pFile->
5010: 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b  pMethod->xUnlock
5020: 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  (id, SQLITE_LOCK
5030: 5f 53 48 41 52 45 44 29 3b 0a 20 20 7d 0a 20 20  _SHARED);.  }.  
5040: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
5050: 4c 6f 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63 6b  Lock > eFileLock
5060: 20 29 7b 0a 20 20 20 20 69 6e 74 20 75 6e 6c 6f   ){.    int unlo
5070: 63 6b 52 43 20 3d 20 70 46 69 6c 65 2d 3e 70 4d  ckRC = pFile->pM
5080: 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 69  ethod->xUnlock(i
5090: 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 4e  d, SQLITE_LOCK_N
50a0: 4f 4e 45 29 3b 0a 20 20 20 20 69 66 20 28 21 72  ONE);.    if (!r
50b0: 63 29 20 72 63 20 3d 20 75 6e 6c 6f 63 6b 52 43  c) rc = unlockRC
50c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
50d0: 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  c;.}..#endif /* 
50e0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 55  SQLITE_ENABLE_SU
50f0: 50 45 52 4c 4f 43 4b 20 2a 2f 0a 0a 0a 2f 2a 0a  PERLOCK */.../*.
5100: 2a 2a 20 48 41 56 45 5f 4d 52 45 4d 41 50 20 64  ** HAVE_MREMAP d
5110: 65 66 61 75 6c 74 73 20 74 6f 20 74 72 75 65 20  efaults to true 
5120: 6f 6e 20 4c 69 6e 75 78 20 61 6e 64 20 66 61 6c  on Linux and fal
5130: 73 65 20 65 76 65 72 79 77 68 65 72 65 20 65 6c  se everywhere el
5140: 73 65 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  se..*/.#if !defi
5150: 6e 65 64 28 48 41 56 45 5f 4d 52 45 4d 41 50 29  ned(HAVE_MREMAP)
5160: 0a 23 20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  .# if defined(__
5170: 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64 65 66 69  linux__) && defi
5180: 6e 65 64 28 5f 47 4e 55 5f 53 4f 55 52 43 45 29  ned(_GNU_SOURCE)
5190: 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56 45 5f  .#  define HAVE_
51a0: 4d 52 45 4d 41 50 20 31 0a 23 20 65 6c 73 65 0a  MREMAP 1.# else.
51b0: 23 20 20 64 65 66 69 6e 65 20 48 41 56 45 5f 4d  #  define HAVE_M
51c0: 52 45 4d 41 50 20 30 0a 23 20 65 6e 64 69 66 0a  REMAP 0.# endif.
51d0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78  #endif../*.** Ex
51e0: 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c 20 74 68  plicitly call th
51f0: 65 20 36 34 2d 62 69 74 20 76 65 72 73 69 6f 6e  e 64-bit version
5200: 20 6f 66 20 6c 73 65 65 6b 28 29 20 6f 6e 20 41   of lseek() on A
5210: 6e 64 72 6f 69 64 2e 20 4f 74 68 65 72 77 69 73  ndroid. Otherwis
5220: 65 2c 20 6c 73 65 65 6b 28 29 0a 2a 2a 20 69 73  e, lseek().** is
5230: 20 74 68 65 20 33 32 2d 62 69 74 20 76 65 72 73   the 32-bit vers
5240: 69 6f 6e 2c 20 65 76 65 6e 20 69 66 20 5f 46 49  ion, even if _FI
5250: 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 3d 36  LE_OFFSET_BITS=6
5260: 34 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  4 is defined..*/
5270: 0a 23 69 66 64 65 66 20 5f 5f 41 4e 44 52 4f 49  .#ifdef __ANDROI
5280: 44 5f 5f 0a 23 20 64 65 66 69 6e 65 20 6c 73 65  D__.# define lse
5290: 65 6b 20 6c 73 65 65 6b 36 34 0a 23 65 6e 64 69  ek lseek64.#endi
52a0: 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 66 66 65 72 65  f../*.** Differe
52b0: 6e 74 20 55 6e 69 78 20 73 79 73 74 65 6d 73 20  nt Unix systems 
52c0: 64 65 63 6c 61 72 65 20 6f 70 65 6e 28 29 20 69  declare open() i
52d0: 6e 20 64 69 66 66 65 72 65 6e 74 20 77 61 79 73  n different ways
52e0: 2e 20 20 53 61 6d 65 20 75 73 65 0a 2a 2a 20 6f  .  Same use.** o
52f0: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  pen(const char*,
5300: 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e 20 20 4f 74  int,mode_t).  Ot
5310: 68 65 72 73 20 75 73 65 20 6f 70 65 6e 28 63 6f  hers use open(co
5320: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 2e 2e  nst char*,int,..
5330: 2e 29 2e 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .)..** The diffe
5340: 72 65 6e 63 65 20 69 73 20 69 6d 70 6f 72 74 61  rence is importa
5350: 6e 74 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20  nt when using a 
5360: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66  pointer to the f
5370: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  unction..**.** T
5380: 68 65 20 73 61 66 65 73 74 20 77 61 79 20 74 6f  he safest way to
5390: 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 70   deal with the p
53a0: 72 6f 62 6c 65 6d 20 69 73 20 74 6f 20 61 6c 77  roblem is to alw
53b0: 61 79 73 20 75 73 65 20 74 68 69 73 20 77 72 61  ays use this wra
53c0: 70 70 65 72 0a 2a 2a 20 77 68 69 63 68 20 61 6c  pper.** which al
53d0: 77 61 79 73 20 68 61 73 20 74 68 65 20 73 61 6d  ways has the sam
53e0: 65 20 77 65 6c 6c 2d 64 65 66 69 6e 65 64 20 69  e well-defined i
53f0: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61  nterface..*/.sta
5400: 74 69 63 20 69 6e 74 20 70 6f 73 69 78 4f 70 65  tic int posixOpe
5410: 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  n(const char *zF
5420: 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20  ile, int flags, 
5430: 69 6e 74 20 6d 6f 64 65 29 7b 0a 20 20 72 65 74  int mode){.  ret
5440: 75 72 6e 20 6f 70 65 6e 28 7a 46 69 6c 65 2c 20  urn open(zFile, 
5450: 66 6c 61 67 73 2c 20 6d 6f 64 65 29 3b 0a 7d 0a  flags, mode);.}.
5460: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
5470: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
5480: 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72  int openDirector
5490: 79 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69  y(const char*, i
54a0: 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  nt*);.static int
54b0: 20 75 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65   unixGetpagesize
54c0: 28 76 6f 69 64 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d  (void);../*.** M
54d0: 61 6e 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  any system calls
54e0: 20 61 72 65 20 61 63 63 65 73 73 65 64 20 74 68   are accessed th
54f0: 72 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f  rough pointer-to
5500: 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68  -functions so th
5510: 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 62  at.** they may b
5520: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20  e overridden at 
5530: 72 75 6e 74 69 6d 65 20 74 6f 20 66 61 63 69 6c  runtime to facil
5540: 69 74 61 74 65 20 66 61 75 6c 74 20 69 6e 6a 65  itate fault inje
5550: 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20  ction during.** 
5560: 74 65 73 74 69 6e 67 20 61 6e 64 20 73 61 6e 64  testing and sand
5570: 62 6f 78 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c  boxing.  The fol
5580: 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c  lowing array hol
5590: 64 73 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64  ds the names and
55a0: 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20   pointers.** to 
55b0: 61 6c 6c 20 6f 76 65 72 72 69 64 65 61 62 6c 65  all overrideable
55c0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a   system calls..*
55d0: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
55e0: 75 6e 69 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20  unix_syscall {. 
55f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
5600: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
5610: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79  * Name of the sy
5620: 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73  stem call */.  s
5630: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
5640: 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20  tr pCurrent; /* 
5650: 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  Current value of
5660: 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   the system call
5670: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
5680: 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 75  scall_ptr pDefau
5690: 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 76  lt; /* Default v
56a0: 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61  alue */.} aSysca
56b0: 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70  ll[] = {.  { "op
56c0: 65 6e 22 2c 20 20 20 20 20 20 20 20 20 28 73 71  en",         (sq
56d0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
56e0: 72 29 70 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20  r)posixOpen,  0 
56f0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70   },.#define osOp
5700: 65 6e 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29  en      ((int(*)
5710: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
5720: 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 30  ,int))aSyscall[0
5730: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5740: 20 22 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20   "close",       
5750: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
5760: 6c 5f 70 74 72 29 63 6c 6f 73 65 2c 20 20 20 20  l_ptr)close,    
5770: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
5780: 6f 73 43 6c 6f 73 65 20 20 20 20 20 28 28 69 6e  osClose     ((in
5790: 74 28 2a 29 28 69 6e 74 29 29 61 53 79 73 63 61  t(*)(int))aSysca
57a0: 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[1].pCurrent).
57b0: 0a 20 20 7b 20 22 61 63 63 65 73 73 22 2c 20 20  .  { "access",  
57c0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
57d0: 73 63 61 6c 6c 5f 70 74 72 29 61 63 63 65 73 73  scall_ptr)access
57e0: 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66  ,     0  },.#def
57f0: 69 6e 65 20 6f 73 41 63 63 65 73 73 20 20 20 20  ine osAccess    
5800: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
5810: 68 61 72 2a 2c 69 6e 74 29 29 61 53 79 73 63 61  har*,int))aSysca
5820: 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[2].pCurrent).
5830: 0a 20 20 7b 20 22 67 65 74 63 77 64 22 2c 20 20  .  { "getcwd",  
5840: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
5850: 73 63 61 6c 6c 5f 70 74 72 29 67 65 74 63 77 64  scall_ptr)getcwd
5860: 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66  ,     0  },.#def
5870: 69 6e 65 20 6f 73 47 65 74 63 77 64 20 20 20 20  ine osGetcwd    
5880: 28 28 63 68 61 72 2a 28 2a 29 28 63 68 61 72 2a  ((char*(*)(char*
5890: 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c  ,size_t))aSyscal
58a0: 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[3].pCurrent)..
58b0: 20 20 7b 20 22 73 74 61 74 22 2c 20 20 20 20 20    { "stat",     
58c0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
58d0: 63 61 6c 6c 5f 70 74 72 29 73 74 61 74 2c 20 20  call_ptr)stat,  
58e0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
58f0: 6e 65 20 6f 73 53 74 61 74 20 20 20 20 20 20 28  ne osStat      (
5900: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
5910: 61 72 2a 2c 73 74 72 75 63 74 20 73 74 61 74 2a  ar*,struct stat*
5920: 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43  ))aSyscall[4].pC
5930: 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54  urrent)../*.** T
5940: 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65  he DJGPP compile
5950: 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f  r environment lo
5960: 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20  oks mostly like 
5970: 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20  Unix, but it.** 
5980: 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28  lacks the fcntl(
5990: 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20  ) system call.  
59a0: 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74  So redefine fcnt
59b0: 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68  l() to be someth
59c0: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61  ing.** that alwa
59d0: 79 73 20 73 75 63 63 65 65 64 73 2e 20 20 54 68  ys succeeds.  Th
59e0: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f  is means that lo
59f0: 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f  cking does not o
5a00: 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a  ccur under.** DJ
5a10: 47 50 50 2e 20 20 42 75 74 20 69 74 20 69 73 20  GPP.  But it is 
5a20: 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20 79  DOS - what did y
5a30: 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69  ou expect?.*/.#i
5a40: 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20  fdef __DJGPP__. 
5a50: 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20 20   { "fstat",     
5a60: 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
5a70: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
5a80: 69 6e 65 20 6f 73 46 73 74 61 74 28 61 2c 62 2c  ine osFstat(a,b,
5a90: 63 29 20 20 20 20 30 0a 23 65 6c 73 65 20 20 20  c)    0.#else   
5aa0: 20 20 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20    .  { "fstat", 
5ab0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
5ac0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 73 74 61  syscall_ptr)fsta
5ad0: 74 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  t,      0  },.#d
5ae0: 65 66 69 6e 65 20 6f 73 46 73 74 61 74 20 20 20  efine osFstat   
5af0: 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73    ((int(*)(int,s
5b00: 74 72 75 63 74 20 73 74 61 74 2a 29 29 61 53 79  truct stat*))aSy
5b10: 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e  scall[5].pCurren
5b20: 74 29 0a 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22  t).#endif..  { "
5b30: 66 74 72 75 6e 63 61 74 65 22 2c 20 20 20 20 28  ftruncate",    (
5b40: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5b50: 70 74 72 29 66 74 72 75 6e 63 61 74 65 2c 20 20  ptr)ftruncate,  
5b60: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
5b70: 46 74 72 75 6e 63 61 74 65 20 28 28 69 6e 74 28  Ftruncate ((int(
5b80: 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53  *)(int,off_t))aS
5b90: 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65  yscall[6].pCurre
5ba0: 6e 74 29 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22  nt)..  { "fcntl"
5bb0: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
5bc0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63  3_syscall_ptr)fc
5bd0: 6e 74 6c 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  ntl,      0  },.
5be0: 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20  #define osFcntl 
5bf0: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
5c00: 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61  ,int,...))aSysca
5c10: 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[7].pCurrent).
5c20: 0a 20 20 7b 20 22 72 65 61 64 22 2c 20 20 20 20  .  { "read",    
5c30: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
5c40: 73 63 61 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20  scall_ptr)read, 
5c50: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
5c60: 69 6e 65 20 6f 73 52 65 61 64 20 20 20 20 20 20  ine osRead      
5c70: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
5c80: 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61  ,void*,size_t))a
5c90: 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72  Syscall[8].pCurr
5ca0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
5cb0: 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20  d(USE_PREAD) || 
5cc0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
5cd0: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20  CKING_STYLE.  { 
5ce0: 22 70 72 65 61 64 22 2c 20 20 20 20 20 20 20 20  "pread",        
5cf0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
5d00: 5f 70 74 72 29 70 72 65 61 64 2c 20 20 20 20 20  _ptr)pread,     
5d10: 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b   0  },.#else.  {
5d20: 20 22 70 72 65 61 64 22 2c 20 20 20 20 20 20 20   "pread",       
5d30: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
5d40: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
5d50: 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23    0  },.#endif.#
5d60: 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64 20 20  define osPread  
5d70: 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28     ((ssize_t(*)(
5d80: 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  int,void*,size_t
5d90: 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,off_t))aSyscall
5da0: 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [9].pCurrent)..#
5db0: 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
5dc0: 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70 72 65  READ64).  { "pre
5dd0: 61 64 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c  ad64",      (sql
5de0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
5df0: 29 70 72 65 61 64 36 34 2c 20 20 20 20 30 20 20  )pread64,    0  
5e00: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 72  },.#else.  { "pr
5e10: 65 61 64 36 34 22 2c 20 20 20 20 20 20 28 73 71  ead64",      (sq
5e20: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5e30: 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20  r)0,          0 
5e40: 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69   },.#endif.#defi
5e50: 6e 65 20 6f 73 50 72 65 61 64 36 34 20 28 28 73  ne osPread64 ((s
5e60: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f  size_t(*)(int,vo
5e70: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 36 34  id*,size_t,off64
5e80: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d  _t))aSyscall[10]
5e90: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
5ea0: 22 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 20  "write",        
5eb0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
5ec0: 5f 70 74 72 29 77 72 69 74 65 2c 20 20 20 20 20  _ptr)write,     
5ed0: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
5ee0: 73 57 72 69 74 65 20 20 20 20 20 28 28 73 73 69  sWrite     ((ssi
5ef0: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73  ze_t(*)(int,cons
5f00: 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29  t void*,size_t))
5f10: 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75  aSyscall[11].pCu
5f20: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
5f30: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c  ned(USE_PREAD) |
5f40: 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
5f50: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
5f60: 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20 20 20  { "pwrite",     
5f70: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
5f80: 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 2c 20 20  ll_ptr)pwrite,  
5f90: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
5fa0: 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20 20   { "pwrite",    
5fb0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
5fc0: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
5fd0: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
5fe0: 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74  .#define osPwrit
5ff0: 65 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a  e    ((ssize_t(*
6000: 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  )(int,const void
6010: 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29  *,size_t,off_t))
6020: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
6030: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 31        aSyscall[1
6040: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  2].pCurrent)..#i
6050: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
6060: 45 41 44 36 34 29 0a 20 20 7b 20 22 70 77 72 69  EAD64).  { "pwri
6070: 74 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69  te64",     (sqli
6080: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
6090: 70 77 72 69 74 65 36 34 2c 20 20 20 30 20 20 7d  pwrite64,   0  }
60a0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72  ,.#else.  { "pwr
60b0: 69 74 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c  ite64",     (sql
60c0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
60d0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20  )0,          0  
60e0: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
60f0: 65 20 6f 73 50 77 72 69 74 65 36 34 20 20 28 28  e osPwrite64  ((
6100: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63  ssize_t(*)(int,c
6110: 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f  onst void*,size_
6120: 74 2c 6f 66 66 36 34 5f 74 29 29 5c 0a 20 20 20  t,off64_t))\.   
6130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6140: 20 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43   aSyscall[13].pC
6150: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63  urrent)..  { "fc
6160: 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73 71  hmod",       (sq
6170: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
6180: 72 29 66 63 68 6d 6f 64 2c 20 20 20 20 20 20 20  r)fchmod,       
6190: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
61a0: 20 6f 73 46 63 68 6d 6f 64 20 20 20 20 28 28 69   osFchmod    ((i
61b0: 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f 74  nt(*)(int,mode_t
61c0: 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70  ))aSyscall[14].p
61d0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
61e0: 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58  fined(HAVE_POSIX
61f0: 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48  _FALLOCATE) && H
6200: 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43  AVE_POSIX_FALLOC
6210: 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61  ATE.  { "falloca
6220: 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33  te",    (sqlite3
6230: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73  _syscall_ptr)pos
6240: 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c 20 20 30  ix_fallocate,  0
6250: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66   },.#else.  { "f
6260: 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73  allocate",    (s
6270: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
6280: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  tr)0,           
6290: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
62a0: 0a 23 64 65 66 69 6e 65 20 6f 73 46 61 6c 6c 6f  .#define osFallo
62b0: 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28 69 6e  cate ((int(*)(in
62c0: 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74 29 29 61  t,off_t,off_t))a
62d0: 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72  Syscall[15].pCur
62e0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 75 6e 6c 69  rent)..  { "unli
62f0: 6e 6b 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  nk",       (sqli
6300: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
6310: 75 6e 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20 20  unlink,         
6320: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
6330: 73 55 6e 6c 69 6e 6b 20 20 20 20 28 28 69 6e 74  sUnlink    ((int
6340: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  (*)(const char*)
6350: 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e 70 43  )aSyscall[16].pC
6360: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6f 70  urrent)..  { "op
6370: 65 6e 44 69 72 65 63 74 6f 72 79 22 2c 20 20 20  enDirectory",   
6380: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
6390: 6c 5f 70 74 72 29 6f 70 65 6e 44 69 72 65 63 74  l_ptr)openDirect
63a0: 6f 72 79 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  ory,      0 },.#
63b0: 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 44 69 72  define osOpenDir
63c0: 65 63 74 6f 72 79 20 28 28 69 6e 74 28 2a 29 28  ectory ((int(*)(
63d0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2a  const char*,int*
63e0: 29 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70  ))aSyscall[17].p
63f0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6d  Current)..  { "m
6400: 6b 64 69 72 22 2c 20 20 20 20 20 20 20 20 28 73  kdir",        (s
6410: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
6420: 74 72 29 6d 6b 64 69 72 2c 20 20 20 20 20 20 20  tr)mkdir,       
6430: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
6440: 20 6f 73 4d 6b 64 69 72 20 20 20 20 20 28 28 69   osMkdir     ((i
6450: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
6460: 2a 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61  *,mode_t))aSysca
6470: 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74 29  ll[18].pCurrent)
6480: 0a 0a 20 20 7b 20 22 72 6d 64 69 72 22 2c 20 20  ..  { "rmdir",  
6490: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
64a0: 79 73 63 61 6c 6c 5f 70 74 72 29 72 6d 64 69 72  yscall_ptr)rmdir
64b0: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
64c0: 0a 23 64 65 66 69 6e 65 20 6f 73 52 6d 64 69 72  .#define osRmdir
64d0: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
64e0: 6e 73 74 20 63 68 61 72 2a 29 29 61 53 79 73 63  nst char*))aSysc
64f0: 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74  all[19].pCurrent
6500: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  )..#if defined(H
6510: 41 56 45 5f 46 43 48 4f 57 4e 29 0a 20 20 7b 20  AVE_FCHOWN).  { 
6520: 22 66 63 68 6f 77 6e 22 2c 20 20 20 20 20 20 20  "fchown",       
6530: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
6540: 5f 70 74 72 29 66 63 68 6f 77 6e 2c 20 20 20 20  _ptr)fchown,    
6550: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
6560: 0a 20 20 7b 20 22 66 63 68 6f 77 6e 22 2c 20 20  .  { "fchown",  
6570: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
6580: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
6590: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
65a0: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
65b0: 73 46 63 68 6f 77 6e 20 20 20 20 28 28 69 6e 74  sFchown    ((int
65c0: 28 2a 29 28 69 6e 74 2c 75 69 64 5f 74 2c 67 69  (*)(int,uid_t,gi
65d0: 64 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 30  d_t))aSyscall[20
65e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
65f0: 20 22 67 65 74 65 75 69 64 22 2c 20 20 20 20 20   "geteuid",     
6600: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
6610: 6c 5f 70 74 72 29 67 65 74 65 75 69 64 2c 20 20  l_ptr)geteuid,  
6620: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66         0 },.#def
6630: 69 6e 65 20 6f 73 47 65 74 65 75 69 64 20 20 20  ine osGeteuid   
6640: 28 28 75 69 64 5f 74 28 2a 29 28 76 6f 69 64 29  ((uid_t(*)(void)
6650: 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43  )aSyscall[21].pC
6660: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65  urrent)..#if !de
6670: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6680: 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45  T_WAL) || SQLITE
6690: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
66a0: 0a 20 20 7b 20 22 6d 6d 61 70 22 2c 20 20 20 20  .  { "mmap",    
66b0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
66c0: 73 63 61 6c 6c 5f 70 74 72 29 6d 6d 61 70 2c 20  scall_ptr)mmap, 
66d0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
66e0: 23 65 6c 73 65 0a 20 20 7b 20 22 6d 6d 61 70 22  #else.  { "mmap"
66f0: 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ,         (sqlit
6700: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
6710: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6720: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66  0 },.#endif.#def
6730: 69 6e 65 20 6f 73 4d 6d 61 70 20 28 28 76 6f 69  ine osMmap ((voi
6740: 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65  d*(*)(void*,size
6750: 5f 74 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74 2c 6f  _t,int,int,int,o
6760: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32  ff_t))aSyscall[2
6770: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  2].pCurrent)..#i
6780: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
6790: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
67a0: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
67b0: 49 5a 45 3e 30 0a 20 20 7b 20 22 6d 75 6e 6d 61  IZE>0.  { "munma
67c0: 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  p",       (sqlit
67d0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d  e3_syscall_ptr)m
67e0: 75 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20  unmap,          
67f0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6800: 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20 20 20 28  munmap",       (
6810: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
6820: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
6830: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6840: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75 6e 6d 61  .#define osMunma
6850: 70 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69  p ((void*(*)(voi
6860: 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63  d*,size_t))aSysc
6870: 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65 6e 74  all[23].pCurrent
6880: 29 0a 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d  )..#if HAVE_MREM
6890: 41 50 20 26 26 20 28 21 64 65 66 69 6e 65 64 28  AP && (!defined(
68a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
68b0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
68c0: 4d 41 50 5f 53 49 5a 45 3e 30 29 0a 20 20 7b 20  MAP_SIZE>0).  { 
68d0: 22 6d 72 65 6d 61 70 22 2c 20 20 20 20 20 20 20  "mremap",       
68e0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
68f0: 5f 70 74 72 29 6d 72 65 6d 61 70 2c 20 20 20 20  _ptr)mremap,    
6900: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
6910: 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20  .  { "mremap",  
6920: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
6930: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
6940: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6950: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
6960: 73 4d 72 65 6d 61 70 20 28 28 76 6f 69 64 2a 28  sMremap ((void*(
6970: 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  *)(void*,size_t,
6980: 73 69 7a 65 5f 74 2c 69 6e 74 2c 2e 2e 2e 29 29  size_t,int,...))
6990: 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75  aSyscall[24].pCu
69a0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66  rrent)..#if !def
69b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
69c0: 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f  _WAL) || SQLITE_
69d0: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
69e0: 20 20 7b 20 22 67 65 74 70 61 67 65 73 69 7a 65    { "getpagesize
69f0: 22 2c 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73  ",  (sqlite3_sys
6a00: 63 61 6c 6c 5f 70 74 72 29 75 6e 69 78 47 65 74  call_ptr)unixGet
6a10: 70 61 67 65 73 69 7a 65 2c 20 30 20 7d 2c 0a 23  pagesize, 0 },.#
6a20: 65 6c 73 65 0a 20 20 7b 20 22 67 65 74 70 61 67  else.  { "getpag
6a30: 65 73 69 7a 65 22 2c 20 20 28 73 71 6c 69 74 65  esize",  (sqlite
6a40: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
6a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6a60: 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69   },.#endif.#defi
6a70: 6e 65 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65  ne osGetpagesize
6a80: 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 29 29   ((int(*)(void))
6a90: 61 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75  aSyscall[25].pCu
6aa0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
6ab0: 6e 65 64 28 48 41 56 45 5f 52 45 41 44 4c 49 4e  ned(HAVE_READLIN
6ac0: 4b 29 0a 20 20 7b 20 22 72 65 61 64 6c 69 6e 6b  K).  { "readlink
6ad0: 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f  ",     (sqlite3_
6ae0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65 61 64  syscall_ptr)read
6af0: 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20 30 20 7d  link,        0 }
6b00: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 72 65 61  ,.#else.  { "rea
6b10: 64 6c 69 6e 6b 22 2c 20 20 20 20 20 28 73 71 6c  dlink",     (sql
6b20: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
6b30: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6b40: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64    0 },.#endif.#d
6b50: 65 66 69 6e 65 20 6f 73 52 65 61 64 6c 69 6e 6b  efine osReadlink
6b60: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 63 6f   ((ssize_t(*)(co
6b70: 6e 73 74 20 63 68 61 72 2a 2c 63 68 61 72 2a 2c  nst char*,char*,
6b80: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
6b90: 5b 32 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [26].pCurrent)..
6ba0: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
6bb0: 5f 4c 53 54 41 54 29 0a 20 20 7b 20 22 6c 73 74  _LSTAT).  { "lst
6bc0: 61 74 22 2c 20 20 20 20 20 20 20 20 20 28 73 71  at",         (sq
6bd0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
6be0: 72 29 6c 73 74 61 74 2c 20 20 20 20 20 20 20 20  r)lstat,        
6bf0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6c00: 20 22 6c 73 74 61 74 22 2c 20 20 20 20 20 20 20   "lstat",       
6c10: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
6c20: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
6c30: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6c40: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 4c 73 74  if.#define osLst
6c50: 61 74 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29  at      ((int(*)
6c60: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74 72  (const char*,str
6c70: 75 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63  uct stat*))aSysc
6c80: 61 6c 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74  all[27].pCurrent
6c90: 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20  )..}; /* End of 
6ca0: 74 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65  the overrideable
6cb0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f   system calls */
6cc0: 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65  .../*.** On some
6cd0: 20 73 79 73 74 65 6d 73 2c 20 63 61 6c 6c 73 20   systems, calls 
6ce0: 74 6f 20 66 63 68 6f 77 6e 28 29 20 77 69 6c 6c  to fchown() will
6cf0: 20 74 72 69 67 67 65 72 20 61 20 6d 65 73 73 61   trigger a messa
6d00: 67 65 20 69 6e 20 61 20 73 65 63 75 72 69 74 79  ge in a security
6d10: 0a 2a 2a 20 6c 6f 67 20 69 66 20 74 68 65 79 20  .** log if they 
6d20: 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f 6e 2d 72 6f  come from non-ro
6d30: 6f 74 20 70 72 6f 63 65 73 73 65 73 2e 20 20 53  ot processes.  S
6d40: 6f 20 61 76 6f 69 64 20 63 61 6c 6c 69 6e 67 20  o avoid calling 
6d50: 66 63 68 6f 77 6e 28 29 20 69 66 0a 2a 2a 20 77  fchown() if.** w
6d60: 65 20 61 72 65 20 6e 6f 74 20 72 75 6e 6e 69 6e  e are not runnin
6d70: 67 20 61 73 20 72 6f 6f 74 2e 0a 2a 2f 0a 73 74  g as root..*/.st
6d80: 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 46  atic int robustF
6d90: 63 68 6f 77 6e 28 69 6e 74 20 66 64 2c 20 75 69  chown(int fd, ui
6da0: 64 5f 74 20 75 69 64 2c 20 67 69 64 5f 74 20 67  d_t uid, gid_t g
6db0: 69 64 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  id){.#if defined
6dc0: 28 48 41 56 45 5f 46 43 48 4f 57 4e 29 0a 20 20  (HAVE_FCHOWN).  
6dd0: 72 65 74 75 72 6e 20 6f 73 47 65 74 65 75 69 64  return osGeteuid
6de0: 28 29 20 3f 20 30 20 3a 20 6f 73 46 63 68 6f 77  () ? 0 : osFchow
6df0: 6e 28 66 64 2c 75 69 64 2c 67 69 64 29 3b 0a 23  n(fd,uid,gid);.#
6e00: 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30 3b  else.  return 0;
6e10: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
6e20: 20 54 68 69 73 20 69 73 20 74 68 65 20 78 53 65   This is the xSe
6e30: 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65  tSystemCall() me
6e40: 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f  thod of sqlite3_
6e50: 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74  vfs for all of t
6e60: 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46 53  he.** "unix" VFS
6e70: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
6e80: 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65  TE_OK opon succe
6e90: 73 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67  ssfully updating
6ea0: 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63   the.** system c
6eb0: 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20  all pointer, or 
6ec0: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
6ed0: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  if there is no c
6ee0: 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73  onfigurable.** s
6ef0: 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64  ystem call named
6f00: 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69   zName..*/.stati
6f10: 63 20 69 6e 74 20 75 6e 69 78 53 65 74 53 79 73  c int unixSetSys
6f20: 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74  temCall(.  sqlit
6f30: 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64  e3_vfs *pNotUsed
6f40: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
6f50: 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f  VFS pointer.  No
6f60: 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  t used */.  cons
6f70: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
6f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
6f90: 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c  e of system call
6fa0: 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a   to override */.
6fb0: 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c    sqlite3_syscal
6fc0: 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20  l_ptr pNewFunc  
6fd0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  /* Pointer to ne
6fe0: 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61  w system call va
6ff0: 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  lue */.){.  unsi
7000: 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e  gned int i;.  in
7010: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  t rc = SQLITE_NO
7020: 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45  TFOUND;..  UNUSE
7030: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74  D_PARAMETER(pNot
7040: 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Used);.  if( zNa
7050: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  me==0 ){.    /* 
7060: 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67  If no zName is g
7070: 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c  iven, restore al
7080: 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74  l system calls t
7090: 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a  o their default.
70a0: 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20      ** settings 
70b0: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a  and return NULL.
70c0: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
70d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66  SQLITE_OK;.    f
70e0: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
70f0: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
7100: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
7110: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
7120: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
7130: 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ault ){.        
7140: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
7150: 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b  rent = aSyscall[
7160: 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20  i].pDefault;.   
7170: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
7180: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e  se{.    /* If zN
7190: 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
71a0: 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c  , operate on onl
71b0: 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d  y the one system
71c0: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65   call.    ** spe
71d0: 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  cified..    */. 
71e0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
71f0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
7200: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
7210: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
7220: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
7230: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
7240: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
7250: 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b     if( aSyscall[
7260: 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29  i].pDefault==0 )
7270: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53 79 73  {.          aSys
7280: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
7290: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
72a0: 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20  Current;.       
72b0: 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
72c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
72d0: 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d     if( pNewFunc=
72e0: 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20  =0 ) pNewFunc = 
72f0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
7300: 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53  ault;.        aS
7310: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
7320: 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20  nt = pNewFunc;. 
7330: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7340: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7350: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7360: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
7370: 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74   value of a syst
7380: 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e  em call.  Return
7390: 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69   NULL if zName i
73a0: 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67  s not a.** recog
73b0: 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c  nized system cal
73c0: 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73  l name.  NULL is
73d0: 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
73e0: 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c  f the system cal
73f0: 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c  l.** is currentl
7400: 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  y undefined..*/.
7410: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73  static sqlite3_s
7420: 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47  yscall_ptr unixG
7430: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20  etSystemCall(.  
7440: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f  sqlite3_vfs *pNo
7450: 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63  tUsed,.  const c
7460: 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20  har *zName.){.  
7470: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
7480: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
7490: 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20  TER(pNotUsed);. 
74a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
74b0: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
74c0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
74d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
74e0: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
74f0: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
7500: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79  ==0 ) return aSy
7510: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
7520: 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
7530: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
7540: 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
7550: 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20  he first system 
7560: 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65  call after zName
7570: 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c  .  If zName==NUL
7580: 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e  L.** then return
7590: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
75a0: 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61   first system ca
75b0: 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ll.  Return NULL
75c0: 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20   if zName.** is 
75d0: 74 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d 20  the last system 
75e0: 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65  call or if zName
75f0: 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65   is not the name
7600: 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73   of a valid.** s
7610: 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73  ystem call..*/.s
7620: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
7630: 20 2a 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d   *unixNextSystem
7640: 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73  Call(sqlite3_vfs
7650: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
7660: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
7670: 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44   = -1;..  UNUSED
7680: 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20  _PARAMETER(p);. 
7690: 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
76a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
76b0: 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29  aySize(aSyscall)
76c0: 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  -1; i++){.      
76d0: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
76e0: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
76f0: 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
7700: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
7710: 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i++; i<ArraySiz
7720: 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b  e(aSyscall); i++
7730: 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73 63  ){.    if( aSysc
7740: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21  all[i].pCurrent!
7750: 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73  =0 ) return aSys
7760: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  call[i].zName;. 
7770: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
7780: 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61  ../*.** Do not a
7790: 63 63 65 70 74 20 61 6e 79 20 66 69 6c 65 20 64  ccept any file d
77a0: 65 73 63 72 69 70 74 6f 72 20 6c 65 73 73 20 74  escriptor less t
77b0: 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20  han this value, 
77c0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
77d0: 64 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 64 61 74  d.** opening dat
77e0: 61 62 61 73 65 20 66 69 6c 65 20 75 73 69 6e 67  abase file using
77f0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
7800: 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f  s that are commo
7810: 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 0a 2a 2a  nly used for .**
7820: 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2c   standard input,
7830: 20 6f 75 74 70 75 74 2c 20 61 6e 64 20 65 72 72   output, and err
7840: 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  or..*/.#ifndef S
7850: 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49  QLITE_MINIMUM_FI
7860: 4c 45 5f 44 45 53 43 52 49 50 54 4f 52 0a 23 20  LE_DESCRIPTOR.# 
7870: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 49  define SQLITE_MI
7880: 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52  NIMUM_FILE_DESCR
7890: 49 50 54 4f 52 20 33 0a 23 65 6e 64 69 66 0a 0a  IPTOR 3.#endif..
78a0: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70 65  /*.** Invoke ope
78b0: 6e 28 29 2e 20 20 44 6f 20 73 6f 20 6d 75 6c 74  n().  Do so mult
78c0: 69 70 6c 65 20 74 69 6d 65 73 2c 20 75 6e 74 69  iple times, unti
78d0: 6c 20 69 74 20 65 69 74 68 65 72 20 73 75 63 63  l it either succ
78e0: 65 65 64 73 20 6f 72 0a 2a 2a 20 66 61 69 6c 73  eeds or.** fails
78f0: 20 66 6f 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e   for some reason
7900: 20 6f 74 68 65 72 20 74 68 61 6e 20 45 49 4e 54   other than EINT
7910: 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  R..**.** If the 
7920: 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f  file creation mo
7930: 64 65 20 22 6d 22 20 69 73 20 30 20 74 68 65 6e  de "m" is 0 then
7940: 20 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 64   set it to the d
7950: 65 66 61 75 6c 74 20 66 6f 72 0a 2a 2a 20 53 51  efault for.** SQ
7960: 4c 69 74 65 2e 20 20 54 68 65 20 64 65 66 61 75  Lite.  The defau
7970: 6c 74 20 69 73 20 53 51 4c 49 54 45 5f 44 45 46  lt is SQLITE_DEF
7980: 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
7990: 53 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a  SIONS (normally.
79a0: 2a 2a 20 30 36 34 34 29 20 61 73 20 6d 6f 64 69  ** 0644) as modi
79b0: 66 69 65 64 20 62 79 20 74 68 65 20 73 79 73 74  fied by the syst
79c0: 65 6d 20 75 6d 61 73 6b 2e 20 20 49 66 20 6d 20  em umask.  If m 
79d0: 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 0a 2a  is not 0, then.*
79e0: 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
79f0: 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20 62 65  creation mode be
7a00: 20 65 78 61 63 74 6c 79 20 6d 20 69 67 6e 6f 72   exactly m ignor
7a10: 69 6e 67 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a  ing the umask..*
7a20: 2a 0a 2a 2a 20 54 68 65 20 6d 20 70 61 72 61 6d  *.** The m param
7a30: 65 74 65 72 20 77 69 6c 6c 20 62 65 20 6e 6f 6e  eter will be non
7a40: 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77 68 65 6e 20  -zero only when 
7a50: 63 72 65 61 74 69 6e 67 20 2d 77 61 6c 2c 20 2d  creating -wal, -
7a60: 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20  journal,.** and 
7a70: 2d 73 68 6d 20 66 69 6c 65 73 2e 20 20 57 65 20  -shm files.  We 
7a80: 77 61 6e 74 20 74 68 6f 73 65 20 66 69 6c 65 73  want those files
7a90: 20 74 6f 20 68 61 76 65 20 2a 65 78 61 63 74 6c   to have *exactl
7aa0: 79 2a 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 70  y* the same.** p
7ab0: 65 72 6d 69 73 73 69 6f 6e 73 20 61 73 20 74 68  ermissions as th
7ac0: 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  eir original dat
7ad0: 61 62 61 73 65 2c 20 75 6e 61 64 75 6c 74 65 72  abase, unadulter
7ae0: 61 74 65 64 20 62 79 20 74 68 65 20 75 6d 61 73  ated by the umas
7af0: 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 77 61  k..** In that wa
7b00: 79 2c 20 69 66 20 61 20 64 61 74 61 62 61 73 65  y, if a database
7b10: 20 66 69 6c 65 20 69 73 20 2d 72 77 2d 72 77 2d   file is -rw-rw-
7b20: 72 77 20 6f 72 20 2d 72 77 2d 72 77 2d 72 2d 2c  rw or -rw-rw-r-,
7b30: 20 61 6e 64 20 61 0a 2a 2a 20 74 72 61 6e 73 61   and a.** transa
7b40: 63 74 69 6f 6e 20 63 72 61 73 68 65 73 20 61 6e  ction crashes an
7b50: 64 20 6c 65 61 76 65 73 20 62 65 68 69 6e 64 20  d leaves behind 
7b60: 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68  hot journals, th
7b70: 65 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f 63 65 73  en any.** proces
7b80: 73 20 74 68 61 74 20 69 73 20 61 62 6c 65 20 74  s that is able t
7b90: 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  o write to the d
7ba0: 61 74 61 62 61 73 65 20 77 69 6c 6c 20 61 6c 73  atabase will als
7bb0: 6f 20 62 65 20 61 62 6c 65 20 74 6f 0a 2a 2a 20  o be able to.** 
7bc0: 72 65 63 6f 76 65 72 20 74 68 65 20 68 6f 74 20  recover the hot 
7bd0: 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61  journals..*/.sta
7be0: 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f  tic int robust_o
7bf0: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  pen(const char *
7c00: 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f 64 65 5f 74  z, int f, mode_t
7c10: 20 6d 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20   m){.  int fd;. 
7c20: 20 6d 6f 64 65 5f 74 20 6d 32 20 3d 20 6d 20 3f   mode_t m2 = m ?
7c30: 20 6d 20 3a 20 53 51 4c 49 54 45 5f 44 45 46 41   m : SQLITE_DEFA
7c40: 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
7c50: 49 4f 4e 53 3b 0a 20 20 77 68 69 6c 65 28 31 29  IONS;.  while(1)
7c60: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 5f  {.#if defined(O_
7c70: 43 4c 4f 45 58 45 43 29 0a 20 20 20 20 66 64 20  CLOEXEC).    fd 
7c80: 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43  = osOpen(z,f|O_C
7c90: 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23 65 6c 73  LOEXEC,m2);.#els
7ca0: 65 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f 70 65  e.    fd = osOpe
7cb0: 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64 69  n(z,f,m2);.#endi
7cc0: 66 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29  f.    if( fd<0 )
7cd0: 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 6e  {.      if( errn
7ce0: 6f 3d 3d 45 49 4e 54 52 20 29 20 63 6f 6e 74 69  o==EINTR ) conti
7cf0: 6e 75 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nue;.      break
7d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7d10: 66 64 3e 3d 53 51 4c 49 54 45 5f 4d 49 4e 49 4d  fd>=SQLITE_MINIM
7d20: 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54  UM_FILE_DESCRIPT
7d30: 4f 52 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  OR ) break;.    
7d40: 6f 73 43 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20  osClose(fd);.   
7d50: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
7d60: 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 0a 20 20  ITE_WARNING, .  
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 61                "a
7d80: 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 5c  ttempt to open \
7d90: 22 25 73 5c 22 20 61 73 20 66 69 6c 65 20 64 65  "%s\" as file de
7da0: 73 63 72 69 70 74 6f 72 20 25 64 22 2c 20 7a 2c  scriptor %d", z,
7db0: 20 66 64 29 3b 0a 20 20 20 20 66 64 20 3d 20 2d   fd);.    fd = -
7dc0: 31 3b 0a 20 20 20 20 69 66 28 20 6f 73 4f 70 65  1;.    if( osOpe
7dd0: 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 66  n("/dev/null", f
7de0: 2c 20 6d 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a  , m)<0 ) break;.
7df0: 20 20 7d 0a 20 20 69 66 28 20 66 64 3e 3d 30 20    }.  if( fd>=0 
7e00: 29 7b 0a 20 20 20 20 69 66 28 20 6d 21 3d 30 20  ){.    if( m!=0 
7e10: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
7e20: 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a 20 20  stat statbuf;.  
7e30: 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
7e40: 66 64 2c 20 26 73 74 61 74 62 75 66 29 3d 3d 30  fd, &statbuf)==0
7e50: 20 0a 20 20 20 20 20 20 20 26 26 20 73 74 61 74   .       && stat
7e60: 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a 20  buf.st_size==0. 
7e70: 20 20 20 20 20 20 26 26 20 28 73 74 61 74 62 75        && (statbu
7e80: 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 21  f.st_mode&0777)!
7e90: 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  =m .      ){.   
7ea0: 20 20 20 20 20 6f 73 46 63 68 6d 6f 64 28 66 64       osFchmod(fd
7eb0: 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , m);.      }.  
7ec0: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
7ed0: 46 44 5f 43 4c 4f 45 58 45 43 29 20 26 26 20 28  FD_CLOEXEC) && (
7ee0: 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58  !defined(O_CLOEX
7ef0: 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45 43  EC) || O_CLOEXEC
7f00: 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63 6e 74 6c  ==0).    osFcntl
7f10: 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73  (fd, F_SETFD, os
7f20: 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46  Fcntl(fd, F_GETF
7f30: 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58  D, 0) | FD_CLOEX
7f40: 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  EC);.#endif.  }.
7f50: 20 20 72 65 74 75 72 6e 20 66 64 3b 0a 7d 0a 0a    return fd;.}..
7f60: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
7f70: 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e  ctions to obtain
7f80: 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20   and relinquish 
7f90: 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
7fa0: 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20  . The.** global 
7fb0: 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f  mutex is used to
7fc0: 20 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69   protect the uni
7fd0: 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a  xInodeInfo and.*
7fe0: 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  * vxworksFileId 
7ff0: 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20  objects used by 
8000: 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f  this file, all o
8010: 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a  f which may be .
8020: 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c  ** shared by mul
8030: 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a  tiple threads..*
8040: 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e  *.** Function un
8050: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  ixMutexHeld() is
8060: 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28   used to assert(
8070: 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61  ) that the globa
8080: 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68  l mutex .** is h
8090: 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65  eld when require
80a0: 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
80b0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73   is only used as
80c0: 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28   part of assert(
80d0: 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ) .** statements
80e0: 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75  . e.g..**.**   u
80f0: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a  nixEnterMutex().
8100: 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 75  **     assert( u
8110: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
8120: 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72  ;.**   unixEnter
8130: 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69  Leave().*/.stati
8140: 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72  c void unixEnter
8150: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
8160: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
8170: 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
8180: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
8190: 58 5f 53 54 41 54 49 43 5f 56 46 53 31 29 29 3b  X_STATIC_VFS1));
81a0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  .}.static void u
81b0: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f  nixLeaveMutex(vo
81c0: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
81d0: 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
81e0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
81f0: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
8200: 5f 56 46 53 31 29 29 3b 0a 7d 0a 23 69 66 64 65  _VFS1));.}.#ifde
8210: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
8220: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 75  tatic int unixMu
8230: 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a  texHeld(void) {.
8240: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
8250: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69  _mutex_held(sqli
8260: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
8270: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
8280: 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23 65 6e 64  C_VFS1));.}.#end
8290: 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  if...#ifdef SQLI
82a0: 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45  TE_HAVE_OS_TRACE
82b0: 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
82c0: 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74  nction for print
82d0: 69 6e 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e  ing out trace in
82e0: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64  formation from d
82f0: 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61  ebugging.** bina
8300: 72 69 65 73 2e 20 54 68 69 73 20 72 65 74 75 72  ries. This retur
8310: 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 72 65  ns the string re
8320: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
8330: 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20  the supplied.** 
8340: 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70  integer lock-typ
8350: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  e..*/.static con
8360: 73 74 20 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c  st char *azFileL
8370: 6f 63 6b 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63  ock(int eFileLoc
8380: 6b 29 7b 0a 20 20 73 77 69 74 63 68 28 20 65 46  k){.  switch( eF
8390: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63  ileLock ){.    c
83a0: 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74  ase NO_LOCK: ret
83b0: 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20  urn "NONE";.    
83c0: 63 61 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b  case SHARED_LOCK
83d0: 3a 20 72 65 74 75 72 6e 20 22 53 48 41 52 45 44  : return "SHARED
83e0: 22 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53 45  ";.    case RESE
83f0: 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  RVED_LOCK: retur
8400: 6e 20 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20  n "RESERVED";.  
8410: 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c    case PENDING_L
8420: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e  OCK: return "PEN
8430: 44 49 4e 47 22 3b 0a 20 20 20 20 63 61 73 65 20  DING";.    case 
8440: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20  EXCLUSIVE_LOCK: 
8450: 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56  return "EXCLUSIV
8460: 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  E";.  }.  return
8470: 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64   "ERROR";.}.#end
8480: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
8490: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a  E_LOCK_TRACE./*.
84a0: 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66  ** Print out inf
84b0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
84c0: 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  ll locking opera
84d0: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
84e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
84f0: 64 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f  d for troublesho
8500: 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d  oting locks on m
8510: 75 6c 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20  ultithreaded.** 
8520: 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62  platforms.  Enab
8530: 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20  le by compiling 
8540: 77 69 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54  with the -DSQLIT
8550: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20  E_LOCK_TRACE.** 
8560: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74  command-line opt
8570: 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69  ion on the compi
8580: 6c 65 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20  ler.  This code 
8590: 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74  is normally.** t
85a0: 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74  urned off..*/.st
85b0: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61  atic int lockTra
85c0: 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f  ce(int fd, int o
85d0: 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  p, struct flock 
85e0: 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70  *p){.  char *zOp
85f0: 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20  Name, *zType;.  
8600: 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76  int s;.  int sav
8610: 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f  edErrno;.  if( o
8620: 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20  p==F_GETLK ){.  
8630: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54    zOpName = "GET
8640: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  LK";.  }else if(
8650: 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a   op==F_SETLK ){.
8660: 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53      zOpName = "S
8670: 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ETLK";.  }else{.
8680: 20 20 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28      s = osFcntl(
8690: 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20  fd, op, p);.    
86a0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
86b0: 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77  tf("fcntl unknow
86c0: 6e 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66  n %d %d %d\n", f
86d0: 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72  d, op, s);.    r
86e0: 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69  eturn s;.  }.  i
86f0: 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  f( p->l_type==F_
8700: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79  RDLCK ){.    zTy
8710: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
8720: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74  }else if( p->l_t
8730: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a  ype==F_WRLCK ){.
8740: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c      zType = "WRL
8750: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CK";.  }else if(
8760: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e   p->l_type==F_UN
8770: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
8780: 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65   = "UNLCK";.  }e
8790: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
87a0: 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65   0 );.  }.  asse
87b0: 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d  rt( p->l_whence=
87c0: 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73  =SEEK_SET );.  s
87d0: 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f   = osFcntl(fd, o
87e0: 70 2c 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72  p, p);.  savedEr
87f0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73  rno = errno;.  s
8800: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
8810: 66 28 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25  f("fcntl %d %d %
8820: 73 20 25 73 20 25 64 20 25 64 20 25 64 20 25 64  s %s %d %d %d %d
8830: 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64  \n",.     thread
8840: 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c  id, fd, zOpName,
8850: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e   zType, (int)p->
8860: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d  l_start, (int)p-
8870: 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e  >l_len,.     (in
8880: 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a  t)p->l_pid, s);.
8890: 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26    if( s==(-1) &&
88a0: 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20   op==F_SETLK && 
88b0: 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44  (p->l_type==F_RD
88c0: 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65  LCK || p->l_type
88d0: 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20  ==F_WRLCK) ){.  
88e0: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
88f0: 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a  2;.    l2 = *p;.
8900: 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20      osFcntl(fd, 
8910: 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20  F_GETLK, &l2);. 
8920: 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65     if( l2.l_type
8930: 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
8940: 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43     zType = "RDLC
8950: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  K";.    }else if
8960: 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57  ( l2.l_type==F_W
8970: 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54  RLCK ){.      zT
8980: 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20  ype = "WRLCK";. 
8990: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e     }else if( l2.
89a0: 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  l_type==F_UNLCK 
89b0: 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  ){.      zType =
89c0: 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65   "UNLCK";.    }e
89d0: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
89e0: 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  t( 0 );.    }.  
89f0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
8a00: 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c  intf("fcntl-fail
8a10: 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25  ure-reason: %s %
8a20: 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20  d %d %d\n",.    
8a30: 20 20 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c     zType, (int)l
8a40: 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29  2.l_start, (int)
8a50: 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c  l2.l_len, (int)l
8a60: 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20  2.l_pid);.  }.  
8a70: 65 72 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72  errno = savedErr
8a80: 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a  no;.  return s;.
8a90: 7d 0a 23 75 6e 64 65 66 20 6f 73 46 63 6e 74 6c  }.#undef osFcntl
8aa0: 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c  .#define osFcntl
8ab0: 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69   lockTrace.#endi
8ac0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  f /* SQLITE_LOCK
8ad0: 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _TRACE */../*.**
8ae0: 20 52 65 74 72 79 20 66 74 72 75 6e 63 61 74 65   Retry ftruncate
8af0: 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61  () calls that fa
8b00: 69 6c 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a  il due to EINTR.
8b10: 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 61 6c 6c 73 20  **.** All calls 
8b20: 74 6f 20 66 74 72 75 6e 63 61 74 65 28 29 20 77  to ftruncate() w
8b30: 69 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65 20  ithin this file 
8b40: 73 68 6f 75 6c 64 20 62 65 20 6d 61 64 65 20 74  should be made t
8b50: 68 72 6f 75 67 68 0a 2a 2a 20 74 68 69 73 20 77  hrough.** this w
8b60: 72 61 70 70 65 72 2e 20 20 4f 6e 20 74 68 65 20  rapper.  On the 
8b70: 41 6e 64 72 6f 69 64 20 70 6c 61 74 66 6f 72 6d  Android platform
8b80: 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20  , bypassing the 
8b90: 6c 6f 67 69 63 20 62 65 6c 6f 77 0a 2a 2a 20 63  logic below.** c
8ba0: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 63  ould lead to a c
8bb0: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 2e  orrupt database.
8bc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
8bd0: 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
8be0: 69 6e 74 20 68 2c 20 73 71 6c 69 74 65 33 5f 69  int h, sqlite3_i
8bf0: 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69 6e 74 20  nt64 sz){.  int 
8c00: 72 63 3b 0a 23 69 66 64 65 66 20 5f 5f 41 4e 44  rc;.#ifdef __AND
8c10: 52 4f 49 44 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 41  ROID__.  /* On A
8c20: 6e 64 72 6f 69 64 2c 20 66 74 72 75 6e 63 61 74  ndroid, ftruncat
8c30: 65 28 29 20 61 6c 77 61 79 73 20 75 73 65 73 20  e() always uses 
8c40: 33 32 2d 62 69 74 20 6f 66 66 73 65 74 73 2c 20  32-bit offsets, 
8c50: 65 76 65 6e 20 69 66 20 0a 20 20 2a 2a 20 5f 46  even if .  ** _F
8c60: 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 3d  ILE_OFFSET_BITS=
8c70: 36 34 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54  64 is defined. T
8c80: 68 69 73 20 6d 65 61 6e 73 20 69 74 20 69 73 20  his means it is 
8c90: 75 6e 73 61 66 65 20 74 6f 20 61 74 74 65 6d 70  unsafe to attemp
8ca0: 74 20 74 6f 0a 20 20 2a 2a 20 74 72 75 6e 63 61  t to.  ** trunca
8cb0: 74 65 20 61 20 66 69 6c 65 20 74 6f 20 61 6e 79  te a file to any
8cc0: 20 73 69 7a 65 20 6c 61 72 67 65 72 20 74 68 61   size larger tha
8cd0: 6e 20 32 47 69 42 2e 20 53 69 6c 65 6e 74 6c 79  n 2GiB. Silently
8ce0: 20 69 67 6e 6f 72 65 20 61 6e 79 0a 20 20 2a 2a   ignore any.  **
8cf0: 20 73 75 63 68 20 61 74 74 65 6d 70 74 73 2e 20   such attempts. 
8d00: 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3e 28 73 71   */.  if( sz>(sq
8d10: 6c 69 74 65 33 5f 69 6e 74 36 34 29 30 78 37 46  lite3_int64)0x7F
8d20: 46 46 46 46 46 46 20 29 7b 0a 20 20 20 20 72 63  FFFFFF ){.    rc
8d30: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8d40: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 64  }else.#endif.  d
8d50: 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72 75 6e 63  o{ rc = osFtrunc
8d60: 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c  ate(h,sz); }whil
8d70: 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
8d80: 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74  ==EINTR );.  ret
8d90: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
8da0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72   This routine tr
8db0: 61 6e 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64  anslates a stand
8dc0: 61 72 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20  ard POSIX errno 
8dd0: 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68  code into someth
8de0: 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f  ing.** useful to
8df0: 20 74 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20   the clients of 
8e00: 74 68 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63  the sqlite3 func
8e10: 74 69 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63  tions.  Specific
8e20: 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69  ally, it is.** i
8e30: 6e 74 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73  ntended to trans
8e40: 6c 61 74 65 20 61 20 76 61 72 69 65 74 79 20 6f  late a variety o
8e50: 66 20 22 74 72 79 20 61 67 61 69 6e 22 20 65 72  f "try again" er
8e60: 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45  rors into SQLITE
8e70: 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76  _BUSY.** and a v
8e80: 61 72 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73  ariety of "pleas
8e90: 65 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  e close the file
8ea0: 20 64 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22   descriptor NOW"
8eb0: 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a   errors into .**
8ec0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a   SQLITE_IOERR.**
8ed0: 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69   .** Errors duri
8ee0: 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ng initializatio
8ef0: 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66  n of locks, or f
8f00: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
8f10: 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a  rt for locks,.**
8f20: 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45   should handle E
8f30: 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20  NOLCK, ENOTSUP, 
8f40: 45 4f 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72  EOPNOTSUPP separ
8f50: 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ately..*/.static
8f60: 20 69 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72   int sqliteError
8f70: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69  FromPosixError(i
8f80: 6e 74 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69  nt posixError, i
8f90: 6e 74 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20  nt sqliteIOErr) 
8fa0: 7b 0a 20 20 61 73 73 65 72 74 28 20 28 73 71 6c  {.  assert( (sql
8fb0: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
8fc0: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c  TE_IOERR_LOCK) |
8fd0: 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 73 71  | .          (sq
8fe0: 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c  liteIOErr == SQL
8ff0: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
9000: 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ) || .          
9010: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
9020: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
9030: 4f 43 4b 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  OCK) ||.        
9040: 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d    (sqliteIOErr =
9050: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  = SQLITE_IOERR_C
9060: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
9070: 29 20 29 3b 0a 20 20 73 77 69 74 63 68 20 28 70  ) );.  switch (p
9080: 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a 20 20 63  osixError) {.  c
9090: 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20 63  ase EACCES: .  c
90a0: 61 73 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61  ase EAGAIN:.  ca
90b0: 73 65 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20  se ETIMEDOUT:.  
90c0: 63 61 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61  case EBUSY:.  ca
90d0: 73 65 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65  se EINTR:.  case
90e0: 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f   ENOLCK:  .    /
90f0: 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74  * random NFS ret
9100: 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73  ry error, unless
9110: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
9120: 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20  tem support .   
9130: 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f    * introspectio
9140: 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 61  n, in which it a
9150: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
9160: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20  at it says */.  
9170: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9180: 42 55 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73  BUSY;.    .  cas
9190: 65 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65  e EPERM: .    re
91a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
91b0: 3b 0a 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74  ;.    .  default
91c0: 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  : .    return sq
91d0: 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d  liteIOErr;.  }.}
91e0: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
91f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9230: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
9240: 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71  ***** Begin Uniq
9250: 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69  ue File ID Utili
9260: 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72  ty Used By VxWor
9270: 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks *************
9280: 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74  **.**.** On most
9290: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69   versions of uni
92a0: 78 2c 20 77 65 20 63 61 6e 20 67 65 74 20 61 20  x, we can get a 
92b0: 75 6e 69 71 75 65 20 49 44 20 66 6f 72 20 61 20  unique ID for a 
92c0: 66 69 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e  file by concaten
92d0: 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76  ating.** the dev
92e0: 69 63 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  ice number and t
92f0: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e  he inode number.
9300: 20 20 42 75 74 20 74 68 69 73 20 64 6f 65 73 20    But this does 
9310: 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f  not work on VxWo
9320: 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72  rks..** On VxWor
9330: 6b 73 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c  ks, a unique fil
9340: 65 20 69 64 20 6d 75 73 74 20 62 65 20 62 61 73  e id must be bas
9350: 65 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69  ed on the canoni
9360: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  cal filename..**
9370: 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  .** A pointer to
9380: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
9390: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
93a0: 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 75  ructure can be u
93b0: 73 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71  sed as a.** uniq
93c0: 75 65 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78  ue file ID in Vx
93d0: 57 6f 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73  Works.  Each ins
93e0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
93f0: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
9400: 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68  .** a copy of th
9410: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  e canonical file
9420: 6e 61 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20  name.  There is 
9430: 61 6c 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65  also a reference
9440: 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65   count.  .** The
9450: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65   structure is re
9460: 63 6c 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65  claimed when the
9470: 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   number of point
9480: 65 72 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20  ers to it drops 
9490: 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  to.** zero..**.*
94a0: 2a 20 54 68 65 72 65 20 61 72 65 20 6e 65 76 65  * There are neve
94b0: 72 20 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65  r very many file
94c0: 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69  s open at one ti
94d0: 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61  me and lookups a
94e0: 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66  re not.** a perf
94f0: 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c  ormance-critical
9500: 20 70 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20   path, so it is 
9510: 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75  sufficient to pu
9520: 74 20 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63  t these.** struc
9530: 74 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65  tures on a linke
9540: 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63  d list..*/.struc
9550: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
9560: 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  {.  struct vxwor
9570: 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b  ksFileId *pNext;
9580: 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c    /* Next in a l
9590: 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20  ist of them all 
95a0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
95b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
95d0: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
95e0: 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  is one */.  int 
95f0: 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
9600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
9610: 67 74 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f  gth of the zCano
9620: 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69  nicalName[] stri
9630: 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  ng */.  char *zC
9640: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20  anonicalName;   
9650: 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63        /* Canonic
9660: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d  al filename */.}
9670: 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ;..#if OS_VXWORK
9680: 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69  S./* .** All uni
9690: 71 75 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  que filenames ar
96a0: 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b  e held on a link
96b0: 65 64 20 6c 69 73 74 20 68 65 61 64 65 64 20 62  ed list headed b
96c0: 79 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62  y this.** variab
96d0: 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  le:.*/.static st
96e0: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
96f0: 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c  Id *vxworksFileL
9700: 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ist = 0;../*.** 
9710: 53 69 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e  Simplify a filen
9720: 61 6d 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e  ame into its can
9730: 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62  onical form.** b
9740: 79 20 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c  y making the fol
9750: 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a  lowing changes:.
9760: 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e  **.**  * removin
9770: 67 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61  g any trailing a
9780: 6e 64 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a  nd duplicate /.*
9790: 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f  *  * convert /./
97a0: 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20   into just /.** 
97b0: 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e   * convert /A/..
97c0: 2f 20 77 68 65 72 65 20 41 20 69 73 20 61 6e 79  / where A is any
97d0: 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74   simple name int
97e0: 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43  o just /.**.** C
97f0: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
9800: 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72  in-place.  Retur
9810: 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c  n the new name l
9820: 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ength..**.** The
9830: 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61   original filena
9840: 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d  me is in z[0..n-
9850: 31 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  1].  Return the 
9860: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61  number of.** cha
9870: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73  racters in the s
9880: 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a  implified name..
9890: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78  */.static int vx
98a0: 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d  worksSimplifyNam
98b0: 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  e(char *z, int n
98c0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
98d0: 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a   while( n>1 && z
98e0: 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d  [n-1]=='/' ){ n-
98f0: 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  -; }.  for(i=j=0
9900: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
9910: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29   if( z[i]=='/' )
9920: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  {.      if( z[i+
9930: 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e  1]=='/' ) contin
9940: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b  ue;.      if( z[
9950: 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32  i+1]=='.' && i+2
9960: 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f  <n && z[i+2]=='/
9970: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b  ' ){.        i +
9980: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 1;.        con
9990: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
99a0: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
99b0: 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26  ='.' && i+3<n &&
99c0: 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20   z[i+2]=='.' && 
99d0: 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20  z[i+3]=='/' ){. 
99e0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e         while( j>
99f0: 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27  0 && z[j-1]!='/'
9a00: 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ j--; }.     
9a10: 20 20 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d     if( j>0 ){ j-
9a20: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b  -; }.        i +
9a30: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 2;.        con
9a40: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
9a50: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20     }.    z[j++] 
9a60: 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b  = z[i];.  }.  z[
9a70: 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  j] = 0;.  return
9a80: 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   j;.}../*.** Fin
9a90: 64 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20  d a unique file 
9aa0: 49 44 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ID for the given
9ab0: 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61   absolute pathna
9ac0: 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61  me.  Return.** a
9ad0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
9ae0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
9af0: 6a 65 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e  ject.  This poin
9b00: 74 65 72 20 69 73 20 74 68 65 20 75 6e 69 71 75  ter is the uniqu
9b10: 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a  e.** file ID..**
9b20: 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65  .** The nRef fie
9b30: 6c 64 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b  ld of the vxwork
9b40: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69  sFileId object i
9b50: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65  s incremented be
9b60: 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65  fore.** the obje
9b70: 63 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ct is returned. 
9b80: 20 41 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69   A new vxworksFi
9b90: 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63  leId object is c
9ba0: 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64  reated.** and ad
9bb0: 64 65 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61  ded to the globa
9bc0: 6c 20 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73  l list if necess
9bd0: 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ary..**.** If a 
9be0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
9bf0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
9c00: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
9c10: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78  static struct vx
9c20: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77  worksFileId *vxw
9c30: 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63  orksFindFileId(c
9c40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f  onst char *zAbso
9c50: 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72  luteName){.  str
9c60: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
9c70: 64 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  d *pNew;        
9c80: 20 2f 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61   /* search key a
9c90: 6e 64 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a  nd new file ID *
9ca0: 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  /.  struct vxwor
9cb0: 6b 73 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69  ksFileId *pCandi
9cc0: 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c  date;   /* For l
9cd0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73  ooping over exis
9ce0: 74 69 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f  ting file IDs */
9cf0: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d10: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
9d20: 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d   of zAbsoluteNam
9d30: 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61  e string */..  a
9d40: 73 73 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65  ssert( zAbsolute
9d50: 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a  Name[0]=='/' );.
9d60: 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65    n = (int)strle
9d70: 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29  n(zAbsoluteName)
9d80: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
9d90: 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a  e3_malloc64( siz
9da0: 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b  eof(*pNew) + (n+
9db0: 31 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  1) );.  if( pNew
9dc0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
9dd0: 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63    pNew->zCanonic
9de0: 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  alName = (char*)
9df0: 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63  &pNew[1];.  memc
9e00: 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  py(pNew->zCanoni
9e10: 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75  calName, zAbsolu
9e20: 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20  teName, n+1);.  
9e30: 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c  n = vxworksSimpl
9e40: 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43  ifyName(pNew->zC
9e50: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29  anonicalName, n)
9e60: 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66  ;..  /* Search f
9e70: 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65  or an existing e
9e80: 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68 69  ntry that matchi
9e90: 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  ng the canonical
9ea0: 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66   name..  ** If f
9eb0: 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20  ound, increment 
9ec0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
9ed0: 75 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61  unt and return a
9ee0: 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a   pointer to.  **
9ef0: 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 66 69   the existing fi
9f00: 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e  le ID..  */.  un
9f10: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
9f20: 20 20 66 6f 72 28 70 43 61 6e 64 69 64 61 74 65    for(pCandidate
9f30: 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74  =vxworksFileList
9f40: 3b 20 70 43 61 6e 64 69 64 61 74 65 3b 20 70 43  ; pCandidate; pC
9f50: 61 6e 64 69 64 61 74 65 3d 70 43 61 6e 64 69 64  andidate=pCandid
9f60: 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ate->pNext){.   
9f70: 20 69 66 28 20 70 43 61 6e 64 69 64 61 74 65 2d   if( pCandidate-
9f80: 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20  >nName==n .     
9f90: 26 26 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69  && memcmp(pCandi
9fa0: 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  date->zCanonical
9fb0: 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e  Name, pNew->zCan
9fc0: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d  onicalName, n)==
9fd0: 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20  0.    ){.       
9fe0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
9ff0: 77 29 3b 0a 20 20 20 20 20 20 20 70 43 61 6e 64  w);.       pCand
a000: 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  idate->nRef++;. 
a010: 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d        unixLeaveM
a020: 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20 72  utex();.       r
a030: 65 74 75 72 6e 20 70 43 61 6e 64 69 64 61 74 65  eturn pCandidate
a040: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
a050: 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61 73 20 66  * No match was f
a060: 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d  ound.  We will m
a070: 61 6b 65 20 61 20 6e 65 77 20 66 69 6c 65 20 49  ake a new file I
a080: 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65  D */.  pNew->nRe
a090: 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e  f = 1;.  pNew->n
a0a0: 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77  Name = n;.  pNew
a0b0: 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b  ->pNext = vxwork
a0c0: 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77  sFileList;.  vxw
a0d0: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 70  orksFileList = p
a0e0: 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  New;.  unixLeave
a0f0: 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
a100: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
a110: 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Decrement the r
a120: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
a130: 6e 20 61 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  n a vxworksFileI
a140: 64 20 6f 62 6a 65 63 74 2e 20 20 46 72 65 65 0a  d object.  Free.
a150: 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 77 68  ** the object wh
a160: 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  en the reference
a170: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a   count reaches z
a180: 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ero..*/.static v
a190: 6f 69 64 20 76 78 77 6f 72 6b 73 52 65 6c 65 61  oid vxworksRelea
a1a0: 73 65 46 69 6c 65 49 64 28 73 74 72 75 63 74 20  seFileId(struct 
a1b0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
a1c0: 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72  Id){.  unixEnter
a1d0: 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72  Mutex();.  asser
a1e0: 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29  t( pId->nRef>0 )
a1f0: 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pId->nRef--;
a200: 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e 52 65 66  .  if( pId->nRef
a210: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ==0 ){.    struc
a220: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
a230: 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72 28 70 70  **pp;.    for(pp
a240: 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73  =&vxworksFileLis
a250: 74 3b 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70  t; *pp && *pp!=p
a260: 49 64 3b 20 70 70 20 3d 20 26 28 28 2a 70 70 29  Id; pp = &((*pp)
a270: 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20  ->pNext)){}.    
a280: 61 73 73 65 72 74 28 20 2a 70 70 3d 3d 70 49 64  assert( *pp==pId
a290: 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49   );.    *pp = pI
a2a0: 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71  d->pNext;.    sq
a2b0: 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 29 3b  lite3_free(pId);
a2c0: 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65  .  }.  unixLeave
a2d0: 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69  Mutex();.}.#endi
a2e0: 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
a2f0: 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */./************
a300: 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71 75  *** End of Uniqu
a310: 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74  e File ID Utilit
a320: 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b  y Used By VxWork
a330: 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
a340: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
a350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a390: 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */.../**********
a3a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3e0: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
a3f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a400: 20 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20   Posix Advisory 
a410: 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
a420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a430: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58  ****.**.** POSIX
a440: 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
a450: 61 72 65 20 62 72 6f 6b 65 6e 20 62 79 20 64 65  are broken by de
a460: 73 69 67 6e 2e 20 20 41 4e 53 49 20 53 54 44 20  sign.  ANSI STD 
a470: 31 30 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a  1003.1 (1996).**
a480: 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32   section 6.5.2.2
a490: 20 6c 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75   lines 483 throu
a4a0: 67 68 20 34 39 30 20 73 70 65 63 69 66 79 20 74  gh 490 specify t
a4b0: 68 61 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65  hat when a proce
a4c0: 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c  ss.** sets or cl
a4d0: 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61  ears a lock, tha
a4e0: 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72  t operation over
a4f0: 72 69 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20  rides any prior 
a500: 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20  locks set.** by 
a510: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
a520: 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65  .  It does not e
a530: 78 70 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f  xplicitly say so
a540: 2c 20 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69  , but this impli
a550: 65 73 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76  es.** that it ov
a560: 65 72 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65  errides locks se
a570: 74 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72  t by the same pr
a580: 6f 63 65 73 73 20 75 73 69 6e 67 20 61 20 64 69  ocess using a di
a590: 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20  fferent.** file 
a5a0: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e  descriptor.  Con
a5b0: 73 69 64 65 72 20 74 68 69 73 20 74 65 73 74 20  sider this test 
a5c0: 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  case:.**.**     
a5d0: 20 20 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e    int fd1 = open
a5e0: 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44  ("./file1", O_RD
a5f0: 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34  WR|O_CREAT, 0644
a600: 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20  );.**       int 
a610: 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69  fd2 = open("./fi
a620: 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  le2", O_RDWR|O_C
a630: 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a  REAT, 0644);.**.
a640: 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c  ** Suppose ./fil
a650: 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61  e1 and ./file2 a
a660: 72 65 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61  re really the sa
a670: 6d 65 20 66 69 6c 65 20 28 62 65 63 61 75 73 65  me file (because
a680: 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72  .** one is a har
a690: 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69  d or symbolic li
a6a0: 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29  nk to the other)
a6b0: 20 74 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74   then if you set
a6c0: 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65  .** an exclusive
a6d0: 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68   lock on fd1, th
a6e0: 65 6e 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e  en try to get an
a6f0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a   exclusive lock.
a700: 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f  ** on fd2, it wo
a710: 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61  rks.  I would ha
a720: 76 65 20 65 78 70 65 63 74 65 64 20 74 68 65 20  ve expected the 
a730: 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a  second lock to.*
a740: 2a 20 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65  * fail since the
a750: 72 65 20 77 61 73 20 61 6c 72 65 61 64 79 20 61  re was already a
a760: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
a770: 65 20 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a  e due to fd1..**
a780: 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69   But not so.  Si
a790: 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63  nce both locks c
a7a0: 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d  ame from the sam
a7b0: 65 20 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a  e process, the.*
a7c0: 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64  * second overrid
a7d0: 65 73 20 74 68 65 20 66 69 72 73 74 2c 20 65 76  es the first, ev
a7e0: 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20 77  en though they w
a7f0: 65 72 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74  ere on different
a800: 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70  .** file descrip
a810: 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64  tors opened on d
a820: 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61  ifferent file na
a830: 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  mes..**.** This 
a840: 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 63 61  means that we ca
a850: 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c  nnot use POSIX l
a860: 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e  ocks to synchron
a870: 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73 73 0a  ize file access.
a880: 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69  ** among competi
a890: 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20 74 68  ng threads of th
a8a0: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20  e same process. 
a8b0: 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c   POSIX locks wil
a8c0: 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74  l work fine.** t
a8d0: 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63  o synchronize ac
a8e0: 63 65 73 73 20 66 6f 72 20 74 68 72 65 61 64 73  cess for threads
a8f0: 20 69 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f   in separate pro
a900: 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a  cesses, but not.
a910: 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74 68 69  ** threads withi
a920: 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  n the same proce
a930: 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72  ss..**.** To wor
a940: 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f  k around the pro
a950: 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73  blem, SQLite has
a960: 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20   to manage file 
a970: 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79  locks internally
a980: 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20  .** on its own. 
a990: 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20   Whenever a new 
a9a0: 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
a9b0: 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66  ed, we have to f
a9c0: 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69  ind the.** speci
a9d0: 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65  fic inode of the
a9e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
a9f0: 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74  the inode is det
aa00: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a  ermined by the.*
aa10: 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f  * st_dev and st_
aa20: 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68  ino fields of th
aa30: 65 20 73 74 61 74 20 73 74 72 75 63 74 75 72 65  e stat structure
aa40: 20 74 68 61 74 20 66 73 74 61 74 28 29 20 66 69   that fstat() fi
aa50: 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63  lls in).** and c
aa60: 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61  heck for locks a
aa70: 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e 67 20  lready existing 
aa80: 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20  on that inode.  
aa90: 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a  When locks are.*
aaa0: 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d  * created or rem
aab0: 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f  oved, we have to
aac0: 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e   look at our own
aad0: 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64   internal record
aae0: 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73   of the.** locks
aaf0: 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68   to see if anoth
ab00: 65 72 20 74 68 72 65 61 64 20 68 61 73 20 70 72  er thread has pr
ab10: 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c  eviously set a l
ab20: 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65  ock on that same
ab30: 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a  .** inode..**.**
ab40: 20 28 41 73 69 64 65 3a 20 54 68 65 20 75 73 65   (Aside: The use
ab50: 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72   of inode number
ab60: 73 20 61 73 20 75 6e 69 71 75 65 20 49 44 73 20  s as unique IDs 
ab70: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
ab80: 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72   VxWorks..** For
ab90: 20 56 78 57 6f 72 6b 73 2c 20 77 65 20 68 61 76   VxWorks, we hav
aba0: 65 20 74 6f 20 75 73 65 20 74 68 65 20 61 6c 74  e to use the alt
abb0: 65 72 6e 61 74 69 76 65 20 75 6e 69 71 75 65 20  ernative unique 
abc0: 49 44 20 73 79 73 74 65 6d 20 62 61 73 65 64 20  ID system based 
abd0: 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20  on.** canonical 
abe0: 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70  filename and imp
abf0: 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74 68 65 20  lemented in the 
ac00: 70 72 65 76 69 6f 75 73 20 64 69 76 69 73 69 6f  previous divisio
ac10: 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71  n.).**.** The sq
ac20: 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63  lite3_file struc
ac30: 74 75 72 65 20 66 6f 72 20 50 4f 53 49 58 20 69  ture for POSIX i
ac40: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74  s no longer just
ac50: 20 61 6e 20 69 6e 74 65 67 65 72 20 66 69 6c 65   an integer file
ac60: 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 2e 20  .** descriptor. 
ac70: 20 49 74 20 69 73 20 6e 6f 77 20 61 20 73 74 72   It is now a str
ac80: 75 63 74 75 72 65 20 74 68 61 74 20 68 6f 6c 64  ucture that hold
ac90: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 66 69  s the integer fi
aca0: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
acb0: 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74   and a pointer t
acc0: 6f 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68  o a structure th
acd0: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
ace0: 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63   internal.** loc
acf0: 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73  ks on the corres
ad00: 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20  ponding inode.  
ad10: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63  There is one loc
ad20: 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a  king structure.*
ad30: 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20  * per inode, so 
ad40: 69 66 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64  if the same inod
ad50: 65 20 69 73 20 6f 70 65 6e 65 64 20 74 77 69 63  e is opened twic
ad60: 65 2c 20 62 6f 74 68 20 75 6e 69 78 46 69 6c 65  e, both unixFile
ad70: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 70   structures.** p
ad80: 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65  oint to the same
ad90: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
ada0: 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  re.  The locking
adb0: 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73   structure keeps
adc0: 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20  .** a reference 
add0: 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77 69 6c  count (so we wil
ade0: 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64  l know when to d
adf0: 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20 61 20  elete it) and a 
ae00: 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74  "cnt".** field t
ae10: 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69 74 73  hat tells us its
ae20: 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73   internal lock s
ae30: 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d  tatus.  cnt==0 m
ae40: 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65  eans the.** file
ae50: 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63   is unlocked.  c
ae60: 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65  nt==-1 means the
ae70: 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65 78 63   file has an exc
ae80: 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20  lusive lock..** 
ae90: 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68 65 72  cnt>0 means ther
aea0: 65 20 61 72 65 20 63 6e 74 20 73 68 61 72 65 64  e are cnt shared
aeb0: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 69   locks on the fi
aec0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74  le..**.** Any at
aed0: 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72  tempt to lock or
aee0: 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66   unlock a file f
aef0: 69 72 73 74 20 63 68 65 63 6b 73 20 74 68 65 20  irst checks the 
af00: 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63  locking.** struc
af10: 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c  ture.  The fcntl
af20: 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69  () system call i
af30: 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74  s only invoked t
af40: 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49  o set a .** POSI
af50: 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e  X lock if the in
af60: 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75  ternal lock stru
af70: 63 74 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e  cture transition
af80: 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c  s between.** a l
af90: 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c  ocked and an unl
afa0: 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a  ocked state..**.
afb0: 2a 2a 20 42 75 74 20 77 61 69 74 3a 20 20 74 68  ** But wait:  th
afc0: 65 72 65 20 61 72 65 20 79 65 74 20 6d 6f 72 65  ere are yet more
afd0: 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 50   problems with P
afe0: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f  OSIX advisory lo
aff0: 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f  cks..**.** If yo
b000: 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 20 64  u close a file d
b010: 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 70  escriptor that p
b020: 6f 69 6e 74 73 20 74 6f 20 61 20 66 69 6c 65 20  oints to a file 
b030: 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a  that has locks,.
b040: 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20  ** all locks on 
b050: 74 68 61 74 20 66 69 6c 65 20 74 68 61 74 20 61  that file that a
b060: 72 65 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20  re owned by the 
b070: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20  current process 
b080: 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e  are.** released.
b090: 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64    To work around
b0a0: 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65   this problem, e
b0b0: 61 63 68 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ach unixInodeInf
b0c0: 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e  o object.** main
b0d0: 74 61 69 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66  tains a count of
b0e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
b0f0: 65 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20  ending locks on 
b100: 74 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68  tha inode..** Wh
b110: 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
b120: 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61   made to close a
b130: 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74  n unixFile, if t
b140: 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65  here are.** othe
b150: 72 20 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20  r unixFile open 
b160: 6f 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64  on the same inod
b170: 65 20 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69  e that are holdi
b180: 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61  ng locks, the ca
b190: 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29  ll.** to close()
b1a0: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
b1b0: 70 74 6f 72 20 69 73 20 64 65 66 65 72 72 65 64  ptor is deferred
b1c0: 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68   until all of th
b1d0: 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a  e locks clear..*
b1e0: 2a 20 54 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  * The unixInodeI
b1f0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 6b 65  nfo structure ke
b200: 65 70 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69  eps a list of fi
b210: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74  le descriptors t
b220: 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62  hat need to.** b
b230: 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61  e closed and tha
b240: 74 20 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64  t list is walked
b250: 20 28 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77   (and cleared) w
b260: 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63  hen the last loc
b270: 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a  k.** clears..**.
b280: 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65 72 20 70  ** Yet another p
b290: 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68  roblem:  LinuxTh
b2a0: 72 65 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61  reads do not pla
b2b0: 79 20 77 65 6c 6c 20 77 69 74 68 20 70 6f 73 69  y well with posi
b2c0: 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d  x locks..**.** M
b2d0: 61 6e 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f  any older versio
b2e0: 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75 73 65 20  ns of linux use 
b2f0: 74 68 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73  the LinuxThreads
b300: 20 6c 69 62 72 61 72 79 20 77 68 69 63 68 20 69   library which i
b310: 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63  s.** not posix c
b320: 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72  ompliant.  Under
b330: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20 61   LinuxThreads, a
b340: 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79   lock created by
b350: 20 74 68 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e   thread.** A can
b360: 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20  not be modified 
b370: 6f 72 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79  or overridden by
b380: 20 61 20 64 69 66 66 65 72 65 6e 74 20 74 68 72   a different thr
b390: 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74  ead B..** Only t
b3a0: 68 72 65 61 64 20 41 20 63 61 6e 20 6d 6f 64 69  hread A can modi
b3b0: 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f  fy the lock.  Lo
b3c0: 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 20 69  cking behavior i
b3d0: 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20  s correct.** if 
b3e0: 74 68 65 20 61 70 70 6c 69 61 74 69 6f 6e 20 75  the appliation u
b3f0: 73 65 73 20 74 68 65 20 6e 65 77 65 72 20 4e 61  ses the newer Na
b400: 74 69 76 65 20 50 6f 73 69 78 20 54 68 72 65 61  tive Posix Threa
b410: 64 20 4c 69 62 72 61 72 79 20 28 4e 50 54 4c 29  d Library (NPTL)
b420: 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77  .** on linux - w
b430: 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20  ith NPTL a lock 
b440: 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65 61  created by threa
b450: 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65  d A can override
b460: 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72   locks.** in thr
b470: 65 61 64 20 42 2e 20 20 42 75 74 20 74 68 65 72  ead B.  But ther
b480: 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b  e is no way to k
b490: 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  now at compile-t
b4a0: 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20 74 68 72  ime which.** thr
b4b0: 65 61 64 69 6e 67 20 6c 69 62 72 61 72 79 20 69  eading library i
b4c0: 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20 53  s being used.  S
b4d0: 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  o there is no wa
b4e0: 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20  y to know at.** 
b4f0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65  compile-time whe
b500: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65  ther or not thre
b510: 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64  ad A can overrid
b520: 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61  e locks on threa
b530: 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73 20  d B..** One has 
b540: 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65  to do a run-time
b550: 20 63 68 65 63 6b 20 74 6f 20 64 69 73 63 6f 76   check to discov
b560: 65 72 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  er the behavior 
b570: 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  of the.** curren
b580: 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  t process..**.**
b590: 20 53 51 4c 69 74 65 20 75 73 65 64 20 74 6f 20   SQLite used to 
b5a0: 73 75 70 70 6f 72 74 20 4c 69 6e 75 78 54 68 72  support LinuxThr
b5b0: 65 61 64 73 2e 20 20 42 75 74 20 73 75 70 70 6f  eads.  But suppo
b5c0: 72 74 20 66 6f 72 20 4c 69 6e 75 78 54 68 72 65  rt for LinuxThre
b5d0: 61 64 73 0a 2a 2a 20 77 61 73 20 64 72 6f 70 70  ads.** was dropp
b5e0: 65 64 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  ed beginning wit
b5f0: 68 20 76 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2e  h version 3.7.0.
b600: 20 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 73 74    SQLite will st
b610: 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a  ill work with.**
b620: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 70 72   LinuxThreads pr
b630: 6f 76 69 64 65 64 20 74 68 61 74 20 28 31 29 20  ovided that (1) 
b640: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65  there is no more
b650: 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63   than one connec
b660: 74 69 6f 6e 20 0a 2a 2a 20 70 65 72 20 64 61 74  tion .** per dat
b670: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68  abase file in th
b680: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 61  e same process a
b690: 6e 64 20 28 32 29 20 64 61 74 61 62 61 73 65 20  nd (2) database 
b6a0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 64  connections.** d
b6b0: 6f 20 6e 6f 74 20 6d 6f 76 65 20 61 63 72 6f 73  o not move acros
b6c0: 73 20 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f  s threads..*/../
b6d0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
b6e0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
b6f0: 67 20 73 74 72 75 63 74 75 72 65 20 73 65 72 76  g structure serv
b700: 65 73 20 61 73 20 74 68 65 20 6b 65 79 20 75 73  es as the key us
b710: 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20  ed.** to locate 
b720: 61 20 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69  a particular uni
b730: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
b740: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  t..*/.struct uni
b750: 78 46 69 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f  xFileId {.  dev_
b760: 74 20 64 65 76 3b 20 20 20 20 20 20 20 20 20 20  t dev;          
b770: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
b780: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20  e number */.#if 
b790: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
b7a0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
b7b0: 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71  d *pId;  /* Uniq
b7c0: 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 76  ue file ID for v
b7d0: 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65  xworks. */.#else
b7e0: 0a 20 20 2f 2a 20 57 65 20 61 72 65 20 74 6f 6c  .  /* We are tol
b7f0: 64 20 74 68 61 74 20 73 6f 6d 65 20 76 65 72 73  d that some vers
b800: 69 6f 6e 73 20 6f 66 20 41 6e 64 72 6f 69 64 20  ions of Android 
b810: 63 6f 6e 74 61 69 6e 20 61 20 62 75 67 20 74 68  contain a bug th
b820: 61 74 0a 20 20 2a 2a 20 73 69 7a 65 73 20 69 6e  at.  ** sizes in
b830: 6f 5f 74 20 61 74 20 6f 6e 6c 79 20 33 32 2d 62  o_t at only 32-b
b840: 69 74 73 20 69 6e 73 74 65 61 64 20 6f 66 20 36  its instead of 6
b850: 34 2d 62 69 74 73 2e 20 28 53 65 65 0a 20 20 2a  4-bits. (See.  *
b860: 2a 20 68 74 74 70 73 3a 2f 2f 61 6e 64 72 6f 69  * https://androi
b870: 64 2d 72 65 76 69 65 77 2e 67 6f 6f 67 6c 65 73  d-review.googles
b880: 6f 75 72 63 65 2e 63 6f 6d 2f 23 2f 63 2f 31 31  ource.com/#/c/11
b890: 35 33 35 31 2f 33 2f 64 69 73 74 2f 73 71 6c 69  5351/3/dist/sqli
b8a0: 74 65 33 2e 63 29 0a 20 20 2a 2a 20 54 6f 20 77  te3.c).  ** To w
b8b0: 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c  ork around this,
b8c0: 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74 65   always allocate
b8d0: 20 36 34 2d 62 69 74 73 20 66 6f 72 20 74 68 65   64-bits for the
b8e0: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20   inode number.  
b8f0: 0a 20 20 2a 2a 20 4f 6e 20 73 6d 61 6c 6c 20 6d  .  ** On small m
b900: 61 63 68 69 6e 65 73 20 74 68 61 74 20 6f 6e 6c  achines that onl
b910: 79 20 68 61 76 65 20 33 32 2d 62 69 74 20 69 6e  y have 32-bit in
b920: 6f 64 65 73 2c 20 74 68 69 73 20 77 61 73 74 65  odes, this waste
b930: 73 20 34 20 62 79 74 65 73 2c 0a 20 20 2a 2a 20  s 4 bytes,.  ** 
b940: 62 75 74 20 74 68 61 74 20 73 68 6f 75 6c 64 20  but that should 
b950: 6e 6f 74 20 62 65 20 61 20 62 69 67 20 64 65 61  not be a big dea
b960: 6c 2e 20 2a 2f 0a 20 20 2f 2a 20 57 41 53 3a 20  l. */.  /* WAS: 
b970: 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 2a 2f   ino_t ino;   */
b980: 0a 20 20 75 36 34 20 69 6e 6f 3b 20 20 20 20 20  .  u64 ino;     
b990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b9a0: 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f   Inode number */
b9b0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
b9c0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
b9d0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
b9e0: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
b9f0: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f  cated for each o
ba00: 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f  pen.** inode.  O
ba10: 72 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61  r, on LinuxThrea
ba20: 64 73 2c 20 74 68 65 72 65 20 69 73 20 6f 6e 65  ds, there is one
ba30: 20 6f 66 20 74 68 65 73 65 20 73 74 72 75 63 74   of these struct
ba40: 75 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68  ures for.** each
ba50: 20 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62 79   inode opened by
ba60: 20 65 61 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a   each thread..**
ba70: 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f  .** A single ino
ba80: 64 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74  de can have mult
ba90: 69 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69  iple file descri
baa0: 70 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 75  ptors, so each u
bab0: 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63  nixFile.** struc
bac0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ture contains a 
bad0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
bae0: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f  stance of this o
baf0: 62 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a  bject and this.*
bb00: 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61  * object keeps a
bb10: 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75   count of the nu
bb20: 6d 62 65 72 20 6f 66 20 75 6e 69 78 46 69 6c 65  mber of unixFile
bb30: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e   pointing to it.
bb40: 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 49  .*/.struct unixI
bb50: 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72  nodeInfo {.  str
bb60: 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66  uct unixFileId f
bb70: 69 6c 65 49 64 3b 20 20 20 20 20 20 20 2f 2a 20  ileId;       /* 
bb80: 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a  The lookup key *
bb90: 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72 65 64 3b  /.  int nShared;
bba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbb0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bbc0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68 65   SHARED locks he
bbd0: 6c 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ld */.  unsigned
bbe0: 20 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b   char eFileLock;
bbf0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
bc00: 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52  f SHARED_LOCK, R
bc10: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63  ESERVED_LOCK etc
bc20: 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  . */.  unsigned 
bc30: 63 68 61 72 20 62 50 72 6f 63 65 73 73 4c 6f 63  char bProcessLoc
bc40: 6b 3b 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 63  k;     /* An exc
bc50: 6c 75 73 69 76 65 20 70 72 6f 63 65 73 73 20 6c  lusive process l
bc60: 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0a 20  ock is held */. 
bc70: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f   /* Number of po
bca0: 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20 73  inters to this s
bcb0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 75 6e  tructure */.  un
bcc0: 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
bcd0: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ode;          /*
bce0: 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61   Shared memory a
bcf0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
bd00: 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69  his inode */.  i
bd10: 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20  nt nLock;       
bd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bd30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73  * Number of outs
bd40: 74 61 6e 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63  tanding file loc
bd50: 6b 73 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  ks */.  UnixUnus
bd60: 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20  edFd *pUnused;  
bd70: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65          /* Unuse
bd80: 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
bd90: 72 73 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20  rs to close */. 
bda0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
bdb0: 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
bdc0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20   /* List of all 
bdd0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
bde0: 6a 65 63 74 73 20 2a 2f 0a 20 20 75 6e 69 78 49  jects */.  unixI
bdf0: 6e 6f 64 65 49 6e 66 6f 20 2a 70 50 72 65 76 3b  nodeInfo *pPrev;
be00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
be10: 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e   .... doubly lin
be20: 6b 65 64 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ked */.#if SQLIT
be30: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
be40: 5f 53 54 59 4c 45 0a 20 20 75 6e 73 69 67 6e 65  _STYLE.  unsigne
be50: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72  d long long shar
be60: 65 64 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20  edByte;  /* for 
be70: 41 46 50 20 73 69 6d 75 6c 61 74 65 64 20 73 68  AFP simulated sh
be80: 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e  ared lock */.#en
be90: 64 69 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  dif.#if OS_VXWOR
bea0: 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d  KS.  sem_t *pSem
beb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bec0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f       /* Named PO
bed0: 53 49 58 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f  SIX semaphore */
bee0: 0a 20 20 63 68 61 72 20 61 53 65 6d 4e 61 6d 65  .  char aSemName
bef0: 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d  [MAX_PATHNAME+2]
bf00: 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ;  /* Name of th
bf10: 61 74 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a  at semaphore */.
bf20: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
bf30: 20 41 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20   A lists of all 
bf40: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
bf50: 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  jects..*/.static
bf60: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
bf70: 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a  inodeList = 0;..
bf80: 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /*.**.** This fu
bf90: 6e 63 74 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67  nction - unixLog
bfa0: 45 72 72 6f 72 41 74 4c 69 6e 65 28 29 2c 20 69  ErrorAtLine(), i
bfb0: 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c  s only ever call
bfc0: 65 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f  ed via the macro
bfd0: 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  .** unixLogError
bfe0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  ()..**.** It is 
bff0: 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e  invoked after an
c000: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
c010: 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20   an OS function 
c020: 61 6e 64 20 65 72 72 6e 6f 20 68 61 73 20 62 65  and errno has be
c030: 65 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c 6f  en.** set. It lo
c040: 67 73 20 61 20 6d 65 73 73 61 67 65 20 75 73 69  gs a message usi
c050: 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  ng sqlite3_log()
c060: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
c070: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
c080: 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20 69  .** errno and, i
c090: 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20  f possible, the 
c0a0: 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65  human-readable e
c0b0: 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 73  quivalent from s
c0c0: 74 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a 20  trerror() or.** 
c0d0: 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a  strerror_r()..**
c0e0: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
c0f0: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
c100: 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c   the macro shoul
c110: 64 20 62 65 20 74 68 65 20 65 72 72 6f 72 20 63  d be the error c
c120: 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c  ode that.** will
c130: 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20   be returned to 
c140: 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c  SQLite (e.g. SQL
c150: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
c160: 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  , SQLITE_CANTOPE
c170: 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20  N). .** The two 
c180: 73 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d  subsequent argum
c190: 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74  ents should be t
c1a0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f  he name of the O
c1b0: 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a  S function that.
c1c0: 2a 2a 20 66 61 69 6c 65 64 20 28 65 2e 67 2e 20  ** failed (e.g. 
c1d0: 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e 22  "unlink", "open"
c1e0: 29 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69  ) and the associ
c1f0: 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d  ated file-system
c200: 20 70 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79   path,.** if any
c210: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69  ..*/.#define uni
c220: 78 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 29  xLogError(a,b,c)
c230: 20 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f       unixLogErro
c240: 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f  rAtLine(a,b,c,__
c250: 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69  LINE__).static i
c260: 6e 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41  nt unixLogErrorA
c270: 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72  tLine(.  int err
c280: 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  code,           
c290: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69           /* SQLi
c2a0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  te error code */
c2b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
c2c0: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Func,           
c2d0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53     /* Name of OS
c2e0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66   function that f
c2f0: 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ailed */.  const
c300: 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
c310: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
c320: 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74  le path associat
c330: 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f  ed with error */
c340: 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20  .  int iLine    
c350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c360: 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e     /* Source lin
c370: 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65  e number where e
c380: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f  rror occurred */
c390: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  .){.  char *zErr
c3a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c3b0: 20 20 20 20 20 20 2f 2a 20 4d 65 73 73 61 67 65        /* Message
c3c0: 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29   from strerror()
c3d0: 20 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 2a   or equivalent *
c3e0: 2f 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d  /.  int iErrno =
c3f0: 20 65 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20   errno;         
c400: 20 20 20 20 2f 2a 20 53 61 76 65 64 20 73 79 73      /* Saved sys
c410: 63 61 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65  call error numbe
c420: 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  r */..  /* If th
c430: 69 73 20 69 73 20 6e 6f 74 20 61 20 74 68 72 65  is is not a thre
c440: 61 64 73 61 66 65 20 62 75 69 6c 64 20 28 53 51  adsafe build (SQ
c450: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d  LITE_THREADSAFE=
c460: 3d 30 29 2c 20 74 68 65 6e 20 75 73 65 0a 20 20  =0), then use.  
c470: 2a 2a 20 74 68 65 20 73 74 72 65 72 72 6f 72 28  ** the strerror(
c480: 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62  ) function to ob
c490: 74 61 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72  tain the human-r
c4a0: 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 6d 65  eadable error me
c4b0: 73 73 61 67 65 0a 20 20 2a 2a 20 65 71 75 69 76  ssage.  ** equiv
c4c0: 61 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20  alent to errno. 
c4d0: 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 73  Otherwise, use s
c4e0: 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a  trerror_r()..  *
c4f0: 2f 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  / .#if SQLITE_TH
c500: 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69  READSAFE && defi
c510: 6e 65 64 28 48 41 56 45 5f 53 54 52 45 52 52 4f  ned(HAVE_STRERRO
c520: 52 5f 52 29 0a 20 20 63 68 61 72 20 61 45 72 72  R_R).  char aErr
c530: 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61  [80];.  memset(a
c540: 45 72 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  Err, 0, sizeof(a
c550: 45 72 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20  Err));.  zErr = 
c560: 61 45 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53  aErr;..  /* If S
c570: 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50  TRERROR_R_CHAR_P
c580: 20 28 73 65 74 20 62 79 20 61 75 74 6f 63 6f 6e   (set by autocon
c590: 66 20 73 63 72 69 70 74 73 29 20 6f 72 20 5f 5f  f scripts) or __
c5a0: 55 53 45 5f 47 4e 55 20 69 73 20 64 65 66 69 6e  USE_GNU is defin
c5b0: 65 64 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20  ed,.  ** assume 
c5c0: 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  that the system 
c5d0: 70 72 6f 76 69 64 65 73 20 74 68 65 20 47 4e 55  provides the GNU
c5e0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 74 72 65   version of stre
c5f0: 72 72 6f 72 5f 72 28 29 20 74 68 61 74 0a 20 20  rror_r() that.  
c600: 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  ** returns a poi
c610: 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72  nter to a buffer
c620: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
c630: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 54  error message. T
c640: 68 61 74 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a  hat pointer .  *
c650: 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61  * may point to a
c660: 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79  Err[], or it may
c670: 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73   point to some s
c680: 74 61 74 69 63 20 73 74 6f 72 61 67 65 20 73 6f  tatic storage so
c690: 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20 4f  mewhere. .  ** O
c6a0: 74 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65  therwise, assume
c6b0: 20 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d   that the system
c6c0: 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 50 4f   provides the PO
c6d0: 53 49 58 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a  SIX version of .
c6e0: 20 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28    ** strerror_r(
c6f0: 29 2c 20 77 68 69 63 68 20 61 6c 77 61 79 73 20  ), which always 
c700: 77 72 69 74 65 73 20 61 6e 20 65 72 72 6f 72 20  writes an error 
c710: 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 61 45 72  message into aEr
c720: 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  r[]..  **.  ** I
c730: 66 20 74 68 65 20 63 6f 64 65 20 69 6e 63 6f 72  f the code incor
c740: 72 65 63 74 6c 79 20 61 73 73 75 6d 65 73 20 74  rectly assumes t
c750: 68 61 74 20 69 74 20 69 73 20 74 68 65 20 50 4f  hat it is the PO
c760: 53 49 58 20 76 65 72 73 69 6f 6e 20 74 68 61 74  SIX version that
c770: 20 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62   is.  ** availab
c780: 6c 65 2c 20 74 68 65 20 65 72 72 6f 72 20 6d 65  le, the error me
c790: 73 73 61 67 65 20 77 69 6c 6c 20 6f 66 74 65 6e  ssage will often
c7a0: 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72   be an empty str
c7b0: 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a 20  ing. Not a.  ** 
c7c0: 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49 6e  huge problem. In
c7d0: 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c 75  correctly conclu
c7e0: 64 69 6e 67 20 74 68 61 74 20 74 68 65 20 47 4e  ding that the GN
c7f0: 55 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61  U version is ava
c800: 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 75  ilable .  ** cou
c810: 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 73 65 67  ld lead to a seg
c820: 66 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20 20  fault though..  
c830: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
c840: 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50  TRERROR_R_CHAR_P
c850: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 55  ) || defined(__U
c860: 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20 3d  SE_GNU).  zErr =
c870: 20 0a 23 20 65 6e 64 69 66 0a 20 20 73 74 72 65   .# endif.  stre
c880: 72 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20 61  rror_r(iErrno, a
c890: 45 72 72 2c 20 73 69 7a 65 6f 66 28 61 45 72 72  Err, sizeof(aErr
c8a0: 29 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51 4c  )-1);..#elif SQL
c8b0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20  ITE_THREADSAFE. 
c8c0: 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74 68   /* This is a th
c8d0: 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20  readsafe build, 
c8e0: 62 75 74 20 73 74 72 65 72 72 6f 72 5f 72 28 29  but strerror_r()
c8f0: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
c900: 65 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 22  e. */.  zErr = "
c910: 22 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f  ";.#else.  /* No
c920: 6e 2d 74 68 72 65 61 64 73 61 66 65 20 62 75 69  n-threadsafe bui
c930: 6c 64 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72  ld, use strerror
c940: 28 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20  (). */.  zErr = 
c950: 73 74 72 65 72 72 6f 72 28 69 45 72 72 6e 6f 29  strerror(iErrno)
c960: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
c970: 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68  zPath==0 ) zPath
c980: 20 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74 65 33   = "";.  sqlite3
c990: 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20  _log(errcode,.  
c9a0: 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a 25      "os_unix.c:%
c9b0: 64 3a 20 28 25 64 29 20 25 73 28 25 73 29 20 2d  d: (%d) %s(%s) -
c9c0: 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e   %s",.      iLin
c9d0: 65 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e 63  e, iErrno, zFunc
c9e0: 2c 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20 20  , zPath, zErr.  
c9f0: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72  );..  return err
ca00: 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  code;.}../*.** C
ca10: 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63  lose a file desc
ca20: 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65  riptor..**.** We
ca30: 20 61 73 73 75 6d 65 20 74 68 61 74 20 63 6c 6f   assume that clo
ca40: 73 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77 61  se() almost alwa
ca50: 79 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65 20  ys works, since 
ca60: 69 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61 0a  it is only in a.
ca70: 2a 2a 20 76 65 72 79 20 73 69 63 6b 20 61 70 70  ** very sick app
ca80: 6c 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20 61  lication or on a
ca90: 20 76 65 72 79 20 73 69 63 6b 20 70 6c 61 74 66   very sick platf
caa0: 6f 72 6d 20 74 68 61 74 20 69 74 20 6d 69 67 68  orm that it migh
cab0: 74 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69 74  t fail..** If it
cac0: 20 64 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d 70   does fail, simp
cad0: 6c 79 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65  ly leak the file
cae0: 20 64 65 73 63 72 69 70 74 6f 72 2c 20 62 75 74   descriptor, but
caf0: 20 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20 65   do log the.** e
cb00: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  rror..**.** Note
cb10: 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
cb20: 73 61 66 65 20 74 6f 20 72 65 74 72 79 20 63 6c  safe to retry cl
cb30: 6f 73 65 28 29 20 61 66 74 65 72 20 45 49 4e 54  ose() after EINT
cb40: 52 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 66  R since the.** f
cb50: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d  ile descriptor m
cb60: 69 67 68 74 20 68 61 76 65 20 61 6c 72 65 61 64  ight have alread
cb70: 79 20 62 65 65 6e 20 72 65 75 73 65 64 20 62 79  y been reused by
cb80: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 2e   another thread.
cb90: 0a 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74 20  .** So we don't 
cba0: 65 76 65 6e 20 74 72 79 20 74 6f 20 72 65 63 6f  even try to reco
cbb0: 76 65 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e 54  ver from an EINT
cbc0: 52 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74 68 65  R.  Just log the
cbd0: 20 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f   error.** and mo
cbe0: 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ve on..*/.static
cbf0: 20 76 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c 6f   void robust_clo
cc00: 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  se(unixFile *pFi
cc10: 6c 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20 6c  le, int h, int l
cc20: 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f 73  ineno){.  if( os
cc30: 43 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20 20 20  Close(h) ){.    
cc40: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69  unixLogErrorAtLi
cc50: 6e 65 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ne(SQLITE_IOERR_
cc60: 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c 0a  CLOSE, "close",.
cc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc80: 20 20 20 20 20 20 20 70 46 69 6c 65 20 3f 20 70         pFile ? p
cc90: 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30 2c  File->zPath : 0,
cca0: 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a   lineno);.  }.}.
ccb0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
ccc0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2e  File->lastErrno.
ccd0: 20 20 44 6f 20 74 68 69 73 20 69 6e 20 61 20 73    Do this in a s
cce0: 75 62 72 6f 75 74 69 6e 65 20 61 73 20 74 68 61  ubroutine as tha
ccf0: 74 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 61 20  t provides.** a 
cd00: 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65  convenient place
cd10: 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70   to set a breakp
cd20: 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
cd30: 76 6f 69 64 20 73 74 6f 72 65 4c 61 73 74 45 72  void storeLastEr
cd40: 72 6e 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  rno(unixFile *pF
cd50: 69 6c 65 2c 20 69 6e 74 20 65 72 72 6f 72 29 7b  ile, int error){
cd60: 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  .  pFile->lastEr
cd70: 72 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a 7d 0a 0a  rno = error;.}..
cd80: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
cd90: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
cda0: 20 61 63 63 75 6d 75 61 74 65 64 20 69 6e 20 74   accumuated in t
cdb0: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
cdc0: 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a  ->pUnused list..
cdd0: 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
cde0: 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
cdf0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
ce00: 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  {.  unixInodeInf
ce10: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
ce20: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69  e->pInode;.  Uni
ce30: 78 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20 20  xUnusedFd *p;.  
ce40: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e  UnixUnusedFd *pN
ce50: 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e  ext;.  for(p=pIn
ce60: 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b  ode->pUnused; p;
ce70: 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70   p=pNext){.    p
ce80: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
ce90: 0a 23 69 66 20 4f 53 43 4c 4f 53 45 5f 43 48 45  .#if OSCLOSE_CHE
cea0: 43 4b 5f 43 4c 4f 53 45 5f 49 4f 45 52 52 0a 20  CK_CLOSE_IOERR. 
ceb0: 20 20 20 69 66 28 20 63 6c 6f 73 65 28 70 2d 3e     if( close(p->
cec0: 66 64 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f  fd) ){.      sto
ced0: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
cee0: 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
cef0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
cf00: 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20  RR_CLOSE;.      
cf10: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 45 72 72 6f  p->pNext = pErro
cf20: 72 3b 0a 20 20 20 20 20 20 70 45 72 72 6f 72 20  r;.      pError 
cf30: 3d 20 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = p;.    }else{.
cf40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
cf50: 65 65 28 70 29 3b 0a 20 20 20 20 7d 0a 23 65 6c  ee(p);.    }.#el
cf60: 73 65 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  se.    robust_cl
cf70: 6f 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64  ose(pFile, p->fd
cf80: 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
cf90: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
cfa0: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70  ;.#endif.  }.  p
cfb0: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d  Inode->pUnused =
cfc0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c   0;.}../*.** Rel
cfd0: 65 61 73 65 20 61 20 75 6e 69 78 49 6e 6f 64 65  ease a unixInode
cfe0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70  Info structure p
cff0: 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61  reviously alloca
d000: 74 65 64 20 62 79 20 66 69 6e 64 49 6e 6f 64 65  ted by findInode
d010: 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  Info()..**.** Th
d020: 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20  e mutex entered 
d030: 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e  using the unixEn
d040: 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74  terMutex() funct
d050: 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ion must be held
d060: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75  .** when this fu
d070: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
d080: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d090: 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
d0a0: 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  o(unixFile *pFil
d0b0: 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e){.  unixInodeI
d0c0: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
d0d0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
d0e0: 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
d0f0: 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20  Held() );.  if( 
d100: 41 4c 57 41 59 53 28 70 49 6e 6f 64 65 29 20 29  ALWAYS(pInode) )
d110: 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52  {.    pInode->nR
d120: 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49  ef--;.    if( pI
d130: 6e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  node->nRef==0 ){
d140: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d150: 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d  Inode->pShmNode=
d160: 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73  =0 );.      clos
d170: 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
d180: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  e);.      if( pI
d190: 6e 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a 20  node->pPrev ){. 
d1a0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
d1b0: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e  Inode->pPrev->pN
d1c0: 65 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20  ext==pInode );. 
d1d0: 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70         pInode->p
d1e0: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 49  Prev->pNext = pI
d1f0: 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  node->pNext;.   
d200: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d210: 20 20 61 73 73 65 72 74 28 20 69 6e 6f 64 65 4c    assert( inodeL
d220: 69 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20  ist==pInode );. 
d230: 20 20 20 20 20 20 20 69 6e 6f 64 65 4c 69 73 74         inodeList
d240: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74   = pInode->pNext
d250: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d260: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  if( pInode->pNex
d270: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  t ){.        ass
d280: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  ert( pInode->pNe
d290: 78 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64  xt->pPrev==pInod
d2a0: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  e );.        pIn
d2b0: 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ode->pNext->pPre
d2c0: 76 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65  v = pInode->pPre
d2d0: 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  v;.      }.     
d2e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
d2f0: 6e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  node);.    }.  }
d300: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
d310: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
d320: 72 2c 20 6c 6f 63 61 74 65 20 74 68 65 20 75 6e  r, locate the un
d330: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
d340: 63 74 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72  ct that.** descr
d350: 69 62 65 73 20 74 68 61 74 20 66 69 6c 65 20 64  ibes that file d
d360: 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61  escriptor.  Crea
d370: 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
d380: 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a  necessary.  The.
d390: 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
d3a0: 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69  might be uniniti
d3b0: 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72  alized if an err
d3c0: 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  or occurs..**.**
d3d0: 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72   The mutex enter
d3e0: 65 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69  ed using the uni
d3f0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75  xEnterMutex() fu
d400: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68  nction must be h
d410: 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  eld.** when this
d420: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
d430: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  led..**.** Retur
d440: 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
d450: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
d460: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49  static int findI
d470: 6e 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78  nodeInfo(.  unix
d480: 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  File *pFile,    
d490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
d4a0: 69 78 20 66 69 6c 65 20 77 69 74 68 20 66 69 6c  ix file with fil
d4b0: 65 20 64 65 73 63 20 75 73 65 64 20 69 6e 20 74  e desc used in t
d4c0: 68 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78  he key */.  unix
d4d0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e  InodeInfo **ppIn
d4e0: 6f 64 65 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ode        /* Re
d4f0: 74 75 72 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f  turn the unixIno
d500: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65  deInfo object he
d510: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
d520: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
d530: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 73            /* Sys
d540: 74 65 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e 20  tem call return 
d550: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64  code */.  int fd
d560: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d570: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
d580: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
d590: 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73  for pFile */.  s
d5a0: 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64  truct unixFileId
d5b0: 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a   fileId;      /*
d5c0: 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20   Lookup key for 
d5d0: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
d5e0: 6f 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74  o */.  struct st
d5f0: 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20  at statbuf;     
d600: 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76        /* Low-lev
d610: 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74  el file informat
d620: 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ion */.  unixIno
d630: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
d640: 20 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64 69   0;     /* Candi
d650: 64 61 74 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e  date unixInodeIn
d660: 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20  fo object */..  
d670: 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
d680: 78 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a  xHeld() );..  /*
d690: 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69   Get low-level i
d6a0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
d6b0: 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77   the file that w
d6c0: 65 20 63 61 6e 20 75 73 65 64 20 74 6f 0a 20 20  e can used to.  
d6d0: 2a 2a 20 63 72 65 61 74 65 20 61 20 75 6e 69 71  ** create a uniq
d6e0: 75 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  ue name for the 
d6f0: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20  file..  */.  fd 
d700: 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63  = pFile->h;.  rc
d710: 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26   = osFstat(fd, &
d720: 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28 20  statbuf);.  if( 
d730: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 6f  rc!=0 ){.    sto
d740: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
d750: 65 2c 20 65 72 72 6e 6f 29 3b 0a 23 69 66 20 64  e, errno);.#if d
d760: 65 66 69 6e 65 64 28 45 4f 56 45 52 46 4c 4f 57  efined(EOVERFLOW
d770: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
d780: 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 29  ITE_DISABLE_LFS)
d790: 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
d7a0: 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52  lastErrno==EOVER
d7b0: 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20 53 51  FLOW ) return SQ
d7c0: 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64  LITE_NOLFS;.#end
d7d0: 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
d7e0: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a  LITE_IOERR;.  }.
d7f0: 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f  .#ifdef __APPLE_
d800: 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f  _.  /* On OS X o
d810: 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73  n an msdos files
d820: 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65  ystem, the inode
d830: 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70 6f 72   number is repor
d840: 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65  ted.  ** incorre
d850: 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69  ctly for zero-si
d860: 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65 20 74  ze files.  See t
d870: 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20 54 6f  icket #3260.  To
d880: 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e   work.  ** aroun
d890: 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28  d this problem (
d8a0: 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74 20 61  we consider it a
d8b0: 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f   bug in OS X, no
d8c0: 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77  t SQLite).  ** w
d8d0: 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65 61 73  e always increas
d8e0: 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  e the file size 
d8f0: 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e 67 20  to 1 by writing 
d900: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20  a single byte.  
d910: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63 63 65  ** prior to acce
d920: 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64 65 20  ssing the inode 
d930: 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e 65  number.  The one
d940: 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 69 73   byte written is
d950: 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49 20 27  .  ** an ASCII '
d960: 53 27 20 63 68 61 72 61 63 74 65 72 20 77 68 69  S' character whi
d970: 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e 73 20  ch also happens 
d980: 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20  to be the first 
d990: 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65  byte.  ** in the
d9a0: 20 68 65 61 64 65 72 20 6f 66 20 65 76 65 72 79   header of every
d9b0: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
d9c0: 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  .  In this way, 
d9d0: 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  if there.  ** is
d9e0: 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
d9f0: 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e 6f 74  n such that anot
da00: 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20 61  her thread has a
da10: 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64  lready populated
da20: 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
da30: 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
da40: 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20  base, no damage 
da50: 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  is done..  */.  
da60: 69 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f 73  if( statbuf.st_s
da70: 69 7a 65 3d 3d 30 20 26 26 20 28 70 46 69 6c 65  ize==0 && (pFile
da80: 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49  ->fsFlags & SQLI
da90: 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53  TE_FSFLAGS_IS_MS
daa0: 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20 20 64  DOS)!=0 ){.    d
dab0: 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28  o{ rc = osWrite(
dac0: 66 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d 77 68  fd, "S", 1); }wh
dad0: 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
dae0: 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20  no==EINTR );.   
daf0: 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a 20 20   if( rc!=1 ){.  
db00: 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
db10: 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
db20: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
db30: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
db40: 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73   }.    rc = osFs
db50: 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66  tat(fd, &statbuf
db60: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
db70: 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
db80: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
db90: 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65  errno);.      re
dba0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
dbb0: 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  R;.    }.  }.#en
dbc0: 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66  dif..  memset(&f
dbd0: 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66  ileId, 0, sizeof
dbe0: 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c  (fileId));.  fil
dbf0: 65 49 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75  eId.dev = statbu
dc00: 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53  f.st_dev;.#if OS
dc10: 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49  _VXWORKS.  fileI
dc20: 64 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70  d.pId = pFile->p
dc30: 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65  Id;.#else.  file
dc40: 49 64 2e 69 6e 6f 20 3d 20 28 75 36 34 29 73 74  Id.ino = (u64)st
dc50: 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65  atbuf.st_ino;.#e
dc60: 6e 64 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20  ndif.  pInode = 
dc70: 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69  inodeList;.  whi
dc80: 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 6d 65  le( pInode && me
dc90: 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70  mcmp(&fileId, &p
dca0: 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73  Inode->fileId, s
dcb0: 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29  izeof(fileId)) )
dcc0: 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70  {.    pInode = p
dcd0: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
dce0: 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d  }.  if( pInode==
dcf0: 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20  0 ){.    pInode 
dd00: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
dd10: 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f  64( sizeof(*pIno
dd20: 64 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  de) );.    if( p
dd30: 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Inode==0 ){.    
dd40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
dd50: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
dd60: 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 6e  }.    memset(pIn
dd70: 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ode, 0, sizeof(*
dd80: 70 49 6e 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65  pInode));.    me
dd90: 6d 63 70 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69  mcpy(&pInode->fi
dda0: 6c 65 49 64 2c 20 26 66 69 6c 65 49 64 2c 20 73  leId, &fileId, s
ddb0: 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a  izeof(fileId));.
ddc0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66      pInode->nRef
ddd0: 20 3d 20 31 3b 0a 20 20 20 20 70 49 6e 6f 64 65   = 1;.    pInode
dde0: 2d 3e 70 4e 65 78 74 20 3d 20 69 6e 6f 64 65 4c  ->pNext = inodeL
ddf0: 69 73 74 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  ist;.    pInode-
de00: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
de10: 69 66 28 20 69 6e 6f 64 65 4c 69 73 74 20 29 20  if( inodeList ) 
de20: 69 6e 6f 64 65 4c 69 73 74 2d 3e 70 50 72 65 76  inodeList->pPrev
de30: 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69   = pInode;.    i
de40: 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64  nodeList = pInod
de50: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
de60: 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a  pInode->nRef++;.
de70: 20 20 7d 0a 20 20 2a 70 70 49 6e 6f 64 65 20 3d    }.  *ppInode =
de80: 20 70 49 6e 6f 64 65 3b 0a 20 20 72 65 74 75 72   pInode;.  retur
de90: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
dea0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
deb0: 45 20 69 66 20 70 46 69 6c 65 20 68 61 73 20 62  E if pFile has b
dec0: 65 65 6e 20 72 65 6e 61 6d 65 64 20 6f 72 20 75  een renamed or u
ded0: 6e 6c 69 6e 6b 65 64 20 73 69 6e 63 65 20 69 74  nlinked since it
dee0: 20 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65   was first opene
def0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
df00: 20 66 69 6c 65 48 61 73 4d 6f 76 65 64 28 75 6e   fileHasMoved(un
df10: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
df20: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
df30: 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70   return pFile->p
df40: 49 6e 6f 64 65 21 3d 30 20 26 26 20 70 46 69 6c  Inode!=0 && pFil
df50: 65 2d 3e 70 49 64 21 3d 70 46 69 6c 65 2d 3e 70  e->pId!=pFile->p
df60: 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 70 49  Inode->fileId.pI
df70: 64 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63  d;.#else.  struc
df80: 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 72 65  t stat buf;.  re
df90: 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  turn pFile->pIno
dfa0: 64 65 21 3d 30 20 26 26 0a 20 20 20 20 20 20 28  de!=0 &&.      (
dfb0: 6f 73 53 74 61 74 28 70 46 69 6c 65 2d 3e 7a 50  osStat(pFile->zP
dfc0: 61 74 68 2c 20 26 62 75 66 29 21 3d 30 20 0a 20  ath, &buf)!=0 . 
dfd0: 20 20 20 20 20 20 20 20 7c 7c 20 28 75 36 34 29          || (u64)
dfe0: 62 75 66 2e 73 74 5f 69 6e 6f 21 3d 70 46 69 6c  buf.st_ino!=pFil
dff0: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  e->pInode->fileI
e000: 64 2e 69 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 7d  d.ino);.#endif.}
e010: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 61  .../*.** Check a
e020: 20 75 6e 69 78 46 69 6c 65 20 74 68 61 74 20 69   unixFile that i
e030: 73 20 61 20 64 61 74 61 62 61 73 65 2e 20 20 56  s a database.  V
e040: 65 72 69 66 79 20 74 68 65 20 66 6f 6c 6c 6f 77  erify the follow
e050: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 28 31 29 20 54  ing:.**.** (1) T
e060: 68 65 72 65 20 69 73 20 65 78 61 63 74 6c 79 20  here is exactly 
e070: 6f 6e 65 20 68 61 72 64 20 6c 69 6e 6b 20 6f 6e  one hard link on
e080: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 28 32 29   the file.** (2)
e090: 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   The file is not
e0a0: 20 61 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b   a symbolic link
e0b0: 0a 2a 2a 20 28 33 29 20 54 68 65 20 66 69 6c 65  .** (3) The file
e0c0: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 72 65   has not been re
e0d0: 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65  named or unlinke
e0e0: 64 0a 2a 2a 0a 2a 2a 20 49 73 73 75 65 20 73 71  d.**.** Issue sq
e0f0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
e100: 5f 57 41 52 4e 49 4e 47 2c 2e 2e 2e 29 20 6d 65  _WARNING,...) me
e110: 73 73 61 67 65 73 20 69 66 20 61 6e 79 74 68 69  ssages if anythi
e120: 6e 67 20 69 73 20 6e 6f 74 20 72 69 67 68 74 2e  ng is not right.
e130: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e140: 76 65 72 69 66 79 44 62 46 69 6c 65 28 75 6e 69  verifyDbFile(uni
e150: 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
e160: 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
e170: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  ;.  int rc;..  /
e180: 2a 20 54 68 65 73 65 20 76 65 72 69 66 69 63 61  * These verifica
e190: 74 69 6f 6e 73 20 6f 63 63 75 72 73 20 66 6f 72  tions occurs for
e1a0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
e1b0: 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 66 28  se only */.  if(
e1c0: 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
e1d0: 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c  s & UNIXFILE_NOL
e1e0: 4f 43 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  OCK ) return;.. 
e1f0: 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 70 46   rc = osFstat(pF
e200: 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20  ile->h, &buf);. 
e210: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
e220: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
e230: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 63  LITE_WARNING, "c
e240: 61 6e 6e 6f 74 20 66 73 74 61 74 20 64 62 20 66  annot fstat db f
e250: 69 6c 65 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e  ile %s", pFile->
e260: 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75  zPath);.    retu
e270: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62 75  rn;.  }.  if( bu
e280: 66 2e 73 74 5f 6e 6c 69 6e 6b 3d 3d 30 20 29 7b  f.st_nlink==0 ){
e290: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
e2a0: 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c  (SQLITE_WARNING,
e2b0: 20 22 66 69 6c 65 20 75 6e 6c 69 6e 6b 65 64 20   "file unlinked 
e2c0: 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73 22 2c  while open: %s",
e2d0: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
e2e0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
e2f0: 20 20 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69    if( buf.st_nli
e300: 6e 6b 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  nk>1 ){.    sqli
e310: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
e320: 41 52 4e 49 4e 47 2c 20 22 6d 75 6c 74 69 70 6c  ARNING, "multipl
e330: 65 20 6c 69 6e 6b 73 20 74 6f 20 66 69 6c 65 3a  e links to file:
e340: 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61   %s", pFile->zPa
e350: 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  th);.    return;
e360: 0a 20 20 7d 0a 20 20 69 66 28 20 66 69 6c 65 48  .  }.  if( fileH
e370: 61 73 4d 6f 76 65 64 28 70 46 69 6c 65 29 20 29  asMoved(pFile) )
e380: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
e390: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
e3a0: 2c 20 22 66 69 6c 65 20 72 65 6e 61 6d 65 64 20  , "file renamed 
e3b0: 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73 22 2c  while open: %s",
e3c0: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
e3d0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
e3e0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
e3f0: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
e400: 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
e410: 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
e420: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
e430: 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
e440: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
e450: 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
e460: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
e470: 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
e480: 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
e490: 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
e4a0: 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
e4b0: 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
e4c0: 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
e4d0: 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
e4e0: 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
e4f0: 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
e500: 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
e510: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
e520: 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
e530: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
e540: 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
e550: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
e560: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
e570: 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
e580: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
e590: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
e5a0: 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
e5b0: 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
e5c0: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
e5d0: 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a  SERVEDLOCK; );..
e5e0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
e5f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  );.  assert( pFi
e600: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  le->eFileLock<=S
e610: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
e620: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
e630: 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69  ; /* Because pFi
e640: 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
e650: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
e660: 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65  ads */..  /* Che
e670: 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
e680: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
e690: 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
e6a0: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
e6b0: 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
e6c0: 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
e6d0: 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
e6e0: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74   1;.  }..  /* Ot
e6f0: 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
e700: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
e710: 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f  s holds it..  */
e720: 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50  .#ifndef __DJGPP
e730: 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  __.  if( !reserv
e740: 65 64 20 26 26 20 21 70 46 69 6c 65 2d 3e 70 49  ed && !pFile->pI
e750: 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
e760: 63 6b 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  ck ){.    struct
e770: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20   flock lock;.   
e780: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
e790: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c   SEEK_SET;.    l
e7a0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
e7b0: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
e7c0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b   lock.l_len = 1;
e7d0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
e7e0: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20   = F_WRLCK;.    
e7f0: 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c  if( osFcntl(pFil
e800: 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  e->h, F_GETLK, &
e810: 6c 6f 63 6b 29 20 29 7b 0a 23 69 66 20 4f 53 4c  lock) ){.#if OSL
e820: 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53  OCKING_CHECK_BUS
e830: 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 69 6e  Y_IOERR.      in
e840: 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
e850: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
e860: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
e870: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
e880: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
e890: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a  KRESERVEDLOCK);.
e8a0: 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
e8b0: 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
e8c0: 6e 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  no);.#else.     
e8d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
e8e0: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
e8f0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72  LOCK;.      stor
e900: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
e910: 2c 20 65 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66  , errno);.#endif
e920: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20  .    } else if( 
e930: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55  lock.l_type!=F_U
e940: 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  NLCK ){.      re
e950: 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
e960: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  }.  }.#endif.  .
e970: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
e980: 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ();.  OSTRACE(("
e990: 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
e9a0: 25 64 20 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c  %d %d (unix)\n",
e9b0: 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
e9c0: 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70  eserved));..  *p
e9d0: 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
e9e0: 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
e9f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
ea00: 20 74 6f 20 73 65 74 20 61 20 73 79 73 74 65 6d   to set a system
ea10: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c  -lock on the fil
ea20: 65 20 70 46 69 6c 65 2e 20 20 54 68 65 20 6c 6f  e pFile.  The lo
ea30: 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73 63 72 69  ck is .** descri
ea40: 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a  bed by pLock..**
ea50: 0a 2a 2a 20 49 66 20 74 68 65 20 70 46 69 6c 65  .** If the pFile
ea60: 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64   was opened read
ea70: 2f 77 72 69 74 65 20 66 72 6f 6d 20 75 6e 69 78  /write from unix
ea80: 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74 68 65 20  -excl, then the 
ea90: 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65  only lock.** eve
eaa0: 72 20 6f 62 74 61 69 6e 65 64 20 69 73 20 61 6e  r obtained is an
eab0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c   exclusive lock,
eac0: 20 61 6e 64 20 69 74 20 69 73 20 6f 62 74 61 69   and it is obtai
ead0: 6e 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  ned exactly once
eae0: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 69  .** the first ti
eaf0: 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61  me any lock is a
eb00: 74 74 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73  ttempted.  All s
eb10: 75 62 73 65 71 75 65 6e 74 20 73 79 73 74 65 6d  ubsequent system
eb20: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72   locking.** oper
eb30: 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f  ations become no
eb40: 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f  -ops.  Locking o
eb50: 70 65 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20  perations still 
eb60: 68 61 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c  happen internall
eb70: 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  y,.** in order t
eb80: 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 61 63 63  o coordinate acc
eb90: 65 73 73 20 62 65 74 77 65 65 6e 20 73 65 70 61  ess between sepa
eba0: 72 61 74 65 20 64 61 74 61 62 61 73 65 20 63 6f  rate database co
ebb0: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74  nnections.** wit
ebc0: 68 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73  hin this process
ebd0: 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20 74 68 61  , but all of tha
ebe0: 74 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20  t is handled in 
ebf0: 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a  memory and the.*
ec00: 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
ec10: 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70 61 72 74  em does not part
ec20: 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54  icipate..**.** T
ec30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
ec40: 61 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 74  a pass-through t
ec50: 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 29  o fcntl(F_SETLK)
ec60: 20 69 66 20 70 46 69 6c 65 20 69 73 20 75 73 69   if pFile is usi
ec70: 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f 74  ng.** any VFS ot
ec80: 68 65 72 20 74 68 61 6e 20 22 75 6e 69 78 2d 65  her than "unix-e
ec90: 78 63 6c 22 20 6f 72 20 69 66 20 70 46 69 6c 65  xcl" or if pFile
eca0: 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22 75   is opened on "u
ecb0: 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e 64  nix-excl".** and
ecc0: 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a   is read-only..*
ecd0: 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74  *.** Zero is ret
ece0: 75 72 6e 65 64 20 69 66 20 74 68 65 20 63 61 6c  urned if the cal
ecf0: 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63  l completes succ
ed00: 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31 20  essfully, or -1 
ed10: 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20  if a call.** to 
ed20: 66 63 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20 49  fcntl() fails. I
ed30: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 65 72 72  n this case, err
ed40: 6e 6f 20 69 73 20 73 65 74 20 61 70 70 72 6f 70  no is set approp
ed50: 72 69 61 74 65 6c 79 20 28 62 79 20 66 63 6e 74  riately (by fcnt
ed60: 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  l())..*/.static 
ed70: 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  int unixFileLock
ed80: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
ed90: 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a  , struct flock *
eda0: 70 4c 6f 63 6b 2c 20 69 6e 74 20 6e 52 65 74 72  pLock, int nRetr
edb0: 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  y){.  int rc;.  
edc0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
edd0: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
ede0: 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
edf0: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
ee00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
ee10: 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20 69 66 28  node!=0 );.  if(
ee20: 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61   (pFile->ctrlFla
ee30: 67 73 20 26 20 28 55 4e 49 58 46 49 4c 45 5f 45  gs & (UNIXFILE_E
ee40: 58 43 4c 7c 55 4e 49 58 46 49 4c 45 5f 52 44 4f  XCL|UNIXFILE_RDO
ee50: 4e 4c 59 29 29 3d 3d 55 4e 49 58 46 49 4c 45 5f  NLY))==UNIXFILE_
ee60: 45 58 43 4c 20 29 7b 0a 20 20 20 20 69 66 28 20  EXCL ){.    if( 
ee70: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
ee80: 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
ee90: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
eea0: 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ck;.      assert
eeb0: 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d  ( pInode->nLock=
eec0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  =0 );.      lock
eed0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
eee0: 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  _SET;.      lock
eef0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
ef00: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c  D_FIRST;.      l
ef10: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
ef20: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c  ED_SIZE;.      l
ef30: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
ef40: 52 4c 43 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d  RLCK;.      rc =
ef50: 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   osFcntl(pFile->
ef60: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
ef70: 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  k);.      if( rc
ef80: 3c 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  <0 ) return rc;.
ef90: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 62 50        pInode->bP
efa0: 72 6f 63 65 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a  rocessLock = 1;.
efb0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
efc0: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  ock++;.    }else
efd0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  {.      rc = 0;.
efe0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
eff0: 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 20 20 20     int i = 0;   
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f010: 20 20 20 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b     .    for(;;){
f020: 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73 46 63  .      rc = osFc
f030: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
f040: 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29 3b 0a 20  SETLK, pLock);. 
f050: 20 20 20 20 20 69 66 28 20 72 63 20 26 26 20 6e       if( rc && n
f060: 52 65 74 72 79 2d 2d 20 29 7b 0a 20 20 20 20 20  Retry-- ){.     
f070: 20 20 20 75 73 6c 65 65 70 28 31 30 30 20 2a 20     usleep(100 * 
f080: 28 2b 2b 69 29 29 3b 0a 20 20 20 20 20 20 7d 65  (++i));.      }e
f090: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 72 65  lse{.        bre
f0a0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
f0b0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
f0c0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
f0d0: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
f0e0: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
f0f0: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
f100: 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
f110: 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
f120: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
f130: 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
f140: 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
f150: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
f160: 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
f170: 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
f180: 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
f190: 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
f1a0: 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
f1b0: 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
f1c0: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
f1d0: 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
f1e0: 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
f1f0: 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
f200: 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
f210: 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
f220: 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
f230: 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
f240: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
f250: 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
f260: 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
f270: 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
f280: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
f290: 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
f2a0: 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
f2b0: 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
f2c0: 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
f2d0: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
f2e0: 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
f2f0: 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
f300: 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
f310: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
f320: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
f330: 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
f340: 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
f350: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
f360: 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
f370: 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
f380: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
f390: 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
f3a0: 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
f3b0: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
f3c0: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
f3d0: 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
f3e0: 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
f3f0: 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71   int unixLock(sq
f400: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
f410: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
f420: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
f430: 6e 67 20 64 65 73 63 72 69 62 65 73 20 74 68 65  ng describes the
f440: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
f450: 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c  of the various l
f460: 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f  ocks and.  ** lo
f470: 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69  ck transitions i
f480: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50  n terms of the P
f490: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 73 68  OSIX advisory sh
f4a0: 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69  ared and exclusi
f4b0: 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69  ve.  ** lock pri
f4c0: 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20  mitives (called 
f4d0: 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77  read-locks and w
f4e0: 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77  rite-locks below
f4f0: 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20  , to avoid.  ** 
f500: 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53  confusion with S
f510: 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73  QLite lock names
f520: 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d  ). The algorithm
f530: 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65  s are complicate
f540: 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20  d.  ** slightly 
f550: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63  in order to be c
f560: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 57  ompatible with W
f570: 69 6e 64 6f 77 73 39 35 20 73 79 73 74 65 6d 73  indows95 systems
f580: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a   simultaneously.
f590: 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74    ** accessing t
f5a0: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
f5b0: 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74   file, in case t
f5c0: 68 61 74 20 69 73 20 65 76 65 72 20 72 65 71 75  hat is ever requ
f5d0: 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ired..  **.  ** 
f5e0: 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20  Symbols defined 
f5f0: 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66  in os.h indentif
f600: 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  y the 'pending b
f610: 79 74 65 27 20 61 6e 64 20 74 68 65 20 27 72 65  yte' and the 're
f620: 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65  served.  ** byte
f630: 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62  ', each single b
f640: 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f  ytes at well kno
f650: 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20  wn offsets, and 
f660: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
f670: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20  .  ** range', a 
f680: 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74  range of 510 byt
f690: 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f  es at a well kno
f6a0: 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a  wn offset..  **.
f6b0: 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61    ** To obtain a
f6c0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20   SHARED lock, a 
f6d0: 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74  read-lock is obt
f6e0: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65  ained on the 'pe
f6f0: 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27  nding.  ** byte'
f700: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73 75  .  If this is su
f710: 63 63 65 73 73 66 75 6c 2c 20 27 73 68 61 72 65  ccessful, 'share
f720: 64 20 62 79 74 65 20 72 61 6e 67 65 27 20 69 73  d byte range' is
f730: 20 72 65 61 64 2d 6c 6f 63 6b 65 64 0a 20 20 2a   read-locked.  *
f740: 2a 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  * and the lock o
f750: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  n the 'pending b
f760: 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 20 20  yte' released.  
f770: 28 4c 65 67 61 63 79 20 6e 6f 74 65 3a 20 20 57  (Legacy note:  W
f780: 68 65 6e 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20  hen.  ** SQLite 
f790: 77 61 73 20 66 69 72 73 74 20 64 65 76 65 6c 6f  was first develo
f7a0: 70 65 64 2c 20 57 69 6e 64 6f 77 73 39 35 20 73  ped, Windows95 s
f7b0: 79 73 74 65 6d 73 20 77 65 72 65 20 73 74 69 6c  ystems were stil
f7c0: 6c 20 76 65 72 79 20 63 6f 6d 6d 6f 6e 2c 0a 20  l very common,. 
f7d0: 20 2a 2a 20 61 6e 64 20 57 69 64 6e 6f 77 73 39   ** and Widnows9
f7e0: 35 20 6c 61 63 6b 73 20 61 20 73 68 61 72 65 64  5 lacks a shared
f7f0: 2d 6c 6f 63 6b 20 63 61 70 61 62 69 6c 69 74 79  -lock capability
f800: 2e 20 20 53 6f 20 6f 6e 20 57 69 6e 64 6f 77 73  .  So on Windows
f810: 39 35 2c 20 61 0a 20 20 2a 2a 20 73 69 6e 67 6c  95, a.  ** singl
f820: 65 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63  e randomly selec
f830: 74 65 64 20 62 79 20 66 72 6f 6d 20 74 68 65 20  ted by from the 
f840: 27 73 68 61 72 65 64 20 62 79 74 65 20 72 61 6e  'shared byte ran
f850: 67 65 27 20 69 73 20 6c 6f 63 6b 65 64 2e 0a 20  ge' is locked.. 
f860: 20 2a 2a 20 57 69 6e 64 6f 77 73 39 35 20 69 73   ** Windows95 is
f870: 20 6e 6f 77 20 70 72 65 74 74 79 20 6d 75 63 68   now pretty much
f880: 20 65 78 74 69 6e 63 74 2c 20 62 75 74 20 74 68   extinct, but th
f890: 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 66  is work-around f
f8a0: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6c 61 63 6b  or the.  ** lack
f8b0: 20 6f 66 20 73 68 61 72 65 64 2d 6c 6f 63 6b 73   of shared-locks
f8c0: 20 6f 6e 20 57 69 6e 64 6f 77 73 39 35 20 6c 69   on Windows95 li
f8d0: 76 65 73 20 6f 6e 2c 20 66 6f 72 20 62 61 63 6b  ves on, for back
f8e0: 77 61 72 64 73 0a 20 20 2a 2a 20 63 6f 6d 70 61  wards.  ** compa
f8f0: 74 69 62 69 6c 69 74 79 2e 29 0a 20 20 2a 2a 0a  tibility.).  **.
f900: 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d    ** A process m
f910: 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61  ay only obtain a
f920: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61   RESERVED lock a
f930: 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53 48  fter it has a SH
f940: 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ARED lock..  ** 
f950: 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  A RESERVED lock 
f960: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
f970: 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72 69  y grabbing a wri
f980: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  te-lock on the. 
f990: 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62 79   ** 'reserved by
f9a0: 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  te'. .  **.  ** 
f9b0: 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e  A process may on
f9c0: 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44  ly obtain a PEND
f9d0: 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69  ING lock after i
f9e0: 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61  t has obtained a
f9f0: 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63  .  ** SHARED loc
fa00: 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  k. A PENDING loc
fa10: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
fa20: 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   by obtaining a 
fa30: 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20  write-lock.  ** 
fa40: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
fa50: 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75  byte'. This ensu
fa60: 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20  res that no new 
fa70: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e  SHARED locks can
fa80: 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65   be.  ** obtaine
fa90: 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67 20  d, but existing 
faa0: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65  SHARED locks are
fab0: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73   allowed to pers
fac0: 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20  ist. A process. 
fad0: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76   ** does not hav
fae0: 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45  e to obtain a RE
faf0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
fb00: 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44  he way to a PEND
fb10: 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54  ING lock..  ** T
fb20: 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73 20  his property is 
fb30: 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f  used by the algo
fb40: 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e  rithm for rollin
fb50: 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  g back a journal
fb60: 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72   file.  ** after
fb70: 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20   a crash..  **. 
fb80: 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45   ** An EXCLUSIVE
fb90: 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20   lock, obtained 
fba0: 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20  after a PENDING 
fbb0: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73  lock is held, is
fbc0: 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65  .  ** implemente
fbd0: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
fbe0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
fbf0: 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72 65  he entire 'share
fc00: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
fc10: 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74  e'. Since all ot
fc20: 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72  her locks requir
fc30: 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  e a read-lock on
fc40: 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65   one of the byte
fc50: 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68  s.  ** within th
fc60: 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65  is range, this e
fc70: 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f  nsures that no o
fc80: 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68  ther locks are h
fc90: 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  eld on the.  ** 
fca0: 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2f 0a  database. .  */.
fcb0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
fcc0: 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
fcd0: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
fce0: 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
fcf0: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
fd00: 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
fd10: 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72   lock;.  int tEr
fd20: 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  rno = 0;..  asse
fd30: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
fd40: 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
fd50: 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73   %d %s was %s(%s
fd60: 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69  ,%d) pid=%d (uni
fd70: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
fd80: 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63  .      azFileLoc
fd90: 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a  k(eFileLock), az
fda0: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e  FileLock(pFile->
fdb0: 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20  eFileLock),.    
fdc0: 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69    azFileLock(pFi
fdd0: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
fde0: 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e 70  eLock), pFile->p
fdf0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a  Inode->nShared,.
fe00: 20 20 20 20 20 20 6f 73 47 65 74 70 69 64 28 30        osGetpid(0
fe10: 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  )));..  /* If th
fe20: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
fe30: 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
fe40: 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
fe50: 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
fe60: 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20  ** unixFile, do 
fe70: 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
fe80: 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a  se the end_lock:
fe90: 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
fea0: 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74   ** unixEnterMut
feb0: 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
fec0: 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
fed0: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
fee0: 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c  FileLock>=eFileL
fef0: 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ock ){.    OSTRA
ff00: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
ff10: 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68  %s ok (already h
ff20: 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20  eld) (unix)\n", 
ff30: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
ff40: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
ff50: 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20  (eFileLock)));. 
ff60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ff70: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
ff80: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
ff90: 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
ffa0: 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20   correct..  **  
ffb0: 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76  (1) We never mov
ffc0: 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20  e from unlocked 
ffd0: 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68  to anything high
ffe0: 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c  er than shared l
fff0: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53  ock..  **  (2) S
10000 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c  QLite never expl
10010 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20  icitly requests 
10020 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20  a pendig lock.. 
10030 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65   **  (3) A share
10040 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73  d lock is always
10050 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73   held when a res
10060 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71  erve lock is req
10070 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  uested..  */.  a
10080 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
10090 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b  ileLock!=NO_LOCK
100a0 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   || eFileLock==S
100b0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
100c0 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
100d0 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k!=PENDING_LOCK 
100e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
100f0 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44  leLock!=RESERVED
10100 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
10110 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
10120 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  D_LOCK );..  /* 
10130 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65  This mutex is ne
10140 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69  eded because pFi
10150 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
10160 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
10170 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ads.  */.  unixE
10180 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
10190 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
101a0 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  Inode;..  /* If 
101b0 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
101c0 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61  g this PID has a
101d0 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66   lock via a diff
101e0 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a  erent unixFile*.
101f0 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74    ** handle that
10200 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72   precludes the r
10210 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72  equested lock, r
10220 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f  eturn BUSY..  */
10230 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65  .  if( (pFile->e
10240 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65  FileLock!=pInode
10250 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a  ->eFileLock && .
10260 20 20 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64            (pInod
10270 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
10280 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46  NDING_LOCK || eF
10290 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
102a0 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  OCK)).  ){.    r
102b0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
102c0 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
102d0 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ck;.  }..  /* If
102e0 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
102f0 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64  s requested, and
10300 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
10310 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65  ng this PID alre
10320 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53  ady.  ** has a S
10330 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45  HARED or RESERVE
10340 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63  D lock, then inc
10350 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  rement reference
10360 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a   counts and.  **
10370 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10380 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  K..  */.  if( eF
10390 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
103a0 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28  LOCK && .      (
103b0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
103c0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
103d0 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  | pInode->eFileL
103e0 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
103f0 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  CK) ){.    asser
10400 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  t( eFileLock==SH
10410 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
10420 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
10430 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
10440 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
10450 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b  de->nShared>0 );
10460 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
10470 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
10480 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
10490 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20  >nShared++;.    
104a0 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
104b0 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
104c0 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41  ck;.  }...  /* A
104d0 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
104e0 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61   needed before a
104f0 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
10500 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72  D lock and befor
10510 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67  e.  ** acquiring
10520 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
10530 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41  ck.  For the SHA
10540 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45  RED lock, the PE
10550 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20  NDING will.  ** 
10560 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  be released..  *
10570 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  /.  lock.l_len =
10580 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68   1L;.  lock.l_wh
10590 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
105a0 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
105b0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20  ==SHARED_LOCK . 
105c0 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f       || (eFileLo
105d0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
105e0 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
105f0 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c  leLock<PENDING_L
10600 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f  OCK).  ){.    lo
10610 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46 69  ck.l_type = (eFi
10620 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
10630 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52  OCK?F_RDLCK:F_WR
10640 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  LCK);.    lock.l
10650 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
10660 5f 42 59 54 45 3b 0a 20 20 20 20 69 66 28 20 75  _BYTE;.    if( u
10670 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
10680 65 2c 20 26 6c 6f 63 6b 2c 20 30 29 20 29 7b 0a  e, &lock, 0) ){.
10690 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
106a0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
106b0 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
106c0 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
106d0 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
106e0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
106f0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
10700 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  c) ){.        st
10710 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
10720 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
10730 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
10740 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  end_lock;.    }.
10750 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f    }...  /* If co
10760 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68  ntrol gets to th
10770 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61  is point, then a
10780 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64  ctually go ahead
10790 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f   and make.  ** o
107a0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
107b0 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70  calls for the sp
107c0 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20  ecified lock..  
107d0 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
107e0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
107f0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
10800 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d  Inode->nShared==
10810 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
10820 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
10830 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ck==0 );.    ass
10840 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
10850 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f  OK );..    /* No
10860 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c  w get the read-l
10870 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e  ock */.    lock.
10880 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
10890 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b  _FIRST;.    lock
108a0 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
108b0 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20 75 6e  SIZE;.    if( un
108c0 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
108d0 2c 20 26 6c 6f 63 6b 2c 20 30 29 20 29 7b 0a 20  , &lock, 0) ){. 
108e0 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
108f0 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
10900 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
10910 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
10920 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
10930 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OCK);.    }..   
10940 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d   /* Drop the tem
10950 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c  porary PENDING l
10960 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e  ock */.    lock.
10970 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
10980 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  G_BYTE;.    lock
10990 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20  .l_len = 1L;.   
109a0 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
109b0 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20  _UNLCK;.    if( 
109c0 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
109d0 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 20 26  le, &lock, 10) &
109e0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
109f0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
10a00 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69   could happen wi
10a10 74 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75  th a network mou
10a20 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74 45 72 72  nt */.      tErr
10a30 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 20  no = errno;.#if 
10a40 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f  OSLOCKING_CHECK_
10a50 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20  BUSY_IOERR.     
10a60 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
10a70 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
10a80 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
10a90 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 23  OERR_UNLOCK); .#
10aa0 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20  else.      rc = 
10ab0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
10ac0 4f 43 4b 3b 20 0a 23 65 6e 64 69 66 0a 20 20 20  OCK; .#endif.   
10ad0 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 20 29   }..    if( rc )
10ae0 7b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c  {.      if( IS_L
10af0 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
10b00 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
10b10 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
10b20 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  Errno);.      }.
10b30 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c        goto end_l
10b40 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ock;.    }else{.
10b50 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
10b60 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
10b70 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  LOCK;.      pIno
10b80 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
10b90 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
10ba0 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
10bb0 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
10bc0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
10bd0 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e  OCK && pInode->n
10be0 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20  Shared>1 ){.    
10bf0 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
10c00 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
10c10 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
10c20 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
10c30 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72  s.    ** same pr
10c40 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
10c50 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
10c60 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20  lock. */.    rc 
10c70 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
10c80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
10c90 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66  he request was f
10ca0 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  or a RESERVED or
10cb0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
10cc0 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61    It is.    ** a
10cd0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72  ssumed that ther
10ce0 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72  e is a SHARED or
10cf0 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
10d00 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
10d10 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
10d20 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
10d30 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
10d40 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   );.    lock.l_t
10d50 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a  ype = F_WRLCK;..
10d60 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c      assert( eFil
10d70 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
10d80 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
10d90 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
10da0 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 65 46 69  K );.    if( eFi
10db0 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
10dc0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c  _LOCK ){.      l
10dd0 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
10de0 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
10df0 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
10e00 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1L;.    }else{. 
10e10 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
10e20 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
10e30 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ;.      lock.l_l
10e40 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
10e50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
10e60 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
10e70 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 30 29 20 29  ile, &lock, 0) )
10e80 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  {.      tErrno =
10e90 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
10ea0 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
10eb0 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
10ec0 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
10ed0 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
10ee0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55  f( rc!=SQLITE_BU
10ef0 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  SY ){.        st
10f00 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
10f10 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
10f20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
10f30 20 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   ..#ifdef SQLITE
10f40 5f 44 45 42 55 47 0a 20 20 2f 2a 20 53 65 74 20  _DEBUG.  /* Set 
10f50 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  up the transacti
10f60 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e 67  on-counter chang
10f70 65 20 63 68 65 63 6b 69 6e 67 20 66 6c 61 67 73  e checking flags
10f80 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73   when.  ** trans
10f90 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20  itioning from a 
10fa0 53 48 41 52 45 44 20 74 6f 20 61 20 52 45 53 45  SHARED to a RESE
10fb0 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20  RVED lock.  The 
10fc0 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d  change.  ** from
10fd0 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52   SHARED to RESER
10fe0 56 45 44 20 6d 61 72 6b 73 20 74 68 65 20 62 65  VED marks the be
10ff0 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72  ginning of a nor
11000 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f  mal.  ** write o
11010 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20  peration (not a 
11020 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot journal roll
11030 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  back)..  */.  if
11040 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  ( rc==SQLITE_OK.
11050 20 20 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69     && pFile->eFi
11060 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
11070 4f 43 4b 0a 20 20 20 26 26 20 65 46 69 6c 65 4c  OCK.   && eFileL
11080 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
11090 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46 69 6c  CK.  ){.    pFil
110a0 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  e->transCntrChng
110b0 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d   = 0;.    pFile-
110c0 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20  >dbUpdate = 0;. 
110d0 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d     pFile->inNorm
110e0 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d  alWrite = 1;.  }
110f0 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20  .#endif...  if( 
11100 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11110 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
11120 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
11130 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  k;.    pInode->e
11140 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
11150 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Lock;.  }else if
11160 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
11170 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
11180 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
11190 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ock = PENDING_LO
111a0 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
111b0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44  eFileLock = PEND
111c0 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65  ING_LOCK;.  }..e
111d0 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c  nd_lock:.  unixL
111e0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
111f0 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
11200 20 25 64 20 25 73 20 25 73 20 28 75 6e 69 78 29   %d %s %s (unix)
11210 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61  \n", pFile->h, a
11220 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
11230 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 72 63 3d  ock), .      rc=
11240 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
11250 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
11260 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11270 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 66 69  /*.** Add the fi
11280 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 75 73  le descriptor us
11290 65 64 20 62 79 20 66 69 6c 65 20 68 61 6e 64 6c  ed by file handl
112a0 65 20 70 46 69 6c 65 20 74 6f 20 74 68 65 20 63  e pFile to the c
112b0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
112c0 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f  pUnused list..*/
112d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
112e0 50 65 6e 64 69 6e 67 46 64 28 75 6e 69 78 46 69  PendingFd(unixFi
112f0 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e  le *pFile){.  un
11300 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
11310 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
11320 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65  ode;.  UnixUnuse
11330 64 46 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e  dFd *p = pFile->
11340 70 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70 4e  pUnused;.  p->pN
11350 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55  ext = pInode->pU
11360 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d  nused;.  pInode-
11370 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20  >pUnused = p;.  
11380 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  pFile->h = -1;. 
11390 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 20   pFile->pUnused 
113a0 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  = 0;.}../*.** Lo
113b0 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
113c0 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
113d0 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
113e0 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
113f0 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
11400 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
11410 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
11420 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
11430 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
11440 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
11450 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
11460 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
11470 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
11480 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
11490 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
114a0 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68 61  op..** .** If ha
114b0 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69 73  ndleNFSUnlock is
114c0 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20 64   true, then on d
114d0 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e 20 45 58  owngrading an EX
114e0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f 20  CLUSIVE_LOCK to 
114f0 53 48 41 52 45 44 0a 2a 2a 20 74 68 65 20 62 79  SHARED.** the by
11500 74 65 20 72 61 6e 67 65 20 69 73 20 64 69 76 69  te range is divi
11510 64 65 64 20 69 6e 74 6f 20 32 20 70 61 72 74 73  ded into 2 parts
11520 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 70   and the first p
11530 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20  art is unlocked 
11540 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20 61  then.** set to a
11550 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65 6e   read lock, then
11560 20 74 68 65 20 6f 74 68 65 72 20 70 61 72 74 20   the other part 
11570 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b  is simply unlock
11580 65 64 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20  ed.  This works 
11590 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62 75 67  .** around a bug
115a0 20 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63 6b   in BSD NFS lock
115b0 64 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e 20  d (also seen on 
115c0 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29 20 74 68  MacOSX 10.3+) th
115d0 61 74 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a 20  at fails to .** 
115e0 72 65 6d 6f 76 65 20 74 68 65 20 77 72 69 74 65  remove the write
115f0 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69 6f   lock on a regio
11600 6e 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f  n when a read lo
11610 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73 74  ck is set..*/.st
11620 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 55 6e  atic int posixUn
11630 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
11640 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
11650 4c 6f 63 6b 2c 20 69 6e 74 20 68 61 6e 64 6c 65  Lock, int handle
11660 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e  NFSUnlock){.  un
11670 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
11680 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
11690 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
116a0 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74  pInode;.  struct
116b0 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69   flock lock;.  i
116c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
116d0 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  K;..  assert( pF
116e0 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
116f0 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  (("UNLOCK  %d %d
11700 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70   was %d(%d,%d) p
11710 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c  id=%d (unix)\n",
11720 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
11730 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46 69 6c  Lock,.      pFil
11740 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46  e->eFileLock, pF
11750 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
11760 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
11770 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a  Inode->nShared,.
11780 20 20 20 20 20 20 6f 73 47 65 74 70 69 64 28 30        osGetpid(0
11790 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )));..  assert( 
117a0 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
117b0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  D_LOCK );.  if( 
117c0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
117d0 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  <=eFileLock ){. 
117e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
117f0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45  _OK;.  }.  unixE
11800 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
11810 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
11820 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
11830 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
11840 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
11850 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
11860 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
11870 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
11880 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c  >eFileLock==pFil
11890 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
118a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
118b0 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e  EBUG.    /* When
118c0 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b   reducing a lock
118d0 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72   such that other
118e0 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73   processes can s
118f0 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64  tart.    ** read
11900 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
11910 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b   file again, mak
11920 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a  e sure that the.
11930 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
11940 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75  on counter was u
11950 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61  pdated if any pa
11960 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
11970 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  se.    ** file c
11980 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20  hanged.  If the 
11990 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
119a0 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74  ter is not updat
119b0 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  ed,.    ** other
119c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20   connections to 
119d0 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69  the same file mi
119e0 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20  ght not realize 
119f0 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
11a00 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64  file has changed
11a10 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74   and hence might
11a20 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75   not know to flu
11a30 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20  sh their.    ** 
11a40 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20  cache.  The use 
11a50 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65  of a stale cache
11a60 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
11a70 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
11a80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 46 69  ..    */.    pFi
11a90 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
11aa0 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  e = 0;.#endif.. 
11ab0 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e     /* downgradin
11ac0 67 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f  g to a shared lo
11ad0 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76  ck on NFS involv
11ae0 65 73 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  es clearing the 
11af0 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a  write lock.    *
11b00 2a 20 62 65 66 6f 72 65 20 65 73 74 61 62 6c 69  * before establi
11b10 73 68 69 6e 67 20 74 68 65 20 72 65 61 64 6c 6f  shing the readlo
11b20 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20  ck - to avoid a 
11b30 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77  race condition w
11b40 65 20 64 6f 77 6e 67 72 61 64 65 0a 20 20 20 20  e downgrade.    
11b50 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32  ** the lock in 2
11b60 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74   blocks, so that
11b70 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e   part of the ran
11b80 67 65 20 77 69 6c 6c 20 62 65 20 63 6f 76 65 72  ge will be cover
11b90 65 64 20 62 79 20 61 20 0a 20 20 20 20 2a 2a 20  ed by a .    ** 
11ba0 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c  write lock until
11bb0 20 74 68 65 20 72 65 73 74 20 69 73 20 63 6f 76   the rest is cov
11bc0 65 72 65 64 20 62 79 20 61 20 72 65 61 64 20 6c  ered by a read l
11bd0 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20  ock:.    **  1: 
11be0 20 20 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a    [WWWWW].    **
11bf0 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20    2:   [....W]. 
11c00 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52     **  3:   [RRR
11c10 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20  RW].    **  4:  
11c20 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a   [RRRR.].    */.
11c30 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63      if( eFileLoc
11c40 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
11c50 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f  {.#if !defined(_
11c60 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53 51  _APPLE__) || !SQ
11c70 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
11c80 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20  ING_STYLE.      
11c90 28 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53 55  (void)handleNFSU
11ca0 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73  nlock;.      ass
11cb0 65 72 74 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e  ert( handleNFSUn
11cc0 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  lock==0 );.#endi
11cd0 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  f.#if defined(__
11ce0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
11cf0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
11d00 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69 66  G_STYLE.      if
11d10 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  ( handleNFSUnloc
11d20 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  k ){.        int
11d30 20 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20   tErrno;        
11d40 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
11d50 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65 6d  code from system
11d60 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a   call errors */.
11d70 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 64 69          off_t di
11d80 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44 5f 53  vSize = SHARED_S
11d90 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  IZE - 1;.       
11da0 20 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   .        lock.l
11db0 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
11dc0 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
11dd0 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
11de0 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
11df0 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
11e00 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20  _FIRST;.        
11e10 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76  lock.l_len = div
11e20 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
11e30 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
11e40 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29  File, &lock, 10)
11e50 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
11e60 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
11e70 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e  no;.#if OSLOCKIN
11e80 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45  G_CHECK_BUSY_IOE
11e90 52 52 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  RR.          rc 
11ea0 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
11eb0 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
11ec0 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
11ed0 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65 0a  _UNLOCK);.#else.
11ee0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
11ef0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
11f00 43 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  CK;.#endif.     
11f10 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
11f20 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
11f30 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  o);.          go
11f40 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
11f50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11f60 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
11f70 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _RDLCK;.        
11f80 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
11f90 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
11fa0 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
11fb0 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
11fc0 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
11fd0 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20  n = divSize;.   
11fe0 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
11ff0 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
12000 63 6b 2c 20 31 30 29 3d 3d 28 2d 31 29 20 29 7b  ck, 10)==(-1) ){
12010 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e  .          tErrn
12020 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 20 4f  o = errno;.#if O
12030 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42  SLOCKING_CHECK_B
12040 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20  USY_IOERR.      
12050 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
12060 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
12070 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
12080 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b  E_IOERR_RDLOCK);
12090 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20  .#else.         
120a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
120b0 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69  RR_UNLOCK;.#endi
120c0 66 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  f.          if( 
120d0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
120e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
120f0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
12100 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
12110 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12120 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
12130 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
12140 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
12150 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
12160 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77          lock.l_w
12170 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
12180 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
12190 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
121a0 46 49 52 53 54 2b 64 69 76 53 69 7a 65 3b 0a 20  FIRST+divSize;. 
121b0 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
121c0 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 2d  n = SHARED_SIZE-
121d0 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
121e0 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
121f0 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20  k(pFile, &lock, 
12200 31 30 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  10)==(-1) ){.   
12210 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
12220 65 72 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43  errno;.#if OSLOC
12230 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f  KING_CHECK_BUSY_
12240 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20  IOERR.          
12250 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
12260 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
12270 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
12280 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6c  ERR_UNLOCK);.#el
12290 73 65 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  se.          rc 
122a0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
122b0 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a 20 20  NLOCK;.#endif.  
122c0 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
122d0 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
122e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 6f  .            sto
122f0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
12300 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
12310 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12320 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
12330 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
12340 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
12350 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
12360 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
12370 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  e.#endif /* defi
12380 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
12390 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
123a0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
123b0 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
123c0 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
123d0 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _RDLCK;.        
123e0 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
123f0 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
12400 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
12410 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
12420 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
12430 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
12440 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69  .        if( uni
12450 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
12460 20 26 6c 6f 63 6b 2c 20 31 30 29 20 29 7b 0a 20   &lock, 10) ){. 
12470 20 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72           int tEr
12480 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66  rno = errno;.#if
12490 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b   OSLOCKING_CHECK
124a0 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20  _BUSY_IOERR.    
124b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
124c0 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
124d0 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
124e0 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
124f0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  );.#else.       
12500 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c     /* In theory,
12510 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 69   the call to uni
12520 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63 61 6e 6e  xFileLock() cann
12530 6f 74 20 66 61 69 6c 20 62 65 63 61 75 73 65 20  ot fail because 
12540 61 6e 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20  another.        
12550 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20    ** process is 
12560 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 63 6f 6d  holding an incom
12570 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e 20 49 66  patible lock. If
12580 20 69 74 20 64 6f 65 73 2c 20 74 68 69 73 20 0a   it does, this .
12590 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64            ** ind
125a0 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
125b0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
125c0 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   not following t
125d0 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20 20 20 20  he locking.     
125e0 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c       ** protocol
125f0 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
12600 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  s, return SQLITE
12610 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 2e 20 52  _IOERR_RDLOCK. R
12620 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20 20 20  eturning.       
12630 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53     ** SQLITE_BUS
12640 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75 73 65 20  Y would confuse 
12650 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
12660 28 69 6e 20 70 72 61 63 74 69 63 65 20 69 74 20  (in practice it 
12670 63 61 75 73 65 73 20 0a 20 20 20 20 20 20 20 20  causes .        
12680 20 20 2a 2a 20 61 6e 20 61 73 73 65 72 74 20 74    ** an assert t
12690 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a 20 20 20  o fail). */ .   
126a0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
126b0 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b  TE_IOERR_RDLOCK;
126c0 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65  .          store
126d0 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
126e0 20 74 45 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66   tErrno);.#endif
126f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49  .          if( I
12700 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
12710 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12720 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
12730 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
12740 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
12750 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
12760 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
12770 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12780 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
12790 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63  F_UNLCK;.    loc
127a0 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
127b0 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  K_SET;.    lock.
127c0 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
127d0 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  G_BYTE;.    lock
127e0 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73  .l_len = 2L;  as
127f0 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42 59  sert( PENDING_BY
12800 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f 42  TE+1==RESERVED_B
12810 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20 75  YTE );.    if( u
12820 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
12830 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d 30  e, &lock, 10)==0
12840 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65   ){.      pInode
12850 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
12860 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  ARED_LOCK;.    }
12870 65 6c 73 65 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b  else{.#if OSLOCK
12880 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49  ING_CHECK_BUSY_I
12890 4f 45 52 52 0a 20 20 20 20 20 20 74 45 72 72 6e  OERR.      tErrn
128a0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
128b0 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
128c0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
128d0 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
128e0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20  OERR_UNLOCK);.  
128f0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
12900 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
12910 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
12920 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
12930 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73  o);.      }.#els
12940 65 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  e.      rc = SQL
12950 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
12960 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  ;.      storeLas
12970 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
12980 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  rno);.#endif.   
12990 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
129a0 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ck;.    }.  }.  
129b0 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e  if( eFileLock==N
129c0 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a  O_LOCK ){.    /*
129d0 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73   Decrement the s
129e0 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74  hared lock count
129f0 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65  er.  Release the
12a00 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20   lock using an. 
12a10 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e     ** OS call on
12a20 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65  ly when all thre
12a30 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65  ads in this same
12a40 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65   process have re
12a50 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68  leased.    ** th
12a60 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  e lock..    */. 
12a70 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
12a80 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49  ed--;.    if( pI
12a90 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30  node->nShared==0
12aa0 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   ){.      lock.l
12ab0 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
12ac0 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  .      lock.l_wh
12ad0 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
12ae0 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
12af0 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  art = lock.l_len
12b00 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69 66 28   = 0L;.      if(
12b10 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
12b20 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 3d  ile, &lock, 10)=
12b30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  =0 ){.        pI
12b40 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
12b50 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
12b60 20 7d 65 6c 73 65 7b 0a 23 69 66 20 4f 53 4c 4f   }else{.#if OSLO
12b70 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59  CKING_CHECK_BUSY
12b80 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 74  _IOERR.        t
12b90 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
12ba0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12bb0 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
12bc0 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
12bd0 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
12be0 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  K);.        if( 
12bf0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
12c00 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
12c10 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
12c20 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
12c30 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20        }.#else.  
12c40 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
12c50 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
12c60 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
12c70 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
12c80 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  rno);.#endif.   
12c90 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
12ca0 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
12cb0 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
12cc0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
12cd0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOCK;.      }.  
12ce0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72    }..    /* Decr
12cf0 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20  ement the count 
12d00 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74  of locks against
12d10 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e   this same file.
12d20 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a    When the.    *
12d30 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  * count reaches 
12d40 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20  zero, close any 
12d50 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72  other file descr
12d60 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f  iptors whose clo
12d70 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65  se.    ** was de
12d80 66 65 72 72 65 64 20 62 65 63 61 75 73 65 20 6f  ferred because o
12d90 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  f outstanding lo
12da0 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  cks..    */.    
12db0 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b  pInode->nLock--;
12dc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
12dd0 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  ode->nLock>=0 );
12de0 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
12df0 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  >nLock==0 ){.   
12e00 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46     closePendingF
12e10 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d  ds(pFile);.    }
12e20 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63 6b  .  }..end_unlock
12e30 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
12e40 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ex();.  if( rc==
12e50 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c  SQLITE_OK ) pFil
12e60 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
12e70 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75  FileLock;.  retu
12e80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12e90 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
12ea0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
12eb0 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
12ec0 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
12ed0 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
12ee0 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
12ef0 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
12f00 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
12f10 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
12f20 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
12f30 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
12f40 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
12f50 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
12f60 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
12f70 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
12f80 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
12f90 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73  int unixUnlock(s
12fa0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
12fb0 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
12fc0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
12fd0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 61 73  MMAP_SIZE>0.  as
12fe0 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
12ff0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
13000 28 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 29  ((unixFile *)id)
13010 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29  ->nFetchOut==0 )
13020 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
13030 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64  n posixUnlock(id
13040 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b  , eFileLock, 0);
13050 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .}..#if SQLITE_M
13060 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73  AX_MMAP_SIZE>0.s
13070 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 61  tatic int unixMa
13080 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  pfile(unixFile *
13090 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65 29 3b  pFd, i64 nByte);
130a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
130b0 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78 46  xUnmapfile(unixF
130c0 69 6c 65 20 2a 70 46 64 29 3b 0a 23 65 6e 64 69  ile *pFd);.#endi
130d0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
130e0 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20  nction performs 
130f0 74 68 65 20 70 61 72 74 73 20 6f 66 20 74 68 65  the parts of the
13100 20 22 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70   "close file" op
13110 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d  eration .** comm
13120 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e  on to all lockin
13130 67 20 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c  g schemes. It cl
13140 6f 73 65 73 20 74 68 65 20 64 69 72 65 63 74 6f  oses the directo
13150 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68  ry and file.** h
13160 61 6e 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20  andles, if they 
13170 61 72 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73  are valid, and s
13180 65 74 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f  ets all fields o
13190 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a  f the unixFile.*
131a0 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 30  * structure to 0
131b0 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e  ..**.** It is *n
131c0 6f 74 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f  ot* necessary to
131d0 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 20   hold the mutex 
131e0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
131f0 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20  e is called,.** 
13200 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  even on VxWorks.
13210 20 20 41 20 6d 75 74 65 78 20 77 69 6c 6c 20 62    A mutex will b
13220 65 20 61 63 71 75 69 72 65 64 20 6f 6e 20 56 78  e acquired on Vx
13230 57 6f 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20  Works by the.** 
13240 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69  vxworksReleaseFi
13250 6c 65 49 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a  leId() routine..
13260 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
13270 6f 73 65 55 6e 69 78 46 69 6c 65 28 73 71 6c 69  oseUnixFile(sqli
13280 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
13290 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
132a0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
132b0 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
132c0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75  _MMAP_SIZE>0.  u
132d0 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 69  nixUnmapfile(pFi
132e0 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  le);.#endif.  if
132f0 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b  ( pFile->h>=0 ){
13300 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73  .    robust_clos
13310 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  e(pFile, pFile->
13320 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
13330 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b    pFile->h = -1;
13340 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f  .  }.#if OS_VXWO
13350 52 4b 53 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  RKS.  if( pFile-
13360 3e 70 49 64 20 29 7b 0a 20 20 20 20 69 66 28 20  >pId ){.    if( 
13370 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
13380 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45   & UNIXFILE_DELE
13390 54 45 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e  TE ){.      osUn
133a0 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d  link(pFile->pId-
133b0 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29  >zCanonicalName)
133c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 78 77 6f  ;.    }.    vxwo
133d0 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64  rksReleaseFileId
133e0 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20  (pFile->pId);.  
133f0 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30    pFile->pId = 0
13400 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ;.  }.#endif.#if
13410 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 4c 49 4e  def SQLITE_UNLIN
13420 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45 0a 20 20  K_AFTER_CLOSE.  
13430 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46  if( pFile->ctrlF
13440 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
13450 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6f 73  DELETE ){.    os
13460 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 7a 50  Unlink(pFile->zP
13470 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ath);.    sqlite
13480 33 5f 66 72 65 65 28 2a 28 63 68 61 72 2a 2a 29  3_free(*(char**)
13490 26 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a  &pFile->zPath);.
134a0 20 20 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68      pFile->zPath
134b0 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
134c0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f  .  OSTRACE(("CLO
134d0 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46  SE   %-3d\n", pF
134e0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e  ile->h));.  Open
134f0 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73  Counter(-1);.  s
13500 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
13510 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 6d  e->pUnused);.  m
13520 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20  emset(pFile, 0, 
13530 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
13540 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
13550 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
13560 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f  Close a file..*/
13570 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
13580 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
13590 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72  le *id){.  int r
135a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
135b0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
135c0 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69   = (unixFile *)i
135d0 64 3b 0a 20 20 76 65 72 69 66 79 44 62 46 69 6c  d;.  verifyDbFil
135e0 65 28 70 46 69 6c 65 29 3b 0a 20 20 75 6e 69 78  e(pFile);.  unix
135f0 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
13600 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  CK);.  unixEnter
13610 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 75  Mutex();..  /* u
13620 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64 65 20 69  nixFile.pInode i
13630 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 68  s always valid h
13640 65 72 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ere. Otherwise, 
13650 61 20 64 69 66 66 65 72 65 6e 74 20 63 6c 6f 73  a different clos
13660 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 28  e.  ** routine (
13670 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65  e.g. nolockClose
13680 28 29 29 20 77 6f 75 6c 64 20 62 65 20 63 61 6c  ()) would be cal
13690 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a  led instead..  *
136a0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
136b0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  e->pInode->nLock
136c0 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 49 6e  >0 || pFile->pIn
136d0 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
136e0 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 41 4c  k==0 );.  if( AL
136f0 57 41 59 53 28 70 46 69 6c 65 2d 3e 70 49 6e 6f  WAYS(pFile->pIno
13700 64 65 29 20 26 26 20 70 46 69 6c 65 2d 3e 70 49  de) && pFile->pI
13710 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20  node->nLock ){. 
13720 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
13730 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
13740 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
13750 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
13760 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a  file just.    **
13770 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61   yet because tha
13780 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68  t would clear th
13790 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74  ose locks.  Inst
137a0 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c  ead, add the fil
137b0 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70  e.    ** descrip
137c0 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70  tor to pInode->p
137d0 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20 49 74  Unused list.  It
137e0 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
137f0 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20  ically closed . 
13800 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c     ** when the l
13810 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
13820 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
13830 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69  setPendingFd(pFi
13840 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  le);.  }.  relea
13850 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c  seInodeInfo(pFil
13860 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65  e);.  rc = close
13870 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
13880 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
13890 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
138a0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
138b0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70 6f 73  * End of the pos
138c0 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix advisory lock
138d0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
138e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
138f0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
13900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13940 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
13950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13990 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
139a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
139b0 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20  * No-op Locking 
139c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
139d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
139e0 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20  **.**.** Of the 
139f0 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20  various locking 
13a00 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
13a10 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20  available, this 
13a20 69 73 20 62 79 20 66 61 72 20 74 68 65 0a 2a 2a  is by far the.**
13a30 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b   simplest:  lock
13a40 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ing is ignored. 
13a50 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d   No attempt is m
13a60 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  ade to lock the 
13a70 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
13a80 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
13a90 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  writing..**.** T
13aa0 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  his locking mode
13ab0 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
13ac0 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61 64 2d  for use on read-
13ad0 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73 0a 2a  only databases.*
13ae0 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73 65 73  * (ex: databases
13af0 20 74 68 61 74 20 61 72 65 20 62 75 72 6e 65 64   that are burned
13b00 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f   into CD-ROM, fo
13b10 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49 74 20  r example.)  It 
13b20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75  can.** also be u
13b30 73 65 64 20 69 66 20 74 68 65 20 61 70 70 6c 69  sed if the appli
13b40 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73  cation employs s
13b50 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d 65 63  ome external mec
13b60 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65  hanism to.** pre
13b70 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75  vent simultaneou
13b80 73 20 61 63 63 65 73 73 20 6f 66 20 74 68 65 20  s access of the 
13b90 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 62 79  same database by
13ba0 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   two or more.** 
13bb0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
13bc0 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65 72 65  ions.  But there
13bd0 20 69 73 20 61 20 73 65 72 69 6f 75 73 20 72 69   is a serious ri
13be0 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 0a 2a  sk of database.*
13bf0 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 66 20  * corruption if 
13c00 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  this locking mod
13c10 65 20 69 73 20 75 73 65 64 20 69 6e 20 73 69 74  e is used in sit
13c20 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 75  uations where mu
13c30 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61  ltiple.** databa
13c40 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  se connections a
13c50 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  re accessing the
13c60 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
13c70 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 0a  ile at the same.
13c80 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20  ** time and one 
13c90 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65  or more of those
13ca0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
13cb0 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74   writing..*/..st
13cc0 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43  atic int nolockC
13cd0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
13ce0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e  (sqlite3_file *N
13cf0 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a 70 52 65  otUsed, int *pRe
13d00 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sOut){.  UNUSED_
13d10 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
13d20 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  d);.  *pResOut =
13d30 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
13d40 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63  ITE_OK;.}.static
13d50 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28   int nolockLock(
13d60 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
13d70 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73  tUsed, int NotUs
13d80 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
13d90 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
13da0 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
13db0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13dc0 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  ;.}.static int n
13dd0 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69  olockUnlock(sqli
13de0 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
13df0 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29  d, int NotUsed2)
13e00 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
13e10 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
13e20 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
13e30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
13e40 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
13e50 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
13e60 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65   int nolockClose
13e70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
13e80 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  d) {.  int rc = 
13e90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
13ea0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
13eb0 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20  unixFile *)id;. 
13ec0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
13ed0 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
13ee0 70 49 6e 6f 64 65 20 29 7b 20 20 0a 20 20 20 20  pInode ){  .    
13ef0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
13f00 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c  Inode->nLock>0 |
13f10 7c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  | pFile->pInode-
13f20 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
13f30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c   );.    if( pFil
13f40 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  e->pInode->nLock
13f50 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
13f60 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
13f70 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20  nding locks, do 
13f80 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f  not actually clo
13f90 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74  se the file just
13fa0 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20 62 65  .      ** yet be
13fb0 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64  cause that would
13fc0 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63   clear those loc
13fd0 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64  ks.  Instead, ad
13fe0 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20  d the file.     
13ff0 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74   ** descriptor t
14000 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  o pInode->pUnuse
14010 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c  d list.  It will
14020 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
14030 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20 20 20  y closed .      
14040 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ** when the last
14050 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64   lock is cleared
14060 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14070 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46   setPendingFd(pF
14080 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ile);.    }.    
14090 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f  releaseInodeInfo
140a0 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72  (pFile);.  }.  r
140b0 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
140c0 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61  e(id);.  unixLea
140d0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
140e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  urn rc;.}../****
140f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
14100 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70  End of the no-op
14110 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
14120 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
14130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
14140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
14190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
141a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
141b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
141c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
141d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
141e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
141f0 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f 74 2d  ***** Begin dot-
14200 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  file Locking ***
14210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
14230 2a 20 54 68 65 20 64 6f 74 66 69 6c 65 20 6c 6f  * The dotfile lo
14240 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61  cking implementa
14250 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 65 78  tion uses the ex
14260 69 73 74 65 6e 63 65 20 6f 66 20 73 65 70 61 72  istence of separ
14270 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65  ate lock.** file
14280 73 20 28 72 65 61 6c 6c 79 20 61 20 64 69 72 65  s (really a dire
14290 63 74 6f 72 79 29 20 74 6f 20 63 6f 6e 74 72 6f  ctory) to contro
142a0 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20  l access to the 
142b0 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
142c0 77 6f 72 6b 73 0a 2a 2a 20 6f 6e 20 6a 75 73 74  works.** on just
142d0 20 61 62 6f 75 74 20 65 76 65 72 79 20 66 69 6c   about every fil
142e0 65 73 79 73 74 65 6d 20 69 6d 61 67 69 6e 61 62  esystem imaginab
142f0 6c 65 2e 20 20 42 75 74 20 74 68 65 72 65 20 61  le.  But there a
14300 72 65 20 73 65 72 69 6f 75 73 20 64 6f 77 6e 73  re serious downs
14310 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ides:.**.**    (
14320 31 29 20 20 54 68 65 72 65 20 69 73 20 7a 65 72  1)  There is zer
14330 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e 20 20  o concurrency.  
14340 41 20 73 69 6e 67 6c 65 20 72 65 61 64 65 72 20  A single reader 
14350 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68 65 72  blocks all other
14360 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 6e  .**         conn
14370 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72 65 61  ections from rea
14380 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
14390 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
143a0 0a 2a 2a 20 20 20 20 28 32 29 20 20 41 6e 20 61  .**    (2)  An a
143b0 70 70 6c 69 63 61 74 69 6f 6e 20 63 72 61 73 68  pplication crash
143c0 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73 20 63   or power loss c
143d0 61 6e 20 6c 65 61 76 65 20 73 74 61 6c 65 20 6c  an leave stale l
143e0 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20 20 20  ock files.**    
143f0 20 20 20 20 20 73 69 74 74 69 6e 67 20 61 72 6f       sitting aro
14400 75 6e 64 20 74 68 61 74 20 6e 65 65 64 20 74 6f  und that need to
14410 20 62 65 20 63 6c 65 61 72 65 64 20 6d 61 6e 75   be cleared manu
14420 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65  ally..**.** Neve
14430 72 74 68 65 6c 65 73 73 2c 20 61 20 64 6f 74 6c  rtheless, a dotl
14440 6f 63 6b 20 69 73 20 61 6e 20 61 70 70 72 6f 70  ock is an approp
14450 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f  riate locking mo
14460 64 65 20 66 6f 72 20 75 73 65 20 69 66 20 6e 6f  de for use if no
14470 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  .** other lockin
14480 67 20 73 74 72 61 74 65 67 79 20 69 73 20 61 76  g strategy is av
14490 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44  ailable..**.** D
144a0 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 77  otfile locking w
144b0 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69 6e 67  orks by creating
144c0 20 61 20 73 75 62 64 69 72 65 63 74 6f 72 79 20   a subdirectory 
144d0 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65  in the same dire
144e0 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68 65 20  ctory as.** the 
144f0 64 61 74 61 62 61 73 65 20 61 6e 64 20 77 69 74  database and wit
14500 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  h the same name 
14510 62 75 74 20 77 69 74 68 20 61 20 22 2e 6c 6f 63  but with a ".loc
14520 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20 61 64 64  k" extension add
14530 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69 73 74  ed..** The exist
14540 65 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b 20 64  ence of a lock d
14550 69 72 65 63 74 6f 72 79 20 69 6d 70 6c 69 65 73  irectory implies
14560 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
14570 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72 0a 2a  ck.  All other.*
14580 2a 20 6c 6f 63 6b 20 74 79 70 65 73 20 28 53 48  * lock types (SH
14590 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20  ARED, RESERVED, 
145a0 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d 61 70  PENDING) are map
145b0 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55 53 49  ped into EXCLUSI
145c0 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  VE..*/../*.** Th
145d0 65 20 66 69 6c 65 20 73 75 66 66 69 78 20 61 64  e file suffix ad
145e0 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 20  ded to the data 
145f0 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 69 6e  base filename in
14600 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65   order to create
14610 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 64 69 72   the.** lock dir
14620 65 63 74 6f 72 79 2e 0a 2a 2f 0a 23 64 65 66 69  ectory..*/.#defi
14630 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49  ne DOTLOCK_SUFFI
14640 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a  X ".lock"../*.**
14650 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
14660 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
14670 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
14680 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
14690 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
146a0 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
146b0 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
146c0 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
146d0 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
146e0 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
146f0 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
14700 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
14710 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
14720 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
14730 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
14740 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
14750 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
14760 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
14770 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64  king..**.** In d
14780 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20  otfile locking, 
14790 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20 65 78  either a lock ex
147a0 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65 73 20  ists or it does 
147b0 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68 69 73  not.  So in this
147c0 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f 66  .** variation of
147d0 20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f   CheckReservedLo
147e0 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74 20 69  ck(), *pResOut i
147f0 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66  s set to true if
14800 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20   any lock.** is 
14810 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
14820 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68   and false if th
14830 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
14840 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
14850 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65  t dotlockCheckRe
14860 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
14870 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
14880 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69   *pResOut) {.  i
14890 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
148a0 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
148b0 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
148c0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
148d0 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
148e0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
148f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
14900 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
14910 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
14920 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
14930 72 65 73 65 72 76 65 64 20 3d 20 6f 73 41 63 63  reserved = osAcc
14940 65 73 73 28 28 63 6f 6e 73 74 20 63 68 61 72 2a  ess((const char*
14950 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
14960 6f 6e 74 65 78 74 2c 20 30 29 3d 3d 30 3b 0a 20  ontext, 0)==0;. 
14970 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
14980 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
14990 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70   (dotlock)\n", p
149a0 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
149b0 65 72 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73  erved));.  *pRes
149c0 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
149d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
149e0 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
149f0 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
14a00 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
14a10 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
14a20 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
14a30 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
14a40 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
14a50 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
14a60 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
14a70 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
14a80 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
14a90 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
14aa0 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
14ab0 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
14ac0 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
14ad0 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
14ae0 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
14af0 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
14b00 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
14b10 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
14b20 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
14b30 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
14b40 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
14b50 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
14b60 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
14b70 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
14b80 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
14b90 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
14ba0 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
14bb0 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
14bc0 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
14bd0 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
14be0 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
14bf0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
14c00 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
14c10 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
14c20 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
14c30 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
14c40 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
14c50 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
14c60 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
14c70 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
14c80 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
14c90 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
14ca0 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
14cb0 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
14cc0 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
14cd0 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
14ce0 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
14cf0 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
14d00 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66  .**.** With dotf
14d10 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20  ile locking, we 
14d20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70  really only supp
14d30 6f 72 74 20 73 74 61 74 65 20 28 34 29 3a 20 45  ort state (4): E
14d40 58 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74  XCLUSIVE..** But
14d50 20 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74   we track the ot
14d60 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  her locking leve
14d70 6c 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a  ls internally..*
14d80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
14d90 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
14da0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
14db0 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
14dc0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
14dd0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
14de0 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
14df0 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65   = (char *)pFile
14e00 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
14e10 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
14e20 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49  ITE_OK;...  /* I
14e30 66 20 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f  f we have any lo
14e40 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63  ck, then the loc
14e50 6b 20 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65  k file already e
14e60 78 69 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68  xists.  All we h
14e70 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69  ave.  ** to do i
14e80 73 20 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74  s adjust our int
14e90 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20  ernal record of 
14ea0 74 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a  the lock level..
14eb0 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
14ec0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f  ->eFileLock > NO
14ed0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
14ee0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
14ef0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f  eFileLock;.    /
14f00 2a 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20  * Always update 
14f10 74 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e  the timestamp on
14f20 20 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f   the old file */
14f30 0a 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49  .#ifdef HAVE_UTI
14f40 4d 45 0a 20 20 20 20 75 74 69 6d 65 28 7a 4c 6f  ME.    utime(zLo
14f50 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23  ckFile, NULL);.#
14f60 65 6c 73 65 0a 20 20 20 20 75 74 69 6d 65 73 28  else.    utimes(
14f70 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29  zLockFile, NULL)
14f80 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
14f90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14fa0 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20   }.  .  /* grab 
14fb0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
14fc0 6b 20 2a 2f 0a 20 20 72 63 20 3d 20 6f 73 4d 6b  k */.  rc = osMk
14fd0 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30  dir(zLockFile, 0
14fe0 37 37 37 29 3b 0a 20 20 69 66 28 20 72 63 3c 30  777);.  if( rc<0
14ff0 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65   ){.    /* faile
15000 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65  d to open/create
15010 20 74 68 65 20 6c 6f 63 6b 20 64 69 72 65 63 74   the lock direct
15020 6f 72 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74  ory */.    int t
15030 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
15040 20 20 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d     if( EEXIST ==
15050 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20   tErrno ){.     
15060 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
15070 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  Y;.    } else {.
15080 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
15090 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
150a0 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
150b0 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
150c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
150d0 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
150e0 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
150f0 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
15100 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  no);.      }.   
15110 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
15120 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f 2a 20 67  ;.  } .  .  /* g
15130 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
15140 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
15150 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46  k */.  pFile->eF
15160 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
15170 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ock;.  return rc
15180 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
15190 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
151a0 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
151b0 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
151c0 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
151d0 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
151e0 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
151f0 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
15200 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
15210 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
15220 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
15230 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
15240 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
15250 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
15260 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
15270 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
15280 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  .**.** When the 
15290 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65  locking level re
152a0 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64  aches NO_LOCK, d
152b0 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66  elete the lock f
152c0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
152d0 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b  nt dotlockUnlock
152e0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
152f0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
15300 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
15310 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
15320 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a  e*)id;.  char *z
15330 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
15340 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
15350 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20  gContext;.  int 
15360 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  rc;..  assert( p
15370 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
15380 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
15390 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20  d was %d pid=%d 
153a0 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  (dotlock)\n", pF
153b0 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
153c0 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  k,.           pF
153d0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
153e0 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20  osGetpid(0)));. 
153f0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
15400 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
15410 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
15420 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
15430 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
15440 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63  leLock==eFileLoc
15450 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
15460 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
15470 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64    /* To downgrad
15480 65 20 74 6f 20 73 68 61 72 65 64 2c 20 73 69 6d  e to shared, sim
15490 70 6c 79 20 75 70 64 61 74 65 20 6f 75 72 20 69  ply update our i
154a0 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f  nternal notion o
154b0 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20  f the.  ** lock 
154c0 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20  state.  No need 
154d0 74 6f 20 6d 65 73 73 20 77 69 74 68 20 74 68 65  to mess with the
154e0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20   file on disk.. 
154f0 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
15500 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
15510 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
15520 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
15530 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75  D_LOCK;.    retu
15540 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
15550 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75 6c  }.  .  /* To ful
15560 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ly unlock the da
15570 74 61 62 61 73 65 2c 20 64 65 6c 65 74 65 20 74  tabase, delete t
15580 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a  he lock file */.
15590 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
155a0 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a  ock==NO_LOCK );.
155b0 20 20 72 63 20 3d 20 6f 73 52 6d 64 69 72 28 7a    rc = osRmdir(z
155c0 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66 28  LockFile);.  if(
155d0 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 69 6e 74   rc<0 ){.    int
155e0 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
155f0 0a 20 20 20 20 69 66 28 20 74 45 72 72 6e 6f 3d  .    if( tErrno=
15600 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20  =ENOENT ){.     
15610 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15620 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 20  .    }else{.#if 
15630 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f  OSLOCKING_CHECK_
15640 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20  BUSY_IOERR.     
15650 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
15660 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
15670 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
15680 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65  OERR_UNLOCK);.#e
15690 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 53  lse.      rc = S
156a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
156b0 43 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  CK;.#endif.     
156c0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
156d0 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
156e0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
156f0 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c   rc; .  }.  pFil
15700 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
15710 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e  O_LOCK;.  return
15720 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
15730 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
15740 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  e.  Make sure th
15750 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  e lock has been 
15760 72 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20  released before 
15770 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  closing..*/.stat
15780 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c  ic int dotlockCl
15790 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
157a0 20 2a 69 64 29 20 7b 0a 20 20 75 6e 69 78 46 69   *id) {.  unixFi
157b0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
157c0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73  xFile*)id;.  ass
157d0 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
157e0 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64  dotlockUnlock(id
157f0 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 73 71  , NO_LOCK);.  sq
15800 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
15810 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
15820 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73  );.  return clos
15830 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d  eUnixFile(id);.}
15840 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
15850 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
15860 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d  dot-file lock im
15870 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
15880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15890 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
158a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
158b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
158c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
158d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
158e0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
158f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15930 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
15940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
15950 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67  in flock Locking
15960 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
15970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15980 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  *.**.** Use the 
15990 66 6c 6f 63 6b 28 29 20 73 79 73 74 65 6d 20 63  flock() system c
159a0 61 6c 6c 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c  all to do file l
159b0 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c  ocking..**.** fl
159c0 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73  ock() locking is
159d0 20 6c 69 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c   like dot-file l
159e0 6f 63 6b 69 6e 67 20 69 6e 20 74 68 61 74 20 74  ocking in that t
159f0 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69  he various.** fi
15a00 6e 65 2d 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67  ne-grain locking
15a10 20 6c 65 76 65 6c 73 20 73 75 70 70 6f 72 74 65   levels supporte
15a20 64 20 62 79 20 53 51 4c 69 74 65 20 61 72 65 20  d by SQLite are 
15a30 63 6f 6c 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a  collapsed into.*
15a40 2a 20 61 20 73 69 6e 67 6c 65 20 65 78 63 6c 75  * a single exclu
15a50 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f  sive lock.  In o
15a60 74 68 65 72 20 77 6f 72 64 73 2c 20 53 48 41 52  ther words, SHAR
15a70 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 61 6e  ED, RESERVED, an
15a80 64 0a 2a 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63  d.** PENDING loc
15a90 6b 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ks are the same 
15aa0 74 68 69 6e 67 20 61 73 20 61 6e 20 45 58 43 4c  thing as an EXCL
15ab0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c  USIVE lock.  SQL
15ac0 69 74 65 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72  ite.** still wor
15ad0 6b 73 20 77 68 65 6e 20 79 6f 75 20 64 6f 20 74  ks when you do t
15ae0 68 69 73 2c 20 62 75 74 20 63 6f 6e 63 75 72 72  his, but concurr
15af0 65 6e 63 79 20 69 73 20 72 65 64 75 63 65 64 20  ency is reduced 
15b00 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20  since.** only a 
15b10 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63  single process c
15b20 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 74 68  an be reading th
15b30 65 20 64 61 74 61 62 61 73 65 20 61 74 20 61 20  e database at a 
15b40 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74  time..**.** Omit
15b50 20 74 68 69 73 20 73 65 63 74 69 6f 6e 20 69 66   this section if
15b60 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
15b70 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73 20  OCKING_STYLE is 
15b80 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23 69  turned off.*/.#i
15b90 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
15ba0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f  LOCKING_STYLE../
15bb0 2a 0a 2a 2a 20 52 65 74 72 79 20 66 6c 6f 63 6b  *.** Retry flock
15bc0 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61  () calls that fa
15bd0 69 6c 20 77 69 74 68 20 45 49 4e 54 52 0a 2a 2f  il with EINTR.*/
15be0 0a 23 69 66 64 65 66 20 45 49 4e 54 52 0a 73 74  .#ifdef EINTR.st
15bf0 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f  atic int robust_
15c00 66 6c 6f 63 6b 28 69 6e 74 20 66 64 2c 20 69 6e  flock(int fd, in
15c10 74 20 6f 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  t op){.  int rc;
15c20 0a 20 20 64 6f 7b 20 72 63 20 3d 20 66 6c 6f 63  .  do{ rc = floc
15c30 6b 28 66 64 2c 6f 70 29 3b 20 7d 77 68 69 6c 65  k(fd,op); }while
15c40 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
15c50 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75  =EINTR );.  retu
15c60 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23  rn rc;.}.#else.#
15c70 20 64 65 66 69 6e 65 20 72 6f 62 75 73 74 5f 66   define robust_f
15c80 6c 6f 63 6b 28 61 2c 62 29 20 66 6c 6f 63 6b 28  lock(a,b) flock(
15c90 61 2c 62 29 0a 23 65 6e 64 69 66 0a 20 20 20 20  a,b).#endif.    
15ca0 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f   ../*.** This ro
15cb0 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
15cc0 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
15cd0 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
15ce0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
15cf0 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
15d00 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
15d10 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
15d20 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
15d30 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
15d40 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
15d50 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
15d60 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
15d70 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
15d80 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
15d90 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
15da0 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
15db0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
15dc0 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
15dd0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
15de0 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
15df0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
15e00 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
15e10 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
15e20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
15e30 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
15e40 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
15e50 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
15e60 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  .  .  SimulateIO
15e70 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
15e80 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
15e90 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
15ea0 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
15eb0 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43  ile );.  .  /* C
15ec0 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
15ed0 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
15ee0 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
15ef0 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
15f00 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
15f10 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
15f20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
15f30 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
15f40 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
15f50 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
15f60 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  lds it. */.  if(
15f70 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20   !reserved ){.  
15f80 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20    /* attempt to 
15f90 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a  get the lock */.
15fa0 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 72 6f      int lrc = ro
15fb0 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
15fc0 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c  ->h, LOCK_EX | L
15fd0 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66 28  OCK_NB);.    if(
15fe0 20 21 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f   !lrc ){.      /
15ff0 2a 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20  * got the lock, 
16000 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20  unlock it */.   
16010 20 20 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f     lrc = robust_
16020 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
16030 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20  LOCK_UN);.      
16040 69 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20 20  if ( lrc ) {.   
16050 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
16060 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
16070 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65   /* unlock faile
16080 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20  d with an error 
16090 2a 2f 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47  */.#if OSLOCKING
160a0 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52  _CHECK_BUSY_IOER
160b0 52 0a 20 20 20 20 20 20 20 20 6c 72 63 20 3d 20  R.        lrc = 
160c0 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
160d0 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
160e0 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
160f0 4e 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65 20 0a 20  NLOCK);.#else . 
16100 20 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51 4c         lrc = SQL
16110 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
16120 3b 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  ; .#endif.      
16130 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
16140 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20  ROR(lrc) ){.    
16150 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
16160 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
16170 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  no);.          r
16180 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20  c = lrc;.       
16190 20 7d 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65   }.        store
161a0 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
161b0 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
161c0 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20    rc = lrc;.    
161d0 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b    }.    } else {
161e0 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e  .      int tErrn
161f0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
16200 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
16210 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20       /* someone 
16220 65 6c 73 65 20 6d 69 67 68 74 20 68 61 76 65 20  else might have 
16230 69 74 20 72 65 73 65 72 76 65 64 20 2a 2f 0a 20  it reserved */. 
16240 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74       lrc = sqlit
16250 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
16260 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
16270 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
16280 20 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c   .      if( IS_L
16290 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29  OCK_ERROR(lrc) )
162a0 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c  {.        storeL
162b0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
162c0 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20  tErrno);.       
162d0 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20   rc = lrc;.     
162e0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f   }.    }.  }.  O
162f0 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
16300 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
16310 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  flock)\n", pFile
16320 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
16330 64 29 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  d));..#ifdef SQL
16340 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
16350 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69  _LOCK_ERRORS.  i
16360 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f  f( (rc & SQLITE_
16370 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45  IOERR) == SQLITE
16380 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63  _IOERR ){.    rc
16390 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
163a0 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20 20    reserved=1;.  
163b0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
163c0 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
163d0 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
163e0 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
163f0 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
16400 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
16410 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
16420 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
16430 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
16440 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
16450 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
16460 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
16470 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
16480 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
16490 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
164a0 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
164b0 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
164c0 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
164d0 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
164e0 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
164f0 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
16500 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
16510 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
16520 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
16530 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
16540 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
16550 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
16560 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
16570 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
16580 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
16590 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
165a0 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
165b0 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
165c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
165d0 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
165e0 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
165f0 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
16600 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
16610 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
16620 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
16630 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
16640 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
16650 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
16660 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
16670 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
16680 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
16690 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
166a0 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
166b0 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66  XCLUSIVE.**.** f
166c0 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c  lock() only real
166d0 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55  ly support EXCLU
166e0 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20  SIVE locks.  We 
166f0 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61  track intermedia
16700 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  te.** lock state
16710 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  s in the sqlite3
16720 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c  _file structure,
16730 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53   but all locks S
16740 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76  HARED or.** abov
16750 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43  e are really EXC
16760 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64  LUSIVE locks and
16770 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68   exclude all oth
16780 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f  er processes fro
16790 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20  m.** access the 
167a0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
167b0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
167c0 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
167d0 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
167e0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
167f0 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
16800 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
16810 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
16820 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69  t flockLock(sqli
16830 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
16840 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
16850 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16860 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
16870 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
16880 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
16890 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  t( pFile );..  /
168a0 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20  * if we already 
168b0 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20  have a lock, it 
168c0 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a  is exclusive.  .
168d0 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74    ** Just adjust
168e0 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20   level and punt 
168f0 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a  on outta here. *
16900 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65  /.  if (pFile->e
16910 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f  FileLock > NO_LO
16920 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
16930 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
16940 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
16950 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
16960 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61  }.  .  /* grab a
16970 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
16980 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f 62   */.  .  if (rob
16990 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
169a0 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f  >h, LOCK_EX | LO
169b0 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e  CK_NB)) {.    in
169c0 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
169d0 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20  ;.    /* didn't 
169e0 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73  get, must be bus
169f0 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  y */.    rc = sq
16a00 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
16a10 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
16a20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
16a30 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  K);.    if( IS_L
16a40 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
16a50 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
16a60 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
16a70 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  rno);.    }.  } 
16a80 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f  else {.    /* go
16a90 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
16aa0 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
16ab0 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   */.    pFile->e
16ac0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
16ad0 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  Lock;.  }.  OSTR
16ae0 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
16af0 20 25 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e   %s %s (flock)\n
16b00 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46  ", pFile->h, azF
16b10 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
16b20 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  k), .           
16b30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
16b40 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
16b50 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
16b60 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
16b70 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20  CK_ERRORS.  if( 
16b80 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  (rc & SQLITE_IOE
16b90 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
16ba0 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ERR ){.    rc = 
16bb0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
16bc0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
16bd0 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
16be0 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
16bf0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
16c00 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
16c10 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
16c20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
16c30 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
16c40 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
16c50 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
16c60 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
16c70 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
16c80 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
16c90 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
16ca0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
16cb0 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
16cc0 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
16cd0 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
16ce0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
16cf0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
16d00 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e  atic int flockUn
16d10 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
16d20 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
16d30 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
16d40 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
16d50 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20  xFile*)id;.  .  
16d60 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
16d70 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
16d80 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
16d90 64 20 70 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29  d pid=%d (flock)
16da0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
16db0 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
16dc0 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
16dd0 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28  eLock, osGetpid(
16de0 30 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0)));.  assert( 
16df0 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
16e00 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
16e10 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
16e20 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
16e30 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
16e40 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
16e50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16e60 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68  ;.  }.  .  /* sh
16e70 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65  ared can just be
16e80 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20   set because we 
16e90 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65  always have an e
16ea0 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66  xclusive */.  if
16eb0 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
16ec0 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  RED_LOCK) {.    
16ed0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16ee0 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
16ef0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16f00 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
16f10 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f  no, really, unlo
16f20 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72 6f 62  ck. */.  if( rob
16f30 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
16f40 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a  >h, LOCK_UN) ){.
16f50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
16f60 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
16f70 45 52 52 4f 52 53 0a 20 20 20 20 72 65 74 75 72  ERRORS.    retur
16f80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
16f90 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
16fa0 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
16fb0 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 72 65  ERRORS */.    re
16fc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
16fd0 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73  R_UNLOCK;.  }els
16fe0 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  e{.    pFile->eF
16ff0 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
17000 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  K;.    return SQ
17010 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
17020 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
17030 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
17040 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c  t flockClose(sql
17050 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
17060 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
17070 20 29 3b 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63   );.  flockUnloc
17080 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
17090 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e    return closeUn
170a0 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23  ixFile(id);.}..#
170b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
170c0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
170d0 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
170e0 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  RK */../********
170f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
17100 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63  of the flock loc
17110 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
17120 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
17130 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
17140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17180 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
17190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171d0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
171e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171f0 20 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d   Begin Named Sem
17200 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a  aphore Locking *
17210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17220 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61  *******.**.** Na
17230 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
17240 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75  cking is only su
17250 70 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f 72  pported on VxWor
17260 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68  ks..**.** Semaph
17270 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c  ore locking is l
17280 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64  ike dot-lock and
17290 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20 69   flock in that i
172a0 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a  t really only.**
172b0 20 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55 53   supports EXCLUS
172c0 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e  IVE locking.  On
172d0 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63  ly a single proc
172e0 65 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72 20  ess can read or 
172f0 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61 74  write.** the dat
17300 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 61 20  abase file at a 
17310 74 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64 75  time.  This redu
17320 63 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f  ces potential co
17330 6e 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a 2a  ncurrency, but.*
17340 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63 6b  * makes the lock
17350 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
17360 6d 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f 0a  much easier..*/.
17370 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a  #if OS_VXWORKS..
17380 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
17390 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
173a0 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
173b0 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
173c0 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
173d0 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
173e0 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
173f0 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
17400 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
17410 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
17420 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
17430 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
17440 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
17450 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
17460 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
17470 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
17480 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
17490 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
174a0 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
174b0 61 74 69 63 20 69 6e 74 20 73 65 6d 58 43 68 65  atic int semXChe
174c0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
174d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
174e0 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b   int *pResOut) {
174f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
17500 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
17510 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
17520 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
17530 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
17540 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
17550 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
17560 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
17570 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
17580 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
17590 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  ;..  /* Check if
175a0 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
175b0 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
175c0 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
175d0 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
175e0 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
175f0 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
17600 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  d = 1;.  }.  .  
17610 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
17620 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
17630 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
17640 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72   */.  if( !reser
17650 76 65 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74  ved ){.    sem_t
17660 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
17670 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20  pInode->pSem;.. 
17680 20 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61     if( sem_trywa
17690 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a  it(pSem)==-1 ){.
176a0 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
176b0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
176c0 69 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74 45  if( EAGAIN != tE
176d0 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  rrno ){.        
176e0 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
176f0 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
17700 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
17710 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
17720 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  DLOCK);.        
17730 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
17740 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
17750 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
17760 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65        /* someone
17770 20 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f   else has the lo
17780 63 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20 69  ck when we are i
17790 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20  n NO_LOCK */.   
177a0 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
177b0 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
177c0 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  k < SHARED_LOCK)
177d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
177e0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65  lse{.      /* we
177f0 20 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69   could have it i
17800 66 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a  f we want it */.
17810 20 20 20 20 20 20 73 65 6d 5f 70 6f 73 74 28 70        sem_post(p
17820 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Sem);.    }.  }.
17830 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
17840 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
17850 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c  d (sem)\n", pFil
17860 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
17870 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75  ed));..  *pResOu
17880 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
17890 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
178a0 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
178b0 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
178c0 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
178d0 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
178e0 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
178f0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
17900 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
17910 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
17920 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
17930 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
17940 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
17950 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
17960 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
17970 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
17980 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
17990 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
179a0 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
179b0 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
179c0 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
179d0 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
179e0 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
179f0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
17a00 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
17a10 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
17a20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
17a30 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
17a40 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
17a50 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
17a60 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
17a70 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
17a80 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
17a90 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
17aa0 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
17ab0 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
17ac0 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
17ad0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
17ae0 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
17af0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
17b00 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
17b10 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
17b20 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
17b30 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
17b40 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
17b50 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65  .**.** Semaphore
17b60 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c   locks only real
17b70 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55  ly support EXCLU
17b80 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20  SIVE locks.  We 
17b90 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61  track intermedia
17ba0 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  te.** lock state
17bb0 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  s in the sqlite3
17bc0 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c  _file structure,
17bd0 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53   but all locks S
17be0 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76  HARED or.** abov
17bf0 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43  e are really EXC
17c00 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64  LUSIVE locks and
17c10 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68   exclude all oth
17c20 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f  er processes fro
17c30 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20  m.** access the 
17c40 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
17c50 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
17c60 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
17c70 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
17c80 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
17c90 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
17ca0 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
17cb0 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
17cc0 74 20 73 65 6d 58 4c 6f 63 6b 28 73 71 6c 69 74  t semXLock(sqlit
17cd0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
17ce0 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
17cf0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
17d00 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
17d10 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d  .  sem_t *pSem =
17d20 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
17d30 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pSem;.  int rc =
17d40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
17d50 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20  * if we already 
17d60 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20  have a lock, it 
17d70 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a  is exclusive.  .
17d80 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74    ** Just adjust
17d90 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20   level and punt 
17da0 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a  on outta here. *
17db0 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65  /.  if (pFile->e
17dc0 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f  FileLock > NO_LO
17dd0 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
17de0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
17df0 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d  leLock;.    rc =
17e00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
17e10 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63  goto sem_end_loc
17e20 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c  k;.  }.  .  /* l
17e30 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f  ock semaphore no
17e40 77 20 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77  w but bail out w
17e50 68 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b  hen already lock
17e60 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d  ed. */.  if( sem
17e70 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d  _trywait(pSem)==
17e80 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  -1 ){.    rc = S
17e90 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
17ea0 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63  goto sem_end_loc
17eb0 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74  k;.  }..  /* got
17ec0 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70   it, set the typ
17ed0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20  e and return ok 
17ee0 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  */.  pFile->eFil
17ef0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
17f00 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63  k;.. sem_end_loc
17f10 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  k:.  return rc;.
17f20 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
17f30 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
17f40 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
17f50 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
17f60 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
17f70 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
17f80 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
17f90 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
17fa0 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
17fb0 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
17fc0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
17fd0 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
17fe0 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
17ff0 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
18000 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
18010 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
18020 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
18030 58 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  XUnlock(sqlite3_
18040 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
18050 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
18060 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
18070 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
18080 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46  sem_t *pSem = pF
18090 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  ile->pInode->pSe
180a0 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  m;..  assert( pF
180b0 69 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ile );.  assert(
180c0 20 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41   pSem );.  OSTRA
180d0 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
180e0 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
180f0 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65   (sem)\n", pFile
18100 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
18110 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
18120 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47  ->eFileLock, osG
18130 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20 61 73  etpid(0)));.  as
18140 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
18150 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
18160 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66    .  /* no-op if
18170 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69   possible */.  i
18180 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
18190 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock==eFileLock )
181a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
181b0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
181c0 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a   /* shared can j
181d0 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75  ust be set becau
181e0 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76  se we always hav
181f0 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a  e an exclusive *
18200 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63  /.  if (eFileLoc
18210 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20  k==SHARED_LOCK) 
18220 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
18230 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
18240 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ck;.    return S
18250 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
18260 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79  .  /* no, really
18270 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66   unlock. */.  if
18280 20 28 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d   ( sem_post(pSem
18290 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e  )==-1 ) {.    in
182a0 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65  t rc, tErrno = e
182b0 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 73  rrno;.    rc = s
182c0 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
182d0 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
182e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
182f0 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49  LOCK);.    if( I
18300 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
18310 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
18320 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
18330 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20  tErrno);.    }. 
18340 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20     return rc; . 
18350 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c   }.  pFile->eFil
18360 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
18370 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18380 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43  _OK;.}../*. ** C
18390 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f  lose a file.. */
183a0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58  .static int semX
183b0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
183c0 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20  le *id) {.  if( 
183d0 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
183e0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
183f0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73  xFile*)id;.    s
18400 65 6d 58 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  emXUnlock(id, NO
18410 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65  _LOCK);.    asse
18420 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20  rt( pFile );.   
18430 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
18440 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e  );.    releaseIn
18450 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a  odeInfo(pFile);.
18460 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
18470 65 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55  ex();.    closeU
18480 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d  nixFile(id);.  }
18490 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
184a0 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  _OK;.}..#endif /
184b0 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
184c0 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61  /*.** Named sema
184d0 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73  phore locking is
184e0 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
184f0 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a  on VxWorks..**.*
18500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
18510 6e 64 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20  nd of the named 
18520 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69  semaphore lock i
18530 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
18540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
18550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
185a0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
185b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
185c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
185d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
185e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
185f0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
18600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
18610 69 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a  in AFP Locking *
18620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18640 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74 68  .**.** AFP is th
18650 65 20 41 70 70 6c 65 20 46 69 6c 69 6e 67 20 50  e Apple Filing P
18660 72 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73  rotocol.  AFP is
18670 20 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73   a network files
18680 79 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f  ystem found.** o
18690 6e 20 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73  n Apple Macintos
186a0 68 20 63 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f  h computers - bo
186b0 74 68 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a  th OS9 and OSX..
186c0 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72 74  **.** Third-part
186d0 79 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  y implementation
186e0 73 20 6f 66 20 41 46 50 20 61 72 65 20 61 76 61  s of AFP are ava
186f0 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 74 68 69  ilable.  But thi
18700 73 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f  s code here.** o
18710 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58  nly works on OSX
18720 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ..*/..#if define
18730 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
18740 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
18750 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a  CKING_STYLE./*.*
18760 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67  * The afpLocking
18770 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72  Context structur
18780 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61  e contains all a
18790 66 70 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63  fp lock specific
187a0 20 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65   state.*/.typede
187b0 66 20 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b  f struct afpLock
187c0 69 6e 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f  ingContext afpLo
187d0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74  ckingContext;.st
187e0 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43  ruct afpLockingC
187f0 6f 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 72  ontext {.  int r
18800 65 73 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74  eserved;.  const
18810 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20   char *dbPath;  
18820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
18830 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66  me of the open f
18840 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63  ile */.};..struc
18850 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50  t ByteRangeLockP
18860 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  B2.{.  unsigned 
18870 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74  long long offset
18880 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73  ;        /* offs
18890 65 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65  et to first byte
188a0 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e   to lock */.  un
188b0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
188c0 20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20   length;        
188d0 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20  /* nbr of bytes 
188e0 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73  to lock */.  uns
188f0 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
18900 72 65 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f  retRangeStart; /
18910 2a 20 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74  * nbr of 1st byt
18920 65 20 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63  e locked if succ
18930 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69  essful */.  unsi
18940 67 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b  gned char unLock
18950 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  Flag;         /*
18960 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d   1 = unlock, 0 =
18970 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
18980 6e 65 64 20 63 68 61 72 20 73 74 61 72 74 45 6e  ned char startEn
18990 64 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  dFlag;       /* 
189a0 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20  1=rel to end of 
189b0 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73  fork, 0=rel to s
189c0 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64  tart */.  int fd
189d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
189e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
189f0 69 6c 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f  ile desc to asso
18a00 63 20 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68  c this lock with
18a10 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20   */.};..#define 
18a20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f  afpfsByteRangeLo
18a30 63 6b 32 46 53 43 54 4c 20 20 20 20 20 20 20 20  ck2FSCTL        
18a40 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73  _IOWR('z', 23, s
18a50 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
18a60 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54  ockPB2)../*.** T
18a70 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79  his is a utility
18a80 20 66 6f 72 20 73 65 74 74 69 6e 67 20 6f 72 20   for setting or 
18a90 63 6c 65 61 72 69 6e 67 20 61 20 62 69 74 2d 72  clearing a bit-r
18aa0 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a  ange lock on an.
18ab0 2a 2a 20 41 46 50 20 66 69 6c 65 73 79 73 74 65  ** AFP filesyste
18ac0 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e  m..** .** Return
18ad0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
18ae0 63 63 65 73 73 2c 20 53 51 4c 49 54 45 5f 42 55  ccess, SQLITE_BU
18af0 53 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  SY on failure..*
18b00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
18b10 53 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74  SetLock(.  const
18b20 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20   char *path,    
18b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
18b40 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  e of the file to
18b50 20 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e   be locked or un
18b60 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78  locked */.  unix
18b70 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  File *pFile,    
18b80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
18b90 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
18ba0 6f 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20  or on path */.  
18bb0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
18bc0 6e 67 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f  ng offset,     /
18bd0 2a 20 46 69 72 73 74 20 62 79 74 65 20 74 6f 20  * First byte to 
18be0 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
18bf0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
18c00 67 20 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a  g length,     /*
18c10 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
18c20 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e   to lock */.  in
18c30 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20  t setLockFlag   
18c40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18c50 54 72 75 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b  True to set lock
18c60 2e 20 20 46 61 6c 73 65 20 74 6f 20 63 6c 65 61  .  False to clea
18c70 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73  r lock */.){.  s
18c80 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
18c90 6f 63 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e 74  ockPB2 pb;.  int
18ca0 20 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e   err;.  .  pb.un
18cb0 4c 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f  LockFlag = setLo
18cc0 63 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a  ckFlag ? 0 : 1;.
18cd0 20 20 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61    pb.startEndFla
18ce0 67 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73  g = 0;.  pb.offs
18cf0 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70  et = offset;.  p
18d00 62 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74  b.length = lengt
18d10 68 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46  h; .  pb.fd = pF
18d20 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54  ile->h;.  .  OST
18d30 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43  RACE(("AFPSETLOC
18d40 4b 20 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20  K [%s] for %d%s 
18d50 69 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c  in range %llx:%l
18d60 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74  lx\n", .    (set
18d70 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f  LockFlag?"ON":"O
18d80 46 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  FF"), pFile->h, 
18d90 28 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73  (pb.fd==-1?"[tes
18da0 74 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20  tval-1]":""),.  
18db0 20 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68    offset, length
18dc0 29 29 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74  ));.  err = fsct
18dd0 6c 28 70 61 74 68 2c 20 61 66 70 66 73 42 79 74  l(path, afpfsByt
18de0 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c  eRangeLock2FSCTL
18df0 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20  , &pb, 0);.  if 
18e00 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20  ( err==-1 ) {.  
18e10 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e    int rc;.    in
18e20 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
18e30 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
18e40 41 46 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65  AFPSETLOCK faile
18e50 64 20 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73  d to fsctl() '%s
18e60 27 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  ' %d %s\n",.    
18e70 20 20 20 20 20 20 20 20 20 70 61 74 68 2c 20 74           path, t
18e80 45 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28  Errno, strerror(
18e90 74 45 72 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65  tErrno)));.#ifde
18ea0 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
18eb0 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  AFP_LOCK_ERRORS.
18ec0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18ed0 42 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20  BUSY;.#else.    
18ee0 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
18ef0 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
18f00 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
18f10 20 20 20 20 20 20 20 20 20 20 20 73 65 74 4c 6f             setLo
18f20 63 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f  ckFlag ? SQLITE_
18f30 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c  IOERR_LOCK : SQL
18f40 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
18f50 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
18f60 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c  ITE_IGNORE_AFP_L
18f70 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
18f80 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
18f90 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
18fa0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
18fb0 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
18fc0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
18fd0 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a   rc;.  } else {.
18fe0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18ff0 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
19000 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19010 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
19020 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
19030 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
19040 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
19050 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
19060 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
19070 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
19080 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
19090 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
190a0 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
190b0 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
190c0 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
190d0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
190e0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
190f0 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
19100 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
19110 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
19120 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
19130 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65  c int afpCheckRe
19140 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
19150 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
19160 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
19170 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
19180 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
19190 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
191a0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
191b0 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f  ile*)id;.  afpLo
191c0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
191d0 6e 74 65 78 74 3b 0a 20 20 0a 20 20 53 69 6d 75  ntext;.  .  Simu
191e0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
191f0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
19200 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
19210 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
19220 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 63  rt( pFile );.  c
19230 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63  ontext = (afpLoc
19240 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70  kingContext *) p
19250 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
19260 74 65 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74  text;.  if( cont
19270 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b  ext->reserved ){
19280 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  .    *pResOut = 
19290 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
192a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75  LITE_OK;.  }.  u
192b0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
192c0 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c   /* Because pFil
192d0 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61  e->pInode is sha
192e0 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
192f0 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43 68  ds */.  .  /* Ch
19300 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
19310 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
19320 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
19330 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
19340 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
19350 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
19360 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
19370 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
19380 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
19390 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
193a0 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20  cess holds it.. 
193b0 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65    */.  if( !rese
193c0 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c  rved ){.    /* l
193d0 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56 45 44  ock the RESERVED
193e0 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74   byte */.    int
193f0 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63   lrc = afpSetLoc
19400 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
19410 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
19420 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20  ED_BYTE, 1,1);  
19430 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
19440 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20  OK==lrc ){.     
19450 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65 65   /* if we succee
19460 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68  ded in taking th
19470 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c  e reserved lock,
19480 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65   unlock it to re
19490 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74  store.      ** t
194a0 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  he original stat
194b0 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  e */.      lrc =
194c0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
194d0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
194e0 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
194f0 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20  E, 1, 0);.    } 
19500 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20  else {.      /* 
19510 69 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  if we failed to 
19520 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65  get the lock the
19530 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d  n someone else m
19540 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20  ust have it */. 
19550 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
19560 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
19570 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
19580 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d  rc) ){.      rc=
19590 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  lrc;.    }.  }. 
195a0 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74   .  unixLeaveMut
195b0 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
195c0 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
195d0 64 20 25 64 20 25 64 20 28 61 66 70 29 5c 6e 22  d %d %d (afp)\n"
195e0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
195f0 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20 0a 20  reserved));.  . 
19600 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
19610 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
19620 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
19630 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
19640 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
19650 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
19660 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
19670 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
19680 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
19690 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
196a0 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
196b0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
196c0 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
196d0 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
196e0 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
196f0 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
19700 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
19710 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
19720 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
19730 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
19740 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
19750 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
19760 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
19770 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
19780 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
19790 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
197a0 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
197b0 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
197c0 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
197d0 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
197e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
197f0 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
19800 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
19810 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
19820 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
19830 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
19840 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
19850 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
19860 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
19870 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
19880 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
19890 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
198a0 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
198b0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
198c0 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
198d0 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
198e0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
198f0 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
19900 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
19910 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
19920 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
19930 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
19940 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
19950 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c   int afpLock(sql
19960 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
19970 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
19980 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
19990 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
199a0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
199b0 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
199c0 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
199d0 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
199e0 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
199f0 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20  text *context = 
19a00 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
19a10 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
19a20 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a  kingContext;.  .
19a30 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
19a40 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
19a50 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73  OCK    %d %s was
19a60 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25   %s(%s,%d) pid=%
19a70 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
19a80 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
19a90 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
19aa0 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f  eLock), azFileLo
19ab0 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  ck(pFile->eFileL
19ac0 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ock),.          
19ad0 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f   azFileLock(pIno
19ae0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  de->eFileLock), 
19af0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20  pInode->nShared 
19b00 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b  , osGetpid(0)));
19b10 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
19b20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  is already a loc
19b30 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f  k of this type o
19b40 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69  r more restricti
19b50 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75  ve on the.  ** u
19b60 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68  nixFile, do noth
19b70 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74  ing. Don't use t
19b80 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a  he afp_end_lock:
19b90 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
19ba0 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74   ** unixEnterMut
19bb0 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
19bc0 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
19bd0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
19be0 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c  FileLock>=eFileL
19bf0 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ock ){.    OSTRA
19c00 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
19c10 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68  %s ok (already h
19c20 65 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c 20 70  eld) (afp)\n", p
19c30 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
19c40 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65      azFileLock(e
19c50 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20  FileLock)));.   
19c60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19c70 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
19c80 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
19c90 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
19ca0 6f 72 72 65 63 74 0a 20 20 2a 2a 20 20 28 31 29  orrect.  **  (1)
19cb0 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66   We never move f
19cc0 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20  rom unlocked to 
19cd0 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20  anything higher 
19ce0 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b  than shared lock
19cf0 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69  ..  **  (2) SQLi
19d00 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69  te never explici
19d10 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 70  tly requests a p
19d20 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  endig lock..  **
19d30 20 20 28 33 29 20 41 20 73 68 61 72 65 64 20 6c    (3) A shared l
19d40 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65  ock is always he
19d50 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 72 76  ld when a reserv
19d60 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  e lock is reques
19d70 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ted..  */.  asse
19d80 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
19d90 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock!=NO_LOCK ||
19da0 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
19db0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
19dc0 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d  ert( eFileLock!=
19dd0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a  PENDING_LOCK );.
19de0 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
19df0 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock!=RESERVED_LO
19e00 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69  CK || pFile->eFi
19e10 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
19e20 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54  OCK );.  .  /* T
19e30 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65  his mutex is nee
19e40 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c  ded because pFil
19e50 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61  e->pInode is sha
19e60 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
19e70 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e  ds.  */.  unixEn
19e80 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49  terMutex();.  pI
19e90 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
19ea0 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73  node;..  /* If s
19eb0 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
19ec0 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20   this PID has a 
19ed0 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65  lock via a diffe
19ee0 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20  rent unixFile*. 
19ef0 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20   ** handle that 
19f00 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65  precludes the re
19f10 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65  quested lock, re
19f20 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a  turn BUSY..  */.
19f30 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46    if( (pFile->eF
19f40 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d  ileLock!=pInode-
19f50 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20  >eFileLock && . 
19f60 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65        (pInode->e
19f70 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e  FileLock>=PENDIN
19f80 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  G_LOCK || eFileL
19f90 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ock>SHARED_LOCK)
19fa0 29 0a 20 20 20 20 20 29 7b 0a 20 20 20 20 72 63  ).     ){.    rc
19fb0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
19fc0 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
19fd0 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20  _lock;.  }.  .  
19fe0 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c  /* If a SHARED l
19ff0 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
1a000 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61  , and some threa
1a010 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
1a020 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61   already.  ** ha
1a030 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45  s a SHARED or RE
1a040 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SERVED lock, the
1a050 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65  n increment refe
1a060 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64  rence counts and
1a070 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
1a080 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69  ITE_OK..  */.  i
1a090 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
1a0a0 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20  ARED_LOCK && .  
1a0b0 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c     (pInode->eFil
1a0c0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
1a0d0 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46  CK || pInode->eF
1a0e0 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ileLock==RESERVE
1a0f0 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61  D_LOCK) ){.    a
1a100 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
1a110 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
1a120 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
1a130 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30  le->eFileLock==0
1a140 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1a150 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
1a160 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 );.    pFile->
1a170 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
1a180 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  ED_LOCK;.    pIn
1a190 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a  ode->nShared++;.
1a1a0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
1a1b0 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66  k++;.    goto af
1a1c0 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  p_end_lock;.  }.
1a1d0 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44      .  /* A PEND
1a1e0 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64  ING lock is need
1a1f0 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72  ed before acquir
1a200 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
1a210 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a  k and before.  *
1a220 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45  * acquiring an E
1a230 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
1a240 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c  For the SHARED l
1a250 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47  ock, the PENDING
1a260 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65   will.  ** be re
1a270 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  leased..  */.  i
1a280 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
1a290 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20  ARED_LOCK .     
1a2a0 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   || (eFileLock==
1a2b0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
1a2c0 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
1a2d0 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29  ck<PENDING_LOCK)
1a2e0 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61  .  ){.    int fa
1a2f0 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64  iled;.    failed
1a300 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
1a310 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
1a320 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59  File, PENDING_BY
1a330 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69  TE, 1, 1);.    i
1a340 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20  f (failed) {.   
1a350 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a     rc = failed;.
1a360 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
1a370 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  nd_lock;.    }. 
1a380 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f   }.  .  /* If co
1a390 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68  ntrol gets to th
1a3a0 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61  is point, then a
1a3b0 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64  ctually go ahead
1a3c0 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f   and make.  ** o
1a3d0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
1a3e0 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70  calls for the sp
1a3f0 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20  ecified lock..  
1a400 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
1a410 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
1a420 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63 31 2c  ){.    int lrc1,
1a430 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f   lrc2, lrc1Errno
1a440 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c   = 0;.    long l
1a450 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20  k, mask;.    .  
1a460 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
1a470 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a  ->nShared==0 );.
1a480 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
1a490 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30  de->eFileLock==0
1a4a0 20 29 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20   );.        .   
1a4b0 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66 28   mask = (sizeof(
1a4c0 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52 47  long)==8) ? LARG
1a4d0 45 53 54 5f 49 4e 54 36 34 20 3a 20 30 78 37 66  EST_INT64 : 0x7f
1a4e0 66 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20 4e  ffffff;.    /* N
1a4f0 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d  ow get the read-
1a500 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b  lock SHARED_LOCK
1a510 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20   */.    /* note 
1a520 74 68 61 74 20 74 68 65 20 71 75 61 6c 69 74 79  that the quality
1a530 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65   of the randomne
1a540 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  ss doesn't matte
1a550 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20  r that much */. 
1a560 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29     lk = random()
1a570 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73  ; .    pInode->s
1a580 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c 6b 20  haredByte = (lk 
1a590 26 20 6d 61 73 6b 29 25 28 53 48 41 52 45 44 5f  & mask)%(SHARED_
1a5a0 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c  SIZE - 1);.    l
1a5b0 72 63 31 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  rc1 = afpSetLock
1a5c0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
1a5d0 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20  , pFile, .      
1a5e0 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54      SHARED_FIRST
1a5f0 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42  +pInode->sharedB
1a600 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  yte, 1, 1);.    
1a610 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
1a620 52 28 6c 72 63 31 29 20 29 7b 0a 20 20 20 20 20  R(lrc1) ){.     
1a630 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70 46 69   lrc1Errno = pFi
1a640 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  le->lastErrno;. 
1a650 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70     }.    /* Drop
1a660 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50   the temporary P
1a670 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20  ENDING lock */. 
1a680 20 20 20 6c 72 63 32 20 3d 20 61 66 70 53 65 74     lrc2 = afpSet
1a690 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
1a6a0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e  Path, pFile, PEN
1a6b0 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29  DING_BYTE, 1, 0)
1a6c0 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 49  ;.    .    if( I
1a6d0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
1a6e0 31 29 20 29 20 7b 0a 20 20 20 20 20 20 73 74 6f  1) ) {.      sto
1a6f0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
1a700 65 2c 20 6c 72 63 31 45 72 72 6e 6f 29 3b 0a 20  e, lrc1Errno);. 
1a710 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a       rc = lrc1;.
1a720 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
1a730 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65  nd_lock;.    } e
1a740 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f  lse if( IS_LOCK_
1a750 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20  ERROR(lrc2) ){. 
1a760 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a       rc = lrc2;.
1a770 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
1a780 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65  nd_lock;.    } e
1a790 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d 20  lse if( lrc1 != 
1a7a0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20  SQLITE_OK ) {.  
1a7b0 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20      rc = lrc1;. 
1a7c0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
1a7d0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
1a7e0 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
1a7f0 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
1a800 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70  nLock++;.      p
1a810 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d  Inode->nShared =
1a820 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
1a830 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  e if( eFileLock=
1a840 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
1a850 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  && pInode->nShar
1a860 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57  ed>1 ){.    /* W
1a870 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72  e are trying for
1a880 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
1a890 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74  ck but another t
1a8a0 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20  hread in this.  
1a8b0 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65     ** same proce
1a8c0 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64  ss is still hold
1a8d0 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ing a shared loc
1a8e0 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  k. */.    rc = S
1a8f0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65  QLITE_BUSY;.  }e
1a900 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
1a910 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20  request was for 
1a920 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
1a930 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49  CLUSIVE lock.  I
1a940 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75  t is.    ** assu
1a950 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69  med that there i
1a960 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72  s a SHARED or gr
1a970 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
1a980 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c  e file.    ** al
1a990 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
1a9a0 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30    int failed = 0
1a9b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21  ;.    assert( 0!
1a9c0 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
1a9d0 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65 46 69  k );.    if (eFi
1a9e0 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56  leLock >= RESERV
1a9f0 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  ED_LOCK && pFile
1aa00 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45  ->eFileLock < RE
1aa10 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SERVED_LOCK) {. 
1aa20 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72         /* Acquir
1aa30 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  e a RESERVED loc
1aa40 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69  k */.        fai
1aa50 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
1aa60 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
1aa70 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
1aa80 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20  D_BYTE, 1,1);.  
1aa90 20 20 20 20 69 66 28 20 21 66 61 69 6c 65 64 20      if( !failed 
1aaa0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65  ){.        conte
1aab0 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 31  xt->reserved = 1
1aac0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1aad0 20 20 20 20 69 66 20 28 21 66 61 69 6c 65 64 20      if (!failed 
1aae0 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20  && eFileLock == 
1aaf0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20  EXCLUSIVE_LOCK) 
1ab00 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69  {.      /* Acqui
1ab10 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  re an EXCLUSIVE 
1ab20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
1ab30 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  .      /* Remove
1ab40 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
1ab50 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74   before trying t
1ab60 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c  he range.  we'll
1ab70 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20 20   need to .      
1ab80 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20 74  ** reestablish t
1ab90 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69  he shared lock i
1aba0 66 20 77 65 20 63 61 6e 27 74 20 67 65 74 20 74  f we can't get t
1abb0 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20  he  afpUnlock.  
1abc0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1abd0 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66 70 53   !(failed = afpS
1abe0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
1abf0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53  dbPath, pFile, S
1ac00 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20  HARED_FIRST +.  
1ac10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73         pInode->s
1ac30 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30 29  haredByte, 1, 0)
1ac40 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
1ac50 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49 54   failed2 = SQLIT
1ac60 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a  E_OK;.        /*
1ac70 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f   now attemmpt to
1ac80 20 67 65 74 20 74 68 65 20 65 78 63 6c 75 73 69   get the exclusi
1ac90 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f  ve lock range */
1aca0 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20  .        failed 
1acb0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
1acc0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
1acd0 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ile, SHARED_FIRS
1ace0 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  T, .            
1acf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad00 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20     SHARED_SIZE, 
1ad10 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
1ad20 66 61 69 6c 65 64 20 26 26 20 28 66 61 69 6c 65  failed && (faile
1ad30 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  d2 = afpSetLock(
1ad40 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
1ad50 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20   pFile, .       
1ad60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad70 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 70  SHARED_FIRST + p
1ad80 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
1ad90 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20 20  e, 1, 1)) ){.   
1ada0 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74 20         /* Can't 
1adb0 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  reestablish the 
1adc0 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71  shared lock.  Sq
1add0 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c 2c  lite can't deal,
1ade0 20 74 68 69 73 20 69 73 0a 20 20 20 20 20 20 20   this is.       
1adf0 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61 6c     ** a critical
1ae00 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20 20   I/O error.     
1ae10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1ae20 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64 20    rc = ((failed 
1ae30 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  & SQLITE_IOERR) 
1ae40 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  == SQLITE_IOERR)
1ae50 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20   ? failed2 : .  
1ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1ae70 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
1ae80 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61            goto a
1ae90 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
1aea0 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65       } .      }e
1aeb0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
1aec0 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20  = failed; .     
1aed0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1aee0 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20   failed ){.     
1aef0 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20   rc = failed;.  
1af00 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28    }.  }.  .  if(
1af10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1af20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
1af30 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
1af40 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ck;.    pInode->
1af50 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
1af60 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69  eLock;.  }else i
1af70 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
1af80 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
1af90 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
1afa0 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
1afb0 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
1afc0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
1afd0 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20  DING_LOCK;.  }. 
1afe0 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a   .afp_end_lock:.
1aff0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
1b000 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ();.  OSTRACE(("
1b010 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73  LOCK    %d %s %s
1b020 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
1b030 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ->h, azFileLock(
1b040 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20  eFileLock), .   
1b050 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
1b060 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
1b070 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
1b080 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
1b090 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
1b0a0 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
1b0b0 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
1b0c0 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
1b0d0 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
1b0e0 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
1b0f0 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
1b100 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
1b110 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
1b120 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
1b130 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
1b140 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
1b150 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
1b160 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
1b170 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
1b180 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
1b190 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c  nt afpUnlock(sql
1b1a0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1b1b0 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
1b1c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1b1d0 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
1b1e0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
1b1f0 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
1b200 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
1b210 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
1b220 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
1b230 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
1b240 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
1b250 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
1b260 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d  int skipShared =
1b270 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
1b280 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d  E_TEST.  int h =
1b290 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69   pFile->h;.#endi
1b2a0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  f..  assert( pFi
1b2b0 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
1b2c0 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
1b2d0 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69  was %d(%d,%d) pi
1b2e0 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70  d=%d (afp)\n", p
1b2f0 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
1b300 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
1b310 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
1b320 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
1b330 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
1b340 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
1b350 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  d,.           os
1b360 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20  Getpid(0)));..  
1b370 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
1b380 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
1b390 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
1b3a0 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c  FileLock<=eFileL
1b3b0 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
1b3c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1b3d0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
1b3e0 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
1b3f0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
1b400 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
1b410 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20  >nShared!=0 );. 
1b420 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
1b430 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
1b440 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
1b450 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
1b460 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65  ck==pFile->eFile
1b470 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75  Lock );.    Simu
1b480 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1b490 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  n(1);.    Simula
1b4a0 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31  teIOError( h=(-1
1b4b0 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  ) ).    Simulate
1b4c0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
1b4d0 3b 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53 51  ;.    .#ifdef SQ
1b4e0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
1b4f0 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20  * When reducing 
1b500 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74  a lock such that
1b510 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
1b520 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a   can start.    *
1b530 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  * reading the da
1b540 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69  tabase file agai
1b550 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  n, make sure tha
1b560 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  t the.    ** tra
1b570 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1b580 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20   was updated if 
1b590 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1b5a0 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
1b5b0 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49  file changed.  I
1b5c0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1b5d0 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74  n counter is not
1b5e0 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a   updated,.    **
1b5f0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
1b600 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66  ns to the same f
1b610 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65  ile might not re
1b620 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a  alize that.    *
1b630 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63  * the file has c
1b640 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65  hanged and hence
1b650 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20   might not know 
1b660 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20  to flush their. 
1b670 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68     ** cache.  Th
1b680 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65  e use of a stale
1b690 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20   cache can lead 
1b6a0 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
1b6b0 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  uption..    */. 
1b6c0 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
1b6d0 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d  ->inNormalWrite=
1b6e0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
1b6f0 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
1b700 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
1b710 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e  | pFile->transCn
1b720 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20  trChng==1 );.   
1b730 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
1b740 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
1b750 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 70  f.    .    if( p
1b760 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
1b770 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
1b780 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66  ){.      rc = af
1b790 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
1b7a0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
1b7b0 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53   SHARED_FIRST, S
1b7c0 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
1b7d0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1b7e0 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c  LITE_OK && (eFil
1b7f0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
1b800 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK || pInode->nS
1b810 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20 20 20  hared>1) ){.    
1b820 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65      /* only re-e
1b830 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
1b840 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65  red lock if nece
1b850 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20  ssary */.       
1b860 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42   int sharedLockB
1b870 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52  yte = SHARED_FIR
1b880 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65  ST+pInode->share
1b890 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72  dByte;.        r
1b8a0 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
1b8b0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
1b8c0 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63  pFile, sharedLoc
1b8d0 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  kByte, 1, 1);.  
1b8e0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
1b8f0 20 20 20 20 20 73 6b 69 70 53 68 61 72 65 64 20       skipShared 
1b900 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1b910 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
1b920 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c  QLITE_OK && pFil
1b930 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
1b940 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20  NDING_LOCK ){.  
1b950 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
1b960 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
1b970 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
1b980 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  ING_BYTE, 1, 0);
1b990 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28 20  .    } .    if( 
1b9a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1b9b0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
1b9c0 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
1b9d0 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73   && context->res
1b9e0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20 20 72  erved ){.      r
1b9f0 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
1ba00 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
1ba10 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
1ba20 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
1ba30 20 20 20 69 66 28 20 21 72 63 20 29 7b 20 0a 20     if( !rc ){ . 
1ba40 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e         context->
1ba50 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20 0a 20  reserved = 0; . 
1ba60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1ba70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ba80 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b  OK && (eFileLock
1ba90 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
1baa0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
1bab0 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  >1)){.      pIno
1bac0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
1bad0 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
1bae0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
1baf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46  =SQLITE_OK && eF
1bb00 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ileLock==NO_LOCK
1bb10 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72   ){..    /* Decr
1bb20 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64  ement the shared
1bb30 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20   lock counter.  
1bb40 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
1bb50 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
1bb60 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68   OS call only wh
1bb70 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69  en all threads i
1bb80 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63  n this same proc
1bb90 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65  ess have release
1bba0 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  d.    ** the loc
1bbb0 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e  k..    */.    un
1bbc0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
1bbd0 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20   sharedLockByte 
1bbe0 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70  = SHARED_FIRST+p
1bbf0 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
1bc00 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  e;.    pInode->n
1bc10 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66  Shared--;.    if
1bc20 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
1bc30 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 69  d==0 ){.      Si
1bc40 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1bc50 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69  ign(1);.      Si
1bc60 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68  mulateIOError( h
1bc70 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69  =(-1) ).      Si
1bc80 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1bc90 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66  ign(0);.      if
1bca0 28 20 21 73 6b 69 70 53 68 61 72 65 64 20 29 7b  ( !skipShared ){
1bcb0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66  .        rc = af
1bcc0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
1bcd0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
1bce0 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c   sharedLockByte,
1bcf0 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   1, 0);.      }.
1bd00 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b        if( !rc ){
1bd10 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
1bd20 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
1bd30 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46  LOCK;.        pF
1bd40 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
1bd50 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
1bd60 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1bd70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1bd80 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
1bd90 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73  Lock--;.      as
1bda0 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c  sert( pInode->nL
1bdb0 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  ock>=0 );.      
1bdc0 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  if( pInode->nLoc
1bdd0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
1bde0 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
1bdf0 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pFile);.      }.
1be00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75      }.  }.  .  u
1be10 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
1be20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1be30 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46  E_OK ) pFile->eF
1be40 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
1be50 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ock;.  return rc
1be60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
1be70 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75   a file & cleanu
1be80 70 20 41 46 50 20 73 70 65 63 69 66 69 63 20 6c  p AFP specific l
1be90 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a  ocking context .
1bea0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
1beb0 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  pClose(sqlite3_f
1bec0 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
1bed0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1bee0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1bef0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1bf00 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  id;.  assert( id
1bf10 21 3d 30 20 29 3b 0a 20 20 61 66 70 55 6e 6c 6f  !=0 );.  afpUnlo
1bf20 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
1bf30 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
1bf40 78 28 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  x();.  if( pFile
1bf50 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70 46 69 6c  ->pInode && pFil
1bf60 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  e->pInode->nLock
1bf70 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
1bf80 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
1bf90 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f  ing locks, do no
1bfa0 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65  t actually close
1bfb0 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20   the file just. 
1bfc0 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73     ** yet becaus
1bfd0 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65  e that would cle
1bfe0 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20  ar those locks. 
1bff0 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68   Instead, add th
1c000 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65  e file.    ** de
1c010 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f  scriptor to pIno
1c020 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49  de->aPending.  I
1c030 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  t will be automa
1c040 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77  tically closed w
1c050 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  hen.    ** the l
1c060 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
1c070 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
1c080 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69  setPendingFd(pFi
1c090 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  le);.  }.  relea
1c0a0 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c  seInodeInfo(pFil
1c0b0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
1c0c0 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
1c0d0 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 72 63 20  gContext);.  rc 
1c0e0 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  = closeUnixFile(
1c0f0 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  id);.  unixLeave
1c100 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
1c110 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  n rc;.}..#endif 
1c120 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
1c130 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
1c140 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1c150 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  TYLE */./*.** Th
1c160 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20  e code above is 
1c170 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70  the AFP lock imp
1c180 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68  lementation.  Th
1c190 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66  e code is specif
1c1a0 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20  ic.** to MacOSX 
1c1b0 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  and does not wor
1c1c0 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20  k on other unix 
1c1d0 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61  platforms.  No a
1c1e0 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73  lternative.** is
1c1f0 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20   available.  If 
1c200 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c  you don't compil
1c210 65 20 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65  e for a mac, the
1c220 6e 20 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22  n the "unix-afp"
1c230 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61  .** VFS is not a
1c240 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a  vailable..**.***
1c250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c260 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46  ** End of the AF
1c270 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  P lock implement
1c280 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
1c290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
1c2a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c2b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c2c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c2d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c2e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 20 42 65 67 69 6e 20  ********* Begin 
1c360 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  NFS Locking ****
1c370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23  ************/..#
1c390 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
1c3a0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
1c3b0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1c3c0 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65  TYLE./*. ** Lowe
1c3d0 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
1c3e0 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
1c3f0 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
1c400 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
1c410 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62  eLock. ** must b
1c420 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
1c430 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
1c440 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20  . **. ** If the 
1c450 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
1c460 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
1c470 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
1c480 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20  at or below. ** 
1c490 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
1c4a0 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
1c4b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
1c4c0 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  o-op.. */.static
1c4d0 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73   int nfsUnlock(s
1c4e0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1c4f0 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
1c500 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55  .  return posixU
1c510 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c  nlock(id, eFileL
1c520 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64  ock, 1);.}..#end
1c530 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
1c540 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
1c550 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1c560 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a  G_STYLE */./*.**
1c570 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20   The code above 
1c580 69 73 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20  is the NFS lock 
1c590 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
1c5a0 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65   The code is spe
1c5b0 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f  cific.** to MacO
1c5c0 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  SX and does not 
1c5d0 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e  work on other un
1c5e0 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e  ix platforms.  N
1c5f0 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a  o alternative.**
1c600 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   is available.  
1c610 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
1c620 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
1c630 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d   the NFS lock im
1c640 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
1c650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c660 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
1c670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c6a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c6b0 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
1c6c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c6d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c6e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c6f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c700 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
1c710 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e  ***** Non-lockin
1c720 67 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d  g sqlite3_file m
1c730 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
1c740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c750 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ****.**.** The n
1c760 65 78 74 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  ext division con
1c770 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61  tains implementa
1c780 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65  tions for all me
1c790 74 68 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a  thods of the .**
1c7a0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62   sqlite3_file ob
1c7b0 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20  ject other than 
1c7c0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  the locking meth
1c7d0 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  ods.  The lockin
1c7e0 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65 72  g.** methods wer
1c7f0 65 20 64 65 66 69 6e 65 64 20 69 6e 20 64 69 76  e defined in div
1c800 69 73 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e  isions above (on
1c810 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
1c820 20 70 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e   per.** division
1c830 29 2e 20 20 54 68 6f 73 65 20 6d 65 74 68 6f 64  ).  Those method
1c840 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f  s that are commo
1c850 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67  n to all locking
1c860 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67 61   modes.** are ga
1c870 74 68 65 72 20 74 6f 67 65 74 68 65 72 20 69 6e  ther together in
1c880 74 6f 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e  to this division
1c890 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  ..*/../*.** Seek
1c8a0 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70   to the offset p
1c8b0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
1c8c0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68  ond argument, th
1c8d0 65 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20  en read cnt .** 
1c8e0 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e  bytes into pBuf.
1c8f0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1c900 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
1c910 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ally read..**.**
1c920 20 4e 42 3a 20 20 49 66 20 79 6f 75 20 64 65 66   NB:  If you def
1c930 69 6e 65 20 55 53 45 5f 50 52 45 41 44 20 6f 72  ine USE_PREAD or
1c940 20 55 53 45 5f 50 52 45 41 44 36 34 2c 20 74 68   USE_PREAD64, th
1c950 65 6e 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f  en it might also
1c960 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79  .** be necessary
1c970 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45   to define _XOPE
1c980 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62 65 20 35  N_SOURCE to be 5
1c990 30 30 2e 20 20 54 68 69 73 20 76 61 72 69 65 73  00.  This varies
1c9a0 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73   from.** one sys
1c9b0 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20  tem to another. 
1c9c0 20 53 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f   Since SQLite do
1c9d0 65 73 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53  es not define US
1c9e0 45 5f 50 52 45 41 44 0a 2a 2a 20 69 6e 20 61 6e  E_PREAD.** in an
1c9f0 79 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c  y form by defaul
1ca00 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61  t, we will not a
1ca10 74 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65  ttempt to define
1ca20 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a   _XOPEN_SOURCE..
1ca30 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20 23  ** See tickets #
1ca40 32 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a  2741 and #2681..
1ca50 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73  **.** To avoid s
1ca60 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e  tomping the errn
1ca70 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69  o value on a fai
1ca80 6c 65 64 20 72 65 61 64 20 74 68 65 20 6c 61 73  led read the las
1ca90 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20  tErrno value.** 
1caa0 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65  is set before re
1cab0 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
1cac0 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65  ic int seekAndRe
1cad0 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c  ad(unixFile *id,
1cae0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
1caf0 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75  ffset, void *pBu
1cb00 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69  f, int cnt){.  i
1cb10 6e 74 20 67 6f 74 3b 0a 20 20 69 6e 74 20 70 72  nt got;.  int pr
1cb20 69 6f 72 20 3d 20 30 3b 0a 23 69 66 20 28 21 64  ior = 0;.#if (!d
1cb30 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
1cb40 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 55 53  ) && !defined(US
1cb50 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69 36  E_PREAD64)).  i6
1cb60 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e  4 newOffset;.#en
1cb70 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41 52  dif.  TIMER_STAR
1cb80 54 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74  T;.  assert( cnt
1cb90 3d 3d 28 63 6e 74 26 30 78 31 66 66 66 66 29 20  ==(cnt&0x1ffff) 
1cba0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d  );.  assert( id-
1cbb0 3e 68 3e 32 20 29 3b 0a 20 20 64 6f 7b 0a 23 69  >h>2 );.  do{.#i
1cbc0 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
1cbd0 45 41 44 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f  EAD).    got = o
1cbe0 73 50 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42  sPread(id->h, pB
1cbf0 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
1cc00 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
1cc10 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20  Error( got = -1 
1cc20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
1cc30 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20  (USE_PREAD64).  
1cc40 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 36    got = osPread6
1cc50 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  4(id->h, pBuf, c
1cc60 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  nt, offset);.   
1cc70 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1cc80 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65  ( got = -1 );.#e
1cc90 6c 73 65 0a 20 20 20 20 6e 65 77 4f 66 66 73 65  lse.    newOffse
1cca0 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c  t = lseek(id->h,
1ccb0 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45   offset, SEEK_SE
1ccc0 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  T);.    Simulate
1ccd0 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73  IOError( newOffs
1cce0 65 74 20 3d 20 2d 31 20 29 3b 0a 20 20 20 20 69  et = -1 );.    i
1ccf0 66 28 20 6e 65 77 4f 66 66 73 65 74 3c 30 20 29  f( newOffset<0 )
1cd00 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
1cd10 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65  tErrno((unixFile
1cd20 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  *)id, errno);.  
1cd30 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1cd40 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f     }.    got = o
1cd50 73 52 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75  sRead(id->h, pBu
1cd60 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a  f, cnt);.#endif.
1cd70 20 20 20 20 69 66 28 20 67 6f 74 3d 3d 63 6e 74      if( got==cnt
1cd80 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
1cd90 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 20  ( got<0 ){.     
1cda0 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e 54   if( errno==EINT
1cdb0 52 20 29 7b 20 67 6f 74 20 3d 20 31 3b 20 63 6f  R ){ got = 1; co
1cdc0 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20 20 20 20  ntinue; }.      
1cdd0 70 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  prior = 0;.     
1cde0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
1cdf0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 20  (unixFile*)id,  
1ce00 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 62 72  errno);.      br
1ce10 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  eak;.    }else i
1ce20 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20  f( got>0 ){.    
1ce30 20 20 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a 20 20    cnt -= got;.  
1ce40 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 67 6f      offset += go
1ce50 74 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 20 2b  t;.      prior +
1ce60 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 42 75  = got;.      pBu
1ce70 66 20 3d 20 28 76 6f 69 64 2a 29 28 67 6f 74 20  f = (void*)(got 
1ce80 2b 20 28 63 68 61 72 2a 29 70 42 75 66 29 3b 0a  + (char*)pBuf);.
1ce90 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
1cea0 67 6f 74 3e 30 20 29 3b 0a 20 20 54 49 4d 45 52  got>0 );.  TIMER
1ceb0 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28  _END;.  OSTRACE(
1cec0 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25  ("READ    %-3d %
1ced0 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
1cee0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 64  ,.            id
1cef0 2d 3e 68 2c 20 67 6f 74 2b 70 72 69 6f 72 2c 20  ->h, got+prior, 
1cf00 6f 66 66 73 65 74 2d 70 72 69 6f 72 2c 20 54 49  offset-prior, TI
1cf10 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20  MER_ELAPSED));. 
1cf20 20 72 65 74 75 72 6e 20 67 6f 74 2b 70 72 69 6f   return got+prio
1cf30 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  r;.}../*.** Read
1cf40 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c   data from a fil
1cf50 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e  e into a buffer.
1cf60 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
1cf70 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74  OK if all.** byt
1cf80 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63  es were read suc
1cf90 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51  cessfully and SQ
1cfa0 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e  LITE_IOERR if an
1cfb0 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
1cfc0 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
1cfd0 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20  int unixRead(.  
1cfe0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1cff0 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  , .  void *pBuf,
1d000 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
1d010 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
1d020 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c  set.){.  unixFil
1d030 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1d040 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74  File *)id;.  int
1d050 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20   got;.  assert( 
1d060 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  id );.  assert( 
1d070 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 61  offset>=0 );.  a
1d080 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
1d090 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
1d0a0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
1d0b0 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c   (not a journal,
1d0c0 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
1d0d0 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c  or temp.  ** fil
1d0e0 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e  e), the bytes in
1d0f0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
1d100 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ge should never 
1d110 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1d120 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  en. */.#if 0.  a
1d130 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55  ssert( pFile->pU
1d140 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  nused==0.       
1d150 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49  || offset>=PENDI
1d160 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20  NG_BYTE+512.    
1d170 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74     || offset+amt
1d180 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a  <=PENDING_BYTE .
1d190 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66    );.#endif..#if
1d1a0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
1d1b0 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61  _SIZE>0.  /* Dea
1d1c0 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f  l with as much o
1d1d0 66 20 74 68 69 73 20 72 65 61 64 20 72 65 71 75  f this read requ
1d1e0 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20  est as possible 
1d1f0 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20  by transfering. 
1d200 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68   ** data from th
1d210 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  e memory mapping
1d220 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e   using memcpy().
1d230 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65    */.  if( offse
1d240 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  t<pFile->mmapSiz
1d250 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66  e ){.    if( off
1d260 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65  set+amt <= pFile
1d270 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1d280 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
1d290 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d   &((u8 *)(pFile-
1d2a0 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66  >pMapRegion))[of
1d2b0 66 73 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20  fset], amt);.   
1d2c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d2d0 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
1d2e0 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20        int nCopy 
1d2f0 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
1d300 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
1d310 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26    memcpy(pBuf, &
1d320 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
1d330 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
1d340 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20  et], nCopy);.   
1d350 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20     pBuf = &((u8 
1d360 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a  *)pBuf)[nCopy];.
1d370 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f        amt -= nCo
1d380 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  py;.      offset
1d390 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d   += nCopy;.    }
1d3a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 67  .  }.#endif..  g
1d3b0 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  ot = seekAndRead
1d3c0 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20  (pFile, offset, 
1d3d0 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66  pBuf, amt);.  if
1d3e0 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20  ( got==amt ){.  
1d3f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d400 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
1d410 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20  got<0 ){.    /* 
1d420 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79  lastErrno set by
1d430 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a   seekAndRead */.
1d440 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d450 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20  E_IOERR_READ;.  
1d460 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 6f 72 65  }else{.    store
1d470 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
1d480 20 30 29 3b 20 20 20 2f 2a 20 6e 6f 74 20 61 20   0);   /* not a 
1d490 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a  system error */.
1d4a0 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61      /* Unread pa
1d4b0 72 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65  rts of the buffe
1d4c0 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66  r must be zero-f
1d4d0 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d  illed */.    mem
1d4e0 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75  set(&((char*)pBu
1d4f0 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d  f)[got], 0, amt-
1d500 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  got);.    return
1d510 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
1d520 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a  ORT_READ;.  }.}.
1d530 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
1d540 6f 20 73 65 65 6b 20 74 68 65 20 66 69 6c 65 2d  o seek the file-
1d550 64 65 73 63 72 69 70 74 6f 72 20 70 61 73 73 65  descriptor passe
1d560 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
1d570 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20 61 62  rgument to.** ab
1d580 73 6f 6c 75 74 65 20 6f 66 66 73 65 74 20 69 4f  solute offset iO
1d590 66 66 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74  ff, then attempt
1d5a0 20 74 6f 20 77 72 69 74 65 20 6e 42 75 66 20 62   to write nBuf b
1d5b0 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 72 6f  ytes of data fro
1d5c0 6d 0a 2a 2a 20 70 42 75 66 20 74 6f 20 69 74 2e  m.** pBuf to it.
1d5d0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1d5e0 75 72 73 2c 20 72 65 74 75 72 6e 20 2d 31 20 61  urs, return -1 a
1d5f0 6e 64 20 73 65 74 20 2a 70 69 45 72 72 6e 6f 2e  nd set *piErrno.
1d600 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20   Otherwise, .** 
1d610 72 65 74 75 72 6e 20 74 68 65 20 61 63 74 75 61  return the actua
1d620 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
1d630 73 20 77 72 69 74 74 65 6e 20 28 77 68 69 63 68  s written (which
1d640 20 6d 61 79 20 62 65 20 6c 65 73 73 20 74 68 61   may be less tha
1d650 6e 0a 2a 2a 20 6e 42 75 66 29 2e 0a 2a 2f 0a 73  n.** nBuf)..*/.s
1d660 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e  tatic int seekAn
1d670 64 57 72 69 74 65 46 64 28 0a 20 20 69 6e 74 20  dWriteFd(.  int 
1d680 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fd,             
1d690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1d6a0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
1d6b0 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20  o write to */.  
1d6c0 69 36 34 20 69 4f 66 66 2c 20 20 20 20 20 20 20  i64 iOff,       
1d6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6e0 2f 2a 20 46 69 6c 65 20 6f 66 66 73 65 74 20 74  /* File offset t
1d6f0 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20  o begin writing 
1d700 61 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  at */.  const vo
1d710 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
1d720 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
1d730 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 62  data from this b
1d740 75 66 66 65 72 20 74 6f 20 74 68 65 20 66 69 6c  uffer to the fil
1d750 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 75 66 2c  e */.  int nBuf,
1d760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d770 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1d780 66 20 62 75 66 66 65 72 20 70 42 75 66 20 69 6e  f buffer pBuf in
1d790 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
1d7a0 2a 70 69 45 72 72 6e 6f 20 20 20 20 20 20 20 20  *piErrno        
1d7b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1d7c0 55 54 3a 20 45 72 72 6f 72 20 6e 75 6d 62 65 72  UT: Error number
1d7d0 20 69 66 20 65 72 72 6f 72 20 6f 63 63 75 72 73   if error occurs
1d7e0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
1d7f0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1d800 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
1d810 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 79  e returned by sy
1d820 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20  stem call */..  
1d830 61 73 73 65 72 74 28 20 6e 42 75 66 3d 3d 28 6e  assert( nBuf==(n
1d840 42 75 66 26 30 78 31 66 66 66 66 29 20 29 3b 0a  Buf&0x1ffff) );.
1d850 20 20 61 73 73 65 72 74 28 20 66 64 3e 32 20 29    assert( fd>2 )
1d860 3b 0a 20 20 61 73 73 65 72 74 28 20 70 69 45 72  ;.  assert( piEr
1d870 72 6e 6f 21 3d 30 20 29 3b 0a 20 20 6e 42 75 66  rno!=0 );.  nBuf
1d880 20 26 3d 20 30 78 31 66 66 66 66 3b 0a 20 20 54   &= 0x1ffff;.  T
1d890 49 4d 45 52 5f 53 54 41 52 54 3b 0a 0a 23 69 66  IMER_START;..#if
1d8a0 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
1d8b0 41 44 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20 28  AD).  do{ rc = (
1d8c0 69 6e 74 29 6f 73 50 77 72 69 74 65 28 66 64 2c  int)osPwrite(fd,
1d8d0 20 70 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66   pBuf, nBuf, iOf
1d8e0 66 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30  f); }while( rc<0
1d8f0 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
1d900 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65   );.#elif define
1d910 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
1d920 20 64 6f 7b 20 72 63 20 3d 20 28 69 6e 74 29 6f   do{ rc = (int)o
1d930 73 50 77 72 69 74 65 36 34 28 66 64 2c 20 70 42  sPwrite64(fd, pB
1d940 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b  uf, nBuf, iOff);
1d950 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
1d960 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23  errno==EINTR);.#
1d970 65 6c 73 65 0a 20 20 64 6f 7b 0a 20 20 20 20 69  else.  do{.    i
1d980 36 34 20 69 53 65 65 6b 20 3d 20 6c 73 65 65 6b  64 iSeek = lseek
1d990 28 66 64 2c 20 69 4f 66 66 2c 20 53 45 45 4b 5f  (fd, iOff, SEEK_
1d9a0 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  SET);.    Simula
1d9b0 74 65 49 4f 45 72 72 6f 72 28 20 69 53 65 65 6b  teIOError( iSeek
1d9c0 20 3d 20 2d 31 20 29 3b 0a 20 20 20 20 69 66 28   = -1 );.    if(
1d9d0 20 69 53 65 65 6b 3c 30 20 29 7b 0a 20 20 20 20   iSeek<0 ){.    
1d9e0 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1d9f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1da00 20 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66    rc = osWrite(f
1da10 64 2c 20 70 42 75 66 2c 20 6e 42 75 66 29 3b 0a  d, pBuf, nBuf);.
1da20 20 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26    }while( rc<0 &
1da30 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
1da40 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 54 49 4d 45  ;.#endif..  TIME
1da50 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45  R_END;.  OSTRACE
1da60 28 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20  (("WRITE   %-3d 
1da70 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e  %5d %7lld %llu\n
1da80 22 2c 20 66 64 2c 20 72 63 2c 20 69 4f 66 66 2c  ", fd, rc, iOff,
1da90 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29   TIMER_ELAPSED))
1daa0 3b 0a 0a 20 20 69 66 28 20 72 63 3c 30 20 29 20  ;..  if( rc<0 ) 
1dab0 2a 70 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  *piErrno = errno
1dac0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1dad0 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f  .../*.** Seek to
1dae0 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69   the offset in i
1daf0 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72  d->offset then r
1db00 65 61 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e  ead cnt bytes in
1db10 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75  to pBuf..** Retu
1db20 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1db30 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
1db40 72 65 61 64 2e 20 20 55 70 64 61 74 65 20 74 68  read.  Update th
1db50 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  e offset..**.** 
1db60 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e  To avoid stompin
1db70 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75  g the errno valu
1db80 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 77 72  e on a failed wr
1db90 69 74 65 20 74 68 65 20 6c 61 73 74 45 72 72 6e  ite the lastErrn
1dba0 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  o value.** is se
1dbb0 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  t before returni
1dbc0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
1dbd0 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75  t seekAndWrite(u
1dbe0 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69 36 34  nixFile *id, i64
1dbf0 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74 20 76   offset, const v
1dc00 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63  oid *pBuf, int c
1dc10 6e 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 65  nt){.  return se
1dc20 65 6b 41 6e 64 57 72 69 74 65 46 64 28 69 64 2d  ekAndWriteFd(id-
1dc30 3e 68 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66  >h, offset, pBuf
1dc40 2c 20 63 6e 74 2c 20 26 69 64 2d 3e 6c 61 73 74  , cnt, &id->last
1dc50 45 72 72 6e 6f 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Errno);.}.../*.*
1dc60 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f  * Write data fro
1dc70 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20  m a buffer into 
1dc80 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20  a file.  Return 
1dc90 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
1dca0 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  cess.** or some 
1dcb0 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
1dcc0 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   on failure..*/.
1dcd0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 57  static int unixW
1dce0 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  rite(.  sqlite3_
1dcf0 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e  file *id, .  con
1dd00 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a  st void *pBuf, .
1dd10 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c    int amt,.  sql
1dd20 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
1dd30 74 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  t .){.  unixFile
1dd40 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
1dd50 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 77  ile*)id;.  int w
1dd60 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65  rote = 0;.  asse
1dd70 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65  rt( id );.  asse
1dd80 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20  rt( amt>0 );..  
1dd90 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
1dda0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
1ddb0 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61  ot a journal, ma
1ddc0 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20  ster-journal or 
1ddd0 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c  temp.  ** file),
1dde0 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
1ddf0 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20  e locking range 
1de00 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20  should never be 
1de10 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
1de20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65   */.#if 0.  asse
1de30 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73  rt( pFile->pUnus
1de40 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ed==0.       || 
1de50 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f  offset>=PENDING_
1de60 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20  BYTE+512.       
1de70 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50  || offset+amt<=P
1de80 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29  ENDING_BYTE .  )
1de90 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
1dea0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1deb0 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  /* If we are doi
1dec0 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74  ng a normal writ
1ded0 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  e to a database 
1dee0 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64  file (as opposed
1def0 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61   to.  ** doing a
1df00 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
1df10 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65  lback or a write
1df20 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74   to some file ot
1df30 68 65 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20  her than a.  ** 
1df40 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20  normal database 
1df50 66 69 6c 65 29 20 74 68 65 6e 20 72 65 63 6f 72  file) then recor
1df60 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
1df70 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
1df80 2a 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20  * has changed.  
1df90 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
1dfa0 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f  on counter is mo
1dfb0 64 69 66 69 65 64 2c 20 72 65 63 6f 72 64 20 74  dified, record t
1dfc0 68 61 74 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f  hat.  ** fact to
1dfd0 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  o..  */.  if( pF
1dfe0 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
1dff0 74 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  te ){.    pFile-
1e000 3e 64 62 55 70 64 61 74 65 20 3d 20 31 3b 20 20  >dbUpdate = 1;  
1e010 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1e020 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
1e030 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 66  d */.    if( off
1e040 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66 73 65  set<=24 && offse
1e050 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20  t+amt>=27 ){.   
1e060 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
1e070 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d   char oldCntr[4]
1e080 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
1e090 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
1e0a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 65  ;.      rc = see
1e0b0 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20  kAndRead(pFile, 
1e0c0 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b  24, oldCntr, 4);
1e0d0 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
1e0e0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
1e0f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 34  .      if( rc!=4
1e100 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e   || memcmp(oldCn
1e110 74 72 2c 20 26 28 28 63 68 61 72 2a 29 70 42 75  tr, &((char*)pBu
1e120 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34  f)[24-offset], 4
1e130 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1e140 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
1e150 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68  Chng = 1;  /* Th
1e160 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
1e170 75 6e 74 65 72 20 68 61 73 20 63 68 61 6e 67 65  unter has change
1e180 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  d */.      }.   
1e190 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23   }.  }.#endif..#
1e1a0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1e1b0 45 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45  E_MMAP_READWRITE
1e1c0 29 20 26 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) && SQLITE_MAX_
1e1d0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a  MMAP_SIZE>0.  /*
1e1e0 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75   Deal with as mu
1e1f0 63 68 20 6f 66 20 74 68 69 73 20 77 72 69 74 65  ch of this write
1e200 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73   request as poss
1e210 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72  ible by transfer
1e220 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72  ing.  ** data fr
1e230 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61  om the memory ma
1e240 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63  pping using memc
1e250 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20  py().  */.  if( 
1e260 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d  offset<pFile->mm
1e270 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66  apSize ){.    if
1e280 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20  ( offset+amt <= 
1e290 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1e2a0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
1e2b0 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
1e2c0 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
1e2d0 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29  set], pBuf, amt)
1e2e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1e2f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1e300 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
1e310 43 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d  Copy = pFile->mm
1e320 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  apSize - offset;
1e330 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28  .      memcpy(&(
1e340 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
1e350 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
1e360 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29  t], pBuf, nCopy)
1e370 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26  ;.      pBuf = &
1e380 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f  ((u8 *)pBuf)[nCo
1e390 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d  py];.      amt -
1e3a0 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f  = nCopy;.      o
1e3b0 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a  ffset += nCopy;.
1e3c0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1e3d0 0a 20 0a 20 20 77 68 69 6c 65 28 20 28 77 72 6f  . .  while( (wro
1e3e0 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74  te = seekAndWrit
1e3f0 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c  e(pFile, offset,
1e400 20 70 42 75 66 2c 20 61 6d 74 29 29 3c 61 6d 74   pBuf, amt))<amt
1e410 20 26 26 20 77 72 6f 74 65 3e 30 20 29 7b 0a 20   && wrote>0 ){. 
1e420 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b     amt -= wrote;
1e430 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77  .    offset += w
1e440 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d  rote;.    pBuf =
1e450 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b   &((char*)pBuf)[
1e460 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69  wrote];.  }.  Si
1e470 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20  mulateIOError(( 
1e480 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d  wrote=(-1), amt=
1e490 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  1 ));.  Simulate
1e4a0 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20  DiskfullError(( 
1e4b0 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29  wrote=0, amt=1 )
1e4c0 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e 77 72  );..  if( amt>wr
1e4d0 6f 74 65 20 29 7b 0a 20 20 20 20 69 66 28 20 77  ote ){.    if( w
1e4e0 72 6f 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d  rote<0 && pFile-
1e4f0 3e 6c 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53  >lastErrno!=ENOS
1e500 50 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c  PC ){.      /* l
1e510 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20  astErrno set by 
1e520 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a  seekAndWrite */.
1e530 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e540 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
1e550 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e560 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
1e570 28 70 46 69 6c 65 2c 20 30 29 3b 20 2f 2a 20 6e  (pFile, 0); /* n
1e580 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f  ot a system erro
1e590 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  r */.      retur
1e5a0 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
1e5b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
1e5c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1e5d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1e5e0 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  EST./*.** Count 
1e5f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75  the number of fu
1e600 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d  llsyncs and norm
1e610 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20  al syncs.  This 
1e620 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a  is used to test.
1e630 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e  ** that syncs an
1e640 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20  d fullsyncs are 
1e650 6f 63 63 75 72 72 69 6e 67 20 61 74 20 74 68 65  occurring at the
1e660 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f   right times..*/
1e670 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e  .int sqlite3_syn
1e680 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74  c_count = 0;.int
1e690 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
1e6a0 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  c_count = 0;.#en
1e6b0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f  dif../*.** We do
1e6c0 20 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74 65   not trust syste
1e6d0 6d 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20  ms to provide a 
1e6e0 77 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79 6e  working fdatasyn
1e6f0 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a  c().  Some do..*
1e700 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20  * Others do no. 
1e710 20 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65 20   To be safe, we 
1e720 77 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68 20  will stick with 
1e730 74 68 65 20 28 73 6c 69 67 68 74 6c 79 20 73 6c  the (slightly sl
1e740 6f 77 65 72 29 0a 2a 2a 20 66 73 79 6e 63 28 29  ower).** fsync()
1e750 2e 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68  . If you know th
1e760 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64  at your system d
1e770 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74  oes support fdat
1e780 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c  async() correctl
1e790 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c  y,.** then simpl
1e7a0 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d  y compile with -
1e7b0 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61  Dfdatasync=fdata
1e7c0 73 79 6e 63 20 6f 72 20 2d 44 48 41 56 45 5f 46  sync or -DHAVE_F
1e7d0 44 41 54 41 53 59 4e 43 0a 2a 2f 0a 23 69 66 20  DATASYNC.*/.#if 
1e7e0 21 64 65 66 69 6e 65 64 28 66 64 61 74 61 73 79  !defined(fdatasy
1e7f0 6e 63 29 20 26 26 20 21 48 41 56 45 5f 46 44 41  nc) && !HAVE_FDA
1e800 54 41 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  TASYNC.# define 
1e810 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a  fdatasync fsync.
1e820 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
1e830 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
1e840 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65  YNC to 0 or 1 de
1e850 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
1e860 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65  er or not.** the
1e870 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63   F_FULLFSYNC mac
1e880 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20  ro is defined.  
1e890 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63  F_FULLFSYNC is c
1e8a0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79  urrently.** only
1e8b0 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61   available on Ma
1e8c0 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61  c OS X.  But tha
1e8d0 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a  t could change..
1e8e0 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c  */.#ifdef F_FULL
1e8f0 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48  FSYNC.# define H
1e900 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a  AVE_FULLFSYNC 1.
1e910 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48  #else.# define H
1e920 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a  AVE_FULLFSYNC 0.
1e930 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1e940 51 4c 49 54 45 5f 55 53 45 5f 52 45 51 55 45 53  QLITE_USE_REQUES
1e950 54 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 69 6d 70  T_FULLFSYNC.#imp
1e960 6f 72 74 20 3c 6e 6f 74 69 66 79 2e 68 3e 0a 23  ort <notify.h>.#
1e970 69 6d 70 6f 72 74 20 3c 6c 69 62 6b 65 72 6e 2f  import <libkern/
1e980 4f 53 41 74 6f 6d 69 63 2e 68 3e 0a 73 74 61 74  OSAtomic.h>.stat
1e990 69 63 20 4f 53 53 70 69 6e 4c 6f 63 6b 20 6e 6f  ic OSSpinLock no
1e9a0 74 69 66 79 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 23  tify_lock = 0;.#
1e9b0 64 65 66 69 6e 65 20 52 45 51 55 45 53 54 5f 46  define REQUEST_F
1e9c0 55 4c 4c 53 59 4e 43 5f 4e 4f 54 49 46 49 43 41  ULLSYNC_NOTIFICA
1e9d0 54 49 4f 4e 20 20 20 20 22 63 6f 6d 2e 61 70 70  TION    "com.app
1e9e0 6c 65 2e 72 65 71 73 79 6e 63 22 0a 23 65 6e 64  le.reqsync".#end
1e9f0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73  if../*.** The fs
1ea00 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ync() system cal
1ea10 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  l does not work 
1ea20 61 73 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e  as advertised on
1ea30 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79   many.** unix sy
1ea40 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c  stems.  The foll
1ea50 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20  owing procedure 
1ea60 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
1ea70 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b   make.** it work
1ea80 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   better..**.** T
1ea90 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
1eaa0 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73  C macro disables
1eab0 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20   all fsync()s.  
1eac0 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a  This is useful.*
1ead0 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68  * for testing wh
1eae0 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75  en we want to ru
1eaf0 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 65  n through the te
1eb00 73 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79  st suite quickly
1eb10 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72  ..** You are str
1eb20 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e  ongly advised *n
1eb30 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69  ot* to deploy wi
1eb40 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  th SQLITE_NO_SYN
1eb50 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f  C.** enabled, ho
1eb60 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74  wever, since wit
1eb70 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  h SQLITE_NO_SYNC
1eb80 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20   enabled, an OS 
1eb90 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65  crash.** or powe
1eba0 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c  r failure will l
1ebb0 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68  ikely corrupt th
1ebc0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1ebd0 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65  .**.** SQLite se
1ebe0 74 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20  ts the dataOnly 
1ebf0 66 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a 65  flag if the size
1ec00 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
1ec10 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68  unchanged..** Th
1ec20 65 20 69 64 65 61 20 62 65 68 69 6e 64 20 64 61  e idea behind da
1ec30 74 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69  taOnly is that i
1ec40 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72  t should only wr
1ec50 69 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e  ite the file con
1ec60 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c  tent.** to disk,
1ec70 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20   not the inode. 
1ec80 20 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74   We only set dat
1ec90 61 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c  aOnly if the fil
1eca0 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e  e size is .** un
1ecb0 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68  changed since th
1ecc0 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70  e file size is p
1ecd0 61 72 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65  art of the inode
1ece0 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20  .  However, .** 
1ecf0 54 65 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75  Ted Ts'o tells u
1ed00 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63  s that fdatasync
1ed10 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69  () will also wri
1ed20 74 65 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20  te the inode if 
1ed30 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65  the.** file size
1ed40 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54   has changed.  T
1ed50 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66  he only real dif
1ed60 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
1ed70 66 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61  fdatasync().** a
1ed80 6e 64 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20  nd fsync(), Ted 
1ed90 74 65 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61  tells us, is tha
1eda0 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69  t fdatasync() wi
1edb0 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65  ll not flush the
1edc0 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65  .** inode if the
1edd0 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20   mtime or owner 
1ede0 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61  or other inode a
1edf0 74 74 72 69 62 75 74 65 73 20 68 61 76 65 20 63  ttributes have c
1ee00 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e  hanged..** We on
1ee10 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ly care about th
1ee20 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74  e file size, not
1ee30 20 74 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20   the other file 
1ee40 61 74 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a  attributes, so.*
1ee50 2a 20 61 73 20 66 61 72 20 61 73 20 53 51 4c 69  * as far as SQLi
1ee60 74 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c  te is concerned,
1ee70 20 61 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20   an fdatasync() 
1ee80 69 73 20 61 6c 77 61 79 73 20 61 64 65 71 75 61  is always adequa
1ee90 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c  te..** So, we al
1eea0 77 61 79 73 20 75 73 65 20 66 64 61 74 61 73 79  ways use fdatasy
1eeb0 6e 63 28 29 20 69 66 20 69 74 20 69 73 20 61 76  nc() if it is av
1eec0 61 69 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c  ailable, regardl
1eed0 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61  ess of.** the va
1eee0 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f  lue of the dataO
1eef0 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61  nly flag..*/.sta
1ef00 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79  tic int full_fsy
1ef10 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66  nc(int fd, int f
1ef20 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74  ullSync, int dat
1ef30 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63  aOnly){.  int rc
1ef40 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
1ef50 6f 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69  owing "ifdef/eli
1ef60 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68  f/else/" block h
1ef70 61 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 75  as the same stru
1ef80 63 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68  cture as.  ** th
1ef90 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20  e one below. It 
1efa0 69 73 20 72 65 70 6c 69 63 61 74 65 64 20 68 65  is replicated he
1efb0 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f  re solely to avo
1efc0 69 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20  id cluttering . 
1efd0 20 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20   ** up the real 
1efe0 63 6f 64 65 20 77 69 74 68 20 74 68 65 20 55 4e  code with the UN
1eff0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29  USED_PARAMETER()
1f000 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69   macros..  */.#i
1f010 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
1f020 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  YNC.  UNUSED_PAR
1f030 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e  AMETER(fd);.  UN
1f040 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
1f050 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53  ullSync);.  UNUS
1f060 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
1f070 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41  aOnly);.#elif HA
1f080 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55  VE_FULLFSYNC.  U
1f090 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1f0a0 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65  dataOnly);.#else
1f0b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1f0c0 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  TER(fullSync);. 
1f0d0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1f0e0 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e  R(dataOnly);.#en
1f0f0 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64  dif..  /* Record
1f100 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
1f110 69 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20  imes that we do 
1f120 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29  a normal fsync()
1f130 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53   and .  ** FULLS
1f140 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73  YNC.  This is us
1f150 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ed during testin
1f160 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  g to verify that
1f170 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a   this procedure.
1f180 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64    ** gets called
1f190 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
1f1a0 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a  t arguments..  *
1f1b0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1f1c0 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53  TEST.  if( fullS
1f1d0 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75  ync ) sqlite3_fu
1f1e0 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  llsync_count++;.
1f1f0 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63    sqlite3_sync_c
1f200 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ount++;.#endif..
1f210 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69    /* If we compi
1f220 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c  led with the SQL
1f230 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67  ITE_NO_SYNC flag
1f240 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69  , then syncing i
1f250 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 2e 20  s a.  ** no-op. 
1f260 20 42 75 74 20 67 6f 20 61 68 65 61 64 20 61 6e   But go ahead an
1f270 64 20 63 61 6c 6c 20 66 73 74 61 74 28 29 20 74  d call fstat() t
1f280 6f 20 76 61 6c 69 64 61 74 65 20 74 68 65 20 66  o validate the f
1f290 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70  ile.  ** descrip
1f2a0 74 6f 72 20 61 73 20 77 65 20 6e 65 65 64 20 61  tor as we need a
1f2b0 20 6d 65 74 68 6f 64 20 74 6f 20 70 72 6f 76 6f   method to provo
1f2c0 6b 65 20 61 20 66 61 69 6c 75 72 65 20 64 75 72  ke a failure dur
1f2d0 69 6e 67 0a 20 20 2a 2a 20 63 6f 76 65 72 61 74  ing.  ** coverat
1f2e0 65 20 74 65 73 74 69 6e 67 2e 0a 20 20 2a 2f 0a  e testing..  */.
1f2f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  #ifdef SQLITE_NO
1f300 5f 53 59 4e 43 0a 20 20 7b 0a 20 20 20 20 73 74  _SYNC.  {.    st
1f310 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
1f320 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28     rc = osFstat(
1f330 66 64 2c 20 26 62 75 66 29 3b 0a 20 20 7d 0a 23  fd, &buf);.  }.#
1f340 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53  elif HAVE_FULLFS
1f350 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  YNC.  if( fullSy
1f360 6e 63 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  nc ){.#ifdef SQL
1f370 49 54 45 5f 55 53 45 5f 52 45 51 55 45 53 54 5f  ITE_USE_REQUEST_
1f380 46 55 4c 4c 46 53 59 4e 43 0a 20 20 20 20 72 63  FULLFSYNC.    rc
1f390 20 3d 20 6f 73 46 73 79 6e 63 28 66 64 29 3b 0a   = osFsync(fd);.
1f3a0 20 20 20 20 69 66 20 28 21 72 63 29 20 7b 0a 20      if (!rc) {. 
1f3b0 20 20 20 20 20 4f 53 53 70 69 6e 4c 6f 63 6b 4c       OSSpinLockL
1f3c0 6f 63 6b 28 26 6e 6f 74 69 66 79 5f 6c 6f 63 6b  ock(&notify_lock
1f3d0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 6f  );.      rc = no
1f3e0 74 69 66 79 5f 70 6f 73 74 28 52 45 51 55 45 53  tify_post(REQUES
1f3f0 54 5f 46 55 4c 4c 53 59 4e 43 5f 4e 4f 54 49 46  T_FULLSYNC_NOTIF
1f400 49 43 41 54 49 4f 4e 29 3b 0a 20 20 20 20 20 20  ICATION);.      
1f410 4f 53 53 70 69 6e 4c 6f 63 6b 55 6e 6c 6f 63 6b  OSSpinLockUnlock
1f420 28 26 6e 6f 74 69 66 79 5f 6c 6f 63 6b 29 3b 0a  (&notify_lock);.
1f430 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
1f440 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c  rc = osFcntl(fd,
1f450 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29   F_FULLFSYNC, 0)
1f460 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
1f470 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  {.    rc = 1;.  
1f480 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55  }.  /* If the FU
1f490 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20  LLFSYNC failed, 
1f4a0 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74  fall back to att
1f4b0 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63  empting an fsync
1f4c0 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75  ()..  ** It shou
1f4d0 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c  ldn't be possibl
1f4e0 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20  e for fullfsync 
1f4f0 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c  to fail on the l
1f500 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  ocal .  ** file 
1f510 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c  system (on OSX),
1f520 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69   so failure indi
1f530 63 61 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46  cates that FULLF
1f540 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20  SYNC.  ** isn't 
1f550 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68  supported for th
1f560 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20  is file system. 
1f570 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66  So, attempt an f
1f580 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28  sync .  ** and (
1f590 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20  for now) ignore 
1f5a0 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20  the overhead of 
1f5b0 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63  a superfluous fc
1f5c0 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a  ntl call.  .  **
1f5d0 20 49 74 27 64 20 62 65 20 62 65 74 74 65 72 20   It'd be better 
1f5e0 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73  to detect fullfs
1f5f0 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65  ync support once
1f600 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a   and avoid .  **
1f610 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20   the fcntl call 
1f620 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20  every time sync 
1f630 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a  is called..  */.
1f640 20 20 69 66 28 20 72 63 20 29 20 72 63 20 3d 20    if( rc ) rc = 
1f650 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69  fsync(fd);..#eli
1f660 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1f670 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61 73  E__).  /* fdatas
1f680 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f  ync() on HFS+ do
1f690 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20  esn't yet flush 
1f6a0 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66  the file size if
1f6b0 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72   it changed corr
1f6c0 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75  ectly.  ** so cu
1f6d0 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75  rrently we defau
1f6e0 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20  lt to the macro 
1f6f0 74 68 61 74 20 72 65 64 65 66 69 6e 65 73 20 66  that redefines f
1f700 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e  datasync to fsyn
1f710 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73  c.  */.  rc = fs
1f720 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a  ync(fd);.#else .
1f730 20 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63    rc = fdatasync
1f740 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57  (fd);.#if OS_VXW
1f750 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d  ORKS.  if( rc==-
1f760 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54  1 && errno==ENOT
1f770 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  SUP ){.    rc = 
1f780 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23  fsync(fd);.  }.#
1f790 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
1f7a0 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  RKS */.#endif /*
1f7b0 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f   ifdef SQLITE_NO
1f7c0 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f  _SYNC elif HAVE_
1f7d0 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20  FULLFSYNC */..  
1f7e0 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26  if( OS_VXWORKS &
1f7f0 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20  & rc!= -1 ){.   
1f800 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72   rc = 0;.  }.  r
1f810 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1f820 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64  ** Open a file d
1f830 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
1f840 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
1f850 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65  ining file zFile
1f860 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63  name..** If succ
1f870 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20  essful, *pFd is 
1f880 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65  set to the opene
1f890 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
1f8a0 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  r and.** SQLITE_
1f8b0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
1f8c0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1f8d0 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54  rs, either SQLIT
1f8e0 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51  E_NOMEM.** or SQ
1f8f0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73  LITE_CANTOPEN is
1f900 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1f910 46 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  Fd is set to an 
1f920 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c  undefined.** val
1f930 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  ue..**.** The di
1f940 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73  rectory file des
1f950 63 72 69 70 74 6f 72 20 69 73 20 75 73 65 64 20  criptor is used 
1f960 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20 74 68 69  for only one thi
1f970 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e 63  ng - to.** fsync
1f980 28 29 20 61 20 64 69 72 65 63 74 6f 72 79 20 74  () a directory t
1f990 6f 20 6d 61 6b 65 20 73 75 72 65 20 66 69 6c 65  o make sure file
1f9a0 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 64 65   creation and de
1f9b0 6c 65 74 69 6f 6e 20 65 76 65 6e 74 73 0a 2a 2a  letion events.**
1f9c0 20 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20   are flushed to 
1f9d0 64 69 73 6b 2e 20 20 53 75 63 68 20 66 73 79 6e  disk.  Such fsyn
1f9e0 63 73 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65  cs are not neede
1f9f0 64 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a 6f  d on newer.** jo
1fa00 75 72 6e 61 6c 69 6e 67 20 66 69 6c 65 73 79 73  urnaling filesys
1fa10 74 65 6d 73 2c 20 62 75 74 20 61 72 65 20 72 65  tems, but are re
1fa20 71 75 69 72 65 64 20 6f 6e 20 6f 6c 64 65 72 20  quired on older 
1fa30 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a  filesystems..**.
1fa40 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1fa50 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65  can be overridde
1fa60 6e 20 75 73 69 6e 67 20 74 68 65 20 78 53 65 74  n using the xSet
1fa70 53 79 73 43 61 6c 6c 20 69 6e 74 65 72 66 61 63  SysCall interfac
1fa80 65 2e 0a 2a 2a 20 54 68 65 20 61 62 69 6c 69 74  e..** The abilit
1fa90 79 20 74 6f 20 6f 76 65 72 72 69 64 65 20 74 68  y to override th
1faa0 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 61  is routine was a
1fab0 64 64 65 64 20 69 6e 20 73 75 70 70 6f 72 74 20  dded in support 
1fac0 6f 66 20 74 68 65 0a 2a 2a 20 63 68 72 6f 6d 69  of the.** chromi
1fad0 75 6d 20 73 61 6e 64 62 6f 78 2e 20 20 4f 70 65  um sandbox.  Ope
1fae0 6e 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79  ning a directory
1faf0 20 69 73 20 61 20 73 65 63 75 72 69 74 79 20 72   is a security r
1fb00 69 73 6b 20 28 77 65 20 61 72 65 0a 2a 2a 20 74  isk (we are.** t
1fb10 6f 6c 64 29 20 73 6f 20 6d 61 6b 69 6e 67 20 69  old) so making i
1fb20 74 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 61  t overrideable a
1fb30 6c 6c 6f 77 73 20 74 68 65 20 63 68 72 6f 6d 69  llows the chromi
1fb40 75 6d 20 73 61 6e 64 62 6f 78 20 74 6f 0a 2a 2a  um sandbox to.**
1fb50 20 72 65 70 6c 61 63 65 20 74 68 69 73 20 72 6f   replace this ro
1fb60 75 74 69 6e 65 20 77 69 74 68 20 61 20 68 61 72  utine with a har
1fb70 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 20 54 6f  mless no-op.  To
1fb80 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 75 74 69   make this routi
1fb90 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20 72  ne.** a no-op, r
1fba0 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 20 61  eplace it with a
1fbb0 20 73 74 75 62 20 74 68 61 74 20 72 65 74 75 72   stub that retur
1fbc0 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74  ns SQLITE_OK but
1fbd0 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 70 46 64 20   leaves.** *pFd 
1fbe0 73 65 74 20 74 6f 20 61 20 6e 65 67 61 74 69 76  set to a negativ
1fbf0 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
1fc00 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
1fc10 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61  returned, the ca
1fc20 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
1fc30 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a  ble for closing.
1fc40 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ** the file desc
1fc50 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e  riptor *pFd usin
1fc60 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74  g close()..*/.st
1fc70 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72  atic int openDir
1fc80 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
1fc90 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e  r *zFilename, in
1fca0 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69  t *pFd){.  int i
1fcb0 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  i;.  int fd = -1
1fcc0 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d  ;.  char zDirnam
1fcd0 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  e[MAX_PATHNAME+1
1fce0 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
1fcf0 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
1fd00 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22  AME, zDirname, "
1fd10 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  %s", zFilename);
1fd20 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73  .  for(ii=(int)s
1fd30 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b  trlen(zDirname);
1fd40 20 69 69 3e 30 20 26 26 20 7a 44 69 72 6e 61 6d   ii>0 && zDirnam
1fd50 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d  e[ii]!='/'; ii--
1fd60 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b  );.  if( ii>0 ){
1fd70 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69  .    zDirname[ii
1fd80 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 65 6c 73  ] = '\0';.  }els
1fd90 65 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72 6e  e{.    if( zDirn
1fda0 61 6d 65 5b 30 5d 21 3d 27 2f 27 20 29 20 7a 44  ame[0]!='/' ) zD
1fdb0 69 72 6e 61 6d 65 5b 30 5d 20 3d 20 27 2e 27 3b  irname[0] = '.';
1fdc0 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 31 5d  .    zDirname[1]
1fdd0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 64 20 3d   = 0;.  }.  fd =
1fde0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44 69   robust_open(zDi
1fdf0 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c  rname, O_RDONLY|
1fe00 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20  O_BINARY, 0);.  
1fe10 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20  if( fd>=0 ){.   
1fe20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44   OSTRACE(("OPEND
1fe30 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66  IR %-3d %s\n", f
1fe40 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20  d, zDirname));. 
1fe50 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a   }.  *pFd = fd;.
1fe60 20 20 69 66 28 20 66 64 3e 3d 30 20 29 20 72 65    if( fd>=0 ) re
1fe70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1fe80 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
1fe90 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
1fea0 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
1feb0 6e 44 69 72 65 63 74 6f 72 79 22 2c 20 7a 44 69  nDirectory", zDi
1fec0 72 6e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rname);.}../*.**
1fed0 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
1fee0 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
1fef0 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
1ff00 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
1ff10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f  ..**.** If dataO
1ff20 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68  nly==0 then both
1ff30 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66   the file itself
1ff40 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74   and its metadat
1ff50 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c  a (file.** size,
1ff60 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74   access time, et
1ff70 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20  c) are synced.  
1ff80 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74  If dataOnly!=0 t
1ff90 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  hen only the.** 
1ffa0 66 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e  file data is syn
1ffb0 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72  ced..**.** Under
1ffc0 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65   Unix, also make
1ffd0 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64   sure that the d
1ffe0 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
1fff0 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68  or the file.** h
20000 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  as been created 
20010 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65  by fsync-ing the
20020 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
20030 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c  contains the fil
20040 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e  e..** If we do n
20050 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77  ot do this and w
20060 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f  e encounter a po
20070 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
20080 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e   directory.** en
20090 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
200a0 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78  nal might not ex
200b0 69 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62  ist after we reb
200c0 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a  oot.  The next.*
200d0 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65  * SQLite to acce
200e0 73 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c  ss the file will
200f0 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74   not know that t
20100 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  he journal exist
20110 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  s (because.** th
20120 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
20130 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
20140 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61  l was never crea
20150 74 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61  ted) and the tra
20160 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c  nsaction.** will
20170 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d   not roll back -
20180 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e   possibly leadin
20190 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  g to database co
201a0 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
201b0 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63  tic int unixSync
201c0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
201d0 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  d, int flags){. 
201e0 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46   int rc;.  unixF
201f0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
20200 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69  ixFile*)id;..  i
20210 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20  nt isDataOnly = 
20220 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59  (flags&SQLITE_SY
20230 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20  NC_DATAONLY);.  
20240 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d  int isFullsync =
20250 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
20260 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
20270 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
20280 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  t one of SQLITE_
20290 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46  SYNC_NORMAL or F
202a0 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a  ULL was passed *
202b0 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67  /.  assert((flag
202c0 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
202d0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20  SYNC_NORMAL.    
202e0 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46    || (flags&0x0F
202f0 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
20300 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55  ULL.  );..  /* U
20310 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20  nix cannot, but 
20320 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79  some systems may
20330 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
20340 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54  ULL from here. T
20350 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73  his.  ** line is
20360 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f   to test that do
20370 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20  ing so does not 
20380 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65  cause any proble
20390 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ms..  */.  Simul
203a0 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
203b0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
203c0 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72  FULL );..  asser
203d0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
203e0 54 52 41 43 45 28 28 22 53 59 4e 43 20 20 20 20  TRACE(("SYNC    
203f0 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %-3d\n", pFile->
20400 68 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c  h));.  rc = full
20410 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c  _fsync(pFile->h,
20420 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44   isFullsync, isD
20430 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75  ataOnly);.  Simu
20440 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
20450 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  1 );.  if( rc ){
20460 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
20470 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
20480 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e  );.    return un
20490 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
204a0 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22  E_IOERR_FSYNC, "
204b0 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46 69  full_fsync", pFi
204c0 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
204d0 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73 79 6e 63  .  /* Also fsync
204e0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63   the directory c
204f0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69  ontaining the fi
20500 6c 65 20 69 66 20 74 68 65 20 44 49 52 53 59 4e  le if the DIRSYN
20510 43 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73  C flag.  ** is s
20520 65 74 2e 20 20 54 68 69 73 20 69 73 20 61 20 6f  et.  This is a o
20530 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72 72 65 6e  ne-time occurren
20540 63 65 2e 20 20 4d 61 6e 79 20 73 79 73 74 65 6d  ce.  Many system
20550 73 20 28 65 78 61 6d 70 6c 65 73 3a 20 41 49 58  s (examples: AIX
20560 29 0a 20 20 2a 2a 20 61 72 65 20 75 6e 61 62 6c  ).  ** are unabl
20570 65 20 74 6f 20 66 73 79 6e 63 20 61 20 64 69 72  e to fsync a dir
20580 65 63 74 6f 72 79 2c 20 73 6f 20 69 67 6e 6f 72  ectory, so ignor
20590 65 20 65 72 72 6f 72 73 20 6f 6e 20 74 68 65 20  e errors on the 
205a0 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69 66  fsync..  */.  if
205b0 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ( pFile->ctrlFla
205c0 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 49  gs & UNIXFILE_DI
205d0 52 53 59 4e 43 20 29 7b 0a 20 20 20 20 69 6e 74  RSYNC ){.    int
205e0 20 64 69 72 66 64 3b 0a 20 20 20 20 4f 53 54 52   dirfd;.    OSTR
205f0 41 43 45 28 28 22 44 49 52 53 59 4e 43 20 25 73  ACE(("DIRSYNC %s
20600 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63   (have_fullfsync
20610 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29  =%d fullsync=%d)
20620 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  \n", pFile->zPat
20630 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 48  h,.            H
20640 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69  AVE_FULLFSYNC, i
20650 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 20 20 20  sFullsync));.   
20660 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65   rc = osOpenDire
20670 63 74 6f 72 79 28 70 46 69 6c 65 2d 3e 7a 50 61  ctory(pFile->zPa
20680 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20  th, &dirfd);.   
20690 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
206a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 75 6c 6c  OK ){.      full
206b0 5f 66 73 79 6e 63 28 64 69 72 66 64 2c 20 30 2c  _fsync(dirfd, 0,
206c0 20 30 29 3b 0a 23 69 66 20 4f 53 43 4c 4f 53 45   0);.#if OSCLOSE
206d0 5f 43 48 45 43 4b 5f 43 4c 4f 53 45 5f 49 4f 45  _CHECK_CLOSE_IOE
206e0 52 52 0a 20 20 20 20 20 20 69 66 28 20 63 6c 6f  RR.      if( clo
206f0 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 29  se(pFile->dirfd)
20700 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
20710 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
20720 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
20730 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
20740 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20  ERR_DIR_CLOSE;. 
20750 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
20760 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
20770 70 46 69 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f  pFile, dirfd, __
20780 4c 49 4e 45 5f 5f 29 3b 0a 23 65 6e 64 69 66 0a  LINE__);.#endif.
20790 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
207a0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
207b0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 3b 0a  ITE_CANTOPEN );.
207c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
207d0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
207e0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
207f0 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 44 49   &= ~UNIXFILE_DI
20800 52 53 59 4e 43 3b 0a 0a 20 20 7d 0a 20 20 72 65  RSYNC;..  }.  re
20810 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
20820 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
20830 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
20840 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
20850 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72  tatic int unixTr
20860 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
20870 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79  ile *id, i64 nBy
20880 74 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  te){.  unixFile 
20890 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
208a0 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72  le *)id;.  int r
208b0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  c;.  assert( pFi
208c0 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  le );.  Simulate
208d0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
208e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
208f0 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  NCATE );..  /* I
20900 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63  f the user has c
20910 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e  onfigured a chun
20920 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  k-size for this 
20930 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74  file, truncate t
20940 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20  he.  ** file so 
20950 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73  that it consists
20960 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e   of an integer n
20970 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20  umber of chunks 
20980 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61  (i.e. the.  ** a
20990 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20  ctual file size 
209a0 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74  after the operat
209b0 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65  ion may be large
209c0 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
209d0 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e  sted.  ** size).
209e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
209f0 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a  e->szChunk>0 ){.
20a00 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42      nByte = ((nB
20a10 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43  yte + pFile->szC
20a20 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d  hunk - 1)/pFile-
20a30 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c  >szChunk) * pFil
20a40 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a  e->szChunk;.  }.
20a50 0a 20 20 72 63 20 3d 20 72 6f 62 75 73 74 5f 66  .  rc = robust_f
20a60 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e  truncate(pFile->
20a70 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  h, nByte);.  if(
20a80 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f 72 65   rc ){.    store
20a90 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
20aa0 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74   errno);.    ret
20ab0 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
20ac0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
20ad0 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61  UNCATE, "ftrunca
20ae0 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  te", pFile->zPat
20af0 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66  h);.  }else{.#if
20b00 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
20b10 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
20b20 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c  e doing a normal
20b30 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61   write to a data
20b40 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70  base file (as op
20b50 70 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  posed to.    ** 
20b60 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  doing a hot-jour
20b70 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  nal rollback or 
20b80 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20  a write to some 
20b90 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  file other than 
20ba0 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  a.    ** normal 
20bb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 61  database file) a
20bc0 6e 64 20 77 65 20 74 72 75 6e 63 61 74 65 20 74  nd we truncate t
20bd0 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  he file to zero 
20be0 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74  length,.    ** t
20bf0 68 61 74 20 65 66 66 65 63 74 69 76 65 6c 79 20  hat effectively 
20c00 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
20c10 67 65 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69  ge counter.  Thi
20c20 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 0a 20  s might happen. 
20c30 20 20 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f     ** when resto
20c40 72 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  ring a database 
20c50 75 73 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70  using the backup
20c60 20 41 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f   API from a zero
20c70 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73  -length.    ** s
20c80 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ource..    */.  
20c90 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e    if( pFile->inN
20ca0 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20 6e 42  ormalWrite && nB
20cb0 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  yte==0 ){.      
20cc0 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
20cd0 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Chng = 1;.    }.
20ce0 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
20cf0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
20d00 3e 30 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  >0.    /* If the
20d10 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 74   file was just t
20d20 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69  runcated to a si
20d30 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ze smaller than 
20d40 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  the currently.  
20d50 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69    ** mapped regi
20d60 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65 20 65  on, reduce the e
20d70 66 66 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67  ffective mapping
20d80 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53   size as well. S
20d90 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 20 20 2a  QLite will.    *
20da0 2a 20 75 73 65 20 72 65 61 64 28 29 20 61 6e 64  * use read() and
20db0 20 77 72 69 74 65 28 29 20 74 6f 20 61 63 63 65   write() to acce
20dc0 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74  ss data beyond t
20dd0 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e  his point from n
20de0 6f 77 20 6f 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a  ow on.  .    */.
20df0 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c 70 46      if( nByte<pF
20e00 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
20e10 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d  .      pFile->mm
20e20 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a  apSize = nByte;.
20e30 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
20e40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20e50 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
20e60 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63   Determine the c
20e70 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61  urrent size of a
20e80 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a   file in bytes.*
20e90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
20ea0 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  xFileSize(sqlite
20eb0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  3_file *id, i64 
20ec0 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72  *pSize){.  int r
20ed0 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  c;.  struct stat
20ee0 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20   buf;.  assert( 
20ef0 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46  id );.  rc = osF
20f00 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a  stat(((unixFile*
20f10 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a  )id)->h, &buf);.
20f20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
20f30 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28  r( rc=1 );.  if(
20f40 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 74   rc!=0 ){.    st
20f50 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e  oreLastErrno((un
20f60 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e  ixFile*)id, errn
20f70 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  o);.    return S
20f80 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
20f90 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20  T;.  }.  *pSize 
20fa0 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a  = buf.st_size;..
20fb0 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e    /* When openin
20fc0 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61  g a zero-size da
20fd0 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64  tabase, the find
20fe0 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f 63  InodeInfo() proc
20ff0 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65  edure.  ** write
21000 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  s a single byte 
21010 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69  into that file i
21020 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20  n order to work 
21030 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a  around a bug.  *
21040 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73  * in the OS-X ms
21050 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20  dos filesystem. 
21060 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   In order to avo
21070 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  id problems with
21080 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65   upper.  ** laye
21090 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72  rs, we need to r
210a0 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20  eport this file 
210b0 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65  size as zero eve
210c0 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20  n though it is. 
210d0 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20   ** really 1.   
210e0 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20  Ticket #3260..  
210f0 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d  */.  if( *pSize=
21100 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b  =1 ) *pSize = 0;
21110 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ...  return SQLI
21120 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
21130 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
21140 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
21150 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
21160 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f  /*.** Handler fo
21170 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  r proxy-locking 
21180 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72  file-control ver
21190 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c  bs.  Defined bel
211a0 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f  ow in the.** pro
211b0 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69  xying locking di
211c0 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  vision..*/.stati
211d0 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43  c int proxyFileC
211e0 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
211f0 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b  ile*,int,void*);
21200 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20  .#endif../* .** 
21210 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
21220 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c   called to handl
21230 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  e the SQLITE_FCN
21240 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a  TL_SIZE_HINT .**
21250 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70   file-control op
21260 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61 72 67  eration.  Enlarg
21270 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
21280 6f 20 6e 42 79 74 65 73 20 69 6e 20 73 69 7a 65  o nBytes in size
21290 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75 70 20  .** (rounded up 
212a0 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68 75 6e  to the next chun
212b0 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20 74 68 65  k-size).  If the
212c0 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
212d0 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73 20 6f  eady.** nBytes o
212e0 72 20 6c 61 72 67 65 72 2c 20 74 68 69 73 20 72  r larger, this r
212f0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
21300 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
21310 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75   fcntlSizeHint(u
21320 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
21330 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66  i64 nByte){.  if
21340 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
21350 3e 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 53  >0 ){.    i64 nS
21360 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
21370 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69          /* Requi
21380 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
21390 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
213a0 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20   buf;           
213b0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f     /* Used to ho
213c0 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73  ld return values
213d0 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f 0a 20   of fstat() */. 
213e0 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74    .    if( osFst
213f0 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75  at(pFile->h, &bu
21400 66 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  f) ){.      stor
21410 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
21420 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
21430 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
21440 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d  ERR_FSTAT;.    }
21450 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 28  ..    nSize = ((
21460 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e 73 7a 43  nByte+pFile->szC
21470 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69 6c 65 2d  hunk-1) / pFile-
21480 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c  >szChunk) * pFil
21490 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20  e->szChunk;.    
214a0 69 66 28 20 6e 53 69 7a 65 3e 28 69 36 34 29 62  if( nSize>(i64)b
214b0 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b 0a 0a 23  uf.st_size ){..#
214c0 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
214d0 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29  POSIX_FALLOCATE)
214e0 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46   && HAVE_POSIX_F
214f0 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20 20 20 2f  ALLOCATE.      /
21500 2a 20 54 68 65 20 63 6f 64 65 20 62 65 6c 6f 77  * The code below
21510 20 69 73 20 68 61 6e 64 6c 69 6e 67 20 74 68 65   is handling the
21520 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
21530 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 29 20 0a   osFallocate() .
21540 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74        ** correct
21550 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  ly. posix_falloc
21560 61 74 65 28 29 20 69 73 20 64 65 66 69 6e 65 64  ate() is defined
21570 20 74 6f 20 22 72 65 74 75 72 6e 73 20 7a 65 72   to "returns zer
21580 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 0a 20  o on success, . 
21590 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e 20 65 72       ** or an er
215a0 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e 20 20 66  ror number on  f
215b0 61 69 6c 75 72 65 22 2e 20 53 65 65 20 74 68 65  ailure". See the
215c0 20 6d 61 6e 70 61 67 65 20 66 6f 72 20 64 65 74   manpage for det
215d0 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ails. */.      i
215e0 6e 74 20 65 72 72 3b 0a 20 20 20 20 20 20 64 6f  nt err;.      do
215f0 7b 0a 20 20 20 20 20 20 20 20 65 72 72 20 3d 20  {.        err = 
21600 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70 46 69 6c  osFallocate(pFil
21610 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 73 69 7a  e->h, buf.st_siz
21620 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e 73 74 5f  e, nSize-buf.st_
21630 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 77 68  size);.      }wh
21640 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e 54 52 20  ile( err==EINTR 
21650 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72  );.      if( err
21660 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
21670 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23 65  _IOERR_WRITE;.#e
21680 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  lse.      /* If 
21690 74 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20  the OS does not 
216a0 68 61 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f  have posix_fallo
216b0 63 61 74 65 28 29 2c 20 66 61 6b 65 20 69 74 2e  cate(), fake it.
216c0 20 57 72 69 74 65 20 61 20 0a 20 20 20 20 20 20   Write a .      
216d0 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74  ** single byte t
216e0 6f 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  o the last byte 
216f0 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b 20 74 68  in each block th
21700 61 74 20 66 61 6c 6c 73 20 65 6e 74 69 72 65 6c  at falls entirel
21710 79 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 69  y.      ** withi
21720 6e 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72  n the extended r
21730 65 67 69 6f 6e 2e 20 54 68 65 6e 2c 20 69 66 20  egion. Then, if 
21740 72 65 71 75 69 72 65 64 2c 20 61 20 73 69 6e 67  required, a sing
21750 6c 65 20 62 79 74 65 0a 20 20 20 20 20 20 2a 2a  le byte.      **
21760 20 61 74 20 6f 66 66 73 65 74 20 28 6e 53 69 7a   at offset (nSiz
21770 65 2d 31 29 2c 20 74 6f 20 73 65 74 20 74 68 65  e-1), to set the
21780 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
21790 65 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 20  e correctly..   
217a0 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61 20     ** This is a 
217b0 73 69 6d 69 6c 61 72 20 74 65 63 68 6e 69 71 75  similar techniqu
217c0 65 20 74 6f 20 74 68 61 74 20 75 73 65 64 20 62  e to that used b
217d0 79 20 67 6c 69 62 63 20 6f 6e 20 73 79 73 74 65  y glibc on syste
217e0 6d 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ms.      ** that
217f0 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 72   do not have a r
21800 65 61 6c 20 66 61 6c 6c 6f 63 61 74 65 28 29 20  eal fallocate() 
21810 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  call..      */. 
21820 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20       int nBlk = 
21830 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20  buf.st_blksize; 
21840 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74 65 6d 20   /* File-system 
21850 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20  block size */.  
21860 20 20 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d      int nWrite =
21870 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
21880 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
21890 65 73 20 77 72 69 74 74 65 6e 20 62 79 20 73 65  es written by se
218a0 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20  ekAndWrite */.  
218b0 20 20 20 20 69 36 34 20 69 57 72 69 74 65 3b 20      i64 iWrite; 
218c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218d0 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65 74 20 74  /* Next offset t
218e0 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20  o write to */.. 
218f0 20 20 20 20 20 69 57 72 69 74 65 20 3d 20 28 62       iWrite = (b
21900 75 66 2e 73 74 5f 73 69 7a 65 2f 6e 42 6c 6b 29  uf.st_size/nBlk)
21910 2a 6e 42 6c 6b 20 2b 20 6e 42 6c 6b 20 2d 20 31  *nBlk + nBlk - 1
21920 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
21930 69 57 72 69 74 65 3e 3d 62 75 66 2e 73 74 5f 73  iWrite>=buf.st_s
21940 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
21950 65 72 74 28 20 28 28 69 57 72 69 74 65 2b 31 29  ert( ((iWrite+1)
21960 25 6e 42 6c 6b 29 3d 3d 30 20 29 3b 0a 20 20 20  %nBlk)==0 );.   
21970 20 20 20 66 6f 72 28 2f 2a 6e 6f 2d 6f 70 2a 2f     for(/*no-op*/
21980 3b 20 69 57 72 69 74 65 3c 6e 53 69 7a 65 2b 6e  ; iWrite<nSize+n
21990 42 6c 6b 2d 31 3b 20 69 57 72 69 74 65 2b 3d 6e  Blk-1; iWrite+=n
219a0 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Blk ){.        i
219b0 66 28 20 69 57 72 69 74 65 3e 3d 6e 53 69 7a 65  f( iWrite>=nSize
219c0 20 29 20 69 57 72 69 74 65 20 3d 20 6e 53 69 7a   ) iWrite = nSiz
219d0 65 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e  e - 1;.        n
219e0 57 72 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57  Write = seekAndW
219f0 72 69 74 65 28 70 46 69 6c 65 2c 20 69 57 72 69  rite(pFile, iWri
21a00 74 65 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20 20  te, "", 1);.    
21a10 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 21 3d      if( nWrite!=
21a20 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
21a30 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20  E_IOERR_WRITE;. 
21a40 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
21a50 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c    }.  }..#if SQL
21a60 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
21a70 45 3e 30 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  E>0.  if( pFile-
21a80 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 26  >mmapSizeMax>0 &
21a90 26 20 6e 42 79 74 65 3e 70 46 69 6c 65 2d 3e 6d  & nByte>pFile->m
21aa0 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69  mapSize ){.    i
21ab0 6e 74 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70  nt rc;.    if( p
21ac0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3c 3d 30  File->szChunk<=0
21ad0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 6f   ){.      if( ro
21ae0 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70  bust_ftruncate(p
21af0 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 20  File->h, nByte) 
21b00 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  ){.        store
21b10 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
21b20 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20   errno);.       
21b30 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
21b40 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
21b50 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72  R_TRUNCATE, "ftr
21b60 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e  uncate", pFile->
21b70 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a  zPath);.      }.
21b80 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
21b90 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69 6c  unixMapfile(pFil
21ba0 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 72  e, nByte);.    r
21bb0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
21bc0 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53  ndif..  return S
21bd0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69  QLITE_OK;.}...#i
21be0 66 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  f (SQLITE_ENABLE
21bf0 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26  _APPLE_SPI>0) &&
21c00 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
21c10 5f 5f 29 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  __).#include "sq
21c20 6c 69 74 65 33 5f 70 72 69 76 61 74 65 2e 68 22  lite3_private.h"
21c30 0a 23 69 6e 63 6c 75 64 65 20 3c 63 6f 70 79 66  .#include <copyf
21c40 69 6c 65 2e 68 3e 0a 73 74 61 74 69 63 20 69 6e  ile.h>.static in
21c50 74 20 70 72 6f 78 79 47 65 74 44 62 50 61 74 68  t proxyGetDbPath
21c60 46 6f 72 55 6e 69 78 46 69 6c 65 28 75 6e 69 78  ForUnixFile(unix
21c70 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 68 61  File *pFile, cha
21c80 72 20 2a 64 62 50 61 74 68 29 3b 0a 23 65 6e 64  r *dbPath);.#end
21c90 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  if..#if SQLITE_E
21ca0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
21cb0 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74 20 69  YLE.static int i
21cc0 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64  sProxyLockingMod
21cd0 65 28 75 6e 69 78 46 69 6c 65 20 2a 29 3b 0a 23  e(unixFile *);.#
21ce0 65 6e 64 69 66 0a 0a 23 69 66 20 28 53 51 4c 49  endif..#if (SQLI
21cf0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f  TE_ENABLE_APPLE_
21d00 53 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65  SPI>0) && define
21d10 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 73 74 61  d(__APPLE__).sta
21d20 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e  tic int unixTrun
21d30 63 61 74 65 44 61 74 61 62 61 73 65 28 75 6e 69  cateDatabase(uni
21d40 78 46 69 6c 65 20 2a 2c 20 69 6e 74 29 3b 0a 0a  xFile *, int);..
21d50 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 49  static int unixI
21d60 6e 76 61 6c 69 64 61 74 65 53 75 70 70 6f 72 74  nvalidateSupport
21d70 46 69 6c 65 73 28 75 6e 69 78 46 69 6c 65 20 2a  Files(unixFile *
21d80 2c 20 69 6e 74 29 3b 0a 0a 73 74 61 74 69 63 20  , int);..static 
21d90 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46 69  int findCreateFi
21da0 6c 65 4d 6f 64 65 28 63 6f 6e 73 74 20 63 68 61  leMode(const cha
21db0 72 20 2a 2c 20 69 6e 74 2c 20 6d 6f 64 65 5f 74  r *, int, mode_t
21dc0 2a 2c 20 75 69 64 5f 74 20 2a 2c 67 69 64 5f 74  *, uid_t *,gid_t
21dd0 20 2a 29 3b 0a 0a 2f 2a 20 6f 70 65 6e 73 20 61   *);../* opens a
21de0 20 72 65 61 64 2f 77 72 69 74 65 20 63 6f 6e 6e   read/write conn
21df0 65 63 74 69 6f 6e 20 74 6f 20 61 20 66 69 6c 65  ection to a file
21e00 20 7a 4e 61 6d 65 20 69 6e 68 65 72 69 74 69 6e   zName inheritin
21e10 67 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  g the appropriat
21e20 65 0a 2a 2a 20 75 73 65 72 2f 70 65 72 6d 73 20  e.** user/perms 
21e30 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
21e40 65 20 66 69 6c 65 20 69 66 20 72 75 6e 6e 69 6e  e file if runnin
21e50 67 20 61 73 20 72 6f 6f 74 2e 20 20 52 65 74 75  g as root.  Retu
21e60 72 6e 73 20 74 68 65 20 66 69 6c 65 20 0a 2a 2a  rns the file .**
21e70 20 64 65 73 63 72 69 70 74 6f 72 20 62 79 20 72   descriptor by r
21e80 65 66 65 72 65 6e 63 65 0a 2a 2f 0a 73 74 61 74  eference.*/.stat
21e90 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 43  ic int unixOpenC
21ea0 68 69 6c 64 46 69 6c 65 28 0a 20 20 63 6f 6e 73  hildFile(.  cons
21eb0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20  t char *zName,. 
21ec0 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 2c 0a   int openFlags,.
21ed0 20 20 69 6e 74 20 64 62 4f 70 65 6e 46 6c 61 67    int dbOpenFlag
21ee0 73 2c 0a 20 20 69 6e 74 20 70 72 6f 74 46 6c 61  s,.  int protFla
21ef0 67 73 2c 0a 20 20 69 6e 74 20 2a 70 46 64 0a 29  gs,.  int *pFd.)
21f00 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b  {.  int fd = -1;
21f10 0a 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f  .  mode_t openMo
21f20 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
21f30 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20   /* Permissions 
21f40 74 6f 20 63 72 65 61 74 65 20 66 69 6c 65 20 77  to create file w
21f50 69 74 68 20 2a 2f 0a 20 20 75 69 64 5f 74 20 75  ith */.  uid_t u
21f60 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
21f70 20 20 20 20 20 20 20 2f 2a 20 55 73 65 72 69 64         /* Userid
21f80 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f   for the file */
21f90 0a 20 20 67 69 64 5f 74 20 67 69 64 3b 20 20 20  .  gid_t gid;   
21fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fb0 20 2f 2a 20 47 72 6f 75 70 69 64 20 66 6f 72 20   /* Groupid for 
21fc0 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  the file */.  in
21fd0 74 20 72 63 3b 0a 20 20 0a 20 20 61 73 73 65 72  t rc;.  .  asser
21fe0 74 28 70 46 64 21 3d 4e 55 4c 4c 29 3b 0a 20 20  t(pFd!=NULL);.  
21ff0 72 63 20 3d 20 66 69 6e 64 43 72 65 61 74 65 46  rc = findCreateF
22000 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20 64  ileMode(zName, d
22010 62 4f 70 65 6e 46 6c 61 67 73 2c 20 26 6f 70 65  bOpenFlags, &ope
22020 6e 4d 6f 64 65 2c 20 26 75 69 64 2c 20 26 67 69  nMode, &uid, &gi
22030 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  d);.  if( rc!=SQ
22040 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
22050 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
22060 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
22070 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67  (zName, openFlag
22080 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20  s, openMode);.  
22090 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 58 20  OSTRACE(("OPENX 
220a0 20 20 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22    %-3d %s 0%o\n"
220b0 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65  , fd, zName, ope
220c0 6e 46 6c 61 67 73 29 29 3b 0a 20 20 69 66 28 20  nFlags));.  if( 
220d0 66 64 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  fd<0 ){.    rc =
220e0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
220f0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
22100 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d  PT, "open", zNam
22110 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  e);.    return r
22120 63 3b 0a 20 20 7d 0a 20 20 2f 2a 20 69 66 20 77  c;.  }.  /* if w
22130 65 27 72 65 20 6f 70 65 6e 69 6e 67 20 74 68 65  e're opening the
22140 20 77 61 6c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20   wal or journal 
22150 61 6e 64 20 72 75 6e 6e 69 6e 67 20 61 73 20 72  and running as r
22160 6f 6f 74 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68  oot, set.  ** th
22170 65 20 6a 6f 75 72 6e 61 6c 20 75 69 64 2f 67 69  e journal uid/gi
22180 64 20 2a 2f 0a 20 20 69 66 28 20 64 62 4f 70 65  d */.  if( dbOpe
22190 6e 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45  nFlags & (SQLITE
221a0 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45  _OPEN_WAL|SQLITE
221b0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
221c0 41 4c 29 20 29 7b 0a 20 20 20 20 75 69 64 5f 74  AL) ){.    uid_t
221d0 20 65 75 69 64 20 3d 20 67 65 74 65 75 69 64 28   euid = geteuid(
221e0 29 3b 0a 20 20 20 20 69 66 28 20 65 75 69 64 3d  );.    if( euid=
221f0 3d 30 20 26 26 20 28 65 75 69 64 21 3d 75 69 64  =0 && (euid!=uid
22200 20 7c 7c 20 67 65 74 65 67 69 64 28 29 21 3d 67   || getegid()!=g
22210 69 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  id) ){.      if(
22220 20 66 63 68 6f 77 6e 28 66 64 2c 20 75 69 64 2c   fchown(fd, uid,
22230 20 67 69 64 29 20 29 7b 0a 20 20 20 20 20 20 20   gid) ){.       
22240 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
22250 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
22260 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
22270 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22280 4b 20 29 7b 0a 20 20 20 20 2a 70 46 64 20 3d 20  K ){.    *pFd = 
22290 66 64 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  fd;.  } else {. 
222a0 20 20 20 2a 70 46 64 20 3d 20 2d 31 3b 0a 20 20     *pFd = -1;.  
222b0 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 7d    close(fd);.  }
222c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
222d0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
222e0 52 65 70 6c 61 63 65 44 61 74 61 62 61 73 65 28  ReplaceDatabase(
222f0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
22300 20 73 71 6c 69 74 65 33 20 2a 73 72 63 64 62 29   sqlite3 *srcdb)
22310 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c   {.  sqlite3_fil
22320 65 20 2a 69 64 20 3d 20 28 73 71 6c 69 74 65 33  e *id = (sqlite3
22330 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
22340 20 42 74 72 65 65 20 2a 70 53 72 63 42 74 72 65   Btree *pSrcBtre
22350 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 73 71 6c 69  e = NULL;.  sqli
22360 74 65 33 5f 66 69 6c 65 20 2a 73 72 63 5f 66 69  te3_file *src_fi
22370 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 75 6e 69  le = NULL;.  uni
22380 78 46 69 6c 65 20 2a 70 53 72 63 46 69 6c 65 20  xFile *pSrcFile 
22390 3d 20 4e 55 4c 4c 3b 0a 20 20 63 68 61 72 20 73  = NULL;.  char s
223a0 72 63 57 61 6c 50 61 74 68 5b 4d 41 58 50 41 54  rcWalPath[MAXPAT
223b0 48 4c 45 4e 2b 35 5d 3b 0a 20 20 69 6e 74 20 73  HLEN+5];.  int s
223c0 72 63 57 61 6c 46 44 20 3d 20 2d 31 3b 0a 20 20  rcWalFD = -1;.  
223d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
223e0 4f 4b 3b 0a 20 20 76 6f 69 64 20 2a 70 4c 6f 63  OK;.  void *pLoc
223f0 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20  k = NULL;.  int 
22400 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 73 71 6c  flags = 0;.  sql
22410 69 74 65 33 20 2a 73 72 63 64 62 32 20 3d 20 4e  ite3 *srcdb2 = N
22420 55 4c 4c 3b 0a 20 20 63 6f 70 79 66 69 6c 65 5f  ULL;.  copyfile_
22430 73 74 61 74 65 5f 74 20 73 3b 0a 20 20 69 6e 74  state_t s;.  int
22440 20 63 6f 72 72 75 70 74 53 72 63 46 69 6c 65 4c   corruptSrcFileL
22450 6f 63 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63  ock = 0;.  int c
22460 6f 72 72 75 70 74 44 73 74 46 69 6c 65 4c 6f 63  orruptDstFileLoc
22470 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 53  k = 0;.  int isS
22480 72 63 43 6f 72 72 75 70 74 20 3d 20 30 3b 0a 20  rcCorrupt = 0;. 
22490 20 69 6e 74 20 69 73 44 73 74 43 6f 72 72 75 70   int isDstCorrup
224a0 74 20 3d 20 30 3b 0a 20 20 0a 20 20 69 66 28 20  t = 0;.  .  if( 
224b0 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
224c0 65 63 6b 4f 6b 28 73 72 63 64 62 29 20 29 7b 0a  eckOk(srcdb) ){.
224d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
224e0 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20  E_MISUSE;.  }.  
224f0 20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e    .#if SQLITE_EN
22500 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43  ABLE_DATA_PROTEC
22510 54 49 4f 4e 0a 20 20 66 6c 61 67 73 20 7c 3d 20  TION.  flags |= 
22520 70 46 69 6c 65 2d 3e 70 72 6f 74 46 6c 61 67 73  pFile->protFlags
22530 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
22540 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
22550 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 69  NG_STYLE.  if( i
22560 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64  sProxyLockingMod
22570 65 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  e(pFile) ){.    
22580 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
22590 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 3b 0a  OPEN_AUTOPROXY;.
225a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
225b0 72 63 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f  rc = sqlite3demo
225c0 5f 73 75 70 65 72 6c 6f 63 6b 28 70 46 69 6c 65  _superlock(pFile
225d0 2d 3e 7a 50 61 74 68 2c 20 30 2c 20 66 6c 61 67  ->zPath, 0, flag
225e0 73 2c 20 30 2c 20 30 2c 20 26 70 4c 6f 63 6b 29  s, 0, 0, &pLock)
225f0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
22600 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22610 5f 43 4f 52 52 55 50 54 20 7c 7c 20 72 63 3d 3d  _CORRUPT || rc==
22620 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 29 7b  SQLITE_NOTADB ){
22630 0a 20 20 20 20 20 20 69 73 44 73 74 43 6f 72 72  .      isDstCorr
22640 75 70 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  upt = 1;.      r
22650 63 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f  c = sqlite3demo_
22660 73 75 70 65 72 6c 6f 63 6b 5f 63 6f 72 72 75 70  superlock_corrup
22670 74 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  t(id, SQLITE_LOC
22680 4b 5f 45 58 43 4c 55 53 49 56 45 2c 0a 20 20 20  K_EXCLUSIVE,.   
22690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226b0 20 20 20 20 20 20 26 63 6f 72 72 75 70 74 44 73        &corruptDs
226c0 74 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  tFileLock);.    
226d0 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  }.    if( rc ){.
226e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
226f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
22700 67 65 74 20 74 68 65 20 73 72 63 20 66 69 6c 65  get the src file
22710 20 64 65 73 63 72 69 70 74 6f 72 20 61 64 68 65   descriptor adhe
22720 72 69 6e 67 20 74 6f 20 74 68 65 20 64 62 20 73  ring to the db s
22730 74 72 75 63 74 20 61 63 63 65 73 73 20 72 75 6c  truct access rul
22740 65 73 20 0a 20 20 20 2a 2a 20 74 68 69 73 20 63  es .   ** this c
22750 6f 64 65 20 69 73 20 6d 6f 64 65 6c 65 64 20 61  ode is modeled a
22760 66 74 65 72 20 73 71 6c 69 74 65 33 5f 66 69 6c  fter sqlite3_fil
22770 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 69 6e 20 6d  e_control() in m
22780 61 69 6e 2e 63 0a 20 20 20 2a 2f 20 0a 20 20 73  ain.c.   */ .  s
22790 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
227a0 65 72 28 73 72 63 64 62 2d 3e 6d 75 74 65 78 29  er(srcdb->mutex)
227b0 3b 0a 20 20 69 66 28 20 73 72 63 64 62 2d 3e 6e  ;.  if( srcdb->n
227c0 44 62 3e 30 20 29 7b 0a 20 20 20 20 70 53 72 63  Db>0 ){.    pSrc
227d0 42 74 72 65 65 20 3d 20 73 72 63 64 62 2d 3e 61  Btree = srcdb->a
227e0 44 62 5b 30 5d 2e 70 42 74 3b 0a 20 20 7d 0a 20  Db[0].pBt;.  }. 
227f0 20 69 66 28 20 70 53 72 63 42 74 72 65 65 20 29   if( pSrcBtree )
22800 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 53 72  {.    Pager *pSr
22810 63 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69  cPager;.    sqli
22820 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 53  te3BtreeEnter(pS
22830 72 63 42 74 72 65 65 29 3b 0a 20 20 20 20 70 53  rcBtree);.    pS
22840 72 63 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65  rcPager = sqlite
22850 33 42 74 72 65 65 50 61 67 65 72 28 70 53 72 63  3BtreePager(pSrc
22860 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65  Btree);.    asse
22870 72 74 28 20 70 53 72 63 50 61 67 65 72 21 3d 30  rt( pSrcPager!=0
22880 20 29 3b 0a 20 20 20 20 73 72 63 5f 66 69 6c 65   );.    src_file
22890 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46   = sqlite3PagerF
228a0 69 6c 65 28 70 53 72 63 50 61 67 65 72 29 3b 0a  ile(pSrcPager);.
228b0 20 20 20 20 61 73 73 65 72 74 28 20 73 72 63 5f      assert( src_
228c0 66 69 6c 65 21 3d 30 20 29 3b 0a 20 20 20 20 69  file!=0 );.    i
228d0 66 28 20 73 72 63 5f 66 69 6c 65 2d 3e 70 4d 65  f( src_file->pMe
228e0 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 69  thods ){.      i
228f0 6e 74 20 73 72 63 46 6c 61 67 73 20 3d 20 30 3b  nt srcFlags = 0;
22900 0a 20 20 20 20 20 20 70 53 72 63 46 69 6c 65 20  .      pSrcFile 
22910 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 73 72  = (unixFile *)sr
22920 63 5f 66 69 6c 65 3b 0a 23 69 66 20 53 51 4c 49  c_file;.#if SQLI
22930 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
22940 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e  G_STYLE || defin
22950 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
22960 20 20 20 20 69 66 20 28 28 70 53 72 63 46 69 6c      if ((pSrcFil
22970 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f  e->openFlags & O
22980 5f 52 44 57 52 29 20 3d 3d 20 4f 5f 52 44 57 52  _RDWR) == O_RDWR
22990 29 20 7b 0a 20 20 20 20 20 20 20 20 73 72 63 46  ) {.        srcF
229a0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
229b0 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20  EN_READWRITE;.  
229c0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
229d0 20 20 20 20 20 73 72 63 46 6c 61 67 73 20 3d 20       srcFlags = 
229e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
229f0 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ONLY;.      }.#e
22a00 6c 73 65 0a 20 20 20 20 20 20 73 72 63 46 6c 61  lse.      srcFla
22a10 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
22a20 5f 52 45 41 44 57 52 49 54 45 3b 0a 23 65 6e 64  _READWRITE;.#end
22a30 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  if.#if SQLITE_EN
22a40 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43  ABLE_DATA_PROTEC
22a50 54 49 4f 4e 0a 20 20 20 20 20 20 73 72 63 46 6c  TION.      srcFl
22a60 61 67 73 20 7c 3d 20 70 53 72 63 46 69 6c 65 2d  ags |= pSrcFile-
22a70 3e 70 72 6f 74 46 6c 61 67 73 3b 0a 23 65 6e 64  >protFlags;.#end
22a80 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  if.#if SQLITE_EN
22a90 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
22aa0 4c 45 0a 20 20 20 20 20 20 69 66 28 20 69 73 50  LE.      if( isP
22ab0 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28  roxyLockingMode(
22ac0 70 53 72 63 46 69 6c 65 29 20 29 7b 0a 20 20 20  pSrcFile) ){.   
22ad0 20 20 20 20 20 73 72 63 46 6c 61 67 73 20 7c 3d       srcFlags |=
22ae0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54   SQLITE_OPEN_AUT
22af0 4f 50 52 4f 58 59 3b 0a 20 20 20 20 20 20 7d 0a  OPROXY;.      }.
22b00 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20  #endif.      rc 
22b10 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  = sqlite3_open_v
22b20 32 28 70 53 72 63 46 69 6c 65 2d 3e 7a 50 61 74  2(pSrcFile->zPat
22b30 68 2c 20 26 73 72 63 64 62 32 2c 20 73 72 63 46  h, &srcdb2, srcF
22b40 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20  lags, 0);.      
22b50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22b60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
22b70 73 74 61 72 74 20 61 20 64 65 66 65 72 72 65 64  start a deferred
22b80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
22b90 20 72 65 61 64 20 74 6f 20 65 73 74 61 62 6c 69   read to establi
22ba0 73 68 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a  sh a read lock *
22bb0 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  /.        rc = s
22bc0 71 6c 69 74 65 33 5f 65 78 65 63 28 73 72 63 64  qlite3_exec(srcd
22bd0 62 32 2c 20 22 42 45 47 49 4e 20 44 45 46 45 52  b2, "BEGIN DEFER
22be0 52 45 44 3b 20 50 52 41 47 4d 41 20 73 63 68 65  RED; PRAGMA sche
22bf0 6d 61 5f 76 65 72 73 69 6f 6e 22 2c 0a 20 20 20  ma_version",.   
22c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c10 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 29 3b         0, 0, 0);
22c20 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
22c30 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
22c40 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
22c50 54 41 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  TADB ){.        
22c60 20 20 69 73 53 72 63 43 6f 72 72 75 70 74 20 3d    isSrcCorrupt =
22c70 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   1;.          rc
22c80 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73   = sqlite3demo_s
22c90 75 70 65 72 6c 6f 63 6b 5f 63 6f 72 72 75 70 74  uperlock_corrupt
22ca0 28 73 72 63 5f 66 69 6c 65 2c 20 53 51 4c 49 54  (src_file, SQLIT
22cb0 45 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 2c 0a 20  E_LOCK_SHARED,. 
22cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ce0 20 20 20 20 20 20 20 20 20 20 20 20 26 63 6f 72              &cor
22cf0 72 75 70 74 53 72 63 46 69 6c 65 4c 6f 63 6b 29  ruptSrcFileLock)
22d00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22d10 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
22d20 69 66 28 20 21 73 72 63 64 62 32 20 7c 7c 20 70  if( !srcdb2 || p
22d30 53 72 63 46 69 6c 65 3d 3d 4e 55 4c 4c 20 7c 7c  SrcFile==NULL ||
22d40 20 70 53 72 63 46 69 6c 65 2d 3e 68 3c 30 29 7b   pSrcFile->h<0){
22d50 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
22d60 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d 0a 20  _INTERNAL;.  }. 
22d70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
22d80 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  OK ){.    goto e
22d90 6e 64 5f 72 65 70 6c 61 63 65 5f 64 61 74 61 62  nd_replace_datab
22da0 61 73 65 3b 0a 20 20 7d 0a 20 20 2f 2a 20 62 6f  ase;.  }.  /* bo
22db0 74 68 20 64 61 74 61 62 61 73 65 73 20 61 72 65  th databases are
22dc0 20 6c 6f 63 6b 65 64 20 61 70 70 72 6f 70 72 69   locked appropri
22dd0 61 74 65 6c 79 2c 20 63 6f 70 79 20 74 68 65 20  ately, copy the 
22de0 73 72 63 20 77 61 6c 20 6a 6f 75 72 6e 61 6c 20  src wal journal 
22df0 69 66 20 0a 20 20 20 2a 2a 20 6f 6e 65 20 65 78  if .   ** one ex
22e00 69 73 74 73 20 61 6e 64 20 74 68 65 6e 20 74 68  ists and then th
22e10 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73  e actual databas
22e20 65 20 66 69 6c 65 0a 20 20 20 2a 2f 0a 20 20 73  e file.   */.  s
22e30 74 72 6c 63 70 79 28 73 72 63 57 61 6c 50 61 74  trlcpy(srcWalPat
22e40 68 2c 20 70 53 72 63 46 69 6c 65 2d 3e 7a 50 61  h, pSrcFile->zPa
22e50 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 2b 35  th, MAXPATHLEN+5
22e60 29 3b 0a 20 20 73 74 72 6c 63 61 74 28 73 72 63  );.  strlcat(src
22e70 57 61 6c 50 61 74 68 2c 20 22 2d 77 61 6c 22 2c  WalPath, "-wal",
22e80 20 4d 41 58 50 41 54 48 4c 45 4e 2b 35 29 3b 0a   MAXPATHLEN+5);.
22e90 20 20 73 72 63 57 61 6c 46 44 20 3d 20 6f 70 65    srcWalFD = ope
22ea0 6e 28 73 72 63 57 61 6c 50 61 74 68 2c 20 4f 5f  n(srcWalPath, O_
22eb0 52 44 4f 4e 4c 59 29 3b 0a 20 20 69 66 28 20 21  RDONLY);.  if( !
22ec0 28 73 72 63 57 61 6c 46 44 3c 30 29 20 29 7b 0a  (srcWalFD<0) ){.
22ed0 20 20 20 20 63 68 61 72 20 64 73 74 57 61 6c 50      char dstWalP
22ee0 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 35  ath[MAXPATHLEN+5
22ef0 5d 3b 0a 20 20 20 20 69 6e 74 20 64 73 74 57 61  ];.    int dstWa
22f00 6c 46 44 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e  lFD = -1;.    in
22f10 74 20 70 72 6f 74 46 6c 61 67 73 20 3d 20 30 3b  t protFlags = 0;
22f20 0a 20 20 20 20 73 74 72 6c 63 70 79 28 64 73 74  .    strlcpy(dst
22f30 57 61 6c 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e  WalPath, pFile->
22f40 7a 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  zPath, MAXPATHLE
22f50 4e 2b 35 29 3b 0a 20 20 20 20 73 74 72 6c 63 61  N+5);.    strlca
22f60 74 28 64 73 74 57 61 6c 50 61 74 68 2c 20 22 2d  t(dstWalPath, "-
22f70 77 61 6c 22 2c 20 4d 41 58 50 41 54 48 4c 45 4e  wal", MAXPATHLEN
22f80 2b 35 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 75  +5);..    rc = u
22f90 6e 69 78 4f 70 65 6e 43 68 69 6c 64 46 69 6c 65  nixOpenChildFile
22fa0 28 64 73 74 57 61 6c 50 61 74 68 2c 20 4f 5f 52  (dstWalPath, O_R
22fb0 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 53 51 4c  DWR|O_CREAT, SQL
22fc0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 2c 0a 20 20  ITE_OPEN_WAL,.  
22fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fe0 20 20 20 20 20 20 20 20 20 70 72 6f 74 46 6c 61           protFla
22ff0 67 73 2c 20 26 64 73 74 57 61 6c 46 44 29 3b 0a  gs, &dstWalFD);.
23000 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
23010 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
23020 20 3d 20 63 6f 70 79 66 69 6c 65 5f 73 74 61 74   = copyfile_stat
23030 65 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  e_alloc();.     
23040 20 6c 73 65 65 6b 28 73 72 63 57 61 6c 46 44 2c   lseek(srcWalFD,
23050 20 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20   0, SEEK_SET);. 
23060 20 20 20 20 20 6c 73 65 65 6b 28 64 73 74 57 61       lseek(dstWa
23070 6c 46 44 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54  lFD, 0, SEEK_SET
23080 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63 6f  );.      if( fco
23090 70 79 66 69 6c 65 28 73 72 63 57 61 6c 46 44 2c  pyfile(srcWalFD,
230a0 20 64 73 74 57 61 6c 46 44 2c 20 73 2c 20 43 4f   dstWalFD, s, CO
230b0 50 59 46 49 4c 45 5f 44 41 54 41 29 20 29 7b 0a  PYFILE_DATA) ){.
230c0 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 3d          int err=
230d0 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 73  errno;.        s
230e0 77 69 74 63 68 28 65 72 72 29 20 7b 0a 20 20 20  witch(err) {.   
230f0 20 20 20 20 20 20 20 63 61 73 65 20 45 4e 4f 4d         case ENOM
23100 45 4d 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  EM:.            
23110 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
23120 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  M;.            b
23130 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
23140 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
23150 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
23160 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 29 3b  rno(pFile, err);
23170 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
23180 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  = SQLITE_IOERR;.
23190 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
231a0 7d 0a 20 20 20 20 20 20 63 6f 70 79 66 69 6c 65  }.      copyfile
231b0 5f 73 74 61 74 65 5f 66 72 65 65 28 73 29 3b 0a  _state_free(s);.
231c0 20 20 20 20 20 20 63 6c 6f 73 65 28 64 73 74 57        close(dstW
231d0 61 6c 46 44 29 3b 0a 20 20 20 20 7d 0a 20 20 20  alFD);.    }.   
231e0 20 63 6c 6f 73 65 28 73 72 63 57 61 6c 46 44 29   close(srcWalFD)
231f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
23200 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23210 20 2f 2a 20 62 65 66 6f 72 65 20 77 65 20 63 6f   /* before we co
23220 70 79 2c 20 65 6e 73 75 72 65 20 74 68 61 74 20  py, ensure that 
23230 74 68 65 20 66 69 6c 65 20 63 68 61 6e 67 65 20  the file change 
23240 63 6f 75 6e 74 65 72 20 77 69 6c 6c 20 62 65 20  counter will be 
23250 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20  modified */.    
23260 75 69 6e 74 33 32 5f 74 20 73 72 63 43 68 61 6e  uint32_t srcChan
23270 67 65 20 3d 20 30 3b 0a 20 20 20 20 75 69 6e 74  ge = 0;.    uint
23280 33 32 5f 74 20 64 73 74 43 68 61 6e 67 65 20 3d  32_t dstChange =
23290 20 30 3b 0a 20 20 20 20 70 72 65 61 64 28 70 53   0;.    pread(pS
232a0 72 63 46 69 6c 65 2d 3e 68 2c 20 26 73 72 63 43  rcFile->h, &srcC
232b0 68 61 6e 67 65 2c 20 34 2c 20 32 34 29 3b 0a 20  hange, 4, 24);. 
232c0 20 20 20 70 72 65 61 64 28 70 46 69 6c 65 2d 3e     pread(pFile->
232d0 68 2c 20 26 64 73 74 43 68 61 6e 67 65 2c 20 34  h, &dstChange, 4
232e0 2c 20 32 34 29 3b 0a 20 20 20 20 0a 20 20 20 20  , 24);.    .    
232f0 2f 2a 20 63 6f 70 79 20 74 68 65 20 61 63 74 75  /* copy the actu
23300 61 6c 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  al database */. 
23310 20 20 20 73 20 3d 20 63 6f 70 79 66 69 6c 65 5f     s = copyfile_
23320 73 74 61 74 65 5f 61 6c 6c 6f 63 28 29 3b 0a 20  state_alloc();. 
23330 20 20 20 6c 73 65 65 6b 28 70 53 72 63 46 69 6c     lseek(pSrcFil
23340 65 2d 3e 68 2c 20 30 2c 20 53 45 45 4b 5f 53 45  e->h, 0, SEEK_SE
23350 54 29 3b 0a 20 20 20 20 6c 73 65 65 6b 28 70 46  T);.    lseek(pF
23360 69 6c 65 2d 3e 68 2c 20 30 2c 20 53 45 45 4b 5f  ile->h, 0, SEEK_
23370 53 45 54 29 3b 0a 20 20 20 20 69 66 28 20 66 63  SET);.    if( fc
23380 6f 70 79 66 69 6c 65 28 70 53 72 63 46 69 6c 65  opyfile(pSrcFile
23390 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73  ->h, pFile->h, s
233a0 2c 20 43 4f 50 59 46 49 4c 45 5f 44 41 54 41 29  , COPYFILE_DATA)
233b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72   ){.      int er
233c0 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 73  r=errno;.      s
233d0 77 69 74 63 68 28 65 72 72 29 20 7b 0a 20 20 20  witch(err) {.   
233e0 20 20 20 20 20 63 61 73 65 20 45 4e 4f 4d 45 4d       case ENOMEM
233f0 3a 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  :.          rc =
23400 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
23410 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
23420 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
23430 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65  .          store
23440 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
23450 20 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20   err);.         
23460 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
23470 52 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  RR;.      }.    
23480 7d 0a 20 20 20 20 63 6f 70 79 66 69 6c 65 5f 73  }.    copyfile_s
23490 74 61 74 65 5f 66 72 65 65 28 73 29 3b 0a 20 20  tate_free(s);.  
234a0 20 20 0a 20 20 20 20 69 66 20 28 73 72 63 43 68    .    if (srcCh
234b0 61 6e 67 65 20 3d 3d 20 64 73 74 43 68 61 6e 67  ange == dstChang
234c0 65 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6d 6f  e) {.      /* mo
234d0 64 69 66 79 20 74 68 65 20 63 68 61 6e 67 65 20  dify the change 
234e0 63 6f 75 6e 74 65 72 20 74 6f 20 66 6f 72 63 65  counter to force
234f0 20 70 61 67 65 20 7a 65 72 6f 20 74 6f 20 62 65   page zero to be
23500 20 72 65 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 20   reloaded */.   
23510 20 20 20 64 73 74 43 68 61 6e 67 65 20 2b 2b 3b     dstChange ++;
23520 0a 20 20 20 20 20 20 70 77 72 69 74 65 28 70 46  .      pwrite(pF
23530 69 6c 65 2d 3e 68 2c 20 26 64 73 74 43 68 61 6e  ile->h, &dstChan
23540 67 65 2c 20 34 2c 20 32 34 29 3b 0a 20 20 20 20  ge, 4, 24);.    
23550 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 53 72  }.  }.  if( isSr
23560 63 43 6f 72 72 75 70 74 20 29 7b 0a 20 20 20 20  cCorrupt ){.    
23570 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65  sqlite3demo_supe
23580 72 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28  runlock_corrupt(
23590 73 72 63 5f 66 69 6c 65 2c 20 63 6f 72 72 75 70  src_file, corrup
235a0 74 53 72 63 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20  tSrcFileLock);. 
235b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 64   }else{.    /* d
235c0 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6f 75  one with the sou
235d0 72 63 65 20 64 62 20 73 6f 20 65 6e 64 20 74 68  rce db so end th
235e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  e transaction */
235f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65  .    sqlite3_exe
23600 63 28 73 72 63 64 62 32 2c 20 22 43 4f 4d 4d 49  c(srcdb2, "COMMI
23610 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  T", 0, 0, 0);.  
23620 7d 0a 20 20 2f 2a 20 7a 65 72 6f 20 6f 75 74 20  }.  /* zero out 
23630 61 6e 79 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20  any old journal 
23640 63 6c 75 74 74 65 72 20 2a 2f 0a 20 20 69 66 28  clutter */.  if(
23650 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23660 7b 0a 20 20 20 20 69 6e 74 20 73 6b 69 70 57 41  {.    int skipWA
23670 4c 20 3d 20 28 73 72 63 57 61 6c 46 44 3c 30 29  L = (srcWalFD<0)
23680 3f 30 3a 31 3b 0a 20 20 20 20 75 6e 69 78 49 6e  ?0:1;.    unixIn
23690 76 61 6c 69 64 61 74 65 53 75 70 70 6f 72 74 46  validateSupportF
236a0 69 6c 65 73 28 70 46 69 6c 65 2c 20 73 6b 69 70  iles(pFile, skip
236b0 57 41 4c 29 3b 0a 20 20 7d 0a 20 20 0a 65 6e 64  WAL);.  }.  .end
236c0 5f 72 65 70 6c 61 63 65 5f 64 61 74 61 62 61 73  _replace_databas
236d0 65 3a 0a 20 20 69 66 28 20 70 53 72 63 42 74 72  e:.  if( pSrcBtr
236e0 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ee ){.    sqlite
236f0 33 5f 63 6c 6f 73 65 28 73 72 63 64 62 32 29 3b  3_close(srcdb2);
23700 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
23710 65 4c 65 61 76 65 28 70 53 72 63 42 74 72 65 65  eLeave(pSrcBtree
23720 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
23730 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 72 63  _mutex_leave(src
23740 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
23750 28 20 69 73 44 73 74 43 6f 72 72 75 70 74 20 29  ( isDstCorrupt )
23760 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 64 65 6d  {.    sqlite3dem
23770 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 5f 63 6f  o_superunlock_co
23780 72 72 75 70 74 28 69 64 2c 20 63 6f 72 72 75 70  rrupt(id, corrup
23790 74 44 73 74 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20  tDstFileLock);. 
237a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
237b0 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c  te3demo_superunl
237c0 6f 63 6b 28 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a  ock(pLock);.  }.
237d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
237e0 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 49  define SQLITE_FI
237f0 4c 45 5f 48 45 41 44 45 52 5f 4c 45 4e 20 31 36  LE_HEADER_LEN 16
23800 0a 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20  ./* Check for a 
23810 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c 6f 63 6b  conflicting lock
23820 2e 20 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75  .  If one is fou
23830 6e 64 2c 20 70 72 69 6e 74 20 61 6e 20 74 68 69  nd, print an thi
23840 73 0a 20 2a 2a 20 6f 6e 20 73 74 61 6e 64 61 72  s. ** on standar
23850 64 20 6f 75 74 70 75 74 20 75 73 69 6e 67 20 74  d output using t
23860 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67  he format string
23870 20 67 69 76 65 6e 20 61 6e 64 20 72 65 74 75 72   given and retur
23880 6e 20 31 2e 0a 20 2a 2a 20 49 66 20 74 68 65 72  n 1.. ** If ther
23890 65 20 61 72 65 20 6e 6f 20 63 6f 6e 66 6c 69 63  e are no conflic
238a0 74 69 6e 67 20 6c 6f 63 6b 73 2c 20 72 65 74 75  ting locks, retu
238b0 72 6e 20 30 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  rn 0.. */.static
238c0 20 69 6e 74 20 75 6e 69 78 49 73 4c 6f 63 6b 65   int unixIsLocke
238d0 64 28 0a 20 20 70 69 64 5f 74 20 70 69 64 2c 20  d(.  pid_t pid, 
238e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 49             /* PI
238f0 44 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6c 6f  D to test for lo
23900 63 6b 20 6f 77 6e 65 72 20 2a 2f 0a 20 20 69 6e  ck owner */.  in
23910 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  t h,            
23920 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
23930 72 69 70 74 6f 72 20 74 6f 20 63 68 65 63 6b 20  riptor to check 
23940 2a 2f 0a 20 20 69 6e 74 20 74 79 70 65 2c 20 20  */.  int type,  
23950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f             /* F_
23960 52 44 4c 43 4b 20 6f 72 20 46 5f 57 52 4c 43 4b  RDLCK or F_WRLCK
23970 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   */.  unsigned i
23980 6e 74 20 69 4f 66 73 74 2c 20 20 20 2f 2a 20 46  nt iOfst,   /* F
23990 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
239a0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
239b0 6e 65 64 20 69 6e 74 20 69 43 6e 74 2c 20 20 20  ned int iCnt,   
239c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
239d0 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 20  tes in the lock 
239e0 72 61 6e 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  range */.  const
239f0 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20 20 20   char *zType    
23a00 20 2f 2a 20 54 79 70 65 20 6f 66 20 6c 6f 63 6b   /* Type of lock
23a10 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
23a20 66 6c 6f 63 6b 20 6c 6b 3b 0a 20 20 69 6e 74 20  flock lk;.  int 
23a30 65 72 72 3b 0a 20 20 0a 20 20 6d 65 6d 73 65 74  err;.  .  memset
23a40 28 26 6c 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (&lk, 0, sizeof(
23a50 6c 6b 29 29 3b 0a 20 20 6c 6b 2e 6c 5f 74 79 70  lk));.  lk.l_typ
23a60 65 20 3d 20 74 79 70 65 3b 0a 20 20 6c 6b 2e 6c  e = type;.  lk.l
23a70 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
23a80 45 54 3b 0a 20 20 6c 6b 2e 6c 5f 73 74 61 72 74  ET;.  lk.l_start
23a90 20 3d 20 69 4f 66 73 74 3b 0a 20 20 6c 6b 2e 6c   = iOfst;.  lk.l
23aa0 5f 6c 65 6e 20 3d 20 69 43 6e 74 3b 0a 20 20 0a  _len = iCnt;.  .
23ab0 20 20 69 66 28 20 70 69 64 21 3d 53 51 4c 49 54    if( pid!=SQLIT
23ac0 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 41 4e 59 50  E_LOCKSTATE_ANYP
23ad0 49 44 20 29 7b 0a 23 69 66 6e 64 65 66 20 46 5f  ID ){.#ifndef F_
23ae0 47 45 54 4c 4b 50 49 44 0a 23 20 77 61 72 6e 69  GETLKPID.# warni
23af0 6e 67 20 46 5f 47 45 54 4c 4b 50 49 44 20 75 6e  ng F_GETLKPID un
23b00 64 65 66 69 6e 65 64 2c 20 5f 73 71 6c 69 74 65  defined, _sqlite
23b10 33 5f 6c 6f 63 6b 73 74 61 74 65 20 66 61 6c 6c  3_lockstate fall
23b20 69 6e 67 20 62 61 63 6b 20 74 6f 20 46 5f 47 45  ing back to F_GE
23b30 54 4c 4b 0a 20 20 20 20 65 72 72 20 3d 20 66 63  TLK.    err = fc
23b40 6e 74 6c 28 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  ntl(h, F_GETLK, 
23b50 26 6c 6b 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  &lk);.#else.    
23b60 6c 6b 2e 6c 5f 70 69 64 20 3d 20 70 69 64 3b 0a  lk.l_pid = pid;.
23b70 20 20 20 20 65 72 72 20 3d 20 66 63 6e 74 6c 28      err = fcntl(
23b80 68 2c 20 46 5f 47 45 54 4c 4b 50 49 44 2c 20 26  h, F_GETLKPID, &
23b90 6c 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  lk);.#endif.  }e
23ba0 6c 73 65 7b 0a 20 20 20 20 65 72 72 20 3d 20 66  lse{.    err = f
23bb0 63 6e 74 6c 28 68 2c 20 46 5f 47 45 54 4c 4b 2c  cntl(h, F_GETLK,
23bc0 20 26 6c 6b 29 3b 0a 20 20 7d 0a 20 20 0a 20 20   &lk);.  }.  .  
23bd0 69 66 28 20 65 72 72 3d 3d 28 2d 31 29 20 29 7b  if( err==(-1) ){
23be0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
23bf0 65 72 72 2c 20 22 66 63 6e 74 6c 28 25 64 29 20  err, "fcntl(%d) 
23c00 66 61 69 6c 65 64 3a 20 65 72 72 6e 6f 3d 25 64  failed: errno=%d
23c10 5c 6e 22 2c 20 68 2c 20 65 72 72 6e 6f 29 3b 0a  \n", h, errno);.
23c20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
23c30 20 7d 0a 20 20 0a 20 20 69 66 28 20 6c 6b 2e 6c   }.  .  if( lk.l
23c40 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 26  _type!=F_UNLCK &
23c50 26 20 28 70 69 64 3d 3d 53 51 4c 49 54 45 5f 4c  & (pid==SQLITE_L
23c60 4f 43 4b 53 54 41 54 45 5f 41 4e 59 50 49 44 20  OCKSTATE_ANYPID 
23c70 7c 7c 20 6c 6b 2e 6c 5f 70 69 64 3d 3d 70 69 64  || lk.l_pid==pid
23c80 29 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ) ){.#ifdef SQLI
23c90 54 45 5f 44 45 42 55 47 0a 20 20 20 20 66 70 72  TE_DEBUG.    fpr
23ca0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
23cb0 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79 20 25 64   lock held by %d
23cc0 5c 6e 22 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74  \n", zType, (int
23cd0 29 6c 6b 2e 6c 5f 70 69 64 29 3b 0a 23 65 6e 64  )lk.l_pid);.#end
23ce0 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  if.    return 1;
23cf0 0a 20 20 7d 20 0a 20 20 72 65 74 75 72 6e 20 30  .  } .  return 0
23d00 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
23d10 75 6e 69 78 4c 6f 63 6b 73 74 61 74 65 50 69 64  unixLockstatePid
23d20 28 75 6e 69 78 46 69 6c 65 20 2a 2c 20 70 69 64  (unixFile *, pid
23d30 5f 74 2c 20 69 6e 74 20 2a 29 3b 0a 0a 23 65 6e  _t, int *);..#en
23d40 64 69 66 20 2f 2a 20 28 53 51 4c 49 54 45 5f 45  dif /* (SQLITE_E
23d50 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e  NABLE_APPLE_SPI>
23d60 30 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  0) && defined(__
23d70 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 0a 0a 2f 2a  APPLE__) */.../*
23d80 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20  .** If *pArg is 
23d90 69 6e 69 74 69 61 6c 6c 79 20 6e 65 67 61 74 69  initially negati
23da0 76 65 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  ve then this is 
23db0 61 20 71 75 65 72 79 2e 20 20 53 65 74 20 2a 70  a query.  Set *p
23dc0 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30  Arg to.** 1 or 0
23dd0 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
23de0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62 69 74  ether or not bit
23df0 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e   mask of pFile->
23e00 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73 65 74  ctrlFlags is set
23e10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67  ..**.** If *pArg
23e20 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68 65 6e   is 0 or 1, then
23e30 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20 74 68   clear or set th
23e40 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20 70 46  e mask bit of pF
23e50 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a  ile->ctrlFlags..
23e60 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
23e70 6e 69 78 4d 6f 64 65 42 69 74 28 75 6e 69 78 46  nixModeBit(unixF
23e80 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69  ile *pFile, unsi
23e90 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20  gned char mask, 
23ea0 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69 66  int *pArg){.  if
23eb0 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20 20  ( *pArg<0 ){.   
23ec0 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d   *pArg = (pFile-
23ed0 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73  >ctrlFlags & mas
23ee0 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69  k)!=0;.  }else i
23ef0 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b  f( (*pArg)==0 ){
23f00 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
23f10 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a  Flags &= ~mask;.
23f20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
23f30 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  le->ctrlFlags |=
23f40 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   mask;.  }.}../*
23f50 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
23f60 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69  tion */.static i
23f70 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61  nt unixGetTempna
23f80 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  me(int nBuf, cha
23f90 72 20 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a  r *zBuf);../*.**
23fa0 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64   Information and
23fb0 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f   control of an o
23fc0 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e  pen file handle.
23fd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
23fe0 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  nixFileControl(s
23ff0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
24000 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70   int op, void *p
24010 41 72 67 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  Arg){.  unixFile
24020 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
24030 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69 74 63  ile*)id;.  switc
24040 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
24050 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
24060 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20  OCKSTATE: {.    
24070 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
24080 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
24090 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
240a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
240b0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
240c0 46 43 4e 54 4c 5f 4c 41 53 54 5f 45 52 52 4e 4f  FCNTL_LAST_ERRNO
240d0 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
240e0 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c  )pArg = pFile->l
240f0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
24100 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24110 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
24120 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48   SQLITE_FCNTL_CH
24130 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  UNK_SIZE: {.    
24140 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b    pFile->szChunk
24150 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b   = *(int *)pArg;
24160 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
24170 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
24180 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
24190 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20  CNTL_SIZE_HINT: 
241a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  {.      int rc;.
241b0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
241c0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
241d0 20 20 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c        rc = fcntl
241e0 53 69 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c 20  SizeHint(pFile, 
241f0 2a 28 69 36 34 20 2a 29 70 41 72 67 29 3b 0a 20  *(i64 *)pArg);. 
24200 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
24210 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
24220 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
24230 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
24240 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53  QLITE_FCNTL_PERS
24250 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20  IST_WAL: {.     
24260 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69   unixModeBit(pFi
24270 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 45 52  le, UNIXFILE_PER
24280 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29  SIST_WAL, (int*)
24290 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74  pArg);.      ret
242a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
242b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
242c0 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52  LITE_FCNTL_POWER
242d0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20  SAFE_OVERWRITE: 
242e0 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65  {.      unixMode
242f0 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46  Bit(pFile, UNIXF
24300 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29  ILE_PSOW, (int*)
24310 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74  pArg);.      ret
24320 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
24330 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
24340 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41  LITE_FCNTL_VFSNA
24350 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68  ME: {.      *(ch
24360 61 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69  ar**)pArg = sqli
24370 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
24380 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a  , pFile->pVfs->z
24390 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
243a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
243b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
243c0 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46  LITE_FCNTL_TEMPF
243d0 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20  ILENAME: {.     
243e0 20 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20   char *zTFile = 
243f0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
24400 28 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d  ( pFile->pVfs->m
24410 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 20  xPathname );.   
24420 20 20 20 69 66 28 20 7a 54 46 69 6c 65 20 29 7b     if( zTFile ){
24430 0a 20 20 20 20 20 20 20 20 75 6e 69 78 47 65 74  .        unixGet
24440 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e  Tempname(pFile->
24450 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
24460 2c 20 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20 20  , zTFile);.     
24470 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
24480 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20   = zTFile;.     
24490 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
244a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
244b0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
244c0 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44  _FCNTL_HAS_MOVED
244d0 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
244e0 29 70 41 72 67 20 3d 20 66 69 6c 65 48 61 73 4d  )pArg = fileHasM
244f0 6f 76 65 64 28 70 46 69 6c 65 29 3b 0a 20 20 20  oved(pFile);.   
24500 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24510 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53  _OK;.    }.#if S
24520 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
24530 49 5a 45 3e 30 0a 20 20 20 20 63 61 73 65 20 53  IZE>0.    case S
24540 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50  QLITE_FCNTL_MMAP
24550 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69  _SIZE: {.      i
24560 36 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28  64 newLimit = *(
24570 69 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  i64*)pArg;.     
24580 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24590 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  _OK;.      if( n
245a0 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33 47  ewLimit>sqlite3G
245b0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d  lobalConfig.mxMm
245c0 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  ap ){.        ne
245d0 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  wLimit = sqlite3
245e0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d  GlobalConfig.mxM
245f0 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  map;.      }.   
24600 20 20 20 2a 28 69 36 34 2a 29 70 41 72 67 20 3d     *(i64*)pArg =
24610 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
24620 4d 61 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  Max;.      if( n
24630 65 77 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e 65  ewLimit>=0 && ne
24640 77 4c 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e 6d  wLimit!=pFile->m
24650 6d 61 70 53 69 7a 65 4d 61 78 20 26 26 20 70 46  mapSizeMax && pF
24660 69 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  ile->nFetchOut==
24670 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  0 ){.        pFi
24680 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  le->mmapSizeMax 
24690 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20 20  = newLimit;.    
246a0 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d      if( pFile->m
246b0 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20  mapSize>0 ){.   
246c0 20 20 20 20 20 20 20 75 6e 69 78 55 6e 6d 61 70         unixUnmap
246d0 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 20  file(pFile);.   
246e0 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
246f0 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 2d  Mapfile(pFile, -
24700 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
24710 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
24720 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e  rn rc;.    }.#en
24730 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
24740 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54  E_DEBUG.    /* T
24750 68 65 20 70 61 67 65 72 20 63 61 6c 6c 73 20 74  he pager calls t
24760 68 69 73 20 6d 65 74 68 6f 64 20 74 6f 20 73 69  his method to si
24770 67 6e 61 6c 20 74 68 61 74 20 69 74 20 68 61 73  gnal that it has
24780 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 20 72   done.    ** a r
24790 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68 61 74  ollback and that
247a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
247b0 20 74 68 65 72 65 66 6f 72 65 20 75 6e 63 68 61   therefore uncha
247c0 6e 67 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20  nged and.    ** 
247d0 69 74 20 68 65 6e 63 65 20 69 74 20 69 73 20 4f  it hence it is O
247e0 4b 20 66 6f 72 20 74 68 65 20 74 72 61 6e 73 61  K for the transa
247f0 63 74 69 6f 6e 20 63 68 61 6e 67 65 20 63 6f 75  ction change cou
24800 6e 74 65 72 20 74 6f 20 62 65 0a 20 20 20 20 2a  nter to be.    *
24810 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20  * unchanged..   
24820 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
24830 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
24840 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20 20 20 20  HANGED: {.      
24850 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
24860 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20  >dbUpdate = 0;. 
24870 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24880 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e  TE_OK;.    }.#en
24890 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
248a0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
248b0 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
248c0 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61  _APPLE__).    ca
248d0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
248e0 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
248f0 45 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  E:.    case SQLI
24900 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43  TE_FCNTL_GET_LOC
24910 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20  KPROXYFILE: {.  
24920 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79      return proxy
24930 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f  FileControl(id,o
24940 70 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23  p,pArg);.    }.#
24950 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
24960 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
24970 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
24980 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 23 69  __APPLE__) */.#i
24990 66 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  f (SQLITE_ENABLE
249a0 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26  _APPLE_SPI>0) &&
249b0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
249c0 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c  __).    case SQL
249d0 49 54 45 5f 46 43 4e 54 4c 5f 54 52 55 4e 43 41  ITE_FCNTL_TRUNCA
249e0 54 45 5f 44 41 54 41 42 41 53 45 3a 20 7b 0a 20  TE_DATABASE: {. 
249f0 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78       return unix
24a00 54 72 75 6e 63 61 74 65 44 61 74 61 62 61 73 65  TruncateDatabase
24a10 28 70 46 69 6c 65 2c 20 28 70 41 72 67 20 3f 20  (pFile, (pArg ? 
24a20 28 2a 28 69 6e 74 20 2a 29 70 41 72 67 29 20 3a  (*(int *)pArg) :
24a30 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0));.    }.    
24a40 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
24a50 4c 5f 52 45 50 4c 41 43 45 5f 44 41 54 41 42 41  L_REPLACE_DATABA
24a60 53 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  SE: {.      retu
24a70 72 6e 20 75 6e 69 78 52 65 70 6c 61 63 65 44 61  rn unixReplaceDa
24a80 74 61 62 61 73 65 28 70 46 69 6c 65 2c 20 28 73  tabase(pFile, (s
24a90 71 6c 69 74 65 33 20 2a 29 70 41 72 67 29 3b 0a  qlite3 *)pArg);.
24aa0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
24ab0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b  QLITE_FCNTL_LOCK
24ac0 53 54 41 54 45 5f 50 49 44 3a 20 7b 0a 20 20 20  STATE_PID: {.   
24ad0 20 20 20 4c 6f 63 6b 73 74 61 74 65 50 49 44 20     LockstatePID 
24ae0 2a 70 4c 6f 63 6b 73 74 61 74 65 3b 0a 20 20 20  *pLockstate;.   
24af0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
24b00 20 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67   .      if( pArg
24b10 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  ==NULL ){.      
24b20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24b30 4d 49 53 55 53 45 3b 0a 20 20 20 20 20 20 7d 0a  MISUSE;.      }.
24b40 20 20 20 20 20 20 70 4c 6f 63 6b 73 74 61 74 65        pLockstate
24b50 20 3d 20 28 4c 6f 63 6b 73 74 61 74 65 50 49 44   = (LockstatePID
24b60 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72   *)pArg;.      r
24b70 63 20 3d 20 75 6e 69 78 4c 6f 63 6b 73 74 61 74  c = unixLockstat
24b80 65 50 69 64 28 70 46 69 6c 65 2c 20 70 4c 6f 63  ePid(pFile, pLoc
24b90 6b 73 74 61 74 65 2d 3e 70 69 64 2c 20 26 28 70  kstate->pid, &(p
24ba0 4c 6f 63 6b 73 74 61 74 65 2d 3e 73 74 61 74 65  Lockstate->state
24bb0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
24bc0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 20   rc;.    }.     
24bd0 20 0a 23 65 6e 64 69 66 20 2f 2a 20 28 53 51 4c   .#endif /* (SQL
24be0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45  ITE_ENABLE_APPLE
24bf0 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e  _SPI>0) && defin
24c00 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f  ed(__APPLE__) */
24c10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
24c20 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d  LITE_NOTFOUND;.}
24c30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
24c40 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  he sector size i
24c50 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75  n bytes of the u
24c60 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20  nderlying block 
24c70 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68  device for.** th
24c80 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
24c90 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74  . This is almost
24ca0 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
24cb0 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a  s, but may be.**
24cc0 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65   larger for some
24cd0 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20   devices..**.** 
24ce0 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75  SQLite code assu
24cf0 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  mes this functio
24d00 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49  n cannot fail. I
24d10 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74  t also assumes t
24d20 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69  hat.** if two fi
24d30 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20  les are created 
24d40 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  in the same file
24d50 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72  -system director
24d60 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74  y (i.e..** a dat
24d70 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f  abase and its jo
24d80 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74  urnal file) that
24d90 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
24da0 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20   will be the.** 
24db0 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a  same for both..*
24dc0 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 51 4e 58 4e  /.#ifndef __QNXN
24dd0 54 4f 5f 5f 20 0a 73 74 61 74 69 63 20 69 6e 74  TO__ .static int
24de0 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28   unixSectorSize(
24df0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
24e00 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44  tUsed){.  UNUSED
24e10 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
24e20 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ed);.  return SQ
24e30 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43  LITE_DEFAULT_SEC
24e40 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 23 65 6e 64  TOR_SIZE;.}.#end
24e50 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
24e60 6c 6c 6f 77 69 6e 67 20 76 65 72 73 69 6f 6e 20  llowing version 
24e70 6f 66 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a  of unixSectorSiz
24e80 65 28 29 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  e() is optimized
24e90 20 66 6f 72 20 51 4e 58 2e 0a 2a 2f 0a 23 69 66   for QNX..*/.#if
24ea0 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 23  def __QNXNTO__.#
24eb0 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 64 63 6d  include <sys/dcm
24ec0 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63 6c 75 64  d_blk.h>.#includ
24ed0 65 20 3c 73 79 73 2f 73 74 61 74 76 66 73 2e 68  e <sys/statvfs.h
24ee0 3e 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  >.static int uni
24ef0 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  xSectorSize(sqli
24f00 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
24f10 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
24f20 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
24f30 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  ;.  if( pFile->s
24f40 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20 30 20 29  ectorSize == 0 )
24f50 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
24f60 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20  tvfs fsInfo;.   
24f70 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 65 74 20      .    /* Set 
24f80 64 65 66 61 75 6c 74 73 20 66 6f 72 20 6e 6f 6e  defaults for non
24f90 2d 73 75 70 70 6f 72 74 65 64 20 66 69 6c 65 73  -supported files
24fa0 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20 20 70 46  ystems */.    pF
24fb0 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
24fc0 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
24fd0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
24fe0 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
24ff0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
25000 20 30 3b 0a 20 20 20 20 69 66 28 20 66 73 74 61   0;.    if( fsta
25010 74 76 66 73 28 70 46 69 6c 65 2d 3e 68 2c 20 26  tvfs(pFile->h, &
25020 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20  fsInfo) == -1 ) 
25030 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
25040 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
25050 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
25060 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e   !strcmp(fsInfo.
25070 66 5f 62 61 73 65 74 79 70 65 2c 20 22 74 6d 70  f_basetype, "tmp
25080 22 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69  ") ) {.      pFi
25090 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
250a0 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
250b0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
250c0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
250d0 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51  ics =.        SQ
250e0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
250f0 43 34 4b 20 7c 20 20 20 20 20 20 20 2f 2a 20 41  C4K |       /* A
25100 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  ll ram filesyste
25110 6d 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f  m writes are ato
25120 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  mic */.        S
25130 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
25140 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20  _APPEND |    /* 
25150 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  growing the file
25160 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
25170 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20  until.          
25180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25190 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
251a0 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64  he write succeed
251b0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  s */.        SQL
251c0 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
251d0 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68  TIAL |     /* Th
251e0 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  e ram filesystem
251f0 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65   has no write be
25200 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  hind.           
25210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25220 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
25230 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a   it is ordered *
25240 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
25250 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73 74   }else if( strst
25260 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74  r(fsInfo.f_baset
25270 79 70 65 2c 20 22 65 74 66 73 22 29 20 29 7b 0a  ype, "etfs") ){.
25280 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
25290 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
252a0 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
252b0 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
252c0 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
252d0 20 20 20 20 20 20 20 2f 2a 20 65 74 66 73 20 63         /* etfs c
252e0 6c 75 73 74 65 72 20 73 69 7a 65 20 77 72 69 74  luster size writ
252f0 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f  es are atomic */
25300 0a 20 20 20 20 20 20 20 20 28 70 46 69 6c 65 2d  .        (pFile-
25310 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31  >sectorSize / 51
25320 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  2 * SQLITE_IOCAP
25330 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c 0a 20 20  _ATOMIC512) |.  
25340 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
25350 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c  AP_SAFE_APPEND |
25360 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74      /* growing t
25370 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
25380 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20   occur until.   
25390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253b0 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20     ** the write 
253c0 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20  succeeds */.    
253d0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
253e0 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20  _SEQUENTIAL |   
253f0 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c    /* The ram fil
25400 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77  esystem has no w
25410 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20  rite behind.    
25420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25440 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72    ** so it is or
25450 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  dered */.       
25460 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
25470 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  ( !strcmp(fsInfo
25480 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71 6e  .f_basetype, "qn
25490 78 36 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46  x6") ){.      pF
254a0 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
254b0 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65  = fsInfo.f_bsize
254c0 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  ;.      pFile->d
254d0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
254e0 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53  tics =.        S
254f0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
25500 49 43 20 7c 20 20 20 20 20 20 20 20 20 2f 2a 20  IC |         /* 
25510 41 6c 6c 20 66 69 6c 65 73 79 73 74 65 6d 20 77  All filesystem w
25520 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63  rites are atomic
25530 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
25540 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
25550 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f  PEND |    /* gro
25560 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f  wing the file do
25570 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74  es not occur unt
25580 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  il.             
25590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255a0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
255b0 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a  write succeeds *
255c0 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
255d0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
255e0 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
255f0 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
25600 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
25610 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
25620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25630 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
25640 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
25650 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
25660 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d 70 28  lse if( !strcmp(
25670 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70  fsInfo.f_basetyp
25680 65 2c 20 22 71 6e 78 34 22 29 20 29 7b 0a 20 20  e, "qnx4") ){.  
25690 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
256a0 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
256b0 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
256c0 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
256d0 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
256e0 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74       /* full bit
256f0 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66  set of atomics f
25700 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73  rom max sector s
25710 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20  ize and smaller 
25720 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70 46 69  */.        ((pFi
25730 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f  le->sectorSize /
25740 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f   512 * SQLITE_IO
25750 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c  CAP_ATOMIC512) <
25760 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20  < 1) - 2 |.     
25770 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
25780 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20  SEQUENTIAL |    
25790 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65   /* The ram file
257a0 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72  system has no wr
257b0 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20  ite behind.     
257c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257e0 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64   ** so it is ord
257f0 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
25800 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
25810 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66   strstr(fsInfo.f
25820 5f 62 61 73 65 74 79 70 65 2c 20 22 64 6f 73 22  _basetype, "dos"
25830 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
25840 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66  ->sectorSize = f
25850 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20  sInfo.f_bsize;. 
25860 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69       pFile->devi
25870 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
25880 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66  s =.        /* f
25890 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74  ull bitset of at
258a0 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73  omics from max s
258b0 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73  ector size and s
258c0 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20  maller */.      
258d0 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f    ((pFile->secto
258e0 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51  rSize / 512 * SQ
258f0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
25900 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20  C512) << 1) - 2 
25910 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  |.        SQLITE
25920 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
25930 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
25940 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
25950 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
25960 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
25970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25980 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
25990 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
259a0 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
259b0 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
259c0 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
259d0 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
259e0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41    SQLITE_IOCAP_A
259f0 54 4f 4d 49 43 35 31 32 20 7c 20 20 20 20 20 20  TOMIC512 |      
25a00 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65 20 61 74  /* blocks are at
25a10 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20  omic */.        
25a20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
25a30 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a  E_APPEND |    /*
25a40 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c   growing the fil
25a50 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  e does not occur
25a60 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20   until.         
25a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a80 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
25a90 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65  the write succee
25aa0 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ds */.        0;
25ab0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
25ac0 4c 61 73 74 20 63 68 61 6e 63 65 20 76 65 72 69  Last chance veri
25ad0 66 69 63 61 74 69 6f 6e 2e 20 20 49 66 20 74 68  fication.  If th
25ae0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
25af0 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  n't a multiple o
25b00 66 20 35 31 32 0a 20 20 2a 2a 20 74 68 65 6e 20  f 512.  ** then 
25b10 69 74 20 69 73 6e 27 74 20 76 61 6c 69 64 2e 2a  it isn't valid.*
25b20 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  /.  if( pFile->s
25b30 65 63 74 6f 72 53 69 7a 65 20 25 20 35 31 32 20  ectorSize % 512 
25b40 21 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  != 0 ){.    pFil
25b50 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
25b60 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20  eristics = 0;.  
25b70 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
25b80 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
25b90 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
25ba0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
25bb0 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
25bc0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f  ;.}.#endif /* __
25bd0 51 4e 58 4e 54 4f 5f 5f 20 2a 2f 0a 0a 2f 2a 0a  QNXNTO__ */../*.
25be0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  ** Return the de
25bf0 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
25c00 74 69 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c  tics for the fil
25c10 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 56 46  e..**.** This VF
25c20 53 20 69 73 20 73 65 74 20 75 70 20 74 6f 20 72  S is set up to r
25c30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43  eturn SQLITE_IOC
25c40 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
25c50 52 57 52 49 54 45 20 62 79 20 64 65 66 61 75 6c  RWRITE by defaul
25c60 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74  t..** However, t
25c70 68 61 74 20 63 68 6f 69 63 65 20 69 73 20 63 6f  hat choice is co
25c80 6e 74 72 6f 76 65 72 73 69 61 6c 20 73 69 6e 63  ntroversial sinc
25c90 65 20 74 65 63 68 6e 69 63 61 6c 6c 79 20 74 68  e technically th
25ca0 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20  e underlying.** 
25cb0 66 69 6c 65 20 73 79 73 74 65 6d 20 64 6f 65 73  file system does
25cc0 20 6e 6f 74 20 61 6c 77 61 79 73 20 70 72 6f 76   not always prov
25cd0 69 64 65 20 70 6f 77 65 72 73 61 66 65 20 6f 76  ide powersafe ov
25ce0 65 72 77 72 69 74 65 73 2e 20 20 28 49 6e 20 6f  erwrites.  (In o
25cf0 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61  ther.** words, a
25d00 66 74 65 72 20 61 20 70 6f 77 65 72 2d 6c 6f 73  fter a power-los
25d10 73 20 65 76 65 6e 74 2c 20 70 61 72 74 73 20 6f  s event, parts o
25d20 66 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20  f the file that 
25d30 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20 77 72  were never.** wr
25d40 69 74 74 65 6e 20 6d 69 67 68 74 20 65 6e 64 20  itten might end 
25d50 75 70 20 62 65 69 6e 67 20 61 6c 74 65 72 65 64  up being altered
25d60 2e 29 20 20 48 6f 77 65 76 65 72 2c 20 6e 6f 6e  .)  However, non
25d70 2d 50 53 4f 57 20 62 65 68 61 76 69 6f 72 20 69  -PSOW behavior i
25d80 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72 79 20  s very,.** very 
25d90 72 61 72 65 2e 20 20 41 6e 64 20 61 73 73 65 72  rare.  And asser
25da0 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65 73 20  ting PSOW makes 
25db0 61 20 6c 61 72 67 65 20 72 65 64 75 63 74 69 6f  a large reductio
25dc0 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a  n in the amount.
25dd0 2a 2a 20 6f 66 20 72 65 71 75 69 72 65 64 20 49  ** of required I
25de0 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e  /O for journalin
25df0 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74 20 6f  g, since a lot o
25e00 66 20 70 61 64 64 69 6e 67 20 69 73 20 65 6c 69  f padding is eli
25e10 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48 65 6e  minated..**  Hen
25e20 63 65 2c 20 77 68 69 6c 65 20 50 4f 57 45 52 53  ce, while POWERS
25e30 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 69 73  AFE_OVERWRITE is
25e40 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 2c 20   on by default, 
25e50 74 68 65 72 65 20 69 73 20 61 20 66 69 6c 65 2d  there is a file-
25e60 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c  control.** avail
25e70 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20  able to turn it 
25e80 6f 66 66 20 61 6e 64 20 55 52 49 20 71 75 65 72  off and URI quer
25e90 79 20 70 61 72 61 6d 65 74 65 72 20 61 76 61 69  y parameter avai
25ea0 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74  lable to turn it
25eb0 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   off..*/.static 
25ec0 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68  int unixDeviceCh
25ed0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
25ee0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
25ef0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d  .  unixFile *p =
25f00 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
25f10 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69    int rc = 0;.#i
25f20 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a  fdef __QNXNTO__.
25f30 20 20 69 66 28 20 70 2d 3e 73 65 63 74 6f 72 53    if( p->sectorS
25f40 69 7a 65 3d 3d 30 20 29 20 75 6e 69 78 53 65 63  ize==0 ) unixSec
25f50 74 6f 72 53 69 7a 65 28 69 64 29 3b 0a 20 20 72  torSize(id);.  r
25f60 63 20 3d 20 70 2d 3e 64 65 76 69 63 65 43 68 61  c = p->deviceCha
25f70 72 61 63 74 65 72 69 73 74 69 63 73 3b 0a 23 65  racteristics;.#e
25f80 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 63 74  ndif.  if( p->ct
25f90 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
25fa0 4c 45 5f 50 53 4f 57 20 29 7b 0a 20 20 20 20 72  LE_PSOW ){.    r
25fb0 63 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41  c |= SQLITE_IOCA
25fc0 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
25fd0 57 52 49 54 45 3b 0a 20 20 7d 0a 20 20 72 65 74  WRITE;.  }.  ret
25fe0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21  urn rc;.}..#if !
25ff0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
26000 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
26010 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
26020 3e 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  >0../*.** Return
26030 20 74 68 65 20 73 79 73 74 65 6d 20 70 61 67 65   the system page
26040 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   size..**.** Thi
26050 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
26060 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20  d not be called 
26070 64 69 72 65 63 74 6c 79 20 62 79 20 6f 74 68 65  directly by othe
26080 72 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66  r code in this f
26090 69 6c 65 2e 20 0a 2a 2a 20 49 6e 73 74 65 61 64  ile. .** Instead
260a0 2c 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 63  , it should be c
260b0 61 6c 6c 65 64 20 76 69 61 20 6d 61 63 72 6f 20  alled via macro 
260c0 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 2e  osGetpagesize().
260d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
260e0 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65 28 76  nixGetpagesize(v
260f0 6f 69 64 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  oid){.#if OS_VXW
26100 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 31 30  ORKS.  return 10
26110 32 34 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  24;.#elif define
26120 64 28 5f 42 53 44 5f 53 4f 55 52 43 45 29 0a 20  d(_BSD_SOURCE). 
26130 20 72 65 74 75 72 6e 20 67 65 74 70 61 67 65 73   return getpages
26140 69 7a 65 28 29 3b 0a 23 65 6c 73 65 0a 20 20 72  ize();.#else.  r
26150 65 74 75 72 6e 20 28 69 6e 74 29 73 79 73 63 6f  eturn (int)sysco
26160 6e 66 28 5f 53 43 5f 50 41 47 45 53 49 5a 45 29  nf(_SC_PAGESIZE)
26170 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 65 6e 64  ;.#endif.}..#end
26180 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
26190 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20  QLITE_OMIT_WAL) 
261a0 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  || SQLITE_MAX_MM
261b0 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 23 69  AP_SIZE>0 */..#i
261c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
261d0 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  T_WAL../*.** Obj
261e0 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72  ect used to repr
261f0 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20  esent an shared 
26200 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20  memory buffer.  
26210 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74  .**.** When mult
26220 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
26230 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
26240 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65  ame wal-index, e
26250 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61  ach thread.** ha
26260 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68  s its own unixSh
26270 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68  m object, but th
26280 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20  ey all point to 
26290 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63  a single instanc
262a0 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69  e.** of this uni
262b0 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e  xShmNode object.
262c0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
262d0 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78  , each wal-index
262e0 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e   is opened.** on
262f0 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63  ly once per proc
26300 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ess..**.** Each 
26310 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
26320 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20  ct is connected 
26330 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78  to a single unix
26340 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
26350 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f  ..** We could co
26360 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65  alesce this obje
26370 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64  ct into unixInod
26380 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20  eInfo, but that 
26390 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76  would mean.** ev
263a0 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68  ery open file th
263b0 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
263c0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69  shared memory (i
263d0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
263e0 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65  ost.** open file
263f0 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f  s) would have to
26400 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68   carry around th
26410 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  is extra informa
26420 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65  tion.  So.** the
26430 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
26440 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61  bject contains a
26450 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
26460 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
26470 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75  ect.** and the u
26480 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
26490 74 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c  t is created onl
264a0 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a  y when needed..*
264b0 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65  *.** unixMutexHe
264c0 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
264d0 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
264e0 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
264f0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
26500 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
26510 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
26520 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
26530 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
26540 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
26550 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  ng fields are re
26560 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ad-only after th
26570 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
26580 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20  ted:.** .**     
26590 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
265a0 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
265b0 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e  her unixShmNode.
265c0 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
265d0 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64  ld or unixShmNod
265e0 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a  e.nRef==0 and.**
265f0 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
26600 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
26610 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
26620 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
26630 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
26640 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  cture..*/.struct
26650 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20   unixShmNode {. 
26660 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
26670 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75  pInode;     /* u
26680 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61  nixInodeInfo tha
26690 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20  t owns this SHM 
266a0 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  node */.  sqlite
266b0 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20  3_mutex *mutex; 
266c0 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f       /* Mutex to
266d0 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a   access this obj
266e0 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ect */.  char *z
266f0 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
26700 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
26710 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20  he mmapped file 
26720 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20  */.  int h;     
26730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26740 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
26750 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  criptor */.  int
26760 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20   szRegion;      
26770 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
26780 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
26790 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31   regions */.  u1
267a0 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  6 nRegion;      
267b0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
267c0 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69   of array apRegi
267d0 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52 65 61  on */.  u8 isRea
267e0 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  donly;          
267f0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
26800 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68 61  ad-only */.  cha
26810 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20  r **apRegion;   
26820 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
26830 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72 65   of mapped share
26840 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
26850 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
26860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26870 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
26880 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  ixShm objects po
26890 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
268a0 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69  /.  unixShm *pFi
268b0 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rst;           /
268c0 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62  * All unixShm ob
268d0 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
268e0 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66  o this */.#ifdef
268f0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
26900 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  u8 exclMask;    
26910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
26920 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
26930 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
26940 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20  u8 sharedMask;  
26950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
26960 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
26970 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20  ks held */.  u8 
26980 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20  nextShmId;      
26990 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
269a0 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68  available unixSh
269b0 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65  m.id value */.#e
269c0 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53  ndif.};../*.** S
269d0 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e  tructure used in
269e0 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73  ternally by this
269f0 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74   VFS to record t
26a00 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a  he state of an.*
26a10 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65  * open shared me
26a20 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  mory connection.
26a30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
26a40 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
26a50 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
26a60 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
26a70 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61  created and.** a
26a80 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65  re read-only the
26a90 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20  reafter:.**.**  
26aa0 20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a    unixShm.pFile.
26ab0 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64  **    unixShm.id
26ac0 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72  .**.** All other
26ad0 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
26ae0 2f 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e 69  /write.  The uni
26af0 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65  xShm.pFile->mute
26b00 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  x must be held.*
26b10 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e  * while accessin
26b20 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65  g any read/write
26b30 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75   fields..*/.stru
26b40 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75  ct unixShm {.  u
26b50 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
26b60 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68 65  Node;     /* The
26b70 20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69 78   underlying unix
26b80 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a  ShmNode object *
26b90 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65  /.  unixShm *pNe
26ba0 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  xt;            /
26bb0 2a 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20 77  * Next unixShm w
26bc0 69 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e 69  ith the same uni
26bd0 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38  xShmNode */.  u8
26be0 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20   hasMutex;      
26bf0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
26c00 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   if holding the 
26c10 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65  unixShmNode mute
26c20 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20 20  x */.  u8 id;   
26c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c40 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20    /* Id of this 
26c50 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 69  connection withi
26c60 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64  n its unixShmNod
26c70 65 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65  e */.  u16 share
26c80 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  dMask;          
26c90 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61    /* Mask of sha
26ca0 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  red locks held *
26cb0 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b  /.  u16 exclMask
26cc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
26cd0 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73  * Mask of exclus
26ce0 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  ive locks held *
26cf0 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  /.};../*.** Cons
26d00 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c  tants used for l
26d10 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e  ocking.*/.#defin
26d20 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20  e UNIX_SHM_BASE 
26d30 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48    ((22+SQLITE_SH
26d40 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20  M_NLOCK)*4)     
26d50 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63      /* first loc
26d60 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e  k byte */.#defin
26d70 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20  e UNIX_SHM_DMS  
26d80 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45    (UNIX_SHM_BASE
26d90 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
26da0 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73  K)  /* deadman s
26db0 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  witch */../*.** 
26dc0 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69  Apply posix advi
26dd0 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61  sory locks for a
26de0 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66  ll bytes from of
26df0 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b  st through ofst+
26e00 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73  n-1..**.** Locks
26e10 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61   block if the ma
26e20 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e  sk is exactly UN
26e30 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65  IX_SHM_C and are
26e40 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a   non-blocking.**
26e50 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
26e60 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
26e70 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75  mSystemLock(.  u
26e80 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
26e90 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f        /* Open co
26ea0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nnection to the 
26eb0 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  WAL file */.  in
26ec0 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20  t lockType,     
26ed0 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c       /* F_UNLCK,
26ee0 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57   F_RDLCK, or F_W
26ef0 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  RLCK */.  int of
26f00 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
26f10 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
26f20 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61  f the locking ra
26f30 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20  nge */.  int n  
26f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f50 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
26f60 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  es to lock */.){
26f70 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
26f80 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 41 70 70  pShmNode; /* App
26f90 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73  ly locks to this
26fa0 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d   open shared-mem
26fb0 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  ory segment */. 
26fc0 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b   struct flock f;
26fd0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
26fe0 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
26ff0 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  cking structure 
27000 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
27010 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52  LITE_OK;    /* R
27020 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20  esult code form 
27030 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a  fcntl() */..  /*
27040 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75   Access to the u
27050 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
27060 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20  t is serialized 
27070 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f  by the caller */
27080 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 46  .  pShmNode = pF
27090 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  ile->pInode->pSh
270a0 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  mNode;.  assert(
270b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
270c0 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  eld(pShmNode->mu
270d0 74 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65  tex) || pShmNode
270e0 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->nRef==0 );..  
270f0 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20  /* Shared locks 
27100 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20  never span more 
27110 74 68 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f  than one byte */
27120 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
27130 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52  || lockType!=F_R
27140 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  DLCK );..  /* Lo
27150 63 6b 73 20 61 72 65 20 77 69 74 68 69 6e 20 72  cks are within r
27160 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  ange */.  assert
27170 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 3d 53 51 4c  ( n>=1 && n<=SQL
27180 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b  ITE_SHM_NLOCK );
27190 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ..  if( pShmNode
271a0 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ->h>=0 ){.    /*
271b0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
271c0 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65  locking paramete
271d0 72 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  rs */.    memset
271e0 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66  (&f, 0, sizeof(f
271f0 29 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65  ));.    f.l_type
27200 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20   = lockType;.   
27210 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45   f.l_whence = SE
27220 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f  EK_SET;.    f.l_
27230 73 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20  start = ofst;.  
27240 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a    f.l_len = n;..
27250 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c      rc = osFcntl
27260 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f  (pShmNode->h, F_
27270 53 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20 20 20  SETLK, &f);.    
27280 72 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29 20  rc = (rc!=(-1)) 
27290 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51  ? SQLITE_OK : SQ
272a0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a  LITE_BUSY;.  }..
272b0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
272c0 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74  global lock stat
272d0 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20 74  e and do debug t
272e0 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66  racing */.#ifdef
272f0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
27300 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53  { u16 mask;.  OS
27310 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
27320 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 6f   "));.  mask = o
27330 66 73 74 3e 33 31 20 3f 20 30 78 66 66 66 66 20  fst>31 ? 0xffff 
27340 3a 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20  : (1<<(ofst+n)) 
27350 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69  - (1<<ofst);.  i
27360 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27370 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b   ){.    if( lock
27380 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  Type==F_UNLCK ){
27390 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
273a0 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20  "unlock %d ok", 
273b0 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53  ofst));.      pS
273c0 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
273d0 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
273e0 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
273f0 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
27400 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f      }else if( lo
27410 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  ckType==F_RDLCK 
27420 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
27430 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20  (("read-lock %d 
27440 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
27450 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
27460 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
27470 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
27480 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61  sharedMask |= ma
27490 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  sk;.    }else{. 
274a0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63       assert( loc
274b0 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  kType==F_WRLCK )
274c0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
274d0 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20  ("write-lock %d 
274e0 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
274f0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
27500 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
27510 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
27520 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61  haredMask &= ~ma
27530 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  sk;.    }.  }els
27540 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54  e{.    if( lockT
27550 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
27560 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
27570 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64  unlock %d failed
27580 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d  ", ofst));.    }
27590 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70  else if( lockTyp
275a0 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
275b0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65      OSTRACE(("re
275c0 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29  ad-lock failed")
275d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
275e0 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
275f0 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b  Type==F_WRLCK );
27600 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
27610 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66  "write-lock %d f
27620 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a  ailed", ofst));.
27630 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52      }.  }.  OSTR
27640 41 43 45 28 28 22 20 2d 20 61 66 74 65 72 77 61  ACE((" - afterwa
27650 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e 22  rds %03x,%03x\n"
27660 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 68  ,.           pSh
27670 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
27680 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63  k, pShmNode->exc
27690 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e  lMask));.  }.#en
276a0 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
276b0 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a  ;        .}../*.
276c0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 69  ** Return the mi
276d0 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  nimum number of 
276e0 33 32 4b 42 20 73 68 6d 20 72 65 67 69 6f 6e 73  32KB shm regions
276f0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
27700 6d 61 70 70 65 64 20 61 74 0a 2a 2a 20 61 20 74  mapped at.** a t
27710 69 6d 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  ime, assuming th
27720 61 74 20 65 61 63 68 20 6d 61 70 70 69 6e 67 20  at each mapping 
27730 6d 75 73 74 20 62 65 20 61 6e 20 69 6e 74 65 67  must be an integ
27740 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74  er multiple of t
27750 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 73 79  he.** current sy
27760 73 74 65 6d 20 70 61 67 65 2d 73 69 7a 65 2e 0a  stem page-size..
27770 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74  **.** Usually, t
27780 68 69 73 20 69 73 20 31 2e 20 54 68 65 20 65 78  his is 1. The ex
27790 63 65 70 74 69 6f 6e 20 73 65 65 6d 73 20 74 6f  ception seems to
277a0 20 62 65 20 73 79 73 74 65 6d 73 20 74 68 61 74   be systems that
277b0 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64 0a   are configured.
277c0 2a 2a 20 74 6f 20 75 73 65 20 36 34 4b 42 20 70  ** to use 64KB p
277d0 61 67 65 73 20 2d 20 69 6e 20 74 68 69 73 20 63  ages - in this c
277e0 61 73 65 20 65 61 63 68 20 6d 61 70 70 69 6e 67  ase each mapping
277f0 20 6d 75 73 74 20 63 6f 76 65 72 20 61 74 20 6c   must cover at l
27800 65 61 73 74 20 74 77 6f 0a 2a 2a 20 73 68 6d 20  east two.** shm 
27810 72 65 67 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74  regions..*/.stat
27820 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 52 65  ic int unixShmRe
27830 67 69 6f 6e 50 65 72 4d 61 70 28 76 6f 69 64 29  gionPerMap(void)
27840 7b 0a 20 20 69 6e 74 20 73 68 6d 73 7a 20 3d 20  {.  int shmsz = 
27850 33 32 2a 31 30 32 34 3b 20 20 20 20 20 20 20 20  32*1024;        
27860 20 20 20 20 2f 2a 20 53 48 4d 20 72 65 67 69 6f      /* SHM regio
27870 6e 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20  n size */.  int 
27880 70 67 73 7a 20 3d 20 6f 73 47 65 74 70 61 67 65  pgsz = osGetpage
27890 73 69 7a 65 28 29 3b 20 20 20 2f 2a 20 53 79 73  size();   /* Sys
278a0 74 65 6d 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  tem page size */
278b0 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 67 73  .  assert( ((pgs
278c0 7a 2d 31 29 26 70 67 73 7a 29 3d 3d 30 20 29 3b  z-1)&pgsz)==0 );
278d0 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
278e0 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  must be a power 
278f0 6f 66 20 32 20 2a 2f 0a 20 20 69 66 28 20 70 67  of 2 */.  if( pg
27900 73 7a 3c 73 68 6d 73 7a 20 29 20 72 65 74 75 72  sz<shmsz ) retur
27910 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 67  n 1;.  return pg
27920 73 7a 2f 73 68 6d 73 7a 3b 0a 7d 0a 0a 2f 2a 0a  sz/shmsz;.}../*.
27930 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e 69  ** Purge the uni
27940 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73  xShmNodeList lis
27950 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73  t of all entries
27960 20 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64   with unixShmNod
27970 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a  e.nRef==0..**.**
27980 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56   This is not a V
27990 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
279a0 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61   method; it is a
279b0 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f   utility functio
279c0 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56  n called.** by V
279d0 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
279e0 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61   methods..*/.sta
279f0 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d  tic void unixShm
27a00 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20 2a  Purge(unixFile *
27a10 70 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e  pFd){.  unixShmN
27a20 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49  ode *p = pFd->pI
27a30 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a  node->pShmNode;.
27a40 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
27a50 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69  texHeld() );.  i
27a60 66 28 20 70 20 26 26 20 41 4c 57 41 59 53 28 70  f( p && ALWAYS(p
27a70 2d 3e 6e 52 65 66 3d 3d 30 29 20 29 7b 0a 20 20  ->nRef==0) ){.  
27a80 20 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d 61 70    int nShmPerMap
27a90 20 3d 20 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e   = unixShmRegion
27aa0 50 65 72 4d 61 70 28 29 3b 0a 20 20 20 20 69 6e  PerMap();.    in
27ab0 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t i;.    assert(
27ac0 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d   p->pInode==pFd-
27ad0 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 73  >pInode );.    s
27ae0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
27af0 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  e(p->mutex);.   
27b00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
27b10 52 65 67 69 6f 6e 3b 20 69 2b 3d 6e 53 68 6d 50  Region; i+=nShmP
27b20 65 72 4d 61 70 29 7b 0a 20 20 20 20 20 20 69 66  erMap){.      if
27b30 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ( p->h>=0 ){.   
27b40 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 2d       osMunmap(p-
27b50 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d  >apRegion[i], p-
27b60 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  >szRegion);.    
27b70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27b80 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
27b90 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20  >apRegion[i]);. 
27ba0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
27bb0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
27bc0 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  >apRegion);.    
27bd0 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20  if( p->h>=0 ){. 
27be0 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
27bf0 65 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c  e(pFd, p->h, __L
27c00 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d  INE__);.      p-
27c10 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  >h = -1;.    }. 
27c20 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53     p->pInode->pS
27c30 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  hmNode = 0;.    
27c40 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
27c50 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69  .  }.}..#if defi
27c60 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
27c70 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
27c80 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74  LOCKING_STYLE.st
27c90 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
27ca0 2a 70 72 6f 78 79 53 68 61 72 65 64 4d 65 6d 6f  *proxySharedMemo
27cb0 72 79 42 61 73 65 50 61 74 68 28 75 6e 69 78 46  ryBasePath(unixF
27cc0 69 6c 65 20 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a  ile *);.#endif..
27cd0 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61  /*.** Open a sha
27ce0 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20  red-memory area 
27cf0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
27d00 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
27d10 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54  le pDbFd.  .** T
27d20 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 69  his particular i
27d30 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73  mplementation us
27d40 65 73 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73  es mmapped files
27d50 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ..**.** The file
27d60 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
27d70 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  nt shared-memory
27d80 20 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20   is in the same 
27d90 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20  directory.** as 
27da0 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
27db0 65 20 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74  e file and has t
27dc0 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
27dd0 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
27de0 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74  e.** file with t
27df0 68 65 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78  he "-shm" suffix
27e00 20 61 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61   added.  For exa
27e10 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74  mple, if the dat
27e20 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73  abase file.** is
27e30 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f   "/home/user1/co
27e40 6e 66 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68  nfig.db" then th
27e50 65 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 63  e file that is c
27e60 72 65 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70  reated and mmapp
27e70 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64  ed.** for shared
27e80 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
27e90 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73  called "/home/us
27ea0 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68  er1/config.db-sh
27eb0 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74  m".  .**.** Anot
27ec0 68 65 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20  her approach to 
27ed0 69 73 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20  is to use files 
27ee0 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f  in /dev/shm or /
27ef0 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a  dev/tmp or an.**
27f00 20 73 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66   some other tmpf
27f10 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20  s mount. But if 
27f20 61 20 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66  a file in a diff
27f30 65 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a  erent directory.
27f40 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ** from the data
27f50 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 73 65  base file is use
27f60 64 2c 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e  d, then differin
27f70 67 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  g access permiss
27f80 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72  ions.** or a chr
27f90 6f 6f 74 28 29 20 6d 69 67 68 74 20 63 61 75 73  oot() might caus
27fa0 65 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20  e two different 
27fb0 70 72 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65  processes on the
27fc0 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73   same.** databas
27fd0 65 20 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e  e to end up usin
27fe0 67 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  g different file
27ff0 73 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d  s for shared mem
28000 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e  ory - .** meanin
28010 67 20 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d  g that their mem
28020 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65  ory would not re
28030 61 6c 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d  ally be shared -
28040 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e   resulting.** in
28050 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
28060 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c  tion.  Neverthel
28070 65 73 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20  ess, this tmpfs 
28080 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61  file usage.** ca
28090 6e 20 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20  n be enabled at 
280a0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69  compile-time usi
280b0 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f  ng -DSQLITE_SHM_
280c0 44 49 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f  DIRECTORY="/dev/
280d0 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65  shm".** or the e
280e0 71 75 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20  quivalent.  The 
280f0 75 73 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  use of the SQLIT
28100 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
28110 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20  compile-time.** 
28120 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69  option results i
28130 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n an incompatibl
28140 65 20 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74  e build of SQLit
28150 65 3b 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51  e;  builds of SQ
28160 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74  Lite.** that wit
28170 68 20 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49  h differing SQLI
28180 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
28190 20 73 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70   settings attemp
281a0 74 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20  t to use the.** 
281b0 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
281c0 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
281d0 69 6d 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f  ime, database co
281e0 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69  rruption will li
281f0 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20  kely.** result. 
28200 54 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  The SQLITE_SHM_D
28210 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65  IRECTORY compile
28220 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
28230 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75  considered.** "u
28240 6e 73 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20  nsupported" and 
28250 6d 61 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61  may go away in a
28260 20 66 75 74 75 72 65 20 53 51 4c 69 74 65 20 72   future SQLite r
28270 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68  elease..**.** Wh
28280 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77  en opening a new
28290 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
282a0 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72  ile, if no other
282b0 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
282c0 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63  at.** file are c
282d0 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69  urrently open, i
282e0 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  n this process o
282f0 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65  r in other proce
28300 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  sses, then.** th
28310 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74  e file must be t
28320 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
28330 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20   length or have 
28340 69 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72  its header clear
28350 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
28360 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
28370 73 65 20 66 69 6c 65 20 28 70 44 62 46 64 29 20  se file (pDbFd) 
28380 69 73 20 75 73 69 6e 67 20 74 68 65 20 22 75 6e  is using the "un
28390 69 78 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20  ix-excl" VFS.** 
283a0 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
283b0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
283c0 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  k is held on the
283d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
283e0 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74  nd.** that no ot
283f0 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 72  her processes ar
28400 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6f  e able to read o
28410 72 20 77 72 69 74 65 20 74 68 65 20 64 61 74 61  r write the data
28420 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61  base.  In.** tha
28430 74 20 63 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f  t case, we do no
28440 74 20 72 65 61 6c 6c 79 20 6e 65 65 64 20 73 68  t really need sh
28450 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f  ared memory.  No
28460 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a   shared memory.*
28470 2a 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  * file is create
28480 64 2e 20 20 54 68 65 20 73 68 61 72 65 64 20 6d  d.  The shared m
28490 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 73 69  emory will be si
284a0 6d 75 6c 61 74 65 64 20 77 69 74 68 20 68 65 61  mulated with hea
284b0 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  p memory..*/.sta
284c0 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e  tic int unixOpen
284d0 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69  SharedMemory(uni
284e0 78 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20  xFile *pDbFd){. 
284f0 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20   struct unixShm 
28500 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  *p = 0;         
28510 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
28520 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  on to be opened 
28530 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
28540 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
28550 65 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  e;   /* The unde
28560 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66  rlying mmapped f
28570 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ile */.  int rc;
28580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28590 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
285a0 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69  lt code */.  uni
285b0 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
285c0 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  de;          /* 
285d0 54 68 65 20 69 6e 6f 64 65 20 6f 66 20 66 64 20  The inode of fd 
285e0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d 46  */.  char *zShmF
285f0 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
28600 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
28610 74 68 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  the file used fo
28620 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e  r SHM */.  int n
28630 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20  ShmFilename;    
28640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
28650 7a 65 20 6f 66 20 74 68 65 20 53 48 4d 20 66 69  ze of the SHM fi
28660 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20  lename in bytes 
28670 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
28680 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
28690 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65  new unixShm obje
286a0 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  ct. */.  p = sql
286b0 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73  ite3_malloc64( s
286c0 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
286d0 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
286e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
286f0 50 54 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  PT;.  memset(p, 
28700 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
28710 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d    assert( pDbFd-
28720 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >pShm==0 );..  /
28730 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
28740 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  f a unixShmNode 
28750 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65  object already e
28760 78 69 73 74 73 2e 20 52 65 75 73 65 20 61 6e 20  xists. Reuse an 
28770 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e  existing.  ** on
28780 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20 43 72  e if present. Cr
28790 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
287a0 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  f necessary..  *
287b0 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
287c0 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
287d0 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a   pDbFd->pInode;.
287e0 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e    pShmNode = pIn
287f0 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode->pShmNode;. 
28800 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30   if( pShmNode==0
28810 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
28820 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
28830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 73             /* fs
28840 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72 20 64  tat() info for d
28850 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
28860 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53  #ifndef SQLITE_S
28870 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20  HM_DIRECTORY.   
28880 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61   const char *zBa
28890 73 65 50 61 74 68 20 3d 20 70 44 62 46 64 2d 3e  sePath = pDbFd->
288a0 7a 50 61 74 68 3b 0a 23 65 6e 64 69 66 0a 0a 20  zPath;.#endif.. 
288b0 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61 74     /* Call fstat
288c0 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74  () to figure out
288d0 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73   the permissions
288e0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
288f0 20 66 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a 2a   file. If.    **
28900 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69 6c   a new *-shm fil
28910 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 61 6e  e is created, an
28920 20 61 74 74 65 6d 70 74 20 77 69 6c 6c 20 62 65   attempt will be
28930 20 6d 61 64 65 20 74 6f 20 63 72 65 61 74 65 20   made to create 
28940 69 74 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74  it.    ** with t
28950 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69  he same permissi
28960 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ons..    */.    
28970 69 66 28 20 6f 73 46 73 74 61 74 28 70 44 62 46  if( osFstat(pDbF
28980 64 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b  d->h, &sStat) ){
28990 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
289a0 45 72 72 6e 6f 28 70 44 62 46 64 2c 20 65 72 72  Errno(pDbFd, err
289b0 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  no);.      rc = 
289c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
289d0 41 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  AT;.      goto s
289e0 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
289f0 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28   }..#if defined(
28a00 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
28a10 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
28a20 49 4e 47 5f 53 54 59 4c 45 20 5c 0a 20 20 20 20  ING_STYLE \.    
28a30 20 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51    && !defined(SQ
28a40 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
28a50 52 59 29 0a 20 20 20 20 2f 2a 20 49 66 20 70 44  RY).    /* If pD
28a60 62 46 64 20 69 73 20 63 6f 6e 66 69 67 75 72 65  bFd is configure
28a70 64 20 77 69 74 68 20 70 72 6f 78 79 20 6c 6f 63  d with proxy loc
28a80 6b 69 6e 67 20 6d 6f 64 65 2c 20 75 73 65 20 74  king mode, use t
28a90 68 65 20 6c 6f 63 61 6c 20 0a 20 20 20 20 2a 2a  he local .    **
28aa0 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20   lock file path 
28ab0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
28ac0 20 2d 73 68 6d 20 66 69 6c 65 20 70 61 74 68 0a   -shm file path.
28ad0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
28ae0 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64  sProxyLockingMod
28af0 65 28 70 44 62 46 64 29 20 29 7b 0a 20 20 20 20  e(pDbFd) ){.    
28b00 20 20 7a 42 61 73 65 50 61 74 68 20 3d 20 70 72    zBasePath = pr
28b10 6f 78 79 53 68 61 72 65 64 4d 65 6d 6f 72 79 42  oxySharedMemoryB
28b20 61 73 65 50 61 74 68 28 70 44 62 46 64 29 3b 0a  asePath(pDbFd);.
28b30 20 20 20 20 20 20 69 66 28 20 21 7a 42 61 73 65        if( !zBase
28b40 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
28b50 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
28b60 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OPEN_BKPT;.     
28b70 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
28b80 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
28b90 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a    }.#endif.    .
28ba0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48  #ifdef SQLITE_SH
28bb0 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20  M_DIRECTORY.    
28bc0 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73  nShmFilename = s
28bd0 69 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d  izeof(SQLITE_SHM
28be0 5f 44 49 52 45 43 54 4f 52 59 29 20 2b 20 33 31  _DIRECTORY) + 31
28bf0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d  ;.#else.    nShm
28c00 46 69 6c 65 6e 61 6d 65 20 3d 20 36 20 2b 20 28  Filename = 6 + (
28c10 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 61 73 65  int)strlen(zBase
28c20 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Path);.#endif.  
28c30 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c    pShmNode = sql
28c40 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73  ite3_malloc64( s
28c50 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29  izeof(*pShmNode)
28c60 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20   + nShmFilename 
28c70 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  );.    if( pShmN
28c80 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
28c90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
28ca0 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  M_BKPT;.      go
28cb0 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
28cc0 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
28cd0 74 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73  t(pShmNode, 0, s
28ce0 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29  izeof(*pShmNode)
28cf0 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a  +nShmFilename);.
28d00 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65      zShmFilename
28d10 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69   = pShmNode->zFi
28d20 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
28d30 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69  &pShmNode[1];.#i
28d40 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f  fdef SQLITE_SHM_
28d50 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71  DIRECTORY.    sq
28d60 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
28d70 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68  ShmFilename, zSh
28d80 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20  mFilename, .    
28d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28da0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
28db0 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d 73  CTORY "/sqlite-s
28dc0 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20 20  hm-%x-%x",.     
28dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28de0 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 69 6e  (u32)sStat.st_in
28df0 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e 73 74  o, (u32)sStat.st
28e00 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20  _dev);.#else.   
28e10 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
28e20 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  f(nShmFilename, 
28e30 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25  zShmFilename, "%
28e40 73 2d 73 68 6d 22 2c 20 7a 42 61 73 65 50 61 74  s-shm", zBasePat
28e50 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  h);.    sqlite3F
28e60 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46 64  ileSuffix3(pDbFd
28e70 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 46 69 6c  ->zPath, zShmFil
28e80 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20  ename);.#endif. 
28e90 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d     pShmNode->h =
28ea0 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e   -1;.    pDbFd->
28eb0 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
28ec0 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20   = pShmNode;.   
28ed0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
28ee0 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64  e = pDbFd->pInod
28ef0 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
28f00 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
28f10 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20  CoreMutex ){.   
28f20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74     pShmNode->mut
28f30 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex = sqlite3_mut
28f40 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
28f50 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
28f60 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
28f70 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
28f80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
28f90 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
28fa0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
28fb0 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  en_err;.      }.
28fc0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
28fd0 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
28fe0 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
28ff0 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20  int openFlags = 
29000 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54  O_RDWR | O_CREAT
29010 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 64 3b 20  ;.      int fd; 
29020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29030 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
29040 72 69 70 74 6f 72 20 66 6f 72 20 2a 2d 73 68 6d  riptor for *-shm
29050 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69   file */.      i
29060 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62  f( sqlite3_uri_b
29070 6f 6f 6c 65 61 6e 28 70 44 62 46 64 2d 3e 7a 50  oolean(pDbFd->zP
29080 61 74 68 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73  ath, "readonly_s
29090 68 6d 22 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  hm", 0) ){.     
290a0 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f     openFlags = O
290b0 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20  _RDONLY;.       
290c0 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61   pShmNode->isRea
290d0 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20  donly = 1;.     
290e0 20 7d 0a 20 20 20 20 20 20 66 64 20 3d 20 72 6f   }.      fd = ro
290f0 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69  bust_open(zShmFi
29100 6c 65 6e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67  lename, openFlag
29110 73 2c 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64  s, (sStat.st_mod
29120 65 26 30 37 37 37 29 29 3b 0a 0a 20 20 20 20 20  e&0777));..     
29130 20 2f 2a 20 49 66 20 69 74 20 77 61 73 20 6e 6f   /* If it was no
29140 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70  t possible to op
29150 65 6e 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c  en the *-shm fil
29160 65 20 69 6e 20 72 65 61 64 2f 77 72 69 74 65 20  e in read/write 
29170 6d 6f 64 65 2c 0a 20 20 20 20 20 20 2a 2a 20 61  mode,.      ** a
29180 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
29190 66 69 6c 65 20 69 74 73 65 6c 66 20 68 61 73 20  file itself has 
291a0 62 65 65 6e 20 6f 70 65 6e 65 64 20 69 6e 20 72  been opened in r
291b0 65 61 64 2d 6f 6e 6c 79 20 6d 6f 64 65 2c 0a 20  ead-only mode,. 
291c0 20 20 20 20 20 2a 2a 20 74 72 79 20 74 6f 20 6f       ** try to o
291d0 70 65 6e 20 74 68 65 20 2a 2d 73 68 6d 20 66 69  pen the *-shm fi
291e0 6c 65 20 69 6e 20 72 65 61 64 2d 6f 6e 6c 79 20  le in read-only 
291f0 6d 6f 64 65 20 61 73 20 77 65 6c 6c 2e 20 45 76  mode as well. Ev
29200 65 6e 20 69 66 20 74 68 65 0a 20 20 20 20 20 20  en if the.      
29210 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
29220 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 2d 6f  ection is read-o
29230 6e 6c 79 2c 20 69 74 20 69 73 20 73 74 69 6c 6c  nly, it is still
29240 20 62 65 74 74 65 72 20 74 6f 20 74 72 79 20 6f   better to try o
29250 70 65 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  pening.      ** 
29260 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c 65 20 69  the *-shm file i
29270 6e 20 72 65 61 64 2f 77 72 69 74 65 20 6d 6f 64  n read/write mod
29280 65 20 66 69 72 73 74 2c 20 61 73 20 74 68 65 20  e first, as the 
29290 73 61 6d 65 20 66 69 6c 65 20 64 65 73 63 72 69  same file descri
292a0 70 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20 6d 61  ptor.      ** ma
292b0 79 20 62 65 20 61 6c 73 6f 20 62 65 20 75 73 65  y be also be use
292c0 64 20 62 79 20 61 20 72 65 61 64 2f 77 72 69 74  d by a read/writ
292d0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
292e0 63 74 69 6f 6e 2e 20 20 2a 2f 0a 23 69 66 20 64  ction.  */.#if d
292f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
29300 41 42 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c  ABLE_PERSIST_WAL
29310 29 26 26 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  )&&(SQLITE_ENABL
29320 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
29330 5c 0a 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64  \.    || defined
29340 28 5f 5f 41 50 50 4c 45 5f 5f 29 29 0a 20 20 20  (__APPLE__)).   
29350 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65     if( fd<0 && e
29360 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26 20  rrno!=EISDIR && 
29370 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64  pShmNode->isRead
29380 6f 6e 6c 79 3d 3d 30 20 0a 20 20 20 20 20 20 20  only==0 .       
29390 26 26 20 28 70 44 62 46 64 2d 3e 6f 70 65 6e 46  && (pDbFd->openF
293a0 6c 61 67 73 20 26 20 4f 5f 52 44 57 52 29 21 3d  lags & O_RDWR)!=
293b0 4f 5f 52 44 57 52 0a 20 20 20 20 20 20 29 7b 0a  O_RDWR.      ){.
293c0 20 20 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62          fd = rob
293d0 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 6c  ust_open(zShmFil
293e0 65 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 2c  ename, O_RDONLY,
293f0 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 26   (sStat.st_mode&
29400 30 37 37 37 29 29 3b 0a 20 20 20 20 20 20 20 20  0777));.        
29410 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64  pShmNode->isRead
29420 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  only = 1;.      
29430 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
29440 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20  f( fd<0 ){.     
29450 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
29460 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
29470 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e  OPEN_BKPT, "open
29480 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29  ", zShmFilename)
29490 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
294a0 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
294b0 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e     }.      pShmN
294c0 6f 64 65 2d 3e 68 20 3d 20 66 64 3b 0a 0a 20 20  ode->h = fd;..  
294d0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70      /* If this p
294e0 72 6f 63 65 73 73 20 69 73 20 72 75 6e 6e 69 6e  rocess is runnin
294f0 67 20 61 73 20 72 6f 6f 74 2c 20 6d 61 6b 65 20  g as root, make 
29500 73 75 72 65 20 74 68 61 74 20 74 68 65 20 53 48  sure that the SH
29510 4d 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  M file.      ** 
29520 69 73 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20  is owned by the 
29530 73 61 6d 65 20 75 73 65 72 20 74 68 61 74 20 6f  same user that o
29540 77 6e 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  wns the original
29550 20 64 61 74 61 62 61 73 65 2e 20 20 4f 74 68 65   database.  Othe
29560 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20  rwise,.      ** 
29570 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 77 6e  the original own
29580 65 72 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  er will not be a
29590 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 2e 0a  ble to connect..
295a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
295b0 6f 62 75 73 74 46 63 68 6f 77 6e 28 70 53 68 6d  obustFchown(pShm
295c0 4e 6f 64 65 2d 3e 68 2c 20 73 53 74 61 74 2e 73  Node->h, sStat.s
295d0 74 5f 75 69 64 2c 20 73 53 74 61 74 2e 73 74 5f  t_uid, sStat.st_
295e0 67 69 64 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f  gid);.  .      /
295f0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
29600 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  f another proces
29610 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  s is holding the
29620 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68   dead-man switch
29630 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 6e 6f  ..      ** If no
29640 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  t, truncate the 
29650 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  file to zero len
29660 67 74 68 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  gth. .      */. 
29670 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
29680 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 75  _OK;.      if( u
29690 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
296a0 28 70 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b 2c  (pDbFd, F_WRLCK,
296b0 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31   UNIX_SHM_DMS, 1
296c0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
296d0 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 62 75          if( robu
296e0 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68  st_ftruncate(pSh
296f0 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a  mNode->h, 0) ){.
29700 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
29710 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
29720 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
29730 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 7a  , "ftruncate", z
29740 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ShmFilename);.  
29750 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29760 20 20 20 20 20 20 20 2f 2a 20 49 66 20 72 75 6e         /* If run
29770 6e 69 6e 67 20 61 73 20 72 6f 6f 74 20 73 65 74  ning as root set
29780 20 74 68 65 20 75 69 64 2f 67 69 64 20 6f 66 20   the uid/gid of 
29790 74 68 65 20 73 68 6d 20 66 69 6c 65 20 74 6f 20  the shm file to 
297a0 6d 61 74 63 68 0a 20 20 20 20 20 20 20 20 20 20  match.          
297b0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
297c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 69 64  */.          uid
297d0 5f 74 20 65 75 69 64 20 3d 20 67 65 74 65 75 69  _t euid = geteui
297e0 64 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  d();.          i
297f0 66 28 20 28 21 70 53 68 6d 4e 6f 64 65 2d 3e 69  f( (!pShmNode->i
29800 73 52 65 61 64 6f 6e 6c 79 29 20 26 26 20 65 75  sReadonly) && eu
29810 69 64 3d 3d 30 20 26 26 20 28 65 75 69 64 21 3d  id==0 && (euid!=
29820 73 53 74 61 74 2e 73 74 5f 75 69 64 20 7c 7c 20  sStat.st_uid || 
29830 67 65 74 65 67 69 64 28 29 21 3d 73 53 74 61 74  getegid()!=sStat
29840 2e 73 74 5f 67 69 64 29 20 29 7b 0a 20 20 20 20  .st_gid) ){.    
29850 20 20 20 20 20 20 20 20 69 66 28 20 6f 73 46 63          if( osFc
29860 68 6f 77 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  hown(pShmNode->h
29870 2c 20 73 53 74 61 74 2e 73 74 5f 75 69 64 2c 20  , sStat.st_uid, 
29880 73 53 74 61 74 2e 73 74 5f 67 69 64 29 20 29 7b  sStat.st_gid) ){
29890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
298a0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
298b0 5f 53 48 4d 4f 50 45 4e 3b 0a 20 20 20 20 20 20  _SHMOPEN;.      
298c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
298d0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
298e0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
298f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
29900 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
29910 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
29920 70 44 62 46 64 2c 20 46 5f 52 44 4c 43 4b 2c 20  pDbFd, F_RDLCK, 
29930 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29  UNIX_SHM_DMS, 1)
29940 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29950 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68  if( rc ) goto sh
29960 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
29970 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  }.  }..  /* Make
29980 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74   the new connect
29990 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74  ion a child of t
299a0 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  he unixShmNode *
299b0 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20  /.  p->pShmNode 
299c0 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64  = pShmNode;.#ifd
299d0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
299e0 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f    p->id = pShmNo
299f0 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b  de->nextShmId++;
29a00 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f  .#endif.  pShmNo
29a10 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44  de->nRef++;.  pD
29a20 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20  bFd->pShm = p;. 
29a30 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
29a40 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66  );..  /* The ref
29a50 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
29a60 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72  pShmNode has alr
29a70 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d  eady been increm
29a80 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a  ented under.  **
29a90 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68   the cover of th
29aa0 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  e unixEnterMutex
29ab0 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65  () mutex and the
29ac0 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68   pointer from th
29ad0 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75  e.  ** new (stru
29ae0 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a 65  ct unixShm) obje
29af0 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f  ct to the pShmNo
29b00 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  de has been set.
29b10 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a   All that is.  *
29b20 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20  * left to do is 
29b30 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20  to link the new 
29b40 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20  object into the 
29b50 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
29b60 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68  ting.  ** at pSh
29b70 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54  mNode->pFirst. T
29b80 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65  his must be done
29b90 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74   while holding t
29ba0 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  he pShmNode->mut
29bb0 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a  ex .  ** mutex..
29bc0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d    */.  sqlite3_m
29bd0 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
29be0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  ode->mutex);.  p
29bf0 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f  ->pNext = pShmNo
29c00 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53  de->pFirst;.  pS
29c10 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d  hmNode->pFirst =
29c20 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   p;.  sqlite3_mu
29c30 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
29c40 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  de->mutex);.  re
29c50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29c60 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
29c70 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a  on any error */.
29c80 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20  shm_open_err:.  
29c90 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44 62  unixShmPurge(pDb
29ca0 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Fd);       /* Th
29cb0 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53  is call frees pS
29cc0 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72  hmNode if requir
29cd0 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
29ce0 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69 78 4c  free(p);.  unixL
29cf0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72  eaveMutex();.  r
29d00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
29d10 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
29d20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
29d30 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
29d40 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e  o region iRegion
29d50 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72   of the .** shar
29d60 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ed-memory associ
29d70 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64 61  ated with the da
29d80 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20  tabase file fd. 
29d90 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  Shared-memory re
29da0 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75  gions .** are nu
29db0 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20  mbered starting 
29dc0 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20  from zero. Each 
29dd0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
29de0 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e  gion is szRegion
29df0 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69   .** bytes in si
29e00 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ze..**.** If an 
29e10 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
29e20 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
29e30 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20  eturned and *pp 
29e40 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
29e50 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
29e60 20 69 66 20 74 68 65 20 62 45 78 74 65 6e 64 20   if the bExtend 
29e70 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 61  parameter is 0 a
29e80 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
29e90 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a   shared-memory.*
29ea0 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  * region has not
29eb0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
29ec0 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20  (by any client, 
29ed0 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75  including one ru
29ee0 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65  nning in a.** se
29ef0 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c  parate process),
29f00 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74   then *pp is set
29f10 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c   to NULL and SQL
29f20 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
29f30 20 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64 20   If .** bExtend 
29f40 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20  is non-zero and 
29f50 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68  the requested sh
29f60 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
29f70 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a  on has not yet .
29f80 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ** been allocate
29f90 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74  d, it is allocat
29fa0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
29fb0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ion..**.** If th
29fc0 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
29fd0 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  region has alrea
29fe0 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
29ff0 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  d or is allocate
2a000 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c  d by.** this cal
2a010 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  l as described a
2a020 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73  bove, then it is
2a030 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69   mapped into thi
2a040 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20  s processes .** 
2a050 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28 69  address space (i
2a060 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
2a070 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74  ady), *pp is set
2a080 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
2a090 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f   mapped .** memo
2a0a0 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ry and SQLITE_OK
2a0b0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
2a0c0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
2a0d0 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  Map(.  sqlite3_f
2a0e0 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
2a0f0 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
2a100 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73   open on databas
2a110 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
2a120 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  iRegion,        
2a130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2a140 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76  egion to retriev
2a150 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67  e */.  int szReg
2a160 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
2a170 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2a180 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69  f regions */.  i
2a190 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20 20 20  nt bExtend,     
2a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a1b0 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64  * True to extend
2a1c0 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61   file if necessa
2a1d0 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c  ry */.  void vol
2a1e0 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20  atile **pp      
2a1f0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2a200 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  Mapped memory */
2a210 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
2a220 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c  pDbFd = (unixFil
2a230 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d  e*)fd;.  unixShm
2a240 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f   *p;.  unixShmNo
2a250 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de *pShmNode;.  
2a260 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2a270 4f 4b 3b 0a 20 20 69 6e 74 20 6e 53 68 6d 50 65  OK;.  int nShmPe
2a280 72 4d 61 70 20 3d 20 75 6e 69 78 53 68 6d 52 65  rMap = unixShmRe
2a290 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b 0a 20 20  gionPerMap();.  
2a2a0 69 6e 74 20 6e 52 65 71 52 65 67 69 6f 6e 3b 0a  int nReqRegion;.
2a2b0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68 61  .  /* If the sha
2a2c0 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20  red-memory file 
2a2d0 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
2a2e0 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74   opened, open it
2a2f0 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20 70   now. */.  if( p
2a300 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 7b  DbFd->pShm==0 ){
2a310 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4f 70  .    rc = unixOp
2a320 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70  enSharedMemory(p
2a330 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72  DbFd);.    if( r
2a340 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
2a350 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2a360 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d   p = pDbFd->pShm
2a370 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  ;.  pShmNode = p
2a380 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73 71  ->pShmNode;.  sq
2a390 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
2a3a0 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
2a3b0 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a  x);.  assert( sz
2a3c0 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65  Region==pShmNode
2a3d0 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53  ->szRegion || pS
2a3e0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d  hmNode->nRegion=
2a3f0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2a400 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65  pShmNode->pInode
2a410 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20  ==pDbFd->pInode 
2a420 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
2a430 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70  mNode->h>=0 || p
2a440 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  DbFd->pInode->bP
2a450 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b  rocessLock==1 );
2a460 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
2a470 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46  ode->h<0 || pDbF
2a480 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  d->pInode->bProc
2a490 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20  essLock==0 );.. 
2a4a0 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75 6d 62   /* Minimum numb
2a4b0 65 72 20 6f 66 20 72 65 67 69 6f 6e 73 20 72 65  er of regions re
2a4c0 71 75 69 72 65 64 20 74 6f 20 62 65 20 6d 61 70  quired to be map
2a4d0 70 65 64 2e 20 2a 2f 0a 20 20 6e 52 65 71 52 65  ped. */.  nReqRe
2a4e0 67 69 6f 6e 20 3d 20 28 28 69 52 65 67 69 6f 6e  gion = ((iRegion
2a4f0 2b 6e 53 68 6d 50 65 72 4d 61 70 29 20 2f 20 6e  +nShmPerMap) / n
2a500 53 68 6d 50 65 72 4d 61 70 29 20 2a 20 6e 53 68  ShmPerMap) * nSh
2a510 6d 50 65 72 4d 61 70 3b 0a 0a 20 20 69 66 28 20  mPerMap;..  if( 
2a520 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
2a530 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b 0a  n<nReqRegion ){.
2a540 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e 65 77      char **apNew
2a550 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a560 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 70         /* New ap
2a570 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a  Region[] array *
2a580 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  /.    int nByte 
2a590 3d 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73 7a 52  = nReqRegion*szR
2a5a0 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 4d 69 6e 69  egion;   /* Mini
2a5b0 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c  mum required fil
2a5c0 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74  e size */.    st
2a5d0 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b  ruct stat sStat;
2a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5f0 20 2f 2a 20 55 73 65 64 20 62 79 20 66 73 74 61   /* Used by fsta
2a600 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d  t() */..    pShm
2a610 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d  Node->szRegion =
2a620 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20   szRegion;..    
2a630 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e  if( pShmNode->h>
2a640 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
2a650 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67  he requested reg
2a660 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65  ion is not mappe
2a670 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  d into this proc
2a680 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70  esses address sp
2a690 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68  ace..      ** Ch
2a6a0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74  eck to see if it
2a6b0 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
2a6c0 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65  ted (i.e. if the
2a6d0 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20   wal-index file 
2a6e0 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72 67  is.      ** larg
2a6f0 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74  e enough to cont
2a700 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  ain the requeste
2a710 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 20  d region)..     
2a720 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 73   */.      if( os
2a730 46 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e  Fstat(pShmNode->
2a740 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20  h, &sStat) ){.  
2a750 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2a760 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3b  E_IOERR_SHMSIZE;
2a770 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68  .        goto sh
2a780 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
2a790 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20   }.  .      if( 
2a7a0 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e 42  sStat.st_size<nB
2a7b0 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  yte ){.        /
2a7c0 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
2a7d0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f  memory region do
2a7e0 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66  es not exist. If
2a7f0 20 62 45 78 74 65 6e 64 20 69 73 20 73 65 74 20   bExtend is set 
2a800 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61  to.        ** fa
2a810 6c 73 65 2c 20 65 78 69 74 20 65 61 72 6c 79 2e  lse, exit early.
2a820 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65 74   *pp will be set
2a830 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c   to NULL and SQL
2a840 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
2a850 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2a860 20 20 20 20 69 66 28 20 21 62 45 78 74 65 6e 64      if( !bExtend
2a870 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
2a880 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
2a890 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
2a8a0 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76     /* Alternativ
2a8b0 65 6c 79 2c 20 69 66 20 62 45 78 74 65 6e 64 20  ely, if bExtend 
2a8c0 69 73 20 74 72 75 65 2c 20 65 78 74 65 6e 64 20  is true, extend 
2a8d0 74 68 65 20 66 69 6c 65 2e 20 44 6f 20 74 68 69  the file. Do thi
2a8e0 73 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  s by.        ** 
2a8f0 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65  writing a single
2a900 20 62 79 74 65 20 74 6f 20 74 68 65 20 65 6e 64   byte to the end
2a910 20 6f 66 20 65 61 63 68 20 28 4f 53 29 20 70 61   of each (OS) pa
2a920 67 65 20 62 65 69 6e 67 0a 20 20 20 20 20 20 20  ge being.       
2a930 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72   ** allocated or
2a940 20 65 78 74 65 6e 64 65 64 2e 20 54 65 63 68 6e   extended. Techn
2a950 69 63 61 6c 6c 79 2c 20 77 65 20 6e 65 65 64 20  ically, we need 
2a960 6f 6e 6c 79 20 77 72 69 74 65 20 74 6f 20 74 68  only write to th
2a970 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 61 73  e.        ** las
2a980 74 20 70 61 67 65 20 69 6e 20 6f 72 64 65 72 20  t page in order 
2a990 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 66 69  to extend the fi
2a9a0 6c 65 2e 20 42 75 74 20 77 72 69 74 69 6e 67 20  le. But writing 
2a9b0 74 6f 20 61 6c 6c 20 6e 65 77 0a 20 20 20 20 20  to all new.     
2a9c0 20 20 20 2a 2a 20 70 61 67 65 73 20 66 6f 72 63     ** pages forc
2a9d0 65 73 20 74 68 65 20 4f 53 20 74 6f 20 61 6c 6c  es the OS to all
2a9e0 6f 63 61 74 65 20 74 68 65 6d 20 69 6d 6d 65 64  ocate them immed
2a9f0 69 61 74 65 6c 79 2c 20 77 68 69 63 68 20 72 65  iately, which re
2aa00 64 75 63 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  duces.        **
2aa10 20 74 68 65 20 63 68 61 6e 63 65 73 20 6f 66 20   the chances of 
2aa20 53 49 47 42 55 53 20 77 68 69 6c 65 20 61 63 63  SIGBUS while acc
2aa30 65 73 73 69 6e 67 20 74 68 65 20 6d 61 70 70 65  essing the mappe
2aa40 64 20 72 65 67 69 6f 6e 20 6c 61 74 65 72 20 6f  d region later o
2aa50 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  n..        */.  
2aa60 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20        else{.    
2aa70 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
2aa80 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 34 30  st int pgsz = 40
2aa90 39 36 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  96;.          in
2aaa0 74 20 69 50 67 3b 0a 0a 20 20 20 20 20 20 20 20  t iPg;..        
2aab0 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68    /* Write to th
2aac0 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20 65  e last byte of e
2aad0 61 63 68 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61  ach newly alloca
2aae0 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65 64 20  ted or extended 
2aaf0 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
2ab00 20 20 61 73 73 65 72 74 28 20 28 6e 42 79 74 65    assert( (nByte
2ab10 20 25 20 70 67 73 7a 29 3d 3d 30 20 29 3b 0a 20   % pgsz)==0 );. 
2ab20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 50 67           for(iPg
2ab30 3d 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 2f  =(sStat.st_size/
2ab40 70 67 73 7a 29 3b 20 69 50 67 3c 28 6e 42 79 74  pgsz); iPg<(nByt
2ab50 65 2f 70 67 73 7a 29 3b 20 69 50 67 2b 2b 29 7b  e/pgsz); iPg++){
2ab60 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
2ab70 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   x = 0;.        
2ab80 20 20 20 20 69 66 28 20 73 65 65 6b 41 6e 64 57      if( seekAndW
2ab90 72 69 74 65 46 64 28 70 53 68 6d 4e 6f 64 65 2d  riteFd(pShmNode-
2aba0 3e 68 2c 20 69 50 67 2a 70 67 73 7a 20 2b 20 70  >h, iPg*pgsz + p
2abb0 67 73 7a 2d 31 2c 20 22 22 2c 20 31 2c 20 26 78  gsz-1, "", 1, &x
2abc0 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=1 ){.        
2abd0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2abe0 20 2a 7a 46 69 6c 65 20 3d 20 70 53 68 6d 4e 6f   *zFile = pShmNo
2abf0 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  de->zFilename;. 
2ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
2ac10 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
2ac20 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
2ac30 49 5a 45 2c 20 22 77 72 69 74 65 22 2c 20 7a 46  IZE, "write", zF
2ac40 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ile);.          
2ac50 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
2ac60 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20  _out;.          
2ac70 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
2ac80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ac90 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2aca0 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 74 65  Map the requeste
2acb0 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d memory region 
2acc0 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
2acd0 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
2ace0 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20  e. */.    apNew 
2acf0 3d 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69 74  = (char **)sqlit
2ad00 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20  e3_realloc(.    
2ad10 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70      pShmNode->ap
2ad20 52 65 67 69 6f 6e 2c 20 6e 52 65 71 52 65 67 69  Region, nReqRegi
2ad30 6f 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 20 2a  on*sizeof(char *
2ad40 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ).    );.    if(
2ad50 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20   !apNew ){.     
2ad60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
2ad70 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
2ad80 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
2ad90 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
2ada0 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67   pShmNode->apReg
2adb0 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20  ion = apNew;.   
2adc0 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65   while( pShmNode
2add0 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52 65  ->nRegion<nReqRe
2ade0 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e  gion ){.      in
2adf0 74 20 6e 4d 61 70 20 3d 20 73 7a 52 65 67 69 6f  t nMap = szRegio
2ae00 6e 2a 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20 20  n*nShmPerMap;.  
2ae10 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
2ae20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20 20   void *pMem;.   
2ae30 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
2ae40 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >h>=0 ){.       
2ae50 20 70 4d 65 6d 20 3d 20 6f 73 4d 6d 61 70 28 30   pMem = osMmap(0
2ae60 2c 20 6e 4d 61 70 2c 0a 20 20 20 20 20 20 20 20  , nMap,.        
2ae70 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73      pShmNode->is
2ae80 52 65 61 64 6f 6e 6c 79 20 3f 20 50 52 4f 54 5f  Readonly ? PROT_
2ae90 52 45 41 44 20 3a 20 50 52 4f 54 5f 52 45 41 44  READ : PROT_READ
2aea0 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20 20  |PROT_WRITE, .  
2aeb0 20 20 20 20 20 20 20 20 20 20 4d 41 50 5f 53 48            MAP_SH
2aec0 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  ARED, pShmNode->
2aed0 68 2c 20 73 7a 52 65 67 69 6f 6e 2a 28 69 36 34  h, szRegion*(i64
2aee0 29 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69  )pShmNode->nRegi
2aef0 6f 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  on.        );.  
2af00 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d        if( pMem==
2af10 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20  MAP_FAILED ){.  
2af20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
2af30 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
2af40 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 22  _IOERR_SHMMAP, "
2af50 6d 6d 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65 2d  mmap", pShmNode-
2af60 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
2af70 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
2af80 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  age_out;.       
2af90 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
2afa0 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 73          pMem = s
2afb0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
2afc0 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20  szRegion);.     
2afd0 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30 20 29     if( pMem==0 )
2afe0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2aff0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2b000 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
2b010 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
2b020 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b030 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20 30    memset(pMem, 0
2b040 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20  , szRegion);.   
2b050 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28     }..      for(
2b060 69 3d 30 3b 20 69 3c 6e 53 68 6d 50 65 72 4d 61  i=0; i<nShmPerMa
2b070 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
2b080 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67   pShmNode->apReg
2b090 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ion[pShmNode->nR
2b0a0 65 67 69 6f 6e 2b 69 5d 20 3d 20 26 28 28 63 68  egion+i] = &((ch
2b0b0 61 72 2a 29 70 4d 65 6d 29 5b 73 7a 52 65 67 69  ar*)pMem)[szRegi
2b0c0 6f 6e 2a 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  on*i];.      }. 
2b0d0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e       pShmNode->n
2b0e0 52 65 67 69 6f 6e 20 2b 3d 20 6e 53 68 6d 50 65  Region += nShmPe
2b0f0 72 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rMap;.    }.  }.
2b100 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20  .shmpage_out:.  
2b110 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
2b120 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b  egion>iRegion ){
2b130 0a 20 20 20 20 2a 70 70 20 3d 20 70 53 68 6d 4e  .    *pp = pShmN
2b140 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 52  ode->apRegion[iR
2b150 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b  egion];.  }else{
2b160 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20  .    *pp = 0;.  
2b170 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  }.  if( pShmNode
2b180 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26 26 20  ->isReadonly && 
2b190 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
2b1a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
2b1b0 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ONLY;.  sqlite3_
2b1c0 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
2b1d0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
2b1e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2b1f0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
2b200 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20  ock state for a 
2b210 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
2b220 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  gment..**.** Not
2b230 65 20 74 68 61 74 20 74 68 65 20 72 65 6c 61 74  e that the relat
2b240 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20  ionship between 
2b250 53 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c 55  SHAREd and EXCLU
2b260 53 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61 20  SIVE locks is a 
2b270 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65 72  little.** differ
2b280 65 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69 6e  ent here than in
2b290 20 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68 6d   posix.  In xShm
2b2a0 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e 20  Lock(), one can 
2b2b0 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  go from unlocked
2b2c0 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61 6e  .** to shared an
2b2d0 64 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20 75  d back or from u
2b2e0 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c 75  nlocked to exclu
2b2f0 73 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20 20  sive and back.  
2b300 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e  But one may.** n
2b310 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72 65  ot go from share
2b320 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 6f  d to exclusive o
2b330 72 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76 65  r from exclusive
2b340 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a 73   to shared..*/.s
2b350 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
2b360 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33  mLock(.  sqlite3
2b370 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
2b380 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
2b390 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  file holding the
2b3a0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
2b3b0 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
2b3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b3d0 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20  * First lock to 
2b3e0 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61  acquire or relea
2b3f0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20  se */.  int n,  
2b400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b410 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2b420 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65  locks to acquire
2b430 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   or release */. 
2b440 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
2b450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
2b460 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
2b470 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20  he lock */.){.  
2b480 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20  unixFile *pDbFd 
2b490 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b  = (unixFile*)fd;
2b4a0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
2b4b0 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ion holding shar
2b4c0 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75  ed memory */.  u
2b4d0 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62 46  nixShm *p = pDbF
2b4e0 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20  d->pShm;        
2b4f0 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
2b500 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20  ed memory being 
2b510 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78  locked */.  unix
2b520 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20  Shm *pX;        
2b530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b540 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
2b550 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e   over all siblin
2b560 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e  gs */.  unixShmN
2b570 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20  ode *pShmNode = 
2b580 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a  p->pShmNode;  /*
2b590 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
2b5a0 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20 20  file iNode */.  
2b5b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2b5c0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
2b5d0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
2b5e0 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61  code */.  u16 ma
2b5f0 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
2b600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b610 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73  /* Mask of locks
2b620 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65   to take or rele
2b630 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ase */..  assert
2b640 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46  ( pShmNode==pDbF
2b650 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
2b660 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
2b670 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
2b680 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
2b690 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
2b6a0 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c  st>=0 && ofst+n<
2b6b0 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  =SQLITE_SHM_NLOC
2b6c0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  K );.  assert( n
2b6d0 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
2b6e0 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
2b6f0 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
2b700 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
2b710 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
2b720 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
2b730 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  | SQLITE_SHM_EXC
2b740 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c  LUSIVE).       |
2b750 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
2b760 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
2b770 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
2b780 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
2b790 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
2b7a0 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
2b7b0 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a  M_EXCLUSIVE) );.
2b7c0 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c    assert( n==1 |
2b7d0 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  | (flags & SQLIT
2b7e0 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
2b7f0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2b800 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
2b810 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
2b820 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
2b830 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
2b840 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20  ShmNode->h<0 || 
2b850 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
2b860 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
2b870 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c  ;..  mask = (1<<
2b880 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c  (ofst+n)) - (1<<
2b890 6f 66 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28  ofst);.  assert(
2b8a0 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31   n>1 || mask==(1
2b8b0 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c  <<ofst) );.  sql
2b8c0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
2b8d0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
2b8e0 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  );.  if( flags &
2b8f0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f   SQLITE_SHM_UNLO
2b900 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c  CK ){.    u16 al
2b910 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61  lMask = 0; /* Ma
2b920 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  sk of locks held
2b930 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a   by siblings */.
2b940 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61  .    /* See if a
2b950 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64  ny siblings hold
2b960 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20   this same lock 
2b970 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
2b980 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
2b990 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
2b9a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d  ){.      if( pX=
2b9b0 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =p ) continue;. 
2b9c0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58       assert( (pX
2b9d0 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d  ->exclMask & (p-
2b9e0 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61  >exclMask|p->sha
2b9f0 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a  redMask))==0 );.
2ba00 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d        allMask |=
2ba10 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b   pX->sharedMask;
2ba20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
2ba30 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d  nlock the system
2ba40 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a  -level locks */.
2ba50 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20      if( (mask & 
2ba60 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  allMask)==0 ){. 
2ba70 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68       rc = unixSh
2ba80 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46  mSystemLock(pDbF
2ba90 64 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74  d, F_UNLCK, ofst
2baa0 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20  +UNIX_SHM_BASE, 
2bab0 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
2bac0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2bad0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  _OK;.    }..    
2bae0 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61  /* Undo the loca
2baf0 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  l locks */.    i
2bb00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2bb10 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63   ){.      p->exc
2bb20 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
2bb30 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d        p->sharedM
2bb40 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
2bb50 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28    } .  }else if(
2bb60 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
2bb70 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  SHM_SHARED ){.  
2bb80 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20    u16 allShared 
2bb90 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f  = 0;  /* Union o
2bba0 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
2bbb0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
2bbc0 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20  r than "p" */.. 
2bbd0 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77     /* Find out w
2bbe0 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b  hich shared lock
2bbf0 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65  s are already he
2bc00 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f  ld by sibling co
2bc10 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a  nnections..    *
2bc20 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67  * If any sibling
2bc30 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61   already holds a
2bc40 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
2bc50 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72  , go ahead and r
2bc60 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c  eturn.    ** SQL
2bc70 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f  ITE_BUSY..    */
2bc80 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
2bc90 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
2bca0 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
2bcb0 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e  .      if( (pX->
2bcc0 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29  exclMask & mask)
2bcd0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
2bce0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
2bcf0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2bd00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c        }.      al
2bd10 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73  lShared |= pX->s
2bd20 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d  haredMask;.    }
2bd30 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61  ..    /* Get sha
2bd40 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  red locks at the
2bd50 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69   system level, i
2bd60 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
2bd70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2bd80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
2bd90 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d  ( (allShared & m
2bda0 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
2bdb0 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
2bdc0 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c  ystemLock(pDbFd,
2bdd0 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 55   F_RDLCK, ofst+U
2bde0 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  NIX_SHM_BASE, n)
2bdf0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2be00 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2be10 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2be20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
2be30 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65   the local share
2be40 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  d locks */.    i
2be50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2be60 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   ){.      p->sha
2be70 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  redMask |= mask;
2be80 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2be90 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
2bea0 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e   no sibling conn
2beb0 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63  ections hold loc
2bec0 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f  ks that will blo
2bed0 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c  ck this.    ** l
2bee0 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c  ock.  If any do,
2bef0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
2bf00 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a  USY right away..
2bf10 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
2bf20 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
2bf30 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
2bf40 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
2bf50 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
2bf60 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58   mask)!=0 || (pX
2bf70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d  ->sharedMask & m
2bf80 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
2bf90 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
2bfa0 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65  USY;.        bre
2bfb0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2bfc0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20  }.  .    /* Get 
2bfd0 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
2bfe0 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65  cks at the syste
2bff0 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69  m level.  Then i
2c000 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20  f successful.   
2c010 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68   ** also mark th
2c020 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69  e local connecti
2c030 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b  on as being lock
2c040 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
2c050 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2c060 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75   ){.      rc = u
2c070 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
2c080 28 70 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b 2c  (pDbFd, F_WRLCK,
2c090 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42   ofst+UNIX_SHM_B
2c0a0 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69  ASE, n);.      i
2c0b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2c0c0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
2c0d0 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61  rt( (p->sharedMa
2c0e0 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b  sk & mask)==0 );
2c0f0 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c  .        p->excl
2c100 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
2c110 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2c120 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2c130 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
2c140 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43  mutex);.  OSTRAC
2c150 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d  E(("SHM-LOCK shm
2c160 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f  id-%d, pid-%d go
2c170 74 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a  t %03x,%03x\n",.
2c180 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64             p->id
2c190 2c 20 6f 73 47 65 74 70 69 64 28 30 29 2c 20 70  , osGetpid(0), p
2c1a0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d  ->sharedMask, p-
2c1b0 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72  >exclMask));.  r
2c1c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2c1d0 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d  ** Implement a m
2c1e0 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72  emory barrier or
2c1f0 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e   memory fence on
2c200 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20   shared memory. 
2c210 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64   .**.** All load
2c220 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67  s and stores beg
2c230 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61  un before the ba
2c240 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c  rrier must compl
2c250 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ete before.** an
2c260 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20  y load or store 
2c270 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20  begun after the 
2c280 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74  barrier..*/.stat
2c290 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 42  ic void unixShmB
2c2a0 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65  arrier(.  sqlite
2c2b0 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20  3_file *fd      
2c2c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
2c2d0 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69  abase file holdi
2c2e0 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
2c2f0 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55  mory */.){.  UNU
2c300 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64  SED_PARAMETER(fd
2c310 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 65 6d 6f  );.  sqlite3Memo
2c320 72 79 42 61 72 72 69 65 72 28 29 3b 20 20 20 20  ryBarrier();    
2c330 20 20 20 20 20 2f 2a 20 63 6f 6d 70 69 6c 65 72       /* compiler
2c340 2d 64 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79 20  -defined memory 
2c350 62 61 72 72 69 65 72 20 2a 2f 0a 20 20 75 6e 69  barrier */.  uni
2c360 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 20  xEnterMutex();  
2c370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c380 41 6c 73 6f 20 6d 75 74 65 78 2c 20 66 6f 72 20  Also mutex, for 
2c390 72 65 64 75 6e 64 61 6e 63 79 20 2a 2f 0a 20 20  redundancy */.  
2c3a0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
2c3b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
2c3c0 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
2c3d0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20   shared-memory. 
2c3e0 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65   Delete the unde
2c3f0 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61  rlying .** stora
2c400 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67  ge if deleteFlag
2c410 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20   is true..**.** 
2c420 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  If there is no s
2c430 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73  hared memory ass
2c440 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
2c450 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65 6e   connection then
2c460 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
2c470 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
2c480 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
2c490 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70  int unixShmUnmap
2c4a0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
2c4b0 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20   *fd,           
2c4c0 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
2c4d0 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
2c4e0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c  ile */.  int del
2c4f0 65 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20  eteFlag         
2c500 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65           /* Dele
2c510 74 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  te shared-memory
2c520 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
2c530 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20 20   unixShm *p;    
2c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c550 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
2c560 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20  on to be closed 
2c570 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  */.  unixShmNode
2c580 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
2c590 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
2c5a0 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65  rlying shared-me
2c5b0 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75  mory file */.  u
2c5c0 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20  nixShm **pp;    
2c5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c5e0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
2c5f0 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  er sibling conne
2c600 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78  ctions */.  unix
2c610 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20  File *pDbFd;    
2c620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2c630 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
2c640 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
2c650 20 20 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46    pDbFd = (unixF
2c660 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70  ile*)fd;.  p = p
2c670 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66  DbFd->pShm;.  if
2c680 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
2c690 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68  SQLITE_OK;.  pSh
2c6a0 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
2c6b0 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ode;..  assert( 
2c6c0 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d  pShmNode==pDbFd-
2c6d0 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
2c6e0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
2c6f0 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d  ShmNode->pInode=
2c700 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29  =pDbFd->pInode )
2c710 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63  ;..  /* Remove c
2c720 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d  onnection p from
2c730 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e   the set of conn
2c740 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74  ections associat
2c750 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68  ed.  ** with pSh
2c760 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74  mNode */.  sqlit
2c770 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
2c780 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
2c790 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e  .  for(pp=&pShmN
2c7a0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70  ode->pFirst; (*p
2c7b0 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70  p)!=p; pp = &(*p
2c7c0 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a  p)->pNext){}.  *
2c7d0 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a  pp = p->pNext;..
2c7e0 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f    /* Free the co
2c7f0 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20  nnection p */.  
2c800 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
2c810 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d  .  pDbFd->pShm =
2c820 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   0;.  sqlite3_mu
2c830 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
2c840 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f  de->mutex);..  /
2c850 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  * If pShmNode->n
2c860 52 65 66 20 68 61 73 20 72 65 61 63 68 65 64 20  Ref has reached 
2c870 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68  0, then close th
2c880 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a  e underlying.  *
2c890 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  * shared-memory 
2c8a0 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75  file, too */.  u
2c8b0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
2c8c0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
2c8d0 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  ode->nRef>0 );. 
2c8e0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d   pShmNode->nRef-
2c8f0 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  -;.  if( pShmNod
2c900 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  e->nRef==0 ){.  
2c910 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67    if( deleteFlag
2c920 20 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e   && pShmNode->h>
2c930 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 69 66 20  =0 ) {.      if 
2c940 28 64 65 6c 65 74 65 46 6c 61 67 20 3d 3d 20 31  (deleteFlag == 1
2c950 29 20 7b 20 0a 20 20 20 20 20 20 20 20 6f 73 55  ) { .        osU
2c960 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e  nlink(pShmNode->
2c970 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
2c980 20 20 7d 20 65 6c 73 65 20 69 66 20 28 64 65 6c    } else if (del
2c990 65 74 65 46 6c 61 67 20 3d 3d 20 32 29 20 7b 0a  eteFlag == 2) {.
2c9a0 20 20 20 20 20 20 20 20 2f 2a 20 66 74 72 75 6e          /* ftrun
2c9b0 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  cate(pShmNode->h
2c9c0 2c 20 33 32 20 2a 20 31 30 32 34 29 3b 20 2a 2f  , 32 * 1024); */
2c9d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2c9e0 20 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28     unixShmPurge(
2c9f0 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e  pDbFd);.  }.  un
2ca00 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
2ca10 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2ca20 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23  _OK;.}...#else.#
2ca30 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d   define unixShmM
2ca40 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e  ap     0.# defin
2ca50 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20  e unixShmLock   
2ca60 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78   0.# define unix
2ca70 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64  ShmBarrier 0.# d
2ca80 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d  efine unixShmUnm
2ca90 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a  ap   0.#endif /*
2caa0 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
2cab0 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 23 69 66  OMIT_WAL */..#if
2cac0 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f   (SQLITE_ENABLE_
2cad0 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26 20  APPLE_SPI>0) && 
2cae0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2caf0 5f 29 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  _).static const 
2cb00 63 68 61 72 20 2a 75 6e 69 78 54 65 6d 70 46 69  char *unixTempFi
2cb10 6c 65 44 69 72 28 76 6f 69 64 29 3b 0a 0a 73 74  leDir(void);..st
2cb20 61 74 69 63 20 69 6e 74 20 75 6e 69 78 49 6e 76  atic int unixInv
2cb30 61 6c 69 64 61 74 65 53 75 70 70 6f 72 74 46 69  alidateSupportFi
2cb40 6c 65 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  les(unixFile *pF
2cb50 69 6c 65 2c 20 69 6e 74 20 73 6b 69 70 57 41 4c  ile, int skipWAL
2cb60 29 20 7b 0a 20 20 63 68 61 72 20 6a 50 61 74 68  ) {.  char jPath
2cb70 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 39 5d 3b 0a  [MAXPATHLEN+9];.
2cb80 20 20 69 6e 74 20 7a 4c 65 6e 20 3d 20 73 74 72    int zLen = str
2cb90 6c 63 70 79 28 6a 50 61 74 68 2c 20 70 46 69 6c  lcpy(jPath, pFil
2cba0 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58 50 41 54  e->zPath, MAXPAT
2cbb0 48 4c 45 4e 2b 39 29 3b 0a 20 20 69 66 28 20 7a  HLEN+9);.  if( z
2cbc0 4c 65 6e 3c 4d 41 58 50 41 54 48 4c 45 4e 20 29  Len<MAXPATHLEN )
2cbd0 7b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6a 4c 65  {.    size_t jLe
2cbe0 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  n;.    const cha
2cbf0 72 20 65 78 74 65 6e 73 69 6f 6e 73 5b 33 5d 5b  r extensions[3][
2cc00 39 5d 20 3d 20 7b 20 22 2d 77 61 6c 22 2c 20 22  9] = { "-wal", "
2cc10 2d 6a 6f 75 72 6e 61 6c 22 2c 20 22 2d 73 68 6d  -journal", "-shm
2cc20 22 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6a 20 3d  " };.    int j =
2cc30 20 28 73 6b 69 70 57 41 4c 20 3f 20 31 20 3a 20   (skipWAL ? 1 : 
2cc40 30 29 3b 0a 20 20 20 20 66 6f 72 28 20 3b 20 6a  0);.    for( ; j
2cc50 3c 33 3b 20 6a 2b 2b 20 29 7b 0a 20 20 20 20 20  <3; j++ ){.     
2cc60 20 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b   .      /* Check
2cc70 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 73   to see if the s
2cc80 68 6d 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61  hm file is alrea
2cc90 64 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 74 68  dy opened for th
2cca0 69 73 20 70 46 69 6c 65 20 2a 2f 0a 20 20 20 20  is pFile */.    
2ccb0 20 20 69 66 28 20 6a 3d 3d 32 20 29 7b 0a 20 20    if( j==2 ){.  
2ccc0 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d        unixEnterM
2ccd0 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75  utex(); /* Becau
2cce0 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
2ccf0 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
2cd00 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 20  s threads */.   
2cd10 20 20 20 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65       unixShmNode
2cd20 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 46 69   *pShmNode = pFi
2cd30 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  le->pInode->pShm
2cd40 4e 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Node;.        if
2cd50 28 20 70 53 68 6d 4e 6f 64 65 20 26 26 20 21 70  ( pShmNode && !p
2cd60 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f  ShmNode->isReado
2cd70 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nly ){.         
2cd80 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
2cd90 61 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  at;.          sq
2cda0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
2cdb0 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
2cdc0 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 0a 20  x);.          . 
2cdd0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 68           if( pSh
2cde0 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 26 26 20 21  mNode->h>=0 && !
2cdf0 6f 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64 65  osFstat(pShmNode
2ce00 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a  ->h, &sStat) ){.
2ce10 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73 69              unsi
2ce20 67 6e 65 64 20 6c 6f 6e 67 20 73 69 7a 65 20 3d  gned long size =
2ce30 20 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c   (sStat.st_size<
2ce40 34 29 20 3f 20 73 53 74 61 74 2e 73 74 5f 73 69  4) ? sStat.st_si
2ce50 7a 65 20 3a 20 34 3b 0a 20 20 20 20 20 20 20 20  ze : 4;.        
2ce60 20 20 20 20 69 66 28 20 73 69 7a 65 3e 30 20 29      if( size>0 )
2ce70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2ce80 62 7a 65 72 6f 28 70 53 68 6d 4e 6f 64 65 2d 3e  bzero(pShmNode->
2ce90 61 70 52 65 67 69 6f 6e 5b 30 5d 2c 20 73 69 7a  apRegion[0], siz
2cea0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2ceb0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2cec0 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
2ced0 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20  mutex);.        
2cee0 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d        unixLeaveM
2cef0 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20 20  utex();.        
2cf00 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
2cf10 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2cf20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cf30 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
2cf40 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
2cf50 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
2cf60 20 20 7d 0a 20 20 20 20 20 20 20 20 75 6e 69 78    }.        unix
2cf70 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
2cf80 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 4c 65 6e      }.      jLen
2cf90 20 3d 20 73 74 72 6c 63 70 79 28 26 6a 50 61 74   = strlcpy(&jPat
2cfa0 68 5b 7a 4c 65 6e 5d 2c 20 65 78 74 65 6e 73 69  h[zLen], extensi
2cfb0 6f 6e 73 5b 6a 5d 2c 20 39 29 3b 0a 20 20 20 20  ons[j], 9);.    
2cfc0 20 20 69 66 28 20 6a 4c 65 6e 20 3c 20 39 20 29    if( jLen < 9 )
2cfd0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 66  {.        int jf
2cfe0 6c 61 67 73 20 3d 20 28 6a 3c 32 29 20 3f 20 4f  lags = (j<2) ? O
2cff0 5f 54 52 55 4e 43 20 3a 20 4f 5f 52 44 57 52 3b  _TRUNC : O_RDWR;
2d000 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 66 64  .        int jfd
2d010 20 3d 20 6f 70 65 6e 28 6a 50 61 74 68 2c 20 6a   = open(jPath, j
2d020 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20  flags);.        
2d030 69 66 28 20 6a 66 64 3d 3d 28 2d 31 29 20 29 7b  if( jfd==(-1) ){
2d040 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
2d050 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b 0a  rrno!=ENOENT ){.
2d060 20 20 20 20 20 20 20 20 20 20 20 20 70 65 72 72              perr
2d070 6f 72 28 6a 50 61 74 68 29 3b 0a 20 20 20 20 20  or(jPath);.     
2d080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2d090 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
2d0a0 20 20 69 66 28 20 6a 3d 3d 32 20 29 7b 0a 20 20    if( j==2 ){.  
2d0b0 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
2d0c0 20 73 74 61 74 20 73 53 74 61 74 3b 0a 20 20 20   stat sStat;.   
2d0d0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6f 73           if( !os
2d0e0 46 73 74 61 74 28 6a 66 64 2c 20 26 73 53 74 61  Fstat(jfd, &sSta
2d0f0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
2d100 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e      unsigned lon
2d110 67 20 73 69 7a 65 20 3d 20 28 73 53 74 61 74 2e  g size = (sStat.
2d120 73 74 5f 73 69 7a 65 3c 34 29 20 3f 20 73 53 74  st_size<4) ? sSt
2d130 61 74 2e 73 74 5f 73 69 7a 65 20 3a 20 34 3b 0a  at.st_size : 4;.
2d140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2d150 28 20 73 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  ( size>0 ){.    
2d160 20 20 20 20 20 20 20 20 20 20 20 20 75 69 6e 74              uint
2d170 33 32 5f 74 20 7a 65 72 6f 20 3d 20 30 3b 0a 20  32_t zero = 0;. 
2d180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2d190 77 72 69 74 65 28 6a 66 64 2c 20 26 7a 65 72 6f  write(jfd, &zero
2d1a0 2c 20 28 73 69 7a 65 5f 74 29 73 69 7a 65 2c 20  , (size_t)size, 
2d1b0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
2d1c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2d1d0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2d1e0 20 20 20 20 20 20 20 20 66 73 79 6e 63 28 6a 66          fsync(jf
2d1f0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  d);.          cl
2d200 6f 73 65 28 6a 66 64 29 3b 0a 20 20 20 20 20 20  ose(jfd);.      
2d210 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2d220 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
2d230 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61  QLITE_OK;.}..sta
2d240 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 73 61  tic int unixUnsa
2d250 66 65 54 72 75 6e 63 61 74 65 44 61 74 61 62 61  feTruncateDataba
2d260 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  se(unixFile *pFi
2d270 6c 65 29 7b 0a 20 20 2f 2a 20 74 68 69 73 20 69  le){.  /* this i
2d280 73 20 6e 61 73 74 79 20 26 20 62 61 64 2e 20 20  s nasty & bad.  
2d290 64 65 73 74 72 75 63 74 69 6f 6e 20 77 69 74 68  destruction with
2d2a0 20 70 72 65 6a 75 64 69 63 65 2e 20 20 77 65 27   prejudice.  we'
2d2b0 6c 6c 20 6c 6f 73 65 20 61 6c 6c 20 74 68 65 0a  ll lose all the.
2d2c0 20 20 2a 2a 20 66 69 6c 65 20 6c 6f 63 6b 73 20    ** file locks 
2d2d0 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c  in this process,
2d2e0 20 68 6f 77 65 76 65 72 2e 20 73 71 6c 69 74 65   however. sqlite
2d2f0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 77  3_file_control w
2d300 6f 72 6b 73 20 70 72 6f 70 65 72 6c 79 2e 0a 20  orks properly.. 
2d310 20 2a 2a 20 42 75 74 20 69 66 20 69 74 20 66 61   ** But if it fa
2d320 69 6c 73 2c 20 74 68 69 73 20 77 6f 72 6b 73 20  ils, this works 
2d330 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 0a 20 20  approximately.  
2d340 2a 2f 0a 20 20 63 68 61 72 20 6a 6f 75 72 6e 61  */.  char journa
2d350 6c 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e  lPath[MAXPATHLEN
2d360 5d 3b 0a 20 20 63 68 61 72 20 77 61 6c 50 61 74  ];.  char walPat
2d370 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20  h[MAXPATHLEN];. 
2d380 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2d390 5f 4f 4b 3b 0a 20 20 0a 23 69 66 64 65 66 20 44  _OK;.  .#ifdef D
2d3a0 45 42 55 47 0a 20 20 66 70 72 69 6e 74 66 28 73  EBUG.  fprintf(s
2d3b0 74 64 65 72 72 2c 20 22 46 6f 72 63 65 20 74 72  tderr, "Force tr
2d3c0 75 6e 63 61 74 69 6e 67 20 64 61 74 61 62 61 73  uncating databas
2d3d0 65 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  e %s\n", pFile->
2d3e0 7a 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20  zPath);.#endif. 
2d3f0 20 73 74 72 6c 63 70 79 28 6a 6f 75 72 6e 61 6c   strlcpy(journal
2d400 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  Path, pFile->zPa
2d410 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  th, MAXPATHLEN);
2d420 0a 20 20 73 74 72 6c 63 61 74 28 6a 6f 75 72 6e  .  strlcat(journ
2d430 61 6c 50 61 74 68 2c 20 22 2d 6a 6f 75 72 6e 61  alPath, "-journa
2d440 6c 22 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  l", MAXPATHLEN);
2d450 0a 20 20 73 74 72 6c 63 70 79 28 77 61 6c 50 61  .  strlcpy(walPa
2d460 74 68 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  th, pFile->zPath
2d470 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
2d480 20 73 74 72 6c 63 61 74 28 77 61 6c 50 61 74 68   strlcat(walPath
2d490 2c 20 22 2d 77 61 6c 22 2c 20 4d 41 58 50 41 54  , "-wal", MAXPAT
2d4a0 48 4c 45 4e 29 3b 0a 20 20 69 6e 74 20 66 64 31  HLEN);.  int fd1
2d4b0 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 69   = pFile->h;.  i
2d4c0 6e 74 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20  nt result = 0;. 
2d4d0 20 72 65 73 75 6c 74 20 3d 20 66 74 72 75 6e 63   result = ftrunc
2d4e0 61 74 65 28 66 64 31 2c 20 30 6c 6c 29 3b 0a 20  ate(fd1, 0ll);. 
2d4f0 20 69 66 20 28 72 65 73 75 6c 74 29 20 7b 0a 20   if (result) {. 
2d500 20 20 20 72 65 73 75 6c 74 20 3d 20 65 72 72 6e     result = errn
2d510 6f 3b 0a 20 20 7d 0a 20 20 69 66 20 28 72 65 73  o;.  }.  if (res
2d520 75 6c 74 29 20 7b 0a 20 20 20 20 72 63 20 3d 20  ult) {.    rc = 
2d530 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
2d540 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
2d550 28 70 46 69 6c 65 2c 20 72 65 73 75 6c 74 29 3b  (pFile, result);
2d560 0a 20 20 7d 0a 20 20 0a 20 20 69 6e 74 20 66 64  .  }.  .  int fd
2d570 32 20 3d 20 6f 70 65 6e 28 6a 6f 75 72 6e 61 6c  2 = open(journal
2d580 50 61 74 68 2c 20 4f 5f 52 44 57 52 29 3b 0a 20  Path, O_RDWR);. 
2d590 20 69 6e 74 20 72 65 73 75 6c 74 32 20 3d 20 30   int result2 = 0
2d5a0 3b 0a 20 20 69 66 20 28 66 64 32 20 3c 20 30 29  ;.  if (fd2 < 0)
2d5b0 20 7b 0a 20 20 20 20 69 66 20 28 65 72 72 6e 6f   {.    if (errno
2d5c0 20 21 3d 20 45 4e 4f 45 4e 54 29 20 7b 0a 20 20   != ENOENT) {.  
2d5d0 20 20 20 20 72 65 73 75 6c 74 32 20 3d 20 65 72      result2 = er
2d5e0 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  rno;.    } else 
2d5f0 7b 0a 20 20 20 20 20 20 72 65 73 75 6c 74 32 20  {.      result2 
2d600 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65  = 0;.    }.  } e
2d610 6c 73 65 20 7b 0a 20 20 20 20 72 65 73 75 6c 74  lse {.    result
2d620 32 20 3d 20 66 74 72 75 6e 63 61 74 65 28 66 64  2 = ftruncate(fd
2d630 32 2c 20 30 6c 6c 29 3b 0a 20 20 20 20 69 66 20  2, 0ll);.    if 
2d640 28 72 65 73 75 6c 74 32 29 20 7b 0a 20 20 20 20  (result2) {.    
2d650 20 20 72 65 73 75 6c 74 32 20 3d 20 65 72 72 6e    result2 = errn
2d660 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  o;.    }.  }.  i
2d670 66 20 28 72 65 73 75 6c 74 32 20 26 26 20 21 72  f (result2 && !r
2d680 65 73 75 6c 74 29 20 7b 0a 20 20 20 20 72 63 20  esult) {.    rc 
2d690 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  = SQLITE_IOERR;.
2d6a0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
2d6b0 6e 6f 28 70 46 69 6c 65 2c 20 72 65 73 75 6c 74  no(pFile, result
2d6c0 32 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 6e 74  2);.  }.  .  int
2d6d0 20 66 64 33 20 3d 20 6f 70 65 6e 28 77 61 6c 50   fd3 = open(walP
2d6e0 61 74 68 2c 20 4f 5f 52 44 57 52 29 3b 0a 20 20  ath, O_RDWR);.  
2d6f0 69 6e 74 20 72 65 73 75 6c 74 33 20 3d 20 30 3b  int result3 = 0;
2d700 0a 20 20 69 66 20 28 66 64 33 20 3c 20 30 29 20  .  if (fd3 < 0) 
2d710 7b 0a 20 20 20 20 69 66 20 28 65 72 72 6e 6f 20  {.    if (errno 
2d720 21 3d 20 45 4e 4f 45 4e 54 29 20 7b 0a 20 20 20  != ENOENT) {.   
2d730 20 20 20 72 65 73 75 6c 74 33 20 3d 20 65 72 72     result3 = err
2d740 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  no;.    } else {
2d750 0a 20 20 20 20 20 20 72 65 73 75 6c 74 33 20 3d  .      result3 =
2d760 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c   0;.    }.  } el
2d770 73 65 20 7b 0a 20 20 20 20 72 65 73 75 6c 74 33  se {.    result3
2d780 20 3d 20 66 74 72 75 6e 63 61 74 65 28 66 64 33   = ftruncate(fd3
2d790 2c 20 30 6c 6c 29 3b 0a 20 20 20 20 69 66 20 28  , 0ll);.    if (
2d7a0 72 65 73 75 6c 74 33 29 20 7b 0a 20 20 20 20 20  result3) {.     
2d7b0 20 72 65 73 75 6c 74 33 20 3d 20 65 72 72 6e 6f   result3 = errno
2d7c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
2d7d0 20 28 72 65 73 75 6c 74 33 20 26 26 20 21 28 72   (result3 && !(r
2d7e0 65 73 75 6c 74 20 7c 7c 20 72 65 73 75 6c 74 32  esult || result2
2d7f0 29 29 20 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  )) {.    rc = SQ
2d800 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
2d810 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
2d820 46 69 6c 65 2c 20 72 65 73 75 6c 74 32 29 3b 0a  File, result2);.
2d830 20 20 7d 0a 20 20 0a 20 20 69 66 20 28 66 64 33    }.  .  if (fd3
2d840 20 3e 3d 20 30 29 20 7b 0a 20 20 20 20 66 73 79   >= 0) {.    fsy
2d850 6e 63 28 66 64 33 29 3b 0a 20 20 20 20 63 6c 6f  nc(fd3);.    clo
2d860 73 65 28 66 64 33 29 3b 0a 20 20 7d 0a 20 20 69  se(fd3);.  }.  i
2d870 66 20 28 66 64 32 20 3e 3d 20 30 29 20 7b 0a 20  f (fd2 >= 0) {. 
2d880 20 20 20 66 73 79 6e 63 28 66 64 32 29 3b 0a 20     fsync(fd2);. 
2d890 20 20 20 63 6c 6f 73 65 28 66 64 32 29 3b 0a 20     close(fd2);. 
2d8a0 20 7d 0a 20 20 66 73 79 6e 63 28 66 64 31 29 3b   }.  fsync(fd1);
2d8b0 0a 09 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ...  return rc;.
2d8c0 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  }..static int un
2d8d0 69 78 54 72 75 6e 63 61 74 65 44 61 74 61 62 61  ixTruncateDataba
2d8e0 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  se(unixFile *pFi
2d8f0 6c 65 2c 20 69 6e 74 20 62 46 6c 61 67 73 29 20  le, int bFlags) 
2d900 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  {.  sqlite3_file
2d910 20 2a 69 64 20 3d 20 28 73 71 6c 69 74 65 33 5f   *id = (sqlite3_
2d920 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  file *)pFile;.  
2d930 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2d940 4f 4b 3b 0a 20 20 76 6f 69 64 20 2a 70 4c 6f 63  OK;.  void *pLoc
2d950 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20  k = NULL;.  int 
2d960 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 69 6e 74  flags = 0;.  int
2d970 20 63 6f 72 72 75 70 74 46 69 6c 65 4c 6f 63 6b   corruptFileLock
2d980 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 43 6f   = 0;.  int isCo
2d990 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 69 6e 74  rrupt = 0;.  int
2d9a0 20 66 6f 72 63 65 20 3d 20 28 62 46 6c 61 67 73   force = (bFlags
2d9b0 20 26 20 53 51 4c 49 54 45 5f 54 52 55 4e 43 41   & SQLITE_TRUNCA
2d9c0 54 45 5f 46 4f 52 43 45 29 3b 0a 20 20 69 6e 74  TE_FORCE);.  int
2d9d0 20 73 61 66 65 46 61 69 6c 65 64 20 3d 20 30 3b   safeFailed = 0;
2d9e0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
2d9f0 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54  BLE_DATA_PROTECT
2da00 49 4f 4e 0a 20 20 66 6c 61 67 73 20 7c 3d 20 70  ION.  flags |= p
2da10 46 69 6c 65 2d 3e 70 72 6f 74 46 6c 61 67 73 3b  File->protFlags;
2da20 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
2da30 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2da40 47 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 69 73  G_STYLE.  if( is
2da50 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65  ProxyLockingMode
2da60 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 66  (pFile) ){.    f
2da70 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
2da80 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 3b 0a 20  PEN_AUTOPROXY;. 
2da90 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72   }.#endif.  .  r
2daa0 63 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f  c = sqlite3demo_
2dab0 73 75 70 65 72 6c 6f 63 6b 28 70 46 69 6c 65 2d  superlock(pFile-
2dac0 3e 7a 50 61 74 68 2c 20 30 2c 20 66 6c 61 67 73  >zPath, 0, flags
2dad0 2c 20 30 2c 20 30 2c 20 26 70 4c 6f 63 6b 29 3b  , 0, 0, &pLock);
2dae0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
2daf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2db00 43 4f 52 52 55 50 54 20 7c 7c 20 72 63 3d 3d 53  CORRUPT || rc==S
2db10 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 29 7b 0a  QLITE_NOTADB ){.
2db20 20 20 20 20 20 20 69 73 43 6f 72 72 75 70 74 20        isCorrupt 
2db30 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 1;.      rc = 
2db40 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65  sqlite3demo_supe
2db50 72 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 69 64  rlock_corrupt(id
2db60 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58  , SQLITE_LOCK_EX
2db70 43 4c 55 53 49 56 45 2c 0a 20 20 20 20 20 20 20  CLUSIVE,.       
2db80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dba0 20 20 26 63 6f 72 72 75 70 74 46 69 6c 65 4c 6f    &corruptFileLo
2dbb0 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ck);.    }.    i
2dbc0 66 28 20 72 63 20 26 26 20 21 66 6f 72 63 65 20  f( rc && !force 
2dbd0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2dbe0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
2dbf0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a   = SQLITE_OK; /*
2dc00 20 49 67 6e 6f 72 65 20 74 68 65 20 6c 6f 63 6b   Ignore the lock
2dc10 69 6e 67 20 66 61 69 6c 75 72 65 20 69 66 20 66  ing failure if f
2dc20 6f 72 63 65 20 69 73 20 74 72 75 65 20 2a 2f 0a  orce is true */.
2dc30 20 20 7d 0a 20 20 69 66 28 20 28 62 46 6c 61 67    }.  if( (bFlag
2dc40 73 26 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54  s&SQLITE_TRUNCAT
2dc50 45 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 48 45 41  E_INITIALIZE_HEA
2dc60 44 45 52 5f 4d 41 53 4b 29 21 3d 30 20 29 7b 0a  DER_MASK)!=0 ){.
2dc70 20 20 20 20 2f 2a 20 69 6e 69 74 69 61 6c 69 7a      /* initializ
2dc80 65 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  e a new database
2dc90 20 69 6e 20 54 4d 50 44 49 52 20 61 6e 64 20 63   in TMPDIR and c
2dca0 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
2dcb0 20 6f 76 65 72 20 2a 2f 0a 20 20 20 20 63 6f 6e   over */.    con
2dcc0 73 74 20 63 68 61 72 20 2a 74 44 69 72 20 3d 20  st char *tDir = 
2dcd0 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28  unixTempFileDir(
2dce0 29 3b 0a 20 20 20 20 69 6e 74 20 74 44 69 72 4c  );.    int tDirL
2dcf0 65 6e 20 3d 20 73 74 72 6c 65 6e 28 74 44 69 72  en = strlen(tDir
2dd00 29 3b 0a 20 20 20 20 69 6e 74 20 74 4c 65 6e 20  );.    int tLen 
2dd10 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 29 20 2a  = sizeof(char) *
2dd20 20 28 74 44 69 72 4c 65 6e 20 2b 20 31 32 29 3b   (tDirLen + 12);
2dd30 0a 20 20 20 20 63 68 61 72 20 2a 74 44 62 50 61  .    char *tDbPa
2dd40 74 68 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c  th = (char *)mal
2dd50 6c 6f 63 28 74 4c 65 6e 29 3b 0a 20 20 20 20 69  loc(tLen);.    i
2dd60 6e 74 20 74 46 64 20 3d 20 2d 31 3b 0a 20 20 20  nt tFd = -1;.   
2dd70 20 0a 20 20 20 20 73 74 72 6c 63 70 79 28 74 44   .    strlcpy(tD
2dd80 62 50 61 74 68 2c 20 74 44 69 72 2c 20 74 4c 65  bPath, tDir, tLe
2dd90 6e 29 3b 0a 20 20 20 20 69 66 28 20 74 44 62 50  n);.    if( tDbP
2dda0 61 74 68 5b 28 74 44 69 72 4c 65 6e 2d 31 29 5d  ath[(tDirLen-1)]
2ddb0 20 21 3d 20 27 2f 27 20 29 7b 0a 20 20 20 20 20   != '/' ){.     
2ddc0 20 73 74 72 6c 63 61 74 28 74 44 62 50 61 74 68   strlcat(tDbPath
2ddd0 2c 20 22 2f 74 6d 70 64 62 58 58 58 58 58 22 2c  , "/tmpdbXXXXX",
2dde0 20 74 4c 65 6e 29 3b 0a 20 20 20 20 7d 20 65 6c   tLen);.    } el
2ddf0 73 65 20 7b 0a 20 20 20 20 20 20 73 74 72 6c 63  se {.      strlc
2de00 61 74 28 74 44 62 50 61 74 68 2c 20 22 74 6d 70  at(tDbPath, "tmp
2de10 64 62 58 58 58 58 58 22 2c 20 74 4c 65 6e 29 3b  dbXXXXX", tLen);
2de20 0a 20 20 20 20 7d 0a 20 20 20 20 74 46 64 20 3d  .    }.    tFd =
2de30 20 6d 6b 73 74 65 6d 70 28 74 44 62 50 61 74 68   mkstemp(tDbPath
2de40 29 3b 0a 20 20 20 20 69 66 28 20 74 46 64 3d 3d  );.    if( tFd==
2de50 2d 31 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  -1 ){.      stor
2de60 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
2de70 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
2de80 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
2de90 52 3b 0a 20 20 20 20 20 20 73 61 66 65 46 61 69  R;.      safeFai
2dea0 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  led = 1;.    }el
2deb0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
2dec0 33 20 2a 74 44 62 20 3d 20 4e 55 4c 4c 3b 0a 20  3 *tDb = NULL;. 
2ded0 20 20 20 20 20 63 6f 70 79 66 69 6c 65 5f 73 74       copyfile_st
2dee0 61 74 65 5f 74 20 73 3b 0a 20 20 20 20 20 20 69  ate_t s;.      i
2def0 6e 74 20 74 72 63 20 3d 20 73 71 6c 69 74 65 33  nt trc = sqlite3
2df00 5f 6f 70 65 6e 5f 76 32 28 74 44 62 50 61 74 68  _open_v2(tDbPath
2df10 2c 20 26 74 44 62 2c 0a 20 20 20 20 20 20 20 20  , &tDb,.        
2df20 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49             (SQLI
2df30 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
2df40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
2df50 44 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 20  DWRITE.         
2df60 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
2df70 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50  QLITE_OPEN_AUTOP
2df80 52 4f 58 59 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20  ROXY), NULL);.  
2df90 20 20 20 20 63 68 61 72 20 2a 65 72 72 6d 73 67      char *errmsg
2dfa0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 63   = NULL;.      c
2dfb0 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 20 3d  onst char *sql =
2dfc0 20 22 22 3b 0a 20 20 20 20 20 20 69 66 28 20 21   "";.      if( !
2dfd0 74 72 63 20 26 26 20 28 62 46 6c 61 67 73 26 53  trc && (bFlags&S
2dfe0 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 50  QLITE_TRUNCATE_P
2dff0 41 47 45 53 49 5a 45 5f 4d 41 53 4b 29 20 29 7b  AGESIZE_MASK) ){
2e000 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
2e010 68 61 72 20 70 61 67 65 73 69 7a 65 5f 73 71 6c  har pagesize_sql
2e020 5b 34 5d 5b 32 32 5d 20 3d 20 7b 0a 20 20 20 20  [4][22] = {.    
2e030 20 20 20 20 20 20 22 70 72 61 67 6d 61 20 70 61        "pragma pa
2e040 67 65 5f 73 69 7a 65 3d 31 30 32 34 22 2c 0a 20  ge_size=1024",. 
2e050 20 20 20 20 20 20 20 20 20 22 70 72 61 67 6d 61           "pragma
2e060 20 70 61 67 65 5f 73 69 7a 65 3d 32 30 34 38 22   page_size=2048"
2e070 2c 0a 20 20 20 20 20 20 20 20 20 20 22 70 72 61  ,.          "pra
2e080 67 6d 61 20 70 61 67 65 5f 73 69 7a 65 3d 34 30  gma page_size=40
2e090 39 36 22 2c 0a 20 20 20 20 20 20 20 20 20 20 22  96",.          "
2e0a0 70 72 61 67 6d 61 20 70 61 67 65 5f 73 69 7a 65  pragma page_size
2e0b0 3d 38 31 39 32 22 20 0a 20 20 20 20 20 20 20 20  =8192" .        
2e0c0 7d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  };.        int i
2e0d0 50 61 67 65 73 69 7a 65 20 3d 20 28 28 28 62 46  Pagesize = (((bF
2e0e0 6c 61 67 73 26 53 51 4c 49 54 45 5f 54 52 55 4e  lags&SQLITE_TRUN
2e0f0 43 41 54 45 5f 50 41 47 45 53 49 5a 45 5f 4d 41  CATE_PAGESIZE_MA
2e100 53 4b 29 20 3e 3e 20 34 29 20 2d 20 31 29 3b 0a  SK) >> 4) - 1);.
2e110 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2e120 69 50 61 67 65 73 69 7a 65 3e 3d 30 20 26 26 20  iPagesize>=0 && 
2e130 69 50 61 67 65 73 69 7a 65 3c 3d 34 20 29 3b 0a  iPagesize<=4 );.
2e140 20 20 20 20 20 20 20 20 73 71 6c 20 3d 20 70 61          sql = pa
2e150 67 65 73 69 7a 65 5f 73 71 6c 5b 69 50 61 67 65  gesize_sql[iPage
2e160 73 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20 74  size];.        t
2e170 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
2e180 63 28 74 44 62 2c 20 73 71 6c 2c 20 30 2c 20 30  c(tDb, sql, 0, 0
2e190 2c 20 26 65 72 72 6d 73 67 29 3b 0a 20 20 20 20  , &errmsg);.    
2e1a0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 74    }.      if( !t
2e1b0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  rc ){.        co
2e1c0 6e 73 74 20 63 68 61 72 20 61 75 74 6f 76 61 63  nst char autovac
2e1d0 75 75 6d 5f 73 71 6c 5b 33 5d 5b 32 31 5d 20 3d  uum_sql[3][21] =
2e1e0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 22 70 72   {.          "pr
2e1f0 61 67 6d 61 20 61 75 74 6f 5f 76 61 63 75 75 6d  agma auto_vacuum
2e200 3d 30 22 2c 0a 20 20 20 20 20 20 20 20 20 20 22  =0",.          "
2e210 70 72 61 67 6d 61 20 61 75 74 6f 5f 76 61 63 75  pragma auto_vacu
2e220 75 6d 3d 31 22 2c 0a 20 20 20 20 20 20 20 20 20  um=1",.         
2e230 20 22 70 72 61 67 6d 61 20 61 75 74 6f 5f 76 61   "pragma auto_va
2e240 63 75 75 6d 3d 32 22 0a 20 20 20 20 20 20 20 20  cuum=2".        
2e250 7d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  };.        int i
2e260 41 75 74 6f 76 61 63 75 75 6d 20 3d 20 32 3b 20  Autovacuum = 2; 
2e270 2f 2a 20 64 65 66 61 75 6c 74 20 74 6f 20 69 6e  /* default to in
2e280 63 72 65 6d 65 6e 74 61 6c 20 2a 2f 0a 20 20 20  cremental */.   
2e290 20 20 20 20 20 69 66 28 20 28 62 46 6c 61 67 73       if( (bFlags
2e2a0 26 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45  &SQLITE_TRUNCATE
2e2b0 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4d 41 53 4b  _AUTOVACUUM_MASK
2e2c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ) ){.          i
2e2d0 41 75 74 6f 76 61 63 75 75 6d 20 3d 20 28 28 28  Autovacuum = (((
2e2e0 62 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 54 52  bFlags&SQLITE_TR
2e2f0 55 4e 43 41 54 45 5f 41 55 54 4f 56 41 43 55 55  UNCATE_AUTOVACUU
2e300 4d 5f 4d 41 53 4b 29 20 3e 3e 20 32 29 20 2d 20  M_MASK) >> 2) - 
2e310 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
2e320 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 41        assert( iA
2e330 75 74 6f 76 61 63 75 75 6d 3e 3d 30 20 26 26 20  utovacuum>=0 && 
2e340 69 41 75 74 6f 76 61 63 75 75 6d 3c 3d 32 20 29  iAutovacuum<=2 )
2e350 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 20 3d 20  ;.        sql = 
2e360 61 75 74 6f 76 61 63 75 75 6d 5f 73 71 6c 5b 69  autovacuum_sql[i
2e370 41 75 74 6f 76 61 63 75 75 6d 5d 3b 0a 20 20 20  Autovacuum];.   
2e380 20 20 20 20 20 74 72 63 20 3d 20 73 71 6c 69 74       trc = sqlit
2e390 65 33 5f 65 78 65 63 28 74 44 62 2c 20 73 71 6c  e3_exec(tDb, sql
2e3a0 2c 20 30 2c 20 30 2c 20 26 65 72 72 6d 73 67 29  , 0, 0, &errmsg)
2e3b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2e3c0 69 66 28 20 21 74 72 63 20 26 26 20 28 62 46 6c  if( !trc && (bFl
2e3d0 61 67 73 26 53 51 4c 49 54 45 5f 54 52 55 4e 43  ags&SQLITE_TRUNC
2e3e0 41 54 45 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  ATE_JOURNALMODE_
2e3f0 57 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  WAL) ){.        
2e400 73 71 6c 20 3d 20 22 70 72 61 67 6d 61 20 6a 6f  sql = "pragma jo
2e410 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 3b  urnal_mode=wal";
2e420 0a 20 20 20 20 20 20 20 20 74 72 63 20 3d 20 73  .        trc = s
2e430 71 6c 69 74 65 33 5f 65 78 65 63 28 74 44 62 2c  qlite3_exec(tDb,
2e440 20 73 71 6c 2c 20 30 2c 20 30 2c 20 26 65 72 72   sql, 0, 0, &err
2e450 6d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  msg);.      }.  
2e460 20 20 20 20 69 66 28 20 74 72 63 20 29 7b 0a 20      if( trc ){. 
2e470 20 20 20 20 20 20 20 69 66 28 20 21 74 44 62 20         if( !tDb 
2e480 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72  ){.          fpr
2e490 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 61  intf(stderr, "fa
2e4a0 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 65 6d  iled to open tem
2e4b0 70 20 64 61 74 61 62 61 73 65 20 27 25 73 27 20  p database '%s' 
2e4c0 74 6f 20 72 65 73 65 74 20 22 0a 20 20 20 20 20  to reset ".     
2e4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e4e0 20 20 20 20 20 22 74 72 75 6e 63 61 74 65 64 20       "truncated 
2e4f0 64 61 74 61 62 61 73 65 20 25 73 20 77 69 74 68  database %s with
2e500 20 66 6c 61 67 73 20 25 78 3a 20 25 64 5c 6e 22   flags %x: %d\n"
2e510 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e520 20 20 20 20 20 20 20 20 20 20 20 20 20 74 44 62               tDb
2e530 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  Path, pFile->zPa
2e540 74 68 2c 20 62 46 6c 61 67 73 2c 20 74 72 63 29  th, bFlags, trc)
2e550 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2e560 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
2e570 74 66 28 73 74 64 65 72 72 2c 20 22 66 61 69 6c  tf(stderr, "fail
2e580 65 64 20 74 6f 20 73 65 74 20 27 25 73 27 20 6f  ed to set '%s' o
2e590 6e 20 74 72 75 6e 63 61 74 65 64 20 64 61 74 61  n truncated data
2e5a0 62 61 73 65 20 25 73 2c 20 25 64 3a 20 22 0a 20  base %s, %d: ". 
2e5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e5c0 20 20 20 20 20 20 20 20 20 22 25 73 5c 6e 22 2c           "%s\n",
2e5d0 20 73 71 6c 2c 20 70 46 69 6c 65 2d 3e 7a 50 61   sql, pFile->zPa
2e5e0 74 68 2c 20 74 72 63 2c 20 65 72 72 6d 73 67 29  th, trc, errmsg)
2e5f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2e600 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 74 44    }.      if( tD
2e610 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  b ){.        int
2e620 20 6f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20   off = 0;.      
2e630 20 20 2f 2a 20 6d 65 72 67 65 20 74 68 65 20 77    /* merge the w
2e640 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 62 20 2a  al into the db *
2e650 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
2e660 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 74  3_file_control(t
2e670 44 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45  Db, NULL, SQLITE
2e680 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57  _FCNTL_PERSIST_W
2e690 41 4c 2c 20 26 6f 66 66 29 3b 0a 20 20 20 20 20  AL, &off);.     
2e6a0 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
2e6b0 28 74 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (tDb);.      }. 
2e6c0 20 20 20 20 20 73 20 3d 20 63 6f 70 79 66 69 6c       s = copyfil
2e6d0 65 5f 73 74 61 74 65 5f 61 6c 6c 6f 63 28 29 3b  e_state_alloc();
2e6e0 0a 20 20 20 20 20 20 6c 73 65 65 6b 28 74 46 64  .      lseek(tFd
2e6f0 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a  , 0, SEEK_SET);.
2e700 20 20 20 20 20 20 6c 73 65 65 6b 28 70 46 69 6c        lseek(pFil
2e710 65 2d 3e 68 2c 20 30 2c 20 53 45 45 4b 5f 53 45  e->h, 0, SEEK_SE
2e720 54 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63  T);.      if( fc
2e730 6f 70 79 66 69 6c 65 28 74 46 64 2c 20 70 46 69  opyfile(tFd, pFi
2e740 6c 65 2d 3e 68 2c 20 73 2c 20 43 4f 50 59 46 49  le->h, s, COPYFI
2e750 4c 45 5f 44 41 54 41 29 20 29 7b 0a 20 20 20 20  LE_DATA) ){.    
2e760 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e      int err=errn
2e770 6f 3b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63  o;.        switc
2e780 68 28 65 72 72 29 20 7b 0a 20 20 20 20 20 20 20  h(err) {.       
2e790 20 20 20 63 61 73 65 20 45 4e 4f 4d 45 4d 3a 0a     case ENOMEM:.
2e7a0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 63 20              trc 
2e7b0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2e7c0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2e7d0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 64 65 66  k;.          def
2e7e0 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20  ault:.          
2e7f0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
2e800 28 70 46 69 6c 65 2c 20 65 72 72 29 3b 0a 20 20  (pFile, err);.  
2e810 20 20 20 20 20 20 20 20 20 20 74 72 63 20 3d 20            trc = 
2e820 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
2e830 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2e840 20 20 20 20 20 20 63 6f 70 79 66 69 6c 65 5f 73        copyfile_s
2e850 74 61 74 65 5f 66 72 65 65 28 73 29 3b 0a 20 20  tate_free(s);.  
2e860 20 20 20 20 66 73 79 6e 63 28 70 46 69 6c 65 2d      fsync(pFile-
2e870 3e 68 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65  >h);.      close
2e880 28 74 46 64 29 3b 0a 20 20 20 20 20 20 75 6e 6c  (tFd);.      unl
2e890 69 6e 6b 28 74 44 62 50 61 74 68 29 3b 0a 20 20  ink(tDbPath);.  
2e8a0 20 20 20 20 69 66 28 20 74 72 63 21 3d 53 51 4c      if( trc!=SQL
2e8b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e8c0 20 20 73 61 66 65 46 61 69 6c 65 64 20 3d 20 31    safeFailed = 1
2e8d0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 74  ;.        rc = t
2e8e0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
2e8f0 7d 0a 20 20 20 20 66 72 65 65 28 74 44 62 50 61  }.    free(tDbPa
2e900 74 68 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  th);.  } else {.
2e910 20 20 20 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e      rc = pFile->
2e920 70 4d 65 74 68 6f 64 2d 3e 78 54 72 75 6e 63 61  pMethod->xTrunca
2e930 74 65 28 69 64 2c 20 0a 20 20 20 20 20 20 20 20  te(id, .        
2e940 20 20 20 28 28 70 46 69 6c 65 2d 3e 66 73 46 6c     ((pFile->fsFl
2e950 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 53 46  ags & SQLITE_FSF
2e960 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29 20 21  LAGS_IS_MSDOS) !
2e970 3d 20 30 29 20 3f 20 31 4c 20 3a 20 30 4c 29 3b  = 0) ? 1L : 0L);
2e980 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
2e990 20 20 20 20 20 73 61 66 65 46 61 69 6c 65 64 20       safeFailed 
2e9a0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
2e9b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2e9c0 4f 4b 20 7c 7c 20 66 6f 72 63 65 20 29 7b 0a 20  OK || force ){. 
2e9d0 20 20 20 72 63 20 3d 20 75 6e 69 78 49 6e 76 61     rc = unixInva
2e9e0 6c 69 64 61 74 65 53 75 70 70 6f 72 74 46 69 6c  lidateSupportFil
2e9f0 65 73 28 70 46 69 6c 65 2c 20 30 29 3b 0a 20 20  es(pFile, 0);.  
2ea00 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2ea10 20 20 73 61 66 65 46 61 69 6c 65 64 20 3d 20 31    safeFailed = 1
2ea20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46  ;.    }.  }.  pF
2ea30 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 53  ile->pMethod->xS
2ea40 79 6e 63 28 69 64 2c 20 53 51 4c 49 54 45 5f 53  ync(id, SQLITE_S
2ea50 59 4e 43 5f 46 55 4c 4c 29 3b 0a 0a 0a 20 20 69  YNC_FULL);...  i
2ea60 66 28 20 69 73 43 6f 72 72 75 70 74 20 29 7b 0a  f( isCorrupt ){.
2ea70 20 20 20 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f      sqlite3demo_
2ea80 73 75 70 65 72 75 6e 6c 6f 63 6b 5f 63 6f 72 72  superunlock_corr
2ea90 75 70 74 28 69 64 2c 20 63 6f 72 72 75 70 74 46  upt(id, corruptF
2eaa0 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 7d 65 6c 73  ileLock);.  }els
2eab0 65 20 69 66 28 20 70 4c 6f 63 6b 20 29 7b 0a 20  e if( pLock ){. 
2eac0 20 20 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73     sqlite3demo_s
2ead0 75 70 65 72 75 6e 6c 6f 63 6b 28 70 4c 6f 63 6b  uperunlock(pLock
2eae0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2eaf0 61 73 73 65 72 74 28 66 6f 72 63 65 29 3b 0a 20  assert(force);. 
2eb00 20 7d 0a 20 20 0a 20 20 69 66 28 20 66 6f 72 63   }.  .  if( forc
2eb10 65 20 26 26 20 73 61 66 65 46 61 69 6c 65 64 29  e && safeFailed)
2eb20 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 55  {.    rc = unixU
2eb30 6e 73 61 66 65 54 72 75 6e 63 61 74 65 44 61 74  nsafeTruncateDat
2eb40 61 62 61 73 65 28 70 46 69 6c 65 29 3b 0a 20 20  abase(pFile);.  
2eb50 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63  }.  .  return rc
2eb60 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 4c 6f 63 6b  ;.}../*. ** Lock
2eb70 20 6c 6f 63 61 74 69 6f 6e 73 20 66 6f 72 20 73   locations for s
2eb80 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6c 6f 63  hared-memory loc
2eb90 6b 73 20 75 73 65 64 20 62 79 20 57 41 4c 20 6d  ks used by WAL m
2eba0 6f 64 65 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ode.. */.#ifndef
2ebb0 20 53 48 4d 5f 42 41 53 45 0a 23 20 64 65 66 69   SHM_BASE.# defi
2ebc0 6e 65 20 53 48 4d 5f 42 41 53 45 20 20 20 20 20  ne SHM_BASE     
2ebd0 20 20 20 20 20 31 32 30 0a 23 20 64 65 66 69 6e       120.# defin
2ebe0 65 20 53 48 4d 5f 57 52 49 54 45 20 20 20 20 20  e SHM_WRITE     
2ebf0 20 20 20 20 53 48 4d 5f 42 41 53 45 0a 23 20 64      SHM_BASE.# d
2ec00 65 66 69 6e 65 20 53 48 4d 5f 43 48 45 43 4b 50  efine SHM_CHECKP
2ec10 4f 49 4e 54 20 20 20 20 28 53 48 4d 5f 42 41 53  OINT    (SHM_BAS
2ec20 45 2b 31 29 0a 23 20 64 65 66 69 6e 65 20 53 48  E+1).# define SH
2ec30 4d 5f 52 45 43 4f 56 45 52 20 20 20 20 20 20 20  M_RECOVER       
2ec40 28 53 48 4d 5f 42 41 53 45 2b 32 29 0a 23 20 64  (SHM_BASE+2).# d
2ec50 65 66 69 6e 65 20 53 48 4d 5f 52 45 41 44 5f 46  efine SHM_READ_F
2ec60 49 52 53 54 20 20 20 20 28 53 48 4d 5f 42 41 53  IRST    (SHM_BAS
2ec70 45 2b 33 29 0a 23 20 64 65 66 69 6e 65 20 53 48  E+3).# define SH
2ec80 4d 5f 52 45 41 44 5f 53 49 5a 45 20 20 20 20 20  M_READ_SIZE     
2ec90 35 0a 23 65 6e 64 69 66 20 2f 2a 20 53 48 4d 5f  5.#endif /* SHM_
2eca0 42 41 53 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  BASE */../*.** T
2ecb0 68 69 73 20 74 65 73 74 20 6f 6e 6c 79 20 77 6f  his test only wo
2ecc0 72 6b 73 20 66 6f 72 20 6c 6f 63 6b 20 74 65 73  rks for lock tes
2ecd0 74 69 6e 67 20 6f 6e 20 75 6e 69 78 2f 70 6f 73  ting on unix/pos
2ece0 69 78 20 56 46 53 2e 0a 2a 2a 20 41 64 61 70 74  ix VFS..** Adapt
2ecf0 65 64 20 66 72 6f 6d 20 74 6f 6f 6c 2f 67 65 74  ed from tool/get
2ed00 6c 6f 63 6b 2e 63 20 66 34 63 33 39 62 36 35 31  lock.c f4c39b651
2ed10 33 37 30 31 35 36 63 61 65 39 37 39 35 30 31 61  370156cae979501a
2ed20 37 62 31 35 36 62 64 62 61 35 30 65 37 63 65 0a  7b156bdba50e7ce.
2ed30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
2ed40 69 78 4c 6f 63 6b 73 74 61 74 65 50 69 64 28 75  ixLockstatePid(u
2ed50 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
2ed60 70 69 64 5f 74 20 70 69 64 2c 20 69 6e 74 20 2a  pid_t pid, int *
2ed70 70 4c 6f 63 6b 73 74 61 74 65 29 7b 0a 20 20 69  pLockstate){.  i
2ed80 6e 74 20 68 44 62 3b 20 20 20 20 20 20 20 20 2f  nt hDb;        /
2ed90 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
2eda0 72 20 66 6f 72 20 74 68 65 20 6f 70 65 6e 20 64  r for the open d
2edb0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2edc0 20 20 69 6e 74 20 68 53 68 6d 20 3d 20 2d 31 3b    int hShm = -1;
2edd0 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
2ede0 70 74 6f 72 20 66 6f 72 20 57 41 4c 20 73 68 61  ptor for WAL sha
2edf0 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20  red-memory file 
2ee00 2a 2f 0a 20 20 73 73 69 7a 65 5f 74 20 67 6f 74  */.  ssize_t got
2ee10 3b 20 20 20 20 2f 2a 20 42 79 74 65 73 20 72 65  ;    /* Bytes re
2ee20 61 64 20 66 72 6f 6d 20 68 65 61 64 65 72 20 2a  ad from header *
2ee30 2f 0a 20 20 69 6e 74 20 69 73 57 61 6c 20 3d 20  /.  int isWal = 
2ee40 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2ee50 2a 20 54 72 75 65 20 69 66 20 69 6e 20 57 41 4c  * True if in WAL
2ee60 20 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   mode */.  int n
2ee70 4c 6f 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  Lock = 0;       
2ee80 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2ee90 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  of locks held */
2eea0 0a 20 20 69 6e 74 20 6e 6f 48 64 72 20 3d 20 30  .  int noHdr = 0
2eeb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2eec0 20 5a 65 72 6f 20 62 79 74 65 20 44 42 20 68 61   Zero byte DB ha
2eed0 73 20 6e 6f 20 68 65 61 64 65 72 20 2a 2f 0a 20  s no header */. 
2eee0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
2eef0 48 64 72 5b 31 30 30 5d 3b 20 20 20 2f 2a 20 44  Hdr[100];   /* D
2ef00 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20 2a  atabase header *
2ef10 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 70 4c  /.  .  assert(pL
2ef20 6f 63 6b 73 74 61 74 65 29 3b 0a 20 20 0a 20 20  ockstate);.  .  
2ef30 2f 2a 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20  /* make sure we 
2ef40 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
2ef50 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
2ef60 20 2a 2f 0a 20 20 68 44 62 20 3d 20 70 46 69 6c   */.  hDb = pFil
2ef70 65 2d 3e 68 3b 0a 20 20 69 66 28 20 68 44 62 3c  e->h;.  if( hDb<
2ef80 30 20 29 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b 73  0 ){.    *pLocks
2ef90 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c 4f  tate = SQLITE_LO
2efa0 43 4b 53 54 41 54 45 5f 45 52 52 4f 52 3b 0a 20  CKSTATE_ERROR;. 
2efb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2efc0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73  _ERROR;.  }.  as
2efd0 73 65 72 74 28 20 28 73 74 72 6c 65 6e 28 53 51  sert( (strlen(SQ
2efe0 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52  LITE_FILE_HEADER
2eff0 29 2b 31 29 3d 3d 53 51 4c 49 54 45 5f 46 49 4c  )+1)==SQLITE_FIL
2f000 45 5f 48 45 41 44 45 52 5f 4c 45 4e 20 29 3b 0a  E_HEADER_LEN );.
2f010 20 20 67 6f 74 20 3d 20 70 72 65 61 64 28 68 44    got = pread(hD
2f020 62 2c 20 61 48 64 72 2c 20 31 30 30 2c 20 30 29  b, aHdr, 100, 0)
2f030 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b  ;.  if( got<0 ){
2f040 0a 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61 74 65  .    *pLockstate
2f050 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54   = SQLITE_LOCKST
2f060 41 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72  ATE_ERROR;.    r
2f070 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2f080 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 6f  OR;.  }.  if( go
2f090 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 6f 48 64  t==0 ){.    noHd
2f0a0 72 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  r = 1;.  }else i
2f0b0 66 28 20 67 6f 74 21 3d 31 30 30 0a 20 20 20 20  f( got!=100.    
2f0c0 20 20 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61       || memcmp(a
2f0d0 48 64 72 2c 20 53 51 4c 49 54 45 5f 46 49 4c 45  Hdr, SQLITE_FILE
2f0e0 5f 48 45 41 44 45 52 2c 20 53 51 4c 49 54 45 5f  _HEADER, SQLITE_
2f0f0 46 49 4c 45 5f 48 45 41 44 45 52 5f 4c 45 4e 29  FILE_HEADER_LEN)
2f100 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2a 70 4c  !=0.  ){.    *pL
2f110 6f 63 6b 73 74 61 74 65 20 3d 20 53 51 4c 49 54  ockstate = SQLIT
2f120 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4e 4f 54 41  E_LOCKSTATE_NOTA
2f130 44 42 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  DB;.    return S
2f140 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
2f150 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 72 73 74 20  }.  .  /* First 
2f160 63 68 65 63 6b 20 66 6f 72 20 61 6e 20 65 78 63  check for an exc
2f170 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
2f180 20 6e 4c 6f 63 6b 20 2b 3d 20 75 6e 69 78 49 73   nLock += unixIs
2f190 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 44 62 2c  Locked(pid, hDb,
2f1a0 20 46 5f 52 44 4c 43 4b 2c 20 53 48 41 52 45 44   F_RDLCK, SHARED
2f1b0 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53  _FIRST, SHARED_S
2f1c0 49 5a 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  IZE,.           
2f1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 45 58               "EX
2f1e0 43 4c 55 53 49 56 45 22 29 3b 0a 20 20 69 66 20  CLUSIVE");.  if 
2f1f0 28 21 6e 6f 48 64 72 29 20 7b 0a 20 20 20 20 69  (!noHdr) {.    i
2f200 73 57 61 6c 20 3d 20 61 48 64 72 5b 31 38 5d 3d  sWal = aHdr[18]=
2f210 3d 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c  =2;.  }.  if( nL
2f220 6f 63 6b 3d 3d 30 20 26 26 20 69 73 57 61 6c 3d  ock==0 && isWal=
2f230 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 52 6f 6c  =0 ){.    /* Rol
2f240 6c 62 61 63 6b 20 6d 6f 64 65 20 2a 2f 0a 20 20  lback mode */.  
2f250 20 20 6e 4c 6f 63 6b 20 2b 3d 20 75 6e 69 78 49    nLock += unixI
2f260 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 44 62  sLocked(pid, hDb
2f270 2c 20 46 5f 57 52 4c 43 4b 2c 20 50 45 4e 44 49  , F_WRLCK, PENDI
2f280 4e 47 5f 42 59 54 45 2c 20 53 48 41 52 45 44 5f  NG_BYTE, SHARED_
2f290 53 49 5a 45 2b 32 2c 0a 20 20 20 20 20 20 20 20  SIZE+2,.        
2f2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f2b0 20 20 22 50 45 4e 44 49 4e 47 7c 52 45 53 45 52    "PENDING|RESER
2f2c0 56 45 44 7c 53 48 41 52 45 44 22 29 3b 0a 20 20  VED|SHARED");.  
2f2d0 7d 0a 20 20 69 66 28 20 6e 4c 6f 63 6b 3d 3d 30  }.  if( nLock==0
2f2e0 20 26 26 20 69 73 57 61 6c 21 3d 30 20 29 7b 0a   && isWal!=0 ){.
2f2f0 20 20 20 20 2f 2a 20 6c 6f 6f 6b 75 70 20 74 68      /* lookup th
2f300 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2f310 72 20 66 6f 72 20 74 68 65 20 73 68 61 72 65 64  r for the shared
2f320 20 6d 65 6d 6f 72 79 20 66 69 6c 65 20 69 66 20   memory file if 
2f330 77 65 20 68 61 76 65 20 69 74 20 6f 70 65 6e 0a  we have it open.
2f340 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 70      ** in this p
2f350 72 6f 63 65 73 73 20 2a 2f 0a 20 20 20 20 75 6e  rocess */.    un
2f360 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20  ixEnterMutex(); 
2f370 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65  /* Because pFile
2f380 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
2f390 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
2f3a0 73 20 2a 2f 0a 20 20 20 20 75 6e 69 78 53 68 6d  s */.    unixShm
2f3b0 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d  Node *pShmNode =
2f3c0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
2f3d0 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 69 66  pShmNode;.    if
2f3e0 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20  ( pShmNode ){.  
2f3f0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
2f400 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
2f410 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
2f420 0a 20 20 20 20 20 20 68 53 68 6d 20 3d 20 70 53  .      hShm = pS
2f430 68 6d 4e 6f 64 65 2d 3e 68 3b 0a 20 20 20 20 20  hmNode->h;.     
2f440 20 69 66 28 20 68 53 68 6d 20 3e 3d 20 30 29 7b   if( hShm >= 0){
2f450 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69  .        if( uni
2f460 78 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68  xIsLocked(pid, h
2f470 53 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48  Shm, F_RDLCK, SH
2f480 4d 5f 52 45 43 4f 56 45 52 2c 20 31 2c 20 22 57  M_RECOVER, 1, "W
2f490 41 4c 2d 52 45 43 4f 56 45 52 59 22 29 20 7c 7c  AL-RECOVERY") ||
2f4a0 0a 20 20 20 20 20 20 20 20 20 20 20 75 6e 69 78  .           unix
2f4b0 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 53  IsLocked(pid, hS
2f4c0 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48 4d  hm, F_RDLCK, SHM
2f4d0 5f 57 52 49 54 45 2c 20 31 2c 20 22 57 41 4c 2d  _WRITE, 1, "WAL-
2f4e0 57 52 49 54 45 22 29 20 29 7b 0a 20 20 20 20 20  WRITE") ){.     
2f4f0 20 20 20 20 20 6e 4c 6f 63 6b 20 3d 20 31 3b 0a       nLock = 1;.
2f500 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f510 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 73  }.      .      s
2f520 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
2f530 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
2f540 65 78 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20  ex);.    } .    
2f550 0a 20 20 20 20 69 66 28 20 68 53 68 6d 3c 30 20  .    if( hShm<0 
2f560 29 7b 0a 20 20 20 20 20 20 2f 2a 20 74 68 65 20  ){.      /* the 
2f570 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 66 69  shared memory fi
2f580 6c 65 20 69 73 6e 27 74 20 6f 70 65 6e 20 69 6e  le isn't open in
2f590 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 73 70   this process sp
2f5a0 61 63 65 2c 20 6f 70 65 6e 20 6f 75 72 0a 20 20  ace, open our.  
2f5b0 20 20 20 20 2a 2a 20 6f 77 6e 20 46 44 20 2a 2f      ** own FD */
2f5c0 0a 20 20 20 20 20 20 63 68 61 72 20 7a 53 68 6d  .      char zShm
2f5d0 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20  [MAXPATHLEN];.  
2f5e0 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 57 41      .      /* WA
2f5f0 4c 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  L mode */.      
2f600 73 74 72 6c 63 70 79 28 7a 53 68 6d 2c 20 70 46  strlcpy(zShm, pF
2f610 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58 50  ile->zPath, MAXP
2f620 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 73  ATHLEN);.      s
2f630 74 72 6c 63 61 74 28 7a 53 68 6d 2c 20 22 2d 73  trlcat(zShm, "-s
2f640 68 6d 22 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  hm", MAXPATHLEN)
2f650 3b 0a 20 20 20 20 20 20 68 53 68 6d 20 3d 20 6f  ;.      hShm = o
2f660 70 65 6e 28 7a 53 68 6d 2c 20 4f 5f 52 44 4f 4e  pen(zShm, O_RDON
2f670 4c 59 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  LY, 0);.      if
2f680 28 20 68 53 68 6d 3c 30 20 29 7b 0a 20 20 20 20  ( hShm<0 ){.    
2f690 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61 74 65 20      *pLockstate 
2f6a0 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41  = SQLITE_LOCKSTA
2f6b0 54 45 5f 4f 46 46 3b 0a 20 20 20 20 20 20 20 20  TE_OFF;.        
2f6c0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
2f6d0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2f6e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2f6f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 75 6e    }.      if( un
2f700 69 78 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20  ixIsLocked(pid, 
2f710 68 53 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53  hShm, F_RDLCK, S
2f720 48 4d 5f 52 45 43 4f 56 45 52 2c 20 31 2c 20 22  HM_RECOVER, 1, "
2f730 57 41 4c 2d 52 45 43 4f 56 45 52 59 22 29 20 7c  WAL-RECOVERY") |
2f740 7c 0a 20 20 20 20 20 20 20 20 20 75 6e 69 78 49  |.         unixI
2f750 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 53 68  sLocked(pid, hSh
2f760 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48 4d 5f  m, F_RDLCK, SHM_
2f770 57 52 49 54 45 2c 20 31 2c 20 22 57 41 4c 2d 57  WRITE, 1, "WAL-W
2f780 52 49 54 45 22 29 20 29 7b 0a 20 20 20 20 20 20  RITE") ){.      
2f790 20 20 6e 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20    nLock = 1;.   
2f7a0 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 6f 73 65     }.      close
2f7b0 28 68 53 68 6d 29 3b 0a 20 20 20 20 7d 0a 20 20  (hShm);.    }.  
2f7c0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
2f7d0 28 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c  ();.  }.  if( nL
2f7e0 6f 63 6b 3e 30 20 29 7b 0a 20 20 20 20 2a 70 4c  ock>0 ){.    *pL
2f7f0 6f 63 6b 73 74 61 74 65 20 3d 20 53 51 4c 49 54  ockstate = SQLIT
2f800 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4f 4e 3b 0a  E_LOCKSTATE_ON;.
2f810 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2a    } else {.    *
2f820 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53 51 4c  pLockstate = SQL
2f830 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4f 46  ITE_LOCKSTATE_OF
2f840 46 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  F;.  }.  return 
2f850 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
2f860 6e 64 69 66 20 2f 2a 20 28 53 51 4c 49 54 45 5f  ndif /* (SQLITE_
2f870 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49  ENABLE_APPLE_SPI
2f880 3e 30 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f  >0) && defined(_
2f890 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 0a 23 69  _APPLE__) */..#i
2f8a0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
2f8b0 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 49  P_SIZE>0./*.** I
2f8c0 66 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  f it is currentl
2f8d0 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2c  y memory mapped,
2f8e0 20 75 6e 6d 61 70 20 66 69 6c 65 20 70 46 64 2e   unmap file pFd.
2f8f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2f900 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e  unixUnmapfile(un
2f910 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20  ixFile *pFd){.  
2f920 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65  assert( pFd->nFe
2f930 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 69  tchOut==0 );.  i
2f940 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69  f( pFd->pMapRegi
2f950 6f 6e 20 29 7b 0a 20 20 20 20 6f 73 4d 75 6e 6d  on ){.    osMunm
2f960 61 70 28 70 46 64 2d 3e 70 4d 61 70 52 65 67 69  ap(pFd->pMapRegi
2f970 6f 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  on, pFd->mmapSiz
2f980 65 41 63 74 75 61 6c 29 3b 0a 20 20 20 20 70 46  eActual);.    pF
2f990 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20  d->pMapRegion = 
2f9a0 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70  0;.    pFd->mmap
2f9b0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46  Size = 0;.    pF
2f9c0 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d->mmapSizeActua
2f9d0 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  l = 0;.  }.}../*
2f9e0 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
2f9f0 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  et the size of t
2fa00 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e  he memory mappin
2fa10 67 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20  g maintained by 
2fa20 66 69 6c 65 20 0a 2a 2a 20 64 65 73 63 72 69 70  file .** descrip
2fa30 74 6f 72 20 70 46 64 20 74 6f 20 6e 4e 65 77 20  tor pFd to nNew 
2fa40 62 79 74 65 73 2e 20 41 6e 79 20 65 78 69 73 74  bytes. Any exist
2fa50 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20 64  ing mapping is d
2fa60 69 73 63 61 72 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  iscarded..**.** 
2fa70 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
2fa80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  his function set
2fa90 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
2faa0 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a  variables:.**.**
2fab0 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e         unixFile.
2fac0 70 4d 61 70 52 65 67 69 6f 6e 0a 2a 2a 20 20 20  pMapRegion.**   
2fad0 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61      unixFile.mma
2fae0 70 53 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 75  pSize.**       u
2faf0 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65  nixFile.mmapSize
2fb00 41 63 74 75 61 6c 0a 2a 2a 0a 2a 2a 20 49 66 20  Actual.**.** If 
2fb10 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e  unsuccessful, an
2fb20 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
2fb30 73 20 6c 6f 67 67 65 64 20 76 69 61 20 73 71 6c  s logged via sql
2fb40 69 74 65 33 5f 6c 6f 67 28 29 20 61 6e 64 0a 2a  ite3_log() and.*
2fb50 2a 20 74 68 65 20 74 68 72 65 65 20 76 61 72 69  * the three vari
2fb60 61 62 6c 65 73 20 61 62 6f 76 65 20 61 72 65 20  ables above are 
2fb70 7a 65 72 6f 65 64 2e 20 49 6e 20 74 68 69 73 20  zeroed. In this 
2fb80 63 61 73 65 20 53 51 4c 69 74 65 20 73 68 6f 75  case SQLite shou
2fb90 6c 64 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61  ld.** continue a
2fba0 63 63 65 73 73 69 6e 67 20 74 68 65 20 64 61 74  ccessing the dat
2fbb0 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65 20  abase using the 
2fbc0 78 52 65 61 64 28 29 20 61 6e 64 20 78 57 72 69  xRead() and xWri
2fbd0 74 65 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 73 2e  te().** methods.
2fbe0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2fbf0 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 0a 20  unixRemapfile(. 
2fc00 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20   unixFile *pFd, 
2fc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
2fc30 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  tor object */.  
2fc40 69 36 34 20 6e 4e 65 77 20 20 20 20 20 20 20 20  i64 nNew        
2fc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc60 2f 2a 20 52 65 71 75 69 72 65 64 20 6d 61 70 70  /* Required mapp
2fc70 69 6e 67 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20  ing size */.){. 
2fc80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
2fc90 72 20 3d 20 22 6d 6d 61 70 22 3b 0a 20 20 69 6e  r = "mmap";.  in
2fca0 74 20 68 20 3d 20 70 46 64 2d 3e 68 3b 20 20 20  t h = pFd->h;   
2fcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fcc0 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
2fcd0 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 64 62  iptor open on db
2fce0 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 70   file */.  u8 *p
2fcf0 4f 72 69 67 20 3d 20 28 75 38 20 2a 29 70 46 64  Orig = (u8 *)pFd
2fd00 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20  ->pMapRegion;   
2fd10 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  /* Pointer to cu
2fd20 72 72 65 6e 74 20 66 69 6c 65 20 6d 61 70 70 69  rrent file mappi
2fd30 6e 67 20 2a 2f 0a 20 20 69 36 34 20 6e 4f 72 69  ng */.  i64 nOri
2fd40 67 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  g = pFd->mmapSiz
2fd50 65 41 63 74 75 61 6c 3b 20 20 20 20 20 2f 2a 20  eActual;     /* 
2fd60 53 69 7a 65 20 6f 66 20 70 4f 72 69 67 20 72 65  Size of pOrig re
2fd70 67 69 6f 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f  gion in bytes */
2fd80 0a 20 20 75 38 20 2a 70 4e 65 77 20 3d 20 30 3b  .  u8 *pNew = 0;
2fd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fda0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74          /* Locat
2fdb0 69 6f 6e 20 6f 66 20 6e 65 77 20 6d 61 70 70 69  ion of new mappi
2fdc0 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ng */.  int flag
2fdd0 73 20 3d 20 50 52 4f 54 5f 52 45 41 44 3b 20 20  s = PROT_READ;  
2fde0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fdf0 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f  Flags to pass to
2fe00 20 6d 6d 61 70 28 29 20 2a 2f 0a 0a 20 20 61 73   mmap() */..  as
2fe10 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63  sert( pFd->nFetc
2fe20 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73  hOut==0 );.  ass
2fe30 65 72 74 28 20 6e 4e 65 77 3e 70 46 64 2d 3e 6d  ert( nNew>pFd->m
2fe40 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  mapSize );.  ass
2fe50 65 72 74 28 20 6e 4e 65 77 3c 3d 70 46 64 2d 3e  ert( nNew<=pFd->
2fe60 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 3b 0a 20  mmapSizeMax );. 
2fe70 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20   assert( nNew>0 
2fe80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 64  );.  assert( pFd
2fe90 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
2fea0 3e 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20  >=pFd->mmapSize 
2feb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 41 50  );.  assert( MAP
2fec0 5f 46 41 49 4c 45 44 21 3d 30 20 29 3b 0a 0a 23  _FAILED!=0 );..#
2fed0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 4d 41  ifdef SQLITE_MMA
2fee0 50 5f 52 45 41 44 57 52 49 54 45 0a 20 20 69 66  P_READWRITE.  if
2fef0 28 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67  ( (pFd->ctrlFlag
2ff00 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f  s & UNIXFILE_RDO
2ff10 4e 4c 59 29 3d 3d 30 20 29 20 66 6c 61 67 73 20  NLY)==0 ) flags 
2ff20 7c 3d 20 50 52 4f 54 5f 57 52 49 54 45 3b 0a 23  |= PROT_WRITE;.#
2ff30 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 4f 72  endif..  if( pOr
2ff40 69 67 20 29 7b 0a 23 69 66 20 48 41 56 45 5f 4d  ig ){.#if HAVE_M
2ff50 52 45 4d 41 50 0a 20 20 20 20 69 36 34 20 6e 52  REMAP.    i64 nR
2ff60 65 75 73 65 20 3d 20 70 46 64 2d 3e 6d 6d 61 70  euse = pFd->mmap
2ff70 53 69 7a 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Size;.#else.    
2ff80 63 6f 6e 73 74 20 69 6e 74 20 73 7a 53 79 73 70  const int szSysp
2ff90 61 67 65 20 3d 20 6f 73 47 65 74 70 61 67 65 73  age = osGetpages
2ffa0 69 7a 65 28 29 3b 0a 20 20 20 20 69 36 34 20 6e  ize();.    i64 n
2ffb0 52 65 75 73 65 20 3d 20 28 70 46 64 2d 3e 6d 6d  Reuse = (pFd->mm
2ffc0 61 70 53 69 7a 65 20 26 20 7e 28 73 7a 53 79 73  apSize & ~(szSys
2ffd0 70 61 67 65 2d 31 29 29 3b 0a 23 65 6e 64 69 66  page-1));.#endif
2ffe0 0a 20 20 20 20 75 38 20 2a 70 52 65 71 20 3d 20  .    u8 *pReq = 
2fff0 26 70 4f 72 69 67 5b 6e 52 65 75 73 65 5d 3b 0a  &pOrig[nReuse];.
30000 0a 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 61 6e  .    /* Unmap an
30010 79 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 65  y pages of the e
30020 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20  xisting mapping 
30030 74 68 61 74 20 63 61 6e 6e 6f 74 20 62 65 20 72  that cannot be r
30040 65 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  eused. */.    if
30050 28 20 6e 52 65 75 73 65 21 3d 6e 4f 72 69 67 20  ( nReuse!=nOrig 
30060 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61  ){.      osMunma
30070 70 28 70 52 65 71 2c 20 6e 4f 72 69 67 2d 6e 52  p(pReq, nOrig-nR
30080 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  euse);.    }..#i
30090 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20  f HAVE_MREMAP.  
300a0 20 20 70 4e 65 77 20 3d 20 6f 73 4d 72 65 6d 61    pNew = osMrema
300b0 70 28 70 4f 72 69 67 2c 20 6e 52 65 75 73 65 2c  p(pOrig, nReuse,
300c0 20 6e 4e 65 77 2c 20 4d 52 45 4d 41 50 5f 4d 41   nNew, MREMAP_MA
300d0 59 4d 4f 56 45 29 3b 0a 20 20 20 20 7a 45 72 72  YMOVE);.    zErr
300e0 20 3d 20 22 6d 72 65 6d 61 70 22 3b 0a 23 65 6c   = "mremap";.#el
300f0 73 65 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73  se.    pNew = os
30100 4d 6d 61 70 28 70 52 65 71 2c 20 6e 4e 65 77 2d  Mmap(pReq, nNew-
30110 6e 52 65 75 73 65 2c 20 66 6c 61 67 73 2c 20 4d  nReuse, flags, M
30120 41 50 5f 53 48 41 52 45 44 2c 20 68 2c 20 6e 52  AP_SHARED, h, nR
30130 65 75 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70  euse);.    if( p
30140 4e 65 77 21 3d 4d 41 50 5f 46 41 49 4c 45 44 20  New!=MAP_FAILED 
30150 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  ){.      if( pNe
30160 77 21 3d 70 52 65 71 20 29 7b 0a 20 20 20 20 20  w!=pReq ){.     
30170 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4e 65 77     osMunmap(pNew
30180 2c 20 6e 4e 65 77 20 2d 20 6e 52 65 75 73 65 29  , nNew - nReuse)
30190 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  ;.        pNew =
301a0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
301b0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
301c0 70 4f 72 69 67 3b 0a 20 20 20 20 20 20 7d 0a 20  pOrig;.      }. 
301d0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
301e0 20 2f 2a 20 54 68 65 20 61 74 74 65 6d 70 74 20   /* The attempt 
301f0 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 65 78  to extend the ex
30200 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 66  isting mapping f
30210 61 69 6c 65 64 2e 20 46 72 65 65 20 69 74 2e 20  ailed. Free it. 
30220 2a 2f 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  */.    if( pNew=
30230 3d 4d 41 50 5f 46 41 49 4c 45 44 20 7c 7c 20 70  =MAP_FAILED || p
30240 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
30250 6f 73 4d 75 6e 6d 61 70 28 70 4f 72 69 67 2c 20  osMunmap(pOrig, 
30260 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a 20  nReuse);.    }. 
30270 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4e 65 77   }..  /* If pNew
30280 20 69 73 20 73 74 69 6c 6c 20 4e 55 4c 4c 2c 20   is still NULL, 
30290 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 61 6e  try to create an
302a0 20 65 6e 74 69 72 65 6c 79 20 6e 65 77 20 6d 61   entirely new ma
302b0 70 70 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20  pping. */.  if( 
302c0 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70  pNew==0 ){.    p
302d0 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20  New = osMmap(0, 
302e0 6e 4e 65 77 2c 20 66 6c 61 67 73 2c 20 4d 41 50  nNew, flags, MAP
302f0 5f 53 48 41 52 45 44 2c 20 68 2c 20 30 29 3b 0a  _SHARED, h, 0);.
30300 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 65 77 3d    }..  if( pNew=
30310 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20  =MAP_FAILED ){. 
30320 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20     pNew = 0;.   
30330 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 75   nNew = 0;.    u
30340 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
30350 54 45 5f 4f 4b 2c 20 7a 45 72 72 2c 20 70 46 64  TE_OK, zErr, pFd
30360 2d 3e 7a 50 61 74 68 29 3b 0a 0a 20 20 20 20 2f  ->zPath);..    /
30370 2a 20 49 66 20 74 68 65 20 6d 6d 61 70 28 29 20  * If the mmap() 
30380 61 62 6f 76 65 20 66 61 69 6c 65 64 2c 20 61 73  above failed, as
30390 73 75 6d 65 20 74 68 61 74 20 61 6c 6c 20 73 75  sume that all su
303a0 62 73 65 71 75 65 6e 74 20 6d 6d 61 70 28 29 20  bsequent mmap() 
303b0 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20 77 69 6c  calls.    ** wil
303c0 6c 20 70 72 6f 62 61 62 6c 79 20 66 61 69 6c 20  l probably fail 
303d0 74 6f 6f 2e 20 46 61 6c 6c 20 62 61 63 6b 20 74  too. Fall back t
303e0 6f 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57  o using xRead/xW
303f0 72 69 74 65 20 65 78 63 6c 75 73 69 76 65 6c 79  rite exclusively
30400 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20  .    ** in this 
30410 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 70 46  case.  */.    pF
30420 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d  d->mmapSizeMax =
30430 20 30 3b 0a 20 20 7d 0a 20 20 70 46 64 2d 3e 70   0;.  }.  pFd->p
30440 4d 61 70 52 65 67 69 6f 6e 20 3d 20 28 76 6f 69  MapRegion = (voi
30450 64 20 2a 29 70 4e 65 77 3b 0a 20 20 70 46 64 2d  d *)pNew;.  pFd-
30460 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 70 46 64 2d  >mmapSize = pFd-
30470 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20  >mmapSizeActual 
30480 3d 20 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  = nNew;.}../*.**
30490 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72   Memory map or r
304a0 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20 6f 70  emap the file op
304b0 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64 65 73  ened by file-des
304c0 63 72 69 70 74 6f 72 20 70 46 64 20 28 69 66 20  criptor pFd (if 
304d0 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61  the file.** is a
304e0 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c 20 74  lready mapped, t
304f0 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70  he existing mapp
30500 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65 64 20  ing is replaced 
30510 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c  by the new). Or,
30520 20 69 66 20 0a 2a 2a 20 74 68 65 72 65 20 61 6c   if .** there al
30530 72 65 61 64 79 20 65 78 69 73 74 73 20 61 20 6d  ready exists a m
30540 61 70 70 69 6e 67 20 66 6f 72 20 74 68 69 73 20  apping for this 
30550 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20  file, and there 
30560 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f 75  are still .** ou
30570 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68  tstanding xFetch
30580 28 29 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  () references to
30590 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69   it, this functi
305a0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
305b0 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
305c0 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e  r nByte is non-n
305d0 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74  egative, then it
305e0 20 69 73 20 74 68 65 20 72 65 71 75 65 73 74 65   is the requeste
305f0 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a 20 74 68  d size of .** th
30600 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72 65  e mapping to cre
30610 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
30620 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73 73  if nByte is less
30630 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
30640 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74   the .** request
30650 65 64 20 73 69 7a 65 20 69 73 20 74 68 65 20 73  ed size is the s
30660 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
30670 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63 74  on disk. The act
30680 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  ual size of the.
30690 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70 69  ** created mappi
306a0 6e 67 20 69 73 20 65 69 74 68 65 72 20 74 68 65  ng is either the
306b0 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
306c0 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f 6e  or the value con
306d0 66 69 67 75 72 65 64 20 0a 2a 2a 20 75 73 69 6e  figured .** usin
306e0 67 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  g SQLITE_FCNTL_M
306f0 4d 41 50 5f 4c 49 4d 49 54 2c 20 77 68 69 63 68  MAP_LIMIT, which
30700 65 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e  ever is smaller.
30710 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
30720 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
30730 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  no error occurs 
30740 28 65 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70  (even if the map
30750 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72  ping is not.** r
30760 65 63 72 65 61 74 65 64 20 61 73 20 61 20 72 65  ecreated as a re
30770 73 75 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64  sult of outstand
30780 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 29 20  ing references) 
30790 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
307a0 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72  or.** code other
307b0 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
307c0 69 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c 65 28  int unixMapfile(
307d0 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 69  unixFile *pFd, i
307e0 36 34 20 6e 4d 61 70 29 7b 0a 20 20 61 73 73 65  64 nMap){.  asse
307f0 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70  rt( nMap>=0 || p
30800 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  Fd->nFetchOut==0
30810 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4d   );.  assert( nM
30820 61 70 3e 30 20 7c 7c 20 28 70 46 64 2d 3e 6d 6d  ap>0 || (pFd->mm
30830 61 70 53 69 7a 65 3d 3d 30 20 26 26 20 70 46 64  apSize==0 && pFd
30840 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 29  ->pMapRegion==0)
30850 20 29 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e   );.  if( pFd->n
30860 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74  FetchOut>0 ) ret
30870 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
30880 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a    if( nMap<0 ){.
30890 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
308a0 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20 20  statbuf;        
308b0 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66    /* Low-level f
308c0 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ile information 
308d0 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74  */.    if( osFst
308e0 61 74 28 70 46 64 2d 3e 68 2c 20 26 73 74 61 74  at(pFd->h, &stat
308f0 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65  buf) ){.      re
30900 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
30910 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20  R_FSTAT;.    }. 
30920 20 20 20 6e 4d 61 70 20 3d 20 73 74 61 74 62 75     nMap = statbu
30930 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 7d 0a 20  f.st_size;.  }. 
30940 20 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d   if( nMap>pFd->m
30950 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20  mapSizeMax ){.  
30960 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d    nMap = pFd->mm
30970 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 0a  apSizeMax;.  }..
30980 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 30    assert( nMap>0
30990 20 7c 7c 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69   || (pFd->mmapSi
309a0 7a 65 3d 3d 30 20 26 26 20 70 46 64 2d 3e 70 4d  ze==0 && pFd->pM
309b0 61 70 52 65 67 69 6f 6e 3d 3d 30 29 20 29 3b 0a  apRegion==0) );.
309c0 20 20 69 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d    if( nMap!=pFd-
309d0 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
309e0 20 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 70   unixRemapfile(p
309f0 46 64 2c 20 6e 4d 61 70 29 3b 0a 20 20 7d 0a 0a  Fd, nMap);.  }..
30a00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30a10 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
30a20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
30a30 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SIZE>0 */../*.**
30a40 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65   If possible, re
30a50 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
30a60 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66  o a mapping of f
30a70 69 6c 65 20 66 64 20 73 74 61 72 74 69 6e 67 20  ile fd starting 
30a80 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66  at offset.** iOf
30a90 66 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d  f. The mapping m
30aa0 75 73 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72  ust be valid for
30ab0 20 61 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62   at least nAmt b
30ac0 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ytes..**.** If s
30ad0 75 63 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61  uch a pointer ca
30ae0 6e 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73  n be obtained, s
30af0 74 6f 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61  tore it in *pp a
30b00 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
30b10 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f  _OK..** Or, if o
30b20 6e 65 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f  ne cannot but no
30b30 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
30b40 65 74 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20  et *pp to 0 and 
30b50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
30b60 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66  ..** Finally, if
30b70 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f   an error does o
30b80 63 63 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20  ccur, return an 
30b90 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
30ba0 65 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20  e. The final.** 
30bb0 76 61 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20  value of *pp is 
30bc0 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69  undefined in thi
30bd0 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
30be0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
30bf0 6f 65 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69  oes return a poi
30c00 6e 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72  nter, the caller
30c10 20 6d 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79   must eventually
30c20 20 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65   .** release the
30c30 20 72 65 66 65 72 65 6e 63 65 20 62 79 20 63 61   reference by ca
30c40 6c 6c 69 6e 67 20 75 6e 69 78 55 6e 66 65 74 63  lling unixUnfetc
30c50 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  h()..*/.static i
30c60 6e 74 20 75 6e 69 78 46 65 74 63 68 28 73 71 6c  nt unixFetch(sql
30c70 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
30c80 36 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d  64 iOff, int nAm
30c90 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23  t, void **pp){.#
30ca0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
30cb0 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78  AP_SIZE>0.  unix
30cc0 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69  File *pFd = (uni
30cd0 78 46 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a  xFile *)fd;   /*
30ce0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
30cf0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
30d00 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20  .#endif.  *pp = 
30d10 30 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  0;..#if SQLITE_M
30d20 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
30d30 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69   if( pFd->mmapSi
30d40 7a 65 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69  zeMax>0 ){.    i
30d50 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69  f( pFd->pMapRegi
30d60 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  on==0 ){.      i
30d70 6e 74 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66  nt rc = unixMapf
30d80 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20  ile(pFd, -1);.  
30d90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30da0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
30db0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
30dc0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e   pFd->mmapSize >
30dd0 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20  = iOff+nAmt ){. 
30de0 20 20 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38       *pp = &((u8
30df0 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69   *)pFd->pMapRegi
30e00 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20  on)[iOff];.     
30e10 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b   pFd->nFetchOut+
30e20 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  +;.    }.  }.#en
30e30 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
30e40 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
30e50 20 49 66 20 74 68 65 20 74 68 69 72 64 20 61 72   If the third ar
30e60 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55  gument is non-NU
30e70 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  LL, then this fu
30e80 6e 63 74 69 6f 6e 20 72 65 6c 65 61 73 65 73 20  nction releases 
30e90 61 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20  a .** reference 
30ea0 6f 62 74 61 69 6e 65 64 20 62 79 20 61 6e 20 65  obtained by an e
30eb0 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 75  arlier call to u
30ec0 6e 69 78 46 65 74 63 68 28 29 2e 20 54 68 65 20  nixFetch(). The 
30ed0 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65  second.** argume
30ee0 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  nt passed to thi
30ef0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  s function must 
30f00 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
30f10 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
30f20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61  .** argument tha
30f30 74 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20  t was passed to 
30f40 74 68 65 20 75 6e 69 78 46 65 74 63 68 28 29 20  the unixFetch() 
30f50 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a  invocation. .**.
30f60 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 74 68  ** Or, if the th
30f70 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ird argument is 
30f80 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20  NULL, then this 
30f90 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  function is bein
30fa0 67 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20  g called .** to 
30fb0 69 6e 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c  inform the VFS l
30fc0 61 79 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72  ayer that, accor
30fd0 64 69 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61  ding to POSIX, a
30fe0 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70  ny existing mapp
30ff0 69 6e 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20  ing .** may now 
31000 62 65 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73  be invalid and s
31010 68 6f 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65  hould be unmappe
31020 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
31030 20 75 6e 69 78 55 6e 66 65 74 63 68 28 73 71 6c   unixUnfetch(sql
31040 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
31050 36 34 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70  64 iOff, void *p
31060 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ){.#if SQLITE_MA
31070 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
31080 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20  unixFile *pFd = 
31090 28 75 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20  (unixFile *)fd; 
310a0 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
310b0 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
310c0 65 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41  e */.  UNUSED_PA
310d0 52 41 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a 0a  RAMETER(iOff);..
310e0 20 20 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e    /* If p==0 (un
310f0 6d 61 70 20 74 68 65 20 65 6e 74 69 72 65 20 66  map the entire f
31100 69 6c 65 29 20 74 68 65 6e 20 74 68 65 72 65 20  ile) then there 
31110 6d 75 73 74 20 62 65 20 6e 6f 20 6f 75 74 73 74  must be no outst
31120 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 78 46 65  anding .  ** xFe
31130 74 63 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20  tch references. 
31140 4f 72 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61  Or, if p!=0 (mea
31150 6e 69 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46  ning it is an xF
31160 65 74 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c  etch reference),
31170 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65  .  ** then there
31180 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
31190 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
311a0 67 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  g.  */.  assert(
311b0 20 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e   (p==0)==(pFd->n
311c0 46 65 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a  FetchOut==0) );.
311d0 0a 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69  .  /* If p!=0, i
311e0 74 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65  t must match the
311f0 20 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a   iOff value. */.
31200 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c    assert( p==0 |
31210 7c 20 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64  | p==&((u8 *)pFd
31220 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f  ->pMapRegion)[iO
31230 66 66 5d 20 29 3b 0a 0a 20 20 69 66 28 20 70 20  ff] );..  if( p 
31240 29 7b 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65 74  ){.    pFd->nFet
31250 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65  chOut--;.  }else
31260 7b 0a 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66  {.    unixUnmapf
31270 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20  ile(pFd);.  }.. 
31280 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46   assert( pFd->nF
31290 65 74 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65  etchOut>=0 );.#e
312a0 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
312b0 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e  AMETER(fd);.  UN
312c0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
312d0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
312e0 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a 23 65 6e  METER(iOff);.#en
312f0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
31300 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
31310 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69   Here ends the i
31320 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
31330 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c   all sqlite3_fil
31340 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a  e methods..**.**
31350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31360 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33  **** End sqlite3
31370 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a  _file Methods **
31380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
313a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
313b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
313c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
313d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
313e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
313f0 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69  *.** This divisi
31400 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69  on contains defi
31410 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74  nitions of sqlit
31420 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
31430 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d  jects that.** im
31440 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20  plement various 
31450 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72  file locking str
31460 61 74 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73  ategies.  It als
31470 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e  o contains defin
31480 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69  itions.** of "fi
31490 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e  nder" functions.
314a0 20 20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74    A finder-funct
314b0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ion is used to l
314c0 6f 63 61 74 65 20 74 68 65 20 61 70 70 72 6f 70  ocate the approp
314d0 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33  riate.** sqlite3
314e0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
314f0 63 74 20 66 6f 72 20 61 20 70 61 72 74 69 63 75  ct for a particu
31500 6c 61 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  lar database fil
31510 65 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61  e.  The pAppData
31520 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65  .** field of the
31530 20 73 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53   sqlite3_vfs VFS
31540 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69   objects are ini
31550 74 69 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70  tialized to be p
31560 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68  ointers to.** th
31570 65 20 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72  e correct finder
31580 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68  -function for th
31590 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f  at VFS..**.** Mo
315a0 73 74 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  st finder functi
315b0 6f 6e 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69  ons return a poi
315c0 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65 64 20  nter to a fixed 
315d0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
315e0 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54  ds.** object.  T
315f0 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74  he only interest
31600 69 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  ing finder-funct
31610 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49  ion is autolockI
31620 6f 46 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a  oFinder, which.*
31630 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66  * looks at the f
31640 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 61  ilesystem type a
31650 6e 64 20 74 72 69 65 73 20 74 6f 20 67 75 65 73  nd tries to gues
31660 73 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69  s the best locki
31670 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66  ng.** strategy f
31680 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20  rom that..**.** 
31690 46 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  For finder-funct
316a0 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63  ion F, two objec
316b0 74 73 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a  ts are created:.
316c0 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65  **.**    (1) The
316d0 20 72 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e   real finder-fun
316e0 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d  ction named "FIm
316f0 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  pt()"..**.**    
31700 28 32 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70  (2) A constant p
31710 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66  ointer to this f
31720 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75  unction named ju
31730 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a  st "F"..**.**.**
31740 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   A pointer to th
31750 65 20 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75  e F pointer is u
31760 73 65 64 20 61 73 20 74 68 65 20 70 41 70 70 44  sed as the pAppD
31770 61 74 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46  ata value for VF
31780 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57  S.** objects.  W
31790 65 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69  e have to do thi
317a0 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74  s instead of let
317b0 74 69 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f  ting pAppData po
317c0 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20  int.** directly 
317d0 61 74 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75  at the finder-fu
317e0 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30  nction since C90
317f0 20 72 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61   rules prevent a
31800 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62   void*.** from b
31810 65 20 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75  e cast into a fu
31820 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a  nction pointer..
31830 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e  **.**.** Each in
31840 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d  stance of this m
31850 61 63 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74  acro generates t
31860 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a  wo objects:.**.*
31870 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e  *   *  A constan
31880 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
31890 68 6f 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c  hods object call
318a0 20 4d 45 54 48 4f 44 20 74 68 61 74 20 68 61 73   METHOD that has
318b0 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
318c0 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20   methods CLOSE, 
318d0 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b  LOCK, UNLOCK, CK
318e0 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20  RESLOCK..**.**  
318f0 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f   *  An I/O metho
31900 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  d finder functio
31910 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20  n called FINDER 
31920 74 68 61 74 20 72 65 74 75 72 6e 73 20 61 20 70  that returns a p
31930 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74  ointer.**      t
31940 6f 20 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a  o the METHOD obj
31950 65 63 74 20 69 6e 20 74 68 65 20 70 72 65 76 69  ect in the previ
31960 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23  ous bullet..*/.#
31970 64 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53  define IOMETHODS
31980 28 46 49 4e 44 45 52 2c 4d 45 54 48 4f 44 2c 56  (FINDER,METHOD,V
31990 45 52 53 49 4f 4e 2c 43 4c 4f 53 45 2c 4c 4f 43  ERSION,CLOSE,LOC
319a0 4b 2c 55 4e 4c 4f 43 4b 2c 43 4b 4c 4f 43 4b 2c  K,UNLOCK,CKLOCK,
319b0 53 48 4d 4d 41 50 29 20 20 20 20 20 5c 0a 73 74  SHMMAP)     \.st
319c0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
319d0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45  e3_io_methods ME
319e0 54 48 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20  THOD = {        
319f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a00 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
31a10 56 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20  VERSION,        
31a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
31a30 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20  Version */      
31a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a50 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43            \.   C
31a60 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20 20  LOSE,           
31a70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
31a80 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20  lose */         
31a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31aa0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
31ab0 69 78 52 65 61 64 2c 20 20 20 20 20 20 20 20 20  ixRead,         
31ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
31ad0 61 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ad */           
31ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31af0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
31b00 78 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20  xWrite,         
31b10 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69           /* xWri
31b20 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  te */           
31b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b40 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
31b50 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20  Truncate,       
31b60 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e          /* xTrun
31b70 63 61 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20  cate */         
31b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b90 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
31ba0 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  ync,            
31bb0 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20         /* xSync 
31bc0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
31bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31be0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69       \.   unixFi
31bf0 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  leSize,         
31c00 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69        /* xFileSi
31c10 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ze */           
31c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c30 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20      \.   LOCK,  
31c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c50 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f       /* xLock */
31c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c80 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20     \.   UNLOCK, 
31c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ca0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a      /* xUnlock *
31cb0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
31cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31cd0 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20    \.   CKLOCK,  
31ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31cf0 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
31d00 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20  rvedLock */     
31d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f   \.   unixFileCo
31d30 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  ntrol,          
31d40 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f    /* xFileContro
31d50 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  l */            
31d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d70 5c 0a 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53  \.   unixSectorS
31d80 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
31d90 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20   /* xSectorSize 
31da0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
31db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
31dc0 0a 20 20 20 75 6e 69 78 44 65 76 69 63 65 43 68  .   unixDeviceCh
31dd0 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20  aracteristics,  
31de0 2f 2a 20 78 44 65 76 69 63 65 43 61 70 61 62 69  /* xDeviceCapabi
31df0 6c 69 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20  lities */       
31e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
31e10 20 20 20 53 48 4d 4d 41 50 2c 20 20 20 20 20 20     SHMMAP,      
31e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31e30 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20  * xShmMap */    
31e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e50 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
31e60 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20    unixShmLock,  
31e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31e80 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20   xShmLock */    
31e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ea0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
31eb0 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 2c   unixShmBarrier,
31ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31ed0 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 20 20  xShmBarrier */  
31ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ef0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
31f00 75 6e 69 78 53 68 6d 55 6e 6d 61 70 2c 20 20 20  unixShmUnmap,   
31f10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
31f20 53 68 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20  ShmUnmap */     
31f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f40 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
31f50 6e 69 78 46 65 74 63 68 2c 20 20 20 20 20 20 20  nixFetch,       
31f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
31f70 65 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20  etch */         
31f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f90 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
31fa0 69 78 55 6e 66 65 74 63 68 2c 20 20 20 20 20 20  ixUnfetch,      
31fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
31fc0 66 65 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20  fetch */        
31fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31fe0 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20          \.};    
31ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32030 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20         \.static 
32040 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
32050 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44 45 52  _methods *FINDER
32060 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61  ##Impl(const cha
32070 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a  r *z, unixFile *
32080 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45 44  p){   \.  UNUSED
32090 5f 50 41 52 41 4d 45 54 45 52 28 7a 29 3b 20 55  _PARAMETER(z); U
320a0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
320b0 70 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p);             
320c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
320d0 20 20 20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20       \.  return 
320e0 26 4d 45 54 48 4f 44 3b 20 20 20 20 20 20 20 20  &METHOD;        
320f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32120 20 20 20 20 5c 0a 7d 20 20 20 20 20 20 20 20 20      \.}         
32130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32170 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73     \.static cons
32180 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
32190 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49  hods *(*const FI
321a0 4e 44 45 52 29 28 63 6f 6e 73 74 20 63 68 61 72  NDER)(const char
321b0 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29 20 20  *,unixFile *p)  
321c0 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45 52    \.    = FINDER
321d0 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48  ##Impl;../*.** H
321e0 65 72 65 20 61 72 65 20 61 6c 6c 20 6f 66 20 74  ere are all of t
321f0 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
32200 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 66 6f  thods objects fo
32210 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a  r each of the.**
32220 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
32230 69 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20  ies.  Functions 
32240 74 68 61 74 20 72 65 74 75 72 6e 20 70 6f 69 6e  that return poin
32250 74 65 72 73 20 74 6f 20 74 68 65 73 65 20 6d 65  ters to these me
32260 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73  thods.** are als
32270 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f  o created..*/.IO
32280 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f 73 69 78  METHODS(.  posix
32290 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
322a0 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
322b0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
322c0 20 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73    posixIoMethods
322d0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ,           /* s
322e0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
322f0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
32300 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20  .  3,           
32310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32320 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 6e  shared memory an
32330 64 20 6d 6d 61 70 20 61 72 65 20 65 6e 61 62 6c  d mmap are enabl
32340 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73  ed */.  unixClos
32350 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
32360 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
32370 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b  od */.  unixLock
32380 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32390 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
323a0 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63  d */.  unixUnloc
323b0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
323c0 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
323d0 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63  od */.  unixChec
323e0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
323f0 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
32400 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
32410 2f 0a 20 20 75 6e 69 78 53 68 6d 4d 61 70 20 20  /.  unixShmMap  
32420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32430 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20   xShmMap method 
32440 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  */.).IOMETHODS(.
32450 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72    nolockIoFinder
32460 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ,           /* F
32470 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
32480 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49  ame */.  nolockI
32490 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
324a0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
324b0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
324c0 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20 20  name */.  3,    
324d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
324e0 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
324f0 6d 6f 72 79 20 69 73 20 65 6e 61 62 6c 65 64 20  mory is enabled 
32500 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65  */.  nolockClose
32510 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
32520 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
32530 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c  */.  nolockLock,
32540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32550 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
32560 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b  /.  nolockUnlock
32570 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
32580 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
32590 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b  */.  nolockCheck
325a0 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 2f  ReservedLock,  /
325b0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
325c0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
325d0 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
325e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
325f0 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a  hmMap method */.
32600 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64  ).IOMETHODS(.  d
32610 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  otlockIoFinder, 
32620 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
32630 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
32640 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d   */.  dotlockIoM
32650 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
32660 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
32670 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
32680 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
32690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
326a0 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
326b0 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
326c0 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c  .  dotlockClose,
326d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
326e0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
326f0 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20  .  dotlockLock, 
32700 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32710 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
32720 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c    dotlockUnlock,
32730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
32740 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
32750 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52  .  dotlockCheckR
32760 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 2f 2a 20  eservedLock, /* 
32770 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
32780 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30  ck method */.  0
32790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
327a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
327b0 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  Map method */.).
327c0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
327d0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
327e0 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c  .IOMETHODS(.  fl
327f0 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
32800 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
32810 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
32820 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68  */.  flockIoMeth
32830 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
32840 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
32850 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
32860 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
32870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32880 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
32890 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
328a0 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20    flockClose,   
328b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
328c0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
328d0 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20    flockLock,    
328e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
328f0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
32900 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20   flockUnlock,   
32910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
32920 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
32930 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65    flockCheckRese
32940 72 76 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78  rvedLock,   /* x
32950 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
32960 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
32970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32980 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
32990 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ap method */.).#
329a0 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58  endif..#if OS_VX
329b0 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28  WORKS.IOMETHODS(
329c0 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20  .  semIoFinder, 
329d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
329e0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
329f0 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d  name */.  semIoM
32a00 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
32a10 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
32a20 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
32a30 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
32a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32a50 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
32a60 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
32a70 64 20 2a 2f 0a 20 20 73 65 6d 58 43 6c 6f 73 65  d */.  semXClose
32a80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32a90 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
32aa0 64 20 2a 2f 0a 20 20 73 65 6d 58 4c 6f 63 6b 2c  d */.  semXLock,
32ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ac0 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
32ad0 20 2a 2f 0a 20 20 73 65 6d 58 55 6e 6c 6f 63 6b   */.  semXUnlock
32ae0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32af0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
32b00 64 20 2a 2f 0a 20 20 73 65 6d 58 43 68 65 63 6b  d */.  semXCheck
32b10 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
32b20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
32b30 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
32b40 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  .  0            
32b50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32b60 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
32b70 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  /.).#endif..#if 
32b80 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
32b90 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
32ba0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
32bb0 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61  E.IOMETHODS(.  a
32bc0 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  fpIoFinder,     
32bd0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
32be0 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
32bf0 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f   */.  afpIoMetho
32c00 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ds,             
32c10 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
32c20 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
32c30 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
32c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c50 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
32c60 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
32c70 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20  .  afpClose,    
32c80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32c90 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
32ca0 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20  .  afpLock,     
32cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32cc0 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
32cd0 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20    afpUnlock,    
32ce0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
32cf0 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
32d00 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73 65 72  .  afpCheckReser
32d10 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20  vedLock,     /* 
32d20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
32d30 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30  ck method */.  0
32d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d50 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
32d60 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  Map method */.).
32d70 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
32d80 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
32d90 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73 75 70  method is a "sup
32da0 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68  er-method" in th
32db0 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a  e sense that it.
32dc0 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61  ** opens seconda
32dd0 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
32de0 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63  ors for the conc
32df0 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73  h and lock files
32e00 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20   and.** it uses 
32e10 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c  proxy, dot-file,
32e20 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28   AFP, and flock(
32e30 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  ) locking method
32e40 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65  s on those.** se
32e50 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20  condary files.  
32e60 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  For this reason,
32e70 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68   the division th
32e80 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a  at implements.**
32e90 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   proxy locking i
32ea0 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66  s located much f
32eb0 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74  urther down in t
32ec0 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65  he file.  But we
32ed0 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61   need.** to go a
32ee0 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20  head and define 
32ef0 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
32f00 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65  ethods and finde
32f10 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f  r function.** fo
32f20 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  r proxy locking 
32f30 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72  here.  So we for
32f40 77 61 72 64 20 64 65 63 6c 61 72 65 20 74 68 65  ward declare the
32f50 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f   I/O methods..*/
32f60 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
32f70 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
32f80 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
32f90 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e  _STYLE.static in
32fa0 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c  t proxyClose(sql
32fb0 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61  ite3_file*);.sta
32fc0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63  tic int proxyLoc
32fd0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
32fe0 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e   int);.static in
32ff0 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71  t proxyUnlock(sq
33000 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
33010 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
33020 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
33030 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
33040 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54  e*, int*);.IOMET
33050 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46  HODS(.  proxyIoF
33060 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
33070 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
33080 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70  tion name */.  p
33090 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20  roxyIoMethods,  
330a0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
330b0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
330c0 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
330d0 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2,              
330e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
330f0 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 65 6e  red memory is en
33100 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79  abled */.  proxy
33110 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
33120 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
33130 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
33140 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
33150 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
33160 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55  thod */.  proxyU
33170 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
33180 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
33190 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
331a0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
331b0 6b 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  k,   /* xCheckRe
331c0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
331d0 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
331e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
331f0 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
33200 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
33210 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20  /* nfs lockd on 
33220 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27  OSX 10.3+ doesn'
33230 74 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c 6f  t clear write lo
33240 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64 20  cks when a read 
33250 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23  lock is set */.#
33260 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
33270 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
33280 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
33290 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  TYLE.IOMETHODS(.
332a0 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20 20    nfsIoFinder,  
332b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
332c0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
332d0 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d  name */.  nfsIoM
332e0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
332f0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
33300 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
33310 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
33320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33330 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
33340 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
33350 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f  led */.  unixClo
33360 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
33370 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
33380 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f  thod */.  unixLo
33390 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
333a0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
333b0 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c  thod */.  nfsUnl
333c0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
333d0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
333e0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
333f0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
33400 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  k,     /* xCheck
33410 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
33420 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  hod */.  0      
33430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33440 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d      /* xShmMap m
33450 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
33460 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  f..#if defined(_
33470 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
33480 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
33490 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20  NG_STYLE./* .** 
334a0 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75  This "finder" fu
334b0 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
334c0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
334d0 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74   best locking st
334e0 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74  rategy .** for t
334f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
33500 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74   "filePath".  It
33510 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68   then returns th
33520 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
33530 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  hods.** object t
33540 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
33550 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a  hat strategy..**
33560 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20  .** This is for 
33570 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a  MacOSX only..*/.
33580 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
33590 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
335a0 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  *autolockIoFinde
335b0 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63  rImpl(.  const c
335c0 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20  har *filePath,  
335d0 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65    /* name of the
335e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
335f0 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  /.  unixFile *pN
33600 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew           /* 
33610 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74  open file object
33620 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
33630 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73  e file */.){.  s
33640 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
33650 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20  ct Mapping {.   
33660 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
33670 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20  lesystem;       
33680 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79         /* Filesy
33690 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a  stem type name *
336a0 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69  /.    const sqli
336b0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
336c0 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41  pMethods;   /* A
336d0 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
336e0 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d  ng method */.  }
336f0 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20   aMap[] = {.    
33700 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73  { "hfs",    &pos
33710 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ixIoMethods },. 
33720 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26     { "ufs",    &
33730 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d  posixIoMethods }
33740 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c  ,.    { "afpfs",
33750 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20    &afpIoMethods 
33760 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22  },.    { "smbfs"
33770 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  ,  &afpIoMethods
33780 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61   },.    { "webda
33790 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  v", &nolockIoMet
337a0 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c  hods },.    { 0,
337b0 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20   0 }.  };.  int 
337c0 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  i;.  struct stat
337d0 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72  fs fsInfo;.  str
337e0 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e  uct flock lockIn
337f0 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65  fo;..  if( !file
33800 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Path ){.    /* I
33810 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c  f filePath==NULL
33820 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61   that means we a
33830 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
33840 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
33850 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65  .    ** that doe
33860 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
33870 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20   locked. */.    
33880 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
33890 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69  Methods;.  }.  i
338a0 66 28 20 73 74 61 74 66 73 28 66 69 6c 65 50 61  f( statfs(filePa
338b0 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20  th, &fsInfo) != 
338c0 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73  -1 ){.    if( fs
338d0 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d  Info.f_flags & M
338e0 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  NT_RDONLY ){.   
338f0 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63     return &noloc
33900 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  kIoMethods;.    
33910 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61  }.    for(i=0; a
33920 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74  Map[i].zFilesyst
33930 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  em; i++){.      
33940 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66  if( strcmp(fsInf
33950 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
33960 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73  aMap[i].zFilesys
33970 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tem)==0 ){.     
33980 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69     return aMap[i
33990 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  ].pMethods;.    
339a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
339b0 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65   /* Default case
339c0 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67  . Handles, among
339d0 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22  st others, "nfs"
339e0 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65  ..  ** Test byte
339f0 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e  -range lock usin
33a00 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68  g fcntl(). If th
33a10 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c  e call succeeds,
33a20 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68   .  ** assume th
33a30 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  at the file-syst
33a40 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49  em supports POSI
33a50 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a  X style locks. .
33a60 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e    */.  lockInfo.
33a70 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63  l_len = 1;.  loc
33a80 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20  kInfo.l_start = 
33a90 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  0;.  lockInfo.l_
33aa0 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
33ab0 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  T;.  lockInfo.l_
33ac0 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
33ad0 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e    if( osFcntl(pN
33ae0 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  ew->h, F_GETLK, 
33af0 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29  &lockInfo)!=-1 )
33b00 20 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   {.    if( strcm
33b10 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  p(fsInfo.f_fstyp
33b20 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30  ename, "nfs")==0
33b30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
33b40 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a   &nfsIoMethods;.
33b50 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
33b60 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78     return &posix
33b70 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
33b80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
33b90 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d  turn &dotlockIoM
33ba0 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74  ethods;.  }.}.st
33bb0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
33bc0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20  e3_io_methods . 
33bd0 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f   *(*const autolo
33be0 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73  ckIoFinder)(cons
33bf0 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
33c00 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  *) = autolockIoF
33c10 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64  inderImpl;..#end
33c20 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
33c30 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
33c40 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
33c50 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20  G_STYLE */..#if 
33c60 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 0a 2a 2a  OS_VXWORKS./*.**
33c70 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66   This "finder" f
33c80 75 6e 63 74 69 6f 6e 20 66 6f 72 20 56 78 57 6f  unction for VxWo
33c90 72 6b 73 20 63 68 65 63 6b 73 20 74 6f 20 73 65  rks checks to se
33ca0 65 20 69 66 20 70 6f 73 69 78 20 61 64 76 69 73  e if posix advis
33cb0 6f 72 79 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 77  ory.** locking w
33cc0 6f 72 6b 73 2e 20 20 49 66 20 69 74 20 64 6f 65  orks.  If it doe
33cd0 73 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 20  s, then that is 
33ce0 77 68 61 74 20 69 73 20 75 73 65 64 2e 20 20 49  what is used.  I
33cf0 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  f it does not.**
33d00 20 77 6f 72 6b 2c 20 74 68 65 6e 20 66 61 6c 6c   work, then fall
33d10 62 61 63 6b 20 74 6f 20 6e 61 6d 65 64 20 73 65  back to named se
33d20 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 2e  maphore locking.
33d30 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
33d40 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
33d50 6f 64 73 20 2a 76 78 77 6f 72 6b 73 49 6f 46 69  ods *vxworksIoFi
33d60 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73  nderImpl(.  cons
33d70 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68  t char *filePath
33d80 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20  ,    /* name of 
33d90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
33da0 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  e */.  unixFile 
33db0 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20  *pNew           
33dc0 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  /* the open file
33dd0 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
33de0 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
33df0 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66  kInfo;..  if( !f
33e00 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f  ilePath ){.    /
33e10 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e  * If filePath==N
33e20 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77  ULL that means w
33e30 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
33e40 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66  th a transient f
33e50 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ile.    ** that 
33e60 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
33e70 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20   be locked. */. 
33e80 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63     return &noloc
33e90 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  kIoMethods;.  }.
33ea0 0a 20 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63  .  /* Test if fc
33eb0 6e 74 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74  ntl() is support
33ec0 65 64 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58  ed and use POSIX
33ed0 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20   style locks..  
33ee0 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c  ** Otherwise fal
33ef0 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61  l back to the na
33f00 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65  med semaphore me
33f10 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63  thod..  */.  loc
33f20 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b  kInfo.l_len = 1;
33f30 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74  .  lockInfo.l_st
33f40 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49  art = 0;.  lockI
33f50 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  nfo.l_whence = S
33f60 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49  EEK_SET;.  lockI
33f70 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  nfo.l_type = F_R
33f80 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63  DLCK;.  if( osFc
33f90 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47  ntl(pNew->h, F_G
33fa0 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29  ETLK, &lockInfo)
33fb0 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74  !=-1 ) {.    ret
33fc0 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68  urn &posixIoMeth
33fd0 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ods;.  }else{.  
33fe0 20 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d    return &semIoM
33ff0 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74  ethods;.  }.}.st
34000 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
34010 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20  e3_io_methods . 
34020 20 2a 28 2a 63 6f 6e 73 74 20 76 78 77 6f 72 6b   *(*const vxwork
34030 73 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74  sIoFinder)(const
34040 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
34050 29 20 3d 20 76 78 77 6f 72 6b 73 49 6f 46 69 6e  ) = vxworksIoFin
34060 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66  derImpl;..#endif
34070 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a   /* OS_VXWORKS *
34080 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74  /../*.** An abst
34090 72 61 63 74 20 74 79 70 65 20 66 6f 72 20 61 20  ract type for a 
340a0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 49 4f  pointer to an IO
340b0 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66   method finder f
340c0 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65  unction:.*/.type
340d0 64 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  def const sqlite
340e0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a  3_io_methods *(*
340f0 66 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e  finder_type)(con
34100 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
34110 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  e*);.../********
34120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34160 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
34170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34180 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65  * sqlite3_vfs me
34190 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
341a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
341b0 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69  **.**.** This di
341c0 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  vision contains 
341d0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
341e0 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e  on of methods on
341f0 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   the.** sqlite3_
34200 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a  vfs object..*/..
34210 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
34220 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
34230 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   the unixFile st
34240 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20  ructure pointed 
34250 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74  to by pId..*/.st
34260 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55  atic int fillInU
34270 6e 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74  nixFile(.  sqlit
34280 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
34290 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
342a0 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   vfs object */. 
342b0 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20   int h,         
342c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
342d0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
342e0 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f   of file being o
342f0 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  pened */.  sqlit
34300 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20  e3_file *pId,   
34310 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74     /* Write to t
34320 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
34330 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
34340 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
34350 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20  ename,  /* Name 
34360 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e  of the file bein
34370 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e  g opened */.  in
34380 74 20 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20  t ctrlFlags     
34390 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72        /* Zero or
343a0 20 6d 6f 72 65 20 55 4e 49 58 46 49 4c 45 5f 2a   more UNIXFILE_*
343b0 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
343c0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
343d0 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69  _methods *pLocki
343e0 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46  ngStyle;.  unixF
343f0 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69  ile *pNew = (uni
34400 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69  xFile *)pId;.  i
34410 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
34420 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e  K;..  assert( pN
34430 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c  ew->pInode==NULL
34440 20 29 3b 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c   );..  /* Usuall
34450 79 20 74 68 65 20 70 61 74 68 20 7a 46 69 6c 65  y the path zFile
34460 6e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  name should not 
34470 62 65 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  be a relative pa
34480 74 68 6e 61 6d 65 2e 20 54 68 65 0a 20 20 2a 2a  thname. The.  **
34490 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77 68   exception is wh
344a0 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 70  en opening the p
344b0 72 6f 78 79 20 22 63 6f 6e 63 68 22 20 66 69 6c  roxy "conch" fil
344c0 65 20 69 6e 20 62 75 69 6c 64 73 20 74 68 61 74  e in builds that
344d0 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 65 20 74 68  .  ** include th
344e0 65 20 73 70 65 63 69 61 6c 20 41 70 70 6c 65 20  e special Apple 
344f0 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 73 2e 0a  locking styles..
34500 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64    */.#if defined
34510 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
34520 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
34530 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 61 73 73  KING_STYLE.  ass
34540 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d  ert( zFilename==
34550 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  0 || zFilename[0
34560 5d 3d 3d 27 2f 27 20 0a 20 20 20 20 7c 7c 20 70  ]=='/' .    || p
34570 56 66 73 2d 3e 70 41 70 70 44 61 74 61 3d 3d 28  Vfs->pAppData==(
34580 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49  void*)&autolockI
34590 6f 46 69 6e 64 65 72 20 29 3b 0a 23 65 6c 73 65  oFinder );.#else
345a0 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65  .  assert( zFile
345b0 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65  name==0 || zFile
345c0 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a  name[0]=='/' );.
345d0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4e 6f 20  #endif..  /* No 
345e0 6c 6f 63 6b 69 6e 67 20 6f 63 63 75 72 73 20 69  locking occurs i
345f0 6e 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  n temporary file
34600 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a  s */.  assert( z
34610 46 69 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c 20 28  Filename!=0 || (
34620 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
34630 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20  FILE_NOLOCK)!=0 
34640 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
34650 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c  OPEN    %-3d %s\
34660 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65  n", h, zFilename
34670 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20  ));.  pNew->h = 
34680 68 3b 0a 20 20 70 4e 65 77 2d 3e 70 56 66 73 20  h;.  pNew->pVfs 
34690 3d 20 70 56 66 73 3b 0a 20 20 70 4e 65 77 2d 3e  = pVfs;.  pNew->
346a0 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d  zPath = zFilenam
346b0 65 3b 0a 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46  e;.  pNew->ctrlF
346c0 6c 61 67 73 20 3d 20 28 75 38 29 63 74 72 6c 46  lags = (u8)ctrlF
346d0 6c 61 67 73 3b 0a 23 69 66 20 53 51 4c 49 54 45  lags;.#if SQLITE
346e0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
346f0 0a 20 20 70 4e 65 77 2d 3e 6d 6d 61 70 53 69 7a  .  pNew->mmapSiz
34700 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47 6c  eMax = sqlite3Gl
34710 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61  obalConfig.szMma
34720 70 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  p;.#endif.  if( 
34730 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
34740 65 61 6e 28 28 28 63 74 72 6c 46 6c 61 67 73 20  ean(((ctrlFlags 
34750 26 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 29 20  & UNIXFILE_URI) 
34760 3f 20 7a 46 69 6c 65 6e 61 6d 65 20 3a 20 30 29  ? zFilename : 0)
34770 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
34780 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70 73               "ps
34790 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45  ow", SQLITE_POWE
347a0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29  RSAFE_OVERWRITE)
347b0 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74   ){.    pNew->ct
347c0 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
347d0 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20  ILE_PSOW;.  }.  
347e0 69 66 28 20 73 74 72 63 6d 70 28 70 56 66 73 2d  if( strcmp(pVfs-
347f0 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d 65 78 63  >zName,"unix-exc
34800 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e  l")==0 ){.    pN
34810 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  ew->ctrlFlags |=
34820 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 3b 0a   UNIXFILE_EXCL;.
34830 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f    }..#if OS_VXWO
34840 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20  RKS.  pNew->pId 
34850 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c  = vxworksFindFil
34860 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  eId(zFilename);.
34870 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d    if( pNew->pId=
34880 3d 30 20 29 7b 0a 20 20 20 20 63 74 72 6c 46 6c  =0 ){.    ctrlFl
34890 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
348a0 4e 4f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d  NOLOCK;.    rc =
348b0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
348c0 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  PT;.  }.#endif..
348d0 20 20 69 66 28 20 63 74 72 6c 46 6c 61 67 73 20    if( ctrlFlags 
348e0 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43  & UNIXFILE_NOLOC
348f0 4b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e  K ){.    pLockin
34900 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b  gStyle = &nolock
34910 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c  IoMethods;.  }el
34920 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67  se{.    pLocking
34930 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64  Style = (**(find
34940 65 72 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70  er_type*)pVfs->p
34950 41 70 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61  AppData)(zFilena
34960 6d 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53  me, pNew);.#if S
34970 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
34980 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f  KING_STYLE.    /
34990 2a 20 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d  * Cache zFilenam
349a0 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  e in the locking
349b0 20 63 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e   context (AFP an
349c0 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69  d dotlock overri
349d0 64 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70  de) for.    ** p
349e0 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74  roxyLock activat
349f0 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20  ion is possible 
34a00 28 72 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73  (remote proxy is
34a10 20 62 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d   based on db nam
34a20 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e  e).    ** zFilen
34a30 61 6d 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  ame remains vali
34a40 64 20 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20  d until file is 
34a50 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f  closed, to suppo
34a60 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e  rt */.    pNew->
34a70 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
34a80 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d   (void*)zFilenam
34a90 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  e;.#endif.  }.. 
34aa0 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
34ab0 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65  le == &posixIoMe
34ac0 74 68 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65  thods.#if define
34ad0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
34ae0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
34af0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
34b00 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  || pLockingStyle
34b10 20 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64   == &nfsIoMethod
34b20 73 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 2f 2a  s.#endif.     /*
34b30 20 73 75 70 70 6f 72 74 20 57 41 4c 20 6d 6f 64   support WAL mod
34b40 65 20 6f 6e 20 72 65 61 64 20 6f 6e 6c 79 20 6d  e on read only m
34b50 6f 75 6e 74 65 64 20 66 69 6c 65 73 79 73 74 65  ounted filesyste
34b60 6d 20 2a 2f 0a 20 20 20 20 7c 7c 20 28 70 4c 6f  m */.    || (pLo
34b70 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e  ckingStyle == &n
34b80 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 26  olockIoMethods &
34b90 26 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 29 0a  & zFilename!=0).
34ba0 20 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74    ){.    unixEnt
34bb0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  erMutex();.    r
34bc0 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  c = findInodeInf
34bd0 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70  o(pNew, &pNew->p
34be0 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20  Inode);.    if( 
34bf0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
34c00 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20  .      /* If an 
34c10 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69  error occurred i
34c20 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  n findInodeInfo(
34c30 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  ), close the fil
34c40 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20 20  e descriptor.   
34c50 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c     ** immediatel
34c60 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61 73  y, before releas
34c70 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20 66  ing the mutex. f
34c80 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d  indInodeInfo() m
34c90 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a  ay fail.      **
34ca0 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f   in two scenario
34cb0 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
34cc0 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61 6c    **   (a) A cal
34cd0 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66 61 69  l to fstat() fai
34ce0 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20  led..      **   
34cf0 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69  (b) A malloc fai
34d00 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  led..      **.  
34d10 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20      ** Scenario 
34d20 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63  (b) may only occ
34d30 75 72 20 69 66 20 74 68 65 20 70 72 6f 63 65 73  ur if the proces
34d40 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20  s is holding no 
34d50 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66  other.      ** f
34d60 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
34d70 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
34d80 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
34d90 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65 0a  were other file.
34da0 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70        ** descrip
34db0 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69 6c  tors on this fil
34dc0 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f  e, then no mallo
34dd0 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75 69  c would be requi
34de0 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20  red by.      ** 
34df0 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e  findInodeInfo().
34e00 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
34e10 63 61 73 65 2c 20 69 74 20 69 73 20 71 75 69 74  case, it is quit
34e20 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a  e safe to close.
34e30 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20        ** handle 
34e40 68 20 2d 20 61 73 20 69 74 20 69 73 20 67 75 61  h - as it is gua
34e50 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f 20  ranteed that no 
34e60 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c  posix locks will
34e70 20 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20   be released.   
34e80 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73     ** by doing s
34e90 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  o..      **.    
34ea0 20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69 6f    ** If scenario
34eb0 20 28 61 29 20 63 61 75 73 65 64 20 74 68 65 20   (a) caused the 
34ec0 65 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e 67  error then thing
34ed0 73 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61 66  s are not so saf
34ee0 65 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  e. The.      ** 
34ef0 69 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70 74  implicit assumpt
34f00 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61 74  ion here is that
34f10 20 69 66 20 66 73 74 61 74 28 29 20 66 61 69 6c   if fstat() fail
34f20 73 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69 6e  s, things are in
34f30 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20 62  .      ** such b
34f40 61 64 20 73 68 61 70 65 20 74 68 61 74 20 64 72  ad shape that dr
34f50 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72  opping a lock or
34f60 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74   two doesn't mat
34f70 74 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20 20  ter much..      
34f80 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  */.      robust_
34f90 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
34fa0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
34fb0 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  h = -1;.    }.  
34fc0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
34fd0 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c  ();.  }..#if SQL
34fe0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
34ff0 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
35000 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
35010 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
35020 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70 49  ngStyle == &afpI
35030 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
35040 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75  /* AFP locking u
35050 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
35060 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
35070 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a   be included in.
35080 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f      ** the afpLo
35090 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20  ckingContext..  
350a0 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b    */.    afpLock
350b0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
350c0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b  ;.    pNew->lock
350d0 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74  ingContext = pCt
350e0 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  x = sqlite3_mall
350f0 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 43  oc64( sizeof(*pC
35100 74 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  tx) );.    if( p
35110 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ctx==0 ){.      
35120 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
35130 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73  M_BKPT;.    }els
35140 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20  e{.      /* NB: 
35150 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73  zFilename exists
35160 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c   and remains val
35170 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c  id until the fil
35180 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20  e is closed.    
35190 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74    ** according t
351a0 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31  o requirement F1
351b0 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20  1141.  So we do 
351c0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65  not need to make
351d0 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79   a.      ** copy
351e0 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65   of the filename
351f0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d  . */.      pCtx-
35200 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e  >dbPath = zFilen
35210 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78 2d  ame;.      pCtx-
35220 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20  >reserved = 0;. 
35230 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28       srandomdev(
35240 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74  );.      unixEnt
35250 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20  erMutex();.     
35260 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
35270 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
35280 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20  >pInode);.      
35290 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
352a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
352b0 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e  ite3_free(pNew->
352c0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
352d0 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f  .        robust_
352e0 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
352f0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
35300 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    h = -1;.      
35310 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76  }.      unixLeav
35320 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20 20  eMutex();       
35330 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64   .    }.  }.#end
35340 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70  if..  else if( p
35350 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
35360 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  &dotlockIoMethod
35370 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66  s ){.    /* Dotf
35380 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  ile locking uses
35390 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
353a0 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
353b0 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20   included in.   
353c0 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c   ** the dotlockL
353d0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20  ockingContext . 
353e0 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a     */.    char *
353f0 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69  zLockFile;.    i
35400 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  nt nFilename;.  
35410 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
35420 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 6e 46  ame!=0 );.    nF
35430 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73  ilename = (int)s
35440 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29  trlen(zFilename)
35450 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46   + 6;.    zLockF
35460 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ile = (char *)sq
35470 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e  lite3_malloc64(n
35480 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Filename);.    i
35490 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20  f( zLockFile==0 
354a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
354b0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
354c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
354d0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
354e0 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c  tf(nFilename, zL
354f0 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22 20 44 4f  ockFile, "%s" DO
35500 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46  TLOCK_SUFFIX, zF
35510 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ilename);.    }.
35520 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
35530 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b  gContext = zLock
35540 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f  File;.  }..#if O
35550 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65  S_VXWORKS.  else
35560 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
35570 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68  le == &semIoMeth
35580 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61  ods ){.    /* Na
35590 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
355a0 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
355b0 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
355c0 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a  eeds to be.    *
355d0 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  * included in th
355e0 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74  e semLockingCont
355f0 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75  ext.    */.    u
35600 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
35610 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e  .    rc = findIn
35620 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70  odeInfo(pNew, &p
35630 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20  New->pInode);.  
35640 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54    if( (rc==SQLIT
35650 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e  E_OK) && (pNew->
35660 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55  pInode->pSem==NU
35670 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61  LL) ){.      cha
35680 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e  r *zSemName = pN
35690 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d  ew->pInode->aSem
356a0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20  Name;.      int 
356b0 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  n;.      sqlite3
356c0 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41  _snprintf(MAX_PA
356d0 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65  THNAME, zSemName
356e0 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20  , "/%s.sem",.   
356f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35700 20 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a      pNew->pId->z
35710 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a  CanonicalName);.
35720 20 20 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20        for( n=1; 
35730 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b  zSemName[n]; n++
35740 20 29 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a   ).        if( z
35750 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20  SemName[n]=='/' 
35760 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20  ) zSemName[n] = 
35770 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  '_';.      pNew-
35780 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20  >pInode->pSem = 
35790 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d  sem_open(zSemNam
357a0 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36 36 36  e, O_CREAT, 0666
357b0 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
357c0 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  pNew->pInode->pS
357d0 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44  em == SEM_FAILED
357e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
357f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
35800 50 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  PT;.        pNew
35810 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61  ->pInode->aSemNa
35820 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  me[0] = '\0';.  
35830 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
35840 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
35850 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  ;.  }.#endif.  .
35860 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
35870 28 70 4e 65 77 2c 20 30 29 3b 0a 23 69 66 20 4f  (pNew, 0);.#if O
35880 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20  S_VXWORKS.  if( 
35890 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
358a0 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20  .    if( h>=0 ) 
358b0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
358c0 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
358d0 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20  .    h = -1;.   
358e0 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e   osUnlink(zFilen
358f0 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ame);.    pNew->
35900 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
35910 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20  XFILE_DELETE;.  
35920 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72  }.#endif.  if( r
35930 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
35940 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72      if( h>=0 ) r
35950 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
35960 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  , h, __LINE__);.
35970 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
35980 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f  w->pMethod = pLo
35990 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20  ckingStyle;.    
359a0 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b  OpenCounter(+1);
359b0 0a 20 20 20 20 76 65 72 69 66 79 44 62 46 69 6c  .    verifyDbFil
359c0 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 20 20 72  e(pNew);.  }.  r
359d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
359e0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
359f0 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72  me of a director
35a00 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70 75  y in which to pu
35a10 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  t temporary file
35a20 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74  s..** If no suit
35a30 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66  able temporary f
35a40 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20 63 61  ile directory ca
35a50 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75  n be found, retu
35a60 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  rn NULL..*/.stat
35a70 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75  ic const char *u
35a80 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 76  nixTempFileDir(v
35a90 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63  oid){.  static c
35aa0 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72  onst char *azDir
35ab0 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a  s[] = {.     0,.
35ac0 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76       0,.     "/v
35ad0 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f  ar/tmp",.     "/
35ae0 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22  usr/tmp",.     "
35af0 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22 0a  /tmp",.     ".".
35b00 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20    };.  unsigned 
35b10 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 73 74 72  int i = 0;.  str
35b20 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
35b30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72  const char *zDir
35b40 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f   = sqlite3_temp_
35b50 64 69 72 65 63 74 6f 72 79 3b 0a 0a 20 20 69 66  directory;..  if
35b60 28 20 21 61 7a 44 69 72 73 5b 30 5d 20 29 20 61  ( !azDirs[0] ) a
35b70 7a 44 69 72 73 5b 30 5d 20 3d 20 67 65 74 65 6e  zDirs[0] = geten
35b80 76 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52  v("SQLITE_TMPDIR
35b90 22 29 3b 0a 20 20 69 66 28 20 21 61 7a 44 69 72  ");.  if( !azDir
35ba0 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d  s[1] ) azDirs[1]
35bb0 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49   = getenv("TMPDI
35bc0 52 22 29 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b  R");.  while(1){
35bd0 0a 20 20 20 20 69 66 28 20 7a 44 69 72 21 3d 30  .    if( zDir!=0
35be0 0a 20 20 20 20 20 26 26 20 6f 73 53 74 61 74 28  .     && osStat(
35bf0 7a 44 69 72 2c 20 26 62 75 66 29 3d 3d 30 0a 20  zDir, &buf)==0. 
35c00 20 20 20 20 26 26 20 53 5f 49 53 44 49 52 28 62      && S_ISDIR(b
35c10 75 66 2e 73 74 5f 6d 6f 64 65 29 0a 20 20 20 20  uf.st_mode).    
35c20 20 26 26 20 6f 73 41 63 63 65 73 73 28 7a 44 69   && osAccess(zDi
35c30 72 2c 20 30 33 29 3d 3d 30 0a 20 20 20 20 29 7b  r, 03)==0.    ){
35c40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 7a 44  .      return zD
35c50 69 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ir;.    }.    if
35c60 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61 7a 44 69  ( i>=sizeof(azDi
35c70 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72  rs)/sizeof(azDir
35c80 73 5b 30 5d 29 20 29 20 62 72 65 61 6b 3b 0a 20  s[0]) ) break;. 
35c90 20 20 20 7a 44 69 72 20 3d 20 61 7a 44 69 72 73     zDir = azDirs
35ca0 5b 69 2b 2b 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  [i++];.  }.  ret
35cb0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
35cc0 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61  Create a tempora
35cd0 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20  ry file name in 
35ce0 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74  zBuf.  zBuf must
35cf0 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a   be allocated.**
35d00 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
35d10 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 74  process and must
35d20 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74   be big enough t
35d30 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a  o hold at least.
35d40 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  ** pVfs->mxPathn
35d50 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74  ame bytes..*/.st
35d60 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74  atic int unixGet
35d70 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75  Tempname(int nBu
35d80 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
35d90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
35da0 69 72 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74  ir;.  int iLimit
35db0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 74 27 73   = 0;..  /* It's
35dc0 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
35dd0 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
35de0 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
35df0 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
35e00 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
35e10 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
35e20 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
35e30 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
35e40 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
35e50 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a   failing. .  */.
35e60 20 20 7a 42 75 66 5b 30 5d 20 3d 20 30 3b 0a 20    zBuf[0] = 0;. 
35e70 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
35e80 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
35e90 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72  IOERR );..  zDir
35ea0 20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c 65 44   = unixTempFileD
35eb0 69 72 28 29 3b 0a 20 20 69 66 28 20 7a 44 69 72  ir();.  if( zDir
35ec0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
35ed0 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
35ee0 50 50 41 54 48 3b 0a 20 20 64 6f 7b 0a 20 20 20  PPATH;.  do{.   
35ef0 20 75 36 34 20 72 3b 0a 20 20 20 20 73 71 6c 69   u64 r;.    sqli
35f00 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
35f10 69 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20  izeof(r), &r);. 
35f20 20 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3e     assert( nBuf>
35f30 32 20 29 3b 0a 20 20 20 20 7a 42 75 66 5b 6e 42  2 );.    zBuf[nB
35f40 75 66 2d 32 5d 20 3d 20 30 3b 0a 20 20 20 20 73  uf-2] = 0;.    s
35f50 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
35f60 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 25 73 2f  nBuf, zBuf, "%s/
35f70 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c  "SQLITE_TEMP_FIL
35f80 45 5f 50 52 45 46 49 58 22 25 6c 6c 78 25 63 22  E_PREFIX"%llx%c"
35f90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
35fa0 20 20 20 20 20 20 20 7a 44 69 72 2c 20 72 2c 20         zDir, r, 
35fb0 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 42 75 66  0);.    if( zBuf
35fc0 5b 6e 42 75 66 2d 32 5d 21 3d 30 20 7c 7c 20 28  [nBuf-2]!=0 || (
35fd0 69 4c 69 6d 69 74 2b 2b 29 3e 31 30 20 29 20 72  iLimit++)>10 ) r
35fe0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
35ff0 4f 52 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73  OR;.  }while( os
36000 41 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d  Access(zBuf,0)==
36010 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  0 );.  return SQ
36020 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
36030 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
36040 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
36050 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
36060 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20  )./*.** Routine 
36070 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75  to transform a u
36080 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70  nixFile into a p
36090 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69  roxy-locking uni
360a0 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d  xFile..** Implem
360b0 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  entation in the 
360c0 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73  proxy-lock divis
360d0 69 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79  ion, but used by
360e0 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69   unixOpen().** i
360f0 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f  f SQLITE_PREFER_
36100 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73  PROXY_LOCKING is
36110 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61   defined..*/.sta
36120 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61  tic int proxyTra
36130 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75  nsformUnixFile(u
36140 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20  nixFile*, const 
36150 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a  char*);.#endif..
36160 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72  /*.** Search for
36170 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20   an unused file 
36180 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20  descriptor that 
36190 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  was opened on th
361a0 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66  e database .** f
361b0 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e  ile (not a journ
361c0 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75  al or master-jou
361d0 72 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74  rnal file) ident
361e0 69 66 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d  ified by pathnam
361f0 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20  e.** zPath with 
36200 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20  SQLITE_OPEN_XXX 
36210 66 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74  flags matching t
36220 68 6f 73 65 20 70 61 73 73 65 64 20 61 73 20 74  hose passed as t
36230 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67  he second.** arg
36240 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
36250 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75  nction..**.** Su
36260 63 68 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  ch a file descri
36270 70 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69  ptor may exist i
36280 66 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  f a database con
36290 6e 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73  nection was clos
362a0 65 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73  ed.** but the as
362b0 73 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64 65  sociated file de
362c0 73 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e  scriptor could n
362d0 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63  ot be closed bec
362e0 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68  ause some.** oth
362f0 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
36300 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  or open on the s
36310 61 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64  ame file is hold
36320 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e  ing a file-lock.
36330 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d  .** Refer to com
36340 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69  ments in the uni
36350 78 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f  xClose() functio
36360 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68  n and the length
36370 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73  y comment.** des
36380 63 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41  cribing "Posix A
36390 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22  dvisory Locking"
363a0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
363b0 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a   this file for .
363c0 2a 2a 20 66 75 72 74 68 65 72 20 64 65 74 61 69  ** further detai
363d0 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74  ls. Also, ticket
363e0 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66   #4018..**.** If
363f0 20 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65   a suitable file
36400 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 66   descriptor is f
36410 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73  ound, then it is
36420 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f   returned. If no
36430 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65  .** such file de
36440 73 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61  scriptor is loca
36450 74 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72  ted, -1 is retur
36460 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55  ned..*/.static U
36470 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e  nixUnusedFd *fin
36480 64 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73  dReusableFd(cons
36490 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69  t char *zPath, i
364a0 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69  nt flags){.  Uni
364b0 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
364c0 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f  ed = 0;..  /* Do
364d0 20 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20   not search for 
364e0 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  an unused file d
364f0 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77  escriptor on vxw
36500 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73  orks. Not becaus
36510 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77  e.  ** vxworks w
36520 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74  ould not benefit
36530 20 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65   from the change
36540 20 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72   (it might, we'r
36550 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a  e not sure),.  *
36560 2a 20 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f  * but because no
36570 20 77 61 79 20 74 6f 20 74 65 73 74 20 69 74 20   way to test it 
36580 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61  is currently ava
36590 69 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65  ilable. It is be
365a0 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74  tter .  ** not t
365b0 6f 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20  o risk breaking 
365c0 76 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20  vxworks support 
365d0 66 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20  for the sake of 
365e0 73 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20  such an obscure 
365f0 0a 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20  .  ** feature.  
36600 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52  */.#if !OS_VXWOR
36610 4b 53 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  KS.  struct stat
36620 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20   sStat;         
36630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
36640 75 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20 63  ults of stat() c
36650 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73  all */..  /* A s
36660 74 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66  tat() call may f
36670 61 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20  ail for various 
36680 72 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73  reasons. If this
36690 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a   happens, it is.
366a0 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74    ** almost cert
366b0 61 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e  ain that an open
366c0 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73  () call on the s
366d0 61 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c  ame path will al
366e0 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f  so fail..  ** Fo
366f0 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69  r this reason, i
36700 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
36710 73 20 69 6e 20 74 68 65 20 73 74 61 74 28 29 20  s in the stat() 
36720 63 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73  call here, it is
36730 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e  .  ** ignored an
36740 64 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64  d -1 is returned
36750 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
36760 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20  l try to open a 
36770 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65  new file.  ** de
36780 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20  scriptor on the 
36790 73 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c  same path, fail,
367a0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65   and return an e
367b0 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a  rror to SQLite..
367c0 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69    **.  ** Even i
367d0 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f  f a subsequent o
367e0 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20  pen() call does 
367f0 73 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e  succeed, the con
36800 73 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a  sequences of.  *
36810 2a 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20  * not searching 
36820 66 6f 72 20 61 20 72 65 75 73 61 62 6c 65 20 66  for a reusable f
36830 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
36840 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f  re not dire.  */
36850 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74  .  if( 0==osStat
36860 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29 20  (zPath, &sStat) 
36870 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65  ){.    unixInode
36880 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20  Info *pInode;.. 
36890 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
368a0 78 28 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20  x();.    pInode 
368b0 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20  = inodeList;.   
368c0 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26   while( pInode &
368d0 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  & (pInode->fileI
368e0 64 2e 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f  d.dev!=sStat.st_
368f0 64 65 76 0a 20 20 20 20 20 20 20 20 20 20 20 20  dev.            
36900 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f           || pIno
36910 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d  de->fileId.ino!=
36920 28 75 36 34 29 73 53 74 61 74 2e 73 74 5f 69 6e  (u64)sStat.st_in
36930 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 70 49 6e  o) ){.       pIn
36940 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e  ode = pInode->pN
36950 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ext;.    }.    i
36960 66 28 20 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20  f( pInode ){.   
36970 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20     UnixUnusedFd 
36980 2a 2a 70 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  **pp;.      for(
36990 70 70 3d 26 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  pp=&pInode->pUnu
369a0 73 65 64 3b 20 2a 70 70 20 26 26 20 28 2a 70 70  sed; *pp && (*pp
369b0 29 2d 3e 66 6c 61 67 73 21 3d 66 6c 61 67 73 3b  )->flags!=flags;
369c0 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65   pp=&((*pp)->pNe
369d0 78 74 29 29 3b 0a 20 20 20 20 20 20 70 55 6e 75  xt));.      pUnu
369e0 73 65 64 20 3d 20 2a 70 70 3b 0a 20 20 20 20 20  sed = *pp;.     
369f0 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a   if( pUnused ){.
36a00 20 20 20 20 20 20 20 20 2a 70 70 20 3d 20 70 55          *pp = pU
36a10 6e 75 73 65 64 2d 3e 70 4e 65 78 74 3b 0a 20 20  nused->pNext;.  
36a20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
36a30 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
36a40 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 20 20 20  ;.  }.#endif    
36a50 2f 2a 20 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b  /* if !OS_VXWORK
36a60 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 55  S */.  return pU
36a70 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nused;.}../*.** 
36a80 46 69 6e 64 20 74 68 65 20 6d 6f 64 65 2c 20 75  Find the mode, u
36a90 69 64 20 61 6e 64 20 67 69 64 20 6f 66 20 66 69  id and gid of fi
36aa0 6c 65 20 7a 46 69 6c 65 2e 20 0a 2a 2f 0a 73 74  le zFile. .*/.st
36ab0 61 74 69 63 20 69 6e 74 20 67 65 74 46 69 6c 65  atic int getFile
36ac0 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  Mode(.  const ch
36ad0 61 72 20 2a 7a 46 69 6c 65 2c 20 20 20 20 20 20  ar *zFile,      
36ae0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
36af0 6e 61 6d 65 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74  name */.  mode_t
36b00 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20 20 20   *pMode,        
36b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
36b20 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66  : Permissions of
36b30 20 7a 46 69 6c 65 20 2a 2f 0a 20 20 75 69 64 5f   zFile */.  uid_
36b40 74 20 2a 70 55 69 64 2c 20 20 20 20 20 20 20 20  t *pUid,        
36b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
36b60 55 54 3a 20 75 69 64 20 6f 66 20 7a 46 69 6c 65  UT: uid of zFile
36b70 2e 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a 70 47  . */.  gid_t *pG
36b80 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  id              
36b90 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 67         /* OUT: g
36ba0 69 64 20 6f 66 20 7a 46 69 6c 65 2e 20 2a 2f 0a  id of zFile. */.
36bb0 29 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  ){.  struct stat
36bc0 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20   sStat;         
36bd0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f       /* Output o
36be0 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74 61  f stat() on data
36bf0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
36c00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
36c10 4b 3b 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53 74  K;.  if( 0==osSt
36c20 61 74 28 7a 46 69 6c 65 2c 20 26 73 53 74 61 74  at(zFile, &sStat
36c30 29 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20  ) ){.    *pMode 
36c40 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20  = sStat.st_mode 
36c50 26 20 30 37 37 37 3b 0a 20 20 20 20 2a 70 55 69  & 0777;.    *pUi
36c60 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 75 69 64  d = sStat.st_uid
36c70 3b 0a 20 20 20 20 2a 70 47 69 64 20 3d 20 73 53  ;.    *pGid = sS
36c80 74 61 74 2e 73 74 5f 67 69 64 3b 0a 20 20 7d 65  tat.st_gid;.  }e
36c90 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
36ca0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
36cb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
36cc0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
36cd0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
36ce0 6c 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28  led by unixOpen(
36cf0 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  ) to determine t
36d00 68 65 20 75 6e 69 78 20 70 65 72 6d 69 73 73 69  he unix permissi
36d10 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65  ons.** to create
36d20 20 6e 65 77 20 66 69 6c 65 73 20 77 69 74 68 2e   new files with.
36d30 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
36d40 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  urs, then SQLITE
36d50 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
36d60 2a 2a 20 61 6e 64 20 61 20 76 61 6c 75 65 20 73  ** and a value s
36d70 75 69 74 61 62 6c 65 20 66 6f 72 20 70 61 73 73  uitable for pass
36d80 69 6e 67 20 61 73 20 74 68 65 20 74 68 69 72 64  ing as the third
36d90 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65   argument to ope
36da0 6e 28 32 29 20 69 73 0a 2a 2a 20 77 72 69 74 74  n(2) is.** writt
36db0 65 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66  en to *pMode. If
36dc0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
36dd0 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  urs, an SQLite e
36de0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a  rror code is .**
36df0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
36e00 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64  e value of *pMod
36e10 65 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65  e is not modifie
36e20 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73 74  d..**.** In most
36e30 20 63 61 73 65 73 2c 20 74 68 69 73 20 72 6f 75   cases, this rou
36e40 74 69 6e 65 20 73 65 74 73 20 2a 70 4d 6f 64 65  tine sets *pMode
36e50 20 74 6f 20 30 2c 20 77 68 69 63 68 20 77 69 6c   to 0, which wil
36e60 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20 69  l become.** an i
36e70 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20 72 6f 62  ndication to rob
36e80 75 73 74 5f 6f 70 65 6e 28 29 20 74 6f 20 63 72  ust_open() to cr
36e90 65 61 74 65 20 74 68 65 20 66 69 6c 65 20 75 73  eate the file us
36ea0 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 45  ing.** SQLITE_DE
36eb0 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
36ec0 53 53 49 4f 4e 53 20 61 64 6a 75 73 74 65 64 20  SSIONS adjusted 
36ed0 62 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a  by the umask..**
36ee0 20 42 75 74 20 69 66 20 74 68 65 20 66 69 6c 65   But if the file
36ef0 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73   being opened is
36f00 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75 6c 61   a WAL or regula
36f10 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  r journal file, 
36f20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75  then .** this fu
36f30 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73 20 74  nction queries t
36f40 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  he file-system f
36f50 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f  or the permissio
36f60 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63 6f  ns on the .** co
36f70 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61  rresponding data
36f80 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 73 65  base file and se
36f90 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68 69  ts *pMode to thi
36fa0 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65 76 65  s value. Wheneve
36fb0 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20  r .** possible, 
36fc0 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  WAL and journal 
36fd0 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65  files are create
36fe0 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  d using the same
36ff0 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a   permissions .**
37000 20 61 73 20 74 68 65 20 61 73 73 6f 63 69 61 74   as the associat
37010 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
37020 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  ..**.** If the S
37030 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33  QLITE_ENABLE_8_3
37040 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69 73  _NAMES option is
37050 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74   enabled, then t
37060 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 66  he.** original f
37070 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e 61 76 61  ilename is unava
37080 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 38 5f 33  ilable.  But 8_3
37090 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20 75  _NAMES is only u
370a0 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20 66  sed for.** FAT f
370b0 69 6c 65 73 79 73 74 65 6d 73 20 61 6e 64 20 70  ilesystems and p
370c0 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e 6f  ermissions do no
370d0 74 20 6d 61 74 74 65 72 20 74 68 65 72 65 2c 20  t matter there, 
370e0 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20 74  so just use.** t
370f0 68 65 20 64 65 66 61 75 6c 74 20 70 65 72 6d 69  he default permi
37100 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  ssions..*/.stati
37110 63 20 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65  c int findCreate
37120 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73  FileMode(.  cons
37130 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
37140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
37150 61 74 68 20 6f 66 20 66 69 6c 65 20 28 70 6f 73  ath of file (pos
37160 73 69 62 6c 79 29 20 62 65 69 6e 67 20 63 72 65  sibly) being cre
37170 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ated */.  int fl
37180 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
37190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
371a0 67 73 20 70 61 73 73 65 64 20 61 73 20 34 74 68  gs passed as 4th
371b0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70   argument to xOp
371c0 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74  en() */.  mode_t
371d0 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20 20 20   *pMode,        
371e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
371f0 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f  : Permissions to
37200 20 6f 70 65 6e 20 66 69 6c 65 20 77 69 74 68 20   open file with 
37210 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55 69 64  */.  uid_t *pUid
37220 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
37230 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64       /* OUT: uid
37240 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66   to set on the f
37250 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a  ile */.  gid_t *
37260 70 47 69 64 20 20 20 20 20 20 20 20 20 20 20 20  pGid            
37270 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
37280 20 67 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74   gid to set on t
37290 68 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  he file */.){.  
372a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
372b0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
372c0 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
372d0 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 30 3b 0a  /.  *pMode = 0;.
372e0 20 20 2a 70 55 69 64 20 3d 20 30 3b 0a 20 20 2a    *pUid = 0;.  *
372f0 70 47 69 64 20 3d 20 30 3b 0a 20 20 69 66 28 20  pGid = 0;.  if( 
37300 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  flags & (SQLITE_
37310 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f  OPEN_WAL|SQLITE_
37320 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
37330 4c 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  L) ){.    char z
37340 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  Db[MAX_PATHNAME+
37350 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62  1];     /* Datab
37360 61 73 65 20 66 69 6c 65 20 70 61 74 68 20 2a 2f  ase file path */
37370 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b 20 20 20  .    int nDb;   
37380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37390 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
373a0 76 61 6c 69 64 20 62 79 74 65 73 20 69 6e 20 7a  valid bytes in z
373b0 44 62 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50  Db */..    /* zP
373c0 61 74 68 20 69 73 20 61 20 70 61 74 68 20 74 6f  ath is a path to
373d0 20 61 20 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61   a WAL or journa
373e0 6c 20 66 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c  l file. The foll
373f0 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69  owing block deri
37400 76 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  ves.    ** the p
37410 61 74 68 20 74 6f 20 74 68 65 20 61 73 73 6f 63  ath to the assoc
37420 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66  iated database f
37430 69 6c 65 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20  ile from zPath. 
37440 54 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c  This block handl
37450 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 6f  es.    ** the fo
37460 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63  llowing naming c
37470 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20  onventions:.    
37480 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  **.    **   "<pa
37490 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61  th to db>-journa
374a0 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  l".    **   "<pa
374b0 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20  th to db>-wal". 
374c0 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74     **   "<path t
374d0 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22  o db>-journalNN"
374e0 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68  .    **   "<path
374f0 20 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20   to db>-walNN". 
37500 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65     **.    ** whe
37510 72 65 20 4e 4e 20 69 73 20 61 20 64 65 63 69 6d  re NN is a decim
37520 61 6c 20 6e 75 6d 62 65 72 2e 20 54 68 65 20 4e  al number. The N
37530 4e 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65 73  N naming schemes
37540 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 75 73 65   are .    ** use
37550 64 20 62 79 20 74 68 65 20 74 65 73 74 5f 6d 75  d by the test_mu
37560 6c 74 69 70 6c 65 78 2e 63 20 6d 6f 64 75 6c 65  ltiplex.c module
37570 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 44 62  ..    */.    nDb
37580 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
37590 33 30 28 7a 50 61 74 68 29 20 2d 20 31 3b 20 0a  30(zPath) - 1; .
375a0 20 20 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68      while( zPath
375b0 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 7b 0a 23 69  [nDb]!='-' ){.#i
375c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  fndef SQLITE_ENA
375d0 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 0a 20 20  BLE_8_3_NAMES.  
375e0 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 6e 6f      /* In the no
375f0 72 6d 61 6c 20 63 61 73 65 20 28 38 2b 33 20 66  rmal case (8+3 f
37600 69 6c 65 6e 61 6d 65 73 20 64 69 73 61 62 6c 65  ilenames disable
37610 64 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d) the journal f
37620 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a  ilename.      **
37630 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
37640 6f 20 63 6f 6e 74 61 69 6e 20 61 20 27 2d 27 20  o contain a '-' 
37650 63 68 61 72 61 63 74 65 72 2e 20 2a 2f 0a 20 20  character. */.  
37660 20 20 20 20 61 73 73 65 72 74 28 20 6e 44 62 3e      assert( nDb>
37670 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
37680 74 28 20 73 71 6c 69 74 65 33 49 73 61 6c 6e 75  t( sqlite3Isalnu
37690 6d 28 7a 50 61 74 68 5b 6e 44 62 5d 29 20 29 3b  m(zPath[nDb]) );
376a0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20  .#else.      /* 
376b0 49 66 20 38 2b 33 20 6e 61 6d 65 73 20 61 72 65  If 8+3 names are
376c0 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 6e 20   possible, then 
376d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
376e0 20 6d 69 67 68 74 20 6e 6f 74 20 63 6f 6e 74 61   might not conta
376f0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 27 2d  in.      ** a '-
37700 27 20 63 68 61 72 61 63 74 65 72 2e 20 20 53 6f  ' character.  So
37710 20 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20   check for that 
37720 63 61 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  case and return 
37730 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20  early. */.      
37740 69 66 28 20 6e 44 62 3d 3d 30 20 7c 7c 20 7a 50  if( nDb==0 || zP
37750 61 74 68 5b 6e 44 62 5d 3d 3d 27 2e 27 20 29 20  ath[nDb]=='.' ) 
37760 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
37770 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  ;.#endif.      n
37780 44 62 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Db--;.    }.    
37790 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50 61 74  memcpy(zDb, zPat
377a0 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a 44 62  h, nDb);.    zDb
377b0 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  [nDb] = '\0';.. 
377c0 20 20 20 72 63 20 3d 20 67 65 74 46 69 6c 65 4d     rc = getFileM
377d0 6f 64 65 28 7a 44 62 2c 20 70 4d 6f 64 65 2c 20  ode(zDb, pMode, 
377e0 70 55 69 64 2c 20 70 47 69 64 29 3b 0a 20 20 7d  pUid, pGid);.  }
377f0 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
37800 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
37810 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20  ETEONCLOSE ){.  
37820 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b    *pMode = 0600;
37830 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
37840 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
37850 5f 55 52 49 20 29 7b 0a 20 20 20 20 2f 2a 20 49  _URI ){.    /* I
37860 66 20 74 68 69 73 20 69 73 20 61 20 6d 61 69 6e  f this is a main
37870 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
37880 6e 64 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  nd the file was 
37890 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 61 20 55  opened using a U
378a0 52 49 0a 20 20 20 20 2a 2a 20 66 69 6c 65 6e 61  RI.    ** filena
378b0 6d 65 2c 20 63 68 65 63 6b 20 66 6f 72 20 74 68  me, check for th
378c0 65 20 22 6d 6f 64 65 6f 66 22 20 70 61 72 61 6d  e "modeof" param
378d0 65 74 65 72 2e 20 49 66 20 70 72 65 73 65 6e 74  eter. If present
378e0 2c 20 69 6e 74 65 72 70 72 65 74 0a 20 20 20 20  , interpret.    
378f0 2a 2a 20 69 74 73 20 76 61 6c 75 65 20 61 73 20  ** its value as 
37900 61 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 74  a filename and t
37910 72 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20 6d  ry to copy the m
37920 6f 64 65 2c 20 75 69 64 20 61 6e 64 20 67 69 64  ode, uid and gid
37930 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 61   from.    ** tha
37940 74 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  t file.  */.    
37950 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
37960 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
37970 6d 65 74 65 72 28 7a 50 61 74 68 2c 20 22 6d 6f  meter(zPath, "mo
37980 64 65 6f 66 22 29 3b 0a 20 20 20 20 69 66 28 20  deof");.    if( 
37990 7a 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  z ){.      rc = 
379a0 67 65 74 46 69 6c 65 4d 6f 64 65 28 7a 2c 20 70  getFileMode(z, p
379b0 4d 6f 64 65 2c 20 70 55 69 64 2c 20 70 47 69 64  Mode, pUid, pGid
379c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
379d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
379e0 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65  ** Open the file
379f0 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50   zPath..** .** P
37a00 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20 53  reviously, the S
37a10 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20 75  QLite OS layer u
37a20 73 65 64 20 74 68 72 65 65 20 66 75 6e 63 74 69  sed three functi
37a30 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  ons in place of 
37a40 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a  this.** one:.**.
37a50 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  **     sqlite3Os
37a60 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 29 3b  OpenReadWrite();
37a70 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
37a80 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b  sOpenReadOnly();
37a90 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
37aa0 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29  sOpenExclusive()
37ab0 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61  ;.**.** These ca
37ac0 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  lls correspond t
37ad0 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
37ae0 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20  combinations of 
37af0 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  flags:.**.**    
37b00 20 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e 20   ReadWrite() -> 
37b10 20 20 20 20 28 52 45 41 44 57 52 49 54 45 20 7c      (READWRITE |
37b20 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20 20   CREATE).**     
37b30 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20  ReadOnly()  ->  
37b40 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a     (READONLY) .*
37b50 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75 73  *     OpenExclus
37b60 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57 52  ive() -> (READWR
37b70 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20 45  ITE | CREATE | E
37b80 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20  XCLUSIVE).**.** 
37b90 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c  The old OpenExcl
37ba0 75 73 69 76 65 28 29 20 61 63 63 65 70 74 65 64  usive() accepted
37bb0 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d   a boolean argum
37bc0 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e  ent - "delFlag".
37bd0 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65   If.** true, the
37be0 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69 67   file was config
37bf0 75 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f 6d  ured to be autom
37c00 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
37c10 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c   when the.** fil
37c20 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e  e handle closed.
37c30 20 54 6f 20 61 63 68 69 65 76 65 20 74 68 65 20   To achieve the 
37c40 73 61 6d 65 20 65 66 66 65 63 74 20 75 73 69 6e  same effect usin
37c50 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69  g this new .** i
37c60 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20 74 68  nterface, add th
37c70 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  e DELETEONCLOSE 
37c80 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73 70  flag to those sp
37c90 65 63 69 66 69 65 64 20 61 62 6f 76 65 20 66 6f  ecified above fo
37ca0 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73  r .** OpenExclus
37cb0 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ive()..*/.static
37cc0 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20   int unixOpen(. 
37cd0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
37ce0 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fs,           /*
37cf0 20 54 68 65 20 56 46 53 20 66 6f 72 20 77 68 69   The VFS for whi
37d00 63 68 20 74 68 69 73 20 69 73 20 74 68 65 20 78  ch this is the x
37d10 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Open method */. 
37d20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
37d30 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  th,           /*
37d40 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c   Pathname of fil
37d50 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a  e to be opened *
37d60 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
37d70 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20   *pFile,        
37d80 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
37d90 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66 69  criptor to be fi
37da0 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74  lled in */.  int
37db0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
37dc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70            /* Inp
37dd0 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74  ut flags to cont
37de0 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20  rol the opening 
37df0 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c  */.  int *pOutFl
37e00 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
37e10 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61 67    /* Output flag
37e20 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51  s returned to SQ
37e30 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a  Lite core */.){.
37e40 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20    unixFile *p = 
37e50 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 46 69 6c  (unixFile *)pFil
37e60 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  e;.  int fd = -1
37e70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37e80 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
37e90 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64 20  riptor returned 
37ea0 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69  by open() */.  i
37eb0 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30  nt openFlags = 0
37ec0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
37ed0 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74   Flags to pass t
37ee0 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 69 66 20  o open() */.#if 
37ef0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41  SQLITE_ENABLE_DA
37f00 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20  TA_PROTECTION.  
37f10 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67  int eType = flag
37f20 73 26 30 78 46 46 30 46 46 46 30 30 3b 20 20 2f  s&0xFF0FFF00;  /
37f30 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74  * Type of file t
37f40 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6c 73 65 0a  o open */.#else.
37f50 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c    int eType = fl
37f60 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b 20  ags&0xFFFFFF00; 
37f70 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65   /* Type of file
37f80 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e 64   to open */.#end
37f90 69 66 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b  if.  int noLock;
37fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37fb0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f      /* True to o
37fc0 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d  mit locking prim
37fd0 69 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20  itives */.  int 
37fe0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
37ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
38000 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f  nction Return Co
38010 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c  de */.  int ctrl
38020 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20  Flags = 0;      
38030 20 20 20 20 20 20 20 2f 2a 20 55 4e 49 58 46 49         /* UNIXFI
38040 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a 20  LE_* flags */.. 
38050 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65   int isExclusive
38060 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
38070 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
38080 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c  VE);.  int isDel
38090 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ete     = (flags
380a0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
380b0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20  ELETEONCLOSE);. 
380c0 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20   int isCreate   
380d0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
380e0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
380f0 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e  ;.  int isReadon
38100 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ly   = (flags & 
38110 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
38120 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52  ONLY);.  int isR
38130 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61  eadWrite  = (fla
38140 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
38150 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 23 69 66  _READWRITE);.#if
38160 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
38170 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69  OCKING_STYLE.  i
38180 6e 74 20 69 73 41 75 74 6f 50 72 6f 78 79 20 20  nt isAutoProxy  
38190 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
381a0 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59  E_OPEN_AUTOPROXY
381b0 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  );.#endif.#if de
381c0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
381d0 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
381e0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
381f0 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20    struct statfs 
38200 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a  fsInfo;.#endif..
38210 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67    /* If creating
38220 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69   a master or mai
38230 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20  n-file journal, 
38240 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
38250 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66  ll open.  ** a f
38260 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f  ile-descriptor o
38270 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  n the directory 
38280 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74  too. The first t
38290 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20  ime unixSync(). 
382a0 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68   ** is called th
382b0 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65  e directory file
382c0 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c   descriptor will
382d0 20 62 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e   be fsync()ed an
382e0 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f  d close()d..  */
382f0 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20 3d  .  int syncDir =
38300 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a   (isCreate && (.
38310 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53          eType==S
38320 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
38330 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  R_JOURNAL .     
38340 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
38350 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
38360 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
38370 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
38380 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49  AL.  ));..  /* I
38390 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68  f argument zPath
383a0 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
383b0 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  er, this functio
383c0 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  n is required to
383d0 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d   open.  ** a tem
383e0 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65  porary file. Use
383f0 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20   this buffer to 
38400 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e  store the file n
38410 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63  ame in..  */.  c
38420 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58  har zTmpname[MAX
38430 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20 20  _PATHNAME+2];.  
38440 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
38450 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a  e = zPath;..  /*
38460 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f   Check the follo
38470 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
38480 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a  are true: .  **.
38490 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74    **   (a) Exact
384a0 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45  ly one of the RE
384b0 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44  ADWRITE and READ
384c0 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20  ONLY flags must 
384d0 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a  be set, and .  *
384e0 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54  *   (b) if CREAT
384f0 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52  E is set, then R
38500 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c  EADWRITE must al
38510 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20  so be set, and. 
38520 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43   **   (c) if EXC
38530 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74  LUSIVE is set, t
38540 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
38550 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
38560 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54  *   (d) if DELET
38570 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c  EONCLOSE is set,
38580 20 74 68 65 6e 20 43 52