/ Hex Artifact Content
Login

Artifact b1ebd1705bb67d5bdb4633ee8ca0854fa2ff9026cd3ac00baa0aea20a34f6bd4:


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 73 79  .h>.#include <sy
0ce0: 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 69 6e 63 6c  s/ioctl.h>.#incl
0cf0: 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23  ude <unistd.h>.#
0d00: 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e  include <time.h>
0d10: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
0d20: 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ime.h>.#include 
0d30: 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 66 20 21 64  <errno.h>.#if !d
0d40: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
0d50: 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
0d60: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
0d70: 30 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  0.# include <sys
0d80: 2f 6d 6d 61 6e 2e 68 3e 0a 23 65 6e 64 69 66 0a  /mman.h>.#endif.
0d90: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
0da0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
0db0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  .# include <sys/
0dc0: 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e 63 6c 75  ioctl.h>.# inclu
0dd0: 64 65 20 3c 75 75 69 64 2f 75 75 69 64 2e 68 3e  de <uuid/uuid.h>
0de0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  .# include <sys/
0df0: 66 69 6c 65 2e 68 3e 0a 23 20 69 6e 63 6c 75 64  file.h>.# includ
0e00: 65 20 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e 0a  e <sys/param.h>.
0e10: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
0e20: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0e30: 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64 65  STYLE */..#if de
0e40: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0e50: 20 26 26 20 28 28 5f 5f 4d 41 43 5f 4f 53 5f 58   && ((__MAC_OS_X
0e60: 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51  _VERSION_MIN_REQ
0e70: 55 49 52 45 44 20 3e 20 31 30 35 30 29 20 7c 7c  UIRED > 1050) ||
0e80: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
0e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 5f                (_
0ea0: 5f 49 50 48 4f 4e 45 5f 4f 53 5f 56 45 52 53 49  _IPHONE_OS_VERSI
0eb0: 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 20  ON_MIN_REQUIRED 
0ec0: 3e 20 32 30 30 30 29 29 0a 23 20 20 69 66 20 28  > 2000)).#  if (
0ed0: 21 64 65 66 69 6e 65 64 28 54 41 52 47 45 54 5f  !defined(TARGET_
0ee0: 4f 53 5f 45 4d 42 45 44 44 45 44 29 20 7c 7c 20  OS_EMBEDDED) || 
0ef0: 28 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45 44  (TARGET_OS_EMBED
0f00: 44 45 44 3d 3d 30 29 29 20 5c 0a 20 20 20 20 20  DED==0)) \.     
0f10: 20 20 26 26 20 28 21 64 65 66 69 6e 65 64 28 54    && (!defined(T
0f20: 41 52 47 45 54 5f 49 50 48 4f 4e 45 5f 53 49 4d  ARGET_IPHONE_SIM
0f30: 55 4c 41 54 4f 52 29 20 7c 7c 20 28 54 41 52 47  ULATOR) || (TARG
0f40: 45 54 5f 49 50 48 4f 4e 45 5f 53 49 4d 55 4c 41  ET_IPHONE_SIMULA
0f50: 54 4f 52 3d 3d 30 29 29 0a 23 20 20 20 20 64 65  TOR==0)).#    de
0f60: 66 69 6e 65 20 48 41 56 45 5f 47 45 54 48 4f 53  fine HAVE_GETHOS
0f70: 54 55 55 49 44 20 31 0a 23 20 20 65 6c 73 65 0a  TUUID 1.#  else.
0f80: 23 20 20 20 20 77 61 72 6e 69 6e 67 20 22 67 65  #    warning "ge
0f90: 74 68 6f 73 74 75 75 69 64 28 29 20 69 73 20 64  thostuuid() is d
0fa0: 69 73 61 62 6c 65 64 2e 22 0a 23 20 20 65 6e 64  isabled.".#  end
0fb0: 69 66 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20  if.#endif...#if 
0fc0: 4f 53 5f 56 58 57 4f 52 4b 53 0a 23 20 69 6e 63  OS_VXWORKS.# inc
0fd0: 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e  lude <sys/ioctl.
0fe0: 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 65  h>.# include <se
0ff0: 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 69 6e 63  maphore.h>.# inc
1000: 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a  lude <limits.h>.
1010: 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
1020: 4f 52 4b 53 20 2a 2f 0a 0a 23 69 66 20 64 65 66  ORKS */..#if def
1030: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
1040: 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  || SQLITE_ENABLE
1050: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23  _LOCKING_STYLE.#
1060: 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f   include <sys/mo
1070: 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23  unt.h>.#endif..#
1080: 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45  ifdef HAVE_UTIME
1090: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 74 69 6d  .# include <utim
10a0: 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e.h>.#endif../*.
10b0: 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65  ** Allowed value
10c0: 73 20 6f 66 20 75 6e 69 78 46 69 6c 65 2e 66 73  s of unixFile.fs
10d0: 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  Flags.*/.#define
10e0: 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
10f0: 49 53 5f 4d 53 44 4f 53 20 20 20 20 20 30 78 31  IS_MSDOS     0x1
1100: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
1110: 65 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d 73  e to be thread-s
1120: 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68 65  afe, include the
1130: 20 70 74 68 72 65 61 64 73 20 68 65 61 64 65 72   pthreads header
1140: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
1150: 54 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e 63  THREADSAFE.# inc
1160: 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68 3e  lude <pthread.h>
1170: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
1180: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
1190: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
11a0: 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23   a new file.*/.#
11b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
11c0: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
11d0: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
11e0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
11f0: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  ILE_PERMISSIONS 
1200: 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0644.#endif../*.
1210: 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69  ** Default permi
1220: 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61  ssions when crea
1230: 74 69 6e 67 20 61 75 74 6f 20 70 72 6f 78 79 20  ting auto proxy 
1240: 64 69 72 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  dir.*/.#ifndef S
1250: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
1260: 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
1270: 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  NS.# define SQLI
1280: 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59  TE_DEFAULT_PROXY
1290: 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  DIR_PERMISSIONS 
12a0: 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0755.#endif../*.
12b0: 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70 70 6f  ** Maximum suppo
12c0: 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67 74 68  rted path-length
12d0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58  ..*/.#define MAX
12e0: 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a 0a 2f  _PATHNAME 512../
12f0: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70  *.** Maximum sup
1300: 70 6f 72 74 65 64 20 73 79 6d 62 6f 6c 69 63 20  ported symbolic 
1310: 6c 69 6e 6b 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  links.*/.#define
1320: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 59 4d 4c   SQLITE_MAX_SYML
1330: 49 4e 4b 53 20 31 30 30 0a 0a 2f 2a 20 41 6c 77  INKS 100../* Alw
1340: 61 79 73 20 63 61 73 74 20 74 68 65 20 67 65 74  ays cast the get
1350: 70 69 64 28 29 20 72 65 74 75 72 6e 20 74 79 70  pid() return typ
1360: 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 69 6c  e for compatibil
1370: 69 74 79 20 77 69 74 68 0a 2a 2a 20 6b 65 72 6e  ity with.** kern
1380: 65 6c 20 6d 6f 64 75 6c 65 73 20 69 6e 20 56 78  el modules in Vx
1390: 57 6f 72 6b 73 2e 20 2a 2f 0a 23 64 65 66 69 6e  Works. */.#defin
13a0: 65 20 6f 73 47 65 74 70 69 64 28 58 29 20 28 70  e osGetpid(X) (p
13b0: 69 64 5f 74 29 67 65 74 70 69 64 28 29 0a 0a 2f  id_t)getpid()../
13c0: 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74 68  *.** Only set th
13d0: 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20 74  e lastErrno if t
13e0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
13f0: 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61 6e   a real error an
1400: 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72 6d  d not .** a norm
1410: 61 6c 20 65 78 70 65 63 74 65 64 20 72 65 74 75  al expected retu
1420: 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49 54  rn code of SQLIT
1430: 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54 45  E_BUSY or SQLITE
1440: 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49  _OK.*/.#define I
1450: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29 20  S_LOCK_ERROR(x) 
1460: 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 4f   ((x != SQLITE_O
1470: 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c 49  K) && (x != SQLI
1480: 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20 46 6f  TE_BUSY))../* Fo
1490: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73  rward references
14a0: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
14b0: 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69 78 53  ct unixShm unixS
14c0: 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hm;             
14d0: 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
14e0: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
14f0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1500: 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e 69 78  unixShmNode unix
1510: 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 2f  ShmNode;       /
1520: 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * Shared memory 
1530: 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79 70 65  instance */.type
1540: 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 49  def struct unixI
1550: 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49 6e 6f  nodeInfo unixIno
1560: 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e 20  deInfo;   /* An 
1570: 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65 64 65  i-node */.typede
1580: 66 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e 75  f struct UnixUnu
1590: 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65 64  sedFd UnixUnused
15a0: 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e  Fd;     /* An un
15b0: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
15c0: 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  ptor */../*.** S
15d0: 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72 20  ometimes, after 
15e0: 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69 73  a file handle is
15f0: 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69 74   closed by SQLit
1600: 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  e, the file desc
1610: 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f 74  riptor.** cannot
1620: 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64   be closed immed
1630: 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73 65  iately. In these
1640: 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63 65   cases, instance
1650: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
1660: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  ng.** structure 
1670: 61 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72  are used to stor
1680: 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
1690: 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69 74  iptor while wait
16a0: 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f 70  ing for an.** op
16b0: 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69 74  portunity to eit
16c0: 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65 75  her close or reu
16d0: 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74  se it..*/.struct
16e0: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 7b 0a   UnixUnusedFd {.
16f0: 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
1700: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1710: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
1720: 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e 74  o close */.  int
1730: 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20   flags;         
1740: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
1750: 74 68 69 73 20 66 69 6c 65 20 64 65 73 63 72 69  this file descri
1760: 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  ptor was opened 
1770: 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  with */.  UnixUn
1780: 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 20 20  usedFd *pNext;  
1790: 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75 73      /* Next unus
17a0: 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
17b0: 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c 65 20  or on same file 
17c0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  */.};../*.** The
17d0: 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
17e0: 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73 20  ure is subclass 
17f0: 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  of sqlite3_file 
1800: 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65 20  specific to the 
1810: 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d 70 6c  unix.** VFS impl
1820: 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f 0a  ementations..*/.
1830: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75  typedef struct u
1840: 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c 65  nixFile unixFile
1850: 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c  ;.struct unixFil
1860: 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  e {.  sqlite3_io
1870: 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a  _methods const *
1880: 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c 77  pMethod;  /* Alw
1890: 61 79 73 20 74 68 65 20 66 69 72 73 74 20 65 6e  ays the first en
18a0: 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  try */.  sqlite3
18b0: 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20  _vfs *pVfs;     
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18d0: 54 68 65 20 56 46 53 20 74 68 61 74 20 63 72 65  The VFS that cre
18e0: 61 74 65 64 20 74 68 69 73 20 75 6e 69 78 46 69  ated this unixFi
18f0: 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  le */.  unixInod
1900: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20  eInfo *pInode;  
1910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1920: 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73 20  nfo about locks 
1930: 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f  on this inode */
1940: 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20  .  int h;       
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
1970: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
1980: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1990: 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20   eFileLock;     
19a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 79         /* The ty
19b0: 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64 20  pe of lock held 
19c0: 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20 20  on this fd */.  
19d0: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69  unsigned short i
19e0: 6e 74 20 63 74 72 6c 46 6c 61 67 73 3b 20 20 20  nt ctrlFlags;   
19f0: 20 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72 61      /* Behaviora
1a00: 6c 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49 4c  l bits.  UNIXFIL
1a10: 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69  E_* flags */.  i
1a20: 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20  nt lastErrno;   
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a40: 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20 65     /* The unix e
1a50: 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20 49  rrno from last I
1a60: 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76 6f  /O error */.  vo
1a70: 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  id *lockingConte
1a80: 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  xt;             
1a90: 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74 79    /* Locking sty
1aa0: 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61 74  le specific stat
1ab0: 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65  e */.  UnixUnuse
1ac0: 64 46 64 20 2a 70 50 72 65 61 6c 6c 6f 63 61 74  dFd *pPreallocat
1ad0: 65 64 55 6e 75 73 65 64 3b 20 20 2f 2a 20 50 72  edUnused;  /* Pr
1ae0: 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69 78  e-allocated Unix
1af0: 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63 6f  UnusedFd */.  co
1b00: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b  nst char *zPath;
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b20: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1b30: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53   file */.  unixS
1b40: 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20 20  hm *pShm;       
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b60: 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * Shared memory 
1b70: 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61 74  segment informat
1b80: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 43  ion */.  int szC
1b90: 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20  hunk;           
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bb0: 43 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46 43  Configured by FC
1bc0: 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 2a  NTL_CHUNK_SIZE *
1bd0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  /.#if SQLITE_MAX
1be0: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69  _MMAP_SIZE>0.  i
1bf0: 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20 20  nt nFetchOut;   
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c20: 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74  outstanding xFet
1c30: 63 68 20 72 65 66 73 20 2a 2f 0a 20 20 73 71 6c  ch refs */.  sql
1c40: 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53  ite3_int64 mmapS
1c50: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1c60: 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20   /* Usable size 
1c70: 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70 4d  of mapping at pM
1c80: 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71  apRegion */.  sq
1c90: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70  lite3_int64 mmap
1ca0: 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20 20  SizeActual;     
1cb0: 20 20 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a 65    /* Actual size
1cc0: 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70   of mapping at p
1cd0: 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73  MapRegion */.  s
1ce0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
1cf0: 70 53 69 7a 65 4d 61 78 3b 20 20 20 20 20 20 20  pSizeMax;       
1d00: 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64     /* Configured
1d10: 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45   FCNTL_MMAP_SIZE
1d20: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 76 6f 69 64   value */.  void
1d30: 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20   *pMapRegion;   
1d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d50: 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64  /* Memory mapped
1d60: 20 72 65 67 69 6f 6e 20 2a 2f 0a 23 65 6e 64 69   region */.#endi
1d70: 66 0a 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69  f.  int sectorSi
1d80: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
1d90: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
1da0: 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f  e sector size */
1db0: 0a 20 20 69 6e 74 20 64 65 76 69 63 65 43 68 61  .  int deviceCha
1dc0: 72 61 63 74 65 72 69 73 74 69 63 73 3b 20 20 20  racteristics;   
1dd0: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 63 6f 6d         /* Precom
1de0: 70 75 74 65 64 20 64 65 76 69 63 65 20 63 68 61  puted device cha
1df0: 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a  racteristics */.
1e00: 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
1e10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
1e20: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  || defined(__APP
1e30: 4c 45 5f 5f 29 0a 20 20 69 6e 74 20 6f 70 65 6e  LE__).  int open
1e40: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e60: 68 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69  he flags specifi
1e70: 65 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a  ed at open() */.
1e80: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
1e90: 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52  E_ENABLE_DATA_PR
1ea0: 4f 54 45 43 54 49 4f 4e 0a 20 20 69 6e 74 20 70  OTECTION.  int p
1eb0: 72 6f 74 46 6c 61 67 73 3b 20 20 20 20 20 20 20  rotFlags;       
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ed0: 2a 20 44 61 74 61 20 70 72 6f 74 65 63 74 69 6f  * Data protectio
1ee0: 6e 20 66 6c 61 67 73 20 66 72 6f 6d 20 75 6e 69  n flags from uni
1ef0: 78 4f 70 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a  xOpen */.#endif.
1f00: 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
1f10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
1f20: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  || defined(__APP
1f30: 4c 45 5f 5f 29 0a 20 20 75 6e 73 69 67 6e 65 64  LE__).  unsigned
1f40: 20 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20   fsFlags;       
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
1f60: 61 63 68 65 64 20 64 65 74 61 69 6c 73 20 66 72  ached details fr
1f70: 6f 6d 20 73 74 61 74 66 73 28 29 20 2a 2f 0a 23  om statfs() */.#
1f80: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
1f90: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c 4b  ITE_ENABLE_SETLK
1fa0: 5f 54 49 4d 45 4f 55 54 0a 20 20 75 6e 73 69 67  _TIMEOUT.  unsig
1fb0: 6e 65 64 20 69 42 75 73 79 54 69 6d 65 6f 75 74  ned iBusyTimeout
1fc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1fd0: 2a 20 57 61 69 74 20 74 68 69 73 20 6d 61 6e 79  * Wait this many
1fe0: 20 6d 69 6c 6c 69 73 65 63 20 6f 6e 20 6c 6f 63   millisec on loc
1ff0: 6b 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  ks */.#endif.#if
2000: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74   OS_VXWORKS.  st
2010: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
2020: 49 64 20 2a 70 49 64 3b 20 20 20 20 20 20 20 20  Id *pId;        
2030: 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65    /* Unique file
2040: 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69   ID */.#endif.#i
2050: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2060: 47 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  G.  /* The next 
2070: 67 72 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c  group of variabl
2080: 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 74  es are used to t
2090: 72 61 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20  rack whether or 
20a0: 6e 6f 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61  not the.  ** tra
20b0: 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
20c0: 20 69 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20   in bytes 24-27 
20d0: 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  of database file
20e0: 73 20 61 72 65 20 75 70 64 61 74 65 64 0a 20 20  s are updated.  
20f0: 2a 2a 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20  ** whenever any 
2100: 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
2110: 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41  base changes.  A
2120: 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c  n assertion faul
2130: 74 20 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75  t will.  ** occu
2140: 72 20 69 66 20 61 20 66 69 6c 65 20 69 73 20 75  r if a file is u
2150: 70 64 61 74 65 64 20 77 69 74 68 6f 75 74 20 61  pdated without a
2160: 6c 73 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65  lso updating the
2170: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
2180: 2a 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73  * counter.  This
2190: 20 74 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f   test is made to
21a0: 20 61 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c   avoid new probl
21b0: 65 6d 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74  ems similar to t
21c0: 68 65 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63  he.  ** one desc
21d0: 72 69 62 65 64 20 62 79 20 74 69 63 6b 65 74 20  ribed by ticket 
21e0: 23 33 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75  #3584. .  */.  u
21f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 72 61  nsigned char tra
2200: 6e 73 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a  nsCntrChng;   /*
2210: 20 54 72 75 65 20 69 66 20 74 68 65 20 74 72 61   True if the tra
2220: 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
2230: 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e   changed */.  un
2240: 73 69 67 6e 65 64 20 63 68 61 72 20 64 62 55 70  signed char dbUp
2250: 64 61 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  date;        /* 
2260: 54 72 75 65 20 69 66 20 61 6e 79 20 70 61 72 74  True if any part
2270: 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c   of database fil
2280: 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75  e changed */.  u
2290: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e  nsigned char inN
22a0: 6f 72 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a  ormalWrite;   /*
22b0: 20 54 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f   True if in a no
22c0: 72 6d 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61  rmal write opera
22d0: 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e 64 69 66 0a  tion */..#endif.
22e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
22f0: 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74  EST.  /* In test
2300: 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73 65 20   mode, increase 
2310: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 69 73  the size of this
2320: 20 73 74 72 75 63 74 75 72 65 20 61 20 62 69 74   structure a bit
2330: 20 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a 20 69   so that .  ** i
2340: 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  t is larger than
2350: 20 74 68 65 20 73 74 72 75 63 74 20 43 72 61 73   the struct Cras
2360: 68 46 69 6c 65 20 64 65 66 69 6e 65 64 20 69 6e  hFile defined in
2370: 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20   test6.c..  */. 
2380: 20 63 68 61 72 20 61 50 61 64 64 69 6e 67 5b 33   char aPadding[3
2390: 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f  2];.#endif.};../
23a0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
23b0: 68 6f 6c 64 73 20 74 68 65 20 70 72 6f 63 65 73  holds the proces
23c0: 73 20 69 64 20 28 70 69 64 29 20 66 72 6f 6d 20  s id (pid) from 
23d0: 77 68 65 6e 20 74 68 65 20 78 52 61 6e 64 6f 6d  when the xRandom
23e0: 6e 65 73 73 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  ness().** method
23f0: 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 20 49 66   was called.  If
2400: 20 78 4f 70 65 6e 28 29 20 69 73 20 63 61 6c 6c   xOpen() is call
2410: 65 64 20 66 72 6f 6d 20 61 20 64 69 66 66 65 72  ed from a differ
2420: 65 6e 74 20 70 72 6f 63 65 73 73 20 69 64 2c 0a  ent process id,.
2430: 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  ** indicating th
2440: 61 74 20 61 20 66 6f 72 6b 28 29 20 68 61 73 20  at a fork() has 
2450: 6f 63 63 75 72 72 65 64 2c 20 74 68 65 20 50 52  occurred, the PR
2460: 4e 47 20 77 69 6c 6c 20 62 65 20 72 65 73 65 74  NG will be reset
2470: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 70 69 64 5f  ..*/.static pid_
2480: 74 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20  t randomnessPid 
2490: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  = 0;../*.** Allo
24a0: 77 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 74  wed values for t
24b0: 68 65 20 75 6e 69 78 46 69 6c 65 2e 63 74 72 6c  he unixFile.ctrl
24c0: 46 6c 61 67 73 20 62 69 74 6d 61 73 6b 3a 0a 2a  Flags bitmask:.*
24d0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
24e0: 4c 45 5f 45 58 43 4c 20 20 20 20 20 20 20 20 30  LE_EXCL        0
24f0: 78 30 31 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65  x01     /* Conne
2500: 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65 20  ctions from one 
2510: 70 72 6f 63 65 73 73 20 6f 6e 6c 79 20 2a 2f 0a  process only */.
2520: 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45  #define UNIXFILE
2530: 5f 52 44 4f 4e 4c 59 20 20 20 20 20 20 30 78 30  _RDONLY      0x0
2540: 32 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74  2     /* Connect
2550: 69 6f 6e 20 69 73 20 72 65 61 64 20 6f 6e 6c 79  ion is read only
2560: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
2570: 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c  FILE_PERSIST_WAL
2580: 20 30 78 30 34 20 20 20 20 20 2f 2a 20 50 65 72   0x04     /* Per
2590: 73 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65  sistent WAL mode
25a0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
25b0: 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
25c0: 4e 43 0a 23 20 64 65 66 69 6e 65 20 55 4e 49 58  NC.# define UNIX
25d0: 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 20 20 20  FILE_DIRSYNC    
25e0: 30 78 30 38 20 20 20 20 20 2f 2a 20 44 69 72 65  0x08     /* Dire
25f0: 63 74 6f 72 79 20 73 79 6e 63 20 6e 65 65 64 65  ctory sync neede
2600: 64 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 64 65 66  d */.#else.# def
2610: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44 49 52  ine UNIXFILE_DIR
2620: 53 59 4e 43 20 20 20 20 30 78 30 30 0a 23 65 6e  SYNC    0x00.#en
2630: 64 69 66 0a 23 64 65 66 69 6e 65 20 55 4e 49 58  dif.#define UNIX
2640: 46 49 4c 45 5f 50 53 4f 57 20 20 20 20 20 20 20  FILE_PSOW       
2650: 20 30 78 31 30 20 20 20 20 20 2f 2a 20 53 51 4c   0x10     /* SQL
2660: 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
2670: 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f  AFE_OVERWRITE */
2680: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2690: 45 5f 44 45 4c 45 54 45 20 20 20 20 20 20 30 78  E_DELETE      0x
26a0: 32 30 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65  20     /* Delete
26b0: 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 23 64 65   on close */.#de
26c0: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 55 52  fine UNIXFILE_UR
26d0: 49 20 20 20 20 20 20 20 20 20 30 78 34 30 20 20  I         0x40  
26e0: 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 6d     /* Filename m
26f0: 69 67 68 74 20 68 61 76 65 20 71 75 65 72 79 20  ight have query 
2700: 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 23 64  parameters */.#d
2710: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 4e  efine UNIXFILE_N
2720: 4f 4c 4f 43 4b 20 20 20 20 20 20 30 78 38 30 20  OLOCK      0x80 
2730: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 66 69 6c      /* Do no fil
2740: 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 0a 2f 2a  e locking */../*
2750: 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64 65  .** Include code
2760: 20 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20   that is common 
2770: 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69  to all os_*.c fi
2780: 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  les.*/.#include 
2790: 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f  "os_common.h"../
27a0: 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61 72 69  *.** Define vari
27b0: 6f 75 73 20 6d 61 63 72 6f 73 20 74 68 61 74 20  ous macros that 
27c0: 61 72 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d  are missing from
27d0: 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e 0a 2a   some systems..*
27e0: 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41 52 47  /.#ifndef O_LARG
27f0: 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f  EFILE.# define O
2800: 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e  _LARGEFILE 0.#en
2810: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
2820: 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20  E_DISABLE_LFS.# 
2830: 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c  undef O_LARGEFIL
2840: 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52  E.# define O_LAR
2850: 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a  GEFILE 0.#endif.
2860: 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c  #ifndef O_NOFOLL
2870: 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4e 4f  OW.# define O_NO
2880: 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69 66 0a  FOLLOW 0.#endif.
2890: 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59  #ifndef O_BINARY
28a0: 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41  .# define O_BINA
28b0: 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  RY 0.#endif../*.
28c0: 2a 2a 20 54 68 65 20 74 68 72 65 61 64 69 64 20  ** The threadid 
28d0: 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65 73 20 74  macro resolves t
28e0: 6f 20 74 68 65 20 74 68 72 65 61 64 2d 69 64 20  o the thread-id 
28f0: 6f 72 20 74 6f 20 30 2e 20 20 55 73 65 64 20 66  or to 0.  Used f
2900: 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
2910: 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
2920: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
2930: 54 48 52 45 41 44 53 41 46 45 0a 23 64 65 66 69  THREADSAFE.#defi
2940: 6e 65 20 74 68 72 65 61 64 69 64 20 70 74 68 72  ne threadid pthr
2950: 65 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65  ead_self().#else
2960: 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64 69  .#define threadi
2970: 64 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  d 0.#endif..#ifd
2980: 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 23 64 65  ef __APPLE__.#de
2990: 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42  fine SQLITE_ENAB
29a0: 4c 45 5f 53 55 50 45 52 4c 4f 43 4b 20 31 0a 23  LE_SUPERLOCK 1.#
29b0: 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
29c0: 45 5f 45 4e 41 42 4c 45 5f 53 55 50 45 52 4c 4f  E_ENABLE_SUPERLO
29d0: 43 4b 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  CK.#include "sql
29e0: 69 74 65 33 2e 68 22 0a 23 69 6e 63 6c 75 64 65  ite3.h".#include
29f0: 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63   <string.h>.#inc
2a00: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
2a10: 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75  ./*.** A structu
2a20: 72 65 20 74 6f 20 63 6f 6c 6c 65 63 74 20 61 20  re to collect a 
2a30: 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
2a40: 6c 62 61 63 6b 20 61 6e 64 20 61 72 67 75 6d 65  lback and argume
2a50: 6e 74 20 61 6e 64 20 61 20 63 6f 75 6e 74 0a 2a  nt and a count.*
2a60: 2a 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * of the number 
2a70: 6f 66 20 74 69 6d 65 73 20 69 74 20 68 61 73 20  of times it has 
2a80: 62 65 65 6e 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f  been invoked..*/
2a90: 0a 73 74 72 75 63 74 20 53 75 70 65 72 6c 6f 63  .struct Superloc
2aa0: 6b 42 75 73 79 20 7b 0a 20 20 69 6e 74 20 28 2a  kBusy {.  int (*
2ab0: 78 42 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74  xBusy)(void*,int
2ac0: 29 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  );        /* Poi
2ad0: 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e  nter to busy-han
2ae0: 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  dler function */
2af0: 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 41 72  .  void *pBusyAr
2b00: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
2b10: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
2b20: 74 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73 79  to pass to xBusy
2b30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 75 73 79 3b   */.  int nBusy;
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2b60: 6f 66 20 74 69 6d 65 73 20 78 42 75 73 79 20 68  of times xBusy h
2b70: 61 73 20 62 65 65 6e 20 69 6e 76 6f 6b 65 64 20  as been invoked 
2b80: 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74  */.};.typedef st
2b90: 72 75 63 74 20 53 75 70 65 72 6c 6f 63 6b 42 75  ruct SuperlockBu
2ba0: 73 79 20 53 75 70 65 72 6c 6f 63 6b 42 75 73 79  sy SuperlockBusy
2bb0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
2bc0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
2bd0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
2be0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  is allocated for
2bf0: 20 65 61 63 68 20 61 63 74 69 76 65 0a 2a 2a 20   each active.** 
2c00: 73 75 70 65 72 6c 6f 63 6b 2e 20 54 68 65 20 6f  superlock. The o
2c10: 70 61 71 75 65 20 68 61 6e 64 6c 65 20 72 65 74  paque handle ret
2c20: 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
2c30: 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 29  demo_superlock()
2c40: 20 69 73 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20   is.** actually 
2c50: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
2c60: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
2c70: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
2c80: 74 72 75 63 74 20 53 75 70 65 72 6c 6f 63 6b 20  truct Superlock 
2c90: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
2cc0: 68 61 6e 64 6c 65 20 75 73 65 64 20 74 6f 20 6c  handle used to l
2cd0: 6f 63 6b 20 64 62 20 2a 2f 0a 20 20 69 6e 74 20  ock db */.  int 
2ce0: 62 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  bWal;           
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2d00: 72 75 65 20 69 66 20 64 62 20 69 73 20 61 20 57  rue if db is a W
2d10: 41 4c 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 7d  AL database */.}
2d20: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
2d30: 20 53 75 70 65 72 6c 6f 63 6b 20 53 75 70 65 72   Superlock Super
2d40: 6c 6f 63 6b 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  lock;../*.** The
2d50: 20 70 43 74 78 20 70 6f 69 6e 74 65 72 20 70 61   pCtx pointer pa
2d60: 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
2d70: 63 74 69 6f 6e 20 69 73 20 61 63 74 75 61 6c 6c  ction is actuall
2d80: 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  y a pointer to a
2d90: 0a 2a 2a 20 53 75 70 65 72 6c 6f 63 6b 42 75 73  .** SuperlockBus
2da0: 79 20 73 74 72 75 63 74 75 72 65 2e 20 49 6e 76  y structure. Inv
2db0: 6f 6b 65 20 74 68 65 20 62 75 73 79 2d 68 61 6e  oke the busy-han
2dc0: 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 65 6e  dler function en
2dd0: 63 61 70 73 75 6c 61 74 65 64 0a 2a 2a 20 62 79  capsulated.** by
2de0: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 61   the structure a
2df0: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 72 65  nd return the re
2e00: 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sult..*/.static 
2e10: 69 6e 74 20 73 75 70 65 72 6c 6f 63 6b 42 75 73  int superlockBus
2e20: 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70  yHandler(void *p
2e30: 43 74 78 2c 20 69 6e 74 20 55 4e 55 53 45 44 29  Ctx, int UNUSED)
2e40: 7b 0a 20 20 53 75 70 65 72 6c 6f 63 6b 42 75 73  {.  SuperlockBus
2e50: 79 20 2a 70 42 75 73 79 20 3d 20 28 53 75 70 65  y *pBusy = (Supe
2e60: 72 6c 6f 63 6b 42 75 73 79 20 2a 29 70 43 74 78  rlockBusy *)pCtx
2e70: 3b 0a 20 20 69 66 28 20 70 42 75 73 79 2d 3e 78  ;.  if( pBusy->x
2e80: 42 75 73 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  Busy==0 ) return
2e90: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 75   0;.  return pBu
2ea0: 73 79 2d 3e 78 42 75 73 79 28 70 42 75 73 79 2d  sy->xBusy(pBusy-
2eb0: 3e 70 42 75 73 79 41 72 67 2c 20 70 42 75 73 79  >pBusyArg, pBusy
2ec0: 2d 3e 6e 42 75 73 79 2b 2b 29 3b 0a 7d 0a 0a 2f  ->nBusy++);.}../
2ed0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2ee0: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  on is used to de
2ef0: 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6d  termine if the m
2f00: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
2f10: 65 20 66 6f 72 20 0a 2a 2a 20 63 6f 6e 6e 65 63  e for .** connec
2f20: 74 69 6f 6e 20 64 62 20 69 73 20 6f 70 65 6e 20  tion db is open 
2f30: 69 6e 20 57 41 4c 20 6d 6f 64 65 20 6f 72 20 6e  in WAL mode or n
2f40: 6f 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  ot. If no error 
2f50: 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 0a 2a  occurs and the.*
2f60: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
2f70: 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20  is in WAL mode, 
2f80: 73 65 74 20 2a 70 62 57 61 6c 20 74 6f 20 74 72  set *pbWal to tr
2f90: 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ue and return SQ
2fa0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 66 20 69  LITE_OK..** If i
2fb0: 74 20 69 73 20 6e 6f 74 20 69 6e 20 57 41 4c 20  t is not in WAL 
2fc0: 6d 6f 64 65 2c 20 73 65 74 20 2a 70 62 57 61 6c  mode, set *pbWal
2fd0: 20 74 6f 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a   to false..**.**
2fe0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2ff0: 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 53  urs, return an S
3000: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
3010: 2e 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 2a  . The value of *
3020: 70 62 57 61 6c 0a 2a 2a 20 69 73 20 75 6e 64 65  pbWal.** is unde
3030: 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  fined in this ca
3040: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
3050: 74 20 73 75 70 65 72 6c 6f 63 6b 49 73 57 61 6c  t superlockIsWal
3060: 28 53 75 70 65 72 6c 6f 63 6b 20 2a 70 4c 6f 63  (Superlock *pLoc
3070: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  k){.  int rc;   
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3090: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
30a0: 43 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Code */.  sqlite
30b0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
30c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
30d0: 70 69 6c 65 64 20 50 52 41 47 4d 41 20 6a 6f 75  piled PRAGMA jou
30e0: 72 6e 61 6c 5f 6d 6f 64 65 20 73 74 61 74 65 6d  rnal_mode statem
30f0: 65 6e 74 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 73  ent */..  rc = s
3100: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70  qlite3_prepare(p
3110: 4c 6f 63 6b 2d 3e 64 62 2c 20 22 50 52 41 47 4d  Lock->db, "PRAGM
3120: 41 20 6d 61 69 6e 2e 6a 6f 75 72 6e 61 6c 5f 6d  A main.journal_m
3130: 6f 64 65 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74  ode", -1, &pStmt
3140: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
3150: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
3160: 72 6e 20 72 63 3b 0a 0a 20 20 70 4c 6f 63 6b 2d  rn rc;..  pLock-
3170: 3e 62 57 61 6c 20 3d 20 30 3b 0a 20 20 69 66 28  >bWal = 0;.  if(
3180: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
3190: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
31a0: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
31b0: 61 72 20 2a 7a 4d 6f 64 65 20 3d 20 28 63 6f 6e  ar *zMode = (con
31c0: 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  st char *)sqlite
31d0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
31e0: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tmt, 0);.    if(
31f0: 20 7a 4d 6f 64 65 20 26 26 20 73 74 72 6c 65 6e   zMode && strlen
3200: 28 7a 4d 6f 64 65 29 3d 3d 33 20 26 26 20 73 71  (zMode)==3 && sq
3210: 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22  lite3_strnicmp("
3220: 77 61 6c 22 2c 20 7a 4d 6f 64 65 2c 20 33 29 3d  wal", zMode, 3)=
3230: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63  =0 ){.      pLoc
3240: 6b 2d 3e 62 57 61 6c 20 3d 20 31 3b 0a 20 20 20  k->bWal = 1;.   
3250: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
3260: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
3270: 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pStmt);.}../*.
3280: 2a 2a 20 4f 62 74 61 69 6e 20 61 6e 20 65 78 63  ** Obtain an exc
3290: 6c 75 73 69 76 65 20 73 68 6d 2d 6c 6f 63 6b 20  lusive shm-lock 
32a0: 6f 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 73  on nByte bytes s
32b0: 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73 65  tarting at offse
32c0: 74 20 69 64 78 0a 2a 2a 20 6f 66 20 74 68 65 20  t idx.** of the 
32d0: 66 69 6c 65 20 66 64 2e 20 49 66 20 74 68 65 20  file fd. If the 
32e0: 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
32f0: 62 74 61 69 6e 65 64 20 69 6d 6d 65 64 69 61 74  btained immediat
3300: 65 6c 79 2c 20 69 6e 76 6f 6b 65 0a 2a 2a 20 74  ely, invoke.** t
3310: 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
3320: 75 6e 74 69 6c 20 65 69 74 68 65 72 20 69 74 20  until either it 
3330: 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 72 20 74  is obtained or t
3340: 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a  he busy-handler.
3350: 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75  ** callback retu
3360: 72 6e 73 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  rns 0..*/.static
3370: 20 69 6e 74 20 73 75 70 65 72 6c 6f 63 6b 53 68   int superlockSh
3380: 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33  mLock(.  sqlite3
3390: 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
33a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
33b0: 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  base file handle
33c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20   */.  int idx,  
33d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
33f0: 6f 66 20 73 68 6d 2d 6c 6f 63 6b 20 74 6f 20 6f  of shm-lock to o
3400: 62 74 61 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  btain */.  int n
3410: 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  Byte,           
3420: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3430: 6d 62 65 72 20 6f 66 20 63 6f 6e 73 65 63 74 69  mber of consecti
3440: 76 65 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  ve bytes to lock
3450: 20 2a 2f 0a 20 20 53 75 70 65 72 6c 6f 63 6b 42   */.  SuperlockB
3460: 75 73 79 20 2a 70 42 75 73 79 20 20 20 20 20 20  usy *pBusy      
3470: 20 20 20 20 20 20 2f 2a 20 42 75 73 79 2d 68 61        /* Busy-ha
3480: 6e 64 6c 65 72 20 77 72 61 70 70 65 72 20 6f 62  ndler wrapper ob
3490: 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ject */.){.  int
34a0: 20 72 63 3b 0a 20 20 69 6e 74 20 28 2a 78 53 68   rc;.  int (*xSh
34b0: 6d 4c 6f 63 6b 29 28 73 71 6c 69 74 65 33 5f 66  mLock)(sqlite3_f
34c0: 69 6c 65 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20  ile*, int, int, 
34d0: 69 6e 74 29 20 3d 20 66 64 2d 3e 70 4d 65 74 68  int) = fd->pMeth
34e0: 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 3b 0a 20  ods->xShmLock;. 
34f0: 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 78   do {.    rc = x
3500: 53 68 6d 4c 6f 63 6b 28 66 64 2c 20 69 64 78 2c  ShmLock(fd, idx,
3510: 20 6e 42 79 74 65 2c 20 53 51 4c 49 54 45 5f 53   nByte, SQLITE_S
3520: 48 4d 5f 4c 4f 43 4b 7c 53 51 4c 49 54 45 5f 53  HM_LOCK|SQLITE_S
3530: 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20  HM_EXCLUSIVE);. 
3540: 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
3550: 49 54 45 5f 42 55 53 59 20 26 26 20 73 75 70 65  ITE_BUSY && supe
3560: 72 6c 6f 63 6b 42 75 73 79 48 61 6e 64 6c 65 72  rlockBusyHandler
3570: 28 28 76 6f 69 64 20 2a 29 70 42 75 73 79 2c 20  ((void *)pBusy, 
3580: 30 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  0) );.  return r
3590: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61  c;.}../*.** Obta
35a0: 69 6e 20 74 68 65 20 65 78 74 72 61 20 6c 6f 63  in the extra loc
35b0: 6b 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ks on the databa
35c0: 73 65 20 66 69 6c 65 20 72 65 71 75 69 72 65 64  se file required
35d0: 20 66 6f 72 20 57 41 4c 20 64 61 74 61 62 61 73   for WAL databas
35e0: 65 73 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  es..** Invoke th
35f0: 65 20 73 75 70 70 6c 69 65 64 20 62 75 73 79 2d  e supplied busy-
3600: 68 61 6e 64 6c 65 72 20 61 73 20 72 65 71 75 69  handler as requi
3610: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
3620: 6e 74 20 73 75 70 65 72 6c 6f 63 6b 57 61 6c 4c  nt superlockWalL
3630: 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ock(.  sqlite3 *
3640: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
3650: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
3660: 73 65 20 68 61 6e 64 6c 65 20 6f 70 65 6e 20 6f  se handle open o
3670: 6e 20 57 41 4c 20 64 61 74 61 62 61 73 65 20 2a  n WAL database *
3680: 2f 0a 20 20 53 75 70 65 72 6c 6f 63 6b 42 75 73  /.  SuperlockBus
3690: 79 20 2a 70 42 75 73 79 20 20 20 20 20 20 20 20  y *pBusy        
36a0: 20 20 20 20 2f 2a 20 42 75 73 79 20 68 61 6e 64      /* Busy hand
36b0: 6c 65 72 20 77 72 61 70 70 65 72 20 6f 62 6a 65  ler wrapper obje
36c0: 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ct */.){.  int r
36d0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
36e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
36f0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
3700: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20  qlite3_file *fd 
3710: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
3720: 2a 20 4d 61 69 6e 20 64 61 74 61 62 61 73 65 20  * Main database 
3730: 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  file handle */. 
3740: 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a   void volatile *
3750: 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  p = 0;          
3760: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 66   /* Pointer to f
3770: 69 72 73 74 20 70 61 67 65 20 6f 66 20 73 68 61  irst page of sha
3780: 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 20  red memory */.. 
3790: 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 70 6f 69   /* Obtain a poi
37a0: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 71 6c 69  nter to the sqli
37b0: 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20  te3_file object 
37c0: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 6d 61 69 6e  open on the main
37d0: 20 64 62 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 72   db file. */.  r
37e0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
37f0: 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d 61  _control(db, "ma
3800: 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  in", SQLITE_FCNT
3810: 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2c 20  L_FILE_POINTER, 
3820: 28 76 6f 69 64 20 2a 29 26 66 64 29 3b 0a 20 20  (void *)&fd);.  
3830: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
3840: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
3850: 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68 65 20    /* Obtain the 
3860: 22 72 65 63 6f 76 65 72 79 22 20 6c 6f 63 6b 2e  "recovery" lock.
3870: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20   Normally, this 
3880: 6c 6f 63 6b 20 69 73 20 6f 6e 6c 79 20 6f 62 74  lock is only obt
3890: 61 69 6e 65 64 20 62 79 0a 20 20 2a 2a 20 63 6c  ained by.  ** cl
38a0: 69 65 6e 74 73 20 72 75 6e 6e 69 6e 67 20 64 61  ients running da
38b0: 74 61 62 61 73 65 20 72 65 63 6f 76 65 72 79 2e  tabase recovery.
38c0: 20 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73    .  */.  rc = s
38d0: 75 70 65 72 6c 6f 63 6b 53 68 6d 4c 6f 63 6b 28  uperlockShmLock(
38e0: 66 64 2c 20 32 2c 20 31 2c 20 70 42 75 73 79 29  fd, 2, 1, pBusy)
38f0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
3900: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
3910: 63 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68  c;..  /* Zero th
3920: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 66  e start of the f
3930: 69 72 73 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f  irst shared-memo
3940: 72 79 20 70 61 67 65 2e 20 54 68 69 73 20 6d 65  ry page. This me
3950: 61 6e 73 20 74 68 61 74 20 61 6e 79 0a 20 20 2a  ans that any.  *
3960: 2a 20 63 6c 69 65 6e 74 73 20 74 68 61 74 20 6f  * clients that o
3970: 70 65 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74  pen read or writ
3980: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 66  e transactions f
3990: 72 6f 6d 20 74 68 69 73 20 70 6f 69 6e 74 20 6f  rom this point o
39a0: 6e 20 77 69 6c 6c 0a 20 20 2a 2a 20 68 61 76 65  n will.  ** have
39b0: 20 74 6f 20 72 75 6e 20 72 65 63 6f 76 65 72 79   to run recovery
39c0: 20 62 65 66 6f 72 65 20 70 72 6f 63 65 65 64 69   before proceedi
39d0: 6e 67 2e 20 53 69 6e 63 65 20 74 68 65 79 20 6e  ng. Since they n
39e0: 65 65 64 20 74 68 65 20 22 72 65 63 6f 76 65 72  eed the "recover
39f0: 79 22 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 68 61  y".  ** lock tha
3a00: 74 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  t this process i
3a10: 73 20 68 6f 6c 64 69 6e 67 20 74 6f 20 64 6f 20  s holding to do 
3a20: 74 68 61 74 2c 20 6e 6f 20 6e 65 77 20 72 65 61  that, no new rea
3a30: 64 20 6f 72 20 77 72 69 74 65 0a 20 20 2a 2a 20  d or write.  ** 
3a40: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79  transactions may
3a50: 20 6e 6f 77 20 62 65 20 6f 70 65 6e 65 64 2e 20   now be opened. 
3a60: 4e 6f 72 20 63 61 6e 20 61 20 63 68 65 63 6b 70  Nor can a checkp
3a70: 6f 69 6e 74 20 62 65 20 72 75 6e 2c 20 66 6f 72  oint be run, for
3a80: 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 72   the.  ** same r
3a90: 65 61 73 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63  eason..  */.  rc
3aa0: 20 3d 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d   = fd->pMethods-
3ab0: 3e 78 53 68 6d 4d 61 70 28 66 64 2c 20 30 2c 20  >xShmMap(fd, 0, 
3ac0: 33 32 2a 31 30 32 34 2c 20 31 2c 20 26 70 29 3b  32*1024, 1, &p);
3ad0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
3ae0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
3af0: 3b 0a 20 20 6d 65 6d 73 65 74 28 28 76 6f 69 64  ;.  memset((void
3b00: 20 2a 29 70 2c 20 30 2c 20 33 32 29 3b 0a 0a 20   *)p, 0, 32);.. 
3b10: 20 2f 2a 20 4f 62 74 61 69 6e 20 65 78 63 6c 75   /* Obtain exclu
3b20: 73 69 76 65 20 6c 6f 63 6b 73 20 6f 6e 20 61 6c  sive locks on al
3b30: 6c 20 74 68 65 20 22 72 65 61 64 2d 6c 6f 63 6b  l the "read-lock
3b40: 22 20 73 6c 6f 74 73 2e 20 4f 6e 63 65 20 74 68  " slots. Once th
3b50: 65 73 65 20 6c 6f 63 6b 73 0a 20 20 2a 2a 20 61  ese locks.  ** a
3b60: 72 65 20 68 65 6c 64 2c 20 69 74 20 69 73 20 67  re held, it is g
3b70: 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74  uaranteed that t
3b80: 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69  here are no acti
3b90: 76 65 20 72 65 61 64 65 72 2c 20 77 72 69 74 65  ve reader, write
3ba0: 72 20 6f 72 20 0a 20 20 2a 2a 20 63 68 65 63 6b  r or .  ** check
3bb0: 70 6f 69 6e 74 65 72 20 63 6c 69 65 6e 74 73 2e  pointer clients.
3bc0: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 75 70  .  */.  rc = sup
3bd0: 65 72 6c 6f 63 6b 53 68 6d 4c 6f 63 6b 28 66 64  erlockShmLock(fd
3be0: 2c 20 33 2c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  , 3, SQLITE_SHM_
3bf0: 4e 4c 4f 43 4b 2d 33 2c 20 70 42 75 73 79 29 3b  NLOCK-3, pBusy);
3c00: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
3c10: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
3c20: 20 73 75 70 65 72 6c 6f 63 6b 20 68 65 6c 64 20   superlock held 
3c30: 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69  on a database fi
3c40: 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  le. The argument
3c50: 20 70 61 73 73 65 64 20 74 6f 20 0a 2a 2a 20 74   passed to .** t
3c60: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  his function mus
3c70: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61  t have been obta
3c80: 69 6e 65 64 20 66 72 6f 6d 20 61 20 73 75 63 63  ined from a succ
3c90: 65 73 73 66 75 6c 20 63 61 6c 6c 20 74 6f 0a 2a  essful call to.*
3ca0: 2a 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75  * sqlite3demo_su
3cb0: 70 65 72 6c 6f 63 6b 28 29 2e 0a 2a 2f 0a 73 74  perlock()..*/.st
3cc0: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
3cd0: 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63  3demo_superunloc
3ce0: 6b 28 76 6f 69 64 20 2a 70 4c 6f 63 6b 29 7b 0a  k(void *pLock){.
3cf0: 20 20 53 75 70 65 72 6c 6f 63 6b 20 2a 70 20 3d    Superlock *p =
3d00: 20 28 53 75 70 65 72 6c 6f 63 6b 20 2a 29 70 4c   (Superlock *)pL
3d10: 6f 63 6b 3b 0a 20 20 69 66 28 20 70 2d 3e 62 57  ock;.  if( p->bW
3d20: 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  al ){.    int rc
3d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3d40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
3d50: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20  urn code */.    
3d60: 69 6e 74 20 66 6c 61 67 73 20 3d 20 53 51 4c 49  int flags = SQLI
3d70: 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20  TE_SHM_UNLOCK | 
3d80: 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
3d90: 53 49 56 45 3b 0a 20 20 20 20 73 71 6c 69 74 65  SIVE;.    sqlite
3da0: 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 30 3b 0a  3_file *fd = 0;.
3db0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
3dc0: 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d  _file_control(p-
3dd0: 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c  >db, "main", SQL
3de0: 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50  ITE_FCNTL_FILE_P
3df0: 4f 49 4e 54 45 52 2c 0a 20 20 20 20 20 20 20 20  OINTER,.        
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e10: 20 20 20 20 20 28 76 6f 69 64 20 2a 29 26 66 64       (void *)&fd
3e20: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
3e30: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
3e40: 20 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e    fd->pMethods->
3e50: 78 53 68 6d 4c 6f 63 6b 28 66 64 2c 20 32 2c 20  xShmLock(fd, 2, 
3e60: 31 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20  1, flags);.     
3e70: 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78   fd->pMethods->x
3e80: 53 68 6d 4c 6f 63 6b 28 66 64 2c 20 33 2c 20 53  ShmLock(fd, 3, S
3e90: 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 2d  QLITE_SHM_NLOCK-
3ea0: 33 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  3, flags);.    }
3eb0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 63  .  }.  sqlite3_c
3ec0: 6c 6f 73 65 28 70 2d 3e 64 62 29 3b 0a 20 20 73  lose(p->db);.  s
3ed0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
3ee0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20  }../*.** Obtain 
3ef0: 61 20 73 75 70 65 72 6c 6f 63 6b 20 6f 6e 20 74  a superlock on t
3f00: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
3f10: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 7a   identified by z
3f20: 50 61 74 68 2c 20 75 73 69 6e 67 20 74 68 65 0a  Path, using the.
3f30: 2a 2a 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  ** locking primi
3f40: 74 69 76 65 73 20 70 72 6f 76 69 64 65 64 20 62  tives provided b
3f50: 79 20 56 46 53 20 7a 56 66 73 2e 20 49 66 20 73  y VFS zVfs. If s
3f60: 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
3f70: 45 5f 4f 4b 20 69 73 0a 2a 2a 20 72 65 74 75 72  E_OK is.** retur
3f80: 6e 65 64 20 61 6e 64 20 6f 75 74 70 75 74 20 76  ned and output v
3f90: 61 72 69 61 62 6c 65 20 2a 70 70 4c 6f 63 6b 20  ariable *ppLock 
3fa0: 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
3fb0: 68 20 61 6e 20 6f 70 61 71 75 65 20 68 61 6e 64  h an opaque hand
3fc0: 6c 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62  le.** that may b
3fd0: 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69  e used with sqli
3fe0: 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c  te3demo_superunl
3ff0: 6f 63 6b 28 29 20 74 6f 20 72 65 6c 65 61 73 65  ock() to release
4000: 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   the lock..**.**
4010: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
4020: 75 72 73 2c 20 2a 70 70 4c 6f 63 6b 20 69 73 20  urs, *ppLock is 
4030: 73 65 74 20 74 6f 20 30 20 61 6e 64 20 61 6e 20  set to 0 and an 
4040: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
4050: 65 20 0a 2a 2a 20 28 65 2e 67 2e 20 53 51 4c 49  e .** (e.g. SQLI
4060: 54 45 5f 42 55 53 59 29 20 69 73 20 72 65 74 75  TE_BUSY) is retu
4070: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rned..**.** If a
4080: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 20 63   required lock c
4090: 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  annot be obtaine
40a0: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 6e  d immediately an
40b0: 64 20 74 68 65 20 78 42 75 73 79 20 70 61 72 61  d the xBusy para
40c0: 6d 65 74 65 72 0a 2a 2a 20 74 6f 20 74 68 69 73  meter.** to this
40d0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74   function is not
40e0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 78 42 75 73   NULL, then xBus
40f0: 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 6e 20  y is invoked in 
4100: 74 68 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a 20  the same way.** 
4110: 61 73 20 61 20 62 75 73 79 2d 68 61 6e 64 6c 65  as a busy-handle
4120: 72 20 72 65 67 69 73 74 65 72 65 64 20 77 69 74  r registered wit
4130: 68 20 53 51 4c 69 74 65 20 28 75 73 69 6e 67 20  h SQLite (using 
4140: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
4150: 64 6c 65 72 28 29 29 0a 2a 2a 20 75 6e 74 69 6c  dler()).** until
4160: 20 65 69 74 68 65 72 20 74 68 65 20 6c 6f 63 6b   either the lock
4170: 20 63 61 6e 20 62 65 20 6f 62 74 61 69 6e 65 64   can be obtained
4180: 20 6f 72 20 74 68 65 20 62 75 73 79 2d 68 61 6e   or the busy-han
4190: 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 72 65  dler function re
41a0: 74 75 72 6e 73 0a 2a 2a 20 30 20 28 69 6e 64 69  turns.** 0 (indi
41b0: 63 61 74 69 6e 67 20 22 67 69 76 65 20 75 70 22  cating "give up"
41c0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
41d0: 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70   sqlite3demo_sup
41e0: 65 72 6c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20  erlock(.  const 
41f0: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
4200: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74            /* Pat
4210: 68 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69  h to database fi
4220: 6c 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  le to lock */.  
4230: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
4240: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4250: 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 74 6f  /* VFS to use to
4260: 20 61 63 63 65 73 73 20 64 61 74 61 62 61 73 65   access database
4270: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66   file */.  int f
4280: 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
4290: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 69 74          /* Addit
42a0: 69 6f 6e 61 6c 20 66 6c 61 67 73 20 74 6f 20 70  ional flags to p
42b0: 61 73 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 6f  ass to sqlite3_o
42c0: 70 65 6e 5f 76 32 20 2a 2f 0a 20 20 69 6e 74 20  pen_v2 */.  int 
42d0: 28 2a 78 42 75 73 79 29 28 76 6f 69 64 2a 2c 69  (*xBusy)(void*,i
42e0: 6e 74 29 2c 20 20 20 20 20 20 20 20 2f 2a 20 42  nt),        /* B
42f0: 75 73 79 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy handler call
4300: 62 61 63 6b 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  back */.  void *
4310: 70 42 75 73 79 41 72 67 2c 20 20 20 20 20 20 20  pBusyArg,       
4320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
4330: 74 65 78 74 20 61 72 67 20 66 6f 72 20 62 75 73  text arg for bus
4340: 79 20 68 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 76  y handler */.  v
4350: 6f 69 64 20 2a 2a 70 70 4c 6f 63 6b 20 20 20 20  oid **ppLock    
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4370: 2a 20 4f 55 54 3a 20 43 6f 6e 74 65 78 74 20 74  * OUT: Context t
4380: 6f 20 70 61 73 73 20 74 6f 20 73 75 70 65 72 75  o pass to superu
4390: 6e 6c 6f 63 6b 28 29 20 2a 2f 0a 29 7b 0a 20 20  nlock() */.){.  
43a0: 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 62 75  SuperlockBusy bu
43b0: 73 79 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 20  sy = {0, 0, 0}; 
43c0: 2f 2a 20 42 75 73 79 20 68 61 6e 64 6c 65 72 20  /* Busy handler 
43d0: 77 72 61 70 70 65 72 20 6f 62 6a 65 63 74 20 2a  wrapper object *
43e0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
4410: 64 65 20 2a 2f 0a 20 20 53 75 70 65 72 6c 6f 63  de */.  Superloc
4420: 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a 20 20 70 4c 6f  k *pLock;..  pLo
4430: 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ck = sqlite3_mal
4440: 6c 6f 63 28 73 69 7a 65 6f 66 28 53 75 70 65 72  loc(sizeof(Super
4450: 6c 6f 63 6b 29 29 3b 0a 20 20 69 66 28 20 21 70  lock));.  if( !p
4460: 4c 6f 63 6b 20 29 20 72 65 74 75 72 6e 20 53 51  Lock ) return SQ
4470: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
4480: 6d 73 65 74 28 70 4c 6f 63 6b 2c 20 30 2c 20 73  mset(pLock, 0, s
4490: 69 7a 65 6f 66 28 53 75 70 65 72 6c 6f 63 6b 29  izeof(Superlock)
44a0: 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20  );..  /* Open a 
44b0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
44c0: 6f 6e 20 74 68 65 20 66 69 6c 65 20 74 6f 20 73  on the file to s
44d0: 75 70 65 72 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  uperlock. */.  r
44e0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  c = sqlite3_open
44f0: 5f 76 32 28 0a 20 20 20 20 20 20 7a 50 61 74 68  _v2(.      zPath
4500: 2c 20 26 70 4c 6f 63 6b 2d 3e 64 62 2c 20 53 51  , &pLock->db, SQ
4510: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
4520: 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
4530: 43 52 45 41 54 45 7c 66 6c 61 67 73 2c 20 7a 56  CREATE|flags, zV
4540: 66 73 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e  fs.  );..  /* In
4550: 73 74 61 6c 6c 20 61 20 62 75 73 79 2d 68 61 6e  stall a busy-han
4560: 64 6c 65 72 20 61 6e 64 20 65 78 65 63 75 74 65  dler and execute
4570: 20 61 20 42 45 47 49 4e 20 45 58 43 4c 55 53 49   a BEGIN EXCLUSI
4580: 56 45 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e  VE. If this is n
4590: 6f 74 0a 20 20 2a 2a 20 61 20 57 41 4c 20 64 61  ot.  ** a WAL da
45a0: 74 61 62 61 73 65 2c 20 74 68 69 73 20 69 73 20  tabase, this is 
45b0: 61 6c 6c 20 77 65 20 6e 65 65 64 20 74 6f 20 64  all we need to d
45c0: 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  o.  .  **.  ** A
45d0: 20 77 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f   wrapper functio
45e0: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 69 6e 76  n is used to inv
45f0: 6f 6b 65 20 74 68 65 20 62 75 73 79 2d 68 61 6e  oke the busy-han
4600: 64 6c 65 72 20 69 6e 73 74 65 61 64 20 6f 66 0a  dler instead of.
4610: 20 20 2a 2a 20 72 65 67 69 73 74 65 72 69 6e 67    ** registering
4620: 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
4630: 72 20 66 75 6e 63 74 69 6f 6e 20 73 75 70 70 6c  r function suppl
4640: 69 65 64 20 62 79 20 74 68 65 20 75 73 65 72 20  ied by the user 
4650: 64 69 72 65 63 74 6c 79 0a 20 20 2a 2a 20 77 69  directly.  ** wi
4660: 74 68 20 53 51 4c 69 74 65 2e 20 54 68 69 73 20  th SQLite. This 
4670: 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20 73  is because the s
4680: 61 6d 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  ame busy-handler
4690: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
46a0: 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 64 20 64 69  .  ** invoked di
46b0: 72 65 63 74 6c 79 20 6c 61 74 65 72 20 6f 6e 20  rectly later on 
46c0: 77 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20  when attempting 
46d0: 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 65 78  to obtain the ex
46e0: 74 72 61 20 6c 6f 63 6b 73 0a 20 20 2a 2a 20 72  tra locks.  ** r
46f0: 65 71 75 69 72 65 64 20 69 6e 20 57 41 4c 20 6d  equired in WAL m
4700: 6f 64 65 2e 20 42 79 20 75 73 69 6e 67 20 74 68  ode. By using th
4710: 65 20 77 72 61 70 70 65 72 2c 20 77 65 20 61 72  e wrapper, we ar
4720: 65 20 61 62 6c 65 20 74 6f 20 67 75 61 72 61 6e  e able to guaran
4730: 74 65 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  tee.  ** that th
4740: 65 20 22 6e 42 75 73 79 22 20 69 6e 74 65 67 65  e "nBusy" intege
4750: 72 20 70 61 72 61 6d 65 74 65 72 20 70 61 73 73  r parameter pass
4760: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 73 20  ed to the users 
4770: 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a  busy-handler.  *
4780: 2a 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65  * represents the
4790: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
47a0: 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 6e   busy-handler in
47b0: 76 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 77  vocations made w
47c0: 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68 69 73 20  ithin.  ** this 
47d0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 64  call to sqlite3d
47e0: 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 29 2c  emo_superlock(),
47f0: 20 69 6e 63 6c 75 64 69 6e 67 20 61 6e 79 20 6d   including any m
4800: 61 64 65 20 64 75 72 69 6e 67 20 74 68 65 0a 20  ade during the. 
4810: 20 2a 2a 20 22 42 45 47 49 4e 20 45 58 43 4c 55   ** "BEGIN EXCLU
4820: 53 49 56 45 22 2e 0a 20 20 2a 2f 0a 20 20 69 66  SIVE"..  */.  if
4830: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4840: 29 7b 0a 20 20 20 20 62 75 73 79 2e 78 42 75 73  ){.    busy.xBus
4850: 79 20 3d 20 78 42 75 73 79 3b 0a 20 20 20 20 62  y = xBusy;.    b
4860: 75 73 79 2e 70 42 75 73 79 41 72 67 20 3d 20 70  usy.pBusyArg = p
4870: 42 75 73 79 41 72 67 3b 0a 20 20 20 20 73 71 6c  BusyArg;.    sql
4880: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
4890: 72 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20 73 75 70  r(pLock->db, sup
48a0: 65 72 6c 6f 63 6b 42 75 73 79 48 61 6e 64 6c 65  erlockBusyHandle
48b0: 72 2c 20 28 76 6f 69 64 20 2a 29 26 62 75 73 79  r, (void *)&busy
48c0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
48d0: 74 65 33 5f 65 78 65 63 28 70 4c 6f 63 6b 2d 3e  te3_exec(pLock->
48e0: 64 62 2c 20 22 42 45 47 49 4e 20 45 58 43 4c 55  db, "BEGIN EXCLU
48f0: 53 49 56 45 22 2c 20 30 2c 20 30 2c 20 30 29 3b  SIVE", 0, 0, 0);
4900: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
4910: 65 20 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56  e BEGIN EXCLUSIV
4920: 45 20 77 61 73 20 65 78 65 63 75 74 65 64 20 73  E was executed s
4930: 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20  uccessfully and 
4940: 74 68 69 73 20 69 73 20 61 20 57 41 4c 0a 20 20  this is a WAL.  
4950: 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 63 61 6c  ** database, cal
4960: 6c 20 73 75 70 65 72 6c 6f 63 6b 57 61 6c 4c 6f  l superlockWalLo
4970: 63 6b 28 29 20 74 6f 20 6f 62 74 61 69 6e 20 74  ck() to obtain t
4980: 68 65 20 65 78 74 72 61 20 6c 6f 63 6b 73 20 72  he extra locks r
4990: 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20  equired.  ** to 
49a0: 70 72 65 76 65 6e 74 20 72 65 61 64 65 72 73 2c  prevent readers,
49b0: 20 77 72 69 74 65 72 73 20 61 6e 64 2f 6f 72 20   writers and/or 
49c0: 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 20 66 72  checkpointers fr
49d0: 6f 6d 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  om accessing the
49e0: 0a 20 20 2a 2a 20 64 62 20 77 68 69 6c 65 20 74  .  ** db while t
49f0: 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 68  his process is h
4a00: 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 70 65 72  olding the super
4a10: 6c 6f 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lock..  **.  ** 
4a20: 42 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  Before attemptin
4a30: 67 20 61 6e 79 20 57 41 4c 20 6c 6f 63 6b 73 2c  g any WAL locks,
4a40: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
4a50: 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 20  saction started 
4a60: 61 62 6f 76 65 0a 20 20 2a 2a 20 74 6f 20 64 72  above.  ** to dr
4a70: 6f 70 20 74 68 65 20 57 41 4c 20 72 65 61 64 20  op the WAL read 
4a80: 61 6e 64 20 77 72 69 74 65 20 6c 6f 63 6b 73 20  and write locks 
4a90: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 2e 20  currently held. 
4aa0: 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 0a 20  Otherwise, the. 
4ab0: 20 2a 2a 20 6e 65 77 20 57 41 4c 20 6c 6f 63 6b   ** new WAL lock
4ac0: 73 20 6d 61 79 20 63 6f 6e 66 6c 69 63 74 20 77  s may conflict w
4ad0: 69 74 68 20 74 68 65 20 6f 6c 64 2e 0a 20 20 2a  ith the old..  *
4ae0: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
4af0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
4b00: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
4b10: 3d 20 73 75 70 65 72 6c 6f 63 6b 49 73 57 61 6c  = superlockIsWal
4b20: 28 70 4c 6f 63 6b 29 29 20 26 26 20 70 4c 6f 63  (pLock)) && pLoc
4b30: 6b 2d 3e 62 57 61 6c 20 29 7b 0a 20 20 20 20 20  k->bWal ){.     
4b40: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
4b50: 65 63 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20 22 43  ec(pLock->db, "C
4b60: 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29  OMMIT", 0, 0, 0)
4b70: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
4b80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4b90: 20 20 20 20 20 72 63 20 3d 20 73 75 70 65 72 6c       rc = superl
4ba0: 6f 63 6b 57 61 6c 4c 6f 63 6b 28 70 4c 6f 63 6b  ockWalLock(pLock
4bb0: 2d 3e 64 62 2c 20 26 62 75 73 79 29 3b 0a 20 20  ->db, &busy);.  
4bc0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4bd0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
4be0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
4bf0: 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c  te3demo_superunl
4c00: 6f 63 6b 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  ock(pLock);.    
4c10: 2a 70 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d  *ppLock = 0;.  }
4c20: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 4c 6f 63  else{.    *ppLoc
4c30: 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a  k = pLock;.  }..
4c40: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4c50: 2f 2a 20 41 20 63 6f 72 72 75 70 74 20 44 42 20  /* A corrupt DB 
4c60: 77 6f 6e 27 74 20 77 6f 72 6b 20 77 69 74 68 20  won't work with 
4c70: 74 68 65 20 73 71 6c 2d 62 61 73 65 64 20 6c 6f  the sql-based lo
4c80: 63 6b 69 6e 67 20 61 74 74 65 6d 70 74 2c 20 67  cking attempt, g
4c90: 72 61 62 20 61 6e 20 0a 2a 2a 20 65 78 63 6c 75  rab an .** exclu
4ca0: 73 69 76 65 20 6c 6f 63 6b 20 61 6e 64 20 72 65  sive lock and re
4cb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
4cc0: 72 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66  r SQLITE_BUSY if
4cd0: 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20   the lock fails 
4ce0: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65 20  .** returns the 
4cf0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 6c 65 76  current lock lev
4d00: 65 6c 20 68 65 6c 64 20 6f 6e 20 73 71 6c 69 74  el held on sqlit
4d10: 65 33 5f 66 69 6c 65 0a 2a 2f 0a 73 74 61 74 69  e3_file.*/.stati
4d20: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 64 65 6d  c int sqlite3dem
4d30: 6f 5f 73 75 70 65 72 6c 6f 63 6b 5f 63 6f 72 72  o_superlock_corr
4d40: 75 70 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  upt(.  sqlite3_f
4d50: 69 6c 65 20 2a 69 64 2c 0a 20 20 69 6e 74 20 65  ile *id,.  int e
4d60: 54 61 72 67 65 74 46 69 6c 65 4c 6f 63 6b 2c 0a  TargetFileLock,.
4d70: 20 20 69 6e 74 20 2a 70 46 69 6c 65 4c 6f 63 6b    int *pFileLock
4d80: 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
4d90: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
4da0: 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 65 46 69  e*)id;.  int eFi
4db0: 6c 65 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e  leLock = pFile->
4dc0: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 69 6e 74  eFileLock;.  int
4dd0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
4de0: 0a 20 20 0a 20 20 69 66 28 20 65 46 69 6c 65 4c  .  .  if( eFileL
4df0: 6f 63 6b 3c 65 54 61 72 67 65 74 46 69 6c 65 4c  ock<eTargetFileL
4e00: 6f 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ock ){.    rc = 
4e10: 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  pFile->pMethod->
4e20: 78 4c 6f 63 6b 28 69 64 2c 20 53 51 4c 49 54 45  xLock(id, SQLITE
4e30: 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 29 3b 0a 20  _LOCK_SHARED);. 
4e40: 20 7d 0a 20 20 69 66 28 20 21 72 63 20 26 26 20   }.  if( !rc && 
4e50: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52  SQLITE_LOCK_SHAR
4e60: 45 44 3c 65 54 61 72 67 65 74 46 69 6c 65 4c 6f  ED<eTargetFileLo
4e70: 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  ck ){.    rc = p
4e80: 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
4e90: 4c 6f 63 6b 28 69 64 2c 20 53 51 4c 49 54 45 5f  Lock(id, SQLITE_
4ea0: 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45 29 3b  LOCK_EXCLUSIVE);
4eb0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b  .  }.  if( rc ){
4ec0: 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
4ed0: 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 65 46 69 6c  eFileLock > eFil
4ee0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 70  eLock ){.      p
4ef0: 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
4f00: 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65  Unlock(id, eFile
4f10: 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Lock);.    }.   
4f20: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
4f30: 20 20 69 66 20 28 70 46 69 6c 65 4c 6f 63 6b 29    if (pFileLock)
4f40: 20 7b 0a 20 20 20 20 2a 70 46 69 6c 65 4c 6f 63   {.    *pFileLoc
4f50: 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
4f60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
4f70: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  TE_OK;.}..static
4f80: 20 69 6e 74 20 73 71 6c 69 74 65 33 64 65 6d 6f   int sqlite3demo
4f90: 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 5f 63 6f 72  _superunlock_cor
4fa0: 72 75 70 74 28 73 71 6c 69 74 65 33 5f 66 69 6c  rupt(sqlite3_fil
4fb0: 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
4fc0: 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
4fd0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
4fe0: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
4ff0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
5000: 0a 20 20 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  .  .  if( pFile-
5010: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 65 46 69  >eFileLock > eFi
5020: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 63  leLock ){.    rc
5030: 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f   = pFile->pMetho
5040: 64 2d 3e 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 53  d->xUnlock(id, S
5050: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45  QLITE_LOCK_SHARE
5060: 44 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46  D);.  }.  if( pF
5070: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e  ile->eFileLock >
5080: 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20   eFileLock ){.  
5090: 20 20 69 6e 74 20 75 6e 6c 6f 63 6b 52 43 20 3d    int unlockRC =
50a0: 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d   pFile->pMethod-
50b0: 3e 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 53 51 4c  >xUnlock(id, SQL
50c0: 49 54 45 5f 4c 4f 43 4b 5f 4e 4f 4e 45 29 3b 0a  ITE_LOCK_NONE);.
50d0: 20 20 20 20 69 66 20 28 21 72 63 29 20 72 63 20      if (!rc) rc 
50e0: 3d 20 75 6e 6c 6f 63 6b 52 43 3b 0a 20 20 7d 0a  = unlockRC;.  }.
50f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
5100: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
5110: 5f 45 4e 41 42 4c 45 5f 53 55 50 45 52 4c 4f 43  _ENABLE_SUPERLOC
5120: 4b 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 48 41 56  K */.../*.** HAV
5130: 45 5f 4d 52 45 4d 41 50 20 64 65 66 61 75 6c 74  E_MREMAP default
5140: 73 20 74 6f 20 74 72 75 65 20 6f 6e 20 4c 69 6e  s to true on Lin
5150: 75 78 20 61 6e 64 20 66 61 6c 73 65 20 65 76 65  ux and false eve
5160: 72 79 77 68 65 72 65 20 65 6c 73 65 2e 0a 2a 2f  rywhere else..*/
5170: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 48 41  .#if !defined(HA
5180: 56 45 5f 4d 52 45 4d 41 50 29 0a 23 20 69 66 20  VE_MREMAP).# if 
5190: 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f  defined(__linux_
51a0: 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 47  _) && defined(_G
51b0: 4e 55 5f 53 4f 55 52 43 45 29 0a 23 20 20 64 65  NU_SOURCE).#  de
51c0: 66 69 6e 65 20 48 41 56 45 5f 4d 52 45 4d 41 50  fine HAVE_MREMAP
51d0: 20 31 0a 23 20 65 6c 73 65 0a 23 20 20 64 65 66   1.# else.#  def
51e0: 69 6e 65 20 48 41 56 45 5f 4d 52 45 4d 41 50 20  ine HAVE_MREMAP 
51f0: 30 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  0.# endif.#endif
5200: 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 6c 69 63 69 74  ../*.** Explicit
5210: 6c 79 20 63 61 6c 6c 20 74 68 65 20 36 34 2d 62  ly call the 64-b
5220: 69 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 6c 73  it version of ls
5230: 65 65 6b 28 29 20 6f 6e 20 41 6e 64 72 6f 69 64  eek() on Android
5240: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6c 73 65  . Otherwise, lse
5250: 65 6b 28 29 0a 2a 2a 20 69 73 20 74 68 65 20 33  ek().** is the 3
5260: 32 2d 62 69 74 20 76 65 72 73 69 6f 6e 2c 20 65  2-bit version, e
5270: 76 65 6e 20 69 66 20 5f 46 49 4c 45 5f 4f 46 46  ven if _FILE_OFF
5280: 53 45 54 5f 42 49 54 53 3d 36 34 20 69 73 20 64  SET_BITS=64 is d
5290: 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 64 65  efined..*/.#ifde
52a0: 66 20 5f 5f 41 4e 44 52 4f 49 44 5f 5f 0a 23 20  f __ANDROID__.# 
52b0: 64 65 66 69 6e 65 20 6c 73 65 65 6b 20 6c 73 65  define lseek lse
52c0: 65 6b 36 34 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ek64.#endif..#if
52d0: 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 2f 2a  def __linux__./*
52e0: 0a 2a 2a 20 4c 69 6e 75 78 2d 73 70 65 63 69 66  .** Linux-specif
52f0: 69 63 20 49 4f 43 54 4c 20 6d 61 67 69 63 20 6e  ic IOCTL magic n
5300: 75 6d 62 65 72 73 20 75 73 65 64 20 66 6f 72 20  umbers used for 
5310: 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 46 32 46 53  controlling F2FS
5320: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 32 46 53  .*/.#define F2FS
5330: 5f 49 4f 43 54 4c 5f 4d 41 47 49 43 20 20 20 20  _IOCTL_MAGIC    
5340: 20 20 20 20 30 78 66 35 0a 23 64 65 66 69 6e 65      0xf5.#define
5350: 20 46 32 46 53 5f 49 4f 43 5f 53 54 41 52 54 5f   F2FS_IOC_START_
5360: 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 20 20 20  ATOMIC_WRITE    
5370: 20 5f 49 4f 28 46 32 46 53 5f 49 4f 43 54 4c 5f   _IO(F2FS_IOCTL_
5380: 4d 41 47 49 43 2c 20 31 29 0a 23 64 65 66 69 6e  MAGIC, 1).#defin
5390: 65 20 46 32 46 53 5f 49 4f 43 5f 43 4f 4d 4d 49  e F2FS_IOC_COMMI
53a0: 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 20  T_ATOMIC_WRITE  
53b0: 20 20 5f 49 4f 28 46 32 46 53 5f 49 4f 43 54 4c    _IO(F2FS_IOCTL
53c0: 5f 4d 41 47 49 43 2c 20 32 29 0a 23 64 65 66 69  _MAGIC, 2).#defi
53d0: 6e 65 20 46 32 46 53 5f 49 4f 43 5f 53 54 41 52  ne F2FS_IOC_STAR
53e0: 54 5f 56 4f 4c 41 54 49 4c 45 5f 57 52 49 54 45  T_VOLATILE_WRITE
53f0: 20 20 20 5f 49 4f 28 46 32 46 53 5f 49 4f 43 54     _IO(F2FS_IOCT
5400: 4c 5f 4d 41 47 49 43 2c 20 33 29 0a 23 64 65 66  L_MAGIC, 3).#def
5410: 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f 41 42 4f  ine F2FS_IOC_ABO
5420: 52 54 5f 56 4f 4c 41 54 49 4c 45 5f 57 52 49 54  RT_VOLATILE_WRIT
5430: 45 20 20 20 5f 49 4f 28 46 32 46 53 5f 49 4f 43  E   _IO(F2FS_IOC
5440: 54 4c 5f 4d 41 47 49 43 2c 20 35 29 0a 23 64 65  TL_MAGIC, 5).#de
5450: 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f 47 45  fine F2FS_IOC_GE
5460: 54 5f 46 45 41 54 55 52 45 53 20 20 20 20 20 20  T_FEATURES      
5470: 20 20 20 20 20 5f 49 4f 52 28 46 32 46 53 5f 49       _IOR(F2FS_I
5480: 4f 43 54 4c 5f 4d 41 47 49 43 2c 20 31 32 2c 20  OCTL_MAGIC, 12, 
5490: 75 33 32 29 0a 23 64 65 66 69 6e 65 20 46 32 46  u32).#define F2F
54a0: 53 5f 46 45 41 54 55 52 45 5f 41 54 4f 4d 49 43  S_FEATURE_ATOMIC
54b0: 5f 57 52 49 54 45 20 30 78 30 30 30 34 0a 23 65  _WRITE 0x0004.#e
54c0: 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69 6e 75 78 5f  ndif /* __linux_
54d0: 5f 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 44 69 66  _ */.../*.** Dif
54e0: 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79 73 74  ferent Unix syst
54f0: 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70 65 6e  ems declare open
5500: 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20  () in different 
5510: 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73 65 0a  ways.  Same use.
5520: 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  ** open(const ch
5530: 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e  ar*,int,mode_t).
5540: 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f 70 65    Others use ope
5550: 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  n(const char*,in
5560: 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20 64  t,...)..** The d
5570: 69 66 66 65 72 65 6e 63 65 20 69 73 20 69 6d 70  ifference is imp
5580: 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73 69 6e  ortant when usin
5590: 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  g a pointer to t
55a0: 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  he function..**.
55b0: 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20 77 61  ** The safest wa
55c0: 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74  y to deal with t
55d0: 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 6f  he problem is to
55e0: 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 69 73   always use this
55f0: 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68 69 63   wrapper.** whic
5600: 68 20 61 6c 77 61 79 73 20 68 61 73 20 74 68 65  h always has the
5610: 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69 6e   same well-defin
5620: 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  ed interface..*/
5630: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69  .static int posi
5640: 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  xOpen(const char
5650: 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61   *zFile, int fla
5660: 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a 20  gs, int mode){. 
5670: 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46 69   return open(zFi
5680: 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65 29  le, flags, mode)
5690: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
56a0: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
56b0: 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65  tic int openDire
56c0: 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72  ctory(const char
56d0: 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63  *, int*);.static
56e0: 20 69 6e 74 20 75 6e 69 78 47 65 74 70 61 67 65   int unixGetpage
56f0: 73 69 7a 65 28 76 6f 69 64 29 3b 0a 0a 2f 2a 0a  size(void);../*.
5700: 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63  ** Many system c
5710: 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73 65  alls are accesse
5720: 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65  d through pointe
5730: 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73  r-to-functions s
5740: 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d  o that.** they m
5750: 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e  ay be overridden
5760: 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66   at runtime to f
5770: 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20  acilitate fault 
5780: 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67  injection during
5790: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
57a0: 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65  sandboxing.  The
57b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79   following array
57c0: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73   holds the names
57d0: 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a   and pointers.**
57e0: 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65   to all override
57f0: 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c  able system call
5800: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  s..*/.static str
5810: 75 63 74 20 75 6e 69 78 5f 73 79 73 63 61 6c 6c  uct unix_syscall
5820: 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   {.  const char 
5830: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
5840: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
5850: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
5860: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
5870: 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b  ll_ptr pCurrent;
5880: 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75   /* Current valu
5890: 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20  e of the system 
58a0: 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65  call */.  sqlite
58b0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44  3_syscall_ptr pD
58c0: 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75  efault; /* Defau
58d0: 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53  lt value */.} aS
58e0: 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b  yscall[] = {.  {
58f0: 20 22 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20   "open",        
5900: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
5910: 6c 5f 70 74 72 29 70 6f 73 69 78 4f 70 65 6e 2c  l_ptr)posixOpen,
5920: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
5930: 6f 73 4f 70 65 6e 20 20 20 20 20 20 28 28 69 6e  osOpen      ((in
5940: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
5950: 2c 69 6e 74 2c 69 6e 74 29 29 61 53 79 73 63 61  ,int,int))aSysca
5960: 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[0].pCurrent).
5970: 0a 20 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20 20  .  { "close",   
5980: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
5990: 73 63 61 6c 6c 5f 70 74 72 29 63 6c 6f 73 65 2c  scall_ptr)close,
59a0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
59b0: 69 6e 65 20 6f 73 43 6c 6f 73 65 20 20 20 20 20  ine osClose     
59c0: 28 28 69 6e 74 28 2a 29 28 69 6e 74 29 29 61 53  ((int(*)(int))aS
59d0: 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65  yscall[1].pCurre
59e0: 6e 74 29 0a 0a 20 20 7b 20 22 61 63 63 65 73 73  nt)..  { "access
59f0: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
5a00: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 61 63  3_syscall_ptr)ac
5a10: 63 65 73 73 2c 20 20 20 20 20 30 20 20 7d 2c 0a  cess,     0  },.
5a20: 23 64 65 66 69 6e 65 20 6f 73 41 63 63 65 73 73  #define osAccess
5a30: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e      ((int(*)(con
5a40: 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 29 61 53  st char*,int))aS
5a50: 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65  yscall[2].pCurre
5a60: 6e 74 29 0a 0a 20 20 7b 20 22 67 65 74 63 77 64  nt)..  { "getcwd
5a70: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
5a80: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65  3_syscall_ptr)ge
5a90: 74 63 77 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a  tcwd,     0  },.
5aa0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 63 77 64  #define osGetcwd
5ab0: 20 20 20 20 28 28 63 68 61 72 2a 28 2a 29 28 63      ((char*(*)(c
5ac0: 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  har*,size_t))aSy
5ad0: 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e  scall[3].pCurren
5ae0: 74 29 0a 0a 20 20 7b 20 22 73 74 61 74 22 2c 20  t)..  { "stat", 
5af0: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
5b00: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 73 74 61  _syscall_ptr)sta
5b10: 74 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  t,       0  },.#
5b20: 64 65 66 69 6e 65 20 6f 73 53 74 61 74 20 20 20  define osStat   
5b30: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
5b40: 74 20 63 68 61 72 2a 2c 73 74 72 75 63 74 20 73  t char*,struct s
5b50: 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34  tat*))aSyscall[4
5b60: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a  ].pCurrent)../*.
5b70: 2a 2a 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d  ** The DJGPP com
5b80: 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e  piler environmen
5b90: 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c  t looks mostly l
5ba0: 69 6b 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74  ike Unix, but it
5bb0: 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63  .** lacks the fc
5bc0: 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ntl() system cal
5bd0: 6c 2e 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20  l.  So redefine 
5be0: 66 63 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f  fcntl() to be so
5bf0: 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20  mething.** that 
5c00: 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
5c10: 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61    This means tha
5c20: 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e  t locking does n
5c30: 6f 74 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a  ot occur under.*
5c40: 2a 20 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74  * DJGPP.  But it
5c50: 20 69 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64   is DOS - what d
5c60: 69 64 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a  id you expect?.*
5c70: 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50  /.#ifdef __DJGPP
5c80: 5f 5f 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20  __.  { "fstat", 
5c90: 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20         0,       
5ca0: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
5cb0: 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74 28  #define osFstat(
5cc0: 61 2c 62 2c 63 29 20 20 20 20 30 0a 23 65 6c 73  a,b,c)    0.#els
5cd0: 65 20 20 20 20 20 0a 20 20 7b 20 22 66 73 74 61  e     .  { "fsta
5ce0: 74 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  t",        (sqli
5cf0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
5d00: 66 73 74 61 74 2c 20 20 20 20 20 20 30 20 20 7d  fstat,      0  }
5d10: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61  ,.#define osFsta
5d20: 74 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69  t     ((int(*)(i
5d30: 6e 74 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29  nt,struct stat*)
5d40: 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75  )aSyscall[5].pCu
5d50: 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 20  rrent).#endif.. 
5d60: 20 7b 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20   { "ftruncate", 
5d70: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
5d80: 61 6c 6c 5f 70 74 72 29 66 74 72 75 6e 63 61 74  all_ptr)ftruncat
5d90: 65 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e  e,  0  },.#defin
5da0: 65 20 6f 73 46 74 72 75 6e 63 61 74 65 20 28 28  e osFtruncate ((
5db0: 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74  int(*)(int,off_t
5dc0: 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43  ))aSyscall[6].pC
5dd0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63  urrent)..  { "fc
5de0: 6e 74 6c 22 2c 20 20 20 20 20 20 20 20 28 73 71  ntl",        (sq
5df0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5e00: 72 29 66 63 6e 74 6c 2c 20 20 20 20 20 20 30 20  r)fcntl,      0 
5e10: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63   },.#define osFc
5e20: 6e 74 6c 20 20 20 20 20 28 28 69 6e 74 28 2a 29  ntl     ((int(*)
5e30: 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53  (int,int,...))aS
5e40: 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65  yscall[7].pCurre
5e50: 6e 74 29 0a 0a 20 20 7b 20 22 72 65 61 64 22 2c  nt)..  { "read",
5e60: 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
5e70: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65  3_syscall_ptr)re
5e80: 61 64 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a  ad,       0  },.
5e90: 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64 20 20  #define osRead  
5ea0: 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29      ((ssize_t(*)
5eb0: 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f  (int,void*,size_
5ec0: 74 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70  t))aSyscall[8].p
5ed0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
5ee0: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
5ef0: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
5f00: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
5f10: 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20    { "pread",    
5f20: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
5f30: 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 2c 20  call_ptr)pread, 
5f40: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65       0  },.#else
5f50: 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20  .  { "pread",   
5f60: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
5f70: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
5f80: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
5f90: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65  if.#define osPre
5fa0: 61 64 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74  ad     ((ssize_t
5fb0: 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69  (*)(int,void*,si
5fc0: 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  ze_t,off_t))aSys
5fd0: 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74  call[9].pCurrent
5fe0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  )..#if defined(U
5ff0: 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20  SE_PREAD64).  { 
6000: 22 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20  "pread64",      
6010: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
6020: 5f 70 74 72 29 70 72 65 61 64 36 34 2c 20 20 20  _ptr)pread64,   
6030: 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b   0  },.#else.  {
6040: 20 22 70 72 65 61 64 36 34 22 2c 20 20 20 20 20   "pread64",     
6050: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
6060: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
6070: 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23    0  },.#endif.#
6080: 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64 36 34  define osPread64
6090: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
60a0: 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t,void*,size_t,o
60b0: 66 66 36 34 5f 74 29 29 61 53 79 73 63 61 6c 6c  ff64_t))aSyscall
60c0: 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [10].pCurrent)..
60d0: 20 20 7b 20 22 77 72 69 74 65 22 2c 20 20 20 20    { "write",    
60e0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
60f0: 63 61 6c 6c 5f 70 74 72 29 77 72 69 74 65 2c 20  call_ptr)write, 
6100: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
6110: 6e 65 20 6f 73 57 72 69 74 65 20 20 20 20 20 28  ne osWrite     (
6120: 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c  (ssize_t(*)(int,
6130: 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65  const void*,size
6140: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d  _t))aSyscall[11]
6150: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
6160: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
6170: 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41  D) || SQLITE_ENA
6180: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
6190: 45 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20  E.  { "pwrite", 
61a0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
61b0: 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74  yscall_ptr)pwrit
61c0: 65 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c  e,     0  },.#el
61d0: 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c  se.  { "pwrite",
61e0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
61f0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
6200: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65          0  },.#e
6210: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50  ndif.#define osP
6220: 77 72 69 74 65 20 20 20 20 28 28 73 73 69 7a 65  write    ((ssize
6230: 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20  _t(*)(int,const 
6240: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66  void*,size_t,off
6250: 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20  _t))\.          
6260: 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61            aSysca
6270: 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[12].pCurrent)
6280: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ..#if defined(US
6290: 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22  E_PREAD64).  { "
62a0: 70 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28  pwrite64",     (
62b0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
62c0: 70 74 72 29 70 77 72 69 74 65 36 34 2c 20 20 20  ptr)pwrite64,   
62d0: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
62e0: 22 70 77 72 69 74 65 36 34 22 2c 20 20 20 20 20  "pwrite64",     
62f0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
6300: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
6310: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
6320: 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65 36 34  efine osPwrite64
6330: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
6340: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73  nt,const void*,s
6350: 69 7a 65 5f 74 2c 6f 66 66 36 34 5f 74 29 29 5c  ize_t,off64_t))\
6360: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6370: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 33       aSyscall[13
6380: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
6390: 20 22 66 63 68 6d 6f 64 22 2c 20 20 20 20 20 20   "fchmod",      
63a0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
63b0: 6c 5f 70 74 72 29 66 63 68 6d 6f 64 2c 20 20 20  l_ptr)fchmod,   
63c0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65         0  },.#de
63d0: 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20 20 20  fine osFchmod   
63e0: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f   ((int(*)(int,mo
63f0: 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  de_t))aSyscall[1
6400: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
6410: 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50  f defined(HAVE_P
6420: 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20  OSIX_FALLOCATE) 
6430: 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41  && HAVE_POSIX_FA
6440: 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66 61 6c  LLOCATE.  { "fal
6450: 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c  locate",    (sql
6460: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
6470: 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65  )posix_fallocate
6480: 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  ,  0 },.#else.  
6490: 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20  { "fallocate",  
64a0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
64b0: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
64c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
64d0: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46  ndif.#define osF
64e0: 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74 28 2a  allocate ((int(*
64f0: 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f  )(int,off_t,off_
6500: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e  t))aSyscall[15].
6510: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
6520: 75 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20 20 28  unlink",       (
6530: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
6540: 70 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20 20 20  ptr)unlink,     
6550: 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69        0 },.#defi
6560: 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20 20 28  ne osUnlink    (
6570: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
6580: 61 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 36  ar*))aSyscall[16
6590: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
65a0: 20 22 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 22   "openDirectory"
65b0: 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79  ,    (sqlite3_sy
65c0: 73 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e 44 69  scall_ptr)openDi
65d0: 72 65 63 74 6f 72 79 2c 20 20 20 20 20 20 30 20  rectory,      0 
65e0: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65  },.#define osOpe
65f0: 6e 44 69 72 65 63 74 6f 72 79 20 28 28 69 6e 74  nDirectory ((int
6600: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  (*)(const char*,
6610: 69 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31  int*))aSyscall[1
6620: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  7].pCurrent)..  
6630: 7b 20 22 6d 6b 64 69 72 22 2c 20 20 20 20 20 20  { "mkdir",      
6640: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
6650: 6c 6c 5f 70 74 72 29 6d 6b 64 69 72 2c 20 20 20  ll_ptr)mkdir,   
6660: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65          0 },.#de
6670: 66 69 6e 65 20 6f 73 4d 6b 64 69 72 20 20 20 20  fine osMkdir    
6680: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
6690: 63 68 61 72 2a 2c 6d 6f 64 65 5f 74 29 29 61 53  char*,mode_t))aS
66a0: 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72  yscall[18].pCurr
66b0: 65 6e 74 29 0a 0a 20 20 7b 20 22 72 6d 64 69 72  ent)..  { "rmdir
66c0: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
66d0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72  e3_syscall_ptr)r
66e0: 6d 64 69 72 2c 20 20 20 20 20 20 20 20 20 20 20  mdir,           
66f0: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52  0 },.#define osR
6700: 6d 64 69 72 20 20 20 20 20 28 28 69 6e 74 28 2a  mdir     ((int(*
6710: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61  )(const char*))a
6720: 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72  Syscall[19].pCur
6730: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
6740: 65 64 28 48 41 56 45 5f 46 43 48 4f 57 4e 29 0a  ed(HAVE_FCHOWN).
6750: 20 20 7b 20 22 66 63 68 6f 77 6e 22 2c 20 20 20    { "fchown",   
6760: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
6770: 63 61 6c 6c 5f 70 74 72 29 66 63 68 6f 77 6e 2c  call_ptr)fchown,
6780: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6790: 65 6c 73 65 0a 20 20 7b 20 22 66 63 68 6f 77 6e  else.  { "fchown
67a0: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
67b0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
67c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
67d0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69   },.#endif.#defi
67e0: 6e 65 20 6f 73 46 63 68 6f 77 6e 20 20 20 20 28  ne osFchown    (
67f0: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 75 69 64 5f  (int(*)(int,uid_
6800: 74 2c 67 69 64 5f 74 29 29 61 53 79 73 63 61 6c  t,gid_t))aSyscal
6810: 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[20].pCurrent).
6820: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  .#if defined(HAV
6830: 45 5f 46 43 48 4f 57 4e 29 0a 20 20 7b 20 22 67  E_FCHOWN).  { "g
6840: 65 74 65 75 69 64 22 2c 20 20 20 20 20 20 28 73  eteuid",      (s
6850: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
6860: 74 72 29 67 65 74 65 75 69 64 2c 20 20 20 20 20  tr)geteuid,     
6870: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6880: 20 7b 20 22 67 65 74 65 75 69 64 22 2c 20 20 20   { "geteuid",   
6890: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
68a0: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
68b0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
68c0: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 47  ndif.#define osG
68d0: 65 74 65 75 69 64 20 20 20 28 28 75 69 64 5f 74  eteuid   ((uid_t
68e0: 28 2a 29 28 76 6f 69 64 29 29 61 53 79 73 63 61  (*)(void))aSysca
68f0: 6c 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[21].pCurrent)
6900: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
6910: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20  QLITE_OMIT_WAL) 
6920: 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  || SQLITE_MAX_MM
6930: 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7b 20 22 6d  AP_SIZE>0.  { "m
6940: 6d 61 70 22 2c 20 20 20 20 20 20 20 20 20 28 73  map",         (s
6950: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
6960: 74 72 29 6d 6d 61 70 2c 20 20 20 20 20 20 20 20  tr)mmap,        
6970: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6980: 20 7b 20 22 6d 6d 61 70 22 2c 20 20 20 20 20 20   { "mmap",      
6990: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
69a0: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
69b0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
69c0: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d  ndif.#define osM
69d0: 6d 61 70 20 28 28 76 6f 69 64 2a 28 2a 29 28 76  map ((void*(*)(v
69e0: 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c  oid*,size_t,int,
69f0: 69 6e 74 2c 69 6e 74 2c 6f 66 66 5f 74 29 29 61  int,int,off_t))a
6a00: 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72  Syscall[22].pCur
6a10: 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69  rent)..#if !defi
6a20: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
6a30: 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  WAL) || SQLITE_M
6a40: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
6a50: 20 7b 20 22 6d 75 6e 6d 61 70 22 2c 20 20 20 20   { "munmap",    
6a60: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
6a70: 61 6c 6c 5f 70 74 72 29 6d 75 6e 6d 61 70 2c 20  all_ptr)munmap, 
6a80: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6a90: 6c 73 65 0a 20 20 7b 20 22 6d 75 6e 6d 61 70 22  lse.  { "munmap"
6aa0: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
6ab0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20  _syscall_ptr)0, 
6ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6ad0: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
6ae0: 65 20 6f 73 4d 75 6e 6d 61 70 20 28 28 69 6e 74  e osMunmap ((int
6af0: 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  (*)(void*,size_t
6b00: 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70  ))aSyscall[23].p
6b10: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 48 41  Current)..#if HA
6b20: 56 45 5f 4d 52 45 4d 41 50 20 26 26 20 28 21 64  VE_MREMAP && (!d
6b30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6b40: 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
6b50: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
6b60: 30 29 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c  0).  { "mremap",
6b70: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
6b80: 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d 72 65 6d  syscall_ptr)mrem
6b90: 61 70 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  ap,          0 }
6ba0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 6d 72 65  ,.#else.  { "mre
6bb0: 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c  map",       (sql
6bc0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
6bd0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6be0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64    0 },.#endif.#d
6bf0: 65 66 69 6e 65 20 6f 73 4d 72 65 6d 61 70 20 28  efine osMremap (
6c00: 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c  (void*(*)(void*,
6c10: 73 69 7a 65 5f 74 2c 73 69 7a 65 5f 74 2c 69 6e  size_t,size_t,in
6c20: 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b  t,...))aSyscall[
6c30: 32 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  24].pCurrent)..#
6c40: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
6c50: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20  TE_OMIT_WAL) || 
6c60: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
6c70: 53 49 5a 45 3e 30 0a 20 20 7b 20 22 67 65 74 70  SIZE>0.  { "getp
6c80: 61 67 65 73 69 7a 65 22 2c 20 20 28 73 71 6c 69  agesize",  (sqli
6c90: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
6ca0: 75 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65 2c  unixGetpagesize,
6cb0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6cc0: 22 67 65 74 70 61 67 65 73 69 7a 65 22 2c 20 20  "getpagesize",  
6cd0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
6ce0: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
6cf0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
6d00: 66 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 70  f.#define osGetp
6d10: 61 67 65 73 69 7a 65 20 28 28 69 6e 74 28 2a 29  agesize ((int(*)
6d20: 28 76 6f 69 64 29 29 61 53 79 73 63 61 6c 6c 5b  (void))aSyscall[
6d30: 32 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  25].pCurrent)..#
6d40: 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
6d50: 52 45 41 44 4c 49 4e 4b 29 0a 20 20 7b 20 22 72  READLINK).  { "r
6d60: 65 61 64 6c 69 6e 6b 22 2c 20 20 20 20 20 28 73  eadlink",     (s
6d70: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
6d80: 74 72 29 72 65 61 64 6c 69 6e 6b 2c 20 20 20 20  tr)readlink,    
6d90: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6da0: 20 7b 20 22 72 65 61 64 6c 69 6e 6b 22 2c 20 20   { "readlink",  
6db0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
6dc0: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
6dd0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6de0: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 52  ndif.#define osR
6df0: 65 61 64 6c 69 6e 6b 20 28 28 73 73 69 7a 65 5f  eadlink ((ssize_
6e00: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
6e10: 2c 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61  ,char*,size_t))a
6e20: 53 79 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72  Syscall[26].pCur
6e30: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
6e40: 65 64 28 48 41 56 45 5f 4c 53 54 41 54 29 0a 20  ed(HAVE_LSTAT). 
6e50: 20 7b 20 22 6c 73 74 61 74 22 2c 20 20 20 20 20   { "lstat",     
6e60: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
6e70: 63 61 6c 6c 5f 70 74 72 29 6c 73 74 61 74 2c 20  call_ptr)lstat, 
6e80: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6e90: 6c 73 65 0a 20 20 7b 20 22 6c 73 74 61 74 22 2c  lse.  { "lstat",
6ea0: 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
6eb0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
6ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6ed0: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
6ee0: 65 20 6f 73 4c 73 74 61 74 20 20 20 20 20 20 28  e osLstat      (
6ef0: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
6f00: 61 72 2a 2c 73 74 72 75 63 74 20 73 74 61 74 2a  ar*,struct stat*
6f10: 29 29 61 53 79 73 63 61 6c 6c 5b 32 37 5d 2e 70  ))aSyscall[27].p
6f20: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
6f30: 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29  fined(__linux__)
6f40: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
6f50: 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f  TE_ENABLE_BATCH_
6f60: 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 0a 23 20  ATOMIC_WRITE).# 
6f70: 69 66 64 65 66 20 5f 5f 41 4e 44 52 4f 49 44 5f  ifdef __ANDROID_
6f80: 5f 0a 20 20 7b 20 22 69 6f 63 74 6c 22 2c 20 28  _.  { "ioctl", (
6f90: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
6fa0: 70 74 72 29 28 69 6e 74 28 2a 29 28 69 6e 74 2c  ptr)(int(*)(int,
6fb0: 20 69 6e 74 2c 20 2e 2e 2e 29 29 69 6f 63 74 6c   int, ...))ioctl
6fc0: 2c 20 30 20 7d 2c 0a 23 20 65 6c 73 65 0a 20 20  , 0 },.# else.  
6fd0: 7b 20 22 69 6f 63 74 6c 22 2c 20 20 20 20 20 20  { "ioctl",      
6fe0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
6ff0: 61 6c 6c 5f 70 74 72 29 69 6f 63 74 6c 2c 20 20  all_ptr)ioctl,  
7000: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 20 65          0 },.# e
7010: 6e 64 69 66 0a 23 65 6c 73 65 0a 20 20 7b 20 22  ndif.#else.  { "
7020: 69 6f 63 74 6c 22 2c 20 20 20 20 20 20 20 20 20  ioctl",         
7030: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
7040: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
7050: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
7060: 0a 23 64 65 66 69 6e 65 20 6f 73 49 6f 63 74 6c  .#define osIoctl
7070: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69 6e   ((int(*)(int,in
7080: 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b  t,...))aSyscall[
7090: 32 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d  28].pCurrent)..}
70a0: 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  ; /* End of the 
70b0: 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73  overrideable sys
70c0: 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 0a 2f  tem calls */.../
70d0: 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73 79 73  *.** On some sys
70e0: 74 65 6d 73 2c 20 63 61 6c 6c 73 20 74 6f 20 66  tems, calls to f
70f0: 63 68 6f 77 6e 28 29 20 77 69 6c 6c 20 74 72 69  chown() will tri
7100: 67 67 65 72 20 61 20 6d 65 73 73 61 67 65 20 69  gger a message i
7110: 6e 20 61 20 73 65 63 75 72 69 74 79 0a 2a 2a 20  n a security.** 
7120: 6c 6f 67 20 69 66 20 74 68 65 79 20 63 6f 6d 65  log if they come
7130: 20 66 72 6f 6d 20 6e 6f 6e 2d 72 6f 6f 74 20 70   from non-root p
7140: 72 6f 63 65 73 73 65 73 2e 20 20 53 6f 20 61 76  rocesses.  So av
7150: 6f 69 64 20 63 61 6c 6c 69 6e 67 20 66 63 68 6f  oid calling fcho
7160: 77 6e 28 29 20 69 66 0a 2a 2a 20 77 65 20 61 72  wn() if.** we ar
7170: 65 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 61 73  e not running as
7180: 20 72 6f 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   root..*/.static
7190: 20 69 6e 74 20 72 6f 62 75 73 74 46 63 68 6f 77   int robustFchow
71a0: 6e 28 69 6e 74 20 66 64 2c 20 75 69 64 5f 74 20  n(int fd, uid_t 
71b0: 75 69 64 2c 20 67 69 64 5f 74 20 67 69 64 29 7b  uid, gid_t gid){
71c0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  .#if defined(HAV
71d0: 45 5f 46 43 48 4f 57 4e 29 0a 20 20 72 65 74 75  E_FCHOWN).  retu
71e0: 72 6e 20 6f 73 47 65 74 65 75 69 64 28 29 20 3f  rn osGeteuid() ?
71f0: 20 30 20 3a 20 6f 73 46 63 68 6f 77 6e 28 66 64   0 : osFchown(fd
7200: 2c 75 69 64 2c 67 69 64 29 3b 0a 23 65 6c 73 65  ,uid,gid);.#else
7210: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e  .  return 0;.#en
7220: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  dif.}../*.** Thi
7230: 73 20 69 73 20 74 68 65 20 78 53 65 74 53 79 73  s is the xSetSys
7240: 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64  temCall() method
7250: 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20   of sqlite3_vfs 
7260: 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a  for all of the.*
7270: 2a 20 22 75 6e 69 78 22 20 56 46 53 65 73 2e 20  * "unix" VFSes. 
7280: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
7290: 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75  K opon successfu
72a0: 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68 65  lly updating the
72b0: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  .** system call 
72c0: 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49  pointer, or SQLI
72d0: 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74  TE_NOTFOUND if t
72e0: 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69  here is no confi
72f0: 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65  gurable.** syste
7300: 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61  m call named zNa
7310: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
7320: 74 20 75 6e 69 78 53 65 74 53 79 73 74 65 6d 43  t unixSetSystemC
7330: 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  all(.  sqlite3_v
7340: 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20  fs *pNotUsed,   
7350: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
7360: 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73  pointer.  Not us
7370: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
7380: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
7390: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
73a0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20   system call to 
73b0: 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71  override */.  sq
73c0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
73d0: 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50  r pNewFunc  /* P
73e0: 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79  ointer to new sy
73f0: 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20  stem call value 
7400: 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
7410: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
7420: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55   = SQLITE_NOTFOU
7430: 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  ND;..  UNUSED_PA
7440: 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64  RAMETER(pNotUsed
7450: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  );.  if( zName==
7460: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e  0 ){.    /* If n
7470: 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e  o zName is given
7480: 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79  , restore all sy
7490: 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68  stem calls to th
74a0: 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20  eir default.    
74b0: 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20  ** settings and 
74c0: 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20  return NULL.    
74d0: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
74e0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69  TE_OK;.    for(i
74f0: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
7500: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
7510: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
7520: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 79 73  {.      if( aSys
7530: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
7540: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73   ){.        aSys
7550: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
7560: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
7570: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d  Default;.      }
7580: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
7590: 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20      /* If zName 
75a0: 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70  is specified, op
75b0: 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68  erate on only th
75c0: 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c  e one system cal
75d0: 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69  l.    ** specifi
75e0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
75f0: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
7600: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
7610: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
7620: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
7630: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
7640: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
7650: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
7660: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
7670: 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20  Default==0 ){.  
7680: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
7690: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61  [i].pDefault = a
76a0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
76b0: 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ent;.        }. 
76c0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
76d0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69  TE_OK;.        i
76e0: 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29  f( pNewFunc==0 )
76f0: 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73   pNewFunc = aSys
7700: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
7710: 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61  ;.        aSysca
7720: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d  ll[i].pCurrent =
7730: 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20   pNewFunc;.     
7740: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7750: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
7760: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
7770: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
7780: 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63  ue of a system c
7790: 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  all.  Return NUL
77a0: 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  L if zName is no
77b0: 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65  t a.** recognize
77c0: 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61  d system call na
77d0: 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73  me.  NULL is als
77e0: 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  o returned if th
77f0: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a  e system call.**
7800: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e   is currently un
7810: 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
7820: 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  ic sqlite3_sysca
7830: 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65 74 53 79  ll_ptr unixGetSy
7840: 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69  stemCall(.  sqli
7850: 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65  te3_vfs *pNotUse
7860: 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  d,.  const char 
7870: 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69  *zName.){.  unsi
7880: 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55  gned int i;..  U
7890: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
78a0: 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72  pNotUsed);.  for
78b0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
78c0: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
78d0: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
78e0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  +){.    if( strc
78f0: 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61  mp(zName, aSysca
7900: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ll[i].zName)==0 
7910: 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c  ) return aSyscal
7920: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20  l[i].pCurrent;. 
7930: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
7940: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
7950: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
7960: 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c  irst system call
7970: 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49   after zName.  I
7980: 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a  f zName==NULL.**
7990: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65   then return the
79a0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
79b0: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20  st system call. 
79c0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
79d0: 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20  zName.** is the 
79e0: 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c  last system call
79f0: 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20   or if zName is 
7a00: 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  not the name of 
7a10: 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65  a valid.** syste
7a20: 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  m call..*/.stati
7a30: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e  c const char *un
7a40: 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c  ixNextSystemCall
7a50: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c  (sqlite3_vfs *p,
7a60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
7a70: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d  me){.  int i = -
7a80: 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  1;..  UNUSED_PAR
7a90: 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28  AMETER(p);.  if(
7aa0: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f   zName ){.    fo
7ab0: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
7ac0: 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20  ze(aSyscall)-1; 
7ad0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
7ae0: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
7af0: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
7b00: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
7b10: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b   }.  }.  for(i++
7b20: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53  ; i<ArraySize(aS
7b30: 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20  yscall); i++){. 
7b40: 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b     if( aSyscall[
7b50: 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29  i].pCurrent!=0 )
7b60: 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c   return aSyscall
7b70: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  [i].zName;.  }. 
7b80: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
7b90: 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 63 63 65 70  .** Do not accep
7ba0: 74 20 61 6e 79 20 66 69 6c 65 20 64 65 73 63 72  t any file descr
7bb0: 69 70 74 6f 72 20 6c 65 73 73 20 74 68 61 6e 20  iptor less than 
7bc0: 74 68 69 73 20 76 61 6c 75 65 2c 20 69 6e 20 6f  this value, in o
7bd0: 72 64 65 72 20 74 6f 20 61 76 6f 69 64 0a 2a 2a  rder to avoid.**
7be0: 20 6f 70 65 6e 69 6e 67 20 64 61 74 61 62 61 73   opening databas
7bf0: 65 20 66 69 6c 65 20 75 73 69 6e 67 20 66 69 6c  e file using fil
7c00: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 68  e descriptors th
7c10: 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 6c 79 20  at are commonly 
7c20: 75 73 65 64 20 66 6f 72 20 0a 2a 2a 20 73 74 61  used for .** sta
7c30: 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 6f 75 74  ndard input, out
7c40: 70 75 74 2c 20 61 6e 64 20 65 72 72 6f 72 2e 0a  put, and error..
7c50: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
7c60: 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44  E_MINIMUM_FILE_D
7c70: 45 53 43 52 49 50 54 4f 52 0a 23 20 64 65 66 69  ESCRIPTOR.# defi
7c80: 6e 65 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55  ne SQLITE_MINIMU
7c90: 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f  M_FILE_DESCRIPTO
7ca0: 52 20 33 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  R 3.#endif../*.*
7cb0: 2a 20 49 6e 76 6f 6b 65 20 6f 70 65 6e 28 29 2e  * Invoke open().
7cc0: 20 20 44 6f 20 73 6f 20 6d 75 6c 74 69 70 6c 65    Do so multiple
7cd0: 20 74 69 6d 65 73 2c 20 75 6e 74 69 6c 20 69 74   times, until it
7ce0: 20 65 69 74 68 65 72 20 73 75 63 63 65 65 64 73   either succeeds
7cf0: 20 6f 72 0a 2a 2a 20 66 61 69 6c 73 20 66 6f 72   or.** fails for
7d00: 20 73 6f 6d 65 20 72 65 61 73 6f 6e 20 6f 74 68   some reason oth
7d10: 65 72 20 74 68 61 6e 20 45 49 4e 54 52 2e 0a 2a  er than EINTR..*
7d20: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
7d30: 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20 22   creation mode "
7d40: 6d 22 20 69 73 20 30 20 74 68 65 6e 20 73 65 74  m" is 0 then set
7d50: 20 69 74 20 74 6f 20 74 68 65 20 64 65 66 61 75   it to the defau
7d60: 6c 74 20 66 6f 72 0a 2a 2a 20 53 51 4c 69 74 65  lt for.** SQLite
7d70: 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
7d80: 73 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  s SQLITE_DEFAULT
7d90: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
7da0: 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 30  S (normally.** 0
7db0: 36 34 34 29 20 61 73 20 6d 6f 64 69 66 69 65 64  644) as modified
7dc0: 20 62 79 20 74 68 65 20 73 79 73 74 65 6d 20 75   by the system u
7dd0: 6d 61 73 6b 2e 20 20 49 66 20 6d 20 69 73 20 6e  mask.  If m is n
7de0: 6f 74 20 30 2c 20 74 68 65 6e 0a 2a 2a 20 6d 61  ot 0, then.** ma
7df0: 6b 65 20 74 68 65 20 66 69 6c 65 20 63 72 65 61  ke the file crea
7e00: 74 69 6f 6e 20 6d 6f 64 65 20 62 65 20 65 78 61  tion mode be exa
7e10: 63 74 6c 79 20 6d 20 69 67 6e 6f 72 69 6e 67 20  ctly m ignoring 
7e20: 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 0a 2a 2a  the umask..**.**
7e30: 20 54 68 65 20 6d 20 70 61 72 61 6d 65 74 65 72   The m parameter
7e40: 20 77 69 6c 6c 20 62 65 20 6e 6f 6e 2d 7a 65 72   will be non-zer
7e50: 6f 20 6f 6e 6c 79 20 77 68 65 6e 20 63 72 65 61  o only when crea
7e60: 74 69 6e 67 20 2d 77 61 6c 2c 20 2d 6a 6f 75 72  ting -wal, -jour
7e70: 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20 2d 73 68 6d  nal,.** and -shm
7e80: 20 66 69 6c 65 73 2e 20 20 57 65 20 77 61 6e 74   files.  We want
7e90: 20 74 68 6f 73 65 20 66 69 6c 65 73 20 74 6f 20   those files to 
7ea0: 68 61 76 65 20 2a 65 78 61 63 74 6c 79 2a 20 74  have *exactly* t
7eb0: 68 65 20 73 61 6d 65 0a 2a 2a 20 70 65 72 6d 69  he same.** permi
7ec0: 73 73 69 6f 6e 73 20 61 73 20 74 68 65 69 72 20  ssions as their 
7ed0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
7ee0: 65 2c 20 75 6e 61 64 75 6c 74 65 72 61 74 65 64  e, unadulterated
7ef0: 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a   by the umask..*
7f00: 2a 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20 69  * In that way, i
7f10: 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  f a database fil
7f20: 65 20 69 73 20 2d 72 77 2d 72 77 2d 72 77 20 6f  e is -rw-rw-rw o
7f30: 72 20 2d 72 77 2d 72 77 2d 72 2d 2c 20 61 6e 64  r -rw-rw-r-, and
7f40: 20 61 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f   a.** transactio
7f50: 6e 20 63 72 61 73 68 65 73 20 61 6e 64 20 6c 65  n crashes and le
7f60: 61 76 65 73 20 62 65 68 69 6e 64 20 68 6f 74 20  aves behind hot 
7f70: 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20 61  journals, then a
7f80: 6e 79 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74 68  ny.** process th
7f90: 61 74 20 69 73 20 61 62 6c 65 20 74 6f 20 77 72  at is able to wr
7fa0: 69 74 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ite to the datab
7fb0: 61 73 65 20 77 69 6c 6c 20 61 6c 73 6f 20 62 65  ase will also be
7fc0: 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 72 65 63 6f   able to.** reco
7fd0: 76 65 72 20 74 68 65 20 68 6f 74 20 6a 6f 75 72  ver the hot jour
7fe0: 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nals..*/.static 
7ff0: 69 6e 74 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  int robust_open(
8000: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
8010: 6e 74 20 66 2c 20 6d 6f 64 65 5f 74 20 6d 29 7b  nt f, mode_t m){
8020: 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 6d 6f 64  .  int fd;.  mod
8030: 65 5f 74 20 6d 32 20 3d 20 6d 20 3f 20 6d 20 3a  e_t m2 = m ? m :
8040: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
8050: 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
8060: 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 23 69  ;.  while(1){.#i
8070: 66 20 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45  f defined(O_CLOE
8080: 58 45 43 29 0a 20 20 20 20 66 64 20 3d 20 6f 73  XEC).    fd = os
8090: 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43 4c 4f 45 58  Open(z,f|O_CLOEX
80a0: 45 43 2c 6d 32 29 3b 0a 23 65 6c 73 65 0a 20 20  EC,m2);.#else.  
80b0: 20 20 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c    fd = osOpen(z,
80c0: 66 2c 6d 32 29 3b 0a 23 65 6e 64 69 66 0a 20 20  f,m2);.#endif.  
80d0: 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
80e0: 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45      if( errno==E
80f0: 49 4e 54 52 20 29 20 63 6f 6e 74 69 6e 75 65 3b  INTR ) continue;
8100: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8110: 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3e 3d    }.    if( fd>=
8120: 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46  SQLITE_MINIMUM_F
8130: 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52 20 29  ILE_DESCRIPTOR )
8140: 20 62 72 65 61 6b 3b 0a 20 20 20 20 6f 73 43 6c   break;.    osCl
8150: 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 73 71 6c  ose(fd);.    sql
8160: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
8170: 57 41 52 4e 49 4e 47 2c 20 0a 20 20 20 20 20 20  WARNING, .      
8180: 20 20 20 20 20 20 20 20 20 20 22 61 74 74 65 6d            "attem
8190: 70 74 20 74 6f 20 6f 70 65 6e 20 5c 22 25 73 5c  pt to open \"%s\
81a0: 22 20 61 73 20 66 69 6c 65 20 64 65 73 63 72 69  " as file descri
81b0: 70 74 6f 72 20 25 64 22 2c 20 7a 2c 20 66 64 29  ptor %d", z, fd)
81c0: 3b 0a 20 20 20 20 66 64 20 3d 20 2d 31 3b 0a 20  ;.    fd = -1;. 
81d0: 20 20 20 69 66 28 20 6f 73 4f 70 65 6e 28 22 2f     if( osOpen("/
81e0: 64 65 76 2f 6e 75 6c 6c 22 2c 20 66 2c 20 6d 29  dev/null", f, m)
81f0: 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  <0 ) break;.  }.
8200: 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20    if( fd>=0 ){. 
8210: 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20     if( m!=0 ){. 
8220: 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
8230: 20 73 74 61 74 62 75 66 3b 0a 20 20 20 20 20 20   statbuf;.      
8240: 69 66 28 20 6f 73 46 73 74 61 74 28 66 64 2c 20  if( osFstat(fd, 
8250: 26 73 74 61 74 62 75 66 29 3d 3d 30 20 0a 20 20  &statbuf)==0 .  
8260: 20 20 20 20 20 26 26 20 73 74 61 74 62 75 66 2e       && statbuf.
8270: 73 74 5f 73 69 7a 65 3d 3d 30 0a 20 20 20 20 20  st_size==0.     
8280: 20 20 26 26 20 28 73 74 61 74 62 75 66 2e 73 74    && (statbuf.st
8290: 5f 6d 6f 64 65 26 30 37 37 37 29 21 3d 6d 20 0a  _mode&0777)!=m .
82a0: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
82b0: 20 6f 73 46 63 68 6d 6f 64 28 66 64 2c 20 6d 29   osFchmod(fd, m)
82c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
82d0: 23 69 66 20 64 65 66 69 6e 65 64 28 46 44 5f 43  #if defined(FD_C
82e0: 4c 4f 45 58 45 43 29 20 26 26 20 28 21 64 65 66  LOEXEC) && (!def
82f0: 69 6e 65 64 28 4f 5f 43 4c 4f 45 58 45 43 29 20  ined(O_CLOEXEC) 
8300: 7c 7c 20 4f 5f 43 4c 4f 45 58 45 43 3d 3d 30 29  || O_CLOEXEC==0)
8310: 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c  .    osFcntl(fd,
8320: 20 46 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e 74   F_SETFD, osFcnt
8330: 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30  l(fd, F_GETFD, 0
8340: 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b  ) | FD_CLOEXEC);
8350: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65  .#endif.  }.  re
8360: 74 75 72 6e 20 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn fd;.}../*.*
8370: 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
8380: 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64  ns to obtain and
8390: 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20   relinquish the 
83a0: 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68  global mutex. Th
83b0: 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65  e.** global mute
83c0: 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f  x is used to pro
83d0: 74 65 63 74 20 74 68 65 20 75 6e 69 78 49 6e 6f  tect the unixIno
83e0: 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76 78  deInfo and.** vx
83f0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
8400: 63 74 73 20 75 73 65 64 20 62 79 20 74 68 69 73  cts used by this
8410: 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68   file, all of wh
8420: 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 73  ich may be .** s
8430: 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c  hared by multipl
8440: 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a  e threads..**.**
8450: 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d 75   Function unixMu
8460: 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73 65  texHeld() is use
8470: 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  d to assert() th
8480: 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  at the global mu
8490: 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20  tex .** is held 
84a0: 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54  when required. T
84b0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
84c0: 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72  only used as par
84d0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a  t of assert() .*
84e0: 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e  * statements. e.
84f0: 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78 45  g..**.**   unixE
8500: 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20  nterMutex().**  
8510: 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d     assert( unixM
8520: 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a  utexHeld() );.**
8530: 20 20 20 75 6e 69 78 45 6e 74 65 72 4c 65 61 76     unixEnterLeav
8540: 65 28 29 0a 2a 2a 0a 2a 2a 20 54 6f 20 70 72 65  e().**.** To pre
8550: 76 65 6e 74 20 64 65 61 64 6c 6f 63 6b 2c 20 74  vent deadlock, t
8560: 68 65 20 67 6c 6f 62 61 6c 20 75 6e 69 78 42 69  he global unixBi
8570: 67 4c 6f 63 6b 20 6d 75 73 74 20 6d 75 73 74 20  gLock must must 
8580: 62 65 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 62  be acquired.** b
8590: 65 66 6f 72 65 20 74 68 65 20 75 6e 69 78 49 6e  efore the unixIn
85a0: 6f 64 65 49 6e 66 6f 2e 70 4c 6f 63 6b 4d 75 74  odeInfo.pLockMut
85b0: 65 78 20 6d 75 74 65 78 2c 20 69 66 20 62 6f 74  ex mutex, if bot
85c0: 68 20 61 72 65 20 68 65 6c 64 2e 20 20 49 74 20  h are held.  It 
85d0: 69 73 0a 2a 2a 20 4f 4b 20 74 6f 20 67 65 74 20  is.** OK to get 
85e0: 74 68 65 20 70 4c 6f 63 6b 4d 75 74 65 78 20 77  the pLockMutex w
85f0: 69 74 68 6f 75 74 20 68 6f 6c 64 69 6e 67 20 75  ithout holding u
8600: 6e 69 78 42 69 67 4c 6f 63 6b 20 66 69 72 73 74  nixBigLock first
8610: 2c 20 62 75 74 20 69 66 0a 2a 2a 20 74 68 61 74  , but if.** that
8620: 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 75 6e   happens, the un
8630: 69 78 42 69 67 4c 6f 63 6b 20 6d 75 74 65 78 20  ixBigLock mutex 
8640: 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 63 71 75  must not be acqu
8650: 69 72 65 64 20 75 6e 74 69 6c 20 61 66 74 65 72  ired until after
8660: 0a 2a 2a 20 70 4c 6f 63 6b 4d 75 74 65 78 20 69  .** pLockMutex i
8670: 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  s released..**.*
8680: 2a 20 20 20 20 20 20 4f 4b 3a 20 20 20 20 20 65  *      OK:     e
8690: 6e 74 65 72 28 75 6e 69 78 42 69 67 4c 6f 63 6b  nter(unixBigLock
86a0: 29 2c 20 20 65 6e 74 65 72 28 70 4c 6f 63 6b 49  ),  enter(pLockI
86b0: 6e 66 6f 29 0a 2a 2a 20 20 20 20 20 20 4f 4b 3a  nfo).**      OK:
86c0: 20 20 20 20 20 65 6e 74 65 72 28 75 6e 69 78 42       enter(unixB
86d0: 69 67 4c 6f 63 6b 29 0a 2a 2a 20 20 20 20 20 20  igLock).**      
86e0: 4f 4b 3a 20 20 20 20 20 65 6e 74 65 72 28 70 4c  OK:     enter(pL
86f0: 6f 63 6b 49 6e 66 6f 29 0a 2a 2a 20 20 20 45 52  ockInfo).**   ER
8700: 52 4f 52 3a 20 20 20 20 20 65 6e 74 65 72 28 70  ROR:     enter(p
8710: 4c 6f 63 6b 49 6e 66 6f 29 2c 20 65 6e 74 65 72  LockInfo), enter
8720: 28 75 6e 69 78 42 69 67 4c 6f 63 6b 29 0a 2a 2f  (unixBigLock).*/
8730: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
8740: 6d 75 74 65 78 20 2a 75 6e 69 78 42 69 67 4c 6f  mutex *unixBigLo
8750: 63 6b 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 76  ck = 0;.static v
8760: 6f 69 64 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  oid unixEnterMut
8770: 65 78 28 76 6f 69 64 29 7b 0a 20 20 61 73 73 65  ex(void){.  asse
8780: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
8790: 78 5f 6e 6f 74 68 65 6c 64 28 75 6e 69 78 42 69  x_notheld(unixBi
87a0: 67 4c 6f 63 6b 29 20 29 3b 20 20 2f 2a 20 4e 6f  gLock) );  /* No
87b0: 74 20 61 20 72 65 63 75 72 73 69 76 65 20 6d 75  t a recursive mu
87c0: 74 65 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  tex */.  sqlite3
87d0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 75 6e 69  _mutex_enter(uni
87e0: 78 42 69 67 4c 6f 63 6b 29 3b 0a 7d 0a 73 74 61  xBigLock);.}.sta
87f0: 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4c 65 61  tic void unixLea
8800: 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  veMutex(void){. 
8810: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8820: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 75 6e 69 78  _mutex_held(unix
8830: 42 69 67 4c 6f 63 6b 29 20 29 3b 0a 20 20 73 71  BigLock) );.  sq
8840: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
8850: 65 28 75 6e 69 78 42 69 67 4c 6f 63 6b 29 3b 0a  e(unixBigLock);.
8860: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
8870: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
8880: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 76   unixMutexHeld(v
8890: 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20  oid) {.  return 
88a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
88b0: 6c 64 28 75 6e 69 78 42 69 67 4c 6f 63 6b 29 3b  ld(unixBigLock);
88c0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64  .}.#endif...#ifd
88d0: 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f  ef SQLITE_HAVE_O
88e0: 53 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 48 65  S_TRACE./*.** He
88f0: 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f  lper function fo
8900: 72 20 70 72 69 6e 74 69 6e 67 20 6f 75 74 20 74  r printing out t
8910: 72 61 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  race information
8920: 20 66 72 6f 6d 20 64 65 62 75 67 67 69 6e 67 0a   from debugging.
8930: 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20 54 68 69  ** binaries. Thi
8940: 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 74  s returns the st
8950: 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
8960: 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70 70 6c  ion of the suppl
8970: 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c  ied.** integer l
8980: 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61  ock-type..*/.sta
8990: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
89a0: 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e 74 20 65  azFileLock(int e
89b0: 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73 77 69  FileLock){.  swi
89c0: 74 63 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20 29  tch( eFileLock )
89d0: 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f 5f 4c 4f  {.    case NO_LO
89e0: 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45  CK: return "NONE
89f0: 22 3b 0a 20 20 20 20 63 61 73 65 20 53 48 41 52  ";.    case SHAR
8a00: 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  ED_LOCK: return 
8a10: 22 53 48 41 52 45 44 22 3b 0a 20 20 20 20 63 61  "SHARED";.    ca
8a20: 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  se RESERVED_LOCK
8a30: 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45 52 56  : return "RESERV
8a40: 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 50 45  ED";.    case PE
8a50: 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75  NDING_LOCK: retu
8a60: 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20  rn "PENDING";.  
8a70: 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56 45    case EXCLUSIVE
8a80: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 45  _LOCK: return "E
8a90: 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20  XCLUSIVE";.  }. 
8aa0: 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52 22 3b   return "ERROR";
8ab0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
8ac0: 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52  f SQLITE_LOCK_TR
8ad0: 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  ACE./*.** Print 
8ae0: 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  out information 
8af0: 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e  about all lockin
8b00: 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a  g operations..**
8b10: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8b20: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 72 6f   is used for tro
8b30: 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63  ubleshooting loc
8b40: 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61  ks on multithrea
8b50: 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73  ded.** platforms
8b60: 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d  .  Enable by com
8b70: 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65 20  piling with the 
8b80: 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52  -DSQLITE_LOCK_TR
8b90: 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c  ACE.** command-l
8ba0: 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68  ine option on th
8bb0: 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69  e compiler.  Thi
8bc0: 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c  s code is normal
8bd0: 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66  ly.** turned off
8be0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8bf0: 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66 64  lockTrace(int fd
8c00: 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63 74  , int op, struct
8c10: 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68   flock *p){.  ch
8c20: 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54  ar *zOpName, *zT
8c30: 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20  ype;.  int s;.  
8c40: 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a  int savedErrno;.
8c50: 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c    if( op==F_GETL
8c60: 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65  K ){.    zOpName
8c70: 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65   = "GETLK";.  }e
8c80: 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45  lse if( op==F_SE
8c90: 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61  TLK ){.    zOpNa
8ca0: 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20  me = "SETLK";.  
8cb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20 6f  }else{.    s = o
8cc0: 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70  sFcntl(fd, op, p
8cd0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
8ce0: 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c  bugPrintf("fcntl
8cf0: 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25   unknown %d %d %
8d00: 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29  d\n", fd, op, s)
8d10: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b 0a  ;.    return s;.
8d20: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74    }.  if( p->l_t
8d30: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
8d40: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c      zType = "RDL
8d50: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CK";.  }else if(
8d60: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52   p->l_type==F_WR
8d70: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
8d80: 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65   = "WRLCK";.  }e
8d90: 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  lse if( p->l_typ
8da0: 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
8db0: 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b    zType = "UNLCK
8dc0: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
8dd0: 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d  assert( 0 );.  }
8de0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f  .  assert( p->l_
8df0: 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54  whence==SEEK_SET
8e00: 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46 63 6e 74   );.  s = osFcnt
8e10: 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20  l(fd, op, p);.  
8e20: 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65 72 72  savedErrno = err
8e30: 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  no;.  sqlite3Deb
8e40: 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20  ugPrintf("fcntl 
8e50: 25 64 20 25 64 20 25 73 20 25 73 20 25 64 20 25  %d %d %s %s %d %
8e60: 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20  d %d %d\n",.    
8e70: 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c 20 7a   threadid, fd, z
8e80: 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28  OpName, zType, (
8e90: 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20  int)p->l_start, 
8ea0: 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20  (int)p->l_len,. 
8eb0: 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69      (int)p->l_pi
8ec0: 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d  d, s);.  if( s==
8ed0: 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45  (-1) && op==F_SE
8ee0: 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70  TLK && (p->l_typ
8ef0: 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d  e==F_RDLCK || p-
8f00: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  >l_type==F_WRLCK
8f10: 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ) ){.    struct 
8f20: 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32  flock l2;.    l2
8f30: 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73 46 63 6e   = *p;.    osFcn
8f40: 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20  tl(fd, F_GETLK, 
8f50: 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20 6c 32  &l2);.    if( l2
8f60: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  .l_type==F_RDLCK
8f70: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
8f80: 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "RDLCK";.    }
8f90: 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79  else if( l2.l_ty
8fa0: 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20  pe==F_WRLCK ){. 
8fb0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52       zType = "WR
8fc0: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  LCK";.    }else 
8fd0: 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46  if( l2.l_type==F
8fe0: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
8ff0: 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b  zType = "UNLCK";
9000: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9010: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20    assert( 0 );. 
9020: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
9030: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
9040: 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61 73 6f  tl-failure-reaso
9050: 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64 5c 6e  n: %s %d %d %d\n
9060: 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70 65 2c  ",.       zType,
9070: 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74   (int)l2.l_start
9080: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c  , (int)l2.l_len,
9090: 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b   (int)l2.l_pid);
90a0: 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73  .  }.  errno = s
90b0: 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74  avedErrno;.  ret
90c0: 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64 65 66 20  urn s;.}.#undef 
90d0: 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69 6e 65 20  osFcntl.#define 
90e0: 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63  osFcntl lockTrac
90f0: 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
9100: 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f  TE_LOCK_TRACE */
9110: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66 74  ../*.** Retry ft
9120: 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 73 20  runcate() calls 
9130: 74 68 61 74 20 66 61 69 6c 20 64 75 65 20 74 6f  that fail due to
9140: 20 45 49 4e 54 52 0a 2a 2a 0a 2a 2a 20 41 6c 6c   EINTR.**.** All
9150: 20 63 61 6c 6c 73 20 74 6f 20 66 74 72 75 6e 63   calls to ftrunc
9160: 61 74 65 28 29 20 77 69 74 68 69 6e 20 74 68 69  ate() within thi
9170: 73 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  s file should be
9180: 20 6d 61 64 65 20 74 68 72 6f 75 67 68 0a 2a 2a   made through.**
9190: 20 74 68 69 73 20 77 72 61 70 70 65 72 2e 20 20   this wrapper.  
91a0: 4f 6e 20 74 68 65 20 41 6e 64 72 6f 69 64 20 70  On the Android p
91b0: 6c 61 74 66 6f 72 6d 2c 20 62 79 70 61 73 73 69  latform, bypassi
91c0: 6e 67 20 74 68 65 20 6c 6f 67 69 63 20 62 65 6c  ng the logic bel
91d0: 6f 77 0a 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64  ow.** could lead
91e0: 20 74 6f 20 61 20 63 6f 72 72 75 70 74 20 64 61   to a corrupt da
91f0: 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
9200: 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 74 72  c int robust_ftr
9210: 75 6e 63 61 74 65 28 69 6e 74 20 68 2c 20 73 71  uncate(int h, sq
9220: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 29 7b  lite3_int64 sz){
9230: 0a 20 20 69 6e 74 20 72 63 3b 0a 23 69 66 64 65  .  int rc;.#ifde
9240: 66 20 5f 5f 41 4e 44 52 4f 49 44 5f 5f 0a 20 20  f __ANDROID__.  
9250: 2f 2a 20 4f 6e 20 41 6e 64 72 6f 69 64 2c 20 66  /* On Android, f
9260: 74 72 75 6e 63 61 74 65 28 29 20 61 6c 77 61 79  truncate() alway
9270: 73 20 75 73 65 73 20 33 32 2d 62 69 74 20 6f 66  s uses 32-bit of
9280: 66 73 65 74 73 2c 20 65 76 65 6e 20 69 66 20 0a  fsets, even if .
9290: 20 20 2a 2a 20 5f 46 49 4c 45 5f 4f 46 46 53 45    ** _FILE_OFFSE
92a0: 54 5f 42 49 54 53 3d 36 34 20 69 73 20 64 65 66  T_BITS=64 is def
92b0: 69 6e 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73  ined. This means
92c0: 20 69 74 20 69 73 20 75 6e 73 61 66 65 20 74 6f   it is unsafe to
92d0: 20 61 74 74 65 6d 70 74 20 74 6f 0a 20 20 2a 2a   attempt to.  **
92e0: 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65   truncate a file
92f0: 20 74 6f 20 61 6e 79 20 73 69 7a 65 20 6c 61 72   to any size lar
9300: 67 65 72 20 74 68 61 6e 20 32 47 69 42 2e 20 53  ger than 2GiB. S
9310: 69 6c 65 6e 74 6c 79 20 69 67 6e 6f 72 65 20 61  ilently ignore a
9320: 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 61 74 74  ny.  ** such att
9330: 65 6d 70 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28  empts.  */.  if(
9340: 20 73 7a 3e 28 73 71 6c 69 74 65 33 5f 69 6e 74   sz>(sqlite3_int
9350: 36 34 29 30 78 37 46 46 46 46 46 46 46 20 29 7b  64)0x7FFFFFFF ){
9360: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
9370: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  _OK;.  }else.#en
9380: 64 69 66 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f  dif.  do{ rc = o
9390: 73 46 74 72 75 6e 63 61 74 65 28 68 2c 73 7a 29  sFtruncate(h,sz)
93a0: 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26  ; }while( rc<0 &
93b0: 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
93c0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
93d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
93e0: 74 69 6e 65 20 74 72 61 6e 73 6c 61 74 65 73 20  tine translates 
93f0: 61 20 73 74 61 6e 64 61 72 64 20 50 4f 53 49 58  a standard POSIX
9400: 20 65 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74 6f   errno code into
9410: 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75 73   something.** us
9420: 65 66 75 6c 20 74 6f 20 74 68 65 20 63 6c 69 65  eful to the clie
9430: 6e 74 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  nts of the sqlit
9440: 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53  e3 functions.  S
9450: 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 74 20  pecifically, it 
9460: 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20 74  is.** intended t
9470: 6f 20 74 72 61 6e 73 6c 61 74 65 20 61 20 76 61  o translate a va
9480: 72 69 65 74 79 20 6f 66 20 22 74 72 79 20 61 67  riety of "try ag
9490: 61 69 6e 22 20 65 72 72 6f 72 73 20 69 6e 74 6f  ain" errors into
94a0: 20 53 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a 20   SQLITE_BUSY.** 
94b0: 61 6e 64 20 61 20 76 61 72 69 65 74 79 20 6f 66  and a variety of
94c0: 20 22 70 6c 65 61 73 65 20 63 6c 6f 73 65 20 74   "please close t
94d0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
94e0: 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72 73 20 69  or NOW" errors i
94f0: 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49  nto .** SQLITE_I
9500: 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f  OERR.** .** Erro
9510: 72 73 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61  rs during initia
9520: 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b  lization of lock
9530: 73 2c 20 6f 72 20 66 69 6c 65 20 73 79 73 74 65  s, or file syste
9540: 6d 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c 6f  m support for lo
9550: 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 68  cks,.** should h
9560: 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e  andle ENOLCK, EN
9570: 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55 50  OTSUP, EOPNOTSUP
9580: 50 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f  P separately..*/
9590: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
95a0: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
95b0: 45 72 72 6f 72 28 69 6e 74 20 70 6f 73 69 78 45  Error(int posixE
95c0: 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74 65  rror, int sqlite
95d0: 49 4f 45 72 72 29 20 7b 0a 20 20 61 73 73 65 72  IOErr) {.  asser
95e0: 74 28 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20  t( (sqliteIOErr 
95f0: 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  == SQLITE_IOERR_
9600: 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20  LOCK) || .      
9610: 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72      (sqliteIOErr
9620: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
9630: 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20  _UNLOCK) || .   
9640: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f         (sqliteIO
9650: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
9660: 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 20  ERR_RDLOCK) ||. 
9670: 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
9680: 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f  IOErr == SQLITE_
9690: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
96a0: 56 45 44 4c 4f 43 4b 29 20 29 3b 0a 20 20 73 77  VEDLOCK) );.  sw
96b0: 69 74 63 68 20 28 70 6f 73 69 78 45 72 72 6f 72  itch (posixError
96c0: 29 20 7b 0a 20 20 63 61 73 65 20 45 41 43 43 45  ) {.  case EACCE
96d0: 53 3a 20 0a 20 20 63 61 73 65 20 45 41 47 41 49  S: .  case EAGAI
96e0: 4e 3a 0a 20 20 63 61 73 65 20 45 54 49 4d 45 44  N:.  case ETIMED
96f0: 4f 55 54 3a 0a 20 20 63 61 73 65 20 45 42 55 53  OUT:.  case EBUS
9700: 59 3a 0a 20 20 63 61 73 65 20 45 49 4e 54 52 3a  Y:.  case EINTR:
9710: 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20  .  case ENOLCK: 
9720: 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20   .    /* random 
9730: 4e 46 53 20 72 65 74 72 79 20 65 72 72 6f 72 2c  NFS retry error,
9740: 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66   unless during f
9750: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
9760: 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f  rt .     * intro
9770: 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69  spection, in whi
9780: 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d  ch it actually m
9790: 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79  eans what it say
97a0: 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  s */.    return 
97b0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
97c0: 20 0a 20 20 63 61 73 65 20 45 50 45 52 4d 3a 20   .  case EPERM: 
97d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
97e0: 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 20 20  TE_PERM;.    .  
97f0: 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20 72 65  default: .    re
9800: 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45 72 72  turn sqliteIOErr
9810: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a  ;.  }.}.../*****
9820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
9870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
9880: 69 6e 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49  in Unique File I
9890: 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20 42  D Utility Used B
98a0: 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a  y VxWorks ******
98b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
98c0: 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e 73  On most versions
98d0: 20 6f 66 20 75 6e 69 78 2c 20 77 65 20 63 61 6e   of unix, we can
98e0: 20 67 65 74 20 61 20 75 6e 69 71 75 65 20 49 44   get a unique ID
98f0: 20 66 6f 72 20 61 20 66 69 6c 65 20 62 79 20 63   for a file by c
9900: 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a 20  oncatenating.** 
9910: 74 68 65 20 64 65 76 69 63 65 20 6e 75 6d 62 65  the device numbe
9920: 72 20 61 6e 64 20 74 68 65 20 69 6e 6f 64 65 20  r and the inode 
9930: 6e 75 6d 62 65 72 2e 20 20 42 75 74 20 74 68 69  number.  But thi
9940: 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  s does not work 
9950: 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f  on VxWorks..** O
9960: 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e 69  n VxWorks, a uni
9970: 71 75 65 20 66 69 6c 65 20 69 64 20 6d 75 73 74  que file id must
9980: 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65   be based on the
9990: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   canonical filen
99a0: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69  ame..**.** A poi
99b0: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61  nter to an insta
99c0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
99d0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 63  wing structure c
99e0: 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 61 0a  an be used as a.
99f0: 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49  ** unique file I
9a00: 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20 45  D in VxWorks.  E
9a10: 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ach instance of 
9a20: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 63  this structure c
9a30: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f 70  ontains.** a cop
9a40: 79 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69 63  y of the canonic
9a50: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54 68  al filename.  Th
9a60: 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 72 65  ere is also a re
9a70: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20 20  ference count.  
9a80: 0a 2a 2a 20 54 68 65 20 73 74 72 75 63 74 75 72  .** The structur
9a90: 65 20 69 73 20 72 65 63 6c 61 69 6d 65 64 20 77  e is reclaimed w
9aa0: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
9ab0: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 69 74  f pointers to it
9ac0: 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65 72   drops to.** zer
9ad0: 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61  o..**.** There a
9ae0: 72 65 20 6e 65 76 65 72 20 76 65 72 79 20 6d 61  re never very ma
9af0: 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e 20 61 74  ny files open at
9b00: 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c 6f   one time and lo
9b10: 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a 2a  okups are not.**
9b20: 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d 63   a performance-c
9b30: 72 69 74 69 63 61 6c 20 70 61 74 68 2c 20 73 6f  ritical path, so
9b40: 20 69 74 20 69 73 20 73 75 66 66 69 63 69 65 6e   it is sufficien
9b50: 74 20 74 6f 20 70 75 74 20 74 68 65 73 65 0a 2a  t to put these.*
9b60: 2a 20 73 74 72 75 63 74 75 72 65 73 20 6f 6e 20  * structures on 
9b70: 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a  a linked list..*
9b80: 2f 0a 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73  /.struct vxworks
9b90: 46 69 6c 65 49 64 20 7b 0a 20 20 73 74 72 75 63  FileId {.  struc
9ba0: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
9bb0: 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74  *pNext;  /* Next
9bc0: 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 74 68   in a list of th
9bd0: 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  em all */.  int 
9be0: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
9bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9c00: 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
9c10: 73 20 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a 2f  s to this one */
9c20: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20  .  int nName;   
9c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c40: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68   /* Length of th
9c50: 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  e zCanonicalName
9c60: 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63  [] string */.  c
9c70: 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e  har *zCanonicalN
9c80: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ame;         /* 
9c90: 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  Canonical filena
9ca0: 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53  me */.};..#if OS
9cb0: 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20  _VXWORKS./* .** 
9cc0: 41 6c 6c 20 75 6e 69 71 75 65 20 66 69 6c 65 6e  All unique filen
9cd0: 61 6d 65 73 20 61 72 65 20 68 65 6c 64 20 6f 6e  ames are held on
9ce0: 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 68   a linked list h
9cf0: 65 61 64 65 64 20 62 79 20 74 68 69 73 0a 2a 2a  eaded by this.**
9d00: 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74   variable:.*/.st
9d10: 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77 6f  atic struct vxwo
9d20: 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72  rksFileId *vxwor
9d30: 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b 0a  ksFileList = 0;.
9d40: 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79 20  ./*.** Simplify 
9d50: 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20  a filename into 
9d60: 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66 6f  its canonical fo
9d70: 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67 20  rm.** by making 
9d80: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  the following ch
9d90: 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20  anges:.**.**  * 
9da0: 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72 61  removing any tra
9db0: 69 6c 69 6e 67 20 61 6e 64 20 64 75 70 6c 69 63  iling and duplic
9dc0: 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76  ate /.**  * conv
9dd0: 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73  ert /./ into jus
9de0: 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72  t /.**  * conver
9df0: 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20 41  t /A/../ where A
9e00: 20 69 73 20 61 6e 79 20 73 69 6d 70 6c 65 20 6e   is any simple n
9e10: 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a  ame into just /.
9e20: 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61 72  **.** Changes ar
9e30: 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65 2e  e made in-place.
9e40: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77    Return the new
9e50: 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a   name length..**
9e60: 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .** The original
9e70: 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 20   filename is in 
9e80: 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74 75  z[0..n-1].  Retu
9e90: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
9ea0: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 69  .** characters i
9eb0: 6e 20 74 68 65 20 73 69 6d 70 6c 69 66 69 65 64  n the simplified
9ec0: 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   name..*/.static
9ed0: 20 69 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d 70   int vxworksSimp
9ee0: 6c 69 66 79 4e 61 6d 65 28 63 68 61 72 20 2a 7a  lifyName(char *z
9ef0: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20  , int n){.  int 
9f00: 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20 6e  i, j;.  while( n
9f10: 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f  >1 && z[n-1]=='/
9f20: 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f  ' ){ n--; }.  fo
9f30: 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b  r(i=j=0; i<n; i+
9f40: 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d  +){.    if( z[i]
9f50: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69  =='/' ){.      i
9f60: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29  f( z[i+1]=='/' )
9f70: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
9f80: 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27   if( z[i+1]=='.'
9f90: 20 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b 69   && i+2<n && z[i
9fa0: 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  +2]=='/' ){.    
9fb0: 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20      i += 1;.    
9fc0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
9fd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9fe0: 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69  z[i+1]=='.' && i
9ff0: 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d  +3<n && z[i+2]==
a000: 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27  '.' && z[i+3]=='
a010: 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  /' ){.        wh
a020: 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d  ile( j>0 && z[j-
a030: 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20  1]!='/' ){ j--; 
a040: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e  }.        if( j>
a050: 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20  0 ){ j--; }.    
a060: 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20      i += 2;.    
a070: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
a080: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
a090: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20  z[j++] = z[i];. 
a0a0: 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20   }.  z[j] = 0;. 
a0b0: 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a   return j;.}../*
a0c0: 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e 69 71 75  .** Find a uniqu
a0d0: 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 74 68  e file ID for th
a0e0: 65 20 67 69 76 65 6e 20 61 62 73 6f 6c 75 74 65  e given absolute
a0f0: 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75   pathname.  Retu
a100: 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
a110: 74 6f 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69  to the vxworksFi
a120: 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 54 68  leId object.  Th
a130: 69 73 20 70 6f 69 6e 74 65 72 20 69 73 20 74 68  is pointer is th
a140: 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c 65  e unique.** file
a150: 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e   ID..**.** The n
a160: 52 65 66 20 66 69 65 6c 64 20 6f 66 20 74 68 65  Ref field of the
a170: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
a180: 62 6a 65 63 74 20 69 73 20 69 6e 63 72 65 6d 65  bject is increme
a190: 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74  nted before.** t
a1a0: 68 65 20 6f 62 6a 65 63 74 20 69 73 20 72 65 74  he object is ret
a1b0: 75 72 6e 65 64 2e 20 20 41 20 6e 65 77 20 76 78  urned.  A new vx
a1c0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
a1d0: 63 74 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  ct is created.**
a1e0: 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68   and added to th
a1f0: 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69 66  e global list if
a200: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
a210: 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
a220: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
a230: 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55  ccurs, return NU
a240: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  LL..*/.static st
a250: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
a260: 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64 46  Id *vxworksFindF
a270: 69 6c 65 49 64 28 63 6f 6e 73 74 20 63 68 61 72  ileId(const char
a280: 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29   *zAbsoluteName)
a290: 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  {.  struct vxwor
a2a0: 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b 20  ksFileId *pNew; 
a2b0: 20 20 20 20 20 20 20 20 2f 2a 20 73 65 61 72 63          /* searc
a2c0: 68 20 6b 65 79 20 61 6e 64 20 6e 65 77 20 66 69  h key and new fi
a2d0: 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74 72 75 63  le ID */.  struc
a2e0: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
a2f0: 2a 70 43 61 6e 64 69 64 61 74 65 3b 20 20 20 2f  *pCandidate;   /
a300: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
a310: 65 72 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  er existing file
a320: 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b   IDs */.  int n;
a330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a350: 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41 62 73 6f   Length of zAbso
a360: 6c 75 74 65 4e 61 6d 65 20 73 74 72 69 6e 67 20  luteName string 
a370: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 41  */..  assert( zA
a380: 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d  bsoluteName[0]==
a390: 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69 6e  '/' );.  n = (in
a3a0: 74 29 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c 75  t)strlen(zAbsolu
a3b0: 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20  teName);.  pNew 
a3c0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
a3d0: 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  64( sizeof(*pNew
a3e0: 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69  ) + (n+1) );.  i
a3f0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
a400: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a  urn 0;.  pNew->z
a410: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20  CanonicalName = 
a420: 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b  (char*)&pNew[1];
a430: 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e  .  memcpy(pNew->
a440: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
a450: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e  zAbsoluteName, n
a460: 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72  +1);.  n = vxwor
a470: 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70  ksSimplifyName(p
a480: 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  New->zCanonicalN
a490: 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53  ame, n);..  /* S
a4a0: 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69  earch for an exi
a4b0: 73 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61 74  sting entry that
a4c0: 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 63 61   matching the ca
a4d0: 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20  nonical name..  
a4e0: 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63  ** If found, inc
a4f0: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
a500: 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64 20 72  ence count and r
a510: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
a520: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 69 73  to.  ** the exis
a530: 74 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20 20  ting file ID..  
a540: 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
a550: 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 43 61  tex();.  for(pCa
a560: 6e 64 69 64 61 74 65 3d 76 78 77 6f 72 6b 73 46  ndidate=vxworksF
a570: 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64 69 64  ileList; pCandid
a580: 61 74 65 3b 20 70 43 61 6e 64 69 64 61 74 65 3d  ate; pCandidate=
a590: 70 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78  pCandidate->pNex
a5a0: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 61 6e  t){.    if( pCan
a5b0: 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e  didate->nName==n
a5c0: 20 0a 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70   .     && memcmp
a5d0: 28 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61  (pCandidate->zCa
a5e0: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65  nonicalName, pNe
a5f0: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
a600: 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a  e, n)==0.    ){.
a610: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
a620: 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ree(pNew);.     
a630: 20 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52    pCandidate->nR
a640: 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69  ef++;.       uni
a650: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
a660: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 61        return pCa
a670: 6e 64 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20  ndidate;.    }. 
a680: 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63   }..  /* No matc
a690: 68 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 57 65  h was found.  We
a6a0: 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77   will make a new
a6b0: 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e   file ID */.  pN
a6c0: 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ew->nRef = 1;.  
a6d0: 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b  pNew->nName = n;
a6e0: 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d  .  pNew->pNext =
a6f0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74   vxworksFileList
a700: 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c  ;.  vxworksFileL
a710: 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e  ist = pNew;.  un
a720: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
a730: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
a740: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e  ../*.** Decremen
a750: 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
a760: 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72  count on a vxwor
a770: 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e  ksFileId object.
a780: 20 20 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62    Free.** the ob
a790: 6a 65 63 74 20 77 68 65 6e 20 74 68 65 20 72 65  ject when the re
a7a0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65  ference count re
a7b0: 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  aches zero..*/.s
a7c0: 74 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f 72  tatic void vxwor
a7d0: 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28  ksReleaseFileId(
a7e0: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
a7f0: 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e  leId *pId){.  un
a800: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
a810: 20 20 61 73 73 65 72 74 28 20 70 49 64 2d 3e 6e    assert( pId->n
a820: 52 65 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e  Ref>0 );.  pId->
a830: 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49  nRef--;.  if( pI
a840: 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  d->nRef==0 ){.  
a850: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
a860: 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20  FileId **pp;.   
a870: 20 66 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b 73   for(pp=&vxworks
a880: 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26 26  FileList; *pp &&
a890: 20 2a 70 70 21 3d 70 49 64 3b 20 70 70 20 3d 20   *pp!=pId; pp = 
a8a0: 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29  &((*pp)->pNext))
a8b0: 7b 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  {}.    assert( *
a8c0: 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a  pp==pId );.    *
a8d0: 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b  pp = pId->pNext;
a8e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
a8f0: 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e  e(pId);.  }.  un
a900: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
a910: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56  }.#endif /* OS_V
a920: 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a  XWORKS */./*****
a930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
a940: 66 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44  f Unique File ID
a950: 20 55 74 69 6c 69 74 79 20 55 73 65 64 20 42 79   Utility Used By
a960: 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a   VxWorks *******
a970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
a980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a9a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a9b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a9c0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a  ********/.../***
a9d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a9e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a9f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
aa00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
aa10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
aa20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
aa30: 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64  ******* Posix Ad
aa40: 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a  visory Locking *
aa50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
aa60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
aa70: 2a 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  * POSIX advisory
aa80: 20 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b 65   locks are broke
aa90: 6e 20 62 79 20 64 65 73 69 67 6e 2e 20 20 41 4e  n by design.  AN
aaa0: 53 49 20 53 54 44 20 31 30 30 33 2e 31 20 28 31  SI STD 1003.1 (1
aab0: 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20  996).** section 
aac0: 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38  6.5.2.2 lines 48
aad0: 33 20 74 68 72 6f 75 67 68 20 34 39 30 20 73 70  3 through 490 sp
aae0: 65 63 69 66 79 20 74 68 61 74 20 77 68 65 6e 20  ecify that when 
aaf0: 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74  a process.** set
ab00: 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f  s or clears a lo
ab10: 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69  ck, that operati
ab20: 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79  on overrides any
ab30: 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74   prior locks set
ab40: 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20  .** by the same 
ab50: 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65  process.  It doe
ab60: 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79  s not explicitly
ab70: 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69   say so, but thi
ab80: 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61  s implies.** tha
ab90: 74 20 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c  t it overrides l
aba0: 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68 65 20  ocks set by the 
abb0: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69  same process usi
abc0: 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  ng a different.*
abd0: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
abe0: 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69  r.  Consider thi
abf0: 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a  s test case:.**.
ac00: 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 31  **       int fd1
ac10: 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31   = open("./file1
ac20: 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  ", O_RDWR|O_CREA
ac30: 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20  T, 0644);.**    
ac40: 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65     int fd2 = ope
ac50: 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52  n("./file2", O_R
ac60: 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34  DWR|O_CREAT, 064
ac70: 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73  4);.**.** Suppos
ac80: 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f  e ./file1 and ./
ac90: 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79  file2 are really
aca0: 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28   the same file (
acb0: 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69  because.** one i
acc0: 73 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62  s a hard or symb
acd0: 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65  olic link to the
ace0: 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66 20   other) then if 
acf0: 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78  you set.** an ex
ad00: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
ad10: 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f  fd1, then try to
ad20: 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76   get an exclusiv
ad30: 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32  e lock.** on fd2
ad40: 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77  , it works.  I w
ad50: 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65 63 74  ould have expect
ad60: 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f  ed the second lo
ad70: 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69  ck to.** fail si
ad80: 6e 63 65 20 74 68 65 72 65 20 77 61 73 20 61 6c  nce there was al
ad90: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20  ready a lock on 
ada0: 74 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20  the file due to 
adb0: 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20  fd1..** But not 
adc0: 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20  so.  Since both 
add0: 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20  locks came from 
ade0: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
adf0: 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  , the.** second 
ae00: 6f 76 65 72 72 69 64 65 73 20 74 68 65 20 66 69  overrides the fi
ae10: 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  rst, even though
ae20: 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69   they were on di
ae30: 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20  fferent.** file 
ae40: 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e  descriptors open
ae50: 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20  ed on different 
ae60: 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a  file names..**.*
ae70: 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  * This means tha
ae80: 74 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20  t we cannot use 
ae90: 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73  POSIX locks to s
aea0: 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20  ynchronize file 
aeb0: 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20  access.** among 
aec0: 63 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61 64  competing thread
aed0: 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70 72  s of the same pr
aee0: 6f 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f  ocess.  POSIX lo
aef0: 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69  cks will work fi
af00: 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f  ne.** to synchro
af10: 6e 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72 20  nize access for 
af20: 74 68 72 65 61 64 73 20 69 6e 20 73 65 70 61 72  threads in separ
af30: 61 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20 62  ate processes, b
af40: 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64  ut not.** thread
af50: 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  s within the sam
af60: 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  e process..**.**
af70: 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
af80: 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c  the problem, SQL
af90: 69 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67  ite has to manag
afa0: 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74  e file locks int
afb0: 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74  ernally.** on it
afc0: 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72  s own.  Whenever
afd0: 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
afe0: 69 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61  is opened, we ha
aff0: 76 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a  ve to find the.*
b000: 2a 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65  * specific inode
b010: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
b020: 20 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65   file (the inode
b030: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
b040: 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20  y the.** st_dev 
b050: 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64  and st_ino field
b060: 73 20 6f 66 20 74 68 65 20 73 74 61 74 20 73 74  s of the stat st
b070: 72 75 63 74 75 72 65 20 74 68 61 74 20 66 73 74  ructure that fst
b080: 61 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a  at() fills in).*
b090: 2a 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20  * and check for 
b0a0: 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78  locks already ex
b0b0: 69 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69  isting on that i
b0c0: 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b  node.  When lock
b0d0: 73 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64  s are.** created
b0e0: 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20   or removed, we 
b0f0: 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20  have to look at 
b100: 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c  our own internal
b110: 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a   record of the.*
b120: 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69  * locks to see i
b130: 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  f another thread
b140: 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   has previously 
b150: 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  set a lock on th
b160: 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65  at same.** inode
b170: 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20  ..**.** (Aside: 
b180: 54 68 65 20 75 73 65 20 6f 66 20 69 6e 6f 64 65  The use of inode
b190: 20 6e 75 6d 62 65 72 73 20 61 73 20 75 6e 69 71   numbers as uniq
b1a0: 75 65 20 49 44 73 20 64 6f 65 73 20 6e 6f 74 20  ue IDs does not 
b1b0: 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  work on VxWorks.
b1c0: 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c  .** For VxWorks,
b1d0: 20 77 65 20 68 61 76 65 20 74 6f 20 75 73 65 20   we have to use 
b1e0: 74 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20  the alternative 
b1f0: 75 6e 69 71 75 65 20 49 44 20 73 79 73 74 65 6d  unique ID system
b200: 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e   based on.** can
b210: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20  onical filename 
b220: 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  and implemented 
b230: 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
b240: 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a  division.).**.**
b250: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   The sqlite3_fil
b260: 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  e structure for 
b270: 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67  POSIX is no long
b280: 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65 67  er just an integ
b290: 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72  er file.** descr
b2a0: 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f  iptor.  It is no
b2b0: 77 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68  w a structure th
b2c0: 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e 74  at holds the int
b2d0: 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73  eger file.** des
b2e0: 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70 6f  criptor and a po
b2f0: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75 63  inter to a struc
b300: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
b310: 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  bes the internal
b320: 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  .** locks on the
b330: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69   corresponding i
b340: 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73 20  node.  There is 
b350: 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  one locking stru
b360: 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f  cture.** per ino
b370: 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61  de, so if the sa
b380: 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e  me inode is open
b390: 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20 75  ed twice, both u
b3a0: 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
b3b0: 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74  es.** point to t
b3c0: 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20  he same locking 
b3d0: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
b3e0: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
b3f0: 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66  e keeps.** a ref
b400: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f  erence count (so
b410: 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68   we will know wh
b420: 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29  en to delete it)
b430: 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20   and a "cnt".** 
b440: 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73  field that tells
b450: 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c   us its internal
b460: 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63   lock status.  c
b470: 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a  nt==0 means the.
b480: 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  ** file is unloc
b490: 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65  ked.  cnt==-1 me
b4a0: 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61 73  ans the file has
b4b0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
b4c0: 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61  ck..** cnt>0 mea
b4d0: 6e 73 20 74 68 65 72 65 20 61 72 65 20 63 6e 74  ns there are cnt
b4e0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e   shared locks on
b4f0: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
b500: 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
b510: 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61  lock or unlock a
b520: 20 66 69 6c 65 20 66 69 72 73 74 20 63 68 65 63   file first chec
b530: 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a  ks the locking.*
b540: 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  * structure.  Th
b550: 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d  e fcntl() system
b560: 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e   call is only in
b570: 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a  voked to set a .
b580: 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66  ** POSIX lock if
b590: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f   the internal lo
b5a0: 63 6b 20 73 74 72 75 63 74 75 72 65 20 74 72 61  ck structure tra
b5b0: 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e  nsitions between
b5c0: 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64  .** a locked and
b5d0: 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61   an unlocked sta
b5e0: 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61  te..**.** But wa
b5f0: 69 74 3a 20 20 74 68 65 72 65 20 61 72 65 20 79  it:  there are y
b600: 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73  et more problems
b610: 20 77 69 74 68 20 50 4f 53 49 58 20 61 64 76 69   with POSIX advi
b620: 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  sory locks..**.*
b630: 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20 61  * If you close a
b640: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
b650: 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20   that points to 
b660: 61 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20  a file that has 
b670: 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f  locks,.** all lo
b680: 63 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  cks on that file
b690: 20 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64 20   that are owned 
b6a0: 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  by the current p
b6b0: 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72 65  rocess are.** re
b6c0: 6c 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b  leased.  To work
b6d0: 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f   around this pro
b6e0: 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78 49  blem, each unixI
b6f0: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0a  nodeInfo object.
b700: 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 63  ** maintains a c
b710: 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62  ount of the numb
b720: 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f  er of pending lo
b730: 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65  cks on tha inode
b740: 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74 74  ..** When an att
b750: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
b760: 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c  close an unixFil
b770: 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 0a  e, if there are.
b780: 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c  ** other unixFil
b790: 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  e open on the sa
b7a0: 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72  me inode that ar
b7b0: 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c  e holding locks,
b7c0: 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20   the call.** to 
b7d0: 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65  close() the file
b7e0: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 64   descriptor is d
b7f0: 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c  eferred until al
b800: 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63  l of the locks c
b810: 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69  lear..** The uni
b820: 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63  xInodeInfo struc
b830: 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73  ture keeps a lis
b840: 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69  t of file descri
b850: 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20  ptors that need 
b860: 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20  to.** be closed 
b870: 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69 73  and that list is
b880: 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65   walked (and cle
b890: 61 72 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c  ared) when the l
b8a0: 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61  ast lock.** clea
b8b0: 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e  rs..**.** Yet an
b8c0: 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20  other problem:  
b8d0: 4c 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f 20  LinuxThreads do 
b8e0: 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69  not play well wi
b8f0: 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a  th posix locks..
b900: 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72  **.** Many older
b910: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e   versions of lin
b920: 75 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75 78  ux use the Linux
b930: 54 68 72 65 61 64 73 20 6c 69 62 72 61 72 79 20  Threads library 
b940: 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20  which is.** not 
b950: 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e  posix compliant.
b960: 20 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68 72    Under LinuxThr
b970: 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65  eads, a lock cre
b980: 61 74 65 64 20 62 79 20 74 68 72 65 61 64 0a 2a  ated by thread.*
b990: 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f  * A cannot be mo
b9a0: 64 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72 69  dified or overri
b9b0: 64 64 65 6e 20 62 79 20 61 20 64 69 66 66 65 72  dden by a differ
b9c0: 65 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a  ent thread B..**
b9d0: 20 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20 63   Only thread A c
b9e0: 61 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f  an modify the lo
b9f0: 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68  ck.  Locking beh
ba00: 61 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63 74  avior is correct
ba10: 0a 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69  .** if the appli
ba20: 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e  ation uses the n
ba30: 65 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69  ewer Native Posi
ba40: 78 20 54 68 72 65 61 64 20 4c 69 62 72 61 72 79  x Thread Library
ba50: 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69   (NPTL).** on li
ba60: 6e 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20  nux - with NPTL 
ba70: 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62  a lock created b
ba80: 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f  y thread A can o
ba90: 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a  verride locks.**
baa0: 20 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42   in thread B.  B
bab0: 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  ut there is no w
bac0: 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f  ay to know at co
bad0: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68  mpile-time which
bae0: 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c 69  .** threading li
baf0: 62 72 61 72 79 20 69 73 20 62 65 69 6e 67 20 75  brary is being u
bb00: 73 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20 69  sed.  So there i
bb10: 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77  s no way to know
bb20: 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74   at.** compile-t
bb30: 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ime whether or n
bb40: 6f 74 20 74 68 72 65 61 64 20 41 20 63 61 6e 20  ot thread A can 
bb50: 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f  override locks o
bb60: 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f  n thread B..** O
bb70: 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 61 20 72  ne has to do a r
bb80: 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74 6f  un-time check to
bb90: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 62 65   discover the be
bba0: 68 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a  havior of the.**
bbb0: 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
bbc0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75  ..**.** SQLite u
bbd0: 73 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 4c  sed to support L
bbe0: 69 6e 75 78 54 68 72 65 61 64 73 2e 20 20 42 75  inuxThreads.  Bu
bbf0: 74 20 73 75 70 70 6f 72 74 20 66 6f 72 20 4c 69  t support for Li
bc00: 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a 20 77 61  nuxThreads.** wa
bc10: 73 20 64 72 6f 70 70 65 64 20 62 65 67 69 6e 6e  s dropped beginn
bc20: 69 6e 67 20 77 69 74 68 20 76 65 72 73 69 6f 6e  ing with version
bc30: 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65 20   3.7.0.  SQLite 
bc40: 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20  will still work 
bc50: 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68 72  with.** LinuxThr
bc60: 65 61 64 73 20 70 72 6f 76 69 64 65 64 20 74 68  eads provided th
bc70: 61 74 20 28 31 29 20 74 68 65 72 65 20 69 73 20  at (1) there is 
bc80: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
bc90: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20   connection .** 
bca0: 70 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  per database fil
bcb0: 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72  e in the same pr
bcc0: 6f 63 65 73 73 20 61 6e 64 20 28 32 29 20 64 61  ocess and (2) da
bcd0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
bce0: 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76  ns.** do not mov
bcf0: 65 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  e across threads
bd00: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  ..*/../*.** An i
bd10: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
bd20: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
bd30: 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68 65  re serves as the
bd40: 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20   key used.** to 
bd50: 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63 75  locate a particu
bd60: 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  lar unixInodeInf
bd70: 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72  o object..*/.str
bd80: 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 7b  uct unixFileId {
bd90: 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20  .  dev_t dev;   
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bdb0: 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20  * Device number 
bdc0: 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  */.#if OS_VXWORK
bdd0: 53 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  S.  struct vxwor
bde0: 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20  ksFileId *pId;  
bdf0: 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49  /* Unique file I
be00: 44 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a  D for vxworks. *
be10: 2f 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 57 65 20  /.#else.  /* We 
be20: 61 72 65 20 74 6f 6c 64 20 74 68 61 74 20 73 6f  are told that so
be30: 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 41  me versions of A
be40: 6e 64 72 6f 69 64 20 63 6f 6e 74 61 69 6e 20 61  ndroid contain a
be50: 20 62 75 67 20 74 68 61 74 0a 20 20 2a 2a 20 73   bug that.  ** s
be60: 69 7a 65 73 20 69 6e 6f 5f 74 20 61 74 20 6f 6e  izes ino_t at on
be70: 6c 79 20 33 32 2d 62 69 74 73 20 69 6e 73 74 65  ly 32-bits inste
be80: 61 64 20 6f 66 20 36 34 2d 62 69 74 73 2e 20 28  ad of 64-bits. (
be90: 53 65 65 0a 20 20 2a 2a 20 68 74 74 70 73 3a 2f  See.  ** https:/
bea0: 2f 61 6e 64 72 6f 69 64 2d 72 65 76 69 65 77 2e  /android-review.
beb0: 67 6f 6f 67 6c 65 73 6f 75 72 63 65 2e 63 6f 6d  googlesource.com
bec0: 2f 23 2f 63 2f 31 31 35 33 35 31 2f 33 2f 64 69  /#/c/115351/3/di
bed0: 73 74 2f 73 71 6c 69 74 65 33 2e 63 29 0a 20 20  st/sqlite3.c).  
bee0: 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
bef0: 64 20 74 68 69 73 2c 20 61 6c 77 61 79 73 20 61  d this, always a
bf00: 6c 6c 6f 63 61 74 65 20 36 34 2d 62 69 74 73 20  llocate 64-bits 
bf10: 66 6f 72 20 74 68 65 20 69 6e 6f 64 65 20 6e 75  for the inode nu
bf20: 6d 62 65 72 2e 20 20 0a 20 20 2a 2a 20 4f 6e 20  mber.  .  ** On 
bf30: 73 6d 61 6c 6c 20 6d 61 63 68 69 6e 65 73 20 74  small machines t
bf40: 68 61 74 20 6f 6e 6c 79 20 68 61 76 65 20 33 32  hat only have 32
bf50: 2d 62 69 74 20 69 6e 6f 64 65 73 2c 20 74 68 69  -bit inodes, thi
bf60: 73 20 77 61 73 74 65 73 20 34 20 62 79 74 65 73  s wastes 4 bytes
bf70: 2c 0a 20 20 2a 2a 20 62 75 74 20 74 68 61 74 20  ,.  ** but that 
bf80: 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20  should not be a 
bf90: 62 69 67 20 64 65 61 6c 2e 20 2a 2f 0a 20 20 2f  big deal. */.  /
bfa0: 2a 20 57 41 53 3a 20 20 69 6e 6f 5f 74 20 69 6e  * WAS:  ino_t in
bfb0: 6f 3b 20 20 20 2a 2f 0a 20 20 75 36 34 20 69 6e  o;   */.  u64 in
bfc0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
bfd0: 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75       /* Inode nu
bfe0: 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  mber */.#endif.}
bff0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
c000: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
c010: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
c020: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  is allocated for
c030: 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e   each open.** in
c040: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e  ode..**.** A sin
c050: 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68 61  gle inode can ha
c060: 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65  ve multiple file
c070: 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73 6f   descriptors, so
c080: 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a   each unixFile.*
c090: 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  * structure cont
c0a0: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
c0b0: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
c0c0: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64   this object and
c0d0: 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20   this.** object 
c0e0: 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66  keeps a count of
c0f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75   the number of u
c100: 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67  nixFile pointing
c110: 20 74 6f 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4d 75   to it..**.** Mu
c120: 74 65 78 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a  tex rules:.**.**
c130: 20 20 28 31 29 20 4f 6e 6c 79 20 74 68 65 20 70    (1) Only the p
c140: 4c 6f 63 6b 4d 75 74 65 78 20 6d 75 74 65 78 20  LockMutex mutex 
c150: 6d 75 73 74 20 62 65 20 68 65 6c 64 20 69 6e 20  must be held in 
c160: 6f 72 64 65 72 20 74 6f 20 72 65 61 64 20 6f 72  order to read or
c170: 20 77 72 69 74 65 0a 2a 2a 20 20 20 20 20 20 61   write.**      a
c180: 6e 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ny of the lockin
c190: 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 20 20 20 20  g fields:.**    
c1a0: 20 20 20 20 20 20 6e 53 68 61 72 65 64 2c 20 6e        nShared, n
c1b0: 4c 6f 63 6b 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  Lock, eFileLock,
c1c0: 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b 2c 20 70   bProcessLock, p
c1d0: 55 6e 75 73 65 64 0a 2a 2a 0a 2a 2a 20 20 28 32  Unused.**.**  (2
c1e0: 29 20 57 68 65 6e 20 6e 52 65 66 3e 30 2c 20 74  ) When nRef>0, t
c1f0: 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hen the followin
c200: 67 20 66 69 65 6c 64 73 20 61 72 65 20 75 6e 63  g fields are unc
c210: 68 61 6e 67 69 6e 67 20 61 6e 64 20 63 61 6e 0a  hanging and can.
c220: 2a 2a 20 20 20 20 20 20 62 65 20 72 65 61 64 20  **      be read 
c230: 28 62 75 74 20 6e 6f 74 20 77 72 69 74 74 65 6e  (but not written
c240: 29 20 77 69 74 68 6f 75 74 20 68 6f 6c 64 69 6e  ) without holdin
c250: 67 20 61 6e 79 20 6d 75 74 65 78 3a 0a 2a 2a 20  g any mutex:.** 
c260: 20 20 20 20 20 20 20 20 20 66 69 6c 65 49 64 2c           fileId,
c270: 20 70 4c 6f 63 6b 4d 75 74 65 78 0a 2a 2a 0a 2a   pLockMutex.**.*
c280: 2a 20 20 28 33 29 20 57 69 74 68 20 74 68 65 20  *  (3) With the 
c290: 65 78 63 65 70 74 69 6f 6e 73 20 61 62 6f 76 65  exceptions above
c2a0: 2c 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73  , all the fields
c2b0: 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 72 65 61   may only be rea
c2c0: 64 0a 2a 2a 20 20 20 20 20 20 6f 72 20 77 72 69  d.**      or wri
c2d0: 74 74 65 6e 20 77 68 69 6c 65 20 68 6f 6c 64 69  tten while holdi
c2e0: 6e 67 20 74 68 65 20 67 6c 6f 62 61 6c 20 75 6e  ng the global un
c2f0: 69 78 42 69 67 4c 6f 63 6b 20 6d 75 74 65 78 2e  ixBigLock mutex.
c300: 0a 2a 2a 0a 2a 2a 20 44 65 61 64 6c 6f 63 6b 20  .**.** Deadlock 
c310: 70 72 65 76 65 6e 74 69 6f 6e 3a 20 20 54 68 65  prevention:  The
c320: 20 67 6c 6f 62 61 6c 20 75 6e 69 78 42 69 67 4c   global unixBigL
c330: 6f 63 6b 20 6d 75 74 65 78 20 6d 61 79 20 6e 6f  ock mutex may no
c340: 74 0a 2a 2a 20 62 65 20 61 63 71 75 69 72 65 64  t.** be acquired
c350: 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74   while holding t
c360: 68 65 20 70 4c 6f 63 6b 4d 75 74 65 78 20 6d 75  he pLockMutex mu
c370: 74 65 78 2e 20 20 49 66 20 62 6f 74 68 20 75 6e  tex.  If both un
c380: 69 78 42 69 67 4c 6f 63 6b 0a 2a 2a 20 61 6e 64  ixBigLock.** and
c390: 20 70 4c 6f 63 6b 4d 75 74 65 78 20 61 72 65 20   pLockMutex are 
c3a0: 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 75 6e 69  needed, then uni
c3b0: 78 42 69 67 4c 6f 63 6b 20 6d 75 73 74 20 62 65  xBigLock must be
c3c0: 20 61 63 71 75 69 72 65 64 20 66 69 72 73 74 2e   acquired first.
c3d0: 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 49  .*/.struct unixI
c3e0: 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72  nodeInfo {.  str
c3f0: 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66  uct unixFileId f
c400: 69 6c 65 49 64 3b 20 20 20 20 20 20 20 2f 2a 20  ileId;       /* 
c410: 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a  The lookup key *
c420: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
c430: 78 20 2a 70 4c 6f 63 6b 4d 75 74 65 78 3b 20 20  x *pLockMutex;  
c440: 20 20 20 20 2f 2a 20 48 6f 6c 64 20 74 68 69 73      /* Hold this
c450: 20 6d 75 74 65 78 20 66 6f 72 2e 2e 2e 20 2a 2f   mutex for... */
c460: 0a 20 20 69 6e 74 20 6e 53 68 61 72 65 64 3b 20  .  int nShared; 
c470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c480: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
c490: 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68  f SHARED locks h
c4a0: 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f  eld */.  int nLo
c4b0: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
c4c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c4d0: 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64  mber of outstand
c4e0: 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 2a  ing file locks *
c4f0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
c500: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
c510: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
c520: 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53  SHARED_LOCK, RES
c530: 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20  ERVED_LOCK etc. 
c540: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
c550: 61 72 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b  ar bProcessLock;
c560: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 63         /* An exc
c570: 6c 75 73 69 76 65 20 70 72 6f 63 65 73 73 20 6c  lusive process l
c580: 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0a 20  ock is held */. 
c590: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
c5a0: 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20 20  Unused;         
c5b0: 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c     /* Unused fil
c5c0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 6f  e descriptors to
c5d0: 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e 74 20   close */.  int 
c5e0: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
c5f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
c600: 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72  umber of pointer
c610: 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63 74  s to this struct
c620: 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ure */.  unixShm
c630: 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
c640: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
c650: 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ed memory associ
c660: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69  ated with this i
c670: 6e 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e  node */.  unixIn
c680: 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20  odeInfo *pNext; 
c690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
c6a0: 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f  t of all unixIno
c6b0: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a  deInfo objects *
c6c0: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
c6d0: 6f 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20  o *pPrev;       
c6e0: 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64      /*    .... d
c6f0: 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a  oubly linked */.
c700: 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
c710: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
c720: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
c730: 6c 6f 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b  long sharedByte;
c740: 20 20 2f 2a 20 66 6f 72 20 41 46 50 20 73 69 6d    /* for AFP sim
c750: 75 6c 61 74 65 64 20 73 68 61 72 65 64 20 6c 6f  ulated shared lo
c760: 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  ck */.#endif.#if
c770: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65   OS_VXWORKS.  se
c780: 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 20  m_t *pSem;      
c790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c7a0: 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d   Named POSIX sem
c7b0: 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72  aphore */.  char
c7c0: 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41   aSemName[MAX_PA
c7d0: 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e  THNAME+2];  /* N
c7e0: 61 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61  ame of that sema
c7f0: 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  phore */.#endif.
c800: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74  };../*.** A list
c810: 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f  s of all unixIno
c820: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a  deInfo objects..
c830: 2a 2a 0a 2a 2a 20 4d 75 73 74 20 68 6f 6c 64 20  **.** Must hold 
c840: 75 6e 69 78 42 69 67 4c 6f 63 6b 20 69 6e 20 6f  unixBigLock in o
c850: 72 64 65 72 20 74 6f 20 72 65 61 64 20 6f 72 20  rder to read or 
c860: 77 72 69 74 65 20 74 68 69 73 20 76 61 72 69 61  write this varia
c870: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ble..*/.static u
c880: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e  nixInodeInfo *in
c890: 6f 64 65 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a  odeList = 0;  /*
c8a0: 20 41 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e   All unixInodeIn
c8b0: 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 0a 23  fo objects */..#
c8c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
c8d0: 55 47 0a 2f 2a 0a 2a 2a 20 54 72 75 65 20 69 66  UG./*.** True if
c8e0: 20 74 68 65 20 69 6e 6f 64 65 20 6d 75 74 65 78   the inode mutex
c8f0: 20 28 6f 6e 20 74 68 65 20 75 6e 69 78 46 69 6c   (on the unixFil
c900: 65 2e 70 46 69 6c 65 4d 75 74 65 78 20 66 69 65  e.pFileMutex fie
c910: 6c 64 29 20 69 73 20 68 65 6c 64 2c 20 6f 72 20  ld) is held, or 
c920: 6e 6f 74 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  not..** This rou
c930: 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c  tine is used onl
c940: 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  y within assert(
c950: 29 20 74 6f 20 68 65 6c 70 20 76 65 72 69 66 79  ) to help verify
c960: 20 63 6f 72 72 65 63 74 20 6d 75 74 65 78 0a 2a   correct mutex.*
c970: 2a 20 75 73 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20  * usage..*/.int 
c980: 75 6e 69 78 46 69 6c 65 4d 75 74 65 78 48 65 6c  unixFileMutexHel
c990: 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  d(unixFile *pFil
c9a0: 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46  e){.  assert( pF
c9b0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20  ile->pInode );. 
c9c0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
c9d0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 69 6c 65  mutex_held(pFile
c9e0: 2d 3e 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d  ->pInode->pLockM
c9f0: 75 74 65 78 29 3b 0a 7d 0a 69 6e 74 20 75 6e 69  utex);.}.int uni
ca00: 78 46 69 6c 65 4d 75 74 65 78 4e 6f 74 68 65 6c  xFileMutexNothel
ca10: 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  d(unixFile *pFil
ca20: 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46  e){.  assert( pF
ca30: 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20  ile->pInode );. 
ca40: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
ca50: 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 46  mutex_notheld(pF
ca60: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 4c 6f  ile->pInode->pLo
ca70: 63 6b 4d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64  ckMutex);.}.#end
ca80: 69 66 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69  if../*.**.** Thi
ca90: 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 75 6e 69  s function - uni
caa0: 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28  xLogErrorAtLine(
cab0: 29 2c 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20  ), is only ever 
cac0: 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d  called via the m
cad0: 61 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45  acro.** unixLogE
cae0: 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74  rror()..**.** It
caf0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65   is invoked afte
cb00: 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  r an error occur
cb10: 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74  s in an OS funct
cb20: 69 6f 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68 61  ion and errno ha
cb30: 73 20 62 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49  s been.** set. I
cb40: 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65  t logs a message
cb50: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c   using sqlite3_l
cb60: 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20  og() containing 
cb70: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
cb80: 65 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e  e of.** errno an
cb90: 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20  d, if possible, 
cba0: 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  the human-readab
cbb0: 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72  le equivalent fr
cbc0: 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72  om strerror() or
cbd0: 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29  .** strerror_r()
cbe0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
cbf0: 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
cc00: 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73  d to the macro s
cc10: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72  hould be the err
cc20: 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20  or code that.** 
cc30: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
cc40: 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e   to SQLite (e.g.
cc50: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
cc60: 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e  LETE, SQLITE_CAN
cc70: 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20  TOPEN). .** The 
cc80: 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61  two subsequent a
cc90: 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20  rguments should 
cca0: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  be the name of t
ccb0: 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74  he OS function t
ccc0: 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65  hat.** failed (e
ccd0: 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f  .g. "unlink", "o
cce0: 70 65 6e 22 29 20 61 6e 64 20 74 68 65 20 61 73  pen") and the as
ccf0: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79  sociated file-sy
cd00: 73 74 65 6d 20 70 61 74 68 2c 0a 2a 2a 20 69 66  stem path,.** if
cd10: 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65   any..*/.#define
cd20: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 61 2c   unixLogError(a,
cd30: 62 2c 63 29 20 20 20 20 20 75 6e 69 78 4c 6f 67  b,c)     unixLog
cd40: 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c  ErrorAtLine(a,b,
cd50: 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74  c,__LINE__).stat
cd60: 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 67 45 72  ic int unixLogEr
cd70: 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74  rorAtLine(.  int
cd80: 20 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20   errcode,       
cd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cda0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
cdb0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
cdc0: 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20  r *zFunc,       
cdd0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
cde0: 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  f OS function th
cdf0: 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63  at failed */.  c
ce00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
ce10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
ce20: 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f  * File path asso
ce30: 63 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f  ciated with erro
ce40: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65  r */.  int iLine
ce50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce60: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
ce70: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65   line number whe
ce80: 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  re error occurre
ce90: 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  d */.){.  char *
cea0: 7a 45 72 72 3b 20 20 20 20 20 20 20 20 20 20 20  zErr;           
ceb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 73            /* Mes
cec0: 73 61 67 65 20 66 72 6f 6d 20 73 74 72 65 72 72  sage from strerr
ced0: 6f 72 28 29 20 6f 72 20 65 71 75 69 76 61 6c 65  or() or equivale
cee0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 45 72 72  nt */.  int iErr
cef0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 20 20 20 20  no = errno;     
cf00: 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64          /* Saved
cf10: 20 73 79 73 63 61 6c 6c 20 65 72 72 6f 72 20 6e   syscall error n
cf20: 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49  umber */..  /* I
cf30: 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
cf40: 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64  threadsafe build
cf50: 20 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53   (SQLITE_THREADS
cf60: 41 46 45 3d 3d 30 29 2c 20 74 68 65 6e 20 75 73  AFE==0), then us
cf70: 65 0a 20 20 2a 2a 20 74 68 65 20 73 74 72 65 72  e.  ** the strer
cf80: 72 6f 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  ror() function t
cf90: 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 68 75 6d  o obtain the hum
cfa0: 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 72 72 6f  an-readable erro
cfb0: 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 65  r message.  ** e
cfc0: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 65 72 72  quivalent to err
cfd0: 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  no. Otherwise, u
cfe0: 73 65 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e  se strerror_r().
cff0: 0a 20 20 2a 2f 20 0a 23 69 66 20 53 51 4c 49 54  .  */ .#if SQLIT
d000: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
d010: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 53 54 52  defined(HAVE_STR
d020: 45 52 52 4f 52 5f 52 29 0a 20 20 63 68 61 72 20  ERROR_R).  char 
d030: 61 45 72 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73  aErr[80];.  mems
d040: 65 74 28 61 45 72 72 2c 20 30 2c 20 73 69 7a 65  et(aErr, 0, size
d050: 6f 66 28 61 45 72 72 29 29 3b 0a 20 20 7a 45 72  of(aErr));.  zEr
d060: 72 20 3d 20 61 45 72 72 3b 0a 0a 20 20 2f 2a 20  r = aErr;..  /* 
d070: 49 66 20 53 54 52 45 52 52 4f 52 5f 52 5f 43 48  If STRERROR_R_CH
d080: 41 52 5f 50 20 28 73 65 74 20 62 79 20 61 75 74  AR_P (set by aut
d090: 6f 63 6f 6e 66 20 73 63 72 69 70 74 73 29 20 6f  oconf scripts) o
d0a0: 72 20 5f 5f 55 53 45 5f 47 4e 55 20 69 73 20 64  r __USE_GNU is d
d0b0: 65 66 69 6e 65 64 2c 0a 20 20 2a 2a 20 61 73 73  efined,.  ** ass
d0c0: 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73  ume that the sys
d0d0: 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65  tem provides the
d0e0: 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 6f 66 20   GNU version of 
d0f0: 73 74 72 65 72 72 6f 72 5f 72 28 29 20 74 68 61  strerror_r() tha
d100: 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61  t.  ** returns a
d110: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75   pointer to a bu
d120: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
d130: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
d140: 65 2e 20 54 68 61 74 20 70 6f 69 6e 74 65 72 20  e. That pointer 
d150: 0a 20 20 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20  .  ** may point 
d160: 74 6f 20 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74  to aErr[], or it
d170: 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f   may point to so
d180: 6d 65 20 73 74 61 74 69 63 20 73 74 6f 72 61 67  me static storag
d190: 65 20 73 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20  e somewhere. .  
d1a0: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73  ** Otherwise, as
d1b0: 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 79  sume that the sy
d1c0: 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68  stem provides th
d1d0: 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20  e POSIX version 
d1e0: 6f 66 20 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f  of .  ** strerro
d1f0: 72 5f 72 28 29 2c 20 77 68 69 63 68 20 61 6c 77  r_r(), which alw
d200: 61 79 73 20 77 72 69 74 65 73 20 61 6e 20 65 72  ays writes an er
d210: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f  ror message into
d220: 20 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20   aErr[]..  **.  
d230: 2a 2a 20 49 66 20 74 68 65 20 63 6f 64 65 20 69  ** If the code i
d240: 6e 63 6f 72 72 65 63 74 6c 79 20 61 73 73 75 6d  ncorrectly assum
d250: 65 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68  es that it is th
d260: 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20  e POSIX version 
d270: 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 61 76 61  that is.  ** ava
d280: 69 6c 61 62 6c 65 2c 20 74 68 65 20 65 72 72 6f  ilable, the erro
d290: 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 6f  r message will o
d2a0: 66 74 65 6e 20 62 65 20 61 6e 20 65 6d 70 74 79  ften be an empty
d2b0: 20 73 74 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20   string. Not a. 
d2c0: 20 2a 2a 20 68 75 67 65 20 70 72 6f 62 6c 65 6d   ** huge problem
d2d0: 2e 20 49 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f  . Incorrectly co
d2e0: 6e 63 6c 75 64 69 6e 67 20 74 68 61 74 20 74 68  ncluding that th
d2f0: 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 69 73  e GNU version is
d300: 20 61 76 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a   available .  **
d310: 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61   could lead to a
d320: 20 73 65 67 66 61 75 6c 74 20 74 68 6f 75 67 68   segfault though
d330: 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ..  */.#if defin
d340: 65 64 28 53 54 52 45 52 52 4f 52 5f 52 5f 43 48  ed(STRERROR_R_CH
d350: 41 52 5f 50 29 20 7c 7c 20 64 65 66 69 6e 65 64  AR_P) || defined
d360: 28 5f 5f 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45  (__USE_GNU).  zE
d370: 72 72 20 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20  rr = .# endif.  
d380: 73 74 72 65 72 72 6f 72 5f 72 28 69 45 72 72 6e  strerror_r(iErrn
d390: 6f 2c 20 61 45 72 72 2c 20 73 69 7a 65 6f 66 28  o, aErr, sizeof(
d3a0: 61 45 72 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66  aErr)-1);..#elif
d3b0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
d3c0: 46 45 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20  FE.  /* This is 
d3d0: 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75 69  a threadsafe bui
d3e0: 6c 64 2c 20 62 75 74 20 73 74 72 65 72 72 6f 72  ld, but strerror
d3f0: 5f 72 28 29 20 69 73 20 6e 6f 74 20 61 76 61 69  _r() is not avai
d400: 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72  lable. */.  zErr
d410: 20 3d 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f   = "";.#else.  /
d420: 2a 20 4e 6f 6e 2d 74 68 72 65 61 64 73 61 66 65  * Non-threadsafe
d430: 20 62 75 69 6c 64 2c 20 75 73 65 20 73 74 72 65   build, use stre
d440: 72 72 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72  rror(). */.  zEr
d450: 72 20 3d 20 73 74 72 65 72 72 6f 72 28 69 45 72  r = strerror(iEr
d460: 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  rno);.#endif..  
d470: 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a  if( zPath==0 ) z
d480: 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c  Path = "";.  sql
d490: 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65  ite3_log(errcode
d4a0: 2c 0a 20 20 20 20 20 20 22 6f 73 5f 75 6e 69 78  ,.      "os_unix
d4b0: 2e 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25  .c:%d: (%d) %s(%
d4c0: 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20  s) - %s",.      
d4d0: 69 4c 69 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a  iLine, iErrno, z
d4e0: 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72  Func, zPath, zEr
d4f0: 72 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  r.  );..  return
d500: 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a   errcode;.}../*.
d510: 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20  ** Close a file 
d520: 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a  descriptor..**.*
d530: 2a 20 57 65 20 61 73 73 75 6d 65 20 74 68 61 74  * We assume that
d540: 20 63 6c 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20   close() almost 
d550: 61 6c 77 61 79 73 20 77 6f 72 6b 73 2c 20 73 69  always works, si
d560: 6e 63 65 20 69 74 20 69 73 20 6f 6e 6c 79 20 69  nce it is only i
d570: 6e 20 61 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b  n a.** very sick
d580: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20   application or 
d590: 6f 6e 20 61 20 76 65 72 79 20 73 69 63 6b 20 70  on a very sick p
d5a0: 6c 61 74 66 6f 72 6d 20 74 68 61 74 20 69 74 20  latform that it 
d5b0: 6d 69 67 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49  might fail..** I
d5c0: 66 20 69 74 20 64 6f 65 73 20 66 61 69 6c 2c 20  f it does fail, 
d5d0: 73 69 6d 70 6c 79 20 6c 65 61 6b 20 74 68 65 20  simply leak the 
d5e0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c  file descriptor,
d5f0: 20 62 75 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a   but do log the.
d600: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  ** error..**.** 
d610: 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69 73 20  Note that it is 
d620: 6e 6f 74 20 73 61 66 65 20 74 6f 20 72 65 74 72  not safe to retr
d630: 79 20 63 6c 6f 73 65 28 29 20 61 66 74 65 72 20  y close() after 
d640: 45 49 4e 54 52 20 73 69 6e 63 65 20 74 68 65 0a  EINTR since the.
d650: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
d660: 6f 72 20 6d 69 67 68 74 20 68 61 76 65 20 61 6c  or might have al
d670: 72 65 61 64 79 20 62 65 65 6e 20 72 65 75 73 65  ready been reuse
d680: 64 20 62 79 20 61 6e 6f 74 68 65 72 20 74 68 72  d by another thr
d690: 65 61 64 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f  ead..** So we do
d6a0: 6e 27 74 20 65 76 65 6e 20 74 72 79 20 74 6f 20  n't even try to 
d6b0: 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20  recover from an 
d6c0: 45 49 4e 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67  EINTR.  Just log
d6d0: 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e   the error.** an
d6e0: 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74  d move on..*/.st
d6f0: 61 74 69 63 20 76 6f 69 64 20 72 6f 62 75 73 74  atic void robust
d700: 5f 63 6c 6f 73 65 28 75 6e 69 78 46 69 6c 65 20  _close(unixFile 
d710: 2a 70 46 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69  *pFile, int h, i
d720: 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66  nt lineno){.  if
d730: 28 20 6f 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a  ( osClose(h) ){.
d740: 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72      unixLogError
d750: 41 74 4c 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f  AtLine(SQLITE_IO
d760: 45 52 52 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73  ERR_CLOSE, "clos
d770: 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
d780: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
d790: 20 3f 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20   ? pFile->zPath 
d7a0: 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20  : 0, lineno);.  
d7b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
d7c0: 68 65 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  he pFile->lastEr
d7d0: 72 6e 6f 2e 20 20 44 6f 20 74 68 69 73 20 69 6e  rno.  Do this in
d7e0: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 61 73   a subroutine as
d7f0: 20 74 68 61 74 20 70 72 6f 76 69 64 65 73 0a 2a   that provides.*
d800: 2a 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70  * a convenient p
d810: 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72  lace to set a br
d820: 65 61 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  eakpoint..*/.sta
d830: 74 69 63 20 76 6f 69 64 20 73 74 6f 72 65 4c 61  tic void storeLa
d840: 73 74 45 72 72 6e 6f 28 75 6e 69 78 46 69 6c 65  stErrno(unixFile
d850: 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 65 72 72   *pFile, int err
d860: 6f 72 29 7b 0a 20 20 70 46 69 6c 65 2d 3e 6c 61  or){.  pFile->la
d870: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6f 72 3b  stErrno = error;
d880: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
d890: 61 6c 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  all file descrip
d8a0: 74 6f 72 73 20 61 63 63 75 6d 75 61 74 65 64 20  tors accumuated 
d8b0: 69 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  in the unixInode
d8c0: 49 6e 66 6f 2d 3e 70 55 6e 75 73 65 64 20 6c 69  Info->pUnused li
d8d0: 73 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  st..*/ .static v
d8e0: 6f 69 64 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67  oid closePending
d8f0: 46 64 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  Fds(unixFile *pF
d900: 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64  ile){.  unixInod
d910: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
d920: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
d930: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
d940: 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
d950: 20 2a 70 4e 65 78 74 3b 0a 20 20 61 73 73 65 72   *pNext;.  asser
d960: 74 28 20 75 6e 69 78 46 69 6c 65 4d 75 74 65 78  t( unixFileMutex
d970: 48 65 6c 64 28 70 46 69 6c 65 29 20 29 3b 0a 20  Held(pFile) );. 
d980: 20 66 6f 72 28 70 3d 70 49 6e 6f 64 65 2d 3e 70   for(p=pInode->p
d990: 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65  Unused; p; p=pNe
d9a0: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
d9b0: 20 70 2d 3e 70 4e 65 78 74 3b 0a 23 69 66 20 4f   p->pNext;.#if O
d9c0: 53 43 4c 4f 53 45 5f 43 48 45 43 4b 5f 43 4c 4f  SCLOSE_CHECK_CLO
d9d0: 53 45 5f 49 4f 45 52 52 0a 20 20 20 20 69 66 28  SE_IOERR.    if(
d9e0: 20 63 6c 6f 73 65 28 70 2d 3e 66 64 29 20 29 7b   close(p->fd) ){
d9f0: 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
da00: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
da10: 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  no);.      rc = 
da20: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
da30: 53 45 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65  SE;.      p->pNe
da40: 78 74 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20  xt = pError;.   
da50: 20 20 20 70 45 72 72 6f 72 20 3d 20 70 3b 0a 20     pError = p;. 
da60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
da70: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
da80: 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
da90: 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
daa0: 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c 49  ile, p->fd, __LI
dab0: 4e 45 5f 5f 29 3b 0a 20 20 20 20 73 71 6c 69 74  NE__);.    sqlit
dac0: 65 33 5f 66 72 65 65 28 70 29 3b 0a 23 65 6e 64  e3_free(p);.#end
dad0: 69 66 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d  if.  }.  pInode-
dae0: 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a  >pUnused = 0;.}.
daf0: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
db00: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73   unixInodeInfo s
db10: 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f 75  tructure previou
db20: 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  sly allocated by
db30: 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
db40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 67 6c 6f 62  ..**.** The glob
db50: 61 6c 20 6d 75 74 65 78 20 6d 75 73 74 20 62 65  al mutex must be
db60: 20 68 65 6c 64 20 77 68 65 6e 20 74 68 69 73 20   held when this 
db70: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
db80: 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65 78  d, but the mutex
db90: 0a 2a 2a 20 6f 6e 20 74 68 65 20 69 6e 6f 64 65  .** on the inode
dba0: 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 6d   being deleted m
dbb0: 75 73 74 20 4e 4f 54 20 62 65 20 68 65 6c 64 2e  ust NOT be held.
dbc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
dbd0: 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f  releaseInodeInfo
dbe0: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
dbf0: 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ){.  unixInodeIn
dc00: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
dc10: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
dc20: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
dc30: 65 6c 64 28 29 20 29 3b 0a 20 20 61 73 73 65 72  eld() );.  asser
dc40: 74 28 20 75 6e 69 78 46 69 6c 65 4d 75 74 65 78  t( unixFileMutex
dc50: 4e 6f 74 68 65 6c 64 28 70 46 69 6c 65 29 20 29  Notheld(pFile) )
dc60: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
dc70: 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20 20 70 49  Inode) ){.    pI
dc80: 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  node->nRef--;.  
dc90: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52    if( pInode->nR
dca0: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ef==0 ){.      a
dcb0: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
dcc0: 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20  ShmNode==0 );.  
dcd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
dce0: 78 5f 65 6e 74 65 72 28 70 49 6e 6f 64 65 2d 3e  x_enter(pInode->
dcf0: 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20 20  pLockMutex);.   
dd00: 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46     closePendingF
dd10: 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  ds(pFile);.     
dd20: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
dd30: 65 61 76 65 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f  eave(pInode->pLo
dd40: 63 6b 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ckMutex);.      
dd50: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65  if( pInode->pPre
dd60: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  v ){.        ass
dd70: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72  ert( pInode->pPr
dd80: 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f 64  ev->pNext==pInod
dd90: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  e );.        pIn
dda0: 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ode->pPrev->pNex
ddb0: 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  t = pInode->pNex
ddc0: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
ddd0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
dde0: 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e 6f 64  inodeList==pInod
ddf0: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 6f  e );.        ino
de00: 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 2d  deList = pInode-
de10: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
de20: 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65        if( pInode
de30: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
de40: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
de50: 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d  e->pNext->pPrev=
de60: 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20  =pInode );.     
de70: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74     pInode->pNext
de80: 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65  ->pPrev = pInode
de90: 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d  ->pPrev;.      }
dea0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
deb0: 75 74 65 78 5f 66 72 65 65 28 70 49 6e 6f 64 65  utex_free(pInode
dec0: 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20  ->pLockMutex);. 
ded0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
dee0: 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 7d  e(pInode);.    }
def0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  .  }.}../*.** Gi
df00: 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72  ven a file descr
df10: 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 74 68  iptor, locate th
df20: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
df30: 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 64  object that.** d
df40: 65 73 63 72 69 62 65 73 20 74 68 61 74 20 66 69  escribes that fi
df50: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
df60: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
df70: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20   if necessary.  
df80: 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  The.** return va
df90: 6c 75 65 20 6d 69 67 68 74 20 62 65 20 75 6e 69  lue might be uni
dfa0: 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20 61 6e  nitialized if an
dfb0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
dfc0: 2a 0a 2a 2a 20 54 68 65 20 67 6c 6f 62 61 6c 20  *.** The global 
dfd0: 6d 75 74 65 78 20 6d 75 73 74 20 68 65 6c 64 20  mutex must held 
dfe0: 77 68 65 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69  when calling thi
dff0: 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
e000: 20 52 65 74 75 72 6e 20 61 6e 20 61 70 70 72 6f   Return an appro
e010: 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
e020: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
e030: 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 0a   findInodeInfo(.
e040: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
e050: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
e060: 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20 77 69   /* Unix file wi
e070: 74 68 20 66 69 6c 65 20 64 65 73 63 20 75 73 65  th file desc use
e080: 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a  d in the key */.
e090: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
e0a0: 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20 20 20 20  **ppInode       
e0b0: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75   /* Return the u
e0c0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
e0d0: 65 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ect here */.){. 
e0e0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e100: 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c 20 72  /* System call r
e110: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
e120: 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e140: 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
e150: 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c 65 20  iptor for pFile 
e160: 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
e170: 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20  FileId fileId;  
e180: 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65      /* Lookup ke
e190: 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78 49 6e  y for the unixIn
e1a0: 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73 74 72  odeInfo */.  str
e1b0: 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66  uct stat statbuf
e1c0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
e1d0: 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e  ow-level file in
e1e0: 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 75  formation */.  u
e1f0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
e200: 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  node = 0;     /*
e210: 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69 78 49   Candidate unixI
e220: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
e230: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 75 6e  */..  assert( un
e240: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
e250: 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c  ..  /* Get low-l
e260: 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  evel information
e270: 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20   about the file 
e280: 74 68 61 74 20 77 65 20 63 61 6e 20 75 73 65 64  that we can used
e290: 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65 20   to.  ** create 
e2a0: 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f  a unique name fo
e2b0: 72 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  r the file..  */
e2c0: 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68  .  fd = pFile->h
e2d0: 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74  ;.  rc = osFstat
e2e0: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a  (fd, &statbuf);.
e2f0: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
e300: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
e310: 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
e320: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 45 4f 56  .#if defined(EOV
e330: 45 52 46 4c 4f 57 29 20 26 26 20 64 65 66 69 6e  ERFLOW) && defin
e340: 65 64 28 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ed(SQLITE_DISABL
e350: 45 5f 4c 46 53 29 0a 20 20 20 20 69 66 28 20 70  E_LFS).    if( p
e360: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d  File->lastErrno=
e370: 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72 65 74  =EOVERFLOW ) ret
e380: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53  urn SQLITE_NOLFS
e390: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
e3a0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
e3b0: 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f  ;.  }..#ifdef __
e3c0: 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20  APPLE__.  /* On 
e3d0: 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73  OS X on an msdos
e3e0: 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 74 68 65   filesystem, the
e3f0: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69 73   inode number is
e400: 20 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69   reported.  ** i
e410: 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 7a  ncorrectly for z
e420: 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20  ero-size files. 
e430: 20 53 65 65 20 74 69 63 6b 65 74 20 23 33 32 36   See ticket #326
e440: 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a  0.  To work.  **
e450: 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f   around this pro
e460: 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69 64 65  blem (we conside
e470: 72 20 69 74 20 61 20 62 75 67 20 69 6e 20 4f 53  r it a bug in OS
e480: 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a   X, not SQLite).
e490: 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73 20 69    ** we always i
e4a0: 6e 63 72 65 61 73 65 20 74 68 65 20 66 69 6c 65  ncrease the file
e4b0: 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20 77 72   size to 1 by wr
e4c0: 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62  iting a single b
e4d0: 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74  yte.  ** prior t
e4e0: 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  o accessing the 
e4f0: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 54  inode number.  T
e500: 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72 69 74  he one byte writ
e510: 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41  ten is.  ** an A
e520: 53 43 49 49 20 27 53 27 20 63 68 61 72 61 63 74  SCII 'S' charact
e530: 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20 68 61  er which also ha
e540: 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20  ppens to be the 
e550: 66 69 72 73 74 20 62 79 74 65 0a 20 20 2a 2a 20  first byte.  ** 
e560: 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  in the header of
e570: 20 65 76 65 72 79 20 53 51 4c 69 74 65 20 64 61   every SQLite da
e580: 74 61 62 61 73 65 2e 20 20 49 6e 20 74 68 69 73  tabase.  In this
e590: 20 77 61 79 2c 20 69 66 20 74 68 65 72 65 0a 20   way, if there. 
e5a0: 20 2a 2a 20 69 73 20 61 20 72 61 63 65 20 63 6f   ** is a race co
e5b0: 6e 64 69 74 69 6f 6e 20 73 75 63 68 20 74 68 61  ndition such tha
e5c0: 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
e5d0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 6f 70   has already pop
e5e0: 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68 65 20  ulated.  ** the 
e5f0: 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
e600: 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 20 64  e database, no d
e610: 61 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20  amage is done.. 
e620: 20 2a 2f 0a 20 20 69 66 28 20 73 74 61 74 62 75   */.  if( statbu
e630: 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20  f.st_size==0 && 
e640: 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20  (pFile->fsFlags 
e650: 26 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  & SQLITE_FSFLAGS
e660: 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b  _IS_MSDOS)!=0 ){
e670: 0a 20 20 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73  .    do{ rc = os
e680: 57 72 69 74 65 28 66 64 2c 20 22 53 22 2c 20 31  Write(fd, "S", 1
e690: 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  ); }while( rc<0 
e6a0: 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
e6b0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 31  );.    if( rc!=1
e6c0: 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
e6d0: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
e6e0: 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65  errno);.      re
e6f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
e700: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  R;.    }.    rc 
e710: 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73  = osFstat(fd, &s
e720: 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28  tatbuf);.    if(
e730: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
e740: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
e750: 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  File, errno);.  
e760: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e770: 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20  E_IOERR;.    }. 
e780: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d   }.#endif..  mem
e790: 73 65 74 28 26 66 69 6c 65 49 64 2c 20 30 2c 20  set(&fileId, 0, 
e7a0: 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b  sizeof(fileId));
e7b0: 0a 20 20 66 69 6c 65 49 64 2e 64 65 76 20 3d 20  .  fileId.dev = 
e7c0: 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a  statbuf.st_dev;.
e7d0: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
e7e0: 20 66 69 6c 65 49 64 2e 70 49 64 20 3d 20 70 46   fileId.pId = pF
e7f0: 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a  ile->pId;.#else.
e800: 20 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 28    fileId.ino = (
e810: 75 36 34 29 73 74 61 74 62 75 66 2e 73 74 5f 69  u64)statbuf.st_i
e820: 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  no;.#endif.  ass
e830: 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
e840: 6c 64 28 29 20 29 3b 0a 20 20 70 49 6e 6f 64 65  ld() );.  pInode
e850: 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20   = inodeList;.  
e860: 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26  while( pInode &&
e870: 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c   memcmp(&fileId,
e880: 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64   &pInode->fileId
e890: 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29  , sizeof(fileId)
e8a0: 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20  ) ){.    pInode 
e8b0: 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
e8c0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64  .  }.  if( pInod
e8d0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f  e==0 ){.    pIno
e8e0: 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  de = sqlite3_mal
e8f0: 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70  loc64( sizeof(*p
e900: 49 6e 6f 64 65 29 20 29 3b 0a 20 20 20 20 69 66  Inode) );.    if
e910: 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20  ( pInode==0 ){. 
e920: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e930: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
e940: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
e950: 70 49 6e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f  pInode, 0, sizeo
e960: 66 28 2a 70 49 6e 6f 64 65 29 29 3b 0a 20 20 20  f(*pInode));.   
e970: 20 6d 65 6d 63 70 79 28 26 70 49 6e 6f 64 65 2d   memcpy(&pInode-
e980: 3e 66 69 6c 65 49 64 2c 20 26 66 69 6c 65 49 64  >fileId, &fileId
e990: 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29  , sizeof(fileId)
e9a0: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
e9b0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
e9c0: 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20  CoreMutex ){.   
e9d0: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b     pInode->pLock
e9e0: 4d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  Mutex = sqlite3_
e9f0: 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
ea00: 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
ea10: 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65        if( pInode
ea20: 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 3d 3d 30 20  ->pLockMutex==0 
ea30: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
ea40: 65 33 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b  e3_free(pInode);
ea50: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
ea60: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
ea70: 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  T;.      }.    }
ea80: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65  .    pInode->nRe
ea90: 66 20 3d 20 31 3b 0a 20 20 20 20 61 73 73 65 72  f = 1;.    asser
eaa0: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
eab0: 28 29 20 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65  () );.    pInode
eac0: 2d 3e 70 4e 65 78 74 20 3d 20 69 6e 6f 64 65 4c  ->pNext = inodeL
ead0: 69 73 74 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  ist;.    pInode-
eae0: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
eaf0: 69 66 28 20 69 6e 6f 64 65 4c 69 73 74 20 29 20  if( inodeList ) 
eb00: 69 6e 6f 64 65 4c 69 73 74 2d 3e 70 50 72 65 76  inodeList->pPrev
eb10: 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69   = pInode;.    i
eb20: 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64  nodeList = pInod
eb30: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
eb40: 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a  pInode->nRef++;.
eb50: 20 20 7d 0a 20 20 2a 70 70 49 6e 6f 64 65 20 3d    }.  *ppInode =
eb60: 20 70 49 6e 6f 64 65 3b 0a 20 20 72 65 74 75 72   pInode;.  retur
eb70: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
eb80: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
eb90: 45 20 69 66 20 70 46 69 6c 65 20 68 61 73 20 62  E if pFile has b
eba0: 65 65 6e 20 72 65 6e 61 6d 65 64 20 6f 72 20 75  een renamed or u
ebb0: 6e 6c 69 6e 6b 65 64 20 73 69 6e 63 65 20 69 74  nlinked since it
ebc0: 20 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65   was first opene
ebd0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
ebe0: 20 66 69 6c 65 48 61 73 4d 6f 76 65 64 28 75 6e   fileHasMoved(un
ebf0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
ec00: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
ec10: 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70   return pFile->p
ec20: 49 6e 6f 64 65 21 3d 30 20 26 26 20 70 46 69 6c  Inode!=0 && pFil
ec30: 65 2d 3e 70 49 64 21 3d 70 46 69 6c 65 2d 3e 70  e->pId!=pFile->p
ec40: 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 70 49  Inode->fileId.pI
ec50: 64 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63  d;.#else.  struc
ec60: 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 72 65  t stat buf;.  re
ec70: 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  turn pFile->pIno
ec80: 64 65 21 3d 30 20 26 26 0a 20 20 20 20 20 20 28  de!=0 &&.      (
ec90: 6f 73 53 74 61 74 28 70 46 69 6c 65 2d 3e 7a 50  osStat(pFile->zP
eca0: 61 74 68 2c 20 26 62 75 66 29 21 3d 30 20 0a 20  ath, &buf)!=0 . 
ecb0: 20 20 20 20 20 20 20 20 7c 7c 20 28 75 36 34 29          || (u64)
ecc0: 62 75 66 2e 73 74 5f 69 6e 6f 21 3d 70 46 69 6c  buf.st_ino!=pFil
ecd0: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  e->pInode->fileI
ece0: 64 2e 69 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 7d  d.ino);.#endif.}
ecf0: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 61  .../*.** Check a
ed00: 20 75 6e 69 78 46 69 6c 65 20 74 68 61 74 20 69   unixFile that i
ed10: 73 20 61 20 64 61 74 61 62 61 73 65 2e 20 20 56  s a database.  V
ed20: 65 72 69 66 79 20 74 68 65 20 66 6f 6c 6c 6f 77  erify the follow
ed30: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 28 31 29 20 54  ing:.**.** (1) T
ed40: 68 65 72 65 20 69 73 20 65 78 61 63 74 6c 79 20  here is exactly 
ed50: 6f 6e 65 20 68 61 72 64 20 6c 69 6e 6b 20 6f 6e  one hard link on
ed60: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 28 32 29   the file.** (2)
ed70: 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   The file is not
ed80: 20 61 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b   a symbolic link
ed90: 0a 2a 2a 20 28 33 29 20 54 68 65 20 66 69 6c 65  .** (3) The file
eda0: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 72 65   has not been re
edb0: 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65  named or unlinke
edc0: 64 0a 2a 2a 0a 2a 2a 20 49 73 73 75 65 20 73 71  d.**.** Issue sq
edd0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
ede0: 5f 57 41 52 4e 49 4e 47 2c 2e 2e 2e 29 20 6d 65  _WARNING,...) me
edf0: 73 73 61 67 65 73 20 69 66 20 61 6e 79 74 68 69  ssages if anythi
ee00: 6e 67 20 69 73 20 6e 6f 74 20 72 69 67 68 74 2e  ng is not right.
ee10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ee20: 76 65 72 69 66 79 44 62 46 69 6c 65 28 75 6e 69  verifyDbFile(uni
ee30: 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
ee40: 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
ee50: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  ;.  int rc;..  /
ee60: 2a 20 54 68 65 73 65 20 76 65 72 69 66 69 63 61  * These verifica
ee70: 74 69 6f 6e 73 20 6f 63 63 75 72 73 20 66 6f 72  tions occurs for
ee80: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
ee90: 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 66 28  se only */.  if(
eea0: 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
eeb0: 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c  s & UNIXFILE_NOL
eec0: 4f 43 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  OCK ) return;.. 
eed0: 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 70 46   rc = osFstat(pF
eee0: 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20  ile->h, &buf);. 
eef0: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
ef00: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
ef10: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 63  LITE_WARNING, "c
ef20: 61 6e 6e 6f 74 20 66 73 74 61 74 20 64 62 20 66  annot fstat db f
ef30: 69 6c 65 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e  ile %s", pFile->
ef40: 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75  zPath);.    retu
ef50: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62 75  rn;.  }.  if( bu
ef60: 66 2e 73 74 5f 6e 6c 69 6e 6b 3d 3d 30 20 29 7b  f.st_nlink==0 ){
ef70: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
ef80: 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c  (SQLITE_WARNING,
ef90: 20 22 66 69 6c 65 20 75 6e 6c 69 6e 6b 65 64 20   "file unlinked 
efa0: 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73 22 2c  while open: %s",
efb0: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
efc0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
efd0: 20 20 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69    if( buf.st_nli
efe0: 6e 6b 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  nk>1 ){.    sqli
eff0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
f000: 41 52 4e 49 4e 47 2c 20 22 6d 75 6c 74 69 70 6c  ARNING, "multipl
f010: 65 20 6c 69 6e 6b 73 20 74 6f 20 66 69 6c 65 3a  e links to file:
f020: 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61   %s", pFile->zPa
f030: 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  th);.    return;
f040: 0a 20 20 7d 0a 20 20 69 66 28 20 66 69 6c 65 48  .  }.  if( fileH
f050: 61 73 4d 6f 76 65 64 28 70 46 69 6c 65 29 20 29  asMoved(pFile) )
f060: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
f070: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
f080: 2c 20 22 66 69 6c 65 20 72 65 6e 61 6d 65 64 20  , "file renamed 
f090: 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73 22 2c  while open: %s",
f0a0: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
f0b0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
f0c0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
f0d0: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
f0e0: 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
f0f0: 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
f100: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
f110: 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
f120: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
f130: 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
f140: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
f150: 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
f160: 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
f170: 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
f180: 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
f190: 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
f1a0: 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
f1b0: 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
f1c0: 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
f1d0: 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
f1e0: 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
f1f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
f200: 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
f210: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
f220: 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
f230: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
f240: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
f250: 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
f260: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
f270: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
f280: 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
f290: 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
f2a0: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
f2b0: 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a  SERVEDLOCK; );..
f2c0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
f2d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  );.  assert( pFi
f2e0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  le->eFileLock<=S
f2f0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
f300: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
f310: 74 65 72 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ter(pFile->pInod
f320: 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a  e->pLockMutex);.
f330: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
f340: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
f350: 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
f360: 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
f370: 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  f( pFile->pInode
f380: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
f390: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
f3a0: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
f3b0: 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65  ..  /* Otherwise
f3c0: 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
f3d0: 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
f3e0: 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65   it..  */.#ifnde
f3f0: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69 66  f __DJGPP__.  if
f400: 28 20 21 72 65 73 65 72 76 65 64 20 26 26 20 21  ( !reserved && !
f410: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pFile->pInode->b
f420: 50 72 6f 63 65 73 73 4c 6f 63 6b 20 29 7b 0a 20  ProcessLock ){. 
f430: 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20     struct flock 
f440: 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  lock;.    lock.l
f450: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
f460: 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ET;.    lock.l_s
f470: 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f  tart = RESERVED_
f480: 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
f490: 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f  _len = 1;.    lo
f4a0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
f4b0: 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 6f 73 46  LCK;.    if( osF
f4c0: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
f4d0: 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 20 29  _GETLK, &lock) )
f4e0: 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f  {.#if OSLOCKING_
f4f0: 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52  CHECK_BUSY_IOERR
f500: 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e  .      int tErrn
f510: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
f520: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
f530: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
f540: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
f550: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
f560: 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 73  EDLOCK);.      s
f570: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
f580: 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 23 65  ile, tErrno);.#e
f590: 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 53  lse.      rc = S
f5a0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
f5b0: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 0a 20  KRESERVEDLOCK;. 
f5c0: 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
f5d0: 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
f5e0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 20  );.#endif.    } 
f5f0: 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f  else if( lock.l_
f600: 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type!=F_UNLCK ){
f610: 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20  .      reserved 
f620: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = 1;.    }.  }.#
f630: 65 6e 64 69 66 0a 20 20 0a 20 20 73 71 6c 69 74  endif.  .  sqlit
f640: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
f650: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 4c  File->pInode->pL
f660: 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20 4f 53 54  ockMutex);.  OST
f670: 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
f680: 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 75 6e  OCK %d %d %d (un
f690: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
f6a0: 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
f6b0: 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  ;..  *pResOut = 
f6c0: 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
f6d0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
f6e0: 53 65 74 20 61 20 70 6f 73 69 78 2d 61 64 76 69  Set a posix-advi
f6f0: 73 6f 72 79 2d 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  sory-lock..**.**
f700: 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 76   There are two v
f710: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20  ersions of this 
f720: 72 6f 75 74 69 6e 65 2e 20 20 49 66 20 63 6f 6d  routine.  If com
f730: 70 69 6c 65 64 20 77 69 74 68 0a 2a 2a 20 53 51  piled with.** SQ
f740: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c  LITE_ENABLE_SETL
f750: 4b 5f 54 49 4d 45 4f 55 54 20 74 68 65 6e 20 74  K_TIMEOUT then t
f760: 68 65 20 72 6f 75 74 69 6e 65 20 68 61 73 20 61  he routine has a
f770: 6e 20 65 78 74 72 61 20 70 61 72 61 6d 65 74 65  n extra paramete
f780: 72 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61 20  r.** which is a 
f790: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 75 6e 69  pointer to a uni
f7a0: 78 46 69 6c 65 2e 20 20 49 66 20 74 68 65 20 75  xFile.  If the u
f7b0: 6e 69 78 46 69 6c 65 2d 3e 69 42 75 73 79 54 69  nixFile->iBusyTi
f7c0: 6d 65 6f 75 74 0a 2a 2a 20 76 61 6c 75 65 20 69  meout.** value i
f7d0: 73 20 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69  s set, then it i
f7e0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
f7f0: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 74 6f 20  milliseconds to 
f800: 77 61 69 74 20 62 65 66 6f 72 65 0a 2a 2a 20 66  wait before.** f
f810: 61 69 6c 69 6e 67 20 74 68 65 20 6c 6f 63 6b 2e  ailing the lock.
f820: 20 20 54 68 65 20 69 42 75 73 79 54 69 6d 65 6f    The iBusyTimeo
f830: 75 74 20 76 61 6c 75 65 20 69 73 20 61 6c 77 61  ut value is alwa
f840: 79 73 20 72 65 73 65 74 20 62 61 63 6b 20 74 6f  ys reset back to
f850: 0a 2a 2a 20 7a 65 72 6f 20 6f 6e 20 65 61 63 68  .** zero on each
f860: 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   call..**.** If 
f870: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
f880: 54 4c 4b 5f 54 49 4d 45 4f 55 54 20 69 73 20 6e  TLK_TIMEOUT is n
f890: 6f 74 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  ot defined, then
f8a0: 20 64 6f 20 61 20 6e 6f 6e 2d 62 6c 6f 63 6b 69   do a non-blocki
f8b0: 6e 67 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  ng.** attempt to
f8c0: 20 73 65 74 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a   set the lock..*
f8d0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
f8e0: 5f 45 4e 41 42 4c 45 5f 53 45 54 4c 4b 5f 54 49  _ENABLE_SETLK_TI
f8f0: 4d 45 4f 55 54 0a 23 20 64 65 66 69 6e 65 20 6f  MEOUT.# define o
f900: 73 53 65 74 50 6f 73 69 78 41 64 76 69 73 6f 72  sSetPosixAdvisor
f910: 79 4c 6f 63 6b 28 68 2c 78 2c 74 29 20 6f 73 46  yLock(h,x,t) osF
f920: 63 6e 74 6c 28 68 2c 46 5f 53 45 54 4c 4b 2c 78  cntl(h,F_SETLK,x
f930: 29 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 69  ).#else.static i
f940: 6e 74 20 6f 73 53 65 74 50 6f 73 69 78 41 64 76  nt osSetPosixAdv
f950: 69 73 6f 72 79 4c 6f 63 6b 28 0a 20 20 69 6e 74  isoryLock(.  int
f960: 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   h,             
f970: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
f980: 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 77 68 69  escriptor on whi
f990: 63 68 20 74 6f 20 74 61 6b 65 20 74 68 65 20 6c  ch to take the l
f9a0: 6f 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ock */.  struct 
f9b0: 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 2c 20 20 2f  flock *pLock,  /
f9c0: 2a 20 54 68 65 20 64 65 73 63 72 69 70 74 69 6f  * The descriptio
f9d0: 6e 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 2a 2f  n of the lock */
f9e0: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
f9f0: 6c 65 20 20 20 20 20 20 20 2f 2a 20 53 74 72 75  le       /* Stru
fa00: 63 74 75 72 65 20 68 6f 6c 64 69 6e 67 20 74 69  cture holding ti
fa10: 6d 65 6f 75 74 20 76 61 6c 75 65 20 2a 2f 0a 29  meout value */.)
fa20: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 6f 73 46  {.  int rc = osF
fa30: 63 6e 74 6c 28 68 2c 46 5f 53 45 54 4c 4b 2c 70  cntl(h,F_SETLK,p
fa40: 4c 6f 63 6b 29 3b 0a 20 20 77 68 69 6c 65 28 20  Lock);.  while( 
fa50: 72 63 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e 69  rc<0 && pFile->i
fa60: 42 75 73 79 54 69 6d 65 6f 75 74 3e 30 20 29 7b  BusyTimeout>0 ){
fa70: 0a 20 20 20 20 2f 2a 20 4f 6e 20 73 79 73 74 65  .    /* On syste
fa80: 6d 73 20 74 68 61 74 20 73 75 70 70 6f 72 74 20  ms that support 
fa90: 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 62 6c 6f  some kind of blo
faa0: 63 6b 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 20  cking file lock 
fab0: 77 69 74 68 20 61 20 74 69 6d 65 6f 75 74 2c 0a  with a timeout,.
fac0: 20 20 20 20 2a 2a 20 6d 61 6b 65 20 61 70 70 72      ** make appr
fad0: 6f 70 72 69 61 74 65 20 63 68 61 6e 67 65 73 20  opriate changes 
fae0: 68 65 72 65 20 74 6f 20 69 6e 76 6f 6b 65 20 74  here to invoke t
faf0: 68 61 74 20 62 6c 6f 63 6b 69 6e 67 20 66 69 6c  hat blocking fil
fb00: 65 20 6c 6f 63 6b 2e 20 20 4f 6e 0a 20 20 20 20  e lock.  On.    
fb10: 2a 2a 20 67 65 6e 65 72 69 63 20 70 6f 73 69 78  ** generic posix
fb20: 2c 20 68 6f 77 65 76 65 72 2c 20 74 68 65 72 65  , however, there
fb30: 20 69 73 20 6e 6f 20 73 75 63 68 20 41 50 49 2e   is no such API.
fb40: 20 20 53 6f 20 77 65 20 73 69 6d 70 6c 79 20 74    So we simply t
fb50: 72 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 6f  ry the.    ** lo
fb60: 63 6b 20 6f 6e 63 65 20 65 76 65 72 79 20 6d 69  ck once every mi
fb70: 6c 6c 69 73 65 63 6f 6e 64 20 75 6e 74 69 6c 20  llisecond until 
fb80: 65 69 74 68 65 72 20 74 68 65 20 74 69 6d 65 6f  either the timeo
fb90: 75 74 20 65 78 70 69 72 65 73 2c 20 6f 72 20 75  ut expires, or u
fba0: 6e 74 69 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20  ntil.    ** the 
fbb0: 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
fbc0: 2e 20 2a 2f 0a 20 20 20 20 75 73 6c 65 65 70 28  . */.    usleep(
fbd0: 31 30 30 30 29 3b 0a 20 20 20 20 72 63 20 3d 20  1000);.    rc = 
fbe0: 6f 73 46 63 6e 74 6c 28 68 2c 46 5f 53 45 54 4c  osFcntl(h,F_SETL
fbf0: 4b 2c 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 70 46  K,pLock);.    pF
fc00: 69 6c 65 2d 3e 69 42 75 73 79 54 69 6d 65 6f 75  ile->iBusyTimeou
fc10: 74 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t--;.  }.  retur
fc20: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
fc30: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
fc40: 53 45 54 4c 4b 5f 54 49 4d 45 4f 55 54 20 2a 2f  SETLK_TIMEOUT */
fc50: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  .../*.** Attempt
fc60: 20 74 6f 20 73 65 74 20 61 20 73 79 73 74 65 6d   to set a system
fc70: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c  -lock on the fil
fc80: 65 20 70 46 69 6c 65 2e 20 20 54 68 65 20 6c 6f  e pFile.  The lo
fc90: 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73 63 72 69  ck is .** descri
fca0: 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a  bed by pLock..**
fcb0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 46 69 6c 65  .** If the pFile
fcc0: 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64   was opened read
fcd0: 2f 77 72 69 74 65 20 66 72 6f 6d 20 75 6e 69 78  /write from unix
fce0: 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74 68 65 20  -excl, then the 
fcf0: 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65  only lock.** eve
fd00: 72 20 6f 62 74 61 69 6e 65 64 20 69 73 20 61 6e  r obtained is an
fd10: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c   exclusive lock,
fd20: 20 61 6e 64 20 69 74 20 69 73 20 6f 62 74 61 69   and it is obtai
fd30: 6e 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  ned exactly once
fd40: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 69  .** the first ti
fd50: 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61  me any lock is a
fd60: 74 74 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73  ttempted.  All s
fd70: 75 62 73 65 71 75 65 6e 74 20 73 79 73 74 65 6d  ubsequent system
fd80: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72   locking.** oper
fd90: 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f  ations become no
fda0: 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f  -ops.  Locking o
fdb0: 70 65 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20  perations still 
fdc0: 68 61 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c  happen internall
fdd0: 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  y,.** in order t
fde0: 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 61 63 63  o coordinate acc
fdf0: 65 73 73 20 62 65 74 77 65 65 6e 20 73 65 70 61  ess between sepa
fe00: 72 61 74 65 20 64 61 74 61 62 61 73 65 20 63 6f  rate database co
fe10: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74  nnections.** wit
fe20: 68 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73  hin this process
fe30: 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20 74 68 61  , but all of tha
fe40: 74 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20  t is handled in 
fe50: 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a  memory and the.*
fe60: 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
fe70: 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70 61 72 74  em does not part
fe80: 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54  icipate..**.** T
fe90: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
fea0: 61 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 74  a pass-through t
feb0: 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 29  o fcntl(F_SETLK)
fec0: 20 69 66 20 70 46 69 6c 65 20 69 73 20 75 73 69   if pFile is usi
fed0: 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f 74  ng.** any VFS ot
fee0: 68 65 72 20 74 68 61 6e 20 22 75 6e 69 78 2d 65  her than "unix-e
fef0: 78 63 6c 22 20 6f 72 20 69 66 20 70 46 69 6c 65  xcl" or if pFile
ff00: 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22 75   is opened on "u
ff10: 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e 64  nix-excl".** and
ff20: 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a   is read-only..*
ff30: 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74  *.** Zero is ret
ff40: 75 72 6e 65 64 20 69 66 20 74 68 65 20 63 61 6c  urned if the cal
ff50: 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63  l completes succ
ff60: 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31 20  essfully, or -1 
ff70: 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20  if a call.** to 
ff80: 66 63 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20 49  fcntl() fails. I
ff90: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 65 72 72  n this case, err
ffa0: 6e 6f 20 69 73 20 73 65 74 20 61 70 70 72 6f 70  no is set approp
ffb0: 72 69 61 74 65 6c 79 20 28 62 79 20 66 63 6e 74  riately (by fcnt
ffc0: 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  l())..*/.static 
ffd0: 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  int unixFileLock
ffe0: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
fff0: 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a  , struct flock *
10000 70 4c 6f 63 6b 2c 20 69 6e 74 20 6e 52 65 74 72  pLock, int nRetr
10010 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  y){.  int rc;.  
10020 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
10030 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
10040 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
10050 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20   pInode!=0 );.  
10060 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
10070 6d 75 74 65 78 5f 68 65 6c 64 28 70 49 6e 6f 64  mutex_held(pInod
10080 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 20 29  e->pLockMutex) )
10090 3b 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e  ;.  if( (pFile->
100a0 63 74 72 6c 46 6c 61 67 73 20 26 20 28 55 4e 49  ctrlFlags & (UNI
100b0 58 46 49 4c 45 5f 45 58 43 4c 7c 55 4e 49 58 46  XFILE_EXCL|UNIXF
100c0 49 4c 45 5f 52 44 4f 4e 4c 59 29 29 3d 3d 55 4e  ILE_RDONLY))==UN
100d0 49 58 46 49 4c 45 5f 45 58 43 4c 20 29 7b 0a 20  IXFILE_EXCL ){. 
100e0 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62     if( pInode->b
100f0 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
10100 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 66  {.      struct f
10110 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20  lock lock;.     
10120 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
10130 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  >nLock==0 );.   
10140 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
10150 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
10160 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
10170 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
10180 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
10190 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
101a0 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
101b0 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20  e = F_WRLCK;.   
101c0 20 20 20 72 63 20 3d 20 6f 73 53 65 74 50 6f 73     rc = osSetPos
101d0 69 78 41 64 76 69 73 6f 72 79 4c 6f 63 6b 28 70  ixAdvisoryLock(p
101e0 46 69 6c 65 2d 3e 68 2c 20 26 6c 6f 63 6b 2c 20  File->h, &lock, 
101f0 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66  pFile);.      if
10200 28 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20  ( rc<0 ) return 
10210 72 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  rc;.      pInode
10220 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 3d  ->bProcessLock =
10230 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65   1;.      pInode
10240 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d  ->nLock++;.    }
10250 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
10260 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   0;.    }.  }els
10270 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 53 65  e{.    rc = osSe
10280 74 50 6f 73 69 78 41 64 76 69 73 6f 72 79 4c 6f  tPosixAdvisoryLo
10290 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 70 4c 6f  ck(pFile->h, pLo
102a0 63 6b 2c 20 70 46 69 6c 65 29 3b 0a 20 20 7d 0a  ck, pFile);.  }.
102b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
102c0 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
102d0 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
102e0 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
102f0 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
10300 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
10310 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
10320 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
10330 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
10340 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
10350 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
10360 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
10370 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
10380 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
10390 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
103a0 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
103b0 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
103c0 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
103d0 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
103e0 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
103f0 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
10400 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
10410 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
10420 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
10430 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
10440 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
10450 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
10460 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
10470 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
10480 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
10490 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
104a0 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
104b0 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
104c0 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
104d0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
104e0 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
104f0 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
10500 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
10510 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
10520 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
10530 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
10540 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
10550 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
10560 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
10570 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
10580 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
10590 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
105a0 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
105b0 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
105c0 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
105d0 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
105e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
105f0 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  nixLock(sqlite3_
10600 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
10610 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54  ileLock){.  /* T
10620 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73  he following des
10630 63 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65  cribes the imple
10640 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
10650 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61   various locks a
10660 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61  nd.  ** lock tra
10670 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d  nsitions in term
10680 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61  s of the POSIX a
10690 64 76 69 73 6f 72 79 20 73 68 61 72 65 64 20 61  dvisory shared a
106a0 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a  nd exclusive.  *
106b0 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65  * lock primitive
106c0 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c  s (called read-l
106d0 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c  ocks and write-l
106e0 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61  ocks below, to a
106f0 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73  void.  ** confus
10700 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20  ion with SQLite 
10710 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65  lock names). The
10720 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20   algorithms are 
10730 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a  complicated.  **
10740 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64   slightly in ord
10750 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69  er to be compati
10760 62 6c 65 20 77 69 74 68 20 57 69 6e 64 6f 77 73  ble with Windows
10770 39 35 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c  95 systems simul
10780 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61  taneously.  ** a
10790 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d  ccessing the sam
107a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
107b0 20 69 6e 20 63 61 73 65 20 74 68 61 74 20 69 73   in case that is
107c0 20 65 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a   ever required..
107d0 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c    **.  ** Symbol
107e0 73 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e  s defined in os.
107f0 68 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20  h indentify the 
10800 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61  'pending byte' a
10810 6e 64 20 74 68 65 20 27 72 65 73 65 72 76 65 64  nd the 'reserved
10820 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63  .  ** byte', eac
10830 68 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61  h single bytes a
10840 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66  t well known off
10850 73 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73  sets, and the 's
10860 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
10870 72 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20  range', a range 
10880 6f 66 20 35 31 30 20 62 79 74 65 73 20 61 74 20  of 510 bytes at 
10890 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66  a well known off
108a0 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  set..  **.  ** T
108b0 6f 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45  o obtain a SHARE
108c0 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c  D lock, a read-l
108d0 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
108e0 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a  on the 'pending.
108f0 20 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20    ** byte'.  If 
10900 74 68 69 73 20 69 73 20 73 75 63 63 65 73 73 66  this is successf
10910 75 6c 2c 20 27 73 68 61 72 65 64 20 62 79 74 65  ul, 'shared byte
10920 20 72 61 6e 67 65 27 20 69 73 20 72 65 61 64 2d   range' is read-
10930 6c 6f 63 6b 65 64 0a 20 20 2a 2a 20 61 6e 64 20  locked.  ** and 
10940 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
10950 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72  'pending byte' r
10960 65 6c 65 61 73 65 64 2e 20 20 28 4c 65 67 61 63  eleased.  (Legac
10970 79 20 6e 6f 74 65 3a 20 20 57 68 65 6e 0a 20 20  y note:  When.  
10980 2a 2a 20 53 51 4c 69 74 65 20 77 61 73 20 66 69  ** SQLite was fi
10990 72 73 74 20 64 65 76 65 6c 6f 70 65 64 2c 20 57  rst developed, W
109a0 69 6e 64 6f 77 73 39 35 20 73 79 73 74 65 6d 73  indows95 systems
109b0 20 77 65 72 65 20 73 74 69 6c 6c 20 76 65 72 79   were still very
109c0 20 63 6f 6d 6d 6f 6e 2c 0a 20 20 2a 2a 20 61 6e   common,.  ** an
109d0 64 20 57 69 64 6e 6f 77 73 39 35 20 6c 61 63 6b  d Widnows95 lack
109e0 73 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  s a shared-lock 
109f0 63 61 70 61 62 69 6c 69 74 79 2e 20 20 53 6f 20  capability.  So 
10a00 6f 6e 20 57 69 6e 64 6f 77 73 39 35 2c 20 61 0a  on Windows95, a.
10a10 20 20 2a 2a 20 73 69 6e 67 6c 65 20 72 61 6e 64    ** single rand
10a20 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 20 62 79  omly selected by
10a30 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65   from the 'share
10a40 64 20 62 79 74 65 20 72 61 6e 67 65 27 20 69 73  d byte range' is
10a50 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2a 20 57 69   locked..  ** Wi
10a60 6e 64 6f 77 73 39 35 20 69 73 20 6e 6f 77 20 70  ndows95 is now p
10a70 72 65 74 74 79 20 6d 75 63 68 20 65 78 74 69 6e  retty much extin
10a80 63 74 2c 20 62 75 74 20 74 68 69 73 20 77 6f 72  ct, but this wor
10a90 6b 2d 61 72 6f 75 6e 64 20 66 6f 72 20 74 68 65  k-around for the
10aa0 0a 20 20 2a 2a 20 6c 61 63 6b 20 6f 66 20 73 68  .  ** lack of sh
10ab0 61 72 65 64 2d 6c 6f 63 6b 73 20 6f 6e 20 57 69  ared-locks on Wi
10ac0 6e 64 6f 77 73 39 35 20 6c 69 76 65 73 20 6f 6e  ndows95 lives on
10ad0 2c 20 66 6f 72 20 62 61 63 6b 77 61 72 64 73 0a  , for backwards.
10ae0 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62 69 6c 69    ** compatibili
10af0 74 79 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ty.).  **.  ** A
10b00 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c   process may onl
10b10 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52  y obtain a RESER
10b20 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72 20 69  VED lock after i
10b30 74 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6c  t has a SHARED l
10b40 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45  ock..  ** A RESE
10b50 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70  RVED lock is imp
10b60 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72 61 62  lemented by grab
10b70 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  bing a write-loc
10b80 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72  k on the.  ** 'r
10b90 65 73 65 72 76 65 64 20 62 79 74 65 27 2e 20 0a  eserved byte'. .
10ba0 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63    **.  ** A proc
10bb0 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74  ess may only obt
10bc0 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ain a PENDING lo
10bd0 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20  ck after it has 
10be0 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20  obtained a.  ** 
10bf0 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50  SHARED lock. A P
10c00 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69  ENDING lock is i
10c10 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62  mplemented by ob
10c20 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d  taining a write-
10c30 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lock.  ** on the
10c40 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e   'pending byte'.
10c50 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
10c60 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44  at no new SHARED
10c70 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20 20   locks can be.  
10c80 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 74  ** obtained, but
10c90 20 65 78 69 73 74 69 6e 67 20 53 48 41 52 45 44   existing SHARED
10ca0 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77   locks are allow
10cb0 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e 20 41  ed to persist. A
10cc0 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f   process.  ** do
10cd0 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f  es not have to o
10ce0 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44  btain a RESERVED
10cf0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61 79   lock on the way
10d00 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f   to a PENDING lo
10d10 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72  ck..  ** This pr
10d20 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20 62  operty is used b
10d30 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20  y the algorithm 
10d40 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  for rolling back
10d50 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a   a journal file.
10d60 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63 72 61    ** after a cra
10d70 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  sh..  **.  ** An
10d80 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
10d90 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65 72 20   obtained after 
10da0 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  a PENDING lock i
10db0 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20  s held, is.  ** 
10dc0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f  implemented by o
10dd0 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65  btaining a write
10de0 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74  -lock on the ent
10df0 69 72 65 20 27 73 68 61 72 65 64 20 62 79 74 65  ire 'shared byte
10e00 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69  .  ** range'. Si
10e10 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f  nce all other lo
10e20 63 6b 73 20 72 65 71 75 69 72 65 20 61 20 72 65  cks require a re
10e30 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f  ad-lock on one o
10e40 66 20 74 68 65 20 62 79 74 65 73 0a 20 20 2a 2a  f the bytes.  **
10e50 20 77 69 74 68 69 6e 20 74 68 69 73 20 72 61 6e   within this ran
10e60 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73  ge, this ensures
10e70 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c   that no other l
10e80 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e  ocks are held on
10e90 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
10ea0 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  se. .  */.  int 
10eb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10ec0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
10ed0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
10ee0 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
10ef0 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74  fo *pInode;.  st
10f00 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
10f10 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20  .  int tErrno = 
10f20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  0;..  assert( pF
10f30 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
10f40 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
10f50 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70   was %s(%s,%d) p
10f60 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c  id=%d (unix)\n",
10f70 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
10f80 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
10f90 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f  eLock), azFileLo
10fa0 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  ck(pFile->eFileL
10fb0 6f 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a 46 69  ock),.      azFi
10fc0 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 70 49  leLock(pFile->pI
10fd0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  node->eFileLock)
10fe0 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
10ff0 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20  >nShared,.      
11000 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a  osGetpid(0)));..
11010 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
11020 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
11030 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20  of this type or 
11040 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65  more restrictive
11050 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69   on the.  ** uni
11060 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e  xFile, do nothin
11070 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65  g. Don't use the
11080 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20   end_lock: exit 
11090 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e  path, as.  ** un
110a0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  ixEnterMutex() h
110b0 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
110c0 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
110d0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
110e0 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck>=eFileLock ){
110f0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c  .    OSTRACE(("L
11100 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20  OCK    %d %s ok 
11110 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28  (already held) (
11120 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
11130 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  >h,.            
11140 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
11150 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74  Lock)));.    ret
11160 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11170 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
11180 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73  re the locking s
11190 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65  equence is corre
111a0 63 74 2e 0a 20 20 2a 2a 20 20 28 31 29 20 57 65  ct..  **  (1) We
111b0 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d   never move from
111c0 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79   unlocked to any
111d0 74 68 69 6e 67 20 68 69 67 68 65 72 20 74 68 61  thing higher tha
111e0 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20  n shared lock.. 
111f0 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20   **  (2) SQLite 
11200 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79  never explicitly
11210 20 72 65 71 75 65 73 74 73 20 61 20 70 65 6e 64   requests a pend
11220 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28  ig lock..  **  (
11230 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b  3) A shared lock
11240 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20   is always held 
11250 77 68 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c  when a reserve l
11260 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
11270 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
11280 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11290 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46  k!=NO_LOCK || eF
112a0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
112b0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
112c0 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e  ( eFileLock!=PEN
112d0 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
112e0 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
112f0 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  !=RESERVED_LOCK 
11300 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  || pFile->eFileL
11310 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
11320 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d   );..  /* This m
11330 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62  utex is needed b
11340 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
11350 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
11360 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20  cross threads.  
11370 2a 2f 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  */.  pInode = pF
11380 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73  ile->pInode;.  s
11390 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
113a0 65 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b  er(pInode->pLock
113b0 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66  Mutex);..  /* If
113c0 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
113d0 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20  ng this PID has 
113e0 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66  a lock via a dif
113f0 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a  ferent unixFile*
11400 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61  .  ** handle tha
11410 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20  t precludes the 
11420 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20  requested lock, 
11430 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a  return BUSY..  *
11440 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e  /.  if( (pFile->
11450 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64  eFileLock!=pInod
11460 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20  e->eFileLock && 
11470 0a 20 20 20 20 20 20 20 20 20 20 28 70 49 6e 6f  .          (pIno
11480 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50  de->eFileLock>=P
11490 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65  ENDING_LOCK || e
114a0 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
114b0 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20  LOCK)).  ){.    
114c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
114d0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c  ;.    goto end_l
114e0 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ock;.  }..  /* I
114f0 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  f a SHARED lock 
11500 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  is requested, an
11510 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73  d some thread us
11520 69 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72  ing this PID alr
11530 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20  eady.  ** has a 
11540 53 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56  SHARED or RESERV
11550 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e  ED lock, then in
11560 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  crement referenc
11570 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a  e counts and.  *
11580 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
11590 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  OK..  */.  if( e
115a0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
115b0 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20  _LOCK && .      
115c0 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
115d0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
115e0 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  || pInode->eFile
115f0 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
11600 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65  OCK) ){.    asse
11610 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  rt( eFileLock==S
11620 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
11630 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
11640 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b  >eFileLock==0 );
11650 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
11660 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29  ode->nShared>0 )
11670 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  ;.    pFile->eFi
11680 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
11690 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  LOCK;.    pInode
116a0 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20  ->nShared++;.   
116b0 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
116c0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c  ;.    goto end_l
116d0 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  ock;.  }...  /* 
116e0 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
116f0 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20  s needed before 
11700 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52  acquiring a SHAR
11710 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f  ED lock and befo
11720 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e  re.  ** acquirin
11730 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  g an EXCLUSIVE l
11740 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48  ock.  For the SH
11750 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50  ARED lock, the P
11760 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a  ENDING will.  **
11770 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20   be released..  
11780 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  */.  lock.l_len 
11790 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77  = 1L;.  lock.l_w
117a0 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
117b0 3b 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  ;.  if( eFileLoc
117c0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a  k==SHARED_LOCK .
117d0 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c        || (eFileL
117e0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
117f0 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  OCK && pFile->eF
11800 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f  ileLock<PENDING_
11810 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c  LOCK).  ){.    l
11820 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46  ock.l_type = (eF
11830 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
11840 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57  LOCK?F_RDLCK:F_W
11850 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e  RLCK);.    lock.
11860 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
11870 47 5f 42 59 54 45 3b 0a 20 20 20 20 69 66 28 20  G_BYTE;.    if( 
11880 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
11890 6c 65 2c 20 26 6c 6f 63 6b 2c 20 30 29 20 29 7b  le, &lock, 0) ){
118a0 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
118b0 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
118c0 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
118d0 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
118e0 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
118f0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
11900 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
11910 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rc) ){.        s
11920 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
11930 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
11940 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
11950 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d   end_lock;.    }
11960 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63  .  }...  /* If c
11970 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74  ontrol gets to t
11980 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
11990 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61  actually go ahea
119a0 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20  d and make.  ** 
119b0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
119c0 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73   calls for the s
119d0 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20  pecified lock.. 
119e0 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
119f0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
11a00 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
11a10 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
11a20 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
11a30 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
11a40 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ock==0 );.    as
11a50 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
11a60 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e  _OK );..    /* N
11a70 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d  ow get the read-
11a80 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b  lock */.    lock
11a90 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
11aa0 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63  D_FIRST;.    loc
11ab0 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
11ac0 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20 75  _SIZE;.    if( u
11ad0 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
11ae0 65 2c 20 26 6c 6f 63 6b 2c 20 30 29 20 29 7b 0a  e, &lock, 0) ){.
11af0 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
11b00 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
11b10 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
11b20 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
11b30 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
11b40 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  LOCK);.    }..  
11b50 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65    /* Drop the te
11b60 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20  mporary PENDING 
11b70 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b  lock */.    lock
11b80 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49  .l_start = PENDI
11b90 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63  NG_BYTE;.    loc
11ba0 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20  k.l_len = 1L;.  
11bb0 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
11bc0 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28  F_UNLCK;.    if(
11bd0 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
11be0 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 20  ile, &lock, 10) 
11bf0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
11c00 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
11c10 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 77  s could happen w
11c20 69 74 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f  ith a network mo
11c30 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74 45 72  unt */.      tEr
11c40 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66  rno = errno;.#if
11c50 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b   OSLOCKING_CHECK
11c60 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20  _BUSY_IOERR.    
11c70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
11c80 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
11c90 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
11ca0 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a  IOERR_UNLOCK); .
11cb0 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d  #else.      rc =
11cc0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
11cd0 4c 4f 43 4b 3b 20 0a 23 65 6e 64 69 66 0a 20 20  LOCK; .#endif.  
11ce0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 20    }..    if( rc 
11cf0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f  ){.      if( IS_
11d00 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
11d10 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c  {.        storeL
11d20 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
11d30 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  tErrno);.      }
11d40 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
11d50 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  lock;.    }else{
11d60 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  .      pFile->eF
11d70 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
11d80 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e  _LOCK;.      pIn
11d90 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
11da0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
11db0 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  red = 1;.    }. 
11dc0 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65   }else if( eFile
11dd0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
11de0 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e  LOCK && pInode->
11df0 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20  nShared>1 ){.   
11e00 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e   /* We are tryin
11e10 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  g for an exclusi
11e20 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74  ve lock but anot
11e30 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68  her thread in th
11e40 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70  is.    ** same p
11e50 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
11e60 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64  holding a shared
11e70 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63   lock. */.    rc
11e80 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
11e90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
11ea0 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20  The request was 
11eb0 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  for a RESERVED o
11ec0 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
11ed0 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20  .  It is.    ** 
11ee0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
11ef0 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f  re is a SHARED o
11f00 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
11f10 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  n the file.    *
11f20 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  * already..    *
11f30 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21  /.    assert( 0!
11f40 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
11f50 6b 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  k );.    lock.l_
11f60 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a  type = F_WRLCK;.
11f70 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69  .    assert( eFi
11f80 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
11f90 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
11fa0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
11fb0 43 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 65 46  CK );.    if( eF
11fc0 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ileLock==RESERVE
11fd0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  D_LOCK ){.      
11fe0 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52  lock.l_start = R
11ff0 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20  ESERVED_BYTE;.  
12000 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
12010 20 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   1L;.    }else{.
12020 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
12030 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
12040 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
12050 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
12060 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  E;.    }..    if
12070 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
12080 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 30 29 20  File, &lock, 0) 
12090 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
120a0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
120b0 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
120c0 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
120d0 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
120e0 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
120f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  if( rc!=SQLITE_B
12100 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73  USY ){.        s
12110 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
12120 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
12130 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
12140 20 20 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54    ..#ifdef SQLIT
12150 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 53 65 74  E_DEBUG.  /* Set
12160 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74   up the transact
12170 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e  ion-counter chan
12180 67 65 20 63 68 65 63 6b 69 6e 67 20 66 6c 61 67  ge checking flag
12190 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e  s when.  ** tran
121a0 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61  sitioning from a
121b0 20 53 48 41 52 45 44 20 74 6f 20 61 20 52 45 53   SHARED to a RES
121c0 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65  ERVED lock.  The
121d0 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f   change.  ** fro
121e0 6d 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45  m SHARED to RESE
121f0 52 56 45 44 20 6d 61 72 6b 73 20 74 68 65 20 62  RVED marks the b
12200 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f  eginning of a no
12210 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20  rmal.  ** write 
12220 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61  operation (not a
12230 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot journal rol
12240 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69  lback)..  */.  i
12250 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12260 0a 20 20 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  .   && pFile->eF
12270 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
12280 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46 69 6c 65  LOCK.   && eFile
12290 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
122a0 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46 69  OCK.  ){.    pFi
122b0 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
122c0 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  g = 0;.    pFile
122d0 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a  ->dbUpdate = 0;.
122e0 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72      pFile->inNor
122f0 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20 20  malWrite = 1;.  
12300 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28  }.#endif...  if(
12310 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12320 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
12330 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
12340 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ck;.    pInode->
12350 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
12360 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69  eLock;.  }else i
12370 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
12380 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
12390 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
123a0 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
123b0 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
123c0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
123d0 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a  DING_LOCK;.  }..
123e0 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 73 71 6c 69  end_lock:.  sqli
123f0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
12400 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74  pInode->pLockMut
12410 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ex);.  OSTRACE((
12420 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
12430 73 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  s (unix)\n", pFi
12440 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63  le->h, azFileLoc
12450 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20  k(eFileLock), . 
12460 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
12470 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
12480 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  led"));.  return
12490 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
124a0 64 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  d the file descr
124b0 69 70 74 6f 72 20 75 73 65 64 20 62 79 20 66 69  iptor used by fi
124c0 6c 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65 20  le handle pFile 
124d0 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  to the correspon
124e0 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20  ding.** pUnused 
124f0 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
12500 76 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67 46  void setPendingF
12510 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  d(unixFile *pFil
12520 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e){.  unixInodeI
12530 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
12540 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55  ile->pInode;.  U
12550 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 20 3d  nixUnusedFd *p =
12560 20 70 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f   pFile->pPreallo
12570 63 61 74 65 64 55 6e 75 73 65 64 3b 0a 20 20 61  catedUnused;.  a
12580 73 73 65 72 74 28 20 75 6e 69 78 46 69 6c 65 4d  ssert( unixFileM
12590 75 74 65 78 48 65 6c 64 28 70 46 69 6c 65 29 20  utexHeld(pFile) 
125a0 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  );.  p->pNext = 
125b0 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b  pInode->pUnused;
125c0 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  .  pInode->pUnus
125d0 65 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d  ed = p;.  pFile-
125e0 3e 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65  >h = -1;.  pFile
125f0 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55  ->pPreallocatedU
12600 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  nused = 0;.}../*
12610 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
12620 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
12630 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
12640 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
12650 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
12660 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
12670 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
12680 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
12690 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
126a0 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
126b0 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
126c0 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
126d0 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
126e0 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
126f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
12700 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a   a no-op..** .**
12710 20 49 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c   If handleNFSUnl
12720 6f 63 6b 20 69 73 20 74 72 75 65 2c 20 74 68 65  ock is true, the
12730 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67  n on downgrading
12740 20 61 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   an EXCLUSIVE_LO
12750 43 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20  CK to SHARED.** 
12760 74 68 65 20 62 79 74 65 20 72 61 6e 67 65 20 69  the byte range i
12770 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 32  s divided into 2
12780 20 70 61 72 74 73 20 61 6e 64 20 74 68 65 20 66   parts and the f
12790 69 72 73 74 20 70 61 72 74 20 69 73 20 75 6e 6c  irst part is unl
127a0 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65  ocked then.** se
127b0 74 20 74 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b  t to a read lock
127c0 2c 20 74 68 65 6e 20 74 68 65 20 6f 74 68 65 72  , then the other
127d0 20 70 61 72 74 20 69 73 20 73 69 6d 70 6c 79 20   part is simply 
127e0 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73 20  unlocked.  This 
127f0 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64  works .** around
12800 20 61 20 62 75 67 20 69 6e 20 42 53 44 20 4e 46   a bug in BSD NF
12810 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65  S lockd (also se
12820 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e  en on MacOSX 10.
12830 33 2b 29 20 74 68 61 74 20 66 61 69 6c 73 20 74  3+) that fails t
12840 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65  o .** remove the
12850 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61   write lock on a
12860 20 72 65 67 69 6f 6e 20 77 68 65 6e 20 61 20 72   region when a r
12870 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e  ead lock is set.
12880 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
12890 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  osixUnlock(sqlit
128a0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
128b0 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20   eFileLock, int 
128c0 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29  handleNFSUnlock)
128d0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
128e0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
128f0 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  )id;.  unixInode
12900 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20  Info *pInode;.  
12910 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
12920 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  k;.  int rc = SQ
12930 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
12940 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
12950 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
12960 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64   %d %d was %d(%d
12970 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69  ,%d) pid=%d (uni
12980 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
12990 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20   eFileLock,.    
129a0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
129b0 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ck, pFile->pInod
129c0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46  e->eFileLock, pF
129d0 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68  ile->pInode->nSh
129e0 61 72 65 64 2c 0a 20 20 20 20 20 20 6f 73 47 65  ared,.      osGe
129f0 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 61 73  tpid(0)));..  as
12a00 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
12a10 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
12a20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
12a30 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63  leLock<=eFileLoc
12a40 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
12a50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
12a60 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d   pInode = pFile-
12a70 3e 70 49 6e 6f 64 65 3b 0a 20 20 73 71 6c 69 74  >pInode;.  sqlit
12a80 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
12a90 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65  Inode->pLockMute
12aa0 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  x);.  assert( pI
12ab0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30  node->nShared!=0
12ac0 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
12ad0 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
12ae0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
12af0 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46  sert( pInode->eF
12b00 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e  ileLock==pFile->
12b10 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23 69  eFileLock );..#i
12b20 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
12b30 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65  G.    /* When re
12b40 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75  ducing a lock su
12b50 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72  ch that other pr
12b60 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72  ocesses can star
12b70 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  t.    ** reading
12b80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12b90 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73  le again, make s
12ba0 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ure that the.   
12bb0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
12bc0 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
12bd0 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20  ted if any part 
12be0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
12bf0 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e      ** file chan
12c00 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
12c10 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
12c20 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c   is not updated,
12c30 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f  .    ** other co
12c40 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65  nnections to the
12c50 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74   same file might
12c60 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61   not realize tha
12c70 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c  t.    ** the fil
12c80 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e  e has changed an
12c90 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f  d hence might no
12ca0 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20  t know to flush 
12cb0 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63  their.    ** cac
12cc0 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  he.  The use of 
12cd0 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61  a stale cache ca
12ce0 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
12cf0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
12d00 20 20 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d     */.    pFile-
12d10 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d  >inNormalWrite =
12d20 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   0;.#endif..    
12d30 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 74  /* downgrading t
12d40 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  o a shared lock 
12d50 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76 65 73 20  on NFS involves 
12d60 63 6c 65 61 72 69 6e 67 20 74 68 65 20 77 72 69  clearing the wri
12d70 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 62  te lock.    ** b
12d80 65 66 6f 72 65 20 65 73 74 61 62 6c 69 73 68 69  efore establishi
12d90 6e 67 20 74 68 65 20 72 65 61 64 6c 6f 63 6b 20  ng the readlock 
12da0 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 72 61 63  - to avoid a rac
12db0 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77 65 20 64  e condition we d
12dc0 6f 77 6e 67 72 61 64 65 0a 20 20 20 20 2a 2a 20  owngrade.    ** 
12dd0 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32 20 62 6c  the lock in 2 bl
12de0 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74 20 70 61  ocks, so that pa
12df0 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20  rt of the range 
12e00 77 69 6c 6c 20 62 65 20 63 6f 76 65 72 65 64 20  will be covered 
12e10 62 79 20 61 20 0a 20 20 20 20 2a 2a 20 77 72 69  by a .    ** wri
12e20 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68  te lock until th
12e30 65 20 72 65 73 74 20 69 73 20 63 6f 76 65 72 65  e rest is covere
12e40 64 20 62 79 20 61 20 72 65 61 64 20 6c 6f 63 6b  d by a read lock
12e50 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20 20 20 5b  :.    **  1:   [
12e60 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a 20 20 32  WWWWW].    **  2
12e70 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20  :   [....W].    
12e80 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52 52 57 5d  **  3:   [RRRRW]
12e90 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20 20 5b 52  .    **  4:   [R
12ea0 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20 20  RRR.].    */.   
12eb0 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
12ec0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 23  SHARED_LOCK ){.#
12ed0 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 41 50  if !defined(__AP
12ee0 50 4c 45 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54  PLE__) || !SQLIT
12ef0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
12f00 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 28 76 6f  _STYLE.      (vo
12f10 69 64 29 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  id)handleNFSUnlo
12f20 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ck;.      assert
12f30 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  ( handleNFSUnloc
12f40 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23  k==0 );.#endif.#
12f50 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
12f60 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
12f70 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
12f80 54 59 4c 45 0a 20 20 20 20 20 20 69 66 28 20 68  TYLE.      if( h
12f90 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29  andleNFSUnlock )
12fa0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45  {.        int tE
12fb0 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
12fc0 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
12fd0 65 20 66 72 6f 6d 20 73 79 73 74 65 6d 20 63 61  e from system ca
12fe0 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20  ll errors */.   
12ff0 20 20 20 20 20 6f 66 66 5f 74 20 64 69 76 53 69       off_t divSi
13000 7a 65 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  ze = SHARED_SIZE
13010 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20   - 1;.        . 
13020 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79         lock.l_ty
13030 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
13040 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
13050 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
13060 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
13070 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
13080 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
13090 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a  k.l_len = divSiz
130a0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  e;.        if( u
130b0 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
130c0 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d 28  e, &lock, 10)==(
130d0 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
130e0 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
130f0 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43  .#if OSLOCKING_C
13100 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a  HECK_BUSY_IOERR.
13110 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
13120 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
13130 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
13140 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
13150 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65 0a 20 20 20  LOCK);.#else.   
13160 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
13170 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
13180 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
13190 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
131a0 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
131b0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
131c0 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
131d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f      }.        lo
131e0 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  ck.l_type = F_RD
131f0 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  LCK;.        loc
13200 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
13210 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c  K_SET;.        l
13220 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
13230 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
13240 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
13250 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20   divSize;.      
13260 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
13270 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c  ck(pFile, &lock,
13280 20 31 30 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20   10)==(-1) ){.  
13290 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d          tErrno =
132a0 20 65 72 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f   errno;.#if OSLO
132b0 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59  CKING_CHECK_BUSY
132c0 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20  _IOERR.         
132d0 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
132e0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
132f0 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
13300 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 23 65  OERR_RDLOCK);.#e
13310 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 72 63  lse.          rc
13320 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
13330 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a 20  UNLOCK;.#endif. 
13340 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f           if( IS_
13350 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
13360 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  {.            st
13370 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
13380 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
13390 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
133a0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
133b0 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
133c0 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
133d0 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
133e0 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
133f0 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
13400 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
13410 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
13420 53 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20 20 20  ST+divSize;.    
13430 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
13440 20 53 48 41 52 45 44 5f 53 49 5a 45 2d 64 69 76   SHARED_SIZE-div
13450 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
13460 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
13470 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29  File, &lock, 10)
13480 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
13490 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
134a0 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e  no;.#if OSLOCKIN
134b0 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45  G_CHECK_BUSY_IOE
134c0 52 52 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  RR.          rc 
134d0 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
134e0 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
134f0 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
13500 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65 0a  _UNLOCK);.#else.
13510 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
13520 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
13530 43 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  CK;.#endif.     
13540 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
13550 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
13560 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c            storeL
13570 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
13580 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20  tErrno);.       
13590 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
135a0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
135b0 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
135c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
135d0 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
135e0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23   }.      }else.#
135f0 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
13600 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
13610 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
13620 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20  KING_STYLE */.  
13630 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f      {.        lo
13640 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  ck.l_type = F_RD
13650 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  LCK;.        loc
13660 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
13670 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c  K_SET;.        l
13680 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
13690 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
136a0 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
136b0 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
136c0 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69        if( unixFi
136d0 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
136e0 6f 63 6b 2c 20 31 30 29 20 29 7b 0a 20 20 20 20  ock, 10) ){.    
136f0 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
13700 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 20 4f 53   = errno;.#if OS
13710 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55  LOCKING_CHECK_BU
13720 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20  SY_IOERR.       
13730 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
13740 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
13750 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
13760 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a  _IOERR_RDLOCK);.
13770 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20  #else.          
13780 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68  /* In theory, th
13790 65 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69  e call to unixFi
137a0 6c 65 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20  leLock() cannot 
137b0 66 61 69 6c 20 62 65 63 61 75 73 65 20 61 6e 6f  fail because ano
137c0 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  ther.          *
137d0 2a 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  * process is hol
137e0 64 69 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74  ding an incompat
137f0 69 62 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74  ible lock. If it
13800 20 64 6f 65 73 2c 20 74 68 69 73 20 0a 20 20 20   does, this .   
13810 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 61         ** indica
13820 74 65 73 20 74 68 61 74 20 74 68 65 20 6f 74 68  tes that the oth
13830 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
13840 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  t following the 
13850 6c 6f 63 6b 69 6e 67 0a 20 20 20 20 20 20 20 20  locking.        
13860 20 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49    ** protocol. I
13870 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20  f this happens, 
13880 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
13890 45 52 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75  ERR_RDLOCK. Retu
138a0 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  rning.          
138b0 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  ** SQLITE_BUSY w
138c0 6f 75 6c 64 20 63 6f 6e 66 75 73 65 20 74 68 65  ould confuse the
138d0 20 75 70 70 65 72 20 6c 61 79 65 72 20 28 69 6e   upper layer (in
138e0 20 70 72 61 63 74 69 63 65 20 69 74 20 63 61 75   practice it cau
138f0 73 65 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ses .          *
13900 2a 20 61 6e 20 61 73 73 65 72 74 20 74 6f 20 66  * an assert to f
13910 61 69 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20  ail). */ .      
13920 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13930 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20  IOERR_RDLOCK;.  
13940 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
13950 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
13960 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rrno);.#endif.  
13970 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
13980 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
13990 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 6f  .            sto
139a0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
139b0 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
139c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
139d0 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
139e0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
139f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c     }.    }.    l
13a00 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
13a10 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  NLCK;.    lock.l
13a20 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
13a30 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ET;.    lock.l_s
13a40 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
13a50 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
13a60 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72  len = 2L;  asser
13a70 74 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t( PENDING_BYTE+
13a80 31 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45  1==RESERVED_BYTE
13a90 20 29 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78   );.    if( unix
13aa0 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
13ab0 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d 30 20 29 7b  &lock, 10)==0 ){
13ac0 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  .      pInode->e
13ad0 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
13ae0 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  D_LOCK;.    }els
13af0 65 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47  e{.#if OSLOCKING
13b00 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52  _CHECK_BUSY_IOER
13b10 52 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  R.      tErrno =
13b20 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
13b30 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
13b40 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
13b50 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
13b60 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_UNLOCK);.     
13b70 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
13b80 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
13b90 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
13ba0 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
13bb0 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  .      }.#else. 
13bc0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13bd0 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
13be0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
13bf0 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
13c00 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
13c10 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
13c20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
13c30 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c   eFileLock==NO_L
13c40 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65  OCK ){.    /* De
13c50 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72  crement the shar
13c60 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e  ed lock counter.
13c70 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f    Release the lo
13c80 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20  ck using an.    
13c90 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20  ** OS call only 
13ca0 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73  when all threads
13cb0 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72   in this same pr
13cc0 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61  ocess have relea
13cd0 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  sed.    ** the l
13ce0 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ock..    */.    
13cf0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d  pInode->nShared-
13d00 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  -;.    if( pInod
13d10 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b  e->nShared==0 ){
13d20 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  .      lock.l_ty
13d30 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
13d40 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
13d50 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
13d60 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
13d70 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20   = lock.l_len = 
13d80 30 4c 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e  0L;.      if( un
13d90 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
13da0 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d 30 20  , &lock, 10)==0 
13db0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  ){.        pInod
13dc0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
13dd0 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65  O_LOCK;.      }e
13de0 6c 73 65 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49  lse{.#if OSLOCKI
13df0 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f  NG_CHECK_BUSY_IO
13e00 45 52 52 0a 20 20 20 20 20 20 20 20 74 45 72 72  ERR.        tErr
13e10 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
13e20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
13e30 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
13e40 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
13e50 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
13e60 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f  .        if( IS_
13e70 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
13e80 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72  {.          stor
13e90 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
13ea0 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
13eb0 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20     }.#else.     
13ec0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
13ed0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  OERR_UNLOCK;.   
13ee0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
13ef0 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
13f00 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
13f10 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
13f20 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
13f30 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
13f40 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
13f50 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
13f60 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
13f70 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20  nt the count of 
13f80 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68  locks against th
13f90 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57  is same file.  W
13fa0 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  hen the.    ** c
13fb0 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
13fc0 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68  o, close any oth
13fd0 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
13fe0 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a  ors whose close.
13ff0 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72      ** was defer
14000 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f  red because of o
14010 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
14020 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
14030 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20  ode->nLock--;.  
14040 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
14050 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20  ->nLock>=0 );.  
14060 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c    if( pInode->nL
14070 6f 63 6b 3d 3d 30 20 29 20 63 6c 6f 73 65 50 65  ock==0 ) closePe
14080 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b  ndingFds(pFile);
14090 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63 6b  .  }..end_unlock
140a0 3a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  :.  sqlite3_mute
140b0 78 5f 6c 65 61 76 65 28 70 49 6e 6f 64 65 2d 3e  x_leave(pInode->
140c0 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20 69  pLockMutex);.  i
140d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
140e0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
140f0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
14100 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Lock;.  }.  retu
14110 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14120 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
14130 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
14140 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
14150 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
14160 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
14170 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
14180 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
14190 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
141a0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
141b0 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
141c0 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
141d0 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
141e0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
141f0 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
14200 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
14210 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
14220 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73  int unixUnlock(s
14230 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
14240 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
14250 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
14260 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 61 73  MMAP_SIZE>0.  as
14270 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
14280 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
14290 28 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 29  ((unixFile *)id)
142a0 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29  ->nFetchOut==0 )
142b0 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
142c0 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64  n posixUnlock(id
142d0 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b  , eFileLock, 0);
142e0 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .}..#if SQLITE_M
142f0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73  AX_MMAP_SIZE>0.s
14300 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 61  tatic int unixMa
14310 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  pfile(unixFile *
14320 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65 29 3b  pFd, i64 nByte);
14330 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
14340 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78 46  xUnmapfile(unixF
14350 69 6c 65 20 2a 70 46 64 29 3b 0a 23 65 6e 64 69  ile *pFd);.#endi
14360 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
14370 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20  nction performs 
14380 74 68 65 20 70 61 72 74 73 20 6f 66 20 74 68 65  the parts of the
14390 20 22 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70   "close file" op
143a0 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d  eration .** comm
143b0 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e  on to all lockin
143c0 67 20 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c  g schemes. It cl
143d0 6f 73 65 73 20 74 68 65 20 64 69 72 65 63 74 6f  oses the directo
143e0 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68  ry and file.** h
143f0 61 6e 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20  andles, if they 
14400 61 72 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73  are valid, and s
14410 65 74 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f  ets all fields o
14420 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a  f the unixFile.*
14430 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 30  * structure to 0
14440 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e  ..**.** It is *n
14450 6f 74 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f  ot* necessary to
14460 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 20   hold the mutex 
14470 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
14480 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20  e is called,.** 
14490 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  even on VxWorks.
144a0 20 20 41 20 6d 75 74 65 78 20 77 69 6c 6c 20 62    A mutex will b
144b0 65 20 61 63 71 75 69 72 65 64 20 6f 6e 20 56 78  e acquired on Vx
144c0 57 6f 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20  Works by the.** 
144d0 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69  vxworksReleaseFi
144e0 6c 65 49 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a  leId() routine..
144f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
14500 6f 73 65 55 6e 69 78 46 69 6c 65 28 73 71 6c 69  oseUnixFile(sqli
14510 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
14520 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
14530 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
14540 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
14550 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75  _MMAP_SIZE>0.  u
14560 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 69  nixUnmapfile(pFi
14570 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  le);.#endif.  if
14580 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b  ( pFile->h>=0 ){
14590 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73  .    robust_clos
145a0 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  e(pFile, pFile->
145b0 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
145c0 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b    pFile->h = -1;
145d0 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f  .  }.#if OS_VXWO
145e0 52 4b 53 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  RKS.  if( pFile-
145f0 3e 70 49 64 20 29 7b 0a 20 20 20 20 69 66 28 20  >pId ){.    if( 
14600 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
14610 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45   & UNIXFILE_DELE
14620 54 45 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e  TE ){.      osUn
14630 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d  link(pFile->pId-
14640 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29  >zCanonicalName)
14650 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 78 77 6f  ;.    }.    vxwo
14660 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64  rksReleaseFileId
14670 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20  (pFile->pId);.  
14680 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30    pFile->pId = 0
14690 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ;.  }.#endif.#if
146a0 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 4c 49 4e  def SQLITE_UNLIN
146b0 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45 0a 20 20  K_AFTER_CLOSE.  
146c0 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46  if( pFile->ctrlF
146d0 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
146e0 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6f 73  DELETE ){.    os
146f0 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 7a 50  Unlink(pFile->zP
14700 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ath);.    sqlite
14710 33 5f 66 72 65 65 28 2a 28 63 68 61 72 2a 2a 29  3_free(*(char**)
14720 26 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a  &pFile->zPath);.
14730 20 20 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68      pFile->zPath
14740 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
14750 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f  .  OSTRACE(("CLO
14760 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46  SE   %-3d\n", pF
14770 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e  ile->h));.  Open
14780 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73  Counter(-1);.  s
14790 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
147a0 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64  e->pPreallocated
147b0 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73 65  Unused);.  memse
147c0 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65  t(pFile, 0, size
147d0 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20  of(unixFile));. 
147e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
147f0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  K;.}../*.** Clos
14800 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  e a file..*/.sta
14810 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73  tic int unixClos
14820 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
14830 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  id){.  int rc = 
14840 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
14850 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
14860 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20  unixFile *)id;. 
14870 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
14880 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
14890 70 49 6e 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72  pInode;..  asser
148a0 74 28 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a  t( pInode!=0 );.
148b0 20 20 76 65 72 69 66 79 44 62 46 69 6c 65 28 70    verifyDbFile(p
148c0 46 69 6c 65 29 3b 0a 20 20 75 6e 69 78 55 6e 6c  File);.  unixUnl
148d0 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
148e0 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ;.  assert( unix
148f0 46 69 6c 65 4d 75 74 65 78 4e 6f 74 68 65 6c 64  FileMutexNotheld
14900 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 75 6e 69  (pFile) );.  uni
14910 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a  xEnterMutex();..
14920 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49    /* unixFile.pI
14930 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 76  node is always v
14940 61 6c 69 64 20 68 65 72 65 2e 20 4f 74 68 65 72  alid here. Other
14950 77 69 73 65 2c 20 61 20 64 69 66 66 65 72 65 6e  wise, a differen
14960 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f 75  t close.  ** rou
14970 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63  tine (e.g. noloc
14980 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75 6c 64 20  kClose()) would 
14990 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61  be called instea
149a0 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
149b0 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  ( pFile->pInode-
149c0 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c  >nLock>0 || pFil
149d0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  e->pInode->bProc
149e0 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  essLock==0 );.  
149f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
14a00 74 65 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63  ter(pInode->pLoc
14a10 6b 4d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 70  kMutex);.  if( p
14a20 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a  Inode->nLock ){.
14a30 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
14a40 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
14a50 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63  locks, do not ac
14a60 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65  tually close the
14a70 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a   file just.    *
14a80 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68  * yet because th
14a90 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74  at would clear t
14aa0 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73  hose locks.  Ins
14ab0 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69  tead, add the fi
14ac0 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72 69  le.    ** descri
14ad0 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e  ptor to pInode->
14ae0 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20 49  pUnused list.  I
14af0 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  t will be automa
14b00 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a  tically closed .
14b10 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20      ** when the 
14b20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65  last lock is cle
14b30 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ared..    */.   
14b40 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46   setPendingFd(pF
14b50 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ile);.  }.  sqli
14b60 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
14b70 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74  pInode->pLockMut
14b80 65 78 29 3b 0a 20 20 72 65 6c 65 61 73 65 49 6e  ex);.  releaseIn
14b90 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a  odeInfo(pFile);.
14ba0 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78    rc = closeUnix
14bb0 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69 78  File(id);.  unix
14bc0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
14bd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
14be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
14bf0 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61  d of the posix a
14c00 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70  dvisory lock imp
14c10 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
14c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
14c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
14c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
14cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f  ************* No
14cf0 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  -op Locking ****
14d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
14d20 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69  *.** Of the vari
14d30 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ous locking impl
14d40 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69  ementations avai
14d50 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62  lable, this is b
14d60 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d  y far the.** sim
14d70 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20  plest:  locking 
14d80 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20  is ignored.  No 
14d90 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
14da0 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61  to lock the data
14db0 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72  base.** file for
14dc0 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
14dd0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
14de0 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20  locking mode is 
14df0 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
14e00 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  use on read-only
14e10 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65   databases.** (e
14e20 78 3a 20 64 61 74 61 62 61 73 65 73 20 74 68 61  x: databases tha
14e30 74 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74  t are burned int
14e40 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78  o CD-ROM, for ex
14e50 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a  ample.)  It can.
14e60 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20  ** also be used 
14e70 69 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  if the applicati
14e80 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20  on employs some 
14e90 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69  external mechani
14ea0 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74  sm to.** prevent
14eb0 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63   simultaneous ac
14ec0 63 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65  cess of the same
14ed0 20 64 61 74 61 62 61 73 65 20 62 79 20 74 77 6f   database by two
14ee0 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61   or more.** data
14ef0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
14f00 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20  .  But there is 
14f10 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f  a serious risk o
14f20 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  f database.** co
14f30 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73  rruption if this
14f40 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73   locking mode is
14f50 20 75 73 65 64 20 69 6e 20 73 69 74 75 61 74 69   used in situati
14f60 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70  ons where multip
14f70 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  le.** database c
14f80 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61  onnections are a
14f90 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d  ccessing the sam
14fa0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14fb0 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74  at the same.** t
14fc0 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d  ime and one or m
14fd0 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  ore of those con
14fe0 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69  nections are wri
14ff0 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63  ting..*/..static
15000 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b   int nolockCheck
15010 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
15020 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
15030 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  ed, int *pResOut
15040 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
15050 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
15060 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a    *pResOut = 0;.
15070 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15080 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
15090 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69   nolockLock(sqli
150a0 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
150b0 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29  d, int NotUsed2)
150c0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
150d0 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
150e0 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
150f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
15100 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
15110 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
15120 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69  file *NotUsed, i
15130 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  nt NotUsed2){.  
15140 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
15150 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
15160 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ed2);.  return S
15170 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
15180 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c  ** Close the fil
15190 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
151a0 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c   nolockClose(sql
151b0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
151c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
151d0 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
151e0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
151f0 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 75 6e 69  File *)id;.  uni
15200 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
15210 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f   if( pFile->pIno
15220 64 65 20 29 7b 20 20 0a 20 20 20 20 61 73 73 65  de ){  .    asse
15230 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  rt( pFile->pInod
15240 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46  e->nLock>0 || pF
15250 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  ile->pInode->bPr
15260 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  ocessLock==0 );.
15270 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70      if( pFile->p
15280 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a  Inode->nLock ){.
15290 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
152a0 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
152b0 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20  g locks, do not 
152c0 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74  actually close t
152d0 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20  he file just.   
152e0 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73     ** yet becaus
152f0 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65  e that would cle
15300 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20  ar those locks. 
15310 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68   Instead, add th
15320 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
15330 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49  descriptor to pI
15340 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 6c 69  node->pUnused li
15350 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  st.  It will be 
15360 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c  automatically cl
15370 6f 73 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 77  osed .      ** w
15380 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63  hen the last loc
15390 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20  k is cleared..  
153a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 65 74      */.      set
153b0 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29  PendingFd(pFile)
153c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65  ;.    }.    rele
153d0 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69  aseInodeInfo(pFi
153e0 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  le);.  }.  rc = 
153f0 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
15400 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  );.  unixLeaveMu
15410 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
15420 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  rc;.}../********
15430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
15440 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63  of the no-op loc
15450 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
15460 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
15470 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
15480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154c0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
154d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15510 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
15520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15530 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65  * Begin dot-file
15540 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
15550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15560 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
15570 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  e dotfile lockin
15580 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
15590 20 75 73 65 73 20 74 68 65 20 65 78 69 73 74 65   uses the existe
155a0 6e 63 65 20 6f 66 20 73 65 70 61 72 61 74 65 20  nce of separate 
155b0 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 28 72  lock.** files (r
155c0 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72  eally a director
155d0 79 29 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63  y) to control ac
155e0 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61  cess to the data
155f0 62 61 73 65 2e 20 20 54 68 69 73 20 77 6f 72 6b  base.  This work
15600 73 0a 2a 2a 20 6f 6e 20 6a 75 73 74 20 61 62 6f  s.** on just abo
15610 75 74 20 65 76 65 72 79 20 66 69 6c 65 73 79 73  ut every filesys
15620 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20  tem imaginable. 
15630 20 42 75 74 20 74 68 65 72 65 20 61 72 65 20 73   But there are s
15640 65 72 69 6f 75 73 20 64 6f 77 6e 73 69 64 65 73  erious downsides
15650 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
15660 54 68 65 72 65 20 69 73 20 7a 65 72 6f 20 63 6f  There is zero co
15670 6e 63 75 72 72 65 6e 63 79 2e 20 20 41 20 73 69  ncurrency.  A si
15680 6e 67 6c 65 20 72 65 61 64 65 72 20 62 6c 6f 63  ngle reader bloc
15690 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20  ks all other.** 
156a0 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69          connecti
156b0 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64 69 6e 67  ons from reading
156c0 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
156d0 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
156e0 20 20 20 28 32 29 20 20 41 6e 20 61 70 70 6c 69     (2)  An appli
156f0 63 61 74 69 6f 6e 20 63 72 61 73 68 20 6f 72 20  cation crash or 
15700 70 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c  power loss can l
15710 65 61 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20  eave stale lock 
15720 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  files.**        
15730 20 73 69 74 74 69 6e 67 20 61 72 6f 75 6e 64 20   sitting around 
15740 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
15750 63 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79  cleared manually
15760 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65  ..**.** Neverthe
15770 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20  less, a dotlock 
15780 69 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  is an appropriat
15790 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66  e locking mode f
157a0 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20  or use if no.** 
157b0 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74  other locking st
157c0 72 61 74 65 67 79 20 69 73 20 61 76 61 69 6c 61  rategy is availa
157d0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69  ble..**.** Dotfi
157e0 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73  le locking works
157f0 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20 73   by creating a s
15800 75 62 64 69 72 65 63 74 6f 72 79 20 69 6e 20 74  ubdirectory in t
15810 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
15820 79 20 61 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  y as.** the data
15830 62 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68  base and with th
15840 65 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20  e same name but 
15850 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65  with a ".lock" e
15860 78 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a  xtension added..
15870 2a 2a 20 54 68 65 20 65 78 69 73 74 65 6e 63 65  ** The existence
15880 20 6f 66 20 61 20 6c 6f 63 6b 20 64 69 72 65 63   of a lock direc
15890 74 6f 72 79 20 69 6d 70 6c 69 65 73 20 61 6e 20  tory implies an 
158a0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
158b0 20 41 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 6c 6f   All other.** lo
158c0 63 6b 20 74 79 70 65 73 20 28 53 48 41 52 45 44  ck types (SHARED
158d0 2c 20 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44  , RESERVED, PEND
158e0 49 4e 47 29 20 61 72 65 20 6d 61 70 70 65 64 20  ING) are mapped 
158f0 69 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a  into EXCLUSIVE..
15900 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  */../*.** The fi
15910 6c 65 20 73 75 66 66 69 78 20 61 64 64 65 64 20  le suffix added 
15920 74 6f 20 74 68 65 20 64 61 74 61 20 62 61 73 65  to the data base
15930 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64   filename in ord
15940 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  er to create the
15950 0a 2a 2a 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f  .** lock directo
15960 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44  ry..*/.#define D
15970 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e  OTLOCK_SUFFIX ".
15980 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  lock"../*.** Thi
15990 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
159a0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
159b0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
159c0 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
159d0 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
159e0 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
159f0 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
15a00 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
15a10 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
15a20 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
15a30 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
15a40 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
15a50 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
15a60 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
15a70 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
15a80 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
15a90 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
15aa0 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
15ab0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69  ..**.** In dotfi
15ac0 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68  le locking, eith
15ad0 65 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73  er a lock exists
15ae0 20 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   or it does not.
15af0 20 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20    So in this.** 
15b00 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65  variation of Che
15b10 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29  ckReservedLock()
15b20 2c 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  , *pResOut is se
15b30 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79  t to true if any
15b40 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64   lock.** is held
15b50 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   on the file and
15b60 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 66 69   false if the fi
15b70 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a  le is unlocked..
15b80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
15b90 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  tlockCheckReserv
15ba0 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
15bb0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
15bc0 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72  esOut) {.  int r
15bd0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
15be0 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
15bf0 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
15c00 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
15c10 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
15c20 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
15c30 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
15c40 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
15c50 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
15c60 20 70 46 69 6c 65 20 29 3b 0a 20 20 72 65 73 65   pFile );.  rese
15c70 72 76 65 64 20 3d 20 6f 73 41 63 63 65 73 73 28  rved = osAccess(
15c80 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 46 69  (const char*)pFi
15c90 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
15ca0 78 74 2c 20 30 29 3d 3d 30 3b 0a 20 20 4f 53 54  xt, 0)==0;.  OST
15cb0 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
15cc0 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 64 6f  OCK %d %d %d (do
15cd0 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  tlock)\n", pFile
15ce0 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
15cf0 64 29 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20  d));.  *pResOut 
15d00 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
15d10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15d20 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
15d30 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
15d40 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
15d50 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d  eter eFileLock -
15d60 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
15d70 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
15d80 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
15d90 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
15da0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
15db0 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
15dc0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
15dd0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
15de0 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
15df0 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
15e00 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
15e10 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
15e20 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
15e30 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
15e40 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
15e50 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
15e60 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
15e70 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
15e80 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
15e90 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
15ea0 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
15eb0 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
15ec0 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
15ed0 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
15ee0 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
15ef0 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
15f00 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
15f10 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
15f20 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
15f30 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
15f40 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
15f50 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
15f60 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
15f70 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
15f80 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
15f90 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
15fa0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
15fb0 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
15fc0 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
15fd0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15fe0 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
15ff0 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
16000 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
16010 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
16020 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
16030 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2a 0a  cking level..**.
16040 2a 2a 20 57 69 74 68 20 64 6f 74 66 69 6c 65 20  ** With dotfile 
16050 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72 65 61 6c  locking, we real
16060 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20  ly only support 
16070 73 74 61 74 65 20 28 34 29 3a 20 45 58 43 4c 55  state (4): EXCLU
16080 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20 77 65 20  SIVE..** But we 
16090 74 72 61 63 6b 20 74 68 65 20 6f 74 68 65 72 20  track the other 
160a0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 69  locking levels i
160b0 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74  nternally..*/.st
160c0 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
160d0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
160e0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
160f0 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
16100 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
16110 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61  xFile*)id;.  cha
16120 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28  r *zLockFile = (
16130 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  char *)pFile->lo
16140 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
16150 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16160 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65  OK;...  /* If we
16170 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20   have any lock, 
16180 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69  then the lock fi
16190 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
161a0 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76 65 0a  s.  All we have.
161b0 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61 64    ** to do is ad
161c0 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72 6e 61  just our interna
161d0 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20  l record of the 
161e0 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f  lock level..  */
161f0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
16200 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43  ileLock > NO_LOC
16210 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
16220 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
16230 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c  eLock;.    /* Al
16240 77 61 79 73 20 75 70 64 61 74 65 20 74 68 65 20  ways update the 
16250 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65  timestamp on the
16260 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 23 69 66   old file */.#if
16270 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45 0a 20  def HAVE_UTIME. 
16280 20 20 20 75 74 69 6d 65 28 7a 4c 6f 63 6b 46 69     utime(zLockFi
16290 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65  le, NULL);.#else
162a0 0a 20 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63  .    utimes(zLoc
162b0 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65  kFile, NULL);.#e
162c0 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
162d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
162e0 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65   .  /* grab an e
162f0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f  xclusive lock */
16300 0a 20 20 72 63 20 3d 20 6f 73 4d 6b 64 69 72 28  .  rc = osMkdir(
16310 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 37 37 37 29  zLockFile, 0777)
16320 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a  ;.  if( rc<0 ){.
16330 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f      /* failed to
16340 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65   open/create the
16350 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20   lock directory 
16360 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e  */.    int tErrn
16370 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69  o = errno;.    i
16380 66 28 20 45 45 58 49 53 54 20 3d 3d 20 74 45 72  f( EEXIST == tEr
16390 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20  rno ){.      rc 
163a0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
163b0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
163c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
163d0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
163e0 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
163f0 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
16400 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16410 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
16420 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
16430 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
16440 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16450 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16460 7d 20 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69  } .  .  /* got i
16470 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
16480 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
16490 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
164a0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
164b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
164c0 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
164d0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
164e0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
164f0 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
16500 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
16510 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
16520 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
16530 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
16540 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
16550 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
16560 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
16570 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
16580 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
16590 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
165a0 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
165b0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
165c0 2a 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f 63 6b  ** When the lock
165d0 69 6e 67 20 6c 65 76 65 6c 20 72 65 61 63 68 65  ing level reache
165e0 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74  s NO_LOCK, delet
165f0 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 2e  e the lock file.
16600 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
16610 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c  otlockUnlock(sql
16620 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
16630 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
16640 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
16650 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
16660 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  d;.  char *zLock
16670 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70  File = (char *)p
16680 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
16690 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  text;.  int rc;.
166a0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
166b0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
166c0 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
166d0 73 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f 74  s %d pid=%d (dot
166e0 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
166f0 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
16700 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
16710 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65  >eFileLock, osGe
16720 74 70 69 64 28 30 29 29 29 3b 0a 20 20 61 73 73  tpid(0)));.  ass
16730 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
16740 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
16750 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
16760 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
16770 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
16780 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck==eFileLock ){
16790 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
167a0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
167b0 20 54 6f 20 64 6f 77 6e 67 72 61 64 65 20 74 6f   To downgrade to
167c0 20 73 68 61 72 65 64 2c 20 73 69 6d 70 6c 79 20   shared, simply 
167d0 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72  update our inter
167e0 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68  nal notion of th
167f0 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74  e.  ** lock stat
16800 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d  e.  No need to m
16810 65 73 73 20 77 69 74 68 20 74 68 65 20 66 69 6c  ess with the fil
16820 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  e on disk..  */.
16830 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
16840 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
16850 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
16860 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
16870 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  CK;.    return S
16880 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
16890 0a 20 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75  .  /* To fully u
168a0 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
168b0 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c  se, delete the l
168c0 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73  ock file */.  as
168d0 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
168e0 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72 63  =NO_LOCK );.  rc
168f0 20 3d 20 6f 73 52 6d 64 69 72 28 7a 4c 6f 63 6b   = osRmdir(zLock
16900 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3c  File);.  if( rc<
16910 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 45 72  0 ){.    int tEr
16920 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
16930 20 69 66 28 20 74 45 72 72 6e 6f 3d 3d 45 4e 4f   if( tErrno==ENO
16940 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ENT ){.      rc 
16950 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
16960 20 7d 65 6c 73 65 7b 0a 23 69 66 20 4f 53 4c 4f   }else{.#if OSLO
16970 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59  CKING_CHECK_BUSY
16980 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 72 63 20  _IOERR.      rc 
16990 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
169a0 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
169b0 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
169c0 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65 0a  _UNLOCK);.#else.
169d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
169e0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
169f0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 73 74 6f  #endif.      sto
16a00 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
16a10 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
16a20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
16a30 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65   .  }.  pFile->e
16a40 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
16a50 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  CK;.  return SQL
16a60 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
16a70 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20 20   Close a file.  
16a80 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
16a90 63 6b 20 68 61 73 20 62 65 65 6e 20 72 65 6c 65  ck has been rele
16aa0 61 73 65 64 20 62 65 66 6f 72 65 20 63 6c 6f 73  ased before clos
16ab0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
16ac0 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28  nt dotlockClose(
16ad0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
16ae0 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
16af0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
16b00 65 2a 29 69 64 3b 0a 20 20 61 73 73 65 72 74 28  e*)id;.  assert(
16b10 20 69 64 21 3d 30 20 29 3b 0a 20 20 64 6f 74 6c   id!=0 );.  dotl
16b20 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  ockUnlock(id, NO
16b30 5f 4c 4f 43 4b 29 3b 0a 20 20 73 71 6c 69 74 65  _LOCK);.  sqlite
16b40 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f  3_free(pFile->lo
16b50 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20  ckingContext);. 
16b60 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69   return closeUni
16b70 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 2f 2a 2a  xFile(id);.}./**
16b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16b90 20 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74 2d   End of the dot-
16ba0 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  file lock implem
16bb0 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
16bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
16bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
16c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
16c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16c80 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66  ******** Begin f
16c90 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  lock Locking ***
16ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
16cc0 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f 63  .** Use the floc
16cd0 6b 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  k() system call 
16ce0 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69  to do file locki
16cf0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28  ng..**.** flock(
16d00 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b  ) locking is lik
16d10 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69  e dot-file locki
16d20 6e 67 20 69 6e 20 74 68 61 74 20 74 68 65 20 76  ng in that the v
16d30 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67  arious.** fine-g
16d40 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  rain locking lev
16d50 65 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62 79  els supported by
16d60 20 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c   SQLite are coll
16d70 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20  apsed into.** a 
16d80 73 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76 65  single exclusive
16d90 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72   lock.  In other
16da0 20 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c 20   words, SHARED, 
16db0 52 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a  RESERVED, and.**
16dc0 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61   PENDING locks a
16dd0 72 65 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  re the same thin
16de0 67 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49 56  g as an EXCLUSIV
16df0 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a  E lock.  SQLite.
16e00 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77  ** still works w
16e10 68 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73 2c  hen you do this,
16e20 20 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63 79   but concurrency
16e30 20 69 73 20 72 65 64 75 63 65 64 20 73 69 6e 63   is reduced sinc
16e40 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67  e.** only a sing
16e50 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 62  le process can b
16e60 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  e reading the da
16e70 74 61 62 61 73 65 20 61 74 20 61 20 74 69 6d 65  tabase at a time
16e80 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69  ..**.** Omit thi
16e90 73 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51 4c  s section if SQL
16ea0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
16eb0 4e 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72 6e  NG_STYLE is turn
16ec0 65 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 53 51  ed off.*/.#if SQ
16ed0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
16ee0 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a  ING_STYLE../*.**
16ef0 20 52 65 74 72 79 20 66 6c 6f 63 6b 28 29 20 63   Retry flock() c
16f00 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 77  alls that fail w
16f10 69 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69 66  ith EINTR.*/.#if
16f20 64 65 66 20 45 49 4e 54 52 0a 73 74 61 74 69 63  def EINTR.static
16f30 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63   int robust_floc
16f40 6b 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70  k(int fd, int op
16f50 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64  ){.  int rc;.  d
16f60 6f 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64  o{ rc = flock(fd
16f70 2c 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20 72 63  ,op); }while( rc
16f80 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
16f90 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  TR );.  return r
16fa0 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  c;.}.#else.# def
16fb0 69 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  ine robust_flock
16fc0 28 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62 29  (a,b) flock(a,b)
16fd0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a 2f  .#endif.     ../
16fe0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
16ff0 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
17000 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
17010 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
17020 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
17030 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
17040 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
17050 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
17060 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
17070 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
17080 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
17090 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
170a0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
170b0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
170c0 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
170d0 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
170e0 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
170f0 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
17100 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
17110 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65  tic int flockChe
17120 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
17130 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
17140 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
17150 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
17160 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
17170 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
17180 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
17190 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a  nixFile*)id;.  .
171a0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
171b0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
171c0 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
171d0 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
171e0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
171f0 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b  );.  .  /* Check
17200 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
17210 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
17220 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
17230 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
17240 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
17250 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
17260 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  rved = 1;.  }.  
17270 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
17280 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
17290 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
172a0 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  it. */.  if( !re
172b0 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a  served ){.    /*
172c0 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20   attempt to get 
172d0 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  the lock */.    
172e0 69 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75 73 74  int lrc = robust
172f0 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c  _flock(pFile->h,
17300 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f   LOCK_EX | LOCK_
17310 4e 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72  NB);.    if( !lr
17320 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f  c ){.      /* go
17330 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f  t the lock, unlo
17340 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c  ck it */.      l
17350 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63  rc = robust_floc
17360 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
17370 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20 28  _UN);.      if (
17380 20 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20 20   lrc ) {.       
17390 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
173a0 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  rno;.        /* 
173b0 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77 69  unlock failed wi
173c0 74 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 23  th an error */.#
173d0 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45  if OSLOCKING_CHE
173e0 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20  CK_BUSY_IOERR.  
173f0 20 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69        lrc = sqli
17400 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
17410 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
17420 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
17430 4b 29 3b 0a 23 65 6c 73 65 20 0a 20 20 20 20 20  K);.#else .     
17440 20 20 20 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f     lrc = SQLITE_
17450 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 23  IOERR_UNLOCK; .#
17460 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66  endif.        if
17470 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
17480 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  lrc) ){.        
17490 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
174a0 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
174b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
174c0 6c 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  lrc;.        }. 
174d0 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
174e0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
174f0 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63  rno);.        rc
17500 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a   = lrc;.      }.
17510 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
17520 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
17530 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73  errno;.      res
17540 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  erved = 1;.     
17550 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65   /* someone else
17560 20 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72   might have it r
17570 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20  eserved */.     
17580 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72   lrc = sqliteErr
17590 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
175a0 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
175b0 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20  IOERR_LOCK); .  
175c0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
175d0 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
175e0 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
175f0 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
17600 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  no);.        rc 
17610 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  = lrc;.      }. 
17620 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41     }.  }.  OSTRA
17630 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
17640 4b 20 25 64 20 25 64 20 25 64 20 28 66 6c 6f 63  K %d %d %d (floc
17650 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
17660 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
17670 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
17680 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
17690 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28  K_ERRORS.  if( (
176a0 72 63 20 26 20 30 78 66 66 29 20 3d 3d 20 53 51  rc & 0xff) == SQ
176b0 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
176c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
176d0 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64 3d 31  ;.    reserved=1
176e0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
176f0 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
17700 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
17710 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  */.  *pResOut = 
17720 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
17730 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17740 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
17750 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
17760 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
17770 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
17780 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
17790 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
177a0 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
177b0 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
177c0 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
177d0 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
177e0 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
177f0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
17800 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
17810 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
17820 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
17830 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
17840 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
17850 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
17860 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
17870 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
17880 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
17890 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
178a0 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
178b0 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
178c0 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
178d0 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
178e0 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
178f0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
17900 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
17910 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
17920 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
17930 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
17940 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
17950 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
17960 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
17970 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
17980 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
17990 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
179a0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
179b0 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
179c0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
179d0 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
179e0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
179f0 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20  ** flock() only 
17a00 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45  really support E
17a10 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20  XCLUSIVE locks. 
17a20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d   We track interm
17a30 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73  ediate.** lock s
17a40 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c  tates in the sql
17a50 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74  ite3_file struct
17a60 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63  ure, but all loc
17a70 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20  ks SHARED or.** 
17a80 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79  above are really
17a90 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
17aa0 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c   and exclude all
17ab0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
17ac0 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20   from.** access 
17ad0 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
17ae0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
17af0 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
17b00 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
17b10 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
17b20 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
17b30 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
17b40 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
17b50 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28  c int flockLock(
17b60 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
17b70 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
17b80 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
17b90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
17ba0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
17bb0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61  ixFile*)id;..  a
17bc0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
17bd0 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65  .  /* if we alre
17be0 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c  ady have a lock,
17bf0 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65   it is exclusive
17c00 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64  .  .  ** Just ad
17c10 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70  just level and p
17c20 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72  unt on outta her
17c30 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c  e. */.  if (pFil
17c40 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e  e->eFileLock > N
17c50 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  O_LOCK) {.    pF
17c60 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
17c70 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
17c80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17c90 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72  ;.  }.  .  /* gr
17ca0 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ab an exclusive 
17cb0 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20  lock */.  .  if 
17cc0 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46  (robust_flock(pF
17cd0 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20  ile->h, LOCK_EX 
17ce0 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20  | LOCK_NB)) {.  
17cf0 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
17d00 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64  rrno;.    /* did
17d10 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65  n't get, must be
17d20 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72 63 20   busy */.    rc 
17d30 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
17d40 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
17d50 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
17d60 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
17d70 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
17d80 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65  ) ){.      store
17d90 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
17da0 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a   tErrno);.    }.
17db0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f    } else {.    /
17dc0 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
17dd0 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
17de0 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c  n ok */.    pFil
17df0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
17e00 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  FileLock;.  }.  
17e10 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
17e20 20 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f 63    %d %s %s (floc
17e30 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
17e40 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
17e50 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20  eLock), .       
17e60 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
17e70 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
17e80 65 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53 51  ed"));.#ifdef SQ
17e90 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
17ea0 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  K_LOCK_ERRORS.  
17eb0 69 66 28 20 28 72 63 20 26 20 30 78 66 66 29 20  if( (rc & 0xff) 
17ec0 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  == SQLITE_IOERR 
17ed0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
17ee0 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e  TE_BUSY;.  }.#en
17ef0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
17f00 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
17f10 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75  ERRORS */.  retu
17f20 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
17f30 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
17f40 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
17f50 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
17f60 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
17f70 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
17f80 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
17f90 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
17fa0 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
17fb0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
17fc0 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
17fd0 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
17fe0 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
17ff0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
18000 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
18010 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
18020 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
18030 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b   int flockUnlock
18040 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
18050 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
18060 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
18070 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
18080 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65  e*)id;.  .  asse
18090 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
180a0 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
180b0 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
180c0 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c  d=%d (flock)\n",
180d0 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
180e0 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
180f0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
18100 6b 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29  k, osGetpid(0)))
18110 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
18120 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
18130 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
18140 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
18150 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
18160 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65  eFileLock==eFile
18170 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
18180 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
18190 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64  }.  .  /* shared
181a0 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74   can just be set
181b0 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61   because we alwa
181c0 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  ys have an exclu
181d0 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46  sive */.  if (eF
181e0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
181f0 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
18200 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
18210 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65  FileLock;.    re
18220 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18230 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20    }.  .  /* no, 
18240 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20  really, unlock. 
18250 2a 2f 0a 20 20 69 66 28 20 72 6f 62 75 73 74 5f  */.  if( robust_
18260 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
18270 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64  LOCK_UN) ){.#ifd
18280 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ef SQLITE_IGNORE
18290 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
182a0 52 53 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  RS.    return SQ
182b0 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20  LITE_OK;.#endif 
182c0 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
182d0 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
182e0 52 53 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  RS */.    return
182f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
18300 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  LOCK;.  }else{. 
18310 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
18320 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
18330 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18340 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
18350 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
18360 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
18370 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  ockClose(sqlite3
18380 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 61  _file *id) {.  a
18390 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
183a0 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64    flockUnlock(id
183b0 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 72 65  , NO_LOCK);.  re
183c0 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69  turn closeUnixFi
183d0 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69  le(id);.}..#endi
183e0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
183f0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
18400 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a   && !OS_VXWORK *
18410 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
18420 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
18430 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d  he flock lock im
18440 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
18450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18460 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
18470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
184a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
184b0 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
184c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
184d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
184e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
184f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18500 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
18510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
18520 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f  in Named Semapho
18530 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  re Locking *****
18540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18550 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20  ***.**.** Named 
18560 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
18570 67 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72  g is only suppor
18580 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ted on VxWorks..
18590 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20  **.** Semaphore 
185a0 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20  locking is like 
185b0 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f  dot-lock and flo
185c0 63 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72 65  ck in that it re
185d0 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70  ally only.** sup
185e0 70 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45 20  ports EXCLUSIVE 
185f0 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61  locking.  Only a
18600 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20   single process 
18610 63 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74  can read or writ
18620 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  e.** the databas
18630 65 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65  e file at a time
18640 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20  .  This reduces 
18650 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72  potential concur
18660 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61  rency, but.** ma
18670 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70  kes the lock imp
18680 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68  lementation much
18690 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20   easier..*/.#if 
186a0 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a  OS_VXWORKS../*.*
186b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
186c0 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
186d0 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
186e0 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
186f0 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
18700 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
18710 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
18720 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
18730 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
18740 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
18750 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
18760 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
18770 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
18780 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
18790 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
187a0 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
187b0 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
187c0 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
187d0 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
187e0 20 69 6e 74 20 73 65 6d 58 43 68 65 63 6b 52 65   int semXCheckRe
187f0 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
18800 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
18810 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69   *pResOut) {.  i
18820 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
18830 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
18840 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
18850 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
18860 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
18870 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
18880 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
18890 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
188a0 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
188b0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20  ert( pFile );.. 
188c0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
188d0 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
188e0 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
188f0 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
18900 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
18910 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
18920 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
18930 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f  1;.  }.  .  /* O
18940 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
18950 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
18960 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a  ss holds it. */.
18970 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
18980 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53  ){.    sem_t *pS
18990 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  em = pFile->pIno
189a0 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 20 20 69  de->pSem;..    i
189b0 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70  f( sem_trywait(p
189c0 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20  Sem)==-1 ){.    
189d0 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
189e0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  rrno;.      if( 
189f0 45 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f  EAGAIN != tErrno
18a00 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
18a10 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
18a20 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
18a30 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
18a40 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
18a50 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72  K);.        stor
18a60 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
18a70 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
18a80 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
18a90 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73    /* someone els
18aa0 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77  e has the lock w
18ab0 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f  hen we are in NO
18ac0 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20  _LOCK */.       
18ad0 20 72 65 73 65 72 76 65 64 20 3d 20 28 70 46 69   reserved = (pFi
18ae0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20  le->eFileLock < 
18af0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
18b00 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
18b10 0a 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75  .      /* we cou
18b20 6c 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65  ld have it if we
18b30 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20   want it */.    
18b40 20 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29    sem_post(pSem)
18b50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53  ;.    }.  }.  OS
18b60 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
18b70 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 73  LOCK %d %d %d (s
18b80 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  em)\n", pFile->h
18b90 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
18ba0 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  ;..  *pResOut = 
18bb0 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
18bc0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18bd0 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
18be0 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
18bf0 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
18c00 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
18c10 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
18c20 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
18c30 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
18c40 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
18c50 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
18c60 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
18c70 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
18c80 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
18c90 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
18ca0 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
18cb0 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
18cc0 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
18cd0 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
18ce0 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
18cf0 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
18d00 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
18d10 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
18d20 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
18d30 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
18d40 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
18d50 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
18d60 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
18d70 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
18d80 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
18d90 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
18da0 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
18db0 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
18dc0 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
18dd0 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
18de0 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
18df0 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
18e00 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
18e10 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
18e20 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
18e30 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
18e40 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
18e50 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
18e60 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
18e70 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
18e80 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ** Semaphore loc
18e90 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73  ks only really s
18ea0 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45  upport EXCLUSIVE
18eb0 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63   locks.  We trac
18ec0 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a  k intermediate.*
18ed0 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e  * lock states in
18ee0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
18ef0 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74  e structure, but
18f00 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45   all locks SHARE
18f10 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72  D or.** above ar
18f20 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49  e really EXCLUSI
18f30 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63  VE locks and exc
18f40 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70  lude all other p
18f50 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a  rocesses from.**
18f60 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65   access the file
18f70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
18f80 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
18f90 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
18fa0 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
18fb0 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
18fc0 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
18fd0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
18fe0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
18ff0 6d 58 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  mXLock(sqlite3_f
19000 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
19010 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
19020 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
19030 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  nixFile*)id;.  s
19040 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69  em_t *pSem = pFi
19050 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  le->pInode->pSem
19060 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
19070 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66  ITE_OK;..  /* if
19080 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   we already have
19090 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65   a lock, it is e
190a0 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a  xclusive.  .  **
190b0 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76   Just adjust lev
190c0 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f  el and punt on o
190d0 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20  utta here. */.  
190e0 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if (pFile->eFile
190f0 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20  Lock > NO_LOCK) 
19100 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
19110 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
19120 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ck;.    rc = SQL
19130 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f  ITE_OK;.    goto
19140 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   sem_end_lock;. 
19150 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20   }.  .  /* lock 
19160 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62 75  semaphore now bu
19170 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65 6e 20  t bail out when 
19180 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20  already locked. 
19190 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74 72 79  */.  if( sem_try
191a0 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29  wait(pSem)==-1 )
191b0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
191c0 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
191d0 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   sem_end_lock;. 
191e0 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c   }..  /* got it,
191f0 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
19200 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
19210 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
19220 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a  k = eFileLock;..
19230 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20   sem_end_lock:. 
19240 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19250 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
19260 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
19270 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
19280 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
19290 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
192a0 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
192b0 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
192c0 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
192d0 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
192e0 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
192f0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
19300 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
19310 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
19320 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
19330 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
19340 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
19350 61 74 69 63 20 69 6e 74 20 73 65 6d 58 55 6e 6c  atic int semXUnl
19360 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
19370 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
19380 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
19390 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
193a0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f  File*)id;.  sem_
193b0 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
193c0 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a  >pInode->pSem;..
193d0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
193e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 65  );.  assert( pSe
193f0 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  m );.  OSTRACE((
19400 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
19410 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 73 65  as %d pid=%d (se
19420 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  m)\n", pFile->h,
19430 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20   eFileLock,.    
19440 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
19450 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69  ileLock, osGetpi
19460 64 28 30 29 29 29 3b 0a 20 20 61 73 73 65 72 74  d(0)));.  assert
19470 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
19480 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
19490 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
194a0 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
194b0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
194c0 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
194d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
194e0 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
194f0 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20  shared can just 
19500 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77  be set because w
19510 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e  e always have an
19520 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20   exclusive */.  
19530 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if (eFileLock==S
19540 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  HARED_LOCK) {.  
19550 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
19560 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
19570 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19580 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
19590 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c  * no, really unl
195a0 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73  ock. */.  if ( s
195b0 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d  em_post(pSem)==-
195c0 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63  1 ) {.    int rc
195d0 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  , tErrno = errno
195e0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
195f0 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
19600 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
19610 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
19620 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
19630 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
19640 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
19650 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
19660 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  no);.    }.    r
19670 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20  eturn rc; .  }. 
19680 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
19690 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72  k = NO_LOCK;.  r
196a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
196b0 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65  .}../*. ** Close
196c0 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61   a file.. */.sta
196d0 74 69 63 20 69 6e 74 20 73 65 6d 58 43 6c 6f 73  tic int semXClos
196e0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
196f0 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
19700 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
19710 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
19720 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 58 55  e*)id;.    semXU
19730 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
19740 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  K);.    assert( 
19750 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 61 73 73  pFile );.    ass
19760 65 72 74 28 20 75 6e 69 78 46 69 6c 65 4d 75 74  ert( unixFileMut
19770 65 78 4e 6f 74 68 65 6c 64 28 70 46 69 6c 65 29  exNotheld(pFile)
19780 20 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65   );.    unixEnte
19790 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65  rMutex();.    re
197a0 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70  leaseInodeInfo(p
197b0 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c  File);.    unixL
197c0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
197d0 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
197e0 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  d);.  }.  return
197f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
19800 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
19810 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d  RKS */./*.** Nam
19820 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
19830 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61  king is only ava
19840 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b  ilable on VxWork
19850 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s..**.**********
19860 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
19870 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   named semaphore
19880 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
19890 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
198a0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
198b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
198c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
198d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
198e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
198f0 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ****/.../*******
19900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19940 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
19950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19960 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c 6f  *** Begin AFP Lo
19970 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
19980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19990 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46  *******.**.** AF
199a0 50 20 69 73 20 74 68 65 20 41 70 70 6c 65 20 46  P is the Apple F
199b0 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20  iling Protocol. 
199c0 20 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72   AFP is a networ
199d0 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75  k filesystem fou
199e0 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d  nd.** on Apple M
199f0 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65  acintosh compute
19a00 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e  rs - both OS9 an
19a10 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  d OSX..**.** Thi
19a20 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65  rd-party impleme
19a30 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20  ntations of AFP 
19a40 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20  are available.  
19a50 42 75 74 20 74 68 69 73 20 63 6f 64 65 20 68 65  But this code he
19a60 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73  re.** only works
19a70 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66   on OSX..*/..#if
19a80 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
19a90 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
19aa0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
19ab0 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70  LE./*.** The afp
19ac0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73  LockingContext s
19ad0 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
19ae0 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73  s all afp lock s
19af0 70 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f  pecific state.*/
19b00 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
19b10 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
19b20 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
19b30 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c  ext;.struct afpL
19b40 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a  ockingContext {.
19b50 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0a    int reserved;.
19b60 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62    const char *db
19b70 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  Path;           
19b80 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
19b90 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b   open file */.};
19ba0 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  ..struct ByteRan
19bb0 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e  geLockPB2.{.  un
19bc0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
19bd0 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20   offset;        
19be0 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72  /* offset to fir
19bf0 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20  st byte to lock 
19c00 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
19c10 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20  ng long length; 
19c20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66         /* nbr of
19c30 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
19c40 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
19c50 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53  g long retRangeS
19c60 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20  tart; /* nbr of 
19c70 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20  1st byte locked 
19c80 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f  if successful */
19c90 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
19ca0 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20   unLockFlag;    
19cb0 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f       /* 1 = unlo
19cc0 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a  ck, 0 = lock */.
19cd0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
19ce0 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20  startEndFlag;   
19cf0 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20      /* 1=rel to 
19d00 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72  end of fork, 0=r
19d10 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20  el to start */. 
19d20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20   int fd;        
19d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d40 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20     /* file desc 
19d50 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f  to assoc this lo
19d60 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23  ck with */.};..#
19d70 64 65 66 69 6e 65 20 61 66 70 66 73 42 79 74 65  define afpfsByte
19d80 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20  RangeLock2FSCTL 
19d90 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27         _IOWR('z'
19da0 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74  , 23, struct Byt
19db0 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a  eRangeLockPB2)..
19dc0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
19dd0 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74  utility for sett
19de0 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20  ing or clearing 
19df0 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b  a bit-range lock
19e00 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69   on an.** AFP fi
19e10 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a  lesystem..** .**
19e20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
19e30 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51  K on success, SQ
19e40 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69  LITE_BUSY on fai
19e50 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
19e60 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a  int afpSetLock(.
19e70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61    const char *pa
19e80 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
19e90 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
19ea0 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  file to be locke
19eb0 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f  d or unlocked */
19ec0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
19ed0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
19ee0 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
19ef0 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74  escriptor on pat
19f00 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  h */.  unsigned 
19f10 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74  long long offset
19f20 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62  ,     /* First b
19f30 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  yte to be locked
19f40 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
19f50 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c  ong long length,
19f60 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
19f70 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
19f80 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b  */.  int setLock
19f90 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  Flag            
19fa0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
19fb0 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20  et lock.  False 
19fc0 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f  to clear lock */
19fd0 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74  .){.  struct Byt
19fe0 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62  eRangeLockPB2 pb
19ff0 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a  ;.  int err;.  .
1a000 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20    pb.unLockFlag 
1a010 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20  = setLockFlag ? 
1a020 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72  0 : 1;.  pb.star
1a030 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20  tEndFlag = 0;.  
1a040 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73  pb.offset = offs
1a050 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20  et;.  pb.length 
1a060 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e  = length; .  pb.
1a070 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20  fd = pFile->h;. 
1a080 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 46   .  OSTRACE(("AF
1a090 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f  PSETLOCK [%s] fo
1a0a0 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20  r %d%s in range 
1a0b0 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20  %llx:%llx\n", . 
1a0c0 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f     (setLockFlag?
1a0d0 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69  "ON":"OFF"), pFi
1a0e0 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d  le->h, (pb.fd==-
1a0f0 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a  1?"[testval-1]":
1a100 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c  ""),.    offset,
1a110 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72 72   length));.  err
1a120 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61   = fsctl(path, a
1a130 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63  fpfsByteRangeLoc
1a140 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29  k2FSCTL, &pb, 0)
1a150 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31  ;.  if ( err==-1
1a160 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b   ) {.    int rc;
1a170 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
1a180 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54  = errno;.    OST
1a190 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43  RACE(("AFPSETLOC
1a1a0 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74  K failed to fsct
1a1b0 6c 28 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e  l() '%s' %d %s\n
1a1c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1a1d0 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74  path, tErrno, st
1a1e0 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 29  rerror(tErrno)))
1a1f0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1a200 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f  IGNORE_AFP_LOCK_
1a210 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20  ERRORS.    rc = 
1a220 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c  SQLITE_BUSY;.#el
1a230 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  se.    rc = sqli
1a240 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
1a250 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20  Error(tErrno,.  
1a260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a270 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20    setLockFlag ? 
1a280 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
1a290 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  K : SQLITE_IOERR
1a2a0 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66  _UNLOCK);.#endif
1a2b0 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
1a2c0 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52  E_AFP_LOCK_ERROR
1a2d0 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f  S */.    if( IS_
1a2e0 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
1a2f0 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
1a300 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
1a310 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rrno);.    }.   
1a320 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
1a330 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72  else {.    retur
1a340 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1a350 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1a360 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
1a370 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
1a380 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
1a390 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
1a3a0 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
1a3b0 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
1a3c0 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
1a3d0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
1a3e0 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
1a3f0 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
1a400 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
1a410 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
1a420 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
1a430 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
1a440 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
1a450 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
1a460 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
1a470 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
1a480 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
1a490 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
1a4a0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
1a4b0 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
1a4c0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1a4d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
1a4e0 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
1a4f0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1a500 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
1a510 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
1a520 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20  ext *context;.  
1a530 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1a540 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
1a550 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
1a560 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
1a570 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
1a580 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20   );.  context = 
1a590 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
1a5a0 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
1a5b0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
1a5c0 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65  f( context->rese
1a5d0 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52 65  rved ){.    *pRe
1a5e0 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72 65  sOut = 1;.    re
1a5f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a600 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
1a610 74 65 78 5f 65 6e 74 65 72 28 70 46 69 6c 65 2d  tex_enter(pFile-
1a620 3e 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75  >pInode->pLockMu
1a630 74 65 78 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b  tex);.  /* Check
1a640 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
1a650 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
1a660 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
1a670 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  /.  if( pFile->p
1a680 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
1a690 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
1a6a0 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
1a6b0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
1a6c0 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
1a6d0 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
1a6e0 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a  s holds it..   *
1a6f0 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
1a700 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b  d ){.    /* lock
1a710 20 74 68 65 20 52 45 53 45 52 56 45 44 20 62 79   the RESERVED by
1a720 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72  te */.    int lr
1a730 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
1a740 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
1a750 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
1a760 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20  BYTE, 1,1);  .  
1a770 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
1a780 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  =lrc ){.      /*
1a790 20 69 66 20 77 65 20 73 75 63 63 65 65 64 65 64   if we succeeded
1a7a0 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72   in taking the r
1a7b0 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e  eserved lock, un
1a7c0 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f  lock it to resto
1a7d0 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  re.      ** the 
1a7e0 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a  original state *
1a7f0 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 61 66  /.      lrc = af
1a800 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
1a810 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
1a820 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
1a830 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73  1, 0);.    } els
1a840 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20  e {.      /* if 
1a850 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74  we failed to get
1a860 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73   the lock then s
1a870 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74  omeone else must
1a880 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20   have it */.    
1a890 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
1a8a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53      }.    if( IS
1a8b0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29  _LOCK_ERROR(lrc)
1a8c0 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72 63   ){.      rc=lrc
1a8d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
1a8e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1a8f0 65 61 76 65 28 70 46 69 6c 65 2d 3e 70 49 6e 6f  eave(pFile->pIno
1a900 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b  de->pLockMutex);
1a910 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
1a920 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
1a930 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %d (afp)\n", pFi
1a940 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
1a950 76 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65  ved));.  .  *pRe
1a960 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
1a970 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a980 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
1a990 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
1a9a0 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
1a9b0 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
1a9c0 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
1a9d0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
1a9e0 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
1a9f0 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
1aa00 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
1aa10 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
1aa20 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
1aa30 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
1aa40 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
1aa50 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
1aa60 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
1aa70 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
1aa80 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
1aa90 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
1aaa0 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
1aab0 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
1aac0 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
1aad0 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
1aae0 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
1aaf0 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
1ab00 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
1ab10 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
1ab20 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
1ab30 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
1ab40 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
1ab50 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
1ab60 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
1ab70 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
1ab80 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
1ab90 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
1aba0 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
1abb0 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
1abc0 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
1abd0 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
1abe0 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
1abf0 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
1ac00 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
1ac10 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
1ac20 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
1ac30 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
1ac40 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
1ac50 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
1ac60 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
1ac70 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
1ac80 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
1ac90 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
1aca0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1acb0 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  afpLock(sqlite3_
1acc0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
1acd0 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  ileLock){.  int 
1ace0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1acf0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1ad00 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
1ad10 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
1ad20 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
1ad30 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66  le->pInode;.  af
1ad40 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
1ad50 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c  *context = (afpL
1ad60 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
1ad70 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
1ad80 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73  ontext;.  .  ass
1ad90 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
1ada0 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
1adb0 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25    %d %s was %s(%
1adc0 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66  s,%d) pid=%d (af
1add0 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
1ade0 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
1adf0 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
1ae00 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46  ), azFileLock(pF
1ae10 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c  ile->eFileLock),
1ae20 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
1ae30 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65  leLock(pInode->e
1ae40 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64  FileLock), pInod
1ae50 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 6f 73 47  e->nShared , osG
1ae60 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f  etpid(0)));..  /
1ae70 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
1ae80 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
1ae90 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
1aea0 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
1aeb0 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69   the.  ** unixFi
1aec0 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
1aed0 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61 66  Don't use the af
1aee0 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  p_end_lock: exit
1aef0 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75   path, as.  ** u
1af00 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
1af10 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
1af20 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
1af30 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
1af40 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock>=eFileLock )
1af50 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
1af60 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b  LOCK    %d %s ok
1af70 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20   (already held) 
1af80 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
1af90 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61  >h,.           a
1afa0 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
1afb0 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75  ock)));.    retu
1afc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1afd0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
1afe0 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
1aff0 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
1b000 74 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e  t.  **  (1) We n
1b010 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75  ever move from u
1b020 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68  nlocked to anyth
1b030 69 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20  ing higher than 
1b040 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  shared lock..  *
1b050 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65  *  (2) SQLite ne
1b060 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72  ver explicitly r
1b070 65 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67  equests a pendig
1b080 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29   lock..  **  (3)
1b090 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69   A shared lock i
1b0a0 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68  s always held wh
1b0b0 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63  en a reserve loc
1b0c0 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  k is requested..
1b0d0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
1b0e0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
1b0f0 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  =NO_LOCK || eFil
1b100 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
1b110 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
1b120 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49  eFileLock!=PENDI
1b130 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  NG_LOCK );.  ass
1b140 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d  ert( eFileLock!=
1b150 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
1b160 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
1b170 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
1b180 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d  ;.  .  /* This m
1b190 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62  utex is needed b
1b1a0 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
1b1b0 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
1b1c0 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20  cross threads.  
1b1d0 2a 2f 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  */.  pInode = pF
1b1e0 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73  ile->pInode;.  s
1b1f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1b200 65 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b  er(pInode->pLock
1b210 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66  Mutex);..  /* If
1b220 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
1b230 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20  ng this PID has 
1b240 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66  a lock via a dif
1b250 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a  ferent unixFile*
1b260 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61  .  ** handle tha
1b270 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20  t precludes the 
1b280 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20  requested lock, 
1b290 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a  return BUSY..  *
1b2a0 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e  /.  if( (pFile->
1b2b0 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64  eFileLock!=pInod
1b2c0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20  e->eFileLock && 
1b2d0 0a 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d  .       (pInode-
1b2e0 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44  >eFileLock>=PEND
1b2f0 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  ING_LOCK || eFil
1b300 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
1b310 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20 20  K)).     ){.    
1b320 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
1b330 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65  ;.    goto afp_e
1b340 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a  nd_lock;.  }.  .
1b350 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44    /* If a SHARED
1b360 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
1b370 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72  ed, and some thr
1b380 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
1b390 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ID already.  ** 
1b3a0 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20  has a SHARED or 
1b3b0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74  RESERVED lock, t
1b3c0 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65  hen increment re
1b3d0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61  ference counts a
1b3e0 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  nd.  ** return S
1b3f0 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20  QLITE_OK..  */. 
1b400 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
1b410 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
1b420 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
1b430 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
1b440 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
1b450 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
1b460 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  VED_LOCK) ){.   
1b470 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
1b480 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
1b490 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1b4a0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
1b4b0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1b4c0 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
1b4d0 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  d>0 );.    pFile
1b4e0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
1b4f0 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
1b500 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b  Inode->nShared++
1b510 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c  ;.    pInode->nL
1b520 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
1b530 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
1b540 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45  }.    .  /* A PE
1b550 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65  NDING lock is ne
1b560 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75  eded before acqu
1b570 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
1b580 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20  ock and before. 
1b590 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e   ** acquiring an
1b5a0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
1b5b0 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44    For the SHARED
1b5c0 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49   lock, the PENDI
1b5d0 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  NG will.  ** be 
1b5e0 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20  released..  */. 
1b5f0 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
1b600 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
1b610 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b     || (eFileLock
1b620 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
1b630 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
1b640 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43  Lock<PENDING_LOC
1b650 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  K).  ){.    int 
1b660 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c  failed;.    fail
1b670 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
1b680 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
1b690 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
1b6a0 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20  BYTE, 1, 1);.   
1b6b0 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20   if (failed) {. 
1b6c0 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
1b6d0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
1b6e0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
1b6f0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20  .  }.  .  /* If 
1b700 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20  control gets to 
1b710 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
1b720 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65   actually go ahe
1b730 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a  ad and make.  **
1b740 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
1b750 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  m calls for the 
1b760 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a  specified lock..
1b770 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
1b780 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
1b790 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63  K ){.    int lrc
1b7a0 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72  1, lrc2, lrc1Err
1b7b0 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67  no = 0;.    long
1b7c0 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a   lk, mask;.    .
1b7d0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
1b7e0 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
1b7f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
1b800 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
1b810 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 0a 20  =0 );.        . 
1b820 20 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f     mask = (sizeo
1b830 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41  f(long)==8) ? LA
1b840 52 47 45 53 54 5f 49 4e 54 36 34 20 3a 20 30 78  RGEST_INT64 : 0x
1b850 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a  7fffffff;.    /*
1b860 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61   Now get the rea
1b870 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f  d-lock SHARED_LO
1b880 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74  CK */.    /* not
1b890 65 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69  e that the quali
1b8a0 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d  ty of the random
1b8b0 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74  ness doesn't mat
1b8c0 74 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f  ter that much */
1b8d0 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d  .    lk = random
1b8e0 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d  (); .    pInode-
1b8f0 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c  >sharedByte = (l
1b900 6b 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52 45  k & mask)%(SHARE
1b910 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20  D_SIZE - 1);.   
1b920 20 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c 6f   lrc1 = afpSetLo
1b930 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
1b940 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20  th, pFile, .    
1b950 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52        SHARED_FIR
1b960 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65  ST+pInode->share
1b970 64 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  dByte, 1, 1);.  
1b980 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
1b990 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20 20  ROR(lrc1) ){.   
1b9a0 20 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70     lrc1Errno = p
1b9b0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
1b9c0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72  .    }.    /* Dr
1b9d0 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  op the temporary
1b9e0 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f   PENDING lock */
1b9f0 0a 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70 53  .    lrc2 = afpS
1ba00 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
1ba10 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50  dbPath, pFile, P
1ba20 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
1ba30 30 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28  0);.    .    if(
1ba40 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
1ba50 72 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20 73  rc1) ) {.      s
1ba60 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
1ba70 69 6c 65 2c 20 6c 72 63 31 45 72 72 6e 6f 29 3b  ile, lrc1Errno);
1ba80 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
1ba90 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
1baa0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
1bab0 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43   else if( IS_LOC
1bac0 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b  K_ERROR(lrc2) ){
1bad0 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32  .      rc = lrc2
1bae0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
1baf0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
1bb00 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21   else if( lrc1 !
1bb10 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a  = SQLITE_OK ) {.
1bb20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
1bb30 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
1bb40 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
1bb50 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
1bb60 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  CK;.      pInode
1bb70 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20  ->nLock++;.     
1bb80 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
1bb90 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
1bba0 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
1bbb0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
1bbc0 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K && pInode->nSh
1bbd0 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  ared>1 ){.    /*
1bbe0 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
1bbf0 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
1bc00 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
1bc10 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
1bc20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f       ** same pro
1bc30 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f  cess is still ho
1bc40 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  lding a shared l
1bc50 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ock. */.    rc =
1bc60 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1bc70 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
1bc80 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f  e request was fo
1bc90 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
1bca0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
1bcb0 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73   It is.    ** as
1bcc0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65  sumed that there
1bcd0 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20   is a SHARED or 
1bce0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
1bcf0 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
1bd00 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
1bd10 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d      int failed =
1bd20 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
1bd30 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  0!=pFile->eFileL
1bd40 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65  ock );.    if (e
1bd50 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45  FileLock >= RESE
1bd60 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69  RVED_LOCK && pFi
1bd70 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20  le->eFileLock < 
1bd80 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b  RESERVED_LOCK) {
1bd90 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75  .        /* Acqu
1bda0 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c  ire a RESERVED l
1bdb0 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  ock */.        f
1bdc0 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
1bdd0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
1bde0 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
1bdf0 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a  VED_BYTE, 1,1);.
1be00 20 20 20 20 20 20 69 66 28 20 21 66 61 69 6c 65        if( !faile
1be10 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  d ){.        con
1be20 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d  text->reserved =
1be30 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1be40 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c 65  }.    if (!faile
1be50 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d  d && eFileLock =
1be60 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
1be70 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71  ) {.      /* Acq
1be80 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
1be90 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  E lock */.      
1bea0 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f    .      /* Remo
1beb0 76 65 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  ve the shared lo
1bec0 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67  ck before trying
1bed0 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27   the range.  we'
1bee0 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20  ll need to .    
1bef0 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68    ** reestablish
1bf00 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
1bf10 20 69 66 20 77 65 20 63 61 6e 27 74 20 67 65 74   if we can't get
1bf20 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a   the  afpUnlock.
1bf30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1bf40 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66  f( !(failed = af
1bf50 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
1bf60 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
1bf70 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a   SHARED_FIRST +.
1bf80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf90 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d           pInode-
1bfa0 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
1bfb0 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  0)) ){.        i
1bfc0 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c  nt failed2 = SQL
1bfd0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
1bfe0 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20  /* now attemmpt 
1bff0 74 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75  to get the exclu
1c000 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20  sive lock range 
1c010 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65  */.        faile
1c020 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
1c030 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
1c040 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
1c050 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20  RST, .          
1c060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c070 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45       SHARED_SIZE
1c080 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
1c090 28 20 66 61 69 6c 65 64 20 26 26 20 28 66 61 69  ( failed && (fai
1c0a0 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63  led2 = afpSetLoc
1c0b0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
1c0c0 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
1c0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0e0 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b    SHARED_FIRST +
1c0f0 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42   pInode->sharedB
1c100 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20  yte, 1, 1)) ){. 
1c110 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27           /* Can'
1c120 74 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68  t reestablish th
1c130 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20  e shared lock.  
1c140 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61  Sqlite can't dea
1c150 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20 20  l, this is.     
1c160 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63       ** a critic
1c170 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20  al I/O error.   
1c180 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1c190 20 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65      rc = ((faile
1c1a0 64 20 26 20 30 78 66 66 29 20 3d 3d 20 53 51 4c  d & 0xff) == SQL
1c1b0 49 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61 69  ITE_IOERR) ? fai
1c1c0 6c 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20 20  led2 : .        
1c1d0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
1c1e0 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  ERR_LOCK;.      
1c1f0 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
1c200 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  _lock;.        }
1c210 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20   .      }else{. 
1c220 20 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c         rc = fail
1c230 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  ed; .      }.   
1c240 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65   }.    if( faile
1c250 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
1c260 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
1c270 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53  }.  .  if( rc==S
1c280 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c290 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
1c2a0 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
1c2b0 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
1c2c0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
1c2d0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
1c2e0 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
1c2f0 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  E_LOCK ){.    pF
1c300 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
1c310 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
1c320 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
1c330 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
1c340 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f  OCK;.  }.  .afp_
1c350 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 73 71 6c 69  end_lock:.  sqli
1c360 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1c370 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74  pInode->pLockMut
1c380 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ex);.  OSTRACE((
1c390 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
1c3a0 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  s (afp)\n", pFil
1c3b0 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  e->h, azFileLock
1c3c0 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20  (eFileLock), .  
1c3d0 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
1c3e0 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
1c3f0 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75  ailed"));.  retu
1c400 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1c410 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
1c420 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
1c430 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
1c440 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
1c450 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
1c460 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
1c470 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
1c480 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
1c490 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
1c4a0 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
1c4b0 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
1c4c0 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
1c4d0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
1c4e0 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
1c4f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
1c500 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
1c510 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71  int afpUnlock(sq
1c520 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1c530 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
1c540 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1c550 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
1c560 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1c570 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
1c580 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
1c590 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  e;.  afpLockingC
1c5a0 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
1c5b0 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
1c5c0 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
1c5d0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
1c5e0 20 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20   int skipShared 
1c5f0 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
1c600 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20  TE_TEST.  int h 
1c610 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64  = pFile->h;.#end
1c620 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  if..  assert( pF
1c630 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
1c640 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  (("UNLOCK  %d %d
1c650 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70   was %d(%d,%d) p
1c660 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20  id=%d (afp)\n", 
1c670 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
1c680 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
1c690 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
1c6a0 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
1c6b0 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
1c6c0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  e->pInode->nShar
1c6d0 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  ed,.           o
1c6e0 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20  sGetpid(0)));.. 
1c6f0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
1c700 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
1c710 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
1c720 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65  eFileLock<=eFile
1c730 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
1c740 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1c750 7d 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  }.  pInode = pFi
1c760 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73 71  le->pInode;.  sq
1c770 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1c780 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d  r(pInode->pLockM
1c790 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
1c7a0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
1c7b0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
1c7c0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
1c7d0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
1c7e0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
1c7f0 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c  >eFileLock==pFil
1c800 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
1c810 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1c820 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
1c830 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1c840 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20  r( h=(-1) ).    
1c850 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1c860 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23  enign(0);.    .#
1c870 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1c880 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72  UG.    /* When r
1c890 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73  educing a lock s
1c8a0 75 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70  uch that other p
1c8b0 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61  rocesses can sta
1c8c0 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  rt.    ** readin
1c8d0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
1c8e0 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20  ile again, make 
1c8f0 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20  sure that the.  
1c900 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1c910 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64   counter was upd
1c920 61 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74  ated if any part
1c930 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1c940 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61  .    ** file cha
1c950 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72  nged.  If the tr
1c960 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
1c970 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64  r is not updated
1c980 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63  ,.    ** other c
1c990 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68  onnections to th
1c9a0 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68  e same file migh
1c9b0 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68  t not realize th
1c9c0 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  at.    ** the fi
1c9d0 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61  le has changed a
1c9e0 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e  nd hence might n
1c9f0 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68  ot know to flush
1ca00 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61   their.    ** ca
1ca10 63 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66  che.  The use of
1ca20 20 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63   a stale cache c
1ca30 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
1ca40 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
1ca50 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1ca60 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  t( pFile->inNorm
1ca70 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20  alWrite==0.     
1ca80 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e        || pFile->
1ca90 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20  dbUpdate==0.    
1caa0 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d         || pFile-
1cab0 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d  >transCntrChng==
1cac0 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  1 );.    pFile->
1cad0 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
1cae0 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20  0;.#endif.    . 
1caf0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46     if( pFile->eF
1cb00 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
1cb10 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  VE_LOCK ){.     
1cb20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
1cb30 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
1cb40 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
1cb50 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49  FIRST, SHARED_SI
1cb60 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ZE, 0);.      if
1cb70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1cb80 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  && (eFileLock==S
1cb90 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
1cba0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29  node->nShared>1)
1cbb0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f   ){.        /* o
1cbc0 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68  nly re-establish
1cbd0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
1cbe0 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
1cbf0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 68 61  .        int sha
1cc00 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48  redLockByte = SH
1cc10 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64  ARED_FIRST+pInod
1cc20 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20  e->sharedByte;. 
1cc30 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53         rc = afpS
1cc40 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
1cc50 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73  dbPath, pFile, s
1cc60 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
1cc70 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c  , 1);.      } el
1cc80 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69  se {.        ski
1cc90 70 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20  pShared = 1;.   
1cca0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1ccb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ccc0 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
1ccd0 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock>=PENDING_LO
1cce0 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
1ccf0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
1cd00 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
1cd10 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
1cd20 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a  , 1, 0);.    } .
1cd30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1cd40 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
1cd50 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52  eFileLock>=RESER
1cd60 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74  VED_LOCK && cont
1cd70 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b  ext->reserved ){
1cd80 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53  .      rc = afpS
1cd90 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
1cda0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
1cdb0 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
1cdc0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21   0);.      if( !
1cdd0 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63  rc ){ .        c
1cde0 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
1cdf0 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20   = 0; .      }. 
1ce00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
1ce10 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65  =SQLITE_OK && (e
1ce20 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
1ce30 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
1ce40 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20  >nShared>1)){.  
1ce50 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
1ce60 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
1ce70 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  OCK;.    }.  }. 
1ce80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ce90 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d  OK && eFileLock=
1cea0 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20  =NO_LOCK ){..   
1ceb0 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
1cec0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f  e shared lock co
1ced0 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20  unter.  Release 
1cee0 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61  the lock using a
1cef0 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c  n.    ** OS call
1cf00 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74   only when all t
1cf10 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73  hreads in this s
1cf20 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65  ame process have
1cf30 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a   released.    **
1cf40 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a   the lock..    *
1cf50 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c  /.    unsigned l
1cf60 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c  ong long sharedL
1cf70 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44  ockByte = SHARED
1cf80 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73  _FIRST+pInode->s
1cf90 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70  haredByte;.    p
1cfa0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d  Inode->nShared--
1cfb0 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
1cfc0 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a  ->nShared==0 ){.
1cfd0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1cfe0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
1cff0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1d000 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a  Error( h=(-1) ).
1d010 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1d020 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
1d030 20 20 20 20 20 20 69 66 28 20 21 73 6b 69 70 53        if( !skipS
1d040 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  hared ){.       
1d050 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
1d060 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
1d070 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
1d080 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a  ockByte, 1, 0);.
1d090 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1d0a0 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20  ( !rc ){.       
1d0b0 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
1d0c0 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
1d0d0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
1d0e0 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
1d0f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d100 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1d110 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1d120 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a  Inode->nLock--;.
1d130 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1d140 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29  node->nLock>=0 )
1d150 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  ;.      if( pIno
1d160 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 20 63  de->nLock==0 ) c
1d170 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70  losePendingFds(p
1d180 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  File);.    }.  }
1d190 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  .  .  sqlite3_mu
1d1a0 74 65 78 5f 6c 65 61 76 65 28 70 49 6e 6f 64 65  tex_leave(pInode
1d1b0 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20  ->pLockMutex);. 
1d1c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d1d0 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OK ){.    pFile-
1d1e0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
1d1f0 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 65  leLock;.  }.  re
1d200 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1d210 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26  * Close a file &
1d220 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65   cleanup AFP spe
1d230 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f  cific locking co
1d240 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63  ntext .*/.static
1d250 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73 71   int afpClose(sq
1d260 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
1d270 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1d280 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
1d290 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1d2a0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73  xFile*)id;.  ass
1d2b0 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
1d2c0 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  afpUnlock(id, NO
1d2d0 5f 4c 4f 43 4b 29 3b 0a 20 20 61 73 73 65 72 74  _LOCK);.  assert
1d2e0 28 20 75 6e 69 78 46 69 6c 65 4d 75 74 65 78 4e  ( unixFileMutexN
1d2f0 6f 74 68 65 6c 64 28 70 46 69 6c 65 29 20 29 3b  otheld(pFile) );
1d300 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
1d310 78 28 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  x();.  if( pFile
1d320 2d 3e 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20  ->pInode ){.    
1d330 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
1d340 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
1d350 49 6e 6f 64 65 3b 0a 20 20 20 20 73 71 6c 69 74  Inode;.    sqlit
1d360 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
1d370 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65  Inode->pLockMute
1d380 78 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f  x);.    if( pIno
1d390 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20  de->nLock ){.   
1d3a0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
1d3b0 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
1d3c0 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
1d3d0 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
1d3e0 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20  file just.      
1d3f0 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
1d400 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
1d410 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
1d420 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
1d430 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73  ile.      ** des
1d440 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64  criptor to pInod
1d450 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74  e->aPending.  It
1d460 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
1d470 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68  ically closed wh
1d480 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  en.      ** the 
1d490 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65  last lock is cle
1d4a0 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ared..      */. 
1d4b0 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46       setPendingF
1d4c0 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  d(pFile);.    }.
1d4d0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
1d4e0 78 5f 6c 65 61 76 65 28 70 49 6e 6f 64 65 2d 3e  x_leave(pInode->
1d4f0 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20 7d  pLockMutex);.  }
1d500 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49  .  releaseInodeI
1d510 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 73 71  nfo(pFile);.  sq
1d520 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
1d530 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
1d540 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55  );.  rc = closeU
1d550 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75  nixFile(id);.  u
1d560 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
1d570 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d580 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
1d590 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
1d5a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1d5b0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
1d5c0 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61  /*.** The code a
1d5d0 62 6f 76 65 20 69 73 20 74 68 65 20 41 46 50 20  bove is the AFP 
1d5e0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
1d5f0 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69  ion.  The code i
1d600 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f  s specific.** to
1d610 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73   MacOSX and does
1d620 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68   not work on oth
1d630 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d  er unix platform
1d640 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69  s.  No alternati
1d650 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  ve.** is availab
1d660 6c 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27  le.  If you don'
1d670 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20  t compile for a 
1d680 6d 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75  mac, then the "u
1d690 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20  nix-afp".** VFS 
1d6a0 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
1d6b0 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
1d6c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
1d6d0 66 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69  f the AFP lock i
1d6e0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
1d6f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d700 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
1d710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d750 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
1d760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d7a0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
1d7b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d7c0 2a 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b  * Begin NFS Lock
1d7d0 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
1d7e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d7f0 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e  ****/..#if defin
1d800 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
1d810 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1d820 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a  OCKING_STYLE./*.
1d830 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f   ** Lower the lo
1d840 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
1d850 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
1d860 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
1d870 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a  k.  eFileLock. *
1d880 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
1d890 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
1d8a0 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a  ED_LOCK.. **. **
1d8b0 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
1d8c0 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
1d8d0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
1d8e0 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
1d8f0 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75  low. ** the requ
1d900 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
1d910 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
1d920 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a  e is a no-op.. *
1d930 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73  /.static int nfs
1d940 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
1d950 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
1d960 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72  leLock){.  retur
1d970 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64  n posixUnlock(id
1d980 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b  , eFileLock, 1);
1d990 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  .}..#endif /* de
1d9a0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1d9b0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
1d9c0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
1d9d0 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  */./*.** The cod
1d9e0 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e  e above is the N
1d9f0 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FS lock implemen
1da00 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64  tation.  The cod
1da10 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a  e is specific.**
1da20 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64   to MacOSX and d
1da30 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
1da40 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66  other unix platf
1da50 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e  orms.  No altern
1da60 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69  ative.** is avai
1da70 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a  lable.  .**.****
1da80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1da90 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 4e 46 53  * End of the NFS
1daa0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
1dab0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
1dac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
1dad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1daf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1db00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1db10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
1db20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1db30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1db40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1db50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1db60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
1db70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f  ************* No
1db80 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65  n-locking sqlite
1db90 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a  3_file methods *
1dba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dbb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
1dbc0 2a 2a 20 54 68 65 20 6e 65 78 74 20 64 69 76 69  ** The next divi
1dbd0 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d  sion contains im
1dbe0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f  plementations fo
1dbf0 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66  r all methods of
1dc00 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33   the .** sqlite3
1dc10 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68  _file object oth
1dc20 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b  er than the lock
1dc30 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68  ing methods.  Th
1dc40 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74  e locking.** met
1dc50 68 6f 64 73 20 77 65 72 65 20 64 65 66 69 6e 65  hods were define
1dc60 64 20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61  d in divisions a
1dc70 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e  bove (one lockin
1dc80 67 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20  g method per.** 
1dc90 64 69 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73  division).  Thos
1dca0 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61  e methods that a
1dcb0 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  re common to all
1dcc0 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a   locking modes.*
1dcd0 2a 20 61 72 65 20 67 61 74 68 65 72 20 74 6f 67  * are gather tog
1dce0 65 74 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20  ether into this 
1dcf0 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a  division..*/../*
1dd00 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
1dd10 6f 66 66 73 65 74 20 70 61 73 73 65 64 20 61 73  offset passed as
1dd20 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1dd30 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20  ment, then read 
1dd40 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e  cnt .** bytes in
1dd50 74 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20  to pBuf. Return 
1dd60 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1dd70 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
1dd80 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66  d..**.** NB:  If
1dd90 20 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f   you define USE_
1dda0 50 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45  PREAD or USE_PRE
1ddb0 41 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69  AD64, then it mi
1ddc0 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e  ght also.** be n
1ddd0 65 63 65 73 73 61 72 79 20 74 6f 20 64 65 66 69  ecessary to defi
1dde0 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45  ne _XOPEN_SOURCE
1ddf0 20 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69   to be 500.  Thi
1de00 73 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a  s varies from.**
1de10 20 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61   one system to a
1de20 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53  nother.  Since S
1de30 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64  QLite does not d
1de40 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a  efine USE_PREAD.
1de50 2a 2a 20 69 6e 20 61 6e 79 20 66 6f 72 6d 20 62  ** in any form b
1de60 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69  y default, we wi
1de70 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  ll not attempt t
1de80 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f  o define _XOPEN_
1de90 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74  SOURCE..** See t
1dea0 69 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64  ickets #2741 and
1deb0 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f   #2681..**.** To
1dec0 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20   avoid stomping 
1ded0 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20  the errno value 
1dee0 6f 6e 20 61 20 66 61 69 6c 65 64 20 72 65 61 64  on a failed read
1def0 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76   the lastErrno v
1df00 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62  alue.** is set b
1df10 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
1df20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1df30 65 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46  eekAndRead(unixF
1df40 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33  ile *id, sqlite3
1df50 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76  _int64 offset, v
1df60 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63  oid *pBuf, int c
1df70 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a  nt){.  int got;.
1df80 20 20 69 6e 74 20 70 72 69 6f 72 20 3d 20 30 3b    int prior = 0;
1df90 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55  .#if (!defined(U
1dfa0 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65  SE_PREAD) && !de
1dfb0 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
1dfc0 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66  4)).  i64 newOff
1dfd0 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49  set;.#endif.  TI
1dfe0 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20 61 73 73  MER_START;.  ass
1dff0 65 72 74 28 20 63 6e 74 3d 3d 28 63 6e 74 26 30  ert( cnt==(cnt&0
1e000 78 31 66 66 66 66 29 20 29 3b 0a 20 20 61 73 73  x1ffff) );.  ass
1e010 65 72 74 28 20 69 64 2d 3e 68 3e 32 20 29 3b 0a  ert( id->h>2 );.
1e020 20 20 64 6f 7b 0a 23 69 66 20 64 65 66 69 6e 65    do{.#if define
1e030 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 20  d(USE_PREAD).   
1e040 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 28 69   got = osPread(i
1e050 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
1e060 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69   offset);.    Si
1e070 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67  mulateIOError( g
1e080 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66  ot = -1 );.#elif
1e090 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
1e0a0 41 44 36 34 29 0a 20 20 20 20 67 6f 74 20 3d 20  AD64).    got = 
1e0b0 6f 73 50 72 65 61 64 36 34 28 69 64 2d 3e 68 2c  osPread64(id->h,
1e0c0 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73   pBuf, cnt, offs
1e0d0 65 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  et);.    Simulat
1e0e0 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20  eIOError( got = 
1e0f0 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  -1 );.#else.    
1e100 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65  newOffset = lsee
1e110 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c  k(id->h, offset,
1e120 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20   SEEK_SET);.    
1e130 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1e140 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 2d 31 20   newOffset = -1 
1e150 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66  );.    if( newOf
1e160 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 20 20  fset<0 ){.      
1e170 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28  storeLastErrno((
1e180 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72  unixFile*)id, er
1e190 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75  rno);.      retu
1e1a0 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
1e1b0 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 69 64   got = osRead(id
1e1c0 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b  ->h, pBuf, cnt);
1e1d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
1e1e0 67 6f 74 3d 3d 63 6e 74 20 29 20 62 72 65 61 6b  got==cnt ) break
1e1f0 3b 0a 20 20 20 20 69 66 28 20 67 6f 74 3c 30 20  ;.    if( got<0 
1e200 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72  ){.      if( err
1e210 6e 6f 3d 3d 45 49 4e 54 52 20 29 7b 20 67 6f 74  no==EINTR ){ got
1e220 20 3d 20 31 3b 20 63 6f 6e 74 69 6e 75 65 3b 20   = 1; continue; 
1e230 7d 0a 20 20 20 20 20 20 70 72 69 6f 72 20 3d 20  }.      prior = 
1e240 30 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  0;.      storeLa
1e250 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c  stErrno((unixFil
1e260 65 2a 29 69 64 2c 20 20 65 72 72 6e 6f 29 3b 0a  e*)id,  errno);.
1e270 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e280 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3e 30   }else if( got>0
1e290 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d 3d   ){.      cnt -=
1e2a0 20 67 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66 73   got;.      offs
1e2b0 65 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20  et += got;.     
1e2c0 20 70 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a 20   prior += got;. 
1e2d0 20 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69       pBuf = (voi
1e2e0 64 2a 29 28 67 6f 74 20 2b 20 28 63 68 61 72 2a  d*)(got + (char*
1e2f0 29 70 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20  )pBuf);.    }.  
1e300 7d 77 68 69 6c 65 28 20 67 6f 74 3e 30 20 29 3b  }while( got>0 );
1e310 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20  .  TIMER_END;.  
1e320 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 20  OSTRACE(("READ  
1e330 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64    %-3d %5d %7lld
1e340 20 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20 20   %llu\n",.      
1e350 20 20 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f 74        id->h, got
1e360 2b 70 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d 70  +prior, offset-p
1e370 72 69 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41 50  rior, TIMER_ELAP
1e380 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  SED));.  return 
1e390 67 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a  got+prior;.}../*
1e3a0 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72  .** Read data fr
1e3b0 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61  om a file into a
1e3c0 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e   buffer.  Return
1e3d0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c   SQLITE_OK if al
1e3e0 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20  l.** bytes were 
1e3f0 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
1e400 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45  y and SQLITE_IOE
1e410 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  RR if anything g
1e420 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f  oes.** wrong..*/
1e430 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1e440 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  Read(.  sqlite3_
1e450 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69  file *id, .  voi
1e460 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20  d *pBuf, .  int 
1e470 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69  amt,.  sqlite3_i
1e480 6e 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20  nt64 offset.){. 
1e490 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1e4a0 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69   = (unixFile *)i
1e4b0 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20  d;.  int got;.  
1e4c0 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
1e4d0 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d  assert( offset>=
1e4e0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
1e4f0 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  mt>0 );..  /* If
1e500 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62   this is a datab
1e510 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  ase file (not a 
1e520 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d  journal, master-
1e530 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a  journal or temp.
1e540 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20    ** file), the 
1e550 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63  bytes in the loc
1e560 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c  king range shoul
1e570 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
1e580 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23  or written. */.#
1e590 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
1e5a0 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61  File->pPrealloca
1e5b0 74 65 64 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20  tedUnused==0.   
1e5c0 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50      || offset>=P
1e5d0 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a  ENDING_BYTE+512.
1e5e0 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
1e5f0 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59  +amt<=PENDING_BY
1e600 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a  TE .  );.#endif.
1e610 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1e620 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a  MMAP_SIZE>0.  /*
1e630 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75   Deal with as mu
1e640 63 68 20 6f 66 20 74 68 69 73 20 72 65 61 64 20  ch of this read 
1e650 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69  request as possi
1e660 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69  ble by transferi
1e670 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f  ng.  ** data fro
1e680 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70  m the memory map
1e690 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70  ping using memcp
1e6a0 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f  y().  */.  if( o
1e6b0 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61  ffset<pFile->mma
1e6c0 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28  pSize ){.    if(
1e6d0 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
1e6e0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
1e6f0 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
1e700 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46  Buf, &((u8 *)(pF
1e710 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
1e720 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74 29 3b  )[offset], amt);
1e730 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1e740 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1e750 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43  se{.      int nC
1e760 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  opy = pFile->mma
1e770 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  pSize - offset;.
1e780 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75        memcpy(pBu
1e790 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c  f, &((u8 *)(pFil
1e7a0 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
1e7b0 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b  offset], nCopy);
1e7c0 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28  .      pBuf = &(
1e7d0 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70  (u8 *)pBuf)[nCop
1e7e0 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d  y];.      amt -=
1e7f0 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66   nCopy;.      of
1e800 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20  fset += nCopy;. 
1e810 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1e820 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64  .  got = seekAnd
1e830 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73  Read(pFile, offs
1e840 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a  et, pBuf, amt);.
1e850 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29    if( got==amt )
1e860 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1e870 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20  ITE_OK;.  }else 
1e880 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
1e890 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65   /* lastErrno se
1e8a0 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64  t by seekAndRead
1e8b0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
1e8c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
1e8d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
1e8e0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
1e8f0 69 6c 65 2c 20 30 29 3b 20 20 20 2f 2a 20 6e 6f  ile, 0);   /* no
1e900 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72  t a system error
1e910 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61   */.    /* Unrea
1e920 64 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62  d parts of the b
1e930 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65  uffer must be ze
1e940 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20  ro-filled */.   
1e950 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a   memset(&((char*
1e960 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20  )pBuf)[got], 0, 
1e970 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65  amt-got);.    re
1e980 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1e990 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20  R_SHORT_READ;.  
1e9a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  }.}../*.** Attem
1e9b0 70 74 20 74 6f 20 73 65 65 6b 20 74 68 65 20 66  pt to seek the f
1e9c0 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70  ile-descriptor p
1e9d0 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
1e9e0 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a  st argument to.*
1e9f0 2a 20 61 62 73 6f 6c 75 74 65 20 6f 66 66 73 65  * absolute offse
1ea00 74 20 69 4f 66 66 2c 20 74 68 65 6e 20 61 74 74  t iOff, then att
1ea10 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 6e 42  empt to write nB
1ea20 75 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  uf bytes of data
1ea30 20 66 72 6f 6d 0a 2a 2a 20 70 42 75 66 20 74 6f   from.** pBuf to
1ea40 20 69 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72   it. If an error
1ea50 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
1ea60 2d 31 20 61 6e 64 20 73 65 74 20 2a 70 69 45 72  -1 and set *piEr
1ea70 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rno. Otherwise, 
1ea80 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61  .** return the a
1ea90 63 74 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  ctual number of 
1eaa0 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 28 77  bytes written (w
1eab0 68 69 63 68 20 6d 61 79 20 62 65 20 6c 65 73 73  hich may be less
1eac0 20 74 68 61 6e 0a 2a 2a 20 6e 42 75 66 29 2e 0a   than.** nBuf)..
1ead0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
1eae0 65 6b 41 6e 64 57 72 69 74 65 46 64 28 0a 20 20  ekAndWriteFd(.  
1eaf0 69 6e 74 20 66 64 2c 20 20 20 20 20 20 20 20 20  int fd,         
1eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb10 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
1eb20 6f 72 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a  or to write to *
1eb30 2f 0a 20 20 69 36 34 20 69 4f 66 66 2c 20 20 20  /.  i64 iOff,   
1eb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb50 20 20 20 20 2f 2a 20 46 69 6c 65 20 6f 66 66 73      /* File offs
1eb60 65 74 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74  et to begin writ
1eb70 69 6e 67 20 61 74 20 2a 2f 0a 20 20 63 6f 6e 73  ing at */.  cons
1eb80 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20  t void *pBuf,   
1eb90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1eba0 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68  opy data from th
1ebb0 69 73 20 62 75 66 66 65 72 20 74 6f 20 74 68 65  is buffer to the
1ebc0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
1ebd0 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
1ebe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1ebf0 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 42 75  ze of buffer pBu
1ec00 66 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  f in bytes */.  
1ec10 69 6e 74 20 2a 70 69 45 72 72 6e 6f 20 20 20 20  int *piErrno    
1ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec30 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6e 75  /* OUT: Error nu
1ec40 6d 62 65 72 20 69 66 20 65 72 72 6f 72 20 6f 63  mber if error oc
1ec50 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  curs */.){.  int
1ec60 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20   rc = 0;        
1ec70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ec80 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
1ec90 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  y system call */
1eca0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 42 75 66  ..  assert( nBuf
1ecb0 3d 3d 28 6e 42 75 66 26 30 78 31 66 66 66 66 29  ==(nBuf&0x1ffff)
1ecc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 64   );.  assert( fd
1ecd0 3e 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >2 );.  assert( 
1ece0 70 69 45 72 72 6e 6f 21 3d 30 20 29 3b 0a 20 20  piErrno!=0 );.  
1ecf0 6e 42 75 66 20 26 3d 20 30 78 31 66 66 66 66 3b  nBuf &= 0x1ffff;
1ed00 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
1ed10 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
1ed20 5f 50 52 45 41 44 29 0a 20 20 64 6f 7b 20 72 63  _PREAD).  do{ rc
1ed30 20 3d 20 28 69 6e 74 29 6f 73 50 77 72 69 74 65   = (int)osPwrite
1ed40 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66 2c  (fd, pBuf, nBuf,
1ed50 20 69 4f 66 66 29 3b 20 7d 77 68 69 6c 65 28 20   iOff); }while( 
1ed60 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
1ed70 49 4e 54 52 20 29 3b 0a 23 65 6c 69 66 20 64 65  INTR );.#elif de
1ed80 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
1ed90 34 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20 28 69  4).  do{ rc = (i
1eda0 6e 74 29 6f 73 50 77 72 69 74 65 36 34 28 66 64  nt)osPwrite64(fd
1edb0 2c 20 70 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f  , pBuf, nBuf, iO
1edc0 66 66 29 3b 7d 77 68 69 6c 65 28 20 72 63 3c 30  ff);}while( rc<0
1edd0 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
1ede0 29 3b 0a 23 65 6c 73 65 0a 20 20 64 6f 7b 0a 20  );.#else.  do{. 
1edf0 20 20 20 69 36 34 20 69 53 65 65 6b 20 3d 20 6c     i64 iSeek = l
1ee00 73 65 65 6b 28 66 64 2c 20 69 4f 66 66 2c 20 53  seek(fd, iOff, S
1ee10 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53 69  EEK_SET);.    Si
1ee20 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 69  mulateIOError( i
1ee30 53 65 65 6b 20 3d 20 2d 31 20 29 3b 0a 20 20 20  Seek = -1 );.   
1ee40 20 69 66 28 20 69 53 65 65 6b 3c 30 20 29 7b 0a   if( iSeek<0 ){.
1ee50 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1ee60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ee70 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73 57 72 69  }.    rc = osWri
1ee80 74 65 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75  te(fd, pBuf, nBu
1ee90 66 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63  f);.  }while( rc
1eea0 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
1eeb0 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  TR );.#endif..  
1eec0 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54  TIMER_END;.  OST
1eed0 52 41 43 45 28 28 22 57 52 49 54 45 20 20 20 25  RACE(("WRITE   %
1eee0 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c  -3d %5d %7lld %l
1eef0 6c 75 5c 6e 22 2c 20 66 64 2c 20 72 63 2c 20 69  lu\n", fd, rc, i
1ef00 4f 66 66 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53  Off, TIMER_ELAPS
1ef10 45 44 29 29 3b 0a 0a 20 20 69 66 28 20 72 63 3c  ED));..  if( rc<
1ef20 30 20 29 20 2a 70 69 45 72 72 6e 6f 20 3d 20 65  0 ) *piErrno = e
1ef30 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 72  rrno;.  return r
1ef40 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 65  c;.}.../*.** See
1ef50 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  k to the offset 
1ef60 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68  in id->offset th
1ef70 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74 65  en read cnt byte
1ef80 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20  s into pBuf..** 
1ef90 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1efa0 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
1efb0 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61 74  lly read.  Updat
1efc0 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a  e the offset..**
1efd0 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f  .** To avoid sto
1efe0 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20  mping the errno 
1eff0 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65  value on a faile
1f000 64 20 77 72 69 74 65 20 74 68 65 20 6c 61 73 74  d write the last
1f010 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69  Errno value.** i
1f020 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74  s set before ret
1f030 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
1f040 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69  c int seekAndWri
1f050 74 65 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c  te(unixFile *id,
1f060 20 69 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e   i64 offset, con
1f070 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  st void *pBuf, i
1f080 6e 74 20 63 6e 74 29 7b 0a 20 20 72 65 74 75 72  nt cnt){.  retur
1f090 6e 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64  n seekAndWriteFd
1f0a0 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20  (id->h, offset, 
1f0b0 70 42 75 66 2c 20 63 6e 74 2c 20 26 69 64 2d 3e  pBuf, cnt, &id->
1f0c0 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 7d 0a 0a 0a  lastErrno);.}...
1f0d0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61  /*.** Write data
1f0e0 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69   from a buffer i
1f0f0 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74  nto a file.  Ret
1f100 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
1f110 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73   success.** or s
1f120 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
1f130 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e  code on failure.
1f140 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1f150 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69  nixWrite(.  sqli
1f160 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20  te3_file *id, . 
1f170 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
1f180 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20  f, .  int amt,. 
1f190 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
1f1a0 66 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78  ffset .){.  unix
1f1b0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
1f1c0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
1f1d0 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20  nt wrote = 0;.  
1f1e0 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
1f1f0 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b  assert( amt>0 );
1f200 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1f210 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  s a database fil
1f220 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c  e (not a journal
1f230 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  , master-journal
1f240 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69   or temp.  ** fi
1f250 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69  le), the bytes i
1f260 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61  n the locking ra
1f270 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  nge should never
1f280 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74   be read or writ
1f290 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20  ten. */.#if 0.  
1f2a0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
1f2b0 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73  PreallocatedUnus
1f2c0 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ed==0.       || 
1f2d0 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f  offset>=PENDING_
1f2e0 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20  BYTE+512.       
1f2f0 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50  || offset+amt<=P
1f300 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29  ENDING_BYTE .  )
1f310 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
1f320 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1f330 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  /* If we are doi
1f340 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74  ng a normal writ
1f350 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  e to a database 
1f360 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64  file (as opposed
1f370 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61   to.  ** doing a
1f380 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
1f390 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65  lback or a write
1f3a0 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74   to some file ot
1f3b0 68 65 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20  her than a.  ** 
1f3c0 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20  normal database 
1f3d0 66 69 6c 65 29 20 74 68 65 6e 20 72 65 63 6f 72  file) then recor
1f3e0 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
1f3f0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
1f400 2a 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20  * has changed.  
1f410 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
1f420 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f  on counter is mo
1f430 64 69 66 69 65 64 2c 20 72 65 63 6f 72 64 20 74  dified, record t
1f440 68 61 74 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f  hat.  ** fact to
1f450 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  o..  */.  if( pF
1f460 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
1f470 74 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  te ){.    pFile-
1f480 3e 64 62 55 70 64 61 74 65 20 3d 20 31 3b 20 20  >dbUpdate = 1;  
1f490 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1f4a0 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
1f4b0 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 66  d */.    if( off
1f4c0 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66 73 65  set<=24 && offse
1f4d0 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20  t+amt>=27 ){.   
1f4e0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
1f4f0 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d   char oldCntr[4]
1f500 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
1f510 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
1f520 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 65  ;.      rc = see
1f530 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20  kAndRead(pFile, 
1f540 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b  24, oldCntr, 4);
1f550 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
1f560 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
1f570 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 34  .      if( rc!=4
1f580 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e   || memcmp(oldCn
1f590 74 72 2c 20 26 28 28 63 68 61 72 2a 29 70 42 75  tr, &((char*)pBu
1f5a0 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34  f)[24-offset], 4
1f5b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1f5c0 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
1f5d0 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68  Chng = 1;  /* Th
1f5e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
1f5f0 75 6e 74 65 72 20 68 61 73 20 63 68 61 6e 67 65  unter has change
1f600 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  d */.      }.   
1f610 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23   }.  }.#endif..#
1f620 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1f630 45 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45  E_MMAP_READWRITE
1f640 29 20 26 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) && SQLITE_MAX_
1f650 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a  MMAP_SIZE>0.  /*
1f660 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75   Deal with as mu
1f670 63 68 20 6f 66 20 74 68 69 73 20 77 72 69 74 65  ch of this write
1f680 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73   request as poss
1f690 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72  ible by transfer
1f6a0 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72  ing.  ** data fr
1f6b0 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61  om the memory ma
1f6c0 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63  pping using memc
1f6d0 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20  py().  */.  if( 
1f6e0 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d  offset<pFile->mm
1f6f0 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66  apSize ){.    if
1f700 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20  ( offset+amt <= 
1f710 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1f720 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
1f730 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
1f740 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
1f750 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29  set], pBuf, amt)
1f760 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1f770 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1f780 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
1f790 43 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d  Copy = pFile->mm
1f7a0 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  apSize - offset;
1f7b0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28  .      memcpy(&(
1f7c0 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
1f7d0 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
1f7e0 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29  t], pBuf, nCopy)
1f7f0 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26  ;.      pBuf = &
1f800 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f  ((u8 *)pBuf)[nCo
1f810 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d  py];.      amt -
1f820 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f  = nCopy;.      o
1f830 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a  ffset += nCopy;.
1f840 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1f850 0a 20 0a 20 20 77 68 69 6c 65 28 20 28 77 72 6f  . .  while( (wro
1f860 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74  te = seekAndWrit
1f870 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c  e(pFile, offset,
1f880 20 70 42 75 66 2c 20 61 6d 74 29 29 3c 61 6d 74   pBuf, amt))<amt
1f890 20 26 26 20 77 72 6f 74 65 3e 30 20 29 7b 0a 20   && wrote>0 ){. 
1f8a0 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b     amt -= wrote;
1f8b0 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77  .    offset += w
1f8c0 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d  rote;.    pBuf =
1f8d0 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b   &((char*)pBuf)[
1f8e0 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69  wrote];.  }.  Si
1f8f0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20  mulateIOError(( 
1f900 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d  wrote=(-1), amt=
1f910 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  1 ));.  Simulate
1f920 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20  DiskfullError(( 
1f930 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29  wrote=0, amt=1 )
1f940 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e 77 72  );..  if( amt>wr
1f950 6f 74 65 20 29 7b 0a 20 20 20 20 69 66 28 20 77  ote ){.    if( w
1f960 72 6f 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d  rote<0 && pFile-
1f970 3e 6c 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53  >lastErrno!=ENOS
1f980 50 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c  PC ){.      /* l
1f990 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20  astErrno set by 
1f9a0 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a  seekAndWrite */.
1f9b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1f9c0 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
1f9d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f9e0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
1f9f0 28 70 46 69 6c 65 2c 20 30 29 3b 20 2f 2a 20 6e  (pFile, 0); /* n
1fa00 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f  ot a system erro
1fa10 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  r */.      retur
1fa20 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
1fa30 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
1fa40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1fa50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1fa60 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  EST./*.** Count 
1fa70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75  the number of fu
1fa80 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d  llsyncs and norm
1fa90 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20  al syncs.  This 
1faa0 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a  is used to test.
1fab0 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e  ** that syncs an
1fac0 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20  d fullsyncs are 
1fad0 6f 63 63 75 72 72 69 6e 67 20 61 74 20 74 68 65  occurring at the
1fae0 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f   right times..*/
1faf0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e  .int sqlite3_syn
1fb00 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74  c_count = 0;.int
1fb10 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
1fb20 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  c_count = 0;.#en
1fb30 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f  dif../*.** We do
1fb40 20 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74 65   not trust syste
1fb50 6d 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20  ms to provide a 
1fb60 77 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79 6e  working fdatasyn
1fb70 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a  c().  Some do..*
1fb80 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20  * Others do no. 
1fb90 20 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65 20   To be safe, we 
1fba0 77 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68 20  will stick with 
1fbb0 74 68 65 20 28 73 6c 69 67 68 74 6c 79 20 73 6c  the (slightly sl
1fbc0 6f 77 65 72 29 0a 2a 2a 20 66 73 79 6e 63 28 29  ower).** fsync()
1fbd0 2e 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68  . If you know th
1fbe0 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64  at your system d
1fbf0 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74  oes support fdat
1fc00 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c  async() correctl
1fc10 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c  y,.** then simpl
1fc20 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d  y compile with -
1fc30 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61  Dfdatasync=fdata
1fc40 73 79 6e 63 20 6f 72 20 2d 44 48 41 56 45 5f 46  sync or -DHAVE_F
1fc50 44 41 54 41 53 59 4e 43 0a 2a 2f 0a 23 69 66 20  DATASYNC.*/.#if 
1fc60 21 64 65 66 69 6e 65 64 28 66 64 61 74 61 73 79  !defined(fdatasy
1fc70 6e 63 29 20 26 26 20 21 48 41 56 45 5f 46 44 41  nc) && !HAVE_FDA
1fc80 54 41 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  TASYNC.# define 
1fc90 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a  fdatasync fsync.
1fca0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
1fcb0 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
1fcc0 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65  YNC to 0 or 1 de
1fcd0 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
1fce0 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65  er or not.** the
1fcf0 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63   F_FULLFSYNC mac
1fd00 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20  ro is defined.  
1fd10 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63  F_FULLFSYNC is c
1fd20 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79  urrently.** only
1fd30 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61   available on Ma
1fd40 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61  c OS X.  But tha
1fd50 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a  t could change..
1fd60 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c  */.#ifdef F_FULL
1fd70 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48  FSYNC.# define H
1fd80 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a  AVE_FULLFSYNC 1.
1fd90 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48  #else.# define H
1fda0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a  AVE_FULLFSYNC 0.
1fdb0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1fdc0 51 4c 49 54 45 5f 55 53 45 5f 52 45 51 55 45 53  QLITE_USE_REQUES
1fdd0 54 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 69 6d 70  T_FULLFSYNC.#imp
1fde0 6f 72 74 20 3c 6e 6f 74 69 66 79 2e 68 3e 0a 23  ort <notify.h>.#
1fdf0 69 6d 70 6f 72 74 20 3c 6c 69 62 6b 65 72 6e 2f  import <libkern/
1fe00 4f 53 41 74 6f 6d 69 63 2e 68 3e 0a 73 74 61 74  OSAtomic.h>.stat
1fe10 69 63 20 4f 53 53 70 69 6e 4c 6f 63 6b 20 6e 6f  ic OSSpinLock no
1fe20 74 69 66 79 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 23  tify_lock = 0;.#
1fe30 64 65 66 69 6e 65 20 52 45 51 55 45 53 54 5f 46  define REQUEST_F
1fe40 55 4c 4c 53 59 4e 43 5f 4e 4f 54 49 46 49 43 41  ULLSYNC_NOTIFICA
1fe50 54 49 4f 4e 20 20 20 20 22 63 6f 6d 2e 61 70 70  TION    "com.app
1fe60 6c 65 2e 72 65 71 73 79 6e 63 22 0a 23 65 6e 64  le.reqsync".#end
1fe70 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73  if../*.** The fs
1fe80 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ync() system cal
1fe90 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  l does not work 
1fea0 61 73 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e  as advertised on
1feb0 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79   many.** unix sy
1fec0 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c  stems.  The foll
1fed0 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20  owing procedure 
1fee0 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
1fef0 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b   make.** it work
1ff00 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   better..**.** T
1ff10 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
1ff20 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73  C macro disables
1ff30 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20   all fsync()s.  
1ff40 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a  This is useful.*
1ff50 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68  * for testing wh
1ff60 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75  en we want to ru
1ff70 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 65  n through the te
1ff80 73 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79  st suite quickly
1ff90 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72  ..** You are str
1ffa0 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e  ongly advised *n
1ffb0 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69  ot* to deploy wi
1ffc0 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  th SQLITE_NO_SYN
1ffd0 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f  C.** enabled, ho
1ffe0 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74  wever, since wit
1fff0 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  h SQLITE_NO_SYNC
20000 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20   enabled, an OS 
20010 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65  crash.** or powe
20020 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c  r failure will l
20030 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68  ikely corrupt th
20040 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
20050 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65  .**.** SQLite se
20060 74 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20  ts the dataOnly 
20070 66 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a 65  flag if the size
20080 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
20090 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68  unchanged..** Th
200a0 65 20 69 64 65 61 20 62 65 68 69 6e 64 20 64 61  e idea behind da
200b0 74 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69  taOnly is that i
200c0 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72  t should only wr
200d0 69 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e  ite the file con
200e0 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c  tent.** to disk,
200f0 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20   not the inode. 
20100 20 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74   We only set dat
20110 61 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c  aOnly if the fil
20120 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e  e size is .** un
20130 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68  changed since th
20140 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70  e file size is p
20150 61 72 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65  art of the inode
20160 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20  .  However, .** 
20170 54 65 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75  Ted Ts'o tells u
20180 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63  s that fdatasync
20190 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69  () will also wri
201a0 74 65 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20  te the inode if 
201b0 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65  the.** file size
201c0 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54   has changed.  T
201d0 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66  he only real dif
201e0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
201f0 66 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61  fdatasync().** a
20200 6e 64 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20  nd fsync(), Ted 
20210 74 65 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61  tells us, is tha
20220 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69  t fdatasync() wi
20230 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65  ll not flush the
20240 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65  .** inode if the
20250 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20   mtime or owner 
20260 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61  or other inode a
20270 74 74 72 69 62 75 74 65 73 20 68 61 76 65 20 63  ttributes have c
20280 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e  hanged..** We on
20290 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ly care about th
202a0 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74  e file size, not
202b0 20 74 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20   the other file 
202c0 61 74 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a  attributes, so.*
202d0 2a 20 61 73 20 66 61 72 20 61 73 20 53 51 4c 69  * as far as SQLi
202e0 74 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c  te is concerned,
202f0 20 61 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20   an fdatasync() 
20300 69 73 20 61 6c 77 61 79 73 20 61 64 65 71 75 61  is always adequa
20310 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c  te..** So, we al
20320 77 61 79 73 20 75 73 65 20 66 64 61 74 61 73 79  ways use fdatasy
20330 6e 63 28 29 20 69 66 20 69 74 20 69 73 20 61 76  nc() if it is av
20340 61 69 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c  ailable, regardl
20350 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61  ess of.** the va
20360 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f  lue of the dataO
20370 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61  nly flag..*/.sta
20380 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79  tic int full_fsy
20390 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66  nc(int fd, int f
203a0 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74  ullSync, int dat
203b0 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63  aOnly){.  int rc
203c0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
203d0 6f 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69  owing "ifdef/eli
203e0 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68  f/else/" block h
203f0 61 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 75  as the same stru
20400 63 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68  cture as.  ** th
20410 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20  e one below. It 
20420 69 73 20 72 65 70 6c 69 63 61 74 65 64 20 68 65  is replicated he
20430 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f  re solely to avo
20440 69 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20  id cluttering . 
20450 20 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20   ** up the real 
20460 63 6f 64 65 20 77 69 74 68 20 74 68 65 20 55 4e  code with the UN
20470 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29  USED_PARAMETER()
20480 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69   macros..  */.#i
20490 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
204a0 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  YNC.  UNUSED_PAR
204b0 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e  AMETER(fd);.  UN
204c0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
204d0 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53  ullSync);.  UNUS
204e0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
204f0 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41  aOnly);.#elif HA
20500 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55  VE_FULLFSYNC.  U
20510 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
20520 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65  dataOnly);.#else
20530 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
20540 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  TER(fullSync);. 
20550 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
20560 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e  R(dataOnly);.#en
20570 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64  dif..  /* Record
20580 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
20590 69 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20  imes that we do 
205a0 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29  a normal fsync()
205b0 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53   and .  ** FULLS
205c0 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73  YNC.  This is us
205d0 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ed during testin
205e0 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  g to verify that
205f0 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a   this procedure.
20600 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64    ** gets called
20610 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
20620 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a  t arguments..  *
20630 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
20640 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53  TEST.  if( fullS
20650 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75  ync ) sqlite3_fu
20660 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  llsync_count++;.
20670 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63    sqlite3_sync_c
20680 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ount++;.#endif..
20690 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69    /* If we compi
206a0 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c  led with the SQL
206b0 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67  ITE_NO_SYNC flag
206c0 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69  , then syncing i
206d0 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 2e 20  s a.  ** no-op. 
206e0 20 42 75 74 20 67 6f 20 61 68 65 61 64 20 61 6e   But go ahead an
206f0 64 20 63 61 6c 6c 20 66 73 74 61 74 28 29 20 74  d call fstat() t
20700 6f 20 76 61 6c 69 64 61 74 65 20 74 68 65 20 66  o validate the f
20710 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70  ile.  ** descrip
20720 74 6f 72 20 61 73 20 77 65 20 6e 65 65 64 20 61  tor as we need a
20730 20 6d 65 74 68 6f 64 20 74 6f 20 70 72 6f 76 6f   method to provo
20740 6b 65 20 61 20 66 61 69 6c 75 72 65 20 64 75 72  ke a failure dur
20750 69 6e 67 0a 20 20 2a 2a 20 63 6f 76 65 72 61 74  ing.  ** coverat
20760 65 20 74 65 73 74 69 6e 67 2e 0a 20 20 2a 2f 0a  e testing..  */.
20770 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  #ifdef SQLITE_NO
20780 5f 53 59 4e 43 0a 20 20 7b 0a 20 20 20 20 73 74  _SYNC.  {.    st
20790 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
207a0 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28     rc = osFstat(
207b0 66 64 2c 20 26 62 75 66 29 3b 0a 20 20 7d 0a 23  fd, &buf);.  }.#
207c0 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53  elif HAVE_FULLFS
207d0 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  YNC.  if( fullSy
207e0 6e 63 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  nc ){.#ifdef SQL
207f0 49 54 45 5f 55 53 45 5f 52 45 51 55 45 53 54 5f  ITE_USE_REQUEST_
20800 46 55 4c 4c 46 53 59 4e 43 0a 20 20 20 20 72 63  FULLFSYNC.    rc
20810 20 3d 20 6f 73 46 73 79 6e 63 28 66 64 29 3b 0a   = osFsync(fd);.
20820 20 20 20 20 69 66 20 28 21 72 63 29 20 7b 0a 20      if (!rc) {. 
20830 20 20 20 20 20 4f 53 53 70 69 6e 4c 6f 63 6b 4c       OSSpinLockL
20840 6f 63 6b 28 26 6e 6f 74 69 66 79 5f 6c 6f 63 6b  ock(&notify_lock
20850 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 6f  );.      rc = no
20860 74 69 66 79 5f 70 6f 73 74 28 52 45 51 55 45 53  tify_post(REQUES
20870 54 5f 46 55 4c 4c 53 59 4e 43 5f 4e 4f 54 49 46  T_FULLSYNC_NOTIF
20880 49 43 41 54 49 4f 4e 29 3b 0a 20 20 20 20 20 20  ICATION);.      
20890 4f 53 53 70 69 6e 4c 6f 63 6b 55 6e 6c 6f 63 6b  OSSpinLockUnlock
208a0 28 26 6e 6f 74 69 66 79 5f 6c 6f 63 6b 29 3b 0a  (&notify_lock);.
208b0 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
208c0 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c  rc = osFcntl(fd,
208d0 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29   F_FULLFSYNC, 0)
208e0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
208f0 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  {.    rc = 1;.  
20900 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55  }.  /* If the FU
20910 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20  LLFSYNC failed, 
20920 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74  fall back to att
20930 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63  empting an fsync
20940 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75  ()..  ** It shou
20950 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c  ldn't be possibl
20960 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20  e for fullfsync 
20970 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c  to fail on the l
20980 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  ocal .  ** file 
20990 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c  system (on OSX),
209a0 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69   so failure indi
209b0 63 61 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46  cates that FULLF
209c0 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20  SYNC.  ** isn't 
209d0 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68  supported for th
209e0 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20  is file system. 
209f0 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66  So, attempt an f
20a00 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28  sync .  ** and (
20a10 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20  for now) ignore 
20a20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20  the overhead of 
20a30 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63  a superfluous fc
20a40 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a  ntl call.  .  **
20a50 20 49 74 27 64 20 62 65 20 62 65 74 74 65 72 20   It'd be better 
20a60 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73  to detect fullfs
20a70 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65  ync support once
20a80 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a   and avoid .  **
20a90 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20   the fcntl call 
20aa0 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20  every time sync 
20ab0 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a  is called..  */.
20ac0 20 20 69 66 28 20 72 63 20 29 20 72 63 20 3d 20    if( rc ) rc = 
20ad0 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69  fsync(fd);..#eli
20ae0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
20af0 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61 73  E__).  /* fdatas
20b00 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f  ync() on HFS+ do
20b10 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20  esn't yet flush 
20b20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66  the file size if
20b30 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72   it changed corr
20b40 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75  ectly.  ** so cu
20b50 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75  rrently we defau
20b60 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20  lt to the macro 
20b70 74 68 61 74 20 72 65 64 65 66 69 6e 65 73 20 66  that redefines f
20b80 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e  datasync to fsyn
20b90 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73  c.  */.  rc = fs
20ba0 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a  ync(fd);.#else .
20bb0 20 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63    rc = fdatasync
20bc0 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57  (fd);.#if OS_VXW
20bd0 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d  ORKS.  if( rc==-
20be0 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54  1 && errno==ENOT
20bf0 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  SUP ){.    rc = 
20c00 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23  fsync(fd);.  }.#
20c10 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
20c20 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  RKS */.#endif /*
20c30 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f   ifdef SQLITE_NO
20c40 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f  _SYNC elif HAVE_
20c50 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20  FULLFSYNC */..  
20c60 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26  if( OS_VXWORKS &
20c70 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20  & rc!= -1 ){.   
20c80 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72   rc = 0;.  }.  r
20c90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20ca0 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64  ** Open a file d
20cb0 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
20cc0 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
20cd0 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65  ining file zFile
20ce0 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63  name..** If succ
20cf0 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20  essful, *pFd is 
20d00 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65  set to the opene
20d10 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
20d20 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  r and.** SQLITE_
20d30 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
20d40 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
20d50 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54  rs, either SQLIT
20d60 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51  E_NOMEM.** or SQ
20d70 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73  LITE_CANTOPEN is
20d80 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
20d90 46 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  Fd is set to an 
20da0 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c  undefined.** val
20db0 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  ue..**.** The di
20dc0 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73  rectory file des
20dd0 63 72 69 70 74 6f 72 20 69 73 20 75 73 65 64 20  criptor is used 
20de0 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20 74 68 69  for only one thi
20df0 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e 63  ng - to.** fsync
20e00 28 29 20 61 20 64 69 72 65 63 74 6f 72 79 20 74  () a directory t
20e10 6f 20 6d 61 6b 65 20 73 75 72 65 20 66 69 6c 65  o make sure file
20e20 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 64 65   creation and de
20e30 6c 65 74 69 6f 6e 20 65 76 65 6e 74 73 0a 2a 2a  letion events.**
20e40 20 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20   are flushed to 
20e50 64 69 73 6b 2e 20 20 53 75 63 68 20 66 73 79 6e  disk.  Such fsyn
20e60 63 73 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65  cs are not neede
20e70 64 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a 6f  d on newer.** jo
20e80 75 72 6e 61 6c 69 6e 67 20 66 69 6c 65 73 79 73  urnaling filesys
20e90 74 65 6d 73 2c 20 62 75 74 20 61 72 65 20 72 65  tems, but are re
20ea0 71 75 69 72 65 64 20 6f 6e 20 6f 6c 64 65 72 20  quired on older 
20eb0 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a  filesystems..**.
20ec0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
20ed0 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65  can be overridde
20ee0 6e 20 75 73 69 6e 67 20 74 68 65 20 78 53 65 74  n using the xSet
20ef0 53 79 73 43 61 6c 6c 20 69 6e 74 65 72 66 61 63  SysCall interfac
20f00 65 2e 0a 2a 2a 20 54 68 65 20 61 62 69 6c 69 74  e..** The abilit
20f10 79 20 74 6f 20 6f 76 65 72 72 69 64 65 20 74 68  y to override th
20f20 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 61  is routine was a
20f30 64 64 65 64 20 69 6e 20 73 75 70 70 6f 72 74 20  dded in support 
20f40 6f 66 20 74 68 65 0a 2a 2a 20 63 68 72 6f 6d 69  of the.** chromi
20f50 75 6d 20 73 61 6e 64 62 6f 78 2e 20 20 4f 70 65  um sandbox.  Ope
20f60 6e 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79  ning a directory
20f70 20 69 73 20 61 20 73 65 63 75 72 69 74 79 20 72   is a security r
20f80 69 73 6b 20 28 77 65 20 61 72 65 0a 2a 2a 20 74  isk (we are.** t
20f90 6f 6c 64 29 20 73 6f 20 6d 61 6b 69 6e 67 20 69  old) so making i
20fa0 74 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 61  t overrideable a
20fb0 6c 6c 6f 77 73 20 74 68 65 20 63 68 72 6f 6d 69  llows the chromi
20fc0 75 6d 20 73 61 6e 64 62 6f 78 20 74 6f 0a 2a 2a  um sandbox to.**
20fd0 20 72 65 70 6c 61 63 65 20 74 68 69 73 20 72 6f   replace this ro
20fe0 75 74 69 6e 65 20 77 69 74 68 20 61 20 68 61 72  utine with a har
20ff0 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 20 54 6f  mless no-op.  To
21000 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 75 74 69   make this routi
21010 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20 72  ne.** a no-op, r
21020 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 20 61  eplace it with a
21030 20 73 74 75 62 20 74 68 61 74 20 72 65 74 75 72   stub that retur
21040 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74  ns SQLITE_OK but
21050 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 70 46 64 20   leaves.** *pFd 
21060 73 65 74 20 74 6f 20 61 20 6e 65 67 61 74 69 76  set to a negativ
21070 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
21080 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
21090 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61  returned, the ca
210a0 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
210b0 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a  ble for closing.
210c0 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ** the file desc
210d0 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e  riptor *pFd usin
210e0 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74  g close()..*/.st
210f0 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72  atic int openDir
21100 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
21110 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e  r *zFilename, in
21120 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69  t *pFd){.  int i
21130 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  i;.  int fd = -1
21140 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d  ;.  char zDirnam
21150 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  e[MAX_PATHNAME+1
21160 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
21170 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
21180 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22  AME, zDirname, "
21190 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  %s", zFilename);
211a0 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73  .  for(ii=(int)s
211b0 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b  trlen(zDirname);
211c0 20 69 69 3e 30 20 26 26 20 7a 44 69 72 6e 61 6d   ii>0 && zDirnam
211d0 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d  e[ii]!='/'; ii--
211e0 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b  );.  if( ii>0 ){
211f0 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69  .    zDirname[ii
21200 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 65 6c 73  ] = '\0';.  }els
21210 65 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72 6e  e{.    if( zDirn
21220 61 6d 65 5b 30 5d 21 3d 27 2f 27 20 29 20 7a 44  ame[0]!='/' ) zD
21230 69 72 6e 61 6d 65 5b 30 5d 20 3d 20 27 2e 27 3b  irname[0] = '.';
21240 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 31 5d  .    zDirname[1]
21250 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 64 20 3d   = 0;.  }.  fd =
21260 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44 69   robust_open(zDi
21270 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c  rname, O_RDONLY|
21280 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20  O_BINARY, 0);.  
21290 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20  if( fd>=0 ){.   
212a0 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44   OSTRACE(("OPEND
212b0 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66  IR %-3d %s\n", f
212c0 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20  d, zDirname));. 
212d0 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a   }.  *pFd = fd;.
212e0 20 20 69 66 28 20 66 64 3e 3d 30 20 29 20 72 65    if( fd>=0 ) re
212f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21300 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
21310 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
21320 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
21330 6e 44 69 72 65 63 74 6f 72 79 22 2c 20 7a 44 69  nDirectory", zDi
21340 72 6e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rname);.}../*.**
21350 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
21360 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
21370 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
21380 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
21390 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f  ..**.** If dataO
213a0 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68  nly==0 then both
213b0 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66   the file itself
213c0 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74   and its metadat
213d0 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c  a (file.** size,
213e0 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74   access time, et
213f0 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20  c) are synced.  
21400 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74  If dataOnly!=0 t
21410 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  hen only the.** 
21420 66 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e  file data is syn
21430 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72  ced..**.** Under
21440 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65   Unix, also make
21450 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64   sure that the d
21460 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
21470 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68  or the file.** h
21480 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  as been created 
21490 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65  by fsync-ing the
214a0 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
214b0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c  contains the fil
214c0 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e  e..** If we do n
214d0 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77  ot do this and w
214e0 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f  e encounter a po
214f0 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
21500 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e   directory.** en
21510 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
21520 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78  nal might not ex
21530 69 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62  ist after we reb
21540 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a  oot.  The next.*
21550 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65  * SQLite to acce
21560 73 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c  ss the file will
21570 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74   not know that t
21580 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  he journal exist
21590 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  s (because.** th
215a0 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
215b0 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
215c0 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61  l was never crea
215d0 74 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61  ted) and the tra
215e0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c  nsaction.** will
215f0 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d   not roll back -
21600 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e   possibly leadin
21610 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  g to database co
21620 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
21630 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63  tic int unixSync
21640 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
21650 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  d, int flags){. 
21660 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46   int rc;.  unixF
21670 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
21680 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69  ixFile*)id;..  i
21690 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20  nt isDataOnly = 
216a0 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59  (flags&SQLITE_SY
216b0 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20  NC_DATAONLY);.  
216c0 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d  int isFullsync =
216d0 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
216e0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
216f0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
21700 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  t one of SQLITE_
21710 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46  SYNC_NORMAL or F
21720 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a  ULL was passed *
21730 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67  /.  assert((flag
21740 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
21750 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20  SYNC_NORMAL.    
21760 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46    || (flags&0x0F
21770 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
21780 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55  ULL.  );..  /* U
21790 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20  nix cannot, but 
217a0 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79  some systems may
217b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
217c0 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54  ULL from here. T
217d0 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73  his.  ** line is
217e0 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f   to test that do
217f0 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20  ing so does not 
21800 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65  cause any proble
21810 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ms..  */.  Simul
21820 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
21830 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
21840 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72  FULL );..  asser
21850 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
21860 54 52 41 43 45 28 28 22 53 59 4e 43 20 20 20 20  TRACE(("SYNC    
21870 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %-3d\n", pFile->
21880 68 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c  h));.  rc = full
21890 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c  _fsync(pFile->h,
218a0 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44   isFullsync, isD
218b0 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75  ataOnly);.  Simu
218c0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
218d0 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  1 );.  if( rc ){
218e0 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
218f0 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
21900 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e  );.    return un
21910 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
21920 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22  E_IOERR_FSYNC, "
21930 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46 69  full_fsync", pFi
21940 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
21950 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73 79 6e 63  .  /* Also fsync
21960 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63   the directory c
21970 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69  ontaining the fi
21980 6c 65 20 69 66 20 74 68 65 20 44 49 52 53 59 4e  le if the DIRSYN
21990 43 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73  C flag.  ** is s
219a0 65 74 2e 20 20 54 68 69 73 20 69 73 20 61 20 6f  et.  This is a o
219b0 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72 72 65 6e  ne-time occurren
219c0 63 65 2e 20 20 4d 61 6e 79 20 73 79 73 74 65 6d  ce.  Many system
219d0 73 20 28 65 78 61 6d 70 6c 65 73 3a 20 41 49 58  s (examples: AIX
219e0 29 0a 20 20 2a 2a 20 61 72 65 20 75 6e 61 62 6c  ).  ** are unabl
219f0 65 20 74 6f 20 66 73 79 6e 63 20 61 20 64 69 72  e to fsync a dir
21a00 65 63 74 6f 72 79 2c 20 73 6f 20 69 67 6e 6f 72  ectory, so ignor
21a10 65 20 65 72 72 6f 72 73 20 6f 6e 20 74 68 65 20  e errors on the 
21a20 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69 66  fsync..  */.  if
21a30 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ( pFile->ctrlFla
21a40 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 49  gs & UNIXFILE_DI
21a50 52 53 59 4e 43 20 29 7b 0a 20 20 20 20 69 6e 74  RSYNC ){.    int
21a60 20 64 69 72 66 64 3b 0a 20 20 20 20 4f 53 54 52   dirfd;.    OSTR
21a70 41 43 45 28 28 22 44 49 52 53 59 4e 43 20 25 73  ACE(("DIRSYNC %s
21a80 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63   (have_fullfsync
21a90 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29  =%d fullsync=%d)
21aa0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  \n", pFile->zPat
21ab0 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 48  h,.            H
21ac0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69  AVE_FULLFSYNC, i
21ad0 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 20 20 20  sFullsync));.   
21ae0 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65   rc = osOpenDire
21af0 63 74 6f 72 79 28 70 46 69 6c 65 2d 3e 7a 50 61  ctory(pFile->zPa
21b00 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20  th, &dirfd);.   
21b10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21b20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 75 6c 6c  OK ){.      full
21b30 5f 66 73 79 6e 63 28 64 69 72 66 64 2c 20 30 2c  _fsync(dirfd, 0,
21b40 20 30 29 3b 0a 23 69 66 20 4f 53 43 4c 4f 53 45   0);.#if OSCLOSE
21b50 5f 43 48 45 43 4b 5f 43 4c 4f 53 45 5f 49 4f 45  _CHECK_CLOSE_IOE
21b60 52 52 0a 20 20 20 20 20 20 69 66 28 20 63 6c 6f  RR.      if( clo
21b70 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 29  se(pFile->dirfd)
21b80 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
21b90 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
21ba0 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
21bb0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
21bc0 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20  ERR_DIR_CLOSE;. 
21bd0 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
21be0 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
21bf0 70 46 69 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f  pFile, dirfd, __
21c00 4c 49 4e 45 5f 5f 29 3b 0a 23 65 6e 64 69 66 0a  LINE__);.#endif.
21c10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21c20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
21c30 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 3b 0a  ITE_CANTOPEN );.
21c40 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
21c50 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
21c60 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
21c70 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 44 49   &= ~UNIXFILE_DI
21c80 52 53 59 4e 43 3b 0a 0a 20 20 7d 0a 20 20 72 65  RSYNC;..  }.  re
21c90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
21ca0 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
21cb0 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
21cc0 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
21cd0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72  tatic int unixTr
21ce0 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
21cf0 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79  ile *id, i64 nBy
21d00 74 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  te){.  unixFile 
21d10 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
21d20 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72  le *)id;.  int r
21d30 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  c;.  assert( pFi
21d40 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  le );.  Simulate
21d50 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
21d60 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
21d70 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  NCATE );..  /* I
21d80 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63  f the user has c
21d90 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e  onfigured a chun
21da0 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  k-size for this 
21db0 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74  file, truncate t
21dc0 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20  he.  ** file so 
21dd0 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73  that it consists
21de0 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e   of an integer n
21df0 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20  umber of chunks 
21e00 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61  (i.e. the.  ** a
21e10 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20  ctual file size 
21e20 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74  after the operat
21e30 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65  ion may be large
21e40 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
21e50 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e  sted.  ** size).
21e60 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
21e70 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a  e->szChunk>0 ){.
21e80 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42      nByte = ((nB
21e90 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43  yte + pFile->szC
21ea0 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d  hunk - 1)/pFile-
21eb0 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c  >szChunk) * pFil
21ec0 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a  e->szChunk;.  }.
21ed0 0a 20 20 72 63 20 3d 20 72 6f 62 75 73 74 5f 66  .  rc = robust_f
21ee0 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e  truncate(pFile->
21ef0 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  h, nByte);.  if(
21f00 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f 72 65   rc ){.    store
21f10 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
21f20 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74   errno);.    ret
21f30 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
21f40 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
21f50 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61  UNCATE, "ftrunca
21f60 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  te", pFile->zPat
21f70 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66  h);.  }else{.#if
21f80 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
21f90 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
21fa0 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c  e doing a normal
21fb0 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61   write to a data
21fc0 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70  base file (as op
21fd0 70 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  posed to.    ** 
21fe0 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  doing a hot-jour
21ff0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  nal rollback or 
22000 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20  a write to some 
22010 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  file other than 
22020 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  a.    ** normal 
22030 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 61  database file) a
22040 6e 64 20 77 65 20 74 72 75 6e 63 61 74 65 20 74  nd we truncate t
22050 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  he file to zero 
22060 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74  length,.    ** t
22070 68 61 74 20 65 66 66 65 63 74 69 76 65 6c 79 20  hat effectively 
22080 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
22090 67 65 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69  ge counter.  Thi
220a0 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 0a 20  s might happen. 
220b0 20 20 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f     ** when resto
220c0 72 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  ring a database 
220d0 75 73 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70  using the backup
220e0 20 41 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f   API from a zero
220f0 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73  -length.    ** s
22100 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ource..    */.  
22110 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e    if( pFile->inN
22120 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20 6e 42  ormalWrite && nB
22130 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  yte==0 ){.      
22140 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
22150 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Chng = 1;.    }.
22160 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
22170 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
22180 3e 30 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  >0.    /* If the
22190 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 74   file was just t
221a0 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69  runcated to a si
221b0 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ze smaller than 
221c0 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  the currently.  
221d0 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69    ** mapped regi
221e0 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65 20 65  on, reduce the e
221f0 66 66 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67  ffective mapping
22200 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53   size as well. S
22210 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 20 20 2a  QLite will.    *
22220 2a 20 75 73 65 20 72 65 61 64 28 29 20 61 6e 64  * use read() and
22230 20 77 72 69 74 65 28 29 20 74 6f 20 61 63 63 65   write() to acce
22240 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74  ss data beyond t
22250 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e  his point from n
22260 6f 77 20 6f 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a  ow on.  .    */.
22270 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c 70 46      if( nByte<pF
22280 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
22290 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d  .      pFile->mm
222a0 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a  apSize = nByte;.
222b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
222c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
222d0 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
222e0 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63   Determine the c
222f0 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61  urrent size of a
22300 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a   file in bytes.*
22310 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
22320 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  xFileSize(sqlite
22330 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  3_file *id, i64 
22340 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72  *pSize){.  int r
22350 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  c;.  struct stat
22360 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20   buf;.  assert( 
22370 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46  id );.  rc = osF
22380 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a  stat(((unixFile*
22390 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a  )id)->h, &buf);.
223a0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
223b0 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28  r( rc=1 );.  if(
223c0 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 74   rc!=0 ){.    st
223d0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e  oreLastErrno((un
223e0 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e  ixFile*)id, errn
223f0 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  o);.    return S
22400 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
22410 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20  T;.  }.  *pSize 
22420 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a  = buf.st_size;..
22430 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e    /* When openin
22440 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61  g a zero-size da
22450 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64  tabase, the find
22460 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f 63  InodeInfo() proc
22470 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65  edure.  ** write
22480 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  s a single byte 
22490 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69  into that file i
224a0 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20  n order to work 
224b0 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a  around a bug.  *
224c0 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73  * in the OS-X ms
224d0 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20  dos filesystem. 
224e0 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   In order to avo
224f0 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  id problems with
22500 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65   upper.  ** laye
22510 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72  rs, we need to r
22520 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20  eport this file 
22530 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65  size as zero eve
22540 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20  n though it is. 
22550 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20   ** really 1.   
22560 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20  Ticket #3260..  
22570 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d  */.  if( *pSize=
22580 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b  =1 ) *pSize = 0;
22590 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ...  return SQLI
225a0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
225b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
225c0 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
225d0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
225e0 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f  /*.** Handler fo
225f0 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  r proxy-locking 
22600 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72  file-control ver
22610 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c  bs.  Defined bel
22620 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f  ow in the.** pro
22630 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69  xying locking di
22640 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  vision..*/.stati
22650 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43  c int proxyFileC
22660 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
22670 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b  ile*,int,void*);
22680 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20  .#endif../* .** 
22690 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
226a0 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c   called to handl
226b0 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  e the SQLITE_FCN
226c0 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a  TL_SIZE_HINT .**
226d0 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70   file-control op
226e0 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61 72 67  eration.  Enlarg
226f0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
22700 6f 20 6e 42 79 74 65 73 20 69 6e 20 73 69 7a 65  o nBytes in size
22710 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75 70 20  .** (rounded up 
22720 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68 75 6e  to the next chun
22730 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20 74 68 65  k-size).  If the
22740 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
22750 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73 20 6f  eady.** nBytes o
22760 72 20 6c 61 72 67 65 72 2c 20 74 68 69 73 20 72  r larger, this r
22770 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
22780 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
22790 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75   fcntlSizeHint(u
227a0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
227b0 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66  i64 nByte){.  if
227c0 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
227d0 3e 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 53  >0 ){.    i64 nS
227e0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
227f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69          /* Requi
22800 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
22810 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
22820 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20   buf;           
22830 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f     /* Used to ho
22840 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73  ld return values
22850 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f 0a 20   of fstat() */. 
22860 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74    .    if( osFst
22870 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75  at(pFile->h, &bu
22880 66 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  f) ){.      stor
22890 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
228a0 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
228b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
228c0 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d  ERR_FSTAT;.    }
228d0 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 28  ..    nSize = ((
228e0 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e 73 7a 43  nByte+pFile->szC
228f0 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69 6c 65 2d  hunk-1) / pFile-
22900 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c  >szChunk) * pFil
22910 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20  e->szChunk;.    
22920 69 66 28 20 6e 53 69 7a 65 3e 28 69 36 34 29 62  if( nSize>(i64)b
22930 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b 0a 0a 23  uf.st_size ){..#
22940 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
22950 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29  POSIX_FALLOCATE)
22960 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46   && HAVE_POSIX_F
22970 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20 20 20 2f  ALLOCATE.      /
22980 2a 20 54 68 65 20 63 6f 64 65 20 62 65 6c 6f 77  * The code below
22990 20 69 73 20 68 61 6e 64 6c 69 6e 67 20 74 68 65   is handling the
229a0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
229b0 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 29 20 0a   osFallocate() .
229c0 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74        ** correct
229d0 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  ly. posix_falloc
229e0 61 74 65 28 29 20 69 73 20 64 65 66 69 6e 65 64  ate() is defined
229f0 20 74 6f 20 22 72 65 74 75 72 6e 73 20 7a 65 72   to "returns zer
22a00 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 0a 20  o on success, . 
22a10 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e 20 65 72       ** or an er
22a20 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e 20 20 66  ror number on  f
22a30 61 69 6c 75 72 65 22 2e 20 53 65 65 20 74 68 65  ailure". See the
22a40 20 6d 61 6e 70 61 67 65 20 66 6f 72 20 64 65 74   manpage for det
22a50 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ails. */.      i
22a60 6e 74 20 65 72 72 3b 0a 20 20 20 20 20 20 64 6f  nt err;.      do
22a70 7b 0a 20 20 20 20 20 20 20 20 65 72 72 20 3d 20  {.        err = 
22a80 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70 46 69 6c  osFallocate(pFil
22a90 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 73 69 7a  e->h, buf.st_siz
22aa0 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e 73 74 5f  e, nSize-buf.st_
22ab0 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 77 68  size);.      }wh
22ac0 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e 54 52 20  ile( err==EINTR 
22ad0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72  );.      if( err
22ae0 20 26 26 20 65 72 72 21 3d 45 49 4e 56 41 4c 20   && err!=EINVAL 
22af0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
22b00 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23 65 6c  IOERR_WRITE;.#el
22b10 73 65 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  se.      /* If t
22b20 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68  he OS does not h
22b30 61 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  ave posix_falloc
22b40 61 74 65 28 29 2c 20 66 61 6b 65 20 69 74 2e 20  ate(), fake it. 
22b50 57 72 69 74 65 20 61 20 0a 20 20 20 20 20 20 2a  Write a .      *
22b60 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f  * single byte to
22b70 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 69   the last byte i
22b80 6e 20 65 61 63 68 20 62 6c 6f 63 6b 20 74 68 61  n each block tha
22b90 74 20 66 61 6c 6c 73 20 65 6e 74 69 72 65 6c 79  t falls entirely
22ba0 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 69 6e  .      ** within
22bb0 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65   the extended re
22bc0 67 69 6f 6e 2e 20 54 68 65 6e 2c 20 69 66 20 72  gion. Then, if r
22bd0 65 71 75 69 72 65 64 2c 20 61 20 73 69 6e 67 6c  equired, a singl
22be0 65 20 62 79 74 65 0a 20 20 20 20 20 20 2a 2a 20  e byte.      ** 
22bf0 61 74 20 6f 66 66 73 65 74 20 28 6e 53 69 7a 65  at offset (nSize
22c00 2d 31 29 2c 20 74 6f 20 73 65 74 20 74 68 65 20  -1), to set the 
22c10 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
22c20 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 20 20   correctly..    
22c30 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61 20 73    ** This is a s
22c40 69 6d 69 6c 61 72 20 74 65 63 68 6e 69 71 75 65  imilar technique
22c50 20 74 6f 20 74 68 61 74 20 75 73 65 64 20 62 79   to that used by
22c60 20 67 6c 69 62 63 20 6f 6e 20 73 79 73 74 65 6d   glibc on system
22c70 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  s.      ** that 
22c80 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 72 65  do not have a re
22c90 61 6c 20 66 61 6c 6c 6f 63 61 74 65 28 29 20 63  al fallocate() c
22ca0 61 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  all..      */.  
22cb0 20 20 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62      int nBlk = b
22cc0 75 66 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20  uf.st_blksize;  
22cd0 2f 2a 20 46 69 6c 65 2d 73 79 73 74 65 6d 20 62  /* File-system b
22ce0 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20  lock size */.   
22cf0 20 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20     int nWrite = 
22d00 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
22d10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
22d20 73 20 77 72 69 74 74 65 6e 20 62 79 20 73 65 65  s written by see
22d30 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20  kAndWrite */.   
22d40 20 20 20 69 36 34 20 69 57 72 69 74 65 3b 20 20     i64 iWrite;  
22d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22d60 2a 20 4e 65 78 74 20 6f 66 66 73 65 74 20 74 6f  * Next offset to
22d70 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20   write to */..  
22d80 20 20 20 20 69 57 72 69 74 65 20 3d 20 28 62 75      iWrite = (bu
22d90 66 2e 73 74 5f 73 69 7a 65 2f 6e 42 6c 6b 29 2a  f.st_size/nBlk)*
22da0 6e 42 6c 6b 20 2b 20 6e 42 6c 6b 20 2d 20 31 3b  nBlk + nBlk - 1;
22db0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
22dc0 57 72 69 74 65 3e 3d 62 75 66 2e 73 74 5f 73 69  Write>=buf.st_si
22dd0 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ze );.      asse
22de0 72 74 28 20 28 28 69 57 72 69 74 65 2b 31 29 25  rt( ((iWrite+1)%
22df0 6e 42 6c 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20  nBlk)==0 );.    
22e00 20 20 66 6f 72 28 2f 2a 6e 6f 2d 6f 70 2a 2f 3b    for(/*no-op*/;
22e10 20 69 57 72 69 74 65 3c 6e 53 69 7a 65 2b 6e 42   iWrite<nSize+nB
22e20 6c 6b 2d 31 3b 20 69 57 72 69 74 65 2b 3d 6e 42  lk-1; iWrite+=nB
22e30 6c 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  lk ){.        if
22e40 28 20 69 57 72 69 74 65 3e 3d 6e 53 69 7a 65 20  ( iWrite>=nSize 
22e50 29 20 69 57 72 69 74 65 20 3d 20 6e 53 69 7a 65  ) iWrite = nSize
22e60 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 57   - 1;.        nW
22e70 72 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72  rite = seekAndWr
22e80 69 74 65 28 70 46 69 6c 65 2c 20 69 57 72 69 74  ite(pFile, iWrit
22e90 65 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20 20 20  e, "", 1);.     
22ea0 20 20 20 69 66 28 20 6e 57 72 69 74 65 21 3d 31     if( nWrite!=1
22eb0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
22ec0 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20  _IOERR_WRITE;.  
22ed0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
22ee0 20 7d 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49   }.  }..#if SQLI
22ef0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
22f00 3e 30 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  >0.  if( pFile->
22f10 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 26 26  mmapSizeMax>0 &&
22f20 20 6e 42 79 74 65 3e 70 46 69 6c 65 2d 3e 6d 6d   nByte>pFile->mm
22f30 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 6e  apSize ){.    in
22f40 74 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70 46  t rc;.    if( pF
22f50 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3c 3d 30 20  ile->szChunk<=0 
22f60 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 6f 62  ){.      if( rob
22f70 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46  ust_ftruncate(pF
22f80 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29  ile->h, nByte) )
22f90 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c  {.        storeL
22fa0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
22fb0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  errno);.        
22fc0 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
22fd0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
22fe0 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75  _TRUNCATE, "ftru
22ff0 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  ncate", pFile->z
23000 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Path);.      }. 
23010 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 75     }..    rc = u
23020 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69 6c 65  nixMapfile(pFile
23030 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 72 65  , nByte);.    re
23040 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
23050 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  dif..  return SQ
23060 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66  LITE_OK;.}...#if
23070 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f   (SQLITE_ENABLE_
23080 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26 20  APPLE_SPI>0) && 
23090 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
230a0 5f 29 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  _).#include "sql
230b0 69 74 65 33 5f 70 72 69 76 61 74 65 2e 68 22 0a  ite3_private.h".
230c0 23 69 6e 63 6c 75 64 65 20 3c 63 6f 70 79 66 69  #include <copyfi
230d0 6c 65 2e 68 3e 0a 73 74 61 74 69 63 20 69 6e 74  le.h>.static int
230e0 20 70 72 6f 78 79 47 65 74 44 62 50 61 74 68 46   proxyGetDbPathF
230f0 6f 72 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46  orUnixFile(unixF
23100 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 68 61 72  ile *pFile, char
23110 20 2a 64 62 50 61 74 68 29 3b 0a 23 65 6e 64 69   *dbPath);.#endi
23120 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  f..#if SQLITE_EN
23130 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
23140 4c 45 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  LE.static int is
23150 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65  ProxyLockingMode
23160 28 75 6e 69 78 46 69 6c 65 20 2a 29 3b 0a 23 65  (unixFile *);.#e
23170 6e 64 69 66 0a 0a 23 69 66 20 28 53 51 4c 49 54  ndif..#if (SQLIT
23180 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53  E_ENABLE_APPLE_S
23190 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65 64  PI>0) && defined
231a0 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 73 74 61 74  (__APPLE__).stat
231b0 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63  ic int unixTrunc
231c0 61 74 65 44 61 74 61 62 61 73 65 28 75 6e 69 78  ateDatabase(unix
231d0 46 69 6c 65 20 2a 2c 20 69 6e 74 29 3b 0a 0a 73  File *, int);..s
231e0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 49 6e  tatic int unixIn
231f0 76 61 6c 69 64 61 74 65 53 75 70 70 6f 72 74 46  validateSupportF
23200 69 6c 65 73 28 75 6e 69 78 46 69 6c 65 20 2a 2c  iles(unixFile *,
23210 20 69 6e 74 29 3b 0a 0a 73 74 61 74 69 63 20 69   int);..static i
23220 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c  nt findCreateFil
23230 65 4d 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72  eMode(const char
23240 20 2a 2c 20 69 6e 74 2c 20 6d 6f 64 65 5f 74 2a   *, int, mode_t*
23250 2c 20 75 69 64 5f 74 20 2a 2c 67 69 64 5f 74 20  , uid_t *,gid_t 
23260 2a 29 3b 0a 0a 2f 2a 20 6f 70 65 6e 73 20 61 20  *);../* opens a 
23270 72 65 61 64 2f 77 72 69 74 65 20 63 6f 6e 6e 65  read/write conne
23280 63 74 69 6f 6e 20 74 6f 20 61 20 66 69 6c 65 20  ction to a file 
23290 7a 4e 61 6d 65 20 69 6e 68 65 72 69 74 69 6e 67  zName inheriting
232a0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
232b0 0a 2a 2a 20 75 73 65 72 2f 70 65 72 6d 73 20 66  .** user/perms f
232c0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
232d0 20 66 69 6c 65 20 69 66 20 72 75 6e 6e 69 6e 67   file if running
232e0 20 61 73 20 72 6f 6f 74 2e 20 20 52 65 74 75 72   as root.  Retur
232f0 6e 73 20 74 68 65 20 66 69 6c 65 20 0a 2a 2a 20  ns the file .** 
23300 64 65 73 63 72 69 70 74 6f 72 20 62 79 20 72 65  descriptor by re
23310 66 65 72 65 6e 63 65 0a 2a 2f 0a 73 74 61 74 69  ference.*/.stati
23320 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 43 68  c int unixOpenCh
23330 69 6c 64 46 69 6c 65 28 0a 20 20 63 6f 6e 73 74  ildFile(.  const
23340 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20   char *zName,.  
23350 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 2c 0a 20  int openFlags,. 
23360 20 69 6e 74 20 64 62 4f 70 65 6e 46 6c 61 67 73   int dbOpenFlags
23370 2c 0a 20 20 69 6e 74 20 70 72 6f 74 46 6c 61 67  ,.  int protFlag
23380 73 2c 0a 20 20 69 6e 74 20 2a 70 46 64 0a 29 7b  s,.  int *pFd.){
23390 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a  .  int fd = -1;.
233a0 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64    mode_t openMod
233b0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
233c0 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74  /* Permissions t
233d0 6f 20 63 72 65 61 74 65 20 66 69 6c 65 20 77 69  o create file wi
233e0 74 68 20 2a 2f 0a 20 20 75 69 64 5f 74 20 75 69  th */.  uid_t ui
233f0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
23400 20 20 20 20 20 20 2f 2a 20 55 73 65 72 69 64 20        /* Userid 
23410 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a  for the file */.
23420 20 20 67 69 64 5f 74 20 67 69 64 3b 20 20 20 20    gid_t gid;    
23430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23440 2f 2a 20 47 72 6f 75 70 69 64 20 66 6f 72 20 74  /* Groupid for t
23450 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  he file */.  int
23460 20 72 63 3b 0a 20 20 0a 20 20 61 73 73 65 72 74   rc;.  .  assert
23470 28 70 46 64 21 3d 4e 55 4c 4c 29 3b 0a 20 20 72  (pFd!=NULL);.  r
23480 63 20 3d 20 66 69 6e 64 43 72 65 61 74 65 46 69  c = findCreateFi
23490 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20 64 62  leMode(zName, db
234a0 4f 70 65 6e 46 6c 61 67 73 2c 20 26 6f 70 65 6e  OpenFlags, &open
234b0 4d 6f 64 65 2c 20 26 75 69 64 2c 20 26 67 69 64  Mode, &uid, &gid
234c0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
234d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
234e0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 66  turn rc;.  }.  f
234f0 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
23500 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  zName, openFlags
23510 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 4f  , openMode);.  O
23520 53 54 52 41 43 45 28 28 22 4f 50 45 4e 58 20 20  STRACE(("OPENX  
23530 20 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c   %-3d %s 0%o\n",
23540 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e   fd, zName, open
23550 46 6c 61 67 73 29 29 3b 0a 20 20 69 66 28 20 66  Flags));.  if( f
23560 64 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  d<0 ){.    rc = 
23570 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
23580 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
23590 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65  T, "open", zName
235a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
235b0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 69 66 20 77 65  ;.  }.  /* if we
235c0 27 72 65 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  're opening the 
235d0 77 61 6c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 61  wal or journal a
235e0 6e 64 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f  nd running as ro
235f0 6f 74 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68 65  ot, set.  ** the
23600 20 6a 6f 75 72 6e 61 6c 20 75 69 64 2f 67 69 64   journal uid/gid
23610 20 2a 2f 0a 20 20 69 66 28 20 64 62 4f 70 65 6e   */.  if( dbOpen
23620 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  Flags & (SQLITE_
23630 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f  OPEN_WAL|SQLITE_
23640 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
23650 4c 29 20 29 7b 0a 20 20 20 20 75 69 64 5f 74 20  L) ){.    uid_t 
23660 65 75 69 64 20 3d 20 67 65 74 65 75 69 64 28 29  euid = geteuid()
23670 3b 0a 20 20 20 20 69 66 28 20 65 75 69 64 3d 3d  ;.    if( euid==
23680 30 20 26 26 20 28 65 75 69 64 21 3d 75 69 64 20  0 && (euid!=uid 
23690 7c 7c 20 67 65 74 65 67 69 64 28 29 21 3d 67 69  || getegid()!=gi
236a0 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  d) ){.      if( 
236b0 66 63 68 6f 77 6e 28 66 64 2c 20 75 69 64 2c 20  fchown(fd, uid, 
236c0 67 69 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  gid) ){.        
236d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
236e0 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OPEN_BKPT;.     
236f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
23700 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23710 20 29 7b 0a 20 20 20 20 2a 70 46 64 20 3d 20 66   ){.    *pFd = f
23720 64 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  d;.  } else {.  
23730 20 20 2a 70 46 64 20 3d 20 2d 31 3b 0a 20 20 20    *pFd = -1;.   
23740 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 7d 0a   close(fd);.  }.
23750 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
23760 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52  static int unixR
23770 65 70 6c 61 63 65 44 61 74 61 62 61 73 65 28 75  eplaceDatabase(u
23780 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
23790 73 71 6c 69 74 65 33 20 2a 73 72 63 64 62 29 20  sqlite3 *srcdb) 
237a0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  {.  sqlite3_file
237b0 20 2a 69 64 20 3d 20 28 73 71 6c 69 74 65 33 5f   *id = (sqlite3_
237c0 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  file *)pFile;.  
237d0 42 74 72 65 65 20 2a 70 53 72 63 42 74 72 65 65  Btree *pSrcBtree
237e0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 73 71 6c 69 74   = NULL;.  sqlit
237f0 65 33 5f 66 69 6c 65 20 2a 73 72 63 5f 66 69 6c  e3_file *src_fil
23800 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 75 6e 69 78  e = NULL;.  unix
23810 46 69 6c 65 20 2a 70 53 72 63 46 69 6c 65 20 3d  File *pSrcFile =
23820 20 4e 55 4c 4c 3b 0a 20 20 63 68 61 72 20 73 72   NULL;.  char sr
23830 63 57 61 6c 50 61 74 68 5b 4d 41 58 50 41 54 48  cWalPath[MAXPATH
23840 4c 45 4e 2b 35 5d 3b 0a 20 20 69 6e 74 20 73 72  LEN+5];.  int sr
23850 63 57 61 6c 46 44 20 3d 20 2d 31 3b 0a 20 20 69  cWalFD = -1;.  i
23860 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
23870 4b 3b 0a 20 20 76 6f 69 64 20 2a 70 4c 6f 63 6b  K;.  void *pLock
23880 20 3d 20 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20 66   = NULL;.  int f
23890 6c 61 67 73 20 3d 20 30 3b 0a 20 20 73 71 6c 69  lags = 0;.  sqli
238a0 74 65 33 20 2a 73 72 63 64 62 32 20 3d 20 4e 55  te3 *srcdb2 = NU
238b0 4c 4c 3b 0a 20 20 63 6f 70 79 66 69 6c 65 5f 73  LL;.  copyfile_s
238c0 74 61 74 65 5f 74 20 73 3b 0a 20 20 69 6e 74 20  tate_t s;.  int 
238d0 63 6f 72 72 75 70 74 53 72 63 46 69 6c 65 4c 6f  corruptSrcFileLo
238e0 63 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63 6f  ck = 0;.  int co
238f0 72 72 75 70 74 44 73 74 46 69 6c 65 4c 6f 63 6b  rruptDstFileLock
23900 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 53 72   = 0;.  int isSr
23910 63 43 6f 72 72 75 70 74 20 3d 20 30 3b 0a 20 20  cCorrupt = 0;.  
23920 69 6e 74 20 69 73 44 73 74 43 6f 72 72 75 70 74  int isDstCorrupt
23930 20 3d 20 30 3b 0a 20 20 0a 20 20 69 66 28 20 21   = 0;.  .  if( !
23940 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
23950 63 6b 4f 6b 28 73 72 63 64 62 29 20 29 7b 0a 20  ckOk(srcdb) ){. 
23960 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
23970 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 20  _MISUSE;.  }.   
23980 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41   .#if SQLITE_ENA
23990 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54  BLE_DATA_PROTECT
239a0 49 4f 4e 0a 20 20 66 6c 61 67 73 20 7c 3d 20 70  ION.  flags |= p
239b0 46 69 6c 65 2d 3e 70 72 6f 74 46 6c 61 67 73 3b  File->protFlags;
239c0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
239d0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
239e0 47 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 69 73  G_STYLE.  if( is
239f0 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65  ProxyLockingMode
23a00 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 66  (pFile) ){.    f
23a10 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
23a20 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 3b 0a 20  PEN_AUTOPROXY;. 
23a30 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72   }.#endif.  .  r
23a40 63 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f  c = sqlite3demo_
23a50 73 75 70 65 72 6c 6f 63 6b 28 70 46 69 6c 65 2d  superlock(pFile-
23a60 3e 7a 50 61 74 68 2c 20 30 2c 20 66 6c 61 67 73  >zPath, 0, flags
23a70 2c 20 30 2c 20 30 2c 20 26 70 4c 6f 63 6b 29 3b  , 0, 0, &pLock);
23a80 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
23a90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23aa0 43 4f 52 52 55 50 54 20 7c 7c 20 72 63 3d 3d 53  CORRUPT || rc==S
23ab0 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 29 7b 0a  QLITE_NOTADB ){.
23ac0 20 20 20 20 20 20 69 73 44 73 74 43 6f 72 72 75        isDstCorru
23ad0 70 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63  pt = 1;.      rc
23ae0 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73   = sqlite3demo_s
23af0 75 70 65 72 6c 6f 63 6b 5f 63 6f 72 72 75 70 74  uperlock_corrupt
23b00 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  (id, SQLITE_LOCK
23b10 5f 45 58 43 4c 55 53 49 56 45 2c 0a 20 20 20 20  _EXCLUSIVE,.    
23b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b40 20 20 20 20 20 26 63 6f 72 72 75 70 74 44 73 74       &corruptDst
23b50 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d  FileLock);.    }
23b60 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
23b70 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
23b80 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 67      }.  }.  /* g
23b90 65 74 20 74 68 65 20 73 72 63 20 66 69 6c 65 20  et the src file 
23ba0 64 65 73 63 72 69 70 74 6f 72 20 61 64 68 65 72  descriptor adher
23bb0 69 6e 67 20 74 6f 20 74 68 65 20 64 62 20 73 74  ing to the db st
23bc0 72 75 63 74 20 61 63 63 65 73 73 20 72 75 6c 65  ruct access rule
23bd0 73 20 0a 20 20 20 2a 2a 20 74 68 69 73 20 63 6f  s .   ** this co
23be0 64 65 20 69 73 20 6d 6f 64 65 6c 65 64 20 61 66  de is modeled af
23bf0 74 65 72 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ter sqlite3_file
23c00 5f 63 6f 6e 74 72 6f 6c 28 29 20 69 6e 20 6d 61  _control() in ma
23c10 69 6e 2e 63 0a 20 20 20 2a 2f 20 0a 20 20 73 71  in.c.   */ .  sq
23c20 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
23c30 72 28 73 72 63 64 62 2d 3e 6d 75 74 65 78 29 3b  r(srcdb->mutex);
23c40 0a 20 20 69 66 28 20 73 72 63 64 62 2d 3e 6e 44  .  if( srcdb->nD
23c50 62 3e 30 20 29 7b 0a 20 20 20 20 70 53 72 63 42  b>0 ){.    pSrcB
23c60 74 72 65 65 20 3d 20 73 72 63 64 62 2d 3e 61 44  tree = srcdb->aD
23c70 62 5b 30 5d 2e 70 42 74 3b 0a 20 20 7d 0a 20 20  b[0].pBt;.  }.  
23c80 69 66 28 20 70 53 72 63 42 74 72 65 65 20 29 7b  if( pSrcBtree ){
23c90 0a 20 20 20 20 50 61 67 65 72 20 2a 70 53 72 63  .    Pager *pSrc
23ca0 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74  Pager;.    sqlit
23cb0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 53 72  e3BtreeEnter(pSr
23cc0 63 42 74 72 65 65 29 3b 0a 20 20 20 20 70 53 72  cBtree);.    pSr
23cd0 63 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33  cPager = sqlite3
23ce0 42 74 72 65 65 50 61 67 65 72 28 70 53 72 63 42  BtreePager(pSrcB
23cf0 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65 72  tree);.    asser
23d00 74 28 20 70 53 72 63 50 61 67 65 72 21 3d 30 20  t( pSrcPager!=0 
23d10 29 3b 0a 20 20 20 20 73 72 63 5f 66 69 6c 65 20  );.    src_file 
23d20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
23d30 6c 65 28 70 53 72 63 50 61 67 65 72 29 3b 0a 20  le(pSrcPager);. 
23d40 20 20 20 61 73 73 65 72 74 28 20 73 72 63 5f 66     assert( src_f
23d50 69 6c 65 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  ile!=0 );.    if
23d60 28 20 73 72 63 5f 66 69 6c 65 2d 3e 70 4d 65 74  ( src_file->pMet
23d70 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 69 6e  hods ){.      in
23d80 74 20 73 72 63 46 6c 61 67 73 20 3d 20 30 3b 0a  t srcFlags = 0;.
23d90 20 20 20 20 20 20 70 53 72 63 46 69 6c 65 20 3d        pSrcFile =
23da0 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 73 72 63   (unixFile *)src
23db0 5f 66 69 6c 65 3b 0a 23 69 66 20 53 51 4c 49 54  _file;.#if SQLIT
23dc0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
23dd0 5f 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65  _STYLE || define
23de0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20  d(__APPLE__).   
23df0 20 20 20 69 66 20 28 28 70 53 72 63 46 69 6c 65     if ((pSrcFile
23e00 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f 5f  ->openFlags & O_
23e10 52 44 57 52 29 20 3d 3d 20 4f 5f 52 44 57 52 29  RDWR) == O_RDWR)
23e20 20 7b 0a 20 20 20 20 20 20 20 20 73 72 63 46 6c   {.        srcFl
23e30 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
23e40 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20  N_READWRITE;.   
23e50 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
23e60 20 20 20 20 73 72 63 46 6c 61 67 73 20 3d 20 53      srcFlags = S
23e70 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
23e80 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c  NLY;.      }.#el
23e90 73 65 0a 20 20 20 20 20 20 73 72 63 46 6c 61 67  se.      srcFlag
23ea0 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
23eb0 52 45 41 44 57 52 49 54 45 3b 0a 23 65 6e 64 69  READWRITE;.#endi
23ec0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
23ed0 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54  BLE_DATA_PROTECT
23ee0 49 4f 4e 0a 20 20 20 20 20 20 73 72 63 46 6c 61  ION.      srcFla
23ef0 67 73 20 7c 3d 20 70 53 72 63 46 69 6c 65 2d 3e  gs |= pSrcFile->
23f00 70 72 6f 74 46 6c 61 67 73 3b 0a 23 65 6e 64 69  protFlags;.#endi
23f10 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
23f20 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
23f30 45 0a 20 20 20 20 20 20 69 66 28 20 69 73 50 72  E.      if( isPr
23f40 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70  oxyLockingMode(p
23f50 53 72 63 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  SrcFile) ){.    
23f60 20 20 20 20 73 72 63 46 6c 61 67 73 20 7c 3d 20      srcFlags |= 
23f70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f  SQLITE_OPEN_AUTO
23f80 50 52 4f 58 59 3b 0a 20 20 20 20 20 20 7d 0a 23  PROXY;.      }.#
23f90 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
23fa0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
23fb0 28 70 53 72 63 46 69 6c 65 2d 3e 7a 50 61 74 68  (pSrcFile->zPath
23fc0 2c 20 26 73 72 63 64 62 32 2c 20 73 72 63 46 6c  , &srcdb2, srcFl
23fd0 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ags, 0);.      i
23fe0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23ff0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73   ){.        /* s
24000 74 61 72 74 20 61 20 64 65 66 65 72 72 65 64 20  tart a deferred 
24010 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
24020 72 65 61 64 20 74 6f 20 65 73 74 61 62 6c 69 73  read to establis
24030 68 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f  h a read lock */
24040 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
24050 6c 69 74 65 33 5f 65 78 65 63 28 73 72 63 64 62  lite3_exec(srcdb
24060 32 2c 20 22 42 45 47 49 4e 20 44 45 46 45 52 52  2, "BEGIN DEFERR
24070 45 44 3b 20 50 52 41 47 4d 41 20 73 63 68 65 6d  ED; PRAGMA schem
24080 61 5f 76 65 72 73 69 6f 6e 22 2c 0a 20 20 20 20  a_version",.    
24090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240a0 20 20 20 20 20 20 30 2c 20 30 2c 20 30 29 3b 0a        0, 0, 0);.
240b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
240c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c  SQLITE_CORRUPT |
240d0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54  | rc==SQLITE_NOT
240e0 41 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ADB ){.         
240f0 20 69 73 53 72 63 43 6f 72 72 75 70 74 20 3d 20   isSrcCorrupt = 
24100 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  1;.          rc 
24110 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75  = sqlite3demo_su
24120 70 65 72 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28  perlock_corrupt(
24130 73 72 63 5f 66 69 6c 65 2c 20 53 51 4c 49 54 45  src_file, SQLITE
24140 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 2c 0a 20 20  _LOCK_SHARED,.  
24150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24170 20 20 20 20 20 20 20 20 20 20 20 26 63 6f 72 72             &corr
24180 75 70 74 53 72 63 46 69 6c 65 4c 6f 63 6b 29 3b  uptSrcFileLock);
24190 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
241a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
241b0 66 28 20 21 73 72 63 64 62 32 20 7c 7c 20 70 53  f( !srcdb2 || pS
241c0 72 63 46 69 6c 65 3d 3d 4e 55 4c 4c 20 7c 7c 20  rcFile==NULL || 
241d0 70 53 72 63 46 69 6c 65 2d 3e 68 3c 30 29 7b 0a  pSrcFile->h<0){.
241e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
241f0 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d 0a 20 20  INTERNAL;.  }.  
24200 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
24210 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
24220 64 5f 72 65 70 6c 61 63 65 5f 64 61 74 61 62 61  d_replace_databa
24230 73 65 3b 0a 20 20 7d 0a 20 20 2f 2a 20 62 6f 74  se;.  }.  /* bot
24240 68 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  h databases are 
24250 6c 6f 63 6b 65 64 20 61 70 70 72 6f 70 72 69 61  locked appropria
24260 74 65 6c 79 2c 20 63 6f 70 79 20 74 68 65 20 73  tely, copy the s
24270 72 63 20 77 61 6c 20 6a 6f 75 72 6e 61 6c 20 69  rc wal journal i
24280 66 20 0a 20 20 20 2a 2a 20 6f 6e 65 20 65 78 69  f .   ** one exi
24290 73 74 73 20 61 6e 64 20 74 68 65 6e 20 74 68 65  sts and then the
242a0 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
242b0 20 66 69 6c 65 0a 20 20 20 2a 2f 0a 20 20 73 74   file.   */.  st
242c0 72 6c 63 70 79 28 73 72 63 57 61 6c 50 61 74 68  rlcpy(srcWalPath
242d0 2c 20 70 53 72 63 46 69 6c 65 2d 3e 7a 50 61 74  , pSrcFile->zPat
242e0 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 2b 35 29  h, MAXPATHLEN+5)
242f0 3b 0a 20 20 73 74 72 6c 63 61 74 28 73 72 63 57  ;.  strlcat(srcW
24300 61 6c 50 61 74 68 2c 20 22 2d 77 61 6c 22 2c 20  alPath, "-wal", 
24310 4d 41 58 50 41 54 48 4c 45 4e 2b 35 29 3b 0a 20  MAXPATHLEN+5);. 
24320 20 73 72 63 57 61 6c 46 44 20 3d 20 6f 70 65 6e   srcWalFD = open
24330 28 73 72 63 57 61 6c 50 61 74 68 2c 20 4f 5f 52  (srcWalPath, O_R
24340 44 4f 4e 4c 59 29 3b 0a 20 20 69 66 28 20 21 28  DONLY);.  if( !(
24350 73 72 63 57 61 6c 46 44 3c 30 29 20 29 7b 0a 20  srcWalFD<0) ){. 
24360 20 20 20 63 68 61 72 20 64 73 74 57 61 6c 50 61     char dstWalPa
24370 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 35 5d  th[MAXPATHLEN+5]
24380 3b 0a 20 20 20 20 69 6e 74 20 64 73 74 57 61 6c  ;.    int dstWal
24390 46 44 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74  FD = -1;.    int
243a0 20 70 72 6f 74 46 6c 61 67 73 20 3d 20 30 3b 0a   protFlags = 0;.
243b0 20 20 20 20 73 74 72 6c 63 70 79 28 64 73 74 57      strlcpy(dstW
243c0 61 6c 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 7a  alPath, pFile->z
243d0 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  Path, MAXPATHLEN
243e0 2b 35 29 3b 0a 20 20 20 20 73 74 72 6c 63 61 74  +5);.    strlcat
243f0 28 64 73 74 57 61 6c 50 61 74 68 2c 20 22 2d 77  (dstWalPath, "-w
24400 61 6c 22 2c 20 4d 41 58 50 41 54 48 4c 45 4e 2b  al", MAXPATHLEN+
24410 35 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 75 6e  5);..    rc = un
24420 69 78 4f 70 65 6e 43 68 69 6c 64 46 69 6c 65 28  ixOpenChildFile(
24430 64 73 74 57 61 6c 50 61 74 68 2c 20 4f 5f 52 44  dstWalPath, O_RD
24440 57 52 7c 4f 5f 43 52 45 41 54 2c 20 53 51 4c 49  WR|O_CREAT, SQLI
24450 54 45 5f 4f 50 45 4e 5f 57 41 4c 2c 0a 20 20 20  TE_OPEN_WAL,.   
24460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24470 20 20 20 20 20 20 20 20 70 72 6f 74 46 6c 61 67          protFlag
24480 73 2c 20 26 64 73 74 57 61 6c 46 44 29 3b 0a 20  s, &dstWalFD);. 
24490 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
244a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 20  E_OK ){.      s 
244b0 3d 20 63 6f 70 79 66 69 6c 65 5f 73 74 61 74 65  = copyfile_state
244c0 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  _alloc();.      
244d0 6c 73 65 65 6b 28 73 72 63 57 61 6c 46 44 2c 20  lseek(srcWalFD, 
244e0 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  0, SEEK_SET);.  
244f0 20 20 20 20 6c 73 65 65 6b 28 64 73 74 57 61 6c      lseek(dstWal
24500 46 44 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54 29  FD, 0, SEEK_SET)
24510 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63 6f 70  ;.      if( fcop
24520 79 66 69 6c 65 28 73 72 63 57 61 6c 46 44 2c 20  yfile(srcWalFD, 
24530 64 73 74 57 61 6c 46 44 2c 20 73 2c 20 43 4f 50  dstWalFD, s, COP
24540 59 46 49 4c 45 5f 44 41 54 41 29 20 29 7b 0a 20  YFILE_DATA) ){. 
24550 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 3d 65         int err=e
24560 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 73 77  rrno;.        sw
24570 69 74 63 68 28 65 72 72 29 20 7b 0a 20 20 20 20  itch(err) {.    
24580 20 20 20 20 20 20 63 61 73 65 20 45 4e 4f 4d 45        case ENOME
24590 4d 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  M:.            r
245a0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
245b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
245c0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 64  eak;.          d
245d0 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
245e0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
245f0 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 29 3b 0a  no(pFile, err);.
24600 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
24610 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
24620 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
24630 0a 20 20 20 20 20 20 63 6f 70 79 66 69 6c 65 5f  .      copyfile_
24640 73 74 61 74 65 5f 66 72 65 65 28 73 29 3b 0a 20  state_free(s);. 
24650 20 20 20 20 20 63 6c 6f 73 65 28 64 73 74 57 61       close(dstWa
24660 6c 46 44 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lFD);.    }.    
24670 63 6c 6f 73 65 28 73 72 63 57 61 6c 46 44 29 3b  close(srcWalFD);
24680 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
24690 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
246a0 2f 2a 20 62 65 66 6f 72 65 20 77 65 20 63 6f 70  /* before we cop
246b0 79 2c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  y, ensure that t
246c0 68 65 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63  he file change c
246d0 6f 75 6e 74 65 72 20 77 69 6c 6c 20 62 65 20 6d  ounter will be m
246e0 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 75  odified */.    u
246f0 69 6e 74 33 32 5f 74 20 73 72 63 43 68 61 6e 67  int32_t srcChang
24700 65 20 3d 20 30 3b 0a 20 20 20 20 75 69 6e 74 33  e = 0;.    uint3
24710 32 5f 74 20 64 73 74 43 68 61 6e 67 65 20 3d 20  2_t dstChange = 
24720 30 3b 0a 20 20 20 20 70 72 65 61 64 28 70 53 72  0;.    pread(pSr
24730 63 46 69 6c 65 2d 3e 68 2c 20 26 73 72 63 43 68  cFile->h, &srcCh
24740 61 6e 67 65 2c 20 34 2c 20 32 34 29 3b 0a 20 20  ange, 4, 24);.  
24750 20 20 70 72 65 61 64 28 70 46 69 6c 65 2d 3e 68    pread(pFile->h
24760 2c 20 26 64 73 74 43 68 61 6e 67 65 2c 20 34 2c  , &dstChange, 4,
24770 20 32 34 29 3b 0a 20 20 20 20 0a 20 20 20 20 2f   24);.    .    /
24780 2a 20 63 6f 70 79 20 74 68 65 20 61 63 74 75 61  * copy the actua
24790 6c 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  l database */.  
247a0 20 20 73 20 3d 20 63 6f 70 79 66 69 6c 65 5f 73    s = copyfile_s
247b0 74 61 74 65 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20  tate_alloc();.  
247c0 20 20 6c 73 65 65 6b 28 70 53 72 63 46 69 6c 65    lseek(pSrcFile
247d0 2d 3e 68 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54  ->h, 0, SEEK_SET
247e0 29 3b 0a 20 20 20 20 6c 73 65 65 6b 28 70 46 69  );.    lseek(pFi
247f0 6c 65 2d 3e 68 2c 20 30 2c 20 53 45 45 4b 5f 53  le->h, 0, SEEK_S
24800 45 54 29 3b 0a 20 20 20 20 69 66 28 20 66 63 6f  ET);.    if( fco
24810 70 79 66 69 6c 65 28 70 53 72 63 46 69 6c 65 2d  pyfile(pSrcFile-
24820 3e 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 2c  >h, pFile->h, s,
24830 20 43 4f 50 59 46 49 4c 45 5f 44 41 54 41 29 20   COPYFILE_DATA) 
24840 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72  ){.      int err
24850 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 73 77  =errno;.      sw
24860 69 74 63 68 28 65 72 72 29 20 7b 0a 20 20 20 20  itch(err) {.    
24870 20 20 20 20 63 61 73 65 20 45 4e 4f 4d 45 4d 3a      case ENOMEM:
24880 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
24890 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
248a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
248b0 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a         default:.
248c0 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c            storeL
248d0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
248e0 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  err);.          
248f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
24900 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  R;.      }.    }
24910 0a 20 20 20 20 63 6f 70 79 66 69 6c 65 5f 73 74  .    copyfile_st
24920 61 74 65 5f 66 72 65 65 28 73 29 3b 0a 20 20 20  ate_free(s);.   
24930 20 0a 20 20 20 20 69 66 20 28 73 72 63 43 68 61   .    if (srcCha
24940 6e 67 65 20 3d 3d 20 64 73 74 43 68 61 6e 67 65  nge == dstChange
24950 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6d 6f 64  ) {.      /* mod
24960 69 66 79 20 74 68 65 20 63 68 61 6e 67 65 20 63  ify the change c
24970 6f 75 6e 74 65 72 20 74 6f 20 66 6f 72 63 65 20  ounter to force 
24980 70 61 67 65 20 7a 65 72 6f 20 74 6f 20 62 65 20  page zero to be 
24990 72 65 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 20 20  reloaded */.    
249a0 20 20 64 73 74 43 68 61 6e 67 65 20 2b 2b 3b 0a    dstChange ++;.
249b0 20 20 20 20 20 20 70 77 72 69 74 65 28 70 46 69        pwrite(pFi
249c0 6c 65 2d 3e 68 2c 20 26 64 73 74 43 68 61 6e 67  le->h, &dstChang
249d0 65 2c 20 34 2c 20 32 34 29 3b 0a 20 20 20 20 7d  e, 4, 24);.    }
249e0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 53 72 63  .  }.  if( isSrc
249f0 43 6f 72 72 75 70 74 20 29 7b 0a 20 20 20 20 73  Corrupt ){.    s
24a00 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72  qlite3demo_super
24a10 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 73  unlock_corrupt(s
24a20 72 63 5f 66 69 6c 65 2c 20 63 6f 72 72 75 70 74  rc_file, corrupt
24a30 53 72 63 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20  SrcFileLock);.  
24a40 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 64 6f  }else{.    /* do
24a50 6e 65 20 77 69 74 68 20 74 68 65 20 73 6f 75 72  ne with the sour
24a60 63 65 20 64 62 20 73 6f 20 65 6e 64 20 74 68 65  ce db so end the
24a70 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   transaction */.
24a80 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
24a90 28 73 72 63 64 62 32 2c 20 22 43 4f 4d 4d 49 54  (srcdb2, "COMMIT
24aa0 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  ", 0, 0, 0);.  }
24ab0 0a 20 20 2f 2a 20 7a 65 72 6f 20 6f 75 74 20 61  .  /* zero out a
24ac0 6e 79 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 63  ny old journal c
24ad0 6c 75 74 74 65 72 20 2a 2f 0a 20 20 69 66 28 20  lutter */.  if( 
24ae0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24af0 0a 20 20 20 20 69 6e 74 20 73 6b 69 70 57 41 4c  .    int skipWAL
24b00 20 3d 20 28 73 72 63 57 61 6c 46 44 3c 30 29 3f   = (srcWalFD<0)?
24b10 30 3a 31 3b 0a 20 20 20 20 75 6e 69 78 49 6e 76  0:1;.    unixInv
24b20 61 6c 69 64 61 74 65 53 75 70 70 6f 72 74 46 69  alidateSupportFi
24b30 6c 65 73 28 70 46 69 6c 65 2c 20 73 6b 69 70 57  les(pFile, skipW
24b40 41 4c 29 3b 0a 20 20 7d 0a 20 20 0a 65 6e 64 5f  AL);.  }.  .end_
24b50 72 65 70 6c 61 63 65 5f 64 61 74 61 62 61 73 65  replace_database
24b60 3a 0a 20 20 69 66 28 20 70 53 72 63 42 74 72 65  :.  if( pSrcBtre
24b70 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
24b80 5f 63 6c 6f 73 65 28 73 72 63 64 62 32 29 3b 0a  _close(srcdb2);.
24b90 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
24ba0 4c 65 61 76 65 28 70 53 72 63 42 74 72 65 65 29  Leave(pSrcBtree)
24bb0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
24bc0 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 72 63 64  mutex_leave(srcd
24bd0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
24be0 20 69 73 44 73 74 43 6f 72 72 75 70 74 20 29 7b   isDstCorrupt ){
24bf0 0a 20 20 20 20 73 71 6c 69 74 65 33 64 65 6d 6f  .    sqlite3demo
24c00 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 5f 63 6f 72  _superunlock_cor
24c10 72 75 70 74 28 69 64 2c 20 63 6f 72 72 75 70 74  rupt(id, corrupt
24c20 44 73 74 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20  DstFileLock);.  
24c30 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
24c40 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f  e3demo_superunlo
24c50 63 6b 28 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20  ck(pLock);.  }. 
24c60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 64   return rc;.}.#d
24c70 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 49 4c  efine SQLITE_FIL
24c80 45 5f 48 45 41 44 45 52 5f 4c 45 4e 20 31 36 0a  E_HEADER_LEN 16.
24c90 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20 63  /* Check for a c
24ca0 6f 6e 66 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e  onflicting lock.
24cb0 20 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e    If one is foun
24cc0 64 2c 20 70 72 69 6e 74 20 61 6e 20 74 68 69 73  d, print an this
24cd0 0a 20 2a 2a 20 6f 6e 20 73 74 61 6e 64 61 72 64  . ** on standard
24ce0 20 6f 75 74 70 75 74 20 75 73 69 6e 67 20 74 68   output using th
24cf0 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20  e format string 
24d00 67 69 76 65 6e 20 61 6e 64 20 72 65 74 75 72 6e  given and return
24d10 20 31 2e 0a 20 2a 2a 20 49 66 20 74 68 65 72 65   1.. ** If there
24d20 20 61 72 65 20 6e 6f 20 63 6f 6e 66 6c 69 63 74   are no conflict
24d30 69 6e 67 20 6c 6f 63 6b 73 2c 20 72 65 74 75 72  ing locks, retur
24d40 6e 20 30 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  n 0.. */.static 
24d50 69 6e 74 20 75 6e 69 78 49 73 4c 6f 63 6b 65 64  int unixIsLocked
24d60 28 0a 20 20 70 69 64 5f 74 20 70 69 64 2c 20 20  (.  pid_t pid,  
24d70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 49 44            /* PID
24d80 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6c 6f 63   to test for loc
24d90 6b 20 6f 77 6e 65 72 20 2a 2f 0a 20 20 69 6e 74  k owner */.  int
24da0 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   h,             
24db0 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
24dc0 69 70 74 6f 72 20 74 6f 20 63 68 65 63 6b 20 2a  iptor to check *
24dd0 2f 0a 20 20 69 6e 74 20 74 79 70 65 2c 20 20 20  /.  int type,   
24de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f 52            /* F_R
24df0 44 4c 43 4b 20 6f 72 20 46 5f 57 52 4c 43 4b 20  DLCK or F_WRLCK 
24e00 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  */.  unsigned in
24e10 74 20 69 4f 66 73 74 2c 20 20 20 2f 2a 20 46 69  t iOfst,   /* Fi
24e20 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
24e30 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
24e40 65 64 20 69 6e 74 20 69 43 6e 74 2c 20 20 20 20  ed int iCnt,    
24e50 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
24e60 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 20 72  es in the lock r
24e70 61 6e 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ange */.  const 
24e80 63 68 61 72 20 2a 7a 54 79 70 65 20 20 20 20 20  char *zType     
24e90 2f 2a 20 54 79 70 65 20 6f 66 20 6c 6f 63 6b 20  /* Type of lock 
24ea0 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66  */.){.  struct f
24eb0 6c 6f 63 6b 20 6c 6b 3b 0a 20 20 69 6e 74 20 65  lock lk;.  int e
24ec0 72 72 3b 0a 20 20 0a 20 20 6d 65 6d 73 65 74 28  rr;.  .  memset(
24ed0 26 6c 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6c  &lk, 0, sizeof(l
24ee0 6b 29 29 3b 0a 20 20 6c 6b 2e 6c 5f 74 79 70 65  k));.  lk.l_type
24ef0 20 3d 20 74 79 70 65 3b 0a 20 20 6c 6b 2e 6c 5f   = type;.  lk.l_
24f00 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
24f10 54 3b 0a 20 20 6c 6b 2e 6c 5f 73 74 61 72 74 20  T;.  lk.l_start 
24f20 3d 20 69 4f 66 73 74 3b 0a 20 20 6c 6b 2e 6c 5f  = iOfst;.  lk.l_
24f30 6c 65 6e 20 3d 20 69 43 6e 74 3b 0a 20 20 0a 20  len = iCnt;.  . 
24f40 20 69 66 28 20 70 69 64 21 3d 53 51 4c 49 54 45   if( pid!=SQLITE
24f50 5f 4c 4f 43 4b 53 54 41 54 45 5f 41 4e 59 50 49  _LOCKSTATE_ANYPI
24f60 44 20 29 7b 0a 23 69 66 6e 64 65 66 20 46 5f 47  D ){.#ifndef F_G
24f70 45 54 4c 4b 50 49 44 0a 23 20 77 61 72 6e 69 6e  ETLKPID.# warnin
24f80 67 20 46 5f 47 45 54 4c 4b 50 49 44 20 75 6e 64  g F_GETLKPID und
24f90 65 66 69 6e 65 64 2c 20 5f 73 71 6c 69 74 65 33  efined, _sqlite3
24fa0 5f 6c 6f 63 6b 73 74 61 74 65 20 66 61 6c 6c 69  _lockstate falli
24fb0 6e 67 20 62 61 63 6b 20 74 6f 20 46 5f 47 45 54  ng back to F_GET
24fc0 4c 4b 0a 20 20 20 20 65 72 72 20 3d 20 66 63 6e  LK.    err = fcn
24fd0 74 6c 28 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  tl(h, F_GETLK, &
24fe0 6c 6b 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6c  lk);.#else.    l
24ff0 6b 2e 6c 5f 70 69 64 20 3d 20 70 69 64 3b 0a 20  k.l_pid = pid;. 
25000 20 20 20 65 72 72 20 3d 20 66 63 6e 74 6c 28 68     err = fcntl(h
25010 2c 20 46 5f 47 45 54 4c 4b 50 49 44 2c 20 26 6c  , F_GETLKPID, &l
25020 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  k);.#endif.  }el
25030 73 65 7b 0a 20 20 20 20 65 72 72 20 3d 20 66 63  se{.    err = fc
25040 6e 74 6c 28 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  ntl(h, F_GETLK, 
25050 26 6c 6b 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69  &lk);.  }.  .  i
25060 66 28 20 65 72 72 3d 3d 28 2d 31 29 20 29 7b 0a  f( err==(-1) ){.
25070 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
25080 72 72 2c 20 22 66 63 6e 74 6c 28 25 64 29 20 66  rr, "fcntl(%d) f
25090 61 69 6c 65 64 3a 20 65 72 72 6e 6f 3d 25 64 5c  ailed: errno=%d\
250a0 6e 22 2c 20 68 2c 20 65 72 72 6e 6f 29 3b 0a 20  n", h, errno);. 
250b0 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
250c0 7d 0a 20 20 0a 20 20 69 66 28 20 6c 6b 2e 6c 5f  }.  .  if( lk.l_
250d0 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 26 26  type!=F_UNLCK &&
250e0 20 28 70 69 64 3d 3d 53 51 4c 49 54 45 5f 4c 4f   (pid==SQLITE_LO
250f0 43 4b 53 54 41 54 45 5f 41 4e 59 50 49 44 20 7c  CKSTATE_ANYPID |
25100 7c 20 6c 6b 2e 6c 5f 70 69 64 3d 3d 70 69 64 29  | lk.l_pid==pid)
25110 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
25120 45 5f 44 45 42 55 47 0a 20 20 20 20 66 70 72 69  E_DEBUG.    fpri
25130 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 20  ntf(stderr, "%s 
25140 6c 6f 63 6b 20 68 65 6c 64 20 62 79 20 25 64 5c  lock held by %d\
25150 6e 22 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29  n", zType, (int)
25160 6c 6b 2e 6c 5f 70 69 64 29 3b 0a 23 65 6e 64 69  lk.l_pid);.#endi
25170 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  f.    return 1;.
25180 20 20 7d 20 0a 20 20 72 65 74 75 72 6e 20 30 3b    } .  return 0;
25190 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .}..static int u
251a0 6e 69 78 4c 6f 63 6b 73 74 61 74 65 50 69 64 28  nixLockstatePid(
251b0 75 6e 69 78 46 69 6c 65 20 2a 2c 20 70 69 64 5f  unixFile *, pid_
251c0 74 2c 20 69 6e 74 20 2a 29 3b 0a 0a 23 65 6e 64  t, int *);..#end
251d0 69 66 20 2f 2a 20 28 53 51 4c 49 54 45 5f 45 4e  if /* (SQLITE_EN
251e0 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30  ABLE_APPLE_SPI>0
251f0 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  ) && defined(__A
25200 50 50 4c 45 5f 5f 29 20 2a 2f 0a 0a 0a 2f 2a 0a  PPLE__) */.../*.
25210 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 69  ** If *pArg is i
25220 6e 69 74 69 61 6c 6c 79 20 6e 65 67 61 74 69 76  nitially negativ
25230 65 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61  e then this is a
25240 20 71 75 65 72 79 2e 20 20 53 65 74 20 2a 70 41   query.  Set *pA
25250 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20  rg to.** 1 or 0 
25260 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
25270 74 68 65 72 20 6f 72 20 6e 6f 74 20 62 69 74 20  ther or not bit 
25280 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63  mask of pFile->c
25290 74 72 6c 46 6c 61 67 73 20 69 73 20 73 65 74 2e  trlFlags is set.
252a0 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20  .**.** If *pArg 
252b0 69 73 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20  is 0 or 1, then 
252c0 63 6c 65 61 72 20 6f 72 20 73 65 74 20 74 68 65  clear or set the
252d0 20 6d 61 73 6b 20 62 69 74 20 6f 66 20 70 46 69   mask bit of pFi
252e0 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a  le->ctrlFlags..*
252f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
25300 69 78 4d 6f 64 65 42 69 74 28 75 6e 69 78 46 69  ixModeBit(unixFi
25310 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67  le *pFile, unsig
25320 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20 69  ned char mask, i
25330 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69 66 28  nt *pArg){.  if(
25340 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20 20 20   *pArg<0 ){.    
25350 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e  *pArg = (pFile->
25360 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b  ctrlFlags & mask
25370 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66  )!=0;.  }else if
25380 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a  ( (*pArg)==0 ){.
25390 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
253a0 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  lags &= ~mask;. 
253b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
253c0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  e->ctrlFlags |= 
253d0 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  mask;.  }.}../* 
253e0 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
253f0 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ion */.static in
25400 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d  t unixGetTempnam
25410 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  e(int nBuf, char
25420 20 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20   *zBuf);../*.** 
25430 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20  Information and 
25440 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70  control of an op
25450 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a  en file handle..
25460 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
25470 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  ixFileControl(sq
25480 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
25490 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41  int op, void *pA
254a0 72 67 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  rg){.  unixFile 
254b0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
254c0 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69 74 63 68  le*)id;.  switch
254d0 28 20 6f 70 20 29 7b 0a 23 69 66 20 64 65 66 69  ( op ){.#if defi
254e0 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26  ned(__linux__) &
254f0 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
25500 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54  _ENABLE_BATCH_AT
25510 4f 4d 49 43 5f 57 52 49 54 45 29 0a 20 20 20 20  OMIC_WRITE).    
25520 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
25530 4c 5f 42 45 47 49 4e 5f 41 54 4f 4d 49 43 5f 57  L_BEGIN_ATOMIC_W
25540 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e  RITE: {.      in
25550 74 20 72 63 20 3d 20 6f 73 49 6f 63 74 6c 28 70  t rc = osIoctl(p
25560 46 69 6c 65 2d 3e 68 2c 20 46 32 46 53 5f 49 4f  File->h, F2FS_IO
25570 43 5f 53 54 41 52 54 5f 41 54 4f 4d 49 43 5f 57  C_START_ATOMIC_W
25580 52 49 54 45 29 3b 0a 20 20 20 20 20 20 72 65 74  RITE);.      ret
25590 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f  urn rc ? SQLITE_
255a0 49 4f 45 52 52 5f 42 45 47 49 4e 5f 41 54 4f 4d  IOERR_BEGIN_ATOM
255b0 49 43 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  IC : SQLITE_OK;.
255c0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
255d0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d  QLITE_FCNTL_COMM
255e0 49 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 3a  IT_ATOMIC_WRITE:
255f0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20   {.      int rc 
25600 3d 20 6f 73 49 6f 63 74 6c 28 70 46 69 6c 65 2d  = osIoctl(pFile-
25610 3e 68 2c 20 46 32 46 53 5f 49 4f 43 5f 43 4f 4d  >h, F2FS_IOC_COM
25620 4d 49 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  MIT_ATOMIC_WRITE
25630 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
25640 72 63 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc ? SQLITE_IOER
25650 52 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d 49 43 20  R_COMMIT_ATOMIC 
25660 3a 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  : SQLITE_OK;.   
25670 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
25680 54 45 5f 46 43 4e 54 4c 5f 52 4f 4c 4c 42 41 43  TE_FCNTL_ROLLBAC
25690 4b 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 3a 20  K_ATOMIC_WRITE: 
256a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  {.      int rc =
256b0 20 6f 73 49 6f 63 74 6c 28 70 46 69 6c 65 2d 3e   osIoctl(pFile->
256c0 68 2c 20 46 32 46 53 5f 49 4f 43 5f 41 42 4f 52  h, F2FS_IOC_ABOR
256d0 54 5f 56 4f 4c 41 54 49 4c 45 5f 57 52 49 54 45  T_VOLATILE_WRITE
256e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
256f0 72 63 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc ? SQLITE_IOER
25700 52 5f 52 4f 4c 4c 42 41 43 4b 5f 41 54 4f 4d 49  R_ROLLBACK_ATOMI
25710 43 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  C : SQLITE_OK;. 
25720 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f     }.#endif /* _
25730 5f 6c 69 6e 75 78 5f 5f 20 26 26 20 53 51 4c 49  _linux__ && SQLI
25740 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f  TE_ENABLE_BATCH_
25750 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 2a 2f 0a  ATOMIC_WRITE */.
25760 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
25770 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45  _FCNTL_LOCKSTATE
25780 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
25790 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 65  )pArg = pFile->e
257a0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20  FileLock;.      
257b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
257c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
257d0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 41   SQLITE_FCNTL_LA
257e0 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20  ST_ERRNO: {.    
257f0 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
25800 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
25810 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
25820 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
25830 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
25840 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45  FCNTL_CHUNK_SIZE
25850 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  : {.      pFile-
25860 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74  >szChunk = *(int
25870 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72   *)pArg;.      r
25880 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25890 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
258a0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
258b0 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20  E_HINT: {.      
258c0 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 53 69  int rc;.      Si
258d0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
258e0 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63  ign(1);.      rc
258f0 20 3d 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74   = fcntlSizeHint
25900 28 70 46 69 6c 65 2c 20 2a 28 69 36 34 20 2a 29  (pFile, *(i64 *)
25910 70 41 72 67 29 3b 0a 20 20 20 20 20 20 53 69 6d  pArg);.      Sim
25920 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
25930 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 72 65 74  gn(0);.      ret
25940 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
25950 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
25960 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a  NTL_PERSIST_WAL:
25970 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64   {.      unixMod
25980 65 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58  eBit(pFile, UNIX
25990 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c  FILE_PERSIST_WAL
259a0 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20  , (int*)pArg);. 
259b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
259c0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
259d0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
259e0 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  TL_POWERSAFE_OVE
259f0 52 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20  RWRITE: {.      
25a00 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69 6c  unixModeBit(pFil
25a10 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57  e, UNIXFILE_PSOW
25a20 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20  , (int*)pArg);. 
25a30 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
25a40 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
25a50 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
25a60 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20  TL_VFSNAME: {.  
25a70 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72      *(char**)pAr
25a80 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
25a90 6e 74 66 28 22 25 73 22 2c 20 70 46 69 6c 65 2d  ntf("%s", pFile-
25aa0 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  >pVfs->zName);. 
25ab0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
25ac0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
25ad0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
25ae0 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a  TL_TEMPFILENAME:
25af0 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a   {.      char *z
25b00 54 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  TFile = sqlite3_
25b10 6d 61 6c 6c 6f 63 36 34 28 20 70 46 69 6c 65 2d  malloc64( pFile-
25b20 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
25b30 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  e );.      if( z
25b40 54 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  TFile ){.       
25b50 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65   unixGetTempname
25b60 28 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78  (pFile->pVfs->mx
25b70 50 61 74 68 6e 61 6d 65 2c 20 7a 54 46 69 6c 65  Pathname, zTFile
25b80 29 3b 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61  );.        *(cha
25b90 72 2a 2a 29 70 41 72 67 20 3d 20 7a 54 46 69 6c  r**)pArg = zTFil
25ba0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
25bb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25bc0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
25bd0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48  e SQLITE_FCNTL_H
25be0 41 53 5f 4d 4f 56 45 44 3a 20 7b 0a 20 20 20 20  AS_MOVED: {.    
25bf0 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
25c00 66 69 6c 65 48 61 73 4d 6f 76 65 64 28 70 46 69  fileHasMoved(pFi
25c10 6c 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  le);.      retur
25c20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
25c30 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
25c40 5f 45 4e 41 42 4c 45 5f 53 45 54 4c 4b 5f 54 49  _ENABLE_SETLK_TI
25c50 4d 45 4f 55 54 0a 20 20 20 20 63 61 73 65 20 53  MEOUT.    case S
25c60 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b  QLITE_FCNTL_LOCK
25c70 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a 20 20 20 20  _TIMEOUT: {.    
25c80 20 20 70 46 69 6c 65 2d 3e 69 42 75 73 79 54 69    pFile->iBusyTi
25c90 6d 65 6f 75 74 20 3d 20 2a 28 69 6e 74 2a 29 70  meout = *(int*)p
25ca0 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Arg;.      retur
25cb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
25cc0 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   }.#endif.#if SQ
25cd0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
25ce0 5a 45 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51  ZE>0.    case SQ
25cf0 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
25d00 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 36  SIZE: {.      i6
25d10 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69  4 newLimit = *(i
25d20 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  64*)pArg;.      
25d30 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
25d40 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  OK;.      if( ne
25d50 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c  wLimit>sqlite3Gl
25d60 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61  obalConfig.mxMma
25d70 70 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77  p ){.        new
25d80 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 47  Limit = sqlite3G
25d90 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d  lobalConfig.mxMm
25da0 61 70 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ap;.      }..   
25db0 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20     /* The value 
25dc0 6f 66 20 6e 65 77 4c 69 6d 69 74 20 6d 61 79 20  of newLimit may 
25dd0 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61  be eventually ca
25de0 73 74 20 74 6f 20 28 73 69 7a 65 5f 74 29 20 61  st to (size_t) a
25df0 6e 64 20 70 61 73 73 65 64 0a 20 20 20 20 20 20  nd passed.      
25e00 2a 2a 20 74 6f 20 6d 6d 61 70 28 29 2e 20 52 65  ** to mmap(). Re
25e10 73 74 72 69 63 74 20 69 74 73 20 76 61 6c 75 65  strict its value
25e20 20 74 6f 20 32 47 42 20 69 66 20 28 73 69 7a 65   to 2GB if (size
25e30 5f 74 29 20 69 73 20 6e 6f 74 20 61 74 20 6c 65  _t) is not at le
25e40 61 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 36  ast a.      ** 6
25e50 34 2d 62 69 74 20 74 79 70 65 2e 20 2a 2f 0a 20  4-bit type. */. 
25e60 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69       if( newLimi
25e70 74 3e 30 20 26 26 20 73 69 7a 65 6f 66 28 73 69  t>0 && sizeof(si
25e80 7a 65 5f 74 29 3c 38 20 29 7b 0a 20 20 20 20 20  ze_t)<8 ){.     
25e90 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 28 6e     newLimit = (n
25ea0 65 77 4c 69 6d 69 74 20 26 20 30 78 37 46 46 46  ewLimit & 0x7FFF
25eb0 46 46 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  FFFF);.      }..
25ec0 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70 41 72        *(i64*)pAr
25ed0 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  g = pFile->mmapS
25ee0 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20 69 66  izeMax;.      if
25ef0 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26 26  ( newLimit>=0 &&
25f00 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c 65   newLimit!=pFile
25f10 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26 26  ->mmapSizeMax &&
25f20 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f 75   pFile->nFetchOu
25f30 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
25f40 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
25f50 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20  ax = newLimit;. 
25f60 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65         if( pFile
25f70 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a  ->mmapSize>0 ){.
25f80 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 55 6e            unixUn
25f90 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a  mapfile(pFile);.
25fa0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
25fb0 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69 6c 65  nixMapfile(pFile
25fc0 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  , -1);.        }
25fd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
25fe0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
25ff0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
26000 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
26010 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 6c 6c  * The pager call
26020 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f  s this method to
26030 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69 74 20   signal that it 
26040 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20  has done.    ** 
26050 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74  a rollback and t
26060 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
26070 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 75 6e   is therefore un
26080 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20 20 20  changed and.    
26090 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74 20 69  ** it hence it i
260a0 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74 72 61  s OK for the tra
260b0 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67 65 20  nsaction change 
260c0 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a 20 20  counter to be.  
260d0 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a    ** unchanged..
260e0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
260f0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
26100 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20  UNCHANGED: {.   
26110 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
26120 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30  d)->dbUpdate = 0
26130 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
26140 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
26150 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
26160 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
26170 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
26180 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20  d(__APPLE__).   
26190 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
261a0 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TL_SET_LOCKPROXY
261b0 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53  FILE:.    case S
261c0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f  QLITE_FCNTL_GET_
261d0 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b  LOCKPROXYFILE: {
261e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 72  .      return pr
261f0 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69  oxyFileControl(i
26200 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20 20  d,op,pArg);.    
26210 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
26220 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
26230 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
26240 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f  ed(__APPLE__) */
26250 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 45 4e 41  .#if (SQLITE_ENA
26260 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29  BLE_APPLE_SPI>0)
26270 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
26280 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73 65 20  PLE__).    case 
26290 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 52 55  SQLITE_FCNTL_TRU
262a0 4e 43 41 54 45 5f 44 41 54 41 42 41 53 45 3a 20  NCATE_DATABASE: 
262b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 75  {.      return u
262c0 6e 69 78 54 72 75 6e 63 61 74 65 44 61 74 61 62  nixTruncateDatab
262d0 61 73 65 28 70 46 69 6c 65 2c 20 28 70 41 72 67  ase(pFile, (pArg
262e0 20 3f 20 28 2a 28 69 6e 74 20 2a 29 70 41 72 67   ? (*(int *)pArg
262f0 29 20 3a 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20  ) : 0));.    }. 
26300 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
26310 43 4e 54 4c 5f 52 45 50 4c 41 43 45 5f 44 41 54  CNTL_REPLACE_DAT
26320 41 42 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 72  ABASE: {.      r
26330 65 74 75 72 6e 20 75 6e 69 78 52 65 70 6c 61 63  eturn unixReplac
26340 65 44 61 74 61 62 61 73 65 28 70 46 69 6c 65 2c  eDatabase(pFile,
26350 20 28 73 71 6c 69 74 65 33 20 2a 29 70 41 72 67   (sqlite3 *)pArg
26360 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
26370 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
26380 4f 43 4b 53 54 41 54 45 5f 50 49 44 3a 20 7b 0a  OCKSTATE_PID: {.
26390 20 20 20 20 20 20 4c 6f 63 6b 73 74 61 74 65 50        LockstateP
263a0 49 44 20 2a 70 4c 6f 63 6b 73 74 61 74 65 3b 0a  ID *pLockstate;.
263b0 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
263c0 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 70      .      if( p
263d0 41 72 67 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  Arg==NULL ){.   
263e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
263f0 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 20 20 20  TE_MISUSE;.     
26400 20 7d 0a 20 20 20 20 20 20 70 4c 6f 63 6b 73 74   }.      pLockst
26410 61 74 65 20 3d 20 28 4c 6f 63 6b 73 74 61 74 65  ate = (Lockstate
26420 50 49 44 20 2a 29 70 41 72 67 3b 0a 20 20 20 20  PID *)pArg;.    
26430 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 63 6b 73    rc = unixLocks
26440 74 61 74 65 50 69 64 28 70 46 69 6c 65 2c 20 70  tatePid(pFile, p
26450 4c 6f 63 6b 73 74 61 74 65 2d 3e 70 69 64 2c 20  Lockstate->pid, 
26460 26 28 70 4c 6f 63 6b 73 74 61 74 65 2d 3e 73 74  &(pLockstate->st
26470 61 74 65 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ate));.      ret
26480 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
26490 20 20 20 20 0a 23 65 6e 64 69 66 20 2f 2a 20 28      .#endif /* (
264a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
264b0 50 4c 45 5f 53 50 49 3e 30 29 20 26 26 20 64 65  PLE_SPI>0) && de
264c0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
264d0 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
264e0 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
264f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46  ;.}../*.** If pF
26500 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73  d->sectorSize is
26510 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 74   non-zero when t
26520 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
26530 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 0a  called, it is a.
26540 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77  ** no-op. Otherw
26550 69 73 65 2c 20 74 68 65 20 76 61 6c 75 65 73 20  ise, the values 
26560 6f 66 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69  of pFd->sectorSi
26570 7a 65 20 61 6e 64 20 0a 2a 2a 20 70 46 64 2d 3e  ze and .** pFd->
26580 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
26590 73 74 69 63 73 20 61 72 65 20 73 65 74 20 61 63  stics are set ac
265a0 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 66  cording to the f
265b0 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a 2a 20 63  ile-system .** c
265c0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 20  haracteristics. 
265d0 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
265e0 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66   two versions of
265f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
26600 4f 6e 65 20 66 6f 72 20 51 4e 58 20 61 6e 64 20  One for QNX and 
26610 6f 6e 65 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 6f  one for all.** o
26620 74 68 65 72 20 73 79 73 74 65 6d 73 2e 0a 2a 2f  ther systems..*/
26630 0a 23 69 66 6e 64 65 66 20 5f 5f 51 4e 58 4e 54  .#ifndef __QNXNT
26640 4f 5f 5f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  O__.static void 
26650 73 65 74 44 65 76 69 63 65 43 68 61 72 61 63 74  setDeviceCharact
26660 65 72 69 73 74 69 63 73 28 75 6e 69 78 46 69 6c  eristics(unixFil
26670 65 20 2a 70 46 64 29 7b 0a 20 20 61 73 73 65 72  e *pFd){.  asser
26680 74 28 20 70 46 64 2d 3e 64 65 76 69 63 65 43 68  t( pFd->deviceCh
26690 61 72 61 63 74 65 72 69 73 74 69 63 73 3d 3d 30  aracteristics==0
266a0 20 7c 7c 20 70 46 64 2d 3e 73 65 63 74 6f 72 53   || pFd->sectorS
266b0 69 7a 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ize!=0 );.  if( 
266c0 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3d  pFd->sectorSize=
266d0 3d 30 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  =0 ){.#if define
266e0 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20  d(__linux__) && 
266f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
26700 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d  NABLE_BATCH_ATOM
26710 49 43 5f 57 52 49 54 45 29 0a 20 20 20 20 69 6e  IC_WRITE).    in
26720 74 20 72 65 73 3b 0a 20 20 20 20 75 33 32 20 66  t res;.    u32 f
26730 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 68   = 0;..    /* Ch
26740 65 63 6b 20 66 6f 72 20 73 75 70 70 6f 72 74 20  eck for support 
26750 66 6f 72 20 46 32 46 53 20 61 74 6f 6d 69 63 20  for F2FS atomic 
26760 62 61 74 63 68 20 77 72 69 74 65 73 2e 20 2a 2f  batch writes. */
26770 0a 20 20 20 20 72 65 73 20 3d 20 6f 73 49 6f 63  .    res = osIoc
26780 74 6c 28 70 46 64 2d 3e 68 2c 20 46 32 46 53 5f  tl(pFd->h, F2FS_
26790 49 4f 43 5f 47 45 54 5f 46 45 41 54 55 52 45 53  IOC_GET_FEATURES
267a0 2c 20 26 66 29 3b 0a 20 20 20 20 69 66 28 20 72  , &f);.    if( r
267b0 65 73 3d 3d 30 20 26 26 20 28 66 20 26 20 46 32  es==0 && (f & F2
267c0 46 53 5f 46 45 41 54 55 52 45 5f 41 54 4f 4d 49  FS_FEATURE_ATOMI
267d0 43 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20  C_WRITE) ){.    
267e0 20 20 70 46 64 2d 3e 64 65 76 69 63 65 43 68 61    pFd->deviceCha
267f0 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 20 53  racteristics = S
26800 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41 54 43  QLITE_IOCAP_BATC
26810 48 5f 41 54 4f 4d 49 43 3b 0a 20 20 20 20 7d 0a  H_ATOMIC;.    }.
26820 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69 6e 75  #endif /* __linu
26830 78 5f 5f 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  x__ && SQLITE_EN
26840 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49  ABLE_BATCH_ATOMI
26850 43 5f 57 52 49 54 45 20 2a 2f 0a 0a 20 20 20 20  C_WRITE */..    
26860 2f 2a 20 53 65 74 20 74 68 65 20 50 4f 57 45 52  /* Set the POWER
26870 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 66  SAFE_OVERWRITE f
26880 6c 61 67 20 69 66 20 72 65 71 75 65 73 74 65 64  lag if requested
26890 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 64  . */.    if( pFd
268a0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
268b0 49 58 46 49 4c 45 5f 50 53 4f 57 20 29 7b 0a 20  IXFILE_PSOW ){. 
268c0 20 20 20 20 20 70 46 64 2d 3e 64 65 76 69 63 65       pFd->device
268d0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
268e0 7c 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  |= SQLITE_IOCAP_
268f0 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
26900 49 54 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ITE;.    }..    
26910 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  pFd->sectorSize 
26920 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
26930 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
26940 7d 0a 7d 0a 23 65 6c 73 65 0a 23 69 6e 63 6c 75  }.}.#else.#inclu
26950 64 65 20 3c 73 79 73 2f 64 63 6d 64 5f 62 6c 6b  de <sys/dcmd_blk
26960 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
26970 73 2f 73 74 61 74 76 66 73 2e 68 3e 0a 73 74 61  s/statvfs.h>.sta
26980 74 69 63 20 76 6f 69 64 20 73 65 74 44 65 76 69  tic void setDevi
26990 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
269a0 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  s(unixFile *pFil
269b0 65 29 7b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  e){.  if( pFile-
269c0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20 30  >sectorSize == 0
269d0 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
269e0 74 61 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a 20  tatvfs fsInfo;. 
269f0 20 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 65        .    /* Se
26a00 74 20 64 65 66 61 75 6c 74 73 20 66 6f 72 20 6e  t defaults for n
26a10 6f 6e 2d 73 75 70 70 6f 72 74 65 64 20 66 69 6c  on-supported fil
26a20 65 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20 20  esystems */.    
26a30 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
26a40 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  e = SQLITE_DEFAU
26a50 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
26a60 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
26a70 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
26a80 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 66 73   = 0;.    if( fs
26a90 74 61 74 76 66 73 28 70 46 69 6c 65 2d 3e 68 2c  tatvfs(pFile->h,
26aa0 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20   &fsInfo) == -1 
26ab0 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ) {.      return
26ac0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
26ad0 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e   !strcmp(fsInfo.
26ae0 66 5f 62 61 73 65 74 79 70 65 2c 20 22 74 6d 70  f_basetype, "tmp
26af0 22 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69  ") ) {.      pFi
26b00 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
26b10 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
26b20 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
26b30 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
26b40 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51  ics =.        SQ
26b50 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
26b60 43 34 4b 20 7c 20 20 20 20 20 20 20 2f 2a 20 41  C4K |       /* A
26b70 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  ll ram filesyste
26b80 6d 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f  m writes are ato
26b90 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  mic */.        S
26ba0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
26bb0 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20  _APPEND |    /* 
26bc0 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  growing the file
26bd0 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
26be0 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20  until.          
26bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c00 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
26c10 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64  he write succeed
26c20 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  s */.        SQL
26c30 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
26c40 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68  TIAL |     /* Th
26c50 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  e ram filesystem
26c60 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65   has no write be
26c70 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  hind.           
26c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c90 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
26ca0 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a   it is ordered *
26cb0 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
26cc0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73 74   }else if( strst
26cd0 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74  r(fsInfo.f_baset
26ce0 79 70 65 2c 20 22 65 74 66 73 22 29 20 29 7b 0a  ype, "etfs") ){.
26cf0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
26d00 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
26d10 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
26d20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
26d30 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
26d40 20 20 20 20 20 20 20 2f 2a 20 65 74 66 73 20 63         /* etfs c
26d50 6c 75 73 74 65 72 20 73 69 7a 65 20 77 72 69 74  luster size writ
26d60 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f  es are atomic */
26d70 0a 20 20 20 20 20 20 20 20 28 70 46 69 6c 65 2d  .        (pFile-
26d80 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31  >sectorSize / 51
26d90 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  2 * SQLITE_IOCAP
26da0 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c 0a 20 20  _ATOMIC512) |.  
26db0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
26dc0 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c  AP_SAFE_APPEND |
26dd0 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74      /* growing t
26de0 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
26df0 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20   occur until.   
26e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20     ** the write 
26e30 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20  succeeds */.    
26e40 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
26e50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20  _SEQUENTIAL |   
26e60 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c    /* The ram fil
26e70 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77  esystem has no w
26e80 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20  rite behind.    
26e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26eb0 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72    ** so it is or
26ec0 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  dered */.       
26ed0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
26ee0 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  ( !strcmp(fsInfo
26ef0 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71 6e  .f_basetype, "qn
26f00 78 36 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46  x6") ){.      pF
26f10 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
26f20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65  = fsInfo.f_bsize
26f30 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  ;.      pFile->d
26f40 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
26f50 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53  tics =.        S
26f60 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
26f70 49 43 20 7c 20 20 20 20 20 20 20 20 20 2f 2a 20  IC |         /* 
26f80 41 6c 6c 20 66 69 6c 65 73 79 73 74 65 6d 20 77  All filesystem w
26f90 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63  rites are atomic
26fa0 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
26fb0 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
26fc0 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f  PEND |    /* gro
26fd0 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f  wing the file do
26fe0 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74  es not occur unt
26ff0 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  il.             
27000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27010 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
27020 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a  write succeeds *
27030 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
27040 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
27050 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
27060 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
27070 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
27080 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
27090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270a0 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
270b0 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
270c0 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
270d0 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d 70 28  lse if( !strcmp(
270e0 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70  fsInfo.f_basetyp
270f0 65 2c 20 22 71 6e 78 34 22 29 20 29 7b 0a 20 20  e, "qnx4") ){.  
27100 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
27110 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
27120 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
27130 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
27140 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
27150 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74       /* full bit
27160 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66  set of atomics f
27170 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73  rom max sector s
27180 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20  ize and smaller 
27190 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70 46 69  */.        ((pFi
271a0 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f  le->sectorSize /
271b0 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f   512 * SQLITE_IO
271c0 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c  CAP_ATOMIC512) <
271d0 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20  < 1) - 2 |.     
271e0 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
271f0 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20  SEQUENTIAL |    
27200 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65   /* The ram file
27210 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72  system has no wr
27220 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20  ite behind.     
27230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27250 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64   ** so it is ord
27260 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
27270 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
27280 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66   strstr(fsInfo.f
27290 5f 62 61 73 65 74 79 70 65 2c 20 22 64 6f 73 22  _basetype, "dos"
272a0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
272b0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66  ->sectorSize = f
272c0 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20  sInfo.f_bsize;. 
272d0 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69       pFile->devi
272e0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
272f0 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66  s =.        /* f
27300 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74  ull bitset of at
27310 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73  omics from max s
27320 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73  ector size and s
27330 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20  maller */.      
27340 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f    ((pFile->secto
27350 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51  rSize / 512 * SQ
27360 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
27370 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20  C512) << 1) - 2 
27380 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  |.        SQLITE
27390 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
273a0 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
273b0 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
273c0 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
273d0 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
273e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273f0 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
27400 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
27410 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
27420 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
27430 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
27440 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
27450 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41    SQLITE_IOCAP_A
27460 54 4f 4d 49 43 35 31 32 20 7c 20 20 20 20 20 20  TOMIC512 |      
27470 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65 20 61 74  /* blocks are at
27480 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20  omic */.        
27490 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
274a0 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a  E_APPEND |    /*
274b0 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c   growing the fil
274c0 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  e does not occur
274d0 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20   until.         
274e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
27500 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65  the write succee
27510 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ds */.        0;
27520 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
27530 4c 61 73 74 20 63 68 61 6e 63 65 20 76 65 72 69  Last chance veri
27540 66 69 63 61 74 69 6f 6e 2e 20 20 49 66 20 74 68  fication.  If th
27550 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
27560 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  n't a multiple o
27570 66 20 35 31 32 0a 20 20 2a 2a 20 74 68 65 6e 20  f 512.  ** then 
27580 69 74 20 69 73 6e 27 74 20 76 61 6c 69 64 2e 2a  it isn't valid.*
27590 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  /.  if( pFile->s
275a0 65 63 74 6f 72 53 69 7a 65 20 25 20 35 31 32 20  ectorSize % 512 
275b0 21 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  != 0 ){.    pFil
275c0 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
275d0 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20  eristics = 0;.  
275e0 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
275f0 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
27600 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
27610 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
27620 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
27630 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20   sector size in 
27640 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64  bytes of the und
27650 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65  erlying block de
27660 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  vice for.** the 
27670 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20  specified file. 
27680 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61  This is almost a
27690 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c  lways 512 bytes,
276a0 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c   but may be.** l
276b0 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64  arger for some d
276c0 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51  evices..**.** SQ
276d0 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65  Lite code assume
276e0 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
276f0 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20  cannot fail. It 
27700 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61  also assumes tha
27710 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65  t.** if two file
27720 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e  s are created in
27730 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73   the same file-s
27740 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20  ystem directory 
27750 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62  (i.e..** a datab
27760 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72  ase and its jour
27770 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74  nal file) that t
27780 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77  he sector size w
27790 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61  ill be the.** sa
277a0 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a  me for both..*/.
277b0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
277c0 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
277d0 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75  3_file *id){.  u
277e0 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28  nixFile *pFd = (
277f0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
27800 73 65 74 44 65 76 69 63 65 43 68 61 72 61 63 74  setDeviceCharact
27810 65 72 69 73 74 69 63 73 28 70 46 64 29 3b 0a 20  eristics(pFd);. 
27820 20 72 65 74 75 72 6e 20 70 46 64 2d 3e 73 65 63   return pFd->sec
27830 74 6f 72 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  torSize;.}../*.*
27840 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76  * Return the dev
27850 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
27860 69 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ics for the file
27870 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 56 46 53  ..**.** This VFS
27880 20 69 73 20 73 65 74 20 75 70 20 74 6f 20 72 65   is set up to re
27890 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41  turn SQLITE_IOCA
278a0 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
278b0 57 52 49 54 45 20 62 79 20 64 65 66 61 75 6c 74  WRITE by default
278c0 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68  ..** However, th
278d0 61 74 20 63 68 6f 69 63 65 20 69 73 20 63 6f 6e  at choice is con
278e0 74 72 6f 76 65 72 73 69 61 6c 20 73 69 6e 63 65  troversial since
278f0 20 74 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65   technically the
27900 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 66   underlying.** f
27910 69 6c 65 20 73 79 73 74 65 6d 20 64 6f 65 73 20  ile system does 
27920 6e 6f 74 20 61 6c 77 61 79 73 20 70 72 6f 76 69  not always provi
27930 64 65 20 70 6f 77 65 72 73 61 66 65 20 6f 76 65  de powersafe ove
27940 72 77 72 69 74 65 73 2e 20 20 28 49 6e 20 6f 74  rwrites.  (In ot
27950 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 66  her.** words, af
27960 74 65 72 20 61 20 70 6f 77 65 72 2d 6c 6f 73 73  ter a power-loss
27970 20 65 76 65 6e 74 2c 20 70 61 72 74 73 20 6f 66   event, parts of
27980 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77   the file that w
27990 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20 77 72 69  ere never.** wri
279a0 74 74 65 6e 20 6d 69 67 68 74 20 65 6e 64 20 75  tten might end u
279b0 70 20 62 65 69 6e 67 20 61 6c 74 65 72 65 64 2e  p being altered.
279c0 29 20 20 48 6f 77 65 76 65 72 2c 20 6e 6f 6e 2d  )  However, non-
279d0 50 53 4f 57 20 62 65 68 61 76 69 6f 72 20 69 73  PSOW behavior is
279e0 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72 79 20 72   very,.** very r
279f0 61 72 65 2e 20 20 41 6e 64 20 61 73 73 65 72 74  are.  And assert
27a00 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65 73 20 61  ing PSOW makes a
27a10 20 6c 61 72 67 65 20 72 65 64 75 63 74 69 6f 6e   large reduction
27a20 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a   in the amount.*
27a30 2a 20 6f 66 20 72 65 71 75 69 72 65 64 20 49 2f  * of required I/
27a40 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e 67  O for journaling
27a50 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74 20 6f 66  , since a lot of
27a60 20 70 61 64 64 69 6e 67 20 69 73 20 65 6c 69 6d   padding is elim
27a70 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48 65 6e 63  inated..**  Henc
27a80 65 2c 20 77 68 69 6c 65 20 50 4f 57 45 52 53 41  e, while POWERSA
27a90 46 45 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20  FE_OVERWRITE is 
27aa0 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 2c 20 74  on by default, t
27ab0 68 65 72 65 20 69 73 20 61 20 66 69 6c 65 2d 63  here is a file-c
27ac0 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c 61  ontrol.** availa
27ad0 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f  ble to turn it o
27ae0 66 66 20 61 6e 64 20 55 52 49 20 71 75 65 72 79  ff and URI query
27af0 20 70 61 72 61 6d 65 74 65 72 20 61 76 61 69 6c   parameter avail
27b00 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20  able to turn it 
27b10 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  off..*/.static i
27b20 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68 61  nt unixDeviceCha
27b30 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c  racteristics(sql
27b40 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
27b50 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20    unixFile *pFd 
27b60 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
27b70 0a 20 20 73 65 74 44 65 76 69 63 65 43 68 61 72  .  setDeviceChar
27b80 61 63 74 65 72 69 73 74 69 63 73 28 70 46 64 29  acteristics(pFd)
27b90 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 64 2d 3e  ;.  return pFd->
27ba0 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
27bb0 73 74 69 63 73 3b 0a 7d 0a 0a 23 69 66 20 21 64  stics;.}..#if !d
27bc0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
27bd0 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
27be0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
27bf0 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  0../*.** Return 
27c00 74 68 65 20 73 79 73 74 65 6d 20 70 61 67 65 20  the system page 
27c10 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  size..**.** This
27c20 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
27c30 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 64   not be called d
27c40 69 72 65 63 74 6c 79 20 62 79 20 6f 74 68 65 72  irectly by other
27c50 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69   code in this fi
27c60 6c 65 2e 20 0a 2a 2a 20 49 6e 73 74 65 61 64 2c  le. .** Instead,
27c70 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 63 61   it should be ca
27c80 6c 6c 65 64 20 76 69 61 20 6d 61 63 72 6f 20 6f  lled via macro o
27c90 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 2e 0a  sGetpagesize()..
27ca0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
27cb0 69 78 47 65 74 70 61 67 65 73 69 7a 65 28 76 6f  ixGetpagesize(vo
27cc0 69 64 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  id){.#if OS_VXWO
27cd0 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 31 30 32  RKS.  return 102
27ce0 34 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  4;.#elif defined
27cf0 28 5f 42 53 44 5f 53 4f 55 52 43 45 29 0a 20 20  (_BSD_SOURCE).  
27d00 72 65 74 75 72 6e 20 67 65 74 70 61 67 65 73 69  return getpagesi
27d10 7a 65 28 29 3b 0a 23 65 6c 73 65 0a 20 20 72 65  ze();.#else.  re
27d20 74 75 72 6e 20 28 69 6e 74 29 73 79 73 63 6f 6e  turn (int)syscon
27d30 66 28 5f 53 43 5f 50 41 47 45 53 49 5a 45 29 3b  f(_SC_PAGESIZE);
27d40 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 65 6e 64 69  .#endif.}..#endi
27d50 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
27d60 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c  LITE_OMIT_WAL) |
27d70 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  | SQLITE_MAX_MMA
27d80 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 23 69 66  P_SIZE>0 */..#if
27d90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
27da0 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65  _WAL../*.** Obje
27db0 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ct used to repre
27dc0 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20 6d  sent an shared m
27dd0 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20 0a  emory buffer.  .
27de0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74 69  **.** When multi
27df0 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20  ple threads all 
27e00 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61  reference the sa
27e10 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65 61  me wal-index, ea
27e20 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61 73  ch thread.** has
27e30 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68 6d   its own unixShm
27e40 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65   object, but the
27e50 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 61  y all point to a
27e60 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65   single instance
27e70 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69 78  .** of this unix
27e80 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e 20  ShmNode object. 
27e90 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
27ea0 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78 20   each wal-index 
27eb0 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c  is opened.** onl
27ec0 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65  y once per proce
27ed0 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 75  ss..**.** Each u
27ee0 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
27ef0 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74  t is connected t
27f00 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78 49  o a single unixI
27f10 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  nodeInfo object.
27f20 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f 61  .** We could coa
27f30 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65 63  lesce this objec
27f40 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64 65  t into unixInode
27f50 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20 77  Info, but that w
27f60 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76 65  ould mean.** eve
27f70 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68 61  ry open file tha
27f80 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 73  t does not use s
27f90 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69 6e  hared memory (in
27fa0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 6f   other words, mo
27fb0 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65 73  st.** open files
27fc0 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f 20  ) would have to 
27fd0 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68 69  carry around thi
27fe0 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  s extra informat
27ff0 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65 20  ion.  So.** the 
28000 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
28010 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  ject contains a 
28020 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
28030 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
28040 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75 6e  ct.** and the un
28050 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
28060 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c 79   is created only
28070 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a   when needed..**
28080 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  .** unixMutexHel
28090 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65  d() must be true
280a0 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f   when creating o
280b0 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20  r destroying.** 
280c0 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77  this object or w
280d0 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20  hile reading or 
280e0 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c  writing the foll
280f0 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a  owing fields:.**
28100 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a  .**      nRef.**
28110 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
28120 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  g fields are rea
28130 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65  d-only after the
28140 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
28150 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20  ed:.** .**      
28160 68 53 68 6d 0a 2a 2a 20 20 20 20 20 20 7a 46 69  hShm.**      zFi
28170 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
28180 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e  her unixShmNode.
28190 70 53 68 6d 4d 75 74 65 78 20 6d 75 73 74 20 62  pShmMutex must b
281a0 65 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53 68  e held or unixSh
281b0 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e  mNode.nRef==0 an
281c0 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65  d.** unixMutexHe
281d0 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65  ld() is true whe
281e0 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  n reading or wri
281f0 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66  ting any other f
28200 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  ield.** in this 
28210 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
28220 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ruct unixShmNode
28230 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e   {.  unixInodeIn
28240 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20  fo *pInode;     
28250 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  /* unixInodeInfo
28260 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20   that owns this 
28270 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71  SHM node */.  sq
28280 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 53 68  lite3_mutex *pSh
28290 6d 4d 75 74 65 78 3b 20 20 2f 2a 20 4d 75 74 65  mMutex;  /* Mute
282a0 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 69 73  x to access this
282b0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61   object */.  cha
282c0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20  r *zFilename;   
282d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
282e0 6f 66 20 74 68 65 20 6d 6d 61 70 70 65 64 20 66  of the mmapped f
282f0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 53 68  ile */.  int hSh
28300 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
28310 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65      /* Open file
28320 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
28330 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20   int szRegion;  
28340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
28350 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65  ize of shared-me
28360 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  mory regions */.
28370 20 20 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20 20    u16 nRegion;  
28380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28390 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70  Size of array ap
283a0 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69  Region */.  u8 i
283b0 73 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20  sReadonly;      
283c0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
283d0 66 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  f read-only */. 
283e0 20 75 38 20 69 73 55 6e 6c 6f 63 6b 65 64 3b 20   u8 isUnlocked; 
283f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
28400 72 75 65 20 69 66 20 6e 6f 20 44 4d 53 20 6c 6f  rue if no DMS lo
28410 63 6b 20 68 65 6c 64 20 2a 2f 0a 20 20 63 68 61  ck held */.  cha
28420 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20  r **apRegion;   
28430 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
28440 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72 65   of mapped share
28450 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
28460 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
28470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28480 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
28490 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  ixShm objects po
284a0 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
284b0 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69  /.  unixShm *pFi
284c0 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rst;           /
284d0 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62  * All unixShm ob
284e0 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
284f0 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66  o this */.#ifdef
28500 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
28510 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  u8 exclMask;    
28520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
28530 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
28540 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
28550 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20  u8 sharedMask;  
28560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
28570 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
28580 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20  ks held */.  u8 
28590 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20  nextShmId;      
285a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
285b0 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68  available unixSh
285c0 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65  m.id value */.#e
285d0 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53  ndif.};../*.** S
285e0 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e  tructure used in
285f0 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73  ternally by this
28600 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74   VFS to record t
28610 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a  he state of an.*
28620 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65  * open shared me
28630 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  mory connection.
28640 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
28650 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
28660 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
28670 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
28680 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61  created and.** a
28690 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65  re read-only the
286a0 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20  reafter:.**.**  
286b0 20 20 75 6e 69 78 53 68 6d 2e 70 53 68 6d 4e 6f    unixShm.pShmNo
286c0 64 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d  de.**    unixShm
286d0 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74  .id.**.** All ot
286e0 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72  her fields are r
286f0 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20  ead/write.  The 
28700 75 6e 69 78 53 68 6d 2e 70 53 68 6d 4e 6f 64 65  unixShm.pShmNode
28710 2d 3e 70 53 68 6d 4d 75 74 65 78 20 6d 75 73 74  ->pShmMutex must
28720 0a 2a 2a 20 62 65 20 68 65 6c 64 20 77 68 69 6c  .** be held whil
28730 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20  e accessing any 
28740 72 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64  read/write field
28750 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  s..*/.struct uni
28760 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53 68 6d  xShm {.  unixShm
28770 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
28780 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
28790 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d 4e 6f 64  lying unixShmNod
287a0 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 6e  e object */.  un
287b0 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20  ixShm *pNext;   
287c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
287d0 20 75 6e 69 78 53 68 6d 20 77 69 74 68 20 74 68   unixShm with th
287e0 65 20 73 61 6d 65 20 75 6e 69 78 53 68 6d 4e 6f  e same unixShmNo
287f0 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75  de */.  u8 hasMu
28800 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  tex;            
28810 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f     /* True if ho
28820 6c 64 69 6e 67 20 74 68 65 20 75 6e 69 78 53 68  lding the unixSh
28830 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d 75 74 65 78  mNode->pShmMutex
28840 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20 20 20   */.  u8 id;    
28850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28860 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63   /* Id of this c
28870 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 69 6e  onnection within
28880 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65   its unixShmNode
28890 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64   */.  u16 shared
288a0 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
288b0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
288c0 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
288d0 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b  .  u16 exclMask;
288e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
288f0 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
28900 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
28910 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  .};../*.** Const
28920 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f  ants used for lo
28930 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65  cking.*/.#define
28940 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20 20   UNIX_SHM_BASE  
28950 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d   ((22+SQLITE_SHM
28960 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20  _NLOCK)*4)      
28970 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b     /* first lock
28980 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65   byte */.#define
28990 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20   UNIX_SHM_DMS   
289a0 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2b   (UNIX_SHM_BASE+
289b0 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
289c0 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77  )  /* deadman sw
289d0 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  itch */../*.** A
289e0 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69 73  pply posix advis
289f0 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c  ory locks for al
28a00 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66 73  l bytes from ofs
28a10 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b 6e  t through ofst+n
28a20 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20  -1..**.** Locks 
28a30 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61 73  block if the mas
28a40 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e 49  k is exactly UNI
28a50 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65 20  X_SHM_C and are 
28a60 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  non-blocking.** 
28a70 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
28a80 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
28a90 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e  SystemLock(.  un
28aa0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  ixFile *pFile,  
28ab0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e       /* Open con
28ac0 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 57  nection to the W
28ad0 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  AL file */.  int
28ae0 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20   lockType,      
28af0 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20      /* F_UNLCK, 
28b00 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52  F_RDLCK, or F_WR
28b10 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  LCK */.  int ofs
28b20 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
28b30 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
28b40 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
28b50 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20  ge */.  int n   
28b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28b70 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
28b80 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  s to lock */.){.
28b90 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
28ba0 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 41 70 70 6c  ShmNode; /* Appl
28bb0 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20  y locks to this 
28bc0 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f  open shared-memo
28bd0 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ry segment */.  
28be0 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20  struct flock f; 
28bf0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f         /* The po
28c00 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  six advisory loc
28c10 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 2a  king structure *
28c20 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
28c30 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65  ITE_OK;    /* Re
28c40 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 66  sult code form f
28c50 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20  cntl() */..  /* 
28c60 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e  Access to the un
28c70 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
28c80 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62   is serialized b
28c90 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a  y the caller */.
28ca0 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 46 69    pShmNode = pFi
28cb0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  le->pInode->pShm
28cc0 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Node;.  assert( 
28cd0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  pShmNode->nRef==
28ce0 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74  0 || sqlite3_mut
28cf0 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65  ex_held(pShmNode
28d00 2d 3e 70 53 68 6d 4d 75 74 65 78 29 20 29 3b 0a  ->pShmMutex) );.
28d10 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
28d20 64 65 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 75 6e  de->nRef>0 || un
28d30 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
28d40 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f  ..  /* Shared lo
28d50 63 6b 73 20 6e 65 76 65 72 20 73 70 61 6e 20 6d  cks never span m
28d60 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 79 74  ore than one byt
28d70 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  e */.  assert( n
28d80 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21  ==1 || lockType!
28d90 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f  =F_RDLCK );..  /
28da0 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77 69 74 68  * Locks are with
28db0 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73  in range */.  as
28dc0 73 65 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c  sert( n>=1 && n<
28dd0 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  =SQLITE_SHM_NLOC
28de0 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d  K );..  if( pShm
28df0 4e 6f 64 65 2d 3e 68 53 68 6d 3e 3d 30 20 29 7b  Node->hShm>=0 ){
28e00 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
28e10 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70  ze the locking p
28e20 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20  arameters */.   
28e30 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f 63 6b   f.l_type = lock
28e40 54 79 70 65 3b 0a 20 20 20 20 66 2e 6c 5f 77 68  Type;.    f.l_wh
28e50 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
28e60 0a 20 20 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d  .    f.l_start =
28e70 20 6f 66 73 74 3b 0a 20 20 20 20 66 2e 6c 5f 6c   ofst;.    f.l_l
28e80 65 6e 20 3d 20 6e 3b 0a 20 20 20 20 72 63 20 3d  en = n;.    rc =
28e90 20 6f 73 53 65 74 50 6f 73 69 78 41 64 76 69 73   osSetPosixAdvis
28ea0 6f 72 79 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  oryLock(pShmNode
28eb0 2d 3e 68 53 68 6d 2c 20 26 66 2c 20 70 46 69 6c  ->hShm, &f, pFil
28ec0 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 28 72 63  e);.    rc = (rc
28ed0 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45  !=(-1)) ? SQLITE
28ee0 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53  _OK : SQLITE_BUS
28ef0 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64  Y;.  }..  /* Upd
28f00 61 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c  ate the global l
28f10 6f 63 6b 20 73 74 61 74 65 20 61 6e 64 20 64 6f  ock state and do
28f20 20 64 65 62 75 67 20 74 72 61 63 69 6e 67 20 2a   debug tracing *
28f30 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
28f40 44 45 42 55 47 0a 20 20 7b 20 75 31 36 20 6d 61  DEBUG.  { u16 ma
28f50 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  sk;.  OSTRACE(("
28f60 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20 20  SHM-LOCK "));.  
28f70 6d 61 73 6b 20 3d 20 6f 66 73 74 3e 33 31 20 3f  mask = ofst>31 ?
28f80 20 30 78 66 66 66 66 20 3a 20 28 31 3c 3c 28 6f   0xffff : (1<<(o
28f90 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66  fst+n)) - (1<<of
28fa0 73 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  st);.  if( rc==S
28fb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28fc0 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
28fd0 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  UNLCK ){.      O
28fe0 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20  STRACE(("unlock 
28ff0 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a  %d ok", ofst));.
29000 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
29010 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
29020 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  k;.      pShmNod
29030 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d  e->sharedMask &=
29040 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73   ~mask;.    }els
29050 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  e if( lockType==
29060 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
29070 20 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d   OSTRACE(("read-
29080 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73  lock %d ok", ofs
29090 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  t));.      pShmN
290a0 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d  ode->exclMask &=
290b0 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53   ~mask;.      pS
290c0 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
290d0 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
290e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
290f0 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46  ert( lockType==F
29100 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20  _WRLCK );.      
29110 4f 53 54 52 41 43 45 28 28 22 77 72 69 74 65 2d  OSTRACE(("write-
29120 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73  lock %d ok", ofs
29130 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  t));.      pShmN
29140 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d  ode->exclMask |=
29150 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68   mask;.      pSh
29160 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
29170 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
29180 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
29190 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55  f( lockType==F_U
291a0 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  NLCK ){.      OS
291b0 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25  TRACE(("unlock %
291c0 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29  d failed", ofst)
291d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
291e0 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c   lockType==F_RDL
291f0 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
29200 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20  ACE(("read-lock 
29210 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d  failed"));.    }
29220 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
29230 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  rt( lockType==F_
29240 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f  WRLCK );.      O
29250 53 54 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c  STRACE(("write-l
29260 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20  ock %d failed", 
29270 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ofst));.    }.  
29280 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 20 2d  }.  OSTRACE((" -
29290 20 61 66 74 65 72 77 61 72 64 73 20 25 30 33 78   afterwards %03x
292a0 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20  ,%03x\n",.      
292b0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
292c0 68 61 72 65 64 4d 61 73 6b 2c 20 70 53 68 6d 4e  haredMask, pShmN
292d0 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b  ode->exclMask));
292e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
292f0 65 74 75 72 6e 20 72 63 3b 20 20 20 20 20 20 20  eturn rc;       
29300 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   .}../*.** Retur
29310 6e 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6e 75  n the minimum nu
29320 6d 62 65 72 20 6f 66 20 33 32 4b 42 20 73 68 6d  mber of 32KB shm
29330 20 72 65 67 69 6f 6e 73 20 74 68 61 74 20 73 68   regions that sh
29340 6f 75 6c 64 20 62 65 20 6d 61 70 70 65 64 20 61  ould be mapped a
29350 74 0a 2a 2a 20 61 20 74 69 6d 65 2c 20 61 73 73  t.** a time, ass
29360 75 6d 69 6e 67 20 74 68 61 74 20 65 61 63 68 20  uming that each 
29370 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20  mapping must be 
29380 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
29390 70 6c 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75  ple of the.** cu
293a0 72 72 65 6e 74 20 73 79 73 74 65 6d 20 70 61 67  rrent system pag
293b0 65 2d 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 55 73  e-size..**.** Us
293c0 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 31  ually, this is 1
293d0 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20  . The exception 
293e0 73 65 65 6d 73 20 74 6f 20 62 65 20 73 79 73 74  seems to be syst
293f0 65 6d 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e  ems that are con
29400 66 69 67 75 72 65 64 0a 2a 2a 20 74 6f 20 75 73  figured.** to us
29410 65 20 36 34 4b 42 20 70 61 67 65 73 20 2d 20 69  e 64KB pages - i
29420 6e 20 74 68 69 73 20 63 61 73 65 20 65 61 63 68  n this case each
29430 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 63 6f   mapping must co
29440 76 65 72 20 61 74 20 6c 65 61 73 74 20 74 77 6f  ver at least two
29450 0a 2a 2a 20 73 68 6d 20 72 65 67 69 6f 6e 73 2e  .** shm regions.
29460 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
29470 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d  nixShmRegionPerM
29480 61 70 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20  ap(void){.  int 
29490 73 68 6d 73 7a 20 3d 20 33 32 2a 31 30 32 34 3b  shmsz = 32*1024;
294a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
294b0 48 4d 20 72 65 67 69 6f 6e 20 73 69 7a 65 20 2a  HM region size *
294c0 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 6f  /.  int pgsz = o
294d0 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 3b 20  sGetpagesize(); 
294e0 20 20 2f 2a 20 53 79 73 74 65 6d 20 70 61 67 65    /* System page
294f0 20 73 69 7a 65 20 2a 2f 0a 20 20 61 73 73 65 72   size */.  asser
29500 74 28 20 28 28 70 67 73 7a 2d 31 29 26 70 67 73  t( ((pgsz-1)&pgs
29510 7a 29 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 50 61  z)==0 );   /* Pa
29520 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
29530 61 20 70 6f 77 65 72 20 6f 66 20 32 20 2a 2f 0a  a power of 2 */.
29540 20 20 69 66 28 20 70 67 73 7a 3c 73 68 6d 73 7a    if( pgsz<shmsz
29550 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
29560 65 74 75 72 6e 20 70 67 73 7a 2f 73 68 6d 73 7a  eturn pgsz/shmsz
29570 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65  ;.}../*.** Purge
29580 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
29590 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c  List list of all
295a0 20 65 6e 74 72 69 65 73 20 77 69 74 68 20 75 6e   entries with un
295b0 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d  ixShmNode.nRef==
295c0 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  0..**.** This is
295d0 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72 65   not a VFS share
295e0 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b  d-memory method;
295f0 20 69 74 20 69 73 20 61 20 75 74 69 6c 69 74 79   it is a utility
29600 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
29610 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72 65  .** by VFS share
29620 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73  d-memory methods
29630 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
29640 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 75 6e   unixShmPurge(un
29650 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20  ixFile *pFd){.  
29660 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 20 3d  unixShmNode *p =
29670 20 70 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53   pFd->pInode->pS
29680 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  hmNode;.  assert
29690 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
296a0 29 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  ) );.  if( p && 
296b0 41 4c 57 41 59 53 28 70 2d 3e 6e 52 65 66 3d 3d  ALWAYS(p->nRef==
296c0 30 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53  0) ){.    int nS
296d0 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e 69 78 53  hmPerMap = unixS
296e0 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 29  hmRegionPerMap()
296f0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
29700 20 61 73 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f   assert( p->pIno
29710 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65 20  de==pFd->pInode 
29720 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
29730 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 70 53 68  utex_free(p->pSh
29740 6d 4d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f 72  mMutex);.    for
29750 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69  (i=0; i<p->nRegi
29760 6f 6e 3b 20 69 2b 3d 6e 53 68 6d 50 65 72 4d 61  on; i+=nShmPerMa
29770 70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  p){.      if( p-
29780 3e 68 53 68 6d 3e 3d 30 20 29 7b 0a 20 20 20 20  >hShm>=0 ){.    
29790 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 2d 3e      osMunmap(p->
297a0 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e  apRegion[i], p->
297b0 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20  szRegion);.     
297c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
297d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
297e0 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20  apRegion[i]);.  
297f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
29800 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
29810 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69  apRegion);.    i
29820 66 28 20 70 2d 3e 68 53 68 6d 3e 3d 30 20 29 7b  f( p->hShm>=0 ){
29830 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
29840 6f 73 65 28 70 46 64 2c 20 70 2d 3e 68 53 68 6d  ose(pFd, p->hShm
29850 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
29860 20 20 20 70 2d 3e 68 53 68 6d 20 3d 20 2d 31 3b     p->hShm = -1;
29870 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49  .    }.    p->pI
29880 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d  node->pShmNode =
29890 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
298a0 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(p);.  }.}..
298b0 2f 2a 0a 2a 2a 20 54 68 65 20 44 4d 53 20 6c 6f  /*.** The DMS lo
298c0 63 6b 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  ck has not yet b
298d0 65 65 6e 20 74 61 6b 65 6e 20 6f 6e 20 73 68 6d  een taken on shm
298e0 20 66 69 6c 65 20 70 53 68 6d 4e 6f 64 65 2e 20   file pShmNode. 
298f0 41 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 74 61  Attempt to.** ta
29900 6b 65 20 69 74 20 6e 6f 77 2e 20 52 65 74 75 72  ke it now. Retur
29910 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
29920 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
29930 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a   SQLite error.**
29940 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
29950 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 44 4d  .**.** If the DM
29960 53 20 63 61 6e 6e 6f 74 20 62 65 20 6c 6f 63 6b  S cannot be lock
29970 65 64 20 62 65 63 61 75 73 65 20 74 68 69 73 20  ed because this 
29980 69 73 20 61 20 72 65 61 64 6f 6e 6c 79 5f 73 68  is a readonly_sh
29990 6d 3d 31 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  m=1 .** connecti
299a0 6f 6e 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  on and no other 
299b0 70 72 6f 63 65 73 73 20 61 6c 72 65 61 64 79 20  process already 
299c0 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 2c 20 72 65  holds a lock, re
299d0 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 52  turn.** SQLITE_R
299e0 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54  EADONLY_CANTINIT
299f0 20 61 6e 64 20 73 65 74 20 70 53 68 6d 4e 6f 64   and set pShmNod
29a00 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64 3d 31 2e  e->isUnlocked=1.
29a10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
29a20 6e 69 78 4c 6f 63 6b 53 68 61 72 65 64 4d 65 6d  nixLockSharedMem
29a30 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a 70 44  ory(unixFile *pD
29a40 62 46 64 2c 20 75 6e 69 78 53 68 6d 4e 6f 64 65  bFd, unixShmNode
29a50 20 2a 70 53 68 6d 4e 6f 64 65 29 7b 0a 20 20 73   *pShmNode){.  s
29a60 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
29a70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
29a80 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 55 73  ITE_OK;..  /* Us
29a90 65 20 46 5f 47 45 54 4c 4b 20 74 6f 20 64 65 74  e F_GETLK to det
29aa0 65 72 6d 69 6e 65 20 74 68 65 20 6c 6f 63 6b 73  ermine the locks
29ab0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
29ac0 20 61 72 65 20 68 6f 6c 64 69 6e 67 0a 20 20 2a   are holding.  *
29ad0 2a 20 6f 6e 20 74 68 65 20 44 4d 53 20 62 79 74  * on the DMS byt
29ae0 65 2e 20 49 66 20 69 74 20 69 6e 64 69 63 61 74  e. If it indicat
29af0 65 73 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20  es that another 
29b00 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
29b10 6e 67 0a 20 20 2a 2a 20 61 20 53 48 41 52 45 44  ng.  ** a SHARED
29b20 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 69 73   lock, then this
29b30 20 70 72 6f 63 65 73 73 20 6d 61 79 20 61 6c 73   process may als
29b40 6f 20 74 61 6b 65 20 61 20 53 48 41 52 45 44 20  o take a SHARED 
29b50 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 70 72  lock.  ** and pr
29b60 6f 63 65 65 64 20 77 69 74 68 20 6f 70 65 6e 69  oceed with openi
29b70 6e 67 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c  ng the *-shm fil
29b80 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72  e. .  **.  ** Or
29b90 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 70 72  , if no other pr
29ba0 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
29bb0 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20   any lock, then 
29bc0 74 68 69 73 20 70 72 6f 63 65 73 73 0a 20 20 2a  this process.  *
29bd0 2a 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74  * is the first t
29be0 6f 20 6f 70 65 6e 20 69 74 2e 20 49 6e 20 74 68  o open it. In th
29bf0 69 73 20 63 61 73 65 20 74 61 6b 65 20 61 6e 20  is case take an 
29c00 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
29c10 6e 20 74 68 65 0a 20 20 2a 2a 20 44 4d 53 20 62  n the.  ** DMS b
29c20 79 74 65 20 61 6e 64 20 74 72 75 6e 63 61 74 65  yte and truncate
29c30 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c 65 20   the *-shm file 
29c40 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
29c50 20 73 69 7a 65 2e 20 54 68 65 6e 0a 20 20 2a 2a   size. Then.  **
29c60 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20   downgrade to a 
29c70 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
29c80 68 65 20 44 4d 53 20 62 79 74 65 2e 0a 20 20 2a  he DMS byte..  *
29c90 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 6f 74 68 65  *.  ** If anothe
29ca0 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  r process is hol
29cb0 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ding an EXCLUSIV
29cc0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 44 4d  E lock on the DM
29cd0 53 20 62 79 74 65 2c 0a 20 20 2a 2a 20 72 65 74  S byte,.  ** ret
29ce0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  urn SQLITE_BUSY 
29cf0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 28 69  to the caller (i
29d00 74 20 77 69 6c 6c 20 74 72 79 20 61 67 61 69 6e  t will try again
29d10 29 2e 20 41 6e 20 65 61 72 6c 69 65 72 0a 20 20  ). An earlier.  
29d20 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  ** version of th
29d30 69 73 20 63 6f 64 65 20 61 74 74 65 6d 70 74 65  is code attempte
29d40 64 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63  d the SHARED loc
29d50 6b 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e  k at this point.
29d60 20 42 75 74 0a 20 20 2a 2a 20 74 68 69 73 20 69   But.  ** this i
29d70 6e 74 72 6f 64 75 63 65 64 20 61 20 73 75 62 74  ntroduced a subt
29d80 6c 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  le race conditio
29d90 6e 3a 20 69 66 20 74 68 65 20 70 72 6f 63 65 73  n: if the proces
29da0 73 20 68 6f 6c 64 69 6e 67 0a 20 20 2a 2a 20 45  s holding.  ** E
29db0 58 43 4c 55 53 49 56 45 20 66 61 69 6c 65 64 20  XCLUSIVE failed 
29dc0 6a 75 73 74 20 62 65 66 6f 72 65 20 74 72 75 6e  just before trun
29dd0 63 61 74 69 6e 67 20 74 68 65 20 2a 2d 73 68 6d  cating the *-shm
29de0 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 69 73   file, then this
29df0 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6d 69  .  ** process mi
29e00 67 68 74 20 6f 70 65 6e 20 61 6e 64 20 75 73 65  ght open and use
29e10 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c 65 20   the *-shm file 
29e20 77 69 74 68 6f 75 74 20 74 72 75 6e 63 61 74 69  without truncati
29e30 6e 67 20 69 74 2e 0a 20 20 2a 2a 20 41 6e 64 20  ng it..  ** And 
29e40 69 66 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c  if the *-shm fil
29e50 65 20 68 61 73 20 62 65 65 6e 20 63 6f 72 72 75  e has been corru
29e60 70 74 65 64 20 62 79 20 61 20 70 6f 77 65 72 20  pted by a power 
29e70 66 61 69 6c 75 72 65 20 6f 72 0a 20 20 2a 2a 20  failure or.  ** 
29e80 73 79 73 74 65 6d 20 63 72 61 73 68 2c 20 74 68  system crash, th
29e90 65 20 64 61 74 61 62 61 73 65 20 69 74 73 65 6c  e database itsel
29ea0 66 20 6d 61 79 20 61 6c 73 6f 20 62 65 63 6f 6d  f may also becom
29eb0 65 20 63 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20  e corrupt.  */. 
29ec0 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
29ed0 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63   SEEK_SET;.  loc
29ee0 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 55 4e 49 58  k.l_start = UNIX
29ef0 5f 53 48 4d 5f 44 4d 53 3b 0a 20 20 6c 6f 63 6b  _SHM_DMS;.  lock
29f00 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f  .l_len = 1;.  lo
29f10 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
29f20 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e  LCK;.  if( osFcn
29f30 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68  tl(pShmNode->hSh
29f40 6d 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  m, F_GETLK, &loc
29f50 6b 29 21 3d 30 20 29 20 7b 0a 20 20 20 20 72 63  k)!=0 ) {.    rc
29f60 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
29f70 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  LOCK;.  }else if
29f80 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46  ( lock.l_type==F
29f90 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 69 66  _UNLCK ){.    if
29fa0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65  ( pShmNode->isRe
29fb0 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adonly ){.      
29fc0 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f  pShmNode->isUnlo
29fd0 63 6b 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  cked = 1;.      
29fe0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
29ff0 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54 3b 0a 20  ONLY_CANTINIT;. 
2a000 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a010 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
2a020 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f  emLock(pDbFd, F_
2a030 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f  WRLCK, UNIX_SHM_
2a040 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f  DMS, 1);.      /
2a050 2a 20 54 68 65 20 66 69 72 73 74 20 63 6f 6e 6e  * The first conn
2a060 65 63 74 69 6f 6e 20 74 6f 20 61 74 74 61 63 68  ection to attach
2a070 20 6d 75 73 74 20 74 72 75 6e 63 61 74 65 20 74   must truncate t
2a080 68 65 20 2d 73 68 6d 20 66 69 6c 65 2e 20 20 57  he -shm file.  W
2a090 65 0a 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63  e.      ** trunc
2a0a0 61 74 65 20 74 6f 20 33 20 62 79 74 65 73 20 28  ate to 3 bytes (
2a0b0 61 6e 20 61 72 62 69 74 72 61 72 79 20 73 6d 61  an arbitrary sma
2a0c0 6c 6c 20 6e 75 6d 62 65 72 2c 20 6c 65 73 73 20  ll number, less 
2a0d0 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  than the.      *
2a0e0 2a 20 2d 73 68 6d 20 68 65 61 64 65 72 20 73 69  * -shm header si
2a0f0 7a 65 29 20 72 61 74 68 65 72 20 74 68 61 6e 20  ze) rather than 
2a100 30 20 61 73 20 61 20 73 79 73 74 65 6d 20 64 65  0 as a system de
2a110 62 75 67 67 69 6e 67 20 61 69 64 2c 20 74 6f 0a  bugging aid, to.
2a120 20 20 20 20 20 20 2a 2a 20 68 65 6c 70 20 64 65        ** help de
2a130 74 65 63 74 20 69 66 20 61 20 2d 73 68 6d 20 66  tect if a -shm f
2a140 69 6c 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 69  ile truncation i
2a150 73 20 6c 65 67 69 74 69 6d 61 74 65 20 6f 72 20  s legitimate or 
2a160 69 73 20 74 68 65 20 77 6f 72 6b 0a 20 20 20 20  is the work.    
2a170 20 20 2a 2a 20 6f 72 20 61 20 72 6f 67 75 65 20    ** or a rogue 
2a180 70 72 6f 63 65 73 73 2e 20 2a 2f 0a 20 20 20 20  process. */.    
2a190 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2a1a0 5f 4f 4b 20 26 26 20 72 6f 62 75 73 74 5f 66 74  _OK && robust_ft
2a1b0 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65  runcate(pShmNode
2a1c0 2d 3e 68 53 68 6d 2c 20 33 29 20 29 7b 0a 20 20  ->hShm, 3) ){.  
2a1d0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
2a1e0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
2a1f0 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 22 66 74  OERR_SHMOPEN,"ft
2a200 72 75 6e 63 61 74 65 22 2c 70 53 68 6d 4e 6f 64  runcate",pShmNod
2a210 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e->zFilename);. 
2a220 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2a230 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f  else if( lock.l_
2a240 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b  type==F_WRLCK ){
2a250 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2a260 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 69 66  _BUSY;.  }..  if
2a270 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a280 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c  ){.    assert( l
2a290 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e  ock.l_type==F_UN
2a2a0 4c 43 4b 20 7c 7c 20 6c 6f 63 6b 2e 6c 5f 74 79  LCK || lock.l_ty
2a2b0 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 20  pe==F_RDLCK );. 
2a2c0 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
2a2d0 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c  ystemLock(pDbFd,
2a2e0 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49 58 5f 53   F_RDLCK, UNIX_S
2a2f0 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 7d 0a  HM_DMS, 1);.  }.
2a300 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2a310 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
2a320 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
2a330 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2a340 53 54 59 4c 45 0a 73 74 61 74 69 63 20 63 6f 6e  STYLE.static con
2a350 73 74 20 63 68 61 72 20 2a 70 72 6f 78 79 53 68  st char *proxySh
2a360 61 72 65 64 4d 65 6d 6f 72 79 42 61 73 65 50 61  aredMemoryBasePa
2a370 74 68 28 75 6e 69 78 46 69 6c 65 20 2a 29 3b 0a  th(unixFile *);.
2a380 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70  #endif../*.** Op
2a390 65 6e 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f  en a shared-memo
2a3a0 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74  ry area associat
2a3b0 65 64 20 77 69 74 68 20 6f 70 65 6e 20 64 61 74  ed with open dat
2a3c0 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64  abase file pDbFd
2a3d0 2e 20 20 0a 2a 2a 20 54 68 69 73 20 70 61 72 74  .  .** This part
2a3e0 69 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74  icular implement
2a3f0 61 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61 70 70  ation uses mmapp
2a400 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ed files..**.** 
2a410 54 68 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f  The file used to
2a420 20 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61 72 65   implement share
2a430 64 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20 74  d-memory is in t
2a440 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
2a450 79 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70 65 6e  y.** as the open
2a460 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
2a470 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  nd has the same 
2a480 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 70 65 6e  name as the open
2a490 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
2a4a0 65 20 77 69 74 68 20 74 68 65 20 22 2d 73 68 6d  e with the "-shm
2a4b0 22 20 73 75 66 66 69 78 20 61 64 64 65 64 2e 20  " suffix added. 
2a4c0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
2a4d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a4e0 6c 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65 2f  le.** is "/home/
2a4f0 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 22  user1/config.db"
2a500 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 74   then the file t
2a510 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20 61  hat is created a
2a520 6e 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20 66 6f  nd mmapped.** fo
2a530 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  r shared memory 
2a540 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 22  will be called "
2a550 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66  /home/user1/conf
2a560 69 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a  ig.db-shm".  .**
2a570 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70 70 72  .** Another appr
2a580 6f 61 63 68 20 74 6f 20 69 73 20 74 6f 20 75 73  oach to is to us
2a590 65 20 66 69 6c 65 73 20 69 6e 20 2f 64 65 76 2f  e files in /dev/
2a5a0 73 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d 70 20  shm or /dev/tmp 
2a5b0 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74  or an.** some ot
2a5c0 68 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e 74 2e  her tmpfs mount.
2a5d0 20 42 75 74 20 69 66 20 61 20 66 69 6c 65 20 69   But if a file i
2a5e0 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 64 69  n a different di
2a5f0 72 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20  rectory.** from 
2a600 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a610 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e 20  e is used, then 
2a620 64 69 66 66 65 72 69 6e 67 20 61 63 63 65 73 73  differing access
2a630 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20   permissions.** 
2a640 6f 72 20 61 20 63 68 72 6f 6f 74 28 29 20 6d 69  or a chroot() mi
2a650 67 68 74 20 63 61 75 73 65 20 74 77 6f 20 64 69  ght cause two di
2a660 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 65  fferent processe
2a670 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  s on the same.**
2a680 20 64 61 74 61 62 61 73 65 20 74 6f 20 65 6e 64   database to end
2a690 20 75 70 20 75 73 69 6e 67 20 64 69 66 66 65 72   up using differ
2a6a0 65 6e 74 20 66 69 6c 65 73 20 66 6f 72 20 73 68  ent files for sh
2a6b0 61 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a  ared memory - .*
2a6c0 2a 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74  * meaning that t
2a6d0 68 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f 75 6c  heir memory woul
2a6e0 64 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20  d not really be 
2a6f0 73 68 61 72 65 64 20 2d 20 72 65 73 75 6c 74 69  shared - resulti
2a700 6e 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73  ng.** in databas
2a710 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 4e  e corruption.  N
2a720 65 76 65 72 74 68 65 6c 65 73 73 2c 20 74 68 69  evertheless, thi
2a730 73 20 74 6d 70 66 73 20 66 69 6c 65 20 75 73 61  s tmpfs file usa
2a740 67 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65 6e 61  ge.** can be ena
2a750 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  bled at compile-
2a760 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c  time using -DSQL
2a770 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
2a780 59 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a 20  Y="/dev/shm".** 
2a790 6f 72 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  or the equivalen
2a7a0 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 74  t.  The use of t
2a7b0 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  he SQLITE_SHM_DI
2a7c0 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d  RECTORY compile-
2a7d0 74 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72  time.** option r
2a7e0 65 73 75 6c 74 73 20 69 6e 20 61 6e 20 69 6e 63  esults in an inc
2a7f0 6f 6d 70 61 74 69 62 6c 65 20 62 75 69 6c 64 20  ompatible build 
2a800 6f 66 20 53 51 4c 69 74 65 3b 20 20 62 75 69 6c  of SQLite;  buil
2a810 64 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a 20  ds of SQLite.** 
2a820 74 68 61 74 20 77 69 74 68 20 64 69 66 66 65 72  that with differ
2a830 69 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  ing SQLITE_SHM_D
2a840 49 52 45 43 54 4f 52 59 20 73 65 74 74 69 6e 67  IRECTORY setting
2a850 73 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  s attempt to use
2a860 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64 61 74   the.** same dat
2a870 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68  abase file at th
2a880 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 61 74  e same time, dat
2a890 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
2a8a0 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
2a8b0 72 65 73 75 6c 74 2e 20 54 68 65 20 53 51 4c 49  result. The SQLI
2a8c0 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
2a8d0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
2a8e0 74 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65 72  tion is consider
2a8f0 65 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72 74  ed.** "unsupport
2a900 65 64 22 20 61 6e 64 20 6d 61 79 20 67 6f 20 61  ed" and may go a
2a910 77 61 79 20 69 6e 20 61 20 66 75 74 75 72 65 20  way in a future 
2a920 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65 2e 0a  SQLite release..
2a930 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69  **.** When openi
2a940 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d  ng a new shared-
2a950 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20  memory file, if 
2a960 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63  no other instanc
2a970 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69  es of that.** fi
2a980 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  le are currently
2a990 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70   open, in this p
2a9a0 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68  rocess or in oth
2a9b0 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68  er processes, th
2a9c0 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d  en.** the file m
2a9d0 75 73 74 20 62 65 20 74 72 75 6e 63 61 74 65 64  ust be truncated
2a9e0 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20   to zero length 
2a9f0 6f 72 20 68 61 76 65 20 69 74 73 20 68 65 61 64  or have its head
2aa00 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a  er cleared..**.*
2aa10 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61  * If the origina
2aa20 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  l database file 
2aa30 28 70 44 62 46 64 29 20 69 73 20 75 73 69 6e 67  (pDbFd) is using
2aa40 20 74 68 65 20 22 75 6e 69 78 2d 65 78 63 6c 22   the "unix-excl"
2aa50 20 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d 65 61   VFS.** that mea
2aa60 6e 73 20 74 68 61 74 20 61 6e 20 65 78 63 6c 75  ns that an exclu
2aa70 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c  sive lock is hel
2aa80 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2aa90 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68  e file and.** th
2aaa0 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63  at no other proc
2aab0 65 73 73 65 73 20 61 72 65 20 61 62 6c 65 20 74  esses are able t
2aac0 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
2aad0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
2aae0 6e 0a 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20  n.** that case, 
2aaf0 77 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79  we do not really
2ab00 20 6e 65 65 64 20 73 68 61 72 65 64 20 6d 65 6d   need shared mem
2ab10 6f 72 79 2e 20 20 4e 6f 20 73 68 61 72 65 64 20  ory.  No shared 
2ab20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65 20 69  memory.** file i
2ab30 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20  s created.  The 
2ab40 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69  shared memory wi
2ab50 6c 6c 20 62 65 20 73 69 6d 75 6c 61 74 65 64 20  ll be simulated 
2ab60 77 69 74 68 20 68 65 61 70 20 6d 65 6d 6f 72 79  with heap memory
2ab70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2ab80 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65  unixOpenSharedMe
2ab90 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a 70  mory(unixFile *p
2aba0 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20  DbFd){.  struct 
2abb0 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20  unixShm *p = 0; 
2abc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2abd0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
2abe0 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72   opened */.  str
2abf0 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
2ac00 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20  *pShmNode;   /* 
2ac10 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d  The underlying m
2ac20 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
2ac30 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2ac40 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
2ac50 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
2ac60 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
2ac70 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20  fo *pInode;     
2ac80 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64       /* The inod
2ac90 65 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68 61  e of fd */.  cha
2aca0 72 20 2a 7a 53 68 6d 3b 20 20 20 20 20 20 20 20  r *zShm;        
2acb0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2acc0 74 68 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  the file used fo
2acd0 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e  r SHM */.  int n
2ace0 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20  ShmFilename;    
2acf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2ad00 7a 65 20 6f 66 20 74 68 65 20 53 48 4d 20 66 69  ze of the SHM fi
2ad10 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20  lename in bytes 
2ad20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
2ad30 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
2ad40 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65  new unixShm obje
2ad50 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  ct. */.  p = sql
2ad60 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73  ite3_malloc64( s
2ad70 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
2ad80 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
2ad90 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2ada0 50 54 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  PT;.  memset(p, 
2adb0 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
2adc0 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d    assert( pDbFd-
2add0 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >pShm==0 );..  /
2ade0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
2adf0 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  f a unixShmNode 
2ae00 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65  object already e
2ae10 78 69 73 74 73 2e 20 52 65 75 73 65 20 61 6e 20  xists. Reuse an 
2ae20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e  existing.  ** on
2ae30 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20 43 72  e if present. Cr
2ae40 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
2ae50 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  f necessary..  *
2ae60 2f 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  /.  assert( unix
2ae70 46 69 6c 65 4d 75 74 65 78 4e 6f 74 68 65 6c 64  FileMutexNotheld
2ae80 28 70 44 62 46 64 29 20 29 3b 0a 20 20 75 6e 69  (pDbFd) );.  uni
2ae90 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
2aea0 20 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d   pInode = pDbFd-
2aeb0 3e 70 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e  >pInode;.  pShmN
2aec0 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53  ode = pInode->pS
2aed0 68 6d 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70 53  hmNode;.  if( pS
2aee0 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  hmNode==0 ){.   
2aef0 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
2af00 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
2af10 20 20 20 20 2f 2a 20 66 73 74 61 74 28 29 20 69      /* fstat() i
2af20 6e 66 6f 20 66 6f 72 20 64 61 74 61 62 61 73 65  nfo for database
2af30 20 66 69 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66   file */.#ifndef
2af40 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
2af50 43 54 4f 52 59 0a 20 20 20 20 63 6f 6e 73 74 20  CTORY.    const 
2af60 63 68 61 72 20 2a 7a 42 61 73 65 50 61 74 68 20  char *zBasePath 
2af70 3d 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 3b 0a  = pDbFd->zPath;.
2af80 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43  #endif..    /* C
2af90 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20 66  all fstat() to f
2afa0 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 70 65  igure out the pe
2afb0 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65  rmissions on the
2afc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2afd0 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77 20  If.    ** a new 
2afe0 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73 20 63 72  *-shm file is cr
2aff0 65 61 74 65 64 2c 20 61 6e 20 61 74 74 65 6d 70  eated, an attemp
2b000 74 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74  t will be made t
2b010 6f 20 63 72 65 61 74 65 20 69 74 0a 20 20 20 20  o create it.    
2b020 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ** with the same
2b030 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 20 20   permissions..  
2b040 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46    */.    if( osF
2b050 73 74 61 74 28 70 44 62 46 64 2d 3e 68 2c 20 26  stat(pDbFd->h, &
2b060 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20  sStat) ){.      
2b070 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
2b080 44 62 46 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  DbFd, errno);.  
2b090 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2b0a0 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20  IOERR_FSTAT;.   
2b0b0 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
2b0c0 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  _err;.    }..#if
2b0d0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2b0e0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
2b0f0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2b100 4c 45 20 5c 0a 20 20 20 20 20 20 26 26 20 21 64  LE \.      && !d
2b110 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 53 48  efined(SQLITE_SH
2b120 4d 5f 44 49 52 45 43 54 4f 52 59 29 0a 20 20 20  M_DIRECTORY).   
2b130 20 2f 2a 20 49 66 20 70 44 62 46 64 20 69 73 20   /* If pDbFd is 
2b140 63 6f 6e 66 69 67 75 72 65 64 20 77 69 74 68 20  configured with 
2b150 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 6f  proxy locking mo
2b160 64 65 2c 20 75 73 65 20 74 68 65 20 6c 6f 63 61  de, use the loca
2b170 6c 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 66  l .    ** lock f
2b180 69 6c 65 20 70 61 74 68 20 74 6f 20 64 65 74 65  ile path to dete
2b190 72 6d 69 6e 65 20 74 68 65 20 2d 73 68 6d 20 66  rmine the -shm f
2b1a0 69 6c 65 20 70 61 74 68 0a 20 20 20 20 2a 2f 0a  ile path.    */.
2b1b0 20 20 20 20 69 66 28 20 69 73 50 72 6f 78 79 4c      if( isProxyL
2b1c0 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 44 62 46 64  ockingMode(pDbFd
2b1d0 29 20 29 7b 0a 20 20 20 20 20 20 7a 42 61 73 65  ) ){.      zBase
2b1e0 50 61 74 68 20 3d 20 70 72 6f 78 79 53 68 61 72  Path = proxyShar
2b1f0 65 64 4d 65 6d 6f 72 79 42 61 73 65 50 61 74 68  edMemoryBasePath
2b200 28 70 44 62 46 64 29 3b 0a 20 20 20 20 20 20 69  (pDbFd);.      i
2b210 66 28 20 21 7a 42 61 73 65 50 61 74 68 20 29 7b  f( !zBasePath ){
2b220 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2b230 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
2b240 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  PT;.        goto
2b250 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
2b260 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
2b270 64 69 66 0a 20 20 20 20 0a 23 69 66 64 65 66 20  dif.    .#ifdef 
2b280 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
2b290 54 4f 52 59 0a 20 20 20 20 6e 53 68 6d 46 69 6c  TORY.    nShmFil
2b2a0 65 6e 61 6d 65 20 3d 20 73 69 7a 65 6f 66 28 53  ename = sizeof(S
2b2b0 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
2b2c0 4f 52 59 29 20 2b 20 33 31 3b 0a 23 65 6c 73 65  ORY) + 31;.#else
2b2d0 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d  .    nShmFilenam
2b2e0 65 20 3d 20 36 20 2b 20 28 69 6e 74 29 73 74 72  e = 6 + (int)str
2b2f0 6c 65 6e 28 7a 42 61 73 65 50 61 74 68 29 3b 0a  len(zBasePath);.
2b300 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e  #endif.    pShmN
2b310 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ode = sqlite3_ma
2b320 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a  lloc64( sizeof(*
2b330 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53 68 6d  pShmNode) + nShm
2b340 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 20 20  Filename );.    
2b350 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20  if( pShmNode==0 
2b360 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
2b370 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
2b380 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
2b390 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
2b3a0 20 20 20 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e      memset(pShmN
2b3b0 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ode, 0, sizeof(*
2b3c0 70 53 68 6d 4e 6f 64 65 29 2b 6e 53 68 6d 46 69  pShmNode)+nShmFi
2b3d0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 53 68  lename);.    zSh
2b3e0 6d 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46  m = pShmNode->zF
2b3f0 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ilename = (char*
2b400 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23  )&pShmNode[1];.#
2b410 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d  ifdef SQLITE_SHM
2b420 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 73  _DIRECTORY.    s
2b430 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2b440 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53  nShmFilename, zS
2b450 68 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  hm, .           
2b460 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
2b470 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 22  _SHM_DIRECTORY "
2b480 2f 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25  /sqlite-shm-%x-%
2b490 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  x",.            
2b4a0 20 20 20 20 20 20 20 20 20 28 75 33 32 29 73 53           (u32)sS
2b4b0 74 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32  tat.st_ino, (u32
2b4c0 29 73 53 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a  )sStat.st_dev);.
2b4d0 23 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74 65  #else.    sqlite
2b4e0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46  3_snprintf(nShmF
2b4f0 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 2c 20 22  ilename, zShm, "
2b500 25 73 2d 73 68 6d 22 2c 20 7a 42 61 73 65 50 61  %s-shm", zBasePa
2b510 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  th);.    sqlite3
2b520 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46  FileSuffix3(pDbF
2b530 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 29 3b  d->zPath, zShm);
2b540 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d  .#endif.    pShm
2b550 4e 6f 64 65 2d 3e 68 53 68 6d 20 3d 20 2d 31 3b  Node->hShm = -1;
2b560 0a 20 20 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f  .    pDbFd->pIno
2b570 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70  de->pShmNode = p
2b580 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68  ShmNode;.    pSh
2b590 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20  mNode->pInode = 
2b5a0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pDbFd->pInode;. 
2b5b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
2b5c0 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
2b5d0 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 70  Mutex ){.      p
2b5e0 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d 75 74  ShmNode->pShmMut
2b5f0 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex = sqlite3_mut
2b600 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
2b610 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
2b620 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
2b630 3e 70 53 68 6d 4d 75 74 65 78 3d 3d 30 20 29 7b  >pShmMutex==0 ){
2b640 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2b650 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
2b660 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68  .        goto sh
2b670 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
2b680 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
2b690 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  f( pInode->bProc
2b6a0 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 23 69  essLock==0 ){.#i
2b6b0 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20  fdef __APPLE__. 
2b6c0 20 20 20 20 20 2f 2a 20 4f 6e 20 4d 61 63 4f 53       /* On MacOS
2b6d0 20 61 6e 64 20 69 4f 53 2c 20 61 76 6f 69 64 20   and iOS, avoid 
2b6e0 65 76 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 6f  even trying to o
2b6f0 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  pen a read-only 
2b700 53 48 4d 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  SHM file.      *
2b710 2a 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 62  * for writing, b
2b720 65 63 61 75 73 65 20 64 6f 69 6e 67 20 73 6f 20  ecause doing so 
2b730 67 65 6e 65 72 61 74 65 73 20 73 63 61 72 79 20  generates scary 
2b740 6c 6f 67 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a  log messages */.
2b750 20 20 20 20 20 20 69 66 28 20 6f 73 41 63 63 65        if( osAcce
2b760 73 73 28 7a 53 68 6d 2c 20 52 5f 4f 4b 7c 57 5f  ss(zShm, R_OK|W_
2b770 4f 4b 29 21 3d 30 20 26 26 20 28 65 72 72 6e 6f  OK)!=0 && (errno
2b780 3d 3d 45 50 45 52 4d 20 7c 7c 20 65 72 72 6e 6f  ==EPERM || errno
2b790 3d 3d 45 41 43 43 45 53 29 20 29 7b 0a 20 20 20  ==EACCES) ){.   
2b7a0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68       pShmNode->h
2b7b0 53 68 6d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Shm = -1;.      
2b7c0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
2b7d0 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
2b7e0 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 70 44  3_uri_boolean(pD
2b7f0 62 46 64 2d 3e 7a 50 61 74 68 2c 20 22 72 65 61  bFd->zPath, "rea
2b800 64 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30 29 20 29  donly_shm", 0) )
2b810 7b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  {.        pShmNo
2b820 64 65 2d 3e 68 53 68 6d 20 3d 20 72 6f 62 75 73  de->hShm = robus
2b830 74 5f 6f 70 65 6e 28 7a 53 68 6d 2c 20 4f 5f 52  t_open(zShm, O_R
2b840 44 57 52 7c 4f 5f 43 52 45 41 54 2c 28 73 53 74  DWR|O_CREAT,(sSt
2b850 61 74 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29  at.st_mode&0777)
2b860 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2b870 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
2b880 53 68 6d 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Shm<0 ){.       
2b890 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 20   pShmNode->hShm 
2b8a0 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53  = robust_open(zS
2b8b0 68 6d 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 28 73  hm, O_RDONLY, (s
2b8c0 53 74 61 74 2e 73 74 5f 6d 6f 64 65 26 30 37 37  Stat.st_mode&077
2b8d0 37 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  7));.        if(
2b8e0 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 3c   pShmNode->hShm<
2b8f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
2b900 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
2b910 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
2b920 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a  _BKPT, "open", z
2b930 53 68 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Shm);.          
2b940 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
2b950 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
2b960 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69       pShmNode->i
2b970 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20  sReadonly = 1;. 
2b980 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2b990 20 49 66 20 74 68 69 73 20 70 72 6f 63 65 73 73   If this process
2b9a0 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 73 20 72   is running as r
2b9b0 6f 6f 74 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oot, make sure t
2b9c0 68 61 74 20 74 68 65 20 53 48 4d 20 66 69 6c 65  hat the SHM file
2b9d0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6f 77 6e  .      ** is own
2b9e0 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 20 75  ed by the same u
2b9f0 73 65 72 20 74 68 61 74 20 6f 77 6e 73 20 74 68  ser that owns th
2ba00 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
2ba10 61 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  ase.  Otherwise,
2ba20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72  .      ** the or
2ba30 69 67 69 6e 61 6c 20 6f 77 6e 65 72 20 77 69 6c  iginal owner wil
2ba40 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f  l not be able to
2ba50 20 63 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 20 20   connect..      
2ba60 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74 46  */.      robustF
2ba70 63 68 6f 77 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e  chown(pShmNode->
2ba80 68 53 68 6d 2c 20 73 53 74 61 74 2e 73 74 5f 75  hShm, sStat.st_u
2ba90 69 64 2c 20 73 53 74 61 74 2e 73 74 5f 67 69 64  id, sStat.st_gid
2baa0 29 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 75  );..      rc = u
2bab0 6e 69 78 4c 6f 63 6b 53 68 61 72 65 64 4d 65 6d  nixLockSharedMem
2bac0 6f 72 79 28 70 44 62 46 64 2c 20 70 53 68 6d 4e  ory(pDbFd, pShmN
2bad0 6f 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ode);.      if( 
2bae0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
2baf0 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 45 41 44   rc!=SQLITE_READ
2bb00 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54 20 29 20  ONLY_CANTINIT ) 
2bb10 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
2bb20 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  r;.    }.  }..  
2bb30 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20  /* Make the new 
2bb40 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69  connection a chi
2bb50 6c 64 20 6f 66 20 74 68 65 20 75 6e 69 78 53 68  ld of the unixSh
2bb60 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53  mNode */.  p->pS
2bb70 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64  hmNode = pShmNod
2bb80 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e;.#ifdef SQLITE
2bb90 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d  _DEBUG.  p->id =
2bba0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53   pShmNode->nextS
2bbb0 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  hmId++;.#endif. 
2bbc0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b   pShmNode->nRef+
2bbd0 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  +;.  pDbFd->pShm
2bbe0 20 3d 20 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76   = p;.  unixLeav
2bbf0 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20  eMutex();..  /* 
2bc00 54 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  The reference co
2bc10 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20  unt on pShmNode 
2bc20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
2bc30 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64   incremented und
2bc40 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65  er.  ** the cove
2bc50 72 20 6f 66 20 74 68 65 20 75 6e 69 78 45 6e 74  r of the unixEnt
2bc60 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20  erMutex() mutex 
2bc70 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20  and the pointer 
2bc80 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65  from the.  ** ne
2bc90 77 20 28 73 74 72 75 63 74 20 75 6e 69 78 53 68  w (struct unixSh
2bca0 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  m) object to the
2bcb0 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65   pShmNode has be
2bcc0 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74  en set. All that
2bcd0 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f   is.  ** left to
2bce0 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74   do is to link t
2bcf0 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e  he new object in
2bd00 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
2bd10 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a  st starting.  **
2bd20 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46   at pShmNode->pF
2bd30 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20  irst. This must 
2bd40 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f  be done while ho
2bd50 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 70  lding the.  ** p
2bd60 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d 75 74  ShmNode->pShmMut
2bd70 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ex..  */.  sqlit
2bd80 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
2bd90 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d 75 74  ShmNode->pShmMut
2bda0 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  ex);.  p->pNext 
2bdb0 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  = pShmNode->pFir
2bdc0 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  st;.  pShmNode->
2bdd0 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71  pFirst = p;.  sq
2bde0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
2bdf0 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d  e(pShmNode->pShm
2be00 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  Mutex);.  return
2be10 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20   rc;..  /* Jump 
2be20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f  here on any erro
2be30 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72  r */.shm_open_er
2be40 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75 72 67  r:.  unixShmPurg
2be50 65 28 70 44 62 46 64 29 3b 20 20 20 20 20 20 20  e(pDbFd);       
2be60 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65  /* This call fre
2be70 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72  es pShmNode if r
2be80 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c  equired */.  sql
2be90 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
2bea0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
2beb0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2bec0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2bed0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
2bee0 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e  to obtain a poin
2bef0 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52  ter to region iR
2bf00 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a  egion of the .**
2bf10 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
2bf20 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
2bf30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2bf40 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f   fd. Shared-memo
2bf50 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61  ry regions .** a
2bf60 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72  re numbered star
2bf70 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20  ting from zero. 
2bf80 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f  Each shared-memo
2bf90 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52  ry region is szR
2bfa0 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20  egion .** bytes 
2bfb0 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  in size..**.** I
2bfc0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2bfd0 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
2bfe0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
2bff0 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e   *pp is set to N
2c000 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ULL..**.** Other
2c010 77 69 73 65 2c 20 69 66 20 74 68 65 20 62 45 78  wise, if the bEx
2c020 74 65 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  tend parameter i
2c030 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75  s 0 and the requ
2c040 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
2c050 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61  ory.** region ha
2c060 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
2c070 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69  ated (by any cli
2c080 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f  ent, including o
2c090 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a  ne running in a.
2c0a0 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63  ** separate proc
2c0b0 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69  ess), then *pp i
2c0c0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  s set to NULL an
2c0d0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
2c0e0 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78  rned. If .** bEx
2c0f0 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  tend is non-zero
2c100 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
2c110 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
2c120 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20   region has not 
2c130 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c  yet .** been all
2c140 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c  ocated, it is al
2c150 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
2c160 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
2c170 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  If the shared-me
2c180 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20  mory region has 
2c190 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
2c1a0 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c  ocated or is all
2c1b0 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69  ocated by.** thi
2c1c0 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69  s call as descri
2c1d0 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  bed above, then 
2c1e0 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74  it is mapped int
2c1f0 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
2c200 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61   .** address spa
2c210 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  ce (if it is not
2c220 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69   already), *pp i
2c230 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
2c240 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a  o the mapped .**
2c250 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49   memory and SQLI
2c260 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
2c270 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
2c280 69 78 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69  ixShmMap(.  sqli
2c290 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
2c2a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
2c2b0 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61  andle open on da
2c2c0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2c2d0 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20   int iRegion,   
2c2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c2f0 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65   /* Region to re
2c300 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20  trieve */.  int 
2c310 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20  szRegion,       
2c320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2c330 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a  ize of regions *
2c340 2f 0a 20 20 69 6e 74 20 62 45 78 74 65 6e 64 2c  /.  int bExtend,
2c350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c360 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65      /* True to e
2c370 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65  xtend file if ne
2c380 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69  cessary */.  voi
2c390 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20  d volatile **pp 
2c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c3b0 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f  OUT: Mapped memo
2c3c0 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46  ry */.){.  unixF
2c3d0 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e  ile *pDbFd = (un
2c3e0 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e  ixFile*)fd;.  un
2c3f0 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78  ixShm *p;.  unix
2c400 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
2c410 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
2c420 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
2c430 53 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e 69 78  ShmPerMap = unix
2c440 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28  ShmRegionPerMap(
2c450 29 3b 0a 20 20 69 6e 74 20 6e 52 65 71 52 65 67  );.  int nReqReg
2c460 69 6f 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ion;..  /* If th
2c470 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
2c480 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
2c490 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
2c4a0 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20  en it now. */.  
2c4b0 69 66 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d  if( pDbFd->pShm=
2c4c0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75  =0 ){.    rc = u
2c4d0 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  nixOpenSharedMem
2c4e0 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20  ory(pDbFd);.    
2c4f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2c500 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
2c510 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46 64 2d   }..  p = pDbFd-
2c520 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64  >pShm;.  pShmNod
2c530 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
2c540 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
2c550 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
2c560 3e 70 53 68 6d 4d 75 74 65 78 29 3b 0a 20 20 69  >pShmMutex);.  i
2c570 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55  f( pShmNode->isU
2c580 6e 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 72  nlocked ){.    r
2c590 63 20 3d 20 75 6e 69 78 4c 6f 63 6b 53 68 61 72  c = unixLockShar
2c5a0 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 2c 20  edMemory(pDbFd, 
2c5b0 70 53 68 6d 4e 6f 64 65 29 3b 0a 20 20 20 20 69  pShmNode);.    i
2c5c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c5d0 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f   ) goto shmpage_
2c5e0 6f 75 74 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  out;.    pShmNod
2c5f0 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64 20 3d 20  e->isUnlocked = 
2c600 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
2c610 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e   szRegion==pShmN
2c620 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c  ode->szRegion ||
2c630 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
2c640 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  on==0 );.  asser
2c650 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e  t( pShmNode->pIn
2c660 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
2c670 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  de );.  assert( 
2c680 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 3e 3d  pShmNode->hShm>=
2c690 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f  0 || pDbFd->pIno
2c6a0 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
2c6b0 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
2c6c0 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 3c   pShmNode->hShm<
2c6d0 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f  0 || pDbFd->pIno
2c6e0 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
2c6f0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 69 6e  ==0 );..  /* Min
2c700 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72  imum number of r
2c710 65 67 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20  egions required 
2c720 74 6f 20 62 65 20 6d 61 70 70 65 64 2e 20 2a 2f  to be mapped. */
2c730 0a 20 20 6e 52 65 71 52 65 67 69 6f 6e 20 3d 20  .  nReqRegion = 
2c740 28 28 69 52 65 67 69 6f 6e 2b 6e 53 68 6d 50 65  ((iRegion+nShmPe
2c750 72 4d 61 70 29 20 2f 20 6e 53 68 6d 50 65 72 4d  rMap) / nShmPerM
2c760 61 70 29 20 2a 20 6e 53 68 6d 50 65 72 4d 61 70  ap) * nShmPerMap
2c770 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  ;..  if( pShmNod
2c780 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52  e->nRegion<nReqR
2c790 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61  egion ){.    cha
2c7a0 72 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20 20  r **apNew;      
2c7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c7c0 2f 2a 20 4e 65 77 20 61 70 52 65 67 69 6f 6e 5b  /* New apRegion[
2c7d0 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69  ] array */.    i
2c7e0 6e 74 20 6e 42 79 74 65 20 3d 20 6e 52 65 71 52  nt nByte = nReqR
2c7f0 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 20  egion*szRegion; 
2c800 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71    /* Minimum req
2c810 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20  uired file size 
2c820 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  */.    struct st
2c830 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20  at sStat;       
2c840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2c850 64 20 62 79 20 66 73 74 61 74 28 29 20 2a 2f 0a  d by fstat() */.
2c860 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73  .    pShmNode->s
2c870 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69  zRegion = szRegi
2c880 6f 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 68  on;..    if( pSh
2c890 6d 4e 6f 64 65 2d 3e 68 53 68 6d 3e 3d 30 20 29  mNode->hShm>=0 )
2c8a0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  {.      /* The r
2c8b0 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20  equested region 
2c8c0 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e  is not mapped in
2c8d0 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
2c8e0 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
2c8f0 0a 20 20 20 20 20 20 2a 2a 20 43 68 65 63 6b 20  .      ** Check 
2c900 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73  to see if it has
2c910 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
2c920 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c  (i.e. if the wal
2c930 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20  -index file is. 
2c940 20 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e       ** large en
2c950 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ough to contain 
2c960 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  the requested re
2c970 67 69 6f 6e 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  gion)..      */.
2c980 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61        if( osFsta
2c990 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d  t(pShmNode->hShm
2c9a0 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20  , &sStat) ){.   
2c9b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2c9c0 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a  _IOERR_SHMSIZE;.
2c9d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
2c9e0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
2c9f0 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20 73  }.  .      if( s
2ca00 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e 42 79  Stat.st_size<nBy
2ca10 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  te ){.        /*
2ca20 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   The requested m
2ca30 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65  emory region doe
2ca40 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20  s not exist. If 
2ca50 62 45 78 74 65 6e 64 20 69 73 20 73 65 74 20 74  bExtend is set t
2ca60 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61 6c  o.        ** fal
2ca70 73 65 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20  se, exit early. 
2ca80 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20  *pp will be set 
2ca90 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49  to NULL and SQLI
2caa0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
2cab0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2cac0 20 20 20 69 66 28 20 21 62 45 78 74 65 6e 64 20     if( !bExtend 
2cad0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
2cae0 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
2caf0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2cb00 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65    /* Alternative
2cb10 6c 79 2c 20 69 66 20 62 45 78 74 65 6e 64 20 69  ly, if bExtend i
2cb20 73 20 74 72 75 65 2c 20 65 78 74 65 6e 64 20 74  s true, extend t
2cb30 68 65 20 66 69 6c 65 2e 20 44 6f 20 74 68 69 73  he file. Do this
2cb40 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   by.        ** w
2cb50 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20  riting a single 
2cb60 62 79 74 65 20 74 6f 20 74 68 65 20 65 6e 64 20  byte to the end 
2cb70 6f 66 20 65 61 63 68 20 28 4f 53 29 20 70 61 67  of each (OS) pag
2cb80 65 20 62 65 69 6e 67 0a 20 20 20 20 20 20 20 20  e being.        
2cb90 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20  ** allocated or 
2cba0 65 78 74 65 6e 64 65 64 2e 20 54 65 63 68 6e 69  extended. Techni
2cbb0 63 61 6c 6c 79 2c 20 77 65 20 6e 65 65 64 20 6f  cally, we need o
2cbc0 6e 6c 79 20 77 72 69 74 65 20 74 6f 20 74 68 65  nly write to the
2cbd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 61 73 74  .        ** last
2cbe0 20 70 61 67 65 20 69 6e 20 6f 72 64 65 72 20 74   page in order t
2cbf0 6f 20 65 78 74 65 6e 64 20 74 68 65 20 66 69 6c  o extend the fil
2cc00 65 2e 20 42 75 74 20 77 72 69 74 69 6e 67 20 74  e. But writing t
2cc10 6f 20 61 6c 6c 20 6e 65 77 0a 20 20 20 20 20 20  o all new.      
2cc20 20 20 2a 2a 20 70 61 67 65 73 20 66 6f 72 63 65    ** pages force
2cc30 73 20 74 68 65 20 4f 53 20 74 6f 20 61 6c 6c 6f  s the OS to allo
2cc40 63 61 74 65 20 74 68 65 6d 20 69 6d 6d 65 64 69  cate them immedi
2cc50 61 74 65 6c 79 2c 20 77 68 69 63 68 20 72 65 64  ately, which red
2cc60 75 63 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  uces.        ** 
2cc70 74 68 65 20 63 68 61 6e 63 65 73 20 6f 66 20 53  the chances of S
2cc80 49 47 42 55 53 20 77 68 69 6c 65 20 61 63 63 65  IGBUS while acce
2cc90 73 73 69 6e 67 20 74 68 65 20 6d 61 70 70 65 64  ssing the mapped
2cca0 20 72 65 67 69 6f 6e 20 6c 61 74 65 72 20 6f 6e   region later on
2ccb0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2ccc0 20 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20       else{.     
2ccd0 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
2cce0 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 34 30 39  t int pgsz = 409
2ccf0 36 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  6;.          int
2cd00 20 69 50 67 3b 0a 0a 20 20 20 20 20 20 20 20 20   iPg;..         
2cd10 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65   /* Write to the
2cd20 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20 65 61   last byte of ea
2cd30 63 68 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  ch newly allocat
2cd40 65 64 20 6f 72 20 65 78 74 65 6e 64 65 64 20 70  ed or extended p
2cd50 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  age */.         
2cd60 20 61 73 73 65 72 74 28 20 28 6e 42 79 74 65 20   assert( (nByte 
2cd70 25 20 70 67 73 7a 29 3d 3d 30 20 29 3b 0a 20 20  % pgsz)==0 );.  
2cd80 20 20 20 20 20 20 20 20 66 6f 72 28 69 50 67 3d          for(iPg=
2cd90 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 2f 70  (sStat.st_size/p
2cda0 67 73 7a 29 3b 20 69 50 67 3c 28 6e 42 79 74 65  gsz); iPg<(nByte
2cdb0 2f 70 67 73 7a 29 3b 20 69 50 67 2b 2b 29 7b 0a  /pgsz); iPg++){.
2cdc0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
2cdd0 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  x = 0;.         
2cde0 20 20 20 69 66 28 20 73 65 65 6b 41 6e 64 57 72     if( seekAndWr
2cdf0 69 74 65 46 64 28 70 53 68 6d 4e 6f 64 65 2d 3e  iteFd(pShmNode->
2ce00 68 53 68 6d 2c 20 69 50 67 2a 70 67 73 7a 20 2b  hShm, iPg*pgsz +
2ce10 20 70 67 73 7a 2d 31 2c 22 22 2c 31 2c 26 78 29   pgsz-1,"",1,&x)
2ce20 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=1 ){.         
2ce30 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2ce40 2a 7a 46 69 6c 65 20 3d 20 70 53 68 6d 4e 6f 64  *zFile = pShmNod
2ce50 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  e->zFilename;.  
2ce60 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2ce70 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
2ce80 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
2ce90 5a 45 2c 20 22 77 72 69 74 65 22 2c 20 7a 46 69  ZE, "write", zFi
2cea0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  le);.           
2ceb0 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
2cec0 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  out;.           
2ced0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2cee0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2cef0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
2cf00 61 70 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ap the requested
2cf10 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69   memory region i
2cf20 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
2cf30 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
2cf40 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d  . */.    apNew =
2cf50 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69 74 65   (char **)sqlite
2cf60 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  3_realloc(.     
2cf70 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52     pShmNode->apR
2cf80 65 67 69 6f 6e 2c 20 6e 52 65 71 52 65 67 69 6f  egion, nReqRegio
2cf90 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29  n*sizeof(char *)
2cfa0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
2cfb0 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  !apNew ){.      
2cfc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
2cfd0 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
2cfe0 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
2cff0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
2d000 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
2d010 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20  on = apNew;.    
2d020 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d  while( pShmNode-
2d030 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52 65 67  >nRegion<nReqReg
2d040 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ion ){.      int
2d050 20 6e 4d 61 70 20 3d 20 73 7a 52 65 67 69 6f 6e   nMap = szRegion
2d060 2a 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20 20 20  *nShmPerMap;.   
2d070 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
2d080 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20 20 20  void *pMem;.    
2d090 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
2d0a0 68 53 68 6d 3e 3d 30 20 29 7b 0a 20 20 20 20 20  hShm>=0 ){.     
2d0b0 20 20 20 70 4d 65 6d 20 3d 20 6f 73 4d 6d 61 70     pMem = osMmap
2d0c0 28 30 2c 20 6e 4d 61 70 2c 0a 20 20 20 20 20 20  (0, nMap,.      
2d0d0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
2d0e0 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50 52 4f  isReadonly ? PRO
2d0f0 54 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f 52 45  T_READ : PROT_RE
2d100 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20 0a  AD|PROT_WRITE, .
2d110 20 20 20 20 20 20 20 20 20 20 20 20 4d 41 50 5f              MAP_
2d120 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65  SHARED, pShmNode
2d130 2d 3e 68 53 68 6d 2c 20 73 7a 52 65 67 69 6f 6e  ->hShm, szRegion
2d140 2a 28 69 36 34 29 70 53 68 6d 4e 6f 64 65 2d 3e  *(i64)pShmNode->
2d150 6e 52 65 67 69 6f 6e 0a 20 20 20 20 20 20 20 20  nRegion.        
2d160 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2d170 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20  Mem==MAP_FAILED 
2d180 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2d190 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
2d1a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d  QLITE_IOERR_SHMM
2d1b0 41 50 2c 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d  AP, "mmap", pShm
2d1c0 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  Node->zFilename)
2d1d0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2d1e0 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
2d1f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
2d200 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  lse{.        pMe
2d210 6d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  m = sqlite3_mall
2d220 6f 63 36 34 28 6e 4d 61 70 29 3b 0a 20 20 20 20  oc64(nMap);.    
2d230 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30 20      if( pMem==0 
2d240 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2d250 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
2d260 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
2d270 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
2d280 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d290 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20     memset(pMem, 
2d2a0 30 2c 20 6e 4d 61 70 29 3b 0a 20 20 20 20 20 20  0, nMap);.      
2d2b0 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  }..      for(i=0
2d2c0 3b 20 69 3c 6e 53 68 6d 50 65 72 4d 61 70 3b 20  ; i<nShmPerMap; 
2d2d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53  i++){.        pS
2d2e0 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e  hmNode->apRegion
2d2f0 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69  [pShmNode->nRegi
2d300 6f 6e 2b 69 5d 20 3d 20 26 28 28 63 68 61 72 2a  on+i] = &((char*
2d310 29 70 4d 65 6d 29 5b 73 7a 52 65 67 69 6f 6e 2a  )pMem)[szRegion*
2d320 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
2d330 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67    pShmNode->nReg
2d340 69 6f 6e 20 2b 3d 20 6e 53 68 6d 50 65 72 4d 61  ion += nShmPerMa
2d350 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68  p;.    }.  }..sh
2d360 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28  mpage_out:.  if(
2d370 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
2d380 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20  on>iRegion ){.  
2d390 20 20 2a 70 70 20 3d 20 70 53 68 6d 4e 6f 64 65    *pp = pShmNode
2d3a0 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 52 65 67 69  ->apRegion[iRegi
2d3b0 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  on];.  }else{.  
2d3c0 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20    *pp = 0;.  }. 
2d3d0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69   if( pShmNode->i
2d3e0 73 52 65 61 64 6f 6e 6c 79 20 26 26 20 72 63 3d  sReadonly && rc=
2d3f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
2d400 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
2d410 59 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  Y;.  sqlite3_mut
2d420 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
2d430 65 2d 3e 70 53 68 6d 4d 75 74 65 78 29 3b 0a 20  e->pShmMutex);. 
2d440 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2d450 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
2d460 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61  lock state for a
2d470 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
2d480 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  egment..**.** No
2d490 74 65 20 74 68 61 74 20 74 68 65 20 72 65 6c 61  te that the rela
2d4a0 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e  tionship between
2d4b0 20 53 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c   SHAREd and EXCL
2d4c0 55 53 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61  USIVE locks is a
2d4d0 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65   little.** diffe
2d4e0 72 65 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69  rent here than i
2d4f0 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68  n posix.  In xSh
2d500 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e  mLock(), one can
2d510 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65   go from unlocke
2d520 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61  d.** to shared a
2d530 6e 64 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20  nd back or from 
2d540 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c  unlocked to excl
2d550 75 73 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20  usive and back. 
2d560 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20   But one may.** 
2d570 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72  not go from shar
2d580 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
2d590 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76  or from exclusiv
2d5a0 65 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a  e to shared..*/.
2d5b0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
2d5c0 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65  hmLock(.  sqlite
2d5d0 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
2d5e0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
2d5f0 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68   file holding th
2d600 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
2d610 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
2d620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d630 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f  /* First lock to
2d640 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
2d650 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20  ase */.  int n, 
2d660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d670 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2d680 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72   locks to acquir
2d690 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
2d6a0 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
2d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d6c0 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
2d6d0 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  the lock */.){. 
2d6e0 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64   unixFile *pDbFd
2d6f0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
2d700 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  ;      /* Connec
2d710 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61  tion holding sha
2d720 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
2d730 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62  unixShm *p = pDb
2d740 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20  Fd->pShm;       
2d750 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
2d760 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67  red memory being
2d770 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69   locked */.  uni
2d780 78 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20  xShm *pX;       
2d790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d7a0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
2d7b0 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69  g over all sibli
2d7c0 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ngs */.  unixShm
2d7d0 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d  Node *pShmNode =
2d7e0 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f   p->pShmNode;  /
2d7f0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
2d800 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20   file iNode */. 
2d810 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2d820 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
2d830 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
2d840 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d   code */.  u16 m
2d850 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
2d860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d870 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
2d880 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c  s to take or rel
2d890 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ease */..  asser
2d8a0 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62  t( pShmNode==pDb
2d8b0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
2d8c0 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Node );.  assert
2d8d0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f  ( pShmNode->pIno
2d8e0 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
2d8f0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  e );.  assert( o
2d900 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e  fst>=0 && ofst+n
2d910 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  <=SQLITE_SHM_NLO
2d920 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
2d930 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  n>=1 );.  assert
2d940 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  ( flags==(SQLITE
2d950 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
2d960 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
2d970 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
2d980 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
2d990 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
2d9a0 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20  CLUSIVE).       
2d9b0 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
2d9c0 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
2d9d0 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
2d9e0 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
2d9f0 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
2da00 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
2da10 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b  HM_EXCLUSIVE) );
2da20 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
2da30 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  || (flags & SQLI
2da40 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
2da50 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )!=0 );.  assert
2da60 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d  ( pShmNode->hShm
2da70 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  >=0 || pDbFd->pI
2da80 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
2da90 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ck==1 );.  asser
2daa0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68  t( pShmNode->hSh
2dab0 6d 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  m<0 || pDbFd->pI
2dac0 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
2dad0 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b  ck==0 );..  mask
2dae0 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29   = (1<<(ofst+n))
2daf0 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20   - (1<<ofst);.  
2db00 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d  assert( n>1 || m
2db10 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29  ask==(1<<ofst) )
2db20 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
2db30 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
2db40 2d 3e 70 53 68 6d 4d 75 74 65 78 29 3b 0a 20 20  ->pShmMutex);.  
2db50 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
2db60 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b  TE_SHM_UNLOCK ){
2db70 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b  .    u16 allMask
2db80 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66   = 0; /* Mask of
2db90 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73   locks held by s
2dba0 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20  iblings */..    
2dbb0 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73 69  /* See if any si
2dbc0 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73  blings hold this
2dbd0 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20   same lock */.  
2dbe0 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
2dbf0 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
2dc00 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
2dc10 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20      if( pX==p ) 
2dc20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2dc30 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63  assert( (pX->exc
2dc40 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c  lMask & (p->excl
2dc50 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61  Mask|p->sharedMa
2dc60 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  sk))==0 );.     
2dc70 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e   allMask |= pX->
2dc80 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
2dc90 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b  }..    /* Unlock
2dca0 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65   the system-leve
2dcb0 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  l locks */.    i
2dcc0 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61  f( (mask & allMa
2dcd0 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
2dce0 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
2dcf0 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f  emLock(pDbFd, F_
2dd00 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58  UNLCK, ofst+UNIX
2dd10 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
2dd20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2dd30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2dd40 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
2dd50 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63  do the local loc
2dd60 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
2dd70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2dd80 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
2dd90 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
2dda0 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26   p->sharedMask &
2ddb0 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a  = ~mask;.    } .
2ddc0 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
2ddd0 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  s & SQLITE_SHM_S
2dde0 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36  HARED ){.    u16
2ddf0 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20   allShared = 0; 
2de00 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63   /* Union of loc
2de10 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65  ks held by conne
2de20 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61  ctions other tha
2de30 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a  n "p" */..    /*
2de40 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20   Find out which 
2de50 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65  shared locks are
2de60 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79   already held by
2de70 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
2de80 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20  ions..    ** If 
2de90 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65  any sibling alre
2dea0 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63  ady holds an exc
2deb0 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20  lusive lock, go 
2dec0 61 68 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e  ahead and return
2ded0 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42  .    ** SQLITE_B
2dee0 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  USY..    */.    
2def0 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
2df00 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
2df10 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
2df20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d    if( (pX->exclM
2df30 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29  ask & mask)!=0 )
2df40 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
2df50 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
2df60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2df70 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72   }.      allShar
2df80 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64  ed |= pX->shared
2df90 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Mask;.    }..   
2dfa0 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c   /* Get shared l
2dfb0 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
2dfc0 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63  em level, if nec
2dfd0 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66  essary */.    if
2dfe0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2dff0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c  ){.      if( (al
2e000 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d  lShared & mask)=
2e010 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
2e020 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d   = unixShmSystem
2e030 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 52 44  Lock(pDbFd, F_RD
2e040 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53  LCK, ofst+UNIX_S
2e050 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
2e060 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e070 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2e080 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2e090 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
2e0a0 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63  local shared loc
2e0b0 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
2e0c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2e0d0 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
2e0e0 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
2e0f0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
2e100 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73  * Make sure no s
2e110 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
2e120 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68  ns hold locks th
2e130 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68  at will block th
2e140 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20  is.    ** lock. 
2e150 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75   If any do, retu
2e160 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72  rn SQLITE_BUSY r
2e170 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a  ight away..    *
2e180 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
2e190 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
2e1a0 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
2e1b0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
2e1c0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
2e1d0 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61  )!=0 || (pX->sha
2e1e0 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  redMask & mask)!
2e1f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
2e200 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
2e210 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2e220 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
2e230 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65      /* Get the e
2e240 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61  xclusive locks a
2e250 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
2e260 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63  el.  Then if suc
2e270 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61  cessful.    ** a
2e280 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63  lso mark the loc
2e290 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73  al connection as
2e2a0 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20   being locked.. 
2e2b0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
2e2c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2e2d0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68       rc = unixSh
2e2e0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46  mSystemLock(pDbF
2e2f0 64 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66 73 74  d, F_WRLCK, ofst
2e300 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20  +UNIX_SHM_BASE, 
2e310 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
2e320 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2e330 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
2e340 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  p->sharedMask & 
2e350 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20  mask)==0 );.    
2e360 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20      p->exclMask 
2e370 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d  |= mask;.      }
2e380 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
2e390 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
2e3a0 28 70 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d  (pShmNode->pShmM
2e3b0 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45  utex);.  OSTRACE
2e3c0 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69  (("SHM-LOCK shmi
2e3d0 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74  d-%d, pid-%d got
2e3e0 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20   %03x,%03x\n",. 
2e3f0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c            p->id,
2e400 20 6f 73 47 65 74 70 69 64 28 30 29 2c 20 70 2d   osGetpid(0), p-
2e410 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e  >sharedMask, p->
2e420 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72 65  exclMask));.  re
2e430 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2e440 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65  * Implement a me
2e450 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20  mory barrier or 
2e460 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20  memory fence on 
2e470 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20  shared memory.  
2e480 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73  .**.** All loads
2e490 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75   and stores begu
2e4a0 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72  n before the bar
2e4b0 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65  rier must comple
2e4c0 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  te before.** any
2e4d0 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62   load or store b
2e4e0 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 62  egun after the b
2e4f0 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  arrier..*/.stati
2e500 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 42 61  c void unixShmBa
2e510 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33  rrier(.  sqlite3
2e520 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20  _file *fd       
2e530 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
2e540 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e  base file holdin
2e550 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
2e560 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53  ory */.){.  UNUS
2e570 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29  ED_PARAMETER(fd)
2e580 3b 0a 20 20 73 71 6c 69 74 65 33 4d 65 6d 6f 72  ;.  sqlite3Memor
2e590 79 42 61 72 72 69 65 72 28 29 3b 20 20 20 20 20  yBarrier();     
2e5a0 20 20 20 20 2f 2a 20 63 6f 6d 70 69 6c 65 72 2d      /* compiler-
2e5b0 64 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79 20 62  defined memory b
2e5c0 61 72 72 69 65 72 20 2a 2f 0a 20 20 61 73 73 65  arrier */.  asse
2e5d0 72 74 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73  rt( fd->pMethods
2e5e0 2d 3e 78 4c 6f 63 6b 3d 3d 6e 6f 6c 6f 63 6b 4c  ->xLock==nolockL
2e5f0 6f 63 6b 20 0a 20 20 20 20 20 20 20 7c 7c 20 75  ock .       || u
2e600 6e 69 78 46 69 6c 65 4d 75 74 65 78 4e 6f 74 68  nixFileMutexNoth
2e610 65 6c 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 66  eld((unixFile*)f
2e620 64 29 20 0a 20 20 29 3b 0a 20 20 75 6e 69 78 45  d) .  );.  unixE
2e630 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 20 20 20  nterMutex();    
2e640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
2e650 73 6f 20 6d 75 74 65 78 2c 20 66 6f 72 20 72 65  so mutex, for re
2e660 64 75 6e 64 61 6e 63 79 20 2a 2f 0a 20 20 75 6e  dundancy */.  un
2e670 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
2e680 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
2e690 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73   connection to s
2e6a0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44  hared-memory.  D
2e6b0 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c  elete the underl
2e6c0 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65  ying .** storage
2e6d0 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69   if deleteFlag i
2e6e0 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
2e6f0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 68 61   there is no sha
2e700 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red memory assoc
2e710 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 63  iated with the c
2e720 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65 6e 20 74  onnection then t
2e730 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
2e740 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  s a harmless no-
2e750 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
2e760 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 28 0a  t unixShmUnmap(.
2e770 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
2e780 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fd,             
2e790 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
2e7a0 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
2e7b0 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74  e */.  int delet
2e7c0 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  eFlag           
2e7d0 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65         /* Delete
2e7e0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69   shared-memory i
2e7f0 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75  f true */.){.  u
2e800 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20 20 20 20  nixShm *p;      
2e810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e820 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
2e830 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f   to be closed */
2e840 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
2e850 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  pShmNode;       
2e860 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
2e870 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f  ying shared-memo
2e880 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  ry file */.  uni
2e890 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20  xShm **pp;      
2e8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e8b0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
2e8c0 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
2e8d0 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46 69  ions */.  unixFi
2e8e0 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20  le *pDbFd;      
2e8f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2e900 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
2e910 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
2e920 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c  pDbFd = (unixFil
2e930 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62  e*)fd;.  p = pDb
2e940 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20  Fd->pShm;.  if( 
2e950 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
2e960 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e  LITE_OK;.  pShmN
2e970 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
2e980 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  e;..  assert( pS
2e990 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  hmNode==pDbFd->p
2e9a0 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
2e9b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
2e9c0 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70  mNode->pInode==p
2e9d0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  DbFd->pInode );.
2e9e0 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e  .  /* Remove con
2e9f0 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74  nection p from t
2ea00 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63  he set of connec
2ea10 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
2ea20 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e  .  ** with pShmN
2ea30 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
2ea40 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
2ea50 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d 75 74 65 78  mNode->pShmMutex
2ea60 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68  );.  for(pp=&pSh
2ea70 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28  mNode->pFirst; (
2ea80 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28  *pp)!=p; pp = &(
2ea90 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20  *pp)->pNext){}. 
2eaa0 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   *pp = p->pNext;
2eab0 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20  ..  /* Free the 
2eac0 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a  connection p */.
2ead0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2eae0 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  );.  pDbFd->pShm
2eaf0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
2eb00 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
2eb10 4e 6f 64 65 2d 3e 70 53 68 6d 4d 75 74 65 78 29  Node->pShmMutex)
2eb20 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e  ;..  /* If pShmN
2eb30 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65  ode->nRef has re
2eb40 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c  ached 0, then cl
2eb50 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ose the underlyi
2eb60 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d  ng.  ** shared-m
2eb70 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20  emory file, too 
2eb80 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  */.  assert( uni
2eb90 78 46 69 6c 65 4d 75 74 65 78 4e 6f 74 68 65 6c  xFileMutexNothel
2eba0 64 28 70 44 62 46 64 29 20 29 3b 0a 20 20 75 6e  d(pDbFd) );.  un
2ebb0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
2ebc0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
2ebd0 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  de->nRef>0 );.  
2ebe0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d  pShmNode->nRef--
2ebf0 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ;.  if( pShmNode
2ec00 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
2ec10 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20   if( deleteFlag 
2ec20 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68  && pShmNode->hSh
2ec30 6d 3e 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 69  m>=0 ) {.      i
2ec40 66 20 28 64 65 6c 65 74 65 46 6c 61 67 20 3d 3d  f (deleteFlag ==
2ec50 20 31 29 20 7b 20 0a 20 20 20 20 20 20 20 20 6f   1) { .        o
2ec60 73 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65  sUnlink(pShmNode
2ec70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
2ec80 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 64      } else if (d
2ec90 65 6c 65 74 65 46 6c 61 67 20 3d 3d 20 32 29 20  eleteFlag == 2) 
2eca0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 74 72  {.        /* ftr
2ecb0 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d  uncate(pShmNode-
2ecc0 3e 68 53 68 6d 2c 20 33 32 20 2a 20 31 30 32 34  >hShm, 32 * 1024
2ecd0 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  ); */.      }.  
2ece0 20 20 7d 0a 20 20 20 20 75 6e 69 78 53 68 6d 50    }.    unixShmP
2ecf0 75 72 67 65 28 70 44 62 46 64 29 3b 0a 20 20 7d  urge(pDbFd);.  }
2ed00 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
2ed10 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  x();..  return S
2ed20 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65  QLITE_OK;.}...#e
2ed30 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69  lse.# define uni
2ed40 78 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20  xShmMap     0.# 
2ed50 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f  define unixShmLo
2ed60 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  ck    0.# define
2ed70 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 20   unixShmBarrier 
2ed80 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  0.# define unixS
2ed90 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64  hmUnmap   0.#end
2eda0 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
2edb0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
2edc0 0a 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 45 4e  ..#if (SQLITE_EN
2edd0 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30  ABLE_APPLE_SPI>0
2ede0 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  ) && defined(__A
2edf0 50 50 4c 45 5f 5f 29 0a 73 74 61 74 69 63 20 63  PPLE__).static c
2ee00 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54  onst char *unixT
2ee10 65 6d 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29  empFileDir(void)
2ee20 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  ;..static int un
2ee30 69 78 49 6e 76 61 6c 69 64 61 74 65 53 75 70 70  ixInvalidateSupp
2ee40 6f 72 74 46 69 6c 65 73 28 75 6e 69 78 46 69 6c  ortFiles(unixFil
2ee50 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 73 6b  e *pFile, int sk
2ee60 69 70 57 41 4c 29 20 7b 0a 20 20 63 68 61 72 20  ipWAL) {.  char 
2ee70 6a 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e  jPath[MAXPATHLEN
2ee80 2b 39 5d 3b 0a 20 20 69 6e 74 20 7a 4c 65 6e 20  +9];.  int zLen 
2ee90 3d 20 73 74 72 6c 63 70 79 28 6a 50 61 74 68 2c  = strlcpy(jPath,
2eea0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d   pFile->zPath, M
2eeb0 41 58 50 41 54 48 4c 45 4e 2b 39 29 3b 0a 20 20  AXPATHLEN+9);.  
2eec0 69 66 28 20 7a 4c 65 6e 3c 4d 41 58 50 41 54 48  if( zLen<MAXPATH
2eed0 4c 45 4e 20 29 7b 0a 20 20 20 20 73 69 7a 65 5f  LEN ){.    size_
2eee0 74 20 6a 4c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73  t jLen;.    cons
2eef0 74 20 63 68 61 72 20 65 78 74 65 6e 73 69 6f 6e  t char extension
2ef00 73 5b 33 5d 5b 39 5d 20 3d 20 7b 20 22 2d 77 61  s[3][9] = { "-wa
2ef10 6c 22 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20  l", "-journal", 
2ef20 22 2d 73 68 6d 22 20 7d 3b 0a 20 20 20 20 69 6e  "-shm" };.    in
2ef30 74 20 6a 20 3d 20 28 73 6b 69 70 57 41 4c 20 3f  t j = (skipWAL ?
2ef40 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 66 6f 72   1 : 0);.    for
2ef50 28 20 3b 20 6a 3c 33 3b 20 6a 2b 2b 20 29 7b 0a  ( ; j<3; j++ ){.
2ef60 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20        .      /* 
2ef70 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
2ef80 74 68 65 20 73 68 6d 20 66 69 6c 65 20 69 73 20  the shm file is 
2ef90 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 66  already opened f
2efa0 6f 72 20 74 68 69 73 20 70 46 69 6c 65 20 2a 2f  or this pFile */
2efb0 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 32 20  .      if( j==2 
2efc0 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 69 78 45  ){.        unixE
2efd0 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20  nterMutex(); /* 
2efe0 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70  Because pFile->p
2eff0 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20  Inode is shared 
2f000 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a  across threads *
2f010 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 78 53 68  /.        unixSh
2f020 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20  mNode *pShmNode 
2f030 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
2f040 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 20  >pShmNode;.     
2f050 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 20     if( pShmNode 
2f060 26 26 20 21 70 53 68 6d 4e 6f 64 65 2d 3e 69 73  && !pShmNode->is
2f070 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20  Readonly ){.    
2f080 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61        struct sta
2f090 74 20 73 53 74 61 74 3b 0a 20 20 20 20 20 20 20  t sStat;.       
2f0a0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
2f0b0 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
2f0c0 3e 70 53 68 6d 4d 75 74 65 78 29 3b 0a 20 20 20  >pShmMutex);.   
2f0d0 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
2f0e0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
2f0f0 68 53 68 6d 3e 3d 30 20 26 26 20 21 6f 73 46 73  hShm>=0 && !osFs
2f100 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 53  tat(pShmNode->hS
2f110 68 6d 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  hm, &sStat) ){. 
2f120 20 20 20 20 20 20 20 20 20 20 20 75 6e 73 69 67             unsig
2f130 6e 65 64 20 6c 6f 6e 67 20 73 69 7a 65 20 3d 20  ned long size = 
2f140 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 34  (sStat.st_size<4
2f150 29 20 3f 20 73 53 74 61 74 2e 73 74 5f 73 69 7a  ) ? sStat.st_siz
2f160 65 20 3a 20 34 3b 0a 20 20 20 20 20 20 20 20 20  e : 4;.         
2f170 20 20 20 69 66 28 20 73 69 7a 65 3e 30 20 29 7b     if( size>0 ){
2f180 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
2f190 7a 65 72 6f 28 70 53 68 6d 4e 6f 64 65 2d 3e 61  zero(pShmNode->a
2f1a0 70 52 65 67 69 6f 6e 5b 30 5d 2c 20 73 69 7a 65  pRegion[0], size
2f1b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2f1c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
2f1d0 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 70  eave(pShmNode->p
2f1e0 53 68 6d 4d 75 74 65 78 29 3b 0a 20 20 20 20 20  ShmMutex);.     
2f1f0 20 20 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61           unixLea
2f200 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20  veMutex();.     
2f210 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2f220 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
2f230 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2f240 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
2f250 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
2f260 6f 64 65 2d 3e 70 53 68 6d 4d 75 74 65 78 29 3b  ode->pShmMutex);
2f270 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f280 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
2f290 78 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  x();.      }.   
2f2a0 20 20 20 6a 4c 65 6e 20 3d 20 73 74 72 6c 63 70     jLen = strlcp
2f2b0 79 28 26 6a 50 61 74 68 5b 7a 4c 65 6e 5d 2c 20  y(&jPath[zLen], 
2f2c0 65 78 74 65 6e 73 69 6f 6e 73 5b 6a 5d 2c 20 39  extensions[j], 9
2f2d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 4c 65  );.      if( jLe
2f2e0 6e 20 3c 20 39 20 29 7b 0a 20 20 20 20 20 20 20  n < 9 ){.       
2f2f0 20 69 6e 74 20 6a 66 6c 61 67 73 20 3d 20 28 6a   int jflags = (j
2f300 3c 32 29 20 3f 20 4f 5f 54 52 55 4e 43 20 3a 20  <2) ? O_TRUNC : 
2f310 4f 5f 52 44 57 52 3b 0a 20 20 20 20 20 20 20 20  O_RDWR;.        
2f320 69 6e 74 20 6a 66 64 20 3d 20 6f 70 65 6e 28 6a  int jfd = open(j
2f330 50 61 74 68 2c 20 6a 66 6c 61 67 73 29 3b 0a 20  Path, jflags);. 
2f340 20 20 20 20 20 20 20 69 66 28 20 6a 66 64 3d 3d         if( jfd==
2f350 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
2f360 20 20 69 66 28 20 65 72 72 6e 6f 21 3d 45 4e 4f    if( errno!=ENO
2f370 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ENT ){.         
2f380 20 20 20 70 65 72 72 6f 72 28 6a 50 61 74 68 29     perror(jPath)
2f390 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2f3a0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
2f3b0 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d           if( j==
2f3c0 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
2f3d0 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
2f3e0 61 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  at;.            
2f3f0 69 66 28 20 21 6f 73 46 73 74 61 74 28 6a 66 64  if( !osFstat(jfd
2f400 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20  , &sStat) ){.   
2f410 20 20 20 20 20 20 20 20 20 20 20 75 6e 73 69 67             unsig
2f420 6e 65 64 20 6c 6f 6e 67 20 73 69 7a 65 20 3d 20  ned long size = 
2f430 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 34  (sStat.st_size<4
2f440 29 20 3f 20 73 53 74 61 74 2e 73 74 5f 73 69 7a  ) ? sStat.st_siz
2f450 65 20 3a 20 34 3b 0a 20 20 20 20 20 20 20 20 20  e : 4;.         
2f460 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e 30 20       if( size>0 
2f470 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2f480 20 20 20 75 69 6e 74 33 32 5f 74 20 7a 65 72 6f     uint32_t zero
2f490 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2f4a0 20 20 20 20 20 20 70 77 72 69 74 65 28 6a 66 64        pwrite(jfd
2f4b0 2c 20 26 7a 65 72 6f 2c 20 28 73 69 7a 65 5f 74  , &zero, (size_t
2f4c0 29 73 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20  )size, 0);.     
2f4d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2f4e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f4f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66     }.          f
2f500 73 79 6e 63 28 6a 66 64 29 3b 0a 20 20 20 20 20  sync(jfd);.     
2f510 20 20 20 20 20 63 6c 6f 73 65 28 6a 66 64 29 3b       close(jfd);
2f520 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f530 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
2f540 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2f550 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .}..static int u
2f560 6e 69 78 55 6e 73 61 66 65 54 72 75 6e 63 61 74  nixUnsafeTruncat
2f570 65 44 61 74 61 62 61 73 65 28 75 6e 69 78 46 69  eDatabase(unixFi
2f580 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 2f 2a  le *pFile){.  /*
2f590 20 74 68 69 73 20 69 73 20 6e 61 73 74 79 20 26   this is nasty &
2f5a0 20 62 61 64 2e 20 20 64 65 73 74 72 75 63 74 69   bad.  destructi
2f5b0 6f 6e 20 77 69 74 68 20 70 72 65 6a 75 64 69 63  on with prejudic
2f5c0 65 2e 20 20 77 65 27 6c 6c 20 6c 6f 73 65 20 61  e.  we'll lose a
2f5d0 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65  ll the.  ** file
2f5e0 20 6c 6f 63 6b 73 20 69 6e 20 74 68 69 73 20 70   locks in this p
2f5f0 72 6f 63 65 73 73 2c 20 68 6f 77 65 76 65 72 2e  rocess, however.
2f600 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
2f610 6e 74 72 6f 6c 20 77 6f 72 6b 73 20 70 72 6f 70  ntrol works prop
2f620 65 72 6c 79 2e 0a 20 20 2a 2a 20 42 75 74 20 69  erly..  ** But i
2f630 66 20 69 74 20 66 61 69 6c 73 2c 20 74 68 69 73  f it fails, this
2f640 20 77 6f 72 6b 73 20 61 70 70 72 6f 78 69 6d 61   works approxima
2f650 74 65 6c 79 0a 20 20 2a 2f 0a 20 20 63 68 61 72  tely.  */.  char
2f660 20 6a 6f 75 72 6e 61 6c 50 61 74 68 5b 4d 41 58   journalPath[MAX
2f670 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72  PATHLEN];.  char
2f680 20 77 61 6c 50 61 74 68 5b 4d 41 58 50 41 54 48   walPath[MAXPATH
2f690 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  LEN];.  int rc =
2f6a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 23   SQLITE_OK;.  .#
2f6b0 69 66 64 65 66 20 44 45 42 55 47 0a 20 20 66 70  ifdef DEBUG.  fp
2f6c0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 46  rintf(stderr, "F
2f6d0 6f 72 63 65 20 74 72 75 6e 63 61 74 69 6e 67 20  orce truncating 
2f6e0 64 61 74 61 62 61 73 65 20 25 73 5c 6e 22 2c 20  database %s\n", 
2f6f0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 23  pFile->zPath);.#
2f700 65 6e 64 69 66 0a 20 20 73 74 72 6c 63 70 79 28  endif.  strlcpy(
2f710 6a 6f 75 72 6e 61 6c 50 61 74 68 2c 20 70 46 69  journalPath, pFi
2f720 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58 50 41  le->zPath, MAXPA
2f730 54 48 4c 45 4e 29 3b 0a 20 20 73 74 72 6c 63 61  THLEN);.  strlca
2f740 74 28 6a 6f 75 72 6e 61 6c 50 61 74 68 2c 20 22  t(journalPath, "
2f750 2d 6a 6f 75 72 6e 61 6c 22 2c 20 4d 41 58 50 41  -journal", MAXPA
2f760 54 48 4c 45 4e 29 3b 0a 20 20 73 74 72 6c 63 70  THLEN);.  strlcp
2f770 79 28 77 61 6c 50 61 74 68 2c 20 70 46 69 6c 65  y(walPath, pFile
2f780 2d 3e 7a 50 61 74 68 2c 20 4d 41 58 50 41 54 48  ->zPath, MAXPATH
2f790 4c 45 4e 29 3b 0a 20 20 73 74 72 6c 63 61 74 28  LEN);.  strlcat(
2f7a0 77 61 6c 50 61 74 68 2c 20 22 2d 77 61 6c 22 2c  walPath, "-wal",
2f7b0 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
2f7c0 69 6e 74 20 66 64 31 20 3d 20 70 46 69 6c 65 2d  int fd1 = pFile-
2f7d0 3e 68 3b 0a 20 20 69 6e 74 20 72 65 73 75 6c 74  >h;.  int result
2f7e0 20 3d 20 30 3b 0a 20 20 72 65 73 75 6c 74 20 3d   = 0;.  result =
2f7f0 20 66 74 72 75 6e 63 61 74 65 28 66 64 31 2c 20   ftruncate(fd1, 
2f800 30 6c 6c 29 3b 0a 20 20 69 66 20 28 72 65 73 75  0ll);.  if (resu
2f810 6c 74 29 20 7b 0a 20 20 20 20 72 65 73 75 6c 74  lt) {.    result
2f820 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20   = errno;.  }.  
2f830 69 66 20 28 72 65 73 75 6c 74 29 20 7b 0a 20 20  if (result) {.  
2f840 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
2f850 45 52 52 3b 0a 20 20 20 20 73 74 6f 72 65 4c 61  ERR;.    storeLa
2f860 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 72  stErrno(pFile, r
2f870 65 73 75 6c 74 29 3b 0a 20 20 7d 0a 20 20 0a 20  esult);.  }.  . 
2f880 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28   int fd2 = open(
2f890 6a 6f 75 72 6e 61 6c 50 61 74 68 2c 20 4f 5f 52  journalPath, O_R
2f8a0 44 57 52 29 3b 0a 20 20 69 6e 74 20 72 65 73 75  DWR);.  int resu
2f8b0 6c 74 32 20 3d 20 30 3b 0a 20 20 69 66 20 28 66  lt2 = 0;.  if (f
2f8c0 64 32 20 3c 20 30 29 20 7b 0a 20 20 20 20 69 66  d2 < 0) {.    if
2f8d0 20 28 65 72 72 6e 6f 20 21 3d 20 45 4e 4f 45 4e   (errno != ENOEN
2f8e0 54 29 20 7b 0a 20 20 20 20 20 20 72 65 73 75 6c  T) {.      resul
2f8f0 74 32 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  t2 = errno;.    
2f900 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72  } else {.      r
2f910 65 73 75 6c 74 32 20 3d 20 30 3b 0a 20 20 20 20  esult2 = 0;.    
2f920 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  }.  } else {.   
2f930 20 72 65 73 75 6c 74 32 20 3d 20 66 74 72 75 6e   result2 = ftrun
2f940 63 61 74 65 28 66 64 32 2c 20 30 6c 6c 29 3b 0a  cate(fd2, 0ll);.
2f950 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 32 29      if (result2)
2f960 20 7b 0a 20 20 20 20 20 20 72 65 73 75 6c 74 32   {.      result2
2f970 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a   = errno;.    }.
2f980 20 20 7d 0a 20 20 69 66 20 28 72 65 73 75 6c 74    }.  if (result
2f990 32 20 26 26 20 21 72 65 73 75 6c 74 29 20 7b 0a  2 && !result) {.
2f9a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2f9b0 49 4f 45 52 52 3b 0a 20 20 20 20 73 74 6f 72 65  IOERR;.    store
2f9c0 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
2f9d0 20 72 65 73 75 6c 74 32 29 3b 0a 20 20 7d 0a 20   result2);.  }. 
2f9e0 20 0a 20 20 69 6e 74 20 66 64 33 20 3d 20 6f 70   .  int fd3 = op
2f9f0 65 6e 28 77 61 6c 50 61 74 68 2c 20 4f 5f 52 44  en(walPath, O_RD
2fa00 57 52 29 3b 0a 20 20 69 6e 74 20 72 65 73 75 6c  WR);.  int resul
2fa10 74 33 20 3d 20 30 3b 0a 20 20 69 66 20 28 66 64  t3 = 0;.  if (fd
2fa20 33 20 3c 20 30 29 20 7b 0a 20 20 20 20 69 66 20  3 < 0) {.    if 
2fa30 28 65 72 72 6e 6f 20 21 3d 20 45 4e 4f 45 4e 54  (errno != ENOENT
2fa40 29 20 7b 0a 20 20 20 20 20 20 72 65 73 75 6c 74  ) {.      result
2fa50 33 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d  3 = errno;.    }
2fa60 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 65   else {.      re
2fa70 73 75 6c 74 33 20 3d 20 30 3b 0a 20 20 20 20 7d  sult3 = 0;.    }
2fa80 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
2fa90 72 65 73 75 6c 74 33 20 3d 20 66 74 72 75 6e 63  result3 = ftrunc
2faa0 61 74 65 28 66 64 33 2c 20 30 6c 6c 29 3b 0a 20  ate(fd3, 0ll);. 
2fab0 20 20 20 69 66 20 28 72 65 73 75 6c 74 33 29 20     if (result3) 
2fac0 7b 0a 20 20 20 20 20 20 72 65 73 75 6c 74 33 20  {.      result3 
2fad0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20  = errno;.    }. 
2fae0 20 7d 0a 20 20 69 66 20 28 72 65 73 75 6c 74 33   }.  if (result3
2faf0 20 26 26 20 21 28 72 65 73 75 6c 74 20 7c 7c 20   && !(result || 
2fb00 72 65 73 75 6c 74 32 29 29 20 7b 0a 20 20 20 20  result2)) {.    
2fb10 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
2fb20 52 3b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74  R;.    storeLast
2fb30 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 72 65 73  Errno(pFile, res
2fb40 75 6c 74 32 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  ult2);.  }.  .  
2fb50 69 66 20 28 66 64 33 20 3e 3d 20 30 29 20 7b 0a  if (fd3 >= 0) {.
2fb60 20 20 20 20 66 73 79 6e 63 28 66 64 33 29 3b 0a      fsync(fd3);.
2fb70 20 20 20 20 63 6c 6f 73 65 28 66 64 33 29 3b 0a      close(fd3);.
2fb80 20 20 7d 0a 20 20 69 66 20 28 66 64 32 20 3e 3d    }.  if (fd2 >=
2fb90 20 30 29 20 7b 0a 20 20 20 20 66 73 79 6e 63 28   0) {.    fsync(
2fba0 66 64 32 29 3b 0a 20 20 20 20 63 6c 6f 73 65 28  fd2);.    close(
2fbb0 66 64 32 29 3b 0a 20 20 7d 0a 20 20 66 73 79 6e  fd2);.  }.  fsyn
2fbc0 63 28 66 64 31 29 3b 0a 09 0a 20 20 72 65 74 75  c(fd1);...  retu
2fbd0 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
2fbe0 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74   int unixTruncat
2fbf0 65 44 61 74 61 62 61 73 65 28 75 6e 69 78 46 69  eDatabase(unixFi
2fc00 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 62  le *pFile, int b
2fc10 46 6c 61 67 73 29 20 7b 0a 20 20 73 71 6c 69 74  Flags) {.  sqlit
2fc20 65 33 5f 66 69 6c 65 20 2a 69 64 20 3d 20 28 73  e3_file *id = (s
2fc30 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 70 46  qlite3_file *)pF
2fc40 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ile;.  int rc = 
2fc50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 76 6f 69  SQLITE_OK;.  voi
2fc60 64 20 2a 70 4c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b  d *pLock = NULL;
2fc70 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 30  .  int flags = 0
2fc80 3b 0a 20 20 69 6e 74 20 63 6f 72 72 75 70 74 46  ;.  int corruptF
2fc90 69 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 69  ileLock = 0;.  i
2fca0 6e 74 20 69 73 43 6f 72 72 75 70 74 20 3d 20 30  nt isCorrupt = 0
2fcb0 3b 0a 20 20 69 6e 74 20 66 6f 72 63 65 20 3d 20  ;.  int force = 
2fcc0 28 62 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  (bFlags & SQLITE
2fcd0 5f 54 52 55 4e 43 41 54 45 5f 46 4f 52 43 45 29  _TRUNCATE_FORCE)
2fce0 3b 0a 20 20 69 6e 74 20 73 61 66 65 46 61 69 6c  ;.  int safeFail
2fcf0 65 64 20 3d 20 30 3b 0a 0a 23 69 66 20 53 51 4c  ed = 0;..#if SQL
2fd00 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f  ITE_ENABLE_DATA_
2fd10 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 66 6c 61  PROTECTION.  fla
2fd20 67 73 20 7c 3d 20 70 46 69 6c 65 2d 3e 70 72 6f  gs |= pFile->pro
2fd30 74 46 6c 61 67 73 3b 0a 23 65 6e 64 69 66 0a 23  tFlags;.#endif.#
2fd40 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
2fd50 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2fd60 20 69 66 28 20 69 73 50 72 6f 78 79 4c 6f 63 6b   if( isProxyLock
2fd70 69 6e 67 4d 6f 64 65 28 70 46 69 6c 65 29 20 29  ingMode(pFile) )
2fd80 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53  {.    flags |= S
2fd90 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50  QLITE_OPEN_AUTOP
2fda0 52 4f 58 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ROXY;.  }.#endif
2fdb0 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  .  .  rc = sqlit
2fdc0 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b  e3demo_superlock
2fdd0 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 30  (pFile->zPath, 0
2fde0 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 26  , flags, 0, 0, &
2fdf0 70 4c 6f 63 6b 29 3b 0a 20 20 69 66 28 20 72 63  pLock);.  if( rc
2fe00 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
2fe10 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c  SQLITE_CORRUPT |
2fe20 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54  | rc==SQLITE_NOT
2fe30 41 44 42 20 29 7b 0a 20 20 20 20 20 20 69 73 43  ADB ){.      isC
2fe40 6f 72 72 75 70 74 20 3d 20 31 3b 0a 20 20 20 20  orrupt = 1;.    
2fe50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 64 65    rc = sqlite3de
2fe60 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 5f 63 6f 72  mo_superlock_cor
2fe70 72 75 70 74 28 69 64 2c 20 53 51 4c 49 54 45 5f  rupt(id, SQLITE_
2fe80 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45 2c 0a  LOCK_EXCLUSIVE,.
2fe90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2feb0 20 20 20 20 20 20 20 20 20 26 63 6f 72 72 75 70           &corrup
2fec0 74 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  tFileLock);.    
2fed0 7d 0a 20 20 20 20 69 66 28 20 72 63 20 26 26 20  }.    if( rc && 
2fee0 21 66 6f 72 63 65 20 29 7b 0a 20 20 20 20 20 20  !force ){.      
2fef0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2ff00 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2ff10 5f 4f 4b 3b 20 2f 2a 20 49 67 6e 6f 72 65 20 74  _OK; /* Ignore t
2ff20 68 65 20 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 75  he locking failu
2ff30 72 65 20 69 66 20 66 6f 72 63 65 20 69 73 20 74  re if force is t
2ff40 72 75 65 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  rue */.  }.  if(
2ff50 20 28 62 46 6c 61 67 73 26 53 51 4c 49 54 45 5f   (bFlags&SQLITE_
2ff60 54 52 55 4e 43 41 54 45 5f 49 4e 49 54 49 41 4c  TRUNCATE_INITIAL
2ff70 49 5a 45 5f 48 45 41 44 45 52 5f 4d 41 53 4b 29  IZE_HEADER_MASK)
2ff80 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 69 6e  !=0 ){.    /* in
2ff90 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 64  itialize a new d
2ffa0 61 74 61 62 61 73 65 20 69 6e 20 54 4d 50 44 49  atabase in TMPDI
2ffb0 52 20 61 6e 64 20 63 6f 70 79 20 74 68 65 20 63  R and copy the c
2ffc0 6f 6e 74 65 6e 74 73 20 6f 76 65 72 20 2a 2f 0a  ontents over */.
2ffd0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2ffe0 74 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46  tDir = unixTempF
2fff0 69 6c 65 44 69 72 28 29 3b 0a 20 20 20 20 69 6e  ileDir();.    in
30000 74 20 74 44 69 72 4c 65 6e 20 3d 20 73 74 72 6c  t tDirLen = strl
30010 65 6e 28 74 44 69 72 29 3b 0a 20 20 20 20 69 6e  en(tDir);.    in
30020 74 20 74 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  t tLen = sizeof(
30030 63 68 61 72 29 20 2a 20 28 74 44 69 72 4c 65 6e  char) * (tDirLen
30040 20 2b 20 31 32 29 3b 0a 20 20 20 20 63 68 61 72   + 12);.    char
30050 20 2a 74 44 62 50 61 74 68 20 3d 20 28 63 68 61   *tDbPath = (cha
30060 72 20 2a 29 6d 61 6c 6c 6f 63 28 74 4c 65 6e 29  r *)malloc(tLen)
30070 3b 0a 20 20 20 20 69 6e 74 20 74 46 64 20 3d 20  ;.    int tFd = 
30080 2d 31 3b 0a 20 20 20 20 0a 20 20 20 20 73 74 72  -1;.    .    str
30090 6c 63 70 79 28 74 44 62 50 61 74 68 2c 20 74 44  lcpy(tDbPath, tD
300a0 69 72 2c 20 74 4c 65 6e 29 3b 0a 20 20 20 20 69  ir, tLen);.    i
300b0 66 28 20 74 44 62 50 61 74 68 5b 28 74 44 69 72  f( tDbPath[(tDir
300c0 4c 65 6e 2d 31 29 5d 20 21 3d 20 27 2f 27 20 29  Len-1)] != '/' )
300d0 7b 0a 20 20 20 20 20 20 73 74 72 6c 63 61 74 28  {.      strlcat(
300e0 74 44 62 50 61 74 68 2c 20 22 2f 74 6d 70 64 62  tDbPath, "/tmpdb
300f0 58 58 58 58 58 22 2c 20 74 4c 65 6e 29 3b 0a 20  XXXXX", tLen);. 
30100 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
30110 20 20 73 74 72 6c 63 61 74 28 74 44 62 50 61 74    strlcat(tDbPat
30120 68 2c 20 22 74 6d 70 64 62 58 58 58 58 58 22 2c  h, "tmpdbXXXXX",
30130 20 74 4c 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   tLen);.    }.  
30140 20 20 74 46 64 20 3d 20 6d 6b 73 74 65 6d 70 28    tFd = mkstemp(
30150 74 44 62 50 61 74 68 29 3b 0a 20 20 20 20 69 66  tDbPath);.    if
30160 28 20 74 46 64 3d 3d 2d 31 20 29 7b 0a 20 20 20  ( tFd==-1 ){.   
30170 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
30180 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
30190 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
301a0 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20  TE_IOERR;.      
301b0 73 61 66 65 46 61 69 6c 65 64 20 3d 20 31 3b 0a  safeFailed = 1;.
301c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
301d0 20 73 71 6c 69 74 65 33 20 2a 74 44 62 20 3d 20   sqlite3 *tDb = 
301e0 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 63 6f 70 79  NULL;.      copy
301f0 66 69 6c 65 5f 73 74 61 74 65 5f 74 20 73 3b 0a  file_state_t s;.
30200 20 20 20 20 20 20 69 6e 74 20 74 72 63 20 3d 20        int trc = 
30210 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
30220 74 44 62 50 61 74 68 2c 20 26 74 44 62 2c 0a 20  tDbPath, &tDb,. 
30230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30240 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43    (SQLITE_OPEN_C
30250 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  REATE | SQLITE_O
30260 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20  PEN_READWRITE.  
30270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30280 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45      | SQLITE_OPE
30290 4e 5f 41 55 54 4f 50 52 4f 58 59 29 2c 20 4e 55  N_AUTOPROXY), NU
302a0 4c 4c 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20  LL);.      char 
302b0 2a 65 72 72 6d 73 67 20 3d 20 4e 55 4c 4c 3b 0a  *errmsg = NULL;.
302c0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
302d0 20 2a 73 71 6c 20 3d 20 22 22 3b 0a 20 20 20 20   *sql = "";.    
302e0 20 20 69 66 28 20 21 74 72 63 20 26 26 20 28 62    if( !trc && (b
302f0 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 54 52 55  Flags&SQLITE_TRU
30300 4e 43 41 54 45 5f 50 41 47 45 53 49 5a 45 5f 4d  NCATE_PAGESIZE_M
30310 41 53 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ASK) ){.        
30320 63 6f 6e 73 74 20 63 68 61 72 20 70 61 67 65 73  const char pages
30330 69 7a 65 5f 73 71 6c 5b 34 5d 5b 32 32 5d 20 3d  ize_sql[4][22] =
30340 20 7b 0a 20 20 20 20 20 20 20 20 20 20 22 70 72   {.          "pr
30350 61 67 6d 61 20 70 61 67 65 5f 73 69 7a 65 3d 31  agma page_size=1
30360 30 32 34 22 2c 0a 20 20 20 20 20 20 20 20 20 20  024",.          
30370 22 70 72 61 67 6d 61 20 70 61 67 65 5f 73 69 7a  "pragma page_siz
30380 65 3d 32 30 34 38 22 2c 0a 20 20 20 20 20 20 20  e=2048",.       
30390 20 20 20 22 70 72 61 67 6d 61 20 70 61 67 65 5f     "pragma page_
303a0 73 69 7a 65 3d 34 30 39 36 22 2c 0a 20 20 20 20  size=4096",.    
303b0 20 20 20 20 20 20 22 70 72 61 67 6d 61 20 70 61        "pragma pa
303c0 67 65 5f 73 69 7a 65 3d 38 31 39 32 22 20 0a 20  ge_size=8192" . 
303d0 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20         };.      
303e0 20 20 69 6e 74 20 69 50 61 67 65 73 69 7a 65 20    int iPagesize 
303f0 3d 20 28 28 28 62 46 6c 61 67 73 26 53 51 4c 49  = (((bFlags&SQLI
30400 54 45 5f 54 52 55 4e 43 41 54 45 5f 50 41 47 45  TE_TRUNCATE_PAGE
30410 53 49 5a 45 5f 4d 41 53 4b 29 20 3e 3e 20 34 29  SIZE_MASK) >> 4)
30420 20 2d 20 31 29 3b 0a 20 20 20 20 20 20 20 20 61   - 1);.        a
30430 73 73 65 72 74 28 20 69 50 61 67 65 73 69 7a 65  ssert( iPagesize
30440 3e 3d 30 20 26 26 20 69 50 61 67 65 73 69 7a 65  >=0 && iPagesize
30450 3c 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20 73  <=4 );.        s
30460 71 6c 20 3d 20 70 61 67 65 73 69 7a 65 5f 73 71  ql = pagesize_sq
30470 6c 5b 69 50 61 67 65 73 69 7a 65 5d 3b 0a 20 20  l[iPagesize];.  
30480 20 20 20 20 20 20 74 72 63 20 3d 20 73 71 6c 69        trc = sqli
30490 74 65 33 5f 65 78 65 63 28 74 44 62 2c 20 73 71  te3_exec(tDb, sq
304a0 6c 2c 20 30 2c 20 30 2c 20 26 65 72 72 6d 73 67  l, 0, 0, &errmsg
304b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
304c0 20 69 66 28 20 21 74 72 63 20 29 7b 0a 20 20 20   if( !trc ){.   
304d0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
304e0 61 75 74 6f 76 61 63 75 75 6d 5f 73 71 6c 5b 33  autovacuum_sql[3
304f0 5d 5b 32 31 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ][21] = {.      
30500 20 20 20 20 22 70 72 61 67 6d 61 20 61 75 74 6f      "pragma auto
30510 5f 76 61 63 75 75 6d 3d 30 22 2c 0a 20 20 20 20  _vacuum=0",.    
30520 20 20 20 20 20 20 22 70 72 61 67 6d 61 20 61 75        "pragma au
30530 74 6f 5f 76 61 63 75 75 6d 3d 31 22 2c 0a 20 20  to_vacuum=1",.  
30540 20 20 20 20 20 20 20 20 22 70 72 61 67 6d 61 20          "pragma 
30550 61 75 74 6f 5f 76 61 63 75 75 6d 3d 32 22 0a 20  auto_vacuum=2". 
30560 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20         };.      
30570 20 20 69 6e 74 20 69 41 75 74 6f 76 61 63 75 75    int iAutovacuu
30580 6d 20 3d 20 32 3b 20 2f 2a 20 64 65 66 61 75 6c  m = 2; /* defaul
30590 74 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 61 6c  t to incremental
305a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
305b0 28 62 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 54  (bFlags&SQLITE_T
305c0 52 55 4e 43 41 54 45 5f 41 55 54 4f 56 41 43 55  RUNCATE_AUTOVACU
305d0 55 4d 5f 4d 41 53 4b 29 20 29 7b 0a 20 20 20 20  UM_MASK) ){.    
305e0 20 20 20 20 20 20 69 41 75 74 6f 76 61 63 75 75        iAutovacuu
305f0 6d 20 3d 20 28 28 28 62 46 6c 61 67 73 26 53 51  m = (((bFlags&SQ
30600 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 41 55  LITE_TRUNCATE_AU
30610 54 4f 56 41 43 55 55 4d 5f 4d 41 53 4b 29 20 3e  TOVACUUM_MASK) >
30620 3e 20 32 29 20 2d 20 31 29 3b 0a 20 20 20 20 20  > 2) - 1);.     
30630 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
30640 65 72 74 28 20 69 41 75 74 6f 76 61 63 75 75 6d  ert( iAutovacuum
30650 3e 3d 30 20 26 26 20 69 41 75 74 6f 76 61 63 75  >=0 && iAutovacu
30660 75 6d 3c 3d 32 20 29 3b 0a 20 20 20 20 20 20 20  um<=2 );.       
30670 20 73 71 6c 20 3d 20 61 75 74 6f 76 61 63 75 75   sql = autovacuu
30680 6d 5f 73 71 6c 5b 69 41 75 74 6f 76 61 63 75 75  m_sql[iAutovacuu
30690 6d 5d 3b 0a 20 20 20 20 20 20 20 20 74 72 63 20  m];.        trc 
306a0 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 74  = sqlite3_exec(t
306b0 44 62 2c 20 73 71 6c 2c 20 30 2c 20 30 2c 20 26  Db, sql, 0, 0, &
306c0 65 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 7d  errmsg);.      }
306d0 0a 20 20 20 20 20 20 69 66 28 20 21 74 72 63 20  .      if( !trc 
306e0 26 26 20 28 62 46 6c 61 67 73 26 53 51 4c 49 54  && (bFlags&SQLIT
306f0 45 5f 54 52 55 4e 43 41 54 45 5f 4a 4f 55 52 4e  E_TRUNCATE_JOURN
30700 41 4c 4d 4f 44 45 5f 57 41 4c 29 20 29 7b 0a 20  ALMODE_WAL) ){. 
30710 20 20 20 20 20 20 20 73 71 6c 20 3d 20 22 70 72         sql = "pr
30720 61 67 6d 61 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  agma journal_mod
30730 65 3d 77 61 6c 22 3b 0a 20 20 20 20 20 20 20 20  e=wal";.        
30740 74 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  trc = sqlite3_ex
30750 65 63 28 74 44 62 2c 20 73 71 6c 2c 20 30 2c 20  ec(tDb, sql, 0, 
30760 30 2c 20 26 65 72 72 6d 73 67 29 3b 0a 20 20 20  0, &errmsg);.   
30770 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 74     }.      if( t
30780 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rc ){.        if
30790 28 20 21 74 44 62 20 29 7b 0a 20 20 20 20 20 20  ( !tDb ){.      
307a0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
307b0 72 72 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 6f  rr, "failed to o
307c0 70 65 6e 20 74 65 6d 70 20 64 61 74 61 62 61 73  pen temp databas
307d0 65 20 27 25 73 27 20 74 6f 20 72 65 73 65 74 20  e '%s' to reset 
307e0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
307f0 20 20 20 20 20 20 20 20 20 20 20 20 22 74 72 75              "tru
30800 6e 63 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ncated database 
30810 25 73 20 77 69 74 68 20 66 6c 61 67 73 20 25 78  %s with flags %x
30820 3a 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  : %d\n",.       
30830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30840 20 20 20 20 74 44 62 50 61 74 68 2c 20 70 46 69      tDbPath, pFi
30850 6c 65 2d 3e 7a 50 61 74 68 2c 20 62 46 6c 61 67  le->zPath, bFlag
30860 73 2c 20 74 72 63 29 3b 0a 20 20 20 20 20 20 20  s, trc);.       
30870 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
30880 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
30890 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 73 65 74  , "failed to set
308a0 20 27 25 73 27 20 6f 6e 20 74 72 75 6e 63 61 74   '%s' on truncat
308b0 65 64 20 64 61 74 61 62 61 73 65 20 25 73 2c 20  ed database %s, 
308c0 25 64 3a 20 22 0a 20 20 20 20 20 20 20 20 20 20  %d: ".          
308d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
308e0 22 25 73 5c 6e 22 2c 20 73 71 6c 2c 20 70 46 69  "%s\n", sql, pFi
308f0 6c 65 2d 3e 7a 50 61 74 68 2c 20 74 72 63 2c 20  le->zPath, trc, 
30900 65 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 20  errmsg);.       
30910 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
30920 20 69 66 28 20 74 44 62 20 29 7b 0a 20 20 20 20   if( tDb ){.    
30930 20 20 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b      int off = 0;
30940 0a 20 20 20 20 20 20 20 20 2f 2a 20 6d 65 72 67  .        /* merg
30950 65 20 74 68 65 20 77 61 6c 20 69 6e 74 6f 20 74  e the wal into t
30960 68 65 20 64 62 20 2a 2f 0a 20 20 20 20 20 20 20  he db */.       
30970 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
30980 6e 74 72 6f 6c 28 74 44 62 2c 20 4e 55 4c 4c 2c  ntrol(tDb, NULL,
30990 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45   SQLITE_FCNTL_PE
309a0 52 53 49 53 54 5f 57 41 4c 2c 20 26 6f 66 66 29  RSIST_WAL, &off)
309b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
309c0 33 5f 63 6c 6f 73 65 28 74 44 62 29 3b 0a 20 20  3_close(tDb);.  
309d0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 20 3d 20      }.      s = 
309e0 63 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 61  copyfile_state_a
309f0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 6c 73  lloc();.      ls
30a00 65 65 6b 28 74 46 64 2c 20 30 2c 20 53 45 45 4b  eek(tFd, 0, SEEK
30a10 5f 53 45 54 29 3b 0a 20 20 20 20 20 20 6c 73 65  _SET);.      lse
30a20 65 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 30 2c 20  ek(pFile->h, 0, 
30a30 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 20  SEEK_SET);.     
30a40 20 69 66 28 20 66 63 6f 70 79 66 69 6c 65 28 74   if( fcopyfile(t
30a50 46 64 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 2c  Fd, pFile->h, s,
30a60 20 43 4f 50 59 46 49 4c 45 5f 44 41 54 41 29 20   COPYFILE_DATA) 
30a70 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  ){.        int e
30a80 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20  rr=errno;.      
30a90 20 20 73 77 69 74 63 68 28 65 72 72 29 20 7b 0a    switch(err) {.
30aa0 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 45            case E
30ab0 4e 4f 4d 45 4d 3a 0a 20 20 20 20 20 20 20 20 20  NOMEM:.         
30ac0 20 20 20 74 72 63 20 3d 20 53 51 4c 49 54 45 5f     trc = SQLITE_
30ad0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
30ae0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
30af0 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
30b00 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61           storeLa
30b10 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65  stErrno(pFile, e
30b20 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rr);.           
30b30 20 74 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f   trc = SQLITE_IO
30b40 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ERR;.        }. 
30b50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 70       }.      cop
30b60 79 66 69 6c 65 5f 73 74 61 74 65 5f 66 72 65 65  yfile_state_free
30b70 28 73 29 3b 0a 20 20 20 20 20 20 66 73 79 6e 63  (s);.      fsync
30b80 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20  (pFile->h);.    
30b90 20 20 63 6c 6f 73 65 28 74 46 64 29 3b 0a 20 20    close(tFd);.  
30ba0 20 20 20 20 75 6e 6c 69 6e 6b 28 74 44 62 50 61      unlink(tDbPa
30bb0 74 68 29 3b 0a 20 20 20 20 20 20 69 66 28 20 74  th);.      if( t
30bc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30bd0 0a 20 20 20 20 20 20 20 20 73 61 66 65 46 61 69  .        safeFai
30be0 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  led = 1;.       
30bf0 20 72 63 20 3d 20 74 72 63 3b 0a 20 20 20 20 20   rc = trc;.     
30c00 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65   }.    }.    fre
30c10 65 28 74 44 62 50 61 74 68 29 3b 0a 20 20 7d 20  e(tDbPath);.  } 
30c20 65 6c 73 65 20 7b 0a 20 20 20 20 72 63 20 3d 20  else {.    rc = 
30c30 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  pFile->pMethod->
30c40 78 54 72 75 6e 63 61 74 65 28 69 64 2c 20 0a 20  xTruncate(id, . 
30c50 20 20 20 20 20 20 20 20 20 20 28 28 70 46 69 6c            ((pFil
30c60 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51 4c  e->fsFlags & SQL
30c70 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d  ITE_FSFLAGS_IS_M
30c80 53 44 4f 53 29 20 21 3d 20 30 29 20 3f 20 31 4c  SDOS) != 0) ? 1L
30c90 20 3a 20 30 4c 29 3b 0a 20 20 20 20 69 66 28 20   : 0L);.    if( 
30ca0 72 63 20 29 7b 0a 20 20 20 20 20 20 73 61 66 65  rc ){.      safe
30cb0 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
30cc0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
30cd0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 66 6f 72  SQLITE_OK || for
30ce0 63 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75  ce ){.    rc = u
30cf0 6e 69 78 49 6e 76 61 6c 69 64 61 74 65 53 75 70  nixInvalidateSup
30d00 70 6f 72 74 46 69 6c 65 73 28 70 46 69 6c 65 2c  portFiles(pFile,
30d10 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
30d20 29 7b 0a 20 20 20 20 20 20 73 61 66 65 46 61 69  ){.      safeFai
30d30 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  led = 1;.    }. 
30d40 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74   }.  pFile->pMet
30d50 68 6f 64 2d 3e 78 53 79 6e 63 28 69 64 2c 20 53  hod->xSync(id, S
30d60 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 29  QLITE_SYNC_FULL)
30d70 3b 0a 0a 0a 20 20 69 66 28 20 69 73 43 6f 72 72  ;...  if( isCorr
30d80 75 70 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  upt ){.    sqlit
30d90 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f  e3demo_superunlo
30da0 63 6b 5f 63 6f 72 72 75 70 74 28 69 64 2c 20 63  ck_corrupt(id, c
30db0 6f 72 72 75 70 74 46 69 6c 65 4c 6f 63 6b 29 3b  orruptFileLock);
30dc0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f  .  }else if( pLo
30dd0 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ck ){.    sqlite
30de0 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63  3demo_superunloc
30df0 6b 28 70 4c 6f 63 6b 29 3b 0a 20 20 7d 65 6c 73  k(pLock);.  }els
30e00 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 66 6f  e{.    assert(fo
30e10 72 63 65 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69  rce);.  }.  .  i
30e20 66 28 20 66 6f 72 63 65 20 26 26 20 73 61 66 65  f( force && safe
30e30 46 61 69 6c 65 64 29 7b 0a 20 20 20 20 72 63 20  Failed){.    rc 
30e40 3d 20 75 6e 69 78 55 6e 73 61 66 65 54 72 75 6e  = unixUnsafeTrun
30e50 63 61 74 65 44 61 74 61 62 61 73 65 28 70 46 69  cateDatabase(pFi
30e60 6c 65 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65  le);.  }.  .  re
30e70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 20  turn rc;.}../*. 
30e80 2a 2a 20 4c 6f 63 6b 20 6c 6f 63 61 74 69 6f 6e  ** Lock location
30e90 73 20 66 6f 72 20 73 68 61 72 65 64 2d 6d 65 6d  s for shared-mem
30ea0 6f 72 79 20 6c 6f 63 6b 73 20 75 73 65 64 20 62  ory locks used b
30eb0 79 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 2a 2f 0a  y WAL mode.. */.
30ec0 23 69 66 6e 64 65 66 20 53 48 4d 5f 42 41 53 45  #ifndef SHM_BASE
30ed0 0a 23 20 64 65 66 69 6e 65 20 53 48 4d 5f 42 41  .# define SHM_BA
30ee0 53 45 20 20 20 20 20 20 20 20 20 20 31 32 30 0a  SE          120.
30ef0 23 20 64 65 66 69 6e 65 20 53 48 4d 5f 57 52 49  # define SHM_WRI
30f00 54 45 20 20 20 20 20 20 20 20 20 53 48 4d 5f 42  TE         SHM_B
30f10 41 53 45 0a 23 20 64 65 66 69 6e 65 20 53 48 4d  ASE.# define SHM
30f20 5f 43 48 45 43 4b 50 4f 49 4e 54 20 20 20 20 28  _CHECKPOINT    (
30f30 53 48 4d 5f 42 41 53 45 2b 31 29 0a 23 20 64 65  SHM_BASE+1).# de
30f40 66 69 6e 65 20 53 48 4d 5f 52 45 43 4f 56 45 52  fine SHM_RECOVER
30f50 20 20 20 20 20 20 20 28 53 48 4d 5f 42 41 53 45         (SHM_BASE
30f60 2b 32 29 0a 23 20 64 65 66 69 6e 65 20 53 48 4d  +2).# define SHM
30f70 5f 52 45 41 44 5f 46 49 52 53 54 20 20 20 20 28  _READ_FIRST    (
30f80 53 48 4d 5f 42 41 53 45 2b 33 29 0a 23 20 64 65  SHM_BASE+3).# de
30f90 66 69 6e 65 20 53 48 4d 5f 52 45 41 44 5f 53 49  fine SHM_READ_SI
30fa0 5a 45 20 20 20 20 20 35 0a 23 65 6e 64 69 66 20  ZE     5.#endif 
30fb0 2f 2a 20 53 48 4d 5f 42 41 53 45 20 2a 2f 0a 0a  /* SHM_BASE */..
30fc0 2f 2a 0a 2a 2a 20 54 68 69 73 20 74 65 73 74 20  /*.** This test 
30fd0 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 6c  only works for l
30fe0 6f 63 6b 20 74 65 73 74 69 6e 67 20 6f 6e 20 75  ock testing on u
30ff0 6e 69 78 2f 70 6f 73 69 78 20 56 46 53 2e 0a 2a  nix/posix VFS..*
31000 2a 20 41 64 61 70 74 65 64 20 66 72 6f 6d 20 74  * Adapted from t
31010 6f 6f 6c 2f 67 65 74 6c 6f 63 6b 2e 63 20 66 34  ool/getlock.c f4
31020 63 33 39 62 36 35 31 33 37 30 31 35 36 63 61 65  c39b651370156cae
31030 39 37 39 35 30 31 61 37 62 31 35 36 62 64 62 61  979501a7b156bdba
31040 35 30 65 37 63 65 0a 2a 2f 0a 73 74 61 74 69 63  50e7ce.*/.static
31050 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 73 74 61   int unixLocksta
31060 74 65 50 69 64 28 75 6e 69 78 46 69 6c 65 20 2a  tePid(unixFile *
31070 70 46 69 6c 65 2c 20 70 69 64 5f 74 20 70 69 64  pFile, pid_t pid
31080 2c 20 69 6e 74 20 2a 70 4c 6f 63 6b 73 74 61 74  , int *pLockstat
31090 65 29 7b 0a 20 20 69 6e 74 20 68 44 62 3b 20 20  e){.  int hDb;  
310a0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
310b0 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65  scriptor for the
310c0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
310d0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 53 68  ile */.  int hSh
310e0 6d 20 3d 20 2d 31 3b 20 20 2f 2a 20 46 69 6c 65  m = -1;  /* File
310f0 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
31100 57 41 4c 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  WAL shared-memor
31110 79 20 66 69 6c 65 20 2a 2f 0a 20 20 73 73 69 7a  y file */.  ssiz
31120 65 5f 74 20 67 6f 74 3b 20 20 20 20 2f 2a 20 42  e_t got;    /* B
31130 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20 68  ytes read from h
31140 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  eader */.  int i
31150 73 57 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  sWal = 0;       
31160 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
31170 20 69 6e 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a   in WAL mode */.
31180 20 20 69 6e 74 20 6e 4c 6f 63 6b 20 3d 20 30 3b    int nLock = 0;
31190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
311a0 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  Number of locks 
311b0 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  held */.  int no
311c0 48 64 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Hdr = 0;        
311d0 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 62 79 74       /* Zero byt
311e0 65 20 44 42 20 68 61 73 20 6e 6f 20 68 65 61 64  e DB has no head
311f0 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  er */.  unsigned
31200 20 63 68 61 72 20 61 48 64 72 5b 31 30 30 5d 3b   char aHdr[100];
31210 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
31220 65 61 64 65 72 20 2a 2f 0a 20 20 0a 20 20 61 73  eader */.  .  as
31230 73 65 72 74 28 70 4c 6f 63 6b 73 74 61 74 65 29  sert(pLockstate)
31240 3b 0a 20 20 0a 20 20 2f 2a 20 6d 61 6b 65 20 73  ;.  .  /* make s
31250 75 72 65 20 77 65 20 61 72 65 20 64 65 61 6c 69  ure we are deali
31260 6e 67 20 77 69 74 68 20 61 20 64 61 74 61 62 61  ng with a databa
31270 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 68 44 62  se file */.  hDb
31280 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 69   = pFile->h;.  i
31290 66 28 20 68 44 62 3c 30 20 29 7b 0a 20 20 20 20  f( hDb<0 ){.    
312a0 2a 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53 51  *pLockstate = SQ
312b0 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 45  LITE_LOCKSTATE_E
312c0 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
312d0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
312e0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 73 74   }.  assert( (st
312f0 72 6c 65 6e 28 53 51 4c 49 54 45 5f 46 49 4c 45  rlen(SQLITE_FILE
31300 5f 48 45 41 44 45 52 29 2b 31 29 3d 3d 53 51 4c  _HEADER)+1)==SQL
31310 49 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 5f  ITE_FILE_HEADER_
31320 4c 45 4e 20 29 3b 0a 20 20 67 6f 74 20 3d 20 70  LEN );.  got = p
31330 72 65 61 64 28 68 44 62 2c 20 61 48 64 72 2c 20  read(hDb, aHdr, 
31340 31 30 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 67  100, 0);.  if( g
31350 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 4c 6f  ot<0 ){.    *pLo
31360 63 6b 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45  ckstate = SQLITE
31370 5f 4c 4f 43 4b 53 54 41 54 45 5f 45 52 52 4f 52  _LOCKSTATE_ERROR
31380 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
31390 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
313a0 20 69 66 28 20 67 6f 74 3d 3d 30 20 29 7b 0a 20   if( got==0 ){. 
313b0 20 20 20 6e 6f 48 64 72 20 3d 20 31 3b 0a 20 20     noHdr = 1;.  
313c0 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 21 3d 31  }else if( got!=1
313d0 30 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6d  00.         || m
313e0 65 6d 63 6d 70 28 61 48 64 72 2c 20 53 51 4c 49  emcmp(aHdr, SQLI
313f0 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 2c 20  TE_FILE_HEADER, 
31400 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41 44  SQLITE_FILE_HEAD
31410 45 52 5f 4c 45 4e 29 21 3d 30 0a 20 20 29 7b 0a  ER_LEN)!=0.  ){.
31420 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61 74 65 20      *pLockstate 
31430 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41  = SQLITE_LOCKSTA
31440 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 72  TE_NOTADB;.    r
31450 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
31460 41 44 42 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ADB;.  }.  .  /*
31470 20 46 69 72 73 74 20 63 68 65 63 6b 20 66 6f 72   First check for
31480 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
31490 63 6b 20 2a 2f 0a 20 20 6e 4c 6f 63 6b 20 2b 3d  ck */.  nLock +=
314a0 20 75 6e 69 78 49 73 4c 6f 63 6b 65 64 28 70 69   unixIsLocked(pi
314b0 64 2c 20 68 44 62 2c 20 46 5f 52 44 4c 43 4b 2c  d, hDb, F_RDLCK,
314c0 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53   SHARED_FIRST, S
314d0 48 41 52 45 44 5f 53 49 5a 45 2c 0a 20 20 20 20  HARED_SIZE,.    
314e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
314f0 20 20 20 20 22 45 58 43 4c 55 53 49 56 45 22 29      "EXCLUSIVE")
31500 3b 0a 20 20 69 66 20 28 21 6e 6f 48 64 72 29 20  ;.  if (!noHdr) 
31510 7b 0a 20 20 20 20 69 73 57 61 6c 20 3d 20 61 48  {.    isWal = aH
31520 64 72 5b 31 38 5d 3d 3d 32 3b 0a 20 20 7d 0a 20  dr[18]==2;.  }. 
31530 20 69 66 28 20 6e 4c 6f 63 6b 3d 3d 30 20 26 26   if( nLock==0 &&
31540 20 69 73 57 61 6c 3d 3d 30 20 29 7b 0a 20 20 20   isWal==0 ){.   
31550 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 6d 6f 64   /* Rollback mod
31560 65 20 2a 2f 0a 20 20 20 20 6e 4c 6f 63 6b 20 2b  e */.    nLock +
31570 3d 20 75 6e 69 78 49 73 4c 6f 63 6b 65 64 28 70  = unixIsLocked(p
31580 69 64 2c 20 68 44 62 2c 20 46 5f 57 52 4c 43 4b  id, hDb, F_WRLCK
31590 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
315a0 53 48 41 52 45 44 5f 53 49 5a 45 2b 32 2c 0a 20  SHARED_SIZE+2,. 
315b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315c0 20 20 20 20 20 20 20 20 20 22 50 45 4e 44 49 4e           "PENDIN
315d0 47 7c 52 45 53 45 52 56 45 44 7c 53 48 41 52 45  G|RESERVED|SHARE
315e0 44 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  D");.  }.  if( n
315f0 4c 6f 63 6b 3d 3d 30 20 26 26 20 69 73 57 61 6c  Lock==0 && isWal
31600 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f  !=0 ){.    /* lo
31610 6f 6b 75 70 20 74 68 65 20 66 69 6c 65 20 64 65  okup the file de
31620 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65  scriptor for the
31630 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 66   shared memory f
31640 69 6c 65 20 69 66 20 77 65 20 68 61 76 65 20 69  ile if we have i
31650 74 20 6f 70 65 6e 0a 20 20 20 20 2a 2a 20 69 6e  t open.    ** in
31660 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f   this process */
31670 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
31680 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73  tex(); /* Becaus
31690 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  e pFile->pInode 
316a0 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
316b0 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 20 20   threads */.    
316c0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
316d0 6d 4e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  mNode = pFile->p
316e0 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
316f0 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  .    if( pShmNod
31700 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
31710 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
31720 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d 75 74  ShmNode->pShmMut
31730 65 78 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  ex);.      .    
31740 20 20 68 53 68 6d 20 3d 20 70 53 68 6d 4e 6f 64    hShm = pShmNod
31750 65 2d 3e 68 53 68 6d 3b 0a 20 20 20 20 20 20 69  e->hShm;.      i
31760 66 28 20 68 53 68 6d 20 3e 3d 20 30 29 7b 0a 20  f( hShm >= 0){. 
31770 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 49         if( unixI
31780 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 53 68  sLocked(pid, hSh
31790 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48 4d 5f  m, F_RDLCK, SHM_
317a0 52 45 43 4f 56 45 52 2c 20 31 2c 20 22 57 41 4c  RECOVER, 1, "WAL
317b0 2d 52 45 43 4f 56 45 52 59 22 29 20 7c 7c 0a 20  -RECOVERY") ||. 
317c0 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 49 73            unixIs
317d0 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 53 68 6d  Locked(pid, hShm
317e0 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48 4d 5f 57  , F_RDLCK, SHM_W
317f0 52 49 54 45 2c 20 31 2c 20 22 57 41 4c 2d 57 52  RITE, 1, "WAL-WR
31800 49 54 45 22 29 20 29 7b 0a 20 20 20 20 20 20 20  ITE") ){.       
31810 20 20 20 6e 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20     nLock = 1;.  
31820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
31830 20 20 20 20 20 20 0a 20 20 20 20 20 20 73 71 6c        .      sql
31840 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
31850 28 70 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d  (pShmNode->pShmM
31860 75 74 65 78 29 3b 0a 20 20 20 20 7d 20 0a 20 20  utex);.    } .  
31870 20 20 0a 20 20 20 20 69 66 28 20 68 53 68 6d 3c    .    if( hShm<
31880 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 74 68  0 ){.      /* th
31890 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
318a0 66 69 6c 65 20 69 73 6e 27 74 20 6f 70 65 6e 20  file isn't open 
318b0 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
318c0 73 70 61 63 65 2c 20 6f 70 65 6e 20 6f 75 72 0a  space, open our.
318d0 20 20 20 20 20 20 2a 2a 20 6f 77 6e 20 46 44 20        ** own FD 
318e0 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 7a 53  */.      char zS
318f0 68 6d 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a  hm[MAXPATHLEN];.
31900 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20        .      /* 
31910 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20  WAL mode */.    
31920 20 20 73 74 72 6c 63 70 79 28 7a 53 68 6d 2c 20    strlcpy(zShm, 
31930 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41  pFile->zPath, MA
31940 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20  XPATHLEN);.     
31950 20 73 74 72 6c 63 61 74 28 7a 53 68 6d 2c 20 22   strlcat(zShm, "
31960 2d 73 68 6d 22 2c 20 4d 41 58 50 41 54 48 4c 45  -shm", MAXPATHLE
31970 4e 29 3b 0a 20 20 20 20 20 20 68 53 68 6d 20 3d  N);.      hShm =
31980 20 6f 70 65 6e 28 7a 53 68 6d 2c 20 4f 5f 52 44   open(zShm, O_RD
31990 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 20 20  ONLY, 0);.      
319a0 69 66 28 20 68 53 68 6d 3c 30 20 29 7b 0a 20 20  if( hShm<0 ){.  
319b0 20 20 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61 74        *pLockstat
319c0 65 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53  e = SQLITE_LOCKS
319d0 54 41 54 45 5f 4f 46 46 3b 0a 20 20 20 20 20 20  TATE_OFF;.      
319e0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
319f0 28 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ();.        retu
31a00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
31a10 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
31a20 75 6e 69 78 49 73 4c 6f 63 6b 65 64 28 70 69 64  unixIsLocked(pid
31a30 2c 20 68 53 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c  , hShm, F_RDLCK,
31a40 20 53 48 4d 5f 52 45 43 4f 56 45 52 2c 20 31 2c   SHM_RECOVER, 1,
31a50 20 22 57 41 4c 2d 52 45 43 4f 56 45 52 59 22 29   "WAL-RECOVERY")
31a60 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 75 6e 69   ||.         uni
31a70 78 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68  xIsLocked(pid, h
31a80 53 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48  Shm, F_RDLCK, SH
31a90 4d 5f 57 52 49 54 45 2c 20 31 2c 20 22 57 41 4c  M_WRITE, 1, "WAL
31aa0 2d 57 52 49 54 45 22 29 20 29 7b 0a 20 20 20 20  -WRITE") ){.    
31ab0 20 20 20 20 6e 4c 6f 63 6b 20 3d 20 31 3b 0a 20      nLock = 1;. 
31ac0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 6f       }.      clo
31ad0 73 65 28 68 53 68 6d 29 3b 0a 20 20 20 20 7d 0a  se(hShm);.    }.
31ae0 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
31af0 65 78 28 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ex();.  }.  if( 
31b00 6e 4c 6f 63 6b 3e 30 20 29 7b 0a 20 20 20 20 2a  nLock>0 ){.    *
31b10 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53 51 4c  pLockstate = SQL
31b20 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4f 4e  ITE_LOCKSTATE_ON
31b30 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
31b40 20 2a 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53   *pLockstate = S
31b50 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f  QLITE_LOCKSTATE_
31b60 4f 46 46 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  OFF;.  }.  retur
31b70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
31b80 23 65 6e 64 69 66 20 2f 2a 20 28 53 51 4c 49 54  #endif /* (SQLIT
31b90 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53  E_ENABLE_APPLE_S
31ba0 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65 64  PI>0) && defined
31bb0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 0a  (__APPLE__) */..
31bc0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
31bd0 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a  MAP_SIZE>0./*.**
31be0 20 49 66 20 69 74 20 69 73 20 63 75 72 72 65 6e   If it is curren
31bf0 74 6c 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  tly memory mappe
31c00 64 2c 20 75 6e 6d 61 70 20 66 69 6c 65 20 70 46  d, unmap file pF
31c10 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
31c20 64 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28  d unixUnmapfile(
31c30 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a  unixFile *pFd){.
31c40 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e    assert( pFd->n
31c50 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20  FetchOut==0 );. 
31c60 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65   if( pFd->pMapRe
31c70 67 69 6f 6e 20 29 7b 0a 20 20 20 20 6f 73 4d 75  gion ){.    osMu
31c80 6e 6d 61 70 28 70 46 64 2d 3e 70 4d 61 70 52 65  nmap(pFd->pMapRe
31c90 67 69 6f 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70 53  gion, pFd->mmapS
31ca0 69 7a 65 41 63 74 75 61 6c 29 3b 0a 20 20 20 20  izeActual);.    
31cb0 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  pFd->pMapRegion 
31cc0 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d  = 0;.    pFd->mm
31cd0 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  apSize = 0;.    
31ce0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  pFd->mmapSizeAct
31cf0 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ual = 0;.  }.}..
31d00 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
31d10 20 73 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66   set the size of
31d20 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70   the memory mapp
31d30 69 6e 67 20 6d 61 69 6e 74 61 69 6e 65 64 20 62  ing maintained b
31d40 79 20 66 69 6c 65 20 0a 2a 2a 20 64 65 73 63 72  y file .** descr
31d50 69 70 74 6f 72 20 70 46 64 20 74 6f 20 6e 4e 65  iptor pFd to nNe
31d60 77 20 62 79 74 65 73 2e 20 41 6e 79 20 65 78 69  w bytes. Any exi
31d70 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73  sting mapping is
31d80 20 64 69 73 63 61 72 64 65 64 2e 0a 2a 2a 0a 2a   discarded..**.*
31d90 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
31da0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
31db0 65 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ets the followin
31dc0 67 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a  g variables:.**.
31dd0 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c  **       unixFil
31de0 65 2e 70 4d 61 70 52 65 67 69 6f 6e 0a 2a 2a 20  e.pMapRegion.** 
31df0 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d        unixFile.m
31e00 6d 61 70 53 69 7a 65 0a 2a 2a 20 20 20 20 20 20  mapSize.**      
31e10 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69   unixFile.mmapSi
31e20 7a 65 41 63 74 75 61 6c 0a 2a 2a 0a 2a 2a 20 49  zeActual.**.** I
31e30 66 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20  f unsuccessful, 
31e40 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
31e50 20 69 73 20 6c 6f 67 67 65 64 20 76 69 61 20 73   is logged via s
31e60 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 61 6e 64  qlite3_log() and
31e70 0a 2a 2a 20 74 68 65 20 74 68 72 65 65 20 76 61  .** the three va
31e80 72 69 61 62 6c 65 73 20 61 62 6f 76 65 20 61 72  riables above ar
31e90 65 20 7a 65 72 6f 65 64 2e 20 49 6e 20 74 68 69  e zeroed. In thi
31ea0 73 20 63 61 73 65 20 53 51 4c 69 74 65 20 73 68  s case SQLite sh
31eb0 6f 75 6c 64 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  ould.** continue
31ec0 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 64   accessing the d
31ed0 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68  atabase using th
31ee0 65 20 78 52 65 61 64 28 29 20 61 6e 64 20 78 57  e xRead() and xW
31ef0 72 69 74 65 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  rite().** method
31f00 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
31f10 64 20 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28  d unixRemapfile(
31f20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  .  unixFile *pFd
31f30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
31f40 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
31f50 69 70 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  iptor object */.
31f60 20 20 69 36 34 20 6e 4e 65 77 20 20 20 20 20 20    i64 nNew      
31f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f80 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6d 61    /* Required ma
31f90 70 70 69 6e 67 20 73 69 7a 65 20 2a 2f 0a 29 7b  pping size */.){
31fa0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
31fb0 45 72 72 20 3d 20 22 6d 6d 61 70 22 3b 0a 20 20  Err = "mmap";.  
31fc0 69 6e 74 20 68 20 3d 20 70 46 64 2d 3e 68 3b 20  int h = pFd->h; 
31fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31fe0 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
31ff0 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20  criptor open on 
32000 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  db file */.  u8 
32010 2a 70 4f 72 69 67 20 3d 20 28 75 38 20 2a 29 70  *pOrig = (u8 *)p
32020 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3b 20  Fd->pMapRegion; 
32030 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
32040 63 75 72 72 65 6e 74 20 66 69 6c 65 20 6d 61 70  current file map
32050 70 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20 6e 4f  ping */.  i64 nO
32060 72 69 67 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53  rig = pFd->mmapS
32070 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20 20 2f  izeActual;     /
32080 2a 20 53 69 7a 65 20 6f 66 20 70 4f 72 69 67 20  * Size of pOrig 
32090 72 65 67 69 6f 6e 20 69 6e 20 62 79 74 65 73 20  region in bytes 
320a0 2a 2f 0a 20 20 75 38 20 2a 70 4e 65 77 20 3d 20  */.  u8 *pNew = 
320b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
320c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
320d0 61 74 69 6f 6e 20 6f 66 20 6e 65 77 20 6d 61 70  ation of new map
320e0 70 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ping */.  int fl
320f0 61 67 73 20 3d 20 50 52 4f 54 5f 52 45 41 44 3b  ags = PROT_READ;
32100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32110 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20  * Flags to pass 
32120 74 6f 20 6d 6d 61 70 28 29 20 2a 2f 0a 0a 20 20  to mmap() */..  
32130 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65  assert( pFd->nFe
32140 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 61  tchOut==0 );.  a
32150 73 73 65 72 74 28 20 6e 4e 65 77 3e 70 46 64 2d  ssert( nNew>pFd-
32160 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20 61  >mmapSize );.  a
32170 73 73 65 72 74 28 20 6e 4e 65 77 3c 3d 70 46 64  ssert( nNew<=pFd
32180 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 3b  ->mmapSizeMax );
32190 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e  .  assert( nNew>
321a0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
321b0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
321c0 61 6c 3e 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  al>=pFd->mmapSiz
321d0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d  e );.  assert( M
321e0 41 50 5f 46 41 49 4c 45 44 21 3d 30 20 29 3b 0a  AP_FAILED!=0 );.
321f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d  .#ifdef SQLITE_M
32200 4d 41 50 5f 52 45 41 44 57 52 49 54 45 0a 20 20  MAP_READWRITE.  
32210 69 66 28 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c  if( (pFd->ctrlFl
32220 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52  ags & UNIXFILE_R
32230 44 4f 4e 4c 59 29 3d 3d 30 20 29 20 66 6c 61 67  DONLY)==0 ) flag
32240 73 20 7c 3d 20 50 52 4f 54 5f 57 52 49 54 45 3b  s |= PROT_WRITE;
32250 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
32260 4f 72 69 67 20 29 7b 0a 23 69 66 20 48 41 56 45  Orig ){.#if HAVE
32270 5f 4d 52 45 4d 41 50 0a 20 20 20 20 69 36 34 20  _MREMAP.    i64 
32280 6e 52 65 75 73 65 20 3d 20 70 46 64 2d 3e 6d 6d  nReuse = pFd->mm
32290 61 70 53 69 7a 65 3b 0a 23 65 6c 73 65 0a 20 20  apSize;.#else.  
322a0 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 7a 53 79    const int szSy
322b0 73 70 61 67 65 20 3d 20 6f 73 47 65 74 70 61 67  spage = osGetpag
322c0 65 73 69 7a 65 28 29 3b 0a 20 20 20 20 69 36 34  esize();.    i64
322d0 20 6e 52 65 75 73 65 20 3d 20 28 70 46 64 2d 3e   nReuse = (pFd->
322e0 6d 6d 61 70 53 69 7a 65 20 26 20 7e 28 73 7a 53  mmapSize & ~(szS
322f0 79 73 70 61 67 65 2d 31 29 29 3b 0a 23 65 6e 64  yspage-1));.#end
32300 69 66 0a 20 20 20 20 75 38 20 2a 70 52 65 71 20  if.    u8 *pReq 
32310 3d 20 26 70 4f 72 69 67 5b 6e 52 65 75 73 65 5d  = &pOrig[nReuse]
32320 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20  ;..    /* Unmap 
32330 61 6e 79 20 70 61 67 65 73 20 6f 66 20 74 68 65  any pages of the
32340 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
32350 67 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 62 65  g that cannot be
32360 20 72 65 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20   reused. */.    
32370 69 66 28 20 6e 52 65 75 73 65 21 3d 6e 4f 72 69  if( nReuse!=nOri
32380 67 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e  g ){.      osMun
32390 6d 61 70 28 70 52 65 71 2c 20 6e 4f 72 69 67 2d  map(pReq, nOrig-
323a0 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a 0a  nReuse);.    }..
323b0 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a  #if HAVE_MREMAP.
323c0 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 72 65      pNew = osMre
323d0 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52 65 75 73  map(pOrig, nReus
323e0 65 2c 20 6e 4e 65 77 2c 20 4d 52 45 4d 41 50 5f  e, nNew, MREMAP_
323f0 4d 41 59 4d 4f 56 45 29 3b 0a 20 20 20 20 7a 45  MAYMOVE);.    zE
32400 72 72 20 3d 20 22 6d 72 65 6d 61 70 22 3b 0a 23  rr = "mremap";.#
32410 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d 20  else.    pNew = 
32420 6f 73 4d 6d 61 70 28 70 52 65 71 2c 20 6e 4e 65  osMmap(pReq, nNe
32430 77 2d 6e 52 65 75 73 65 2c 20 66 6c 61 67 73 2c  w-nReuse, flags,
32440 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c 20   MAP_SHARED, h, 
32450 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 69 66 28  nReuse);.    if(
32460 20 70 4e 65 77 21 3d 4d 41 50 5f 46 41 49 4c 45   pNew!=MAP_FAILE
32470 44 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  D ){.      if( p
32480 4e 65 77 21 3d 70 52 65 71 20 29 7b 0a 20 20 20  New!=pReq ){.   
32490 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4e       osMunmap(pN
324a0 65 77 2c 20 6e 4e 65 77 20 2d 20 6e 52 65 75 73  ew, nNew - nReus
324b0 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  e);.        pNew
324c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
324d0 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  e{.        pNew 
324e0 3d 20 70 4f 72 69 67 3b 0a 20 20 20 20 20 20 7d  = pOrig;.      }
324f0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
32500 20 20 20 2f 2a 20 54 68 65 20 61 74 74 65 6d 70     /* The attemp
32510 74 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20  t to extend the 
32520 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67  existing mapping
32530 20 66 61 69 6c 65 64 2e 20 46 72 65 65 20 69 74   failed. Free it
32540 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4e 65  . */.    if( pNe
32550 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 7c 7c  w==MAP_FAILED ||
32560 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
32570 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4f 72 69 67    osMunmap(pOrig
32580 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 7d  , nReuse);.    }
32590 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4e  .  }..  /* If pN
325a0 65 77 20 69 73 20 73 74 69 6c 6c 20 4e 55 4c 4c  ew is still NULL
325b0 2c 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20  , try to create 
325c0 61 6e 20 65 6e 74 69 72 65 6c 79 20 6e 65 77 20  an entirely new 
325d0 6d 61 70 70 69 6e 67 2e 20 2a 2f 0a 20 20 69 66  mapping. */.  if
325e0 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
325f0 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28 30   pNew = osMmap(0
32600 2c 20 6e 4e 65 77 2c 20 66 6c 61 67 73 2c 20 4d  , nNew, flags, M
32610 41 50 5f 53 48 41 52 45 44 2c 20 68 2c 20 30 29  AP_SHARED, h, 0)
32620 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 65  ;.  }..  if( pNe
32630 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b  w==MAP_FAILED ){
32640 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20  .    pNew = 0;. 
32650 20 20 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 20     nNew = 0;.   
32660 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
32670 4c 49 54 45 5f 4f 4b 2c 20 7a 45 72 72 2c 20 70  LITE_OK, zErr, p
32680 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 0a 20 20 20  Fd->zPath);..   
32690 20 2f 2a 20 49 66 20 74 68 65 20 6d 6d 61 70 28   /* If the mmap(
326a0 29 20 61 62 6f 76 65 20 66 61 69 6c 65 64 2c 20  ) above failed, 
326b0 61 73 73 75 6d 65 20 74 68 61 74 20 61 6c 6c 20  assume that all 
326c0 73 75 62 73 65 71 75 65 6e 74 20 6d 6d 61 70 28  subsequent mmap(
326d0 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20 77  ) calls.    ** w
326e0 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 66 61 69  ill probably fai
326f0 6c 20 74 6f 6f 2e 20 46 61 6c 6c 20 62 61 63 6b  l too. Fall back
32700 20 74 6f 20 75 73 69 6e 67 20 78 52 65 61 64 2f   to using xRead/
32710 78 57 72 69 74 65 20 65 78 63 6c 75 73 69 76 65  xWrite exclusive
32720 6c 79 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69  ly.    ** in thi
32730 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
32740 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
32750 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 46 64 2d   = 0;.  }.  pFd-
32760 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 28 76  >pMapRegion = (v
32770 6f 69 64 20 2a 29 70 4e 65 77 3b 0a 20 20 70 46  oid *)pNew;.  pF
32780 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 70 46  d->mmapSize = pF
32790 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d->mmapSizeActua
327a0 6c 20 3d 20 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  l = nNew;.}../*.
327b0 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72  ** Memory map or
327c0 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20   remap the file 
327d0 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64  opened by file-d
327e0 65 73 63 72 69 70 74 6f 72 20 70 46 64 20 28 69  escriptor pFd (i
327f0 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73  f the file.** is
32800 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c   already mapped,
32810 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61   the existing ma
32820 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65  pping is replace
32830 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f  d by the new). O
32840 72 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65 20  r, if .** there 
32850 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
32860 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68 69   mapping for thi
32870 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72  s file, and ther
32880 65 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a 20  e are still .** 
32890 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74  outstanding xFet
328a0 63 68 28 29 20 72 65 66 65 72 65 6e 63 65 73 20  ch() references 
328b0 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63  to it, this func
328c0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
328d0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
328e0 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e  ter nByte is non
328f0 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20  -negative, then 
32900 69 74 20 69 73 20 74 68 65 20 72 65 71 75 65 73  it is the reques
32910 74 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a 20  ted size of .** 
32920 74 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63  the mapping to c
32930 72 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  reate. Otherwise
32940 2c 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65  , if nByte is le
32950 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
32960 65 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65  en the .** reque
32970 73 74 65 64 20 73 69 7a 65 20 69 73 20 74 68 65  sted size is the
32980 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
32990 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61  e on disk. The a
329a0 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  ctual size of th
329b0 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70  e.** created map
329c0 70 69 6e 67 20 69 73 20 65 69 74 68 65 72 20 74  ping is either t
329d0 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a  he requested siz
329e0 65 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63  e or the value c
329f0 6f 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20 75 73  onfigured .** us
32a00 69 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ing SQLITE_FCNTL
32a10 5f 4d 4d 41 50 5f 4c 49 4d 49 54 2c 20 77 68 69  _MMAP_LIMIT, whi
32a20 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c 65  chever is smalle
32a30 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  r..**.** SQLITE_
32a40 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
32a50 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
32a60 73 20 28 65 76 65 6e 20 69 66 20 74 68 65 20 6d  s (even if the m
32a70 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a  apping is not.**
32a80 20 72 65 63 72 65 61 74 65 64 20 61 73 20 61 20   recreated as a 
32a90 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74 61  result of outsta
32aa0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
32ab0 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  ) or an SQLite e
32ac0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68  rror.** code oth
32ad0 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
32ae0 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c  c int unixMapfil
32af0 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c  e(unixFile *pFd,
32b00 20 69 36 34 20 6e 4d 61 70 29 7b 0a 20 20 61 73   i64 nMap){.  as
32b10 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c  sert( nMap>=0 ||
32b20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d   pFd->nFetchOut=
32b30 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
32b40 6e 4d 61 70 3e 30 20 7c 7c 20 28 70 46 64 2d 3e  nMap>0 || (pFd->
32b50 6d 6d 61 70 53 69 7a 65 3d 3d 30 20 26 26 20 70  mmapSize==0 && p
32b60 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d  Fd->pMapRegion==
32b70 30 29 20 29 3b 0a 20 20 69 66 28 20 70 46 64 2d  0) );.  if( pFd-
32b80 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72  >nFetchOut>0 ) r
32b90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
32ba0 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29  ..  if( nMap<0 )
32bb0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
32bc0 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20  t statbuf;      
32bd0 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c      /* Low-level
32be0 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f   file informatio
32bf0 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46  n */.    if( osF
32c00 73 74 61 74 28 70 46 64 2d 3e 68 2c 20 26 73 74  stat(pFd->h, &st
32c10 61 74 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20  atbuf) ){.      
32c20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
32c30 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d  ERR_FSTAT;.    }
32c40 0a 20 20 20 20 6e 4d 61 70 20 3d 20 73 74 61 74  .    nMap = stat
32c50 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 7d  buf.st_size;.  }
32c60 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d  .  if( nMap>pFd-
32c70 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a  >mmapSizeMax ){.
32c80 20 20 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e      nMap = pFd->
32c90 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d  mmapSizeMax;.  }
32ca0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70  ..  assert( nMap
32cb0 3e 30 20 7c 7c 20 28 70 46 64 2d 3e 6d 6d 61 70  >0 || (pFd->mmap
32cc0 53 69 7a 65 3d 3d 30 20 26 26 20 70 46 64 2d 3e  Size==0 && pFd->
32cd0 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 29 20 29  pMapRegion==0) )
32ce0 3b 0a 20 20 69 66 28 20 6e 4d 61 70 21 3d 70 46  ;.  if( nMap!=pF
32cf0 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  d->mmapSize ){. 
32d00 20 20 20 75 6e 69 78 52 65 6d 61 70 66 69 6c 65     unixRemapfile
32d10 28 70 46 64 2c 20 6e 4d 61 70 29 3b 0a 20 20 7d  (pFd, nMap);.  }
32d20 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
32d30 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
32d40 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  * SQLITE_MAX_MMA
32d50 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a  P_SIZE>0 */../*.
32d60 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  ** If possible, 
32d70 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
32d80 20 74 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f 66   to a mapping of
32d90 20 66 69 6c 65 20 66 64 20 73 74 61 72 74 69 6e   file fd startin
32da0 67 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69  g at offset.** i
32db0 4f 66 66 2e 20 54 68 65 20 6d 61 70 70 69 6e 67  Off. The mapping
32dc0 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 20 66   must be valid f
32dd0 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 41 6d 74  or at least nAmt
32de0 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   bytes..**.** If
32df0 20 73 75 63 68 20 61 20 70 6f 69 6e 74 65 72 20   such a pointer 
32e00 63 61 6e 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  can be obtained,
32e10 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 70 70   store it in *pp
32e20 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
32e30 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66  TE_OK..** Or, if
32e40 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 75 74 20   one cannot but 
32e50 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
32e60 20 73 65 74 20 2a 70 70 20 74 6f 20 30 20 61 6e   set *pp to 0 an
32e70 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
32e80 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20  OK..** Finally, 
32e90 69 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73  if an error does
32ea0 20 6f 63 63 75 72 2c 20 72 65 74 75 72 6e 20 61   occur, return a
32eb0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
32ec0 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a  ode. The final.*
32ed0 2a 20 76 61 6c 75 65 20 6f 66 20 2a 70 70 20 69  * value of *pp i
32ee0 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74  s undefined in t
32ef0 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
32f00 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  If this function
32f10 20 64 6f 65 73 20 72 65 74 75 72 6e 20 61 20 70   does return a p
32f20 6f 69 6e 74 65 72 2c 20 74 68 65 20 63 61 6c 6c  ointer, the call
32f30 65 72 20 6d 75 73 74 20 65 76 65 6e 74 75 61 6c  er must eventual
32f40 6c 79 20 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74  ly .** release t
32f50 68 65 20 72 65 66 65 72 65 6e 63 65 20 62 79 20  he reference by 
32f60 63 61 6c 6c 69 6e 67 20 75 6e 69 78 55 6e 66 65  calling unixUnfe
32f70 74 63 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  tch()..*/.static
32f80 20 69 6e 74 20 75 6e 69 78 46 65 74 63 68 28 73   int unixFetch(s
32f90 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
32fa0 20 69 36 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e   i64 iOff, int n
32fb0 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b  Amt, void **pp){
32fc0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
32fd0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e  MMAP_SIZE>0.  un
32fe0 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75  ixFile *pFd = (u
32ff0 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20 20  nixFile *)fd;   
33000 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
33010 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
33020 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 20  */.#endif.  *pp 
33030 3d 20 30 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  = 0;..#if SQLITE
33040 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
33050 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70  .  if( pFd->mmap
33060 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a 20 20 20  SizeMax>0 ){.   
33070 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65   if( pFd->pMapRe
33080 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  gion==0 ){.     
33090 20 69 6e 74 20 72 63 20 3d 20 75 6e 69 78 4d 61   int rc = unixMa
330a0 70 66 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b 0a  pfile(pFd, -1);.
330b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
330c0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
330d0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
330e0 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  f( pFd->mmapSize
330f0 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b   >= iOff+nAmt ){
33100 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 26 28 28  .      *pp = &((
33110 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65  u8 *)pFd->pMapRe
33120 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20  gion)[iOff];.   
33130 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75     pFd->nFetchOu
33140 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  t++;.    }.  }.#
33150 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
33160 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
33170 2a 2a 20 49 66 20 74 68 65 20 74 68 69 72 64 20  ** If the third 
33180 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d  argument is non-
33190 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20  NULL, then this 
331a0 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65 61 73 65  function release
331b0 73 20 61 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63  s a .** referenc
331c0 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20 61 6e  e obtained by an
331d0 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f   earlier call to
331e0 20 75 6e 69 78 46 65 74 63 68 28 29 2e 20 54 68   unixFetch(). Th
331f0 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75  e second.** argu
33200 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
33210 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  his function mus
33220 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
33230 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
33240 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74  ng.** argument t
33250 68 61 74 20 77 61 73 20 70 61 73 73 65 64 20 74  hat was passed t
33260 6f 20 74 68 65 20 75 6e 69 78 46 65 74 63 68 28  o the unixFetch(
33270 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a  ) invocation. .*
33280 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20  *.** Or, if the 
33290 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69  third argument i
332a0 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69  s NULL, then thi
332b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65  s function is be
332c0 69 6e 67 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 74  ing called .** t
332d0 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20 56 46 53  o inform the VFS
332e0 20 6c 61 79 65 72 20 74 68 61 74 2c 20 61 63 63   layer that, acc
332f0 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53 49 58 2c  ording to POSIX,
33300 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61   any existing ma
33310 70 70 69 6e 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f  pping .** may no
33320 77 20 62 65 20 69 6e 76 61 6c 69 64 20 61 6e 64  w be invalid and
33330 20 73 68 6f 75 6c 64 20 62 65 20 75 6e 6d 61 70   should be unmap
33340 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ped..*/.static i
33350 6e 74 20 75 6e 69 78 55 6e 66 65 74 63 68 28 73  nt unixUnfetch(s
33360 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
33370 20 69 36 34 20 69 4f 66 66 2c 20 76 6f 69 64 20   i64 iOff, void 
33380 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  *p){.#if SQLITE_
33390 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
333a0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20    unixFile *pFd 
333b0 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 66 64  = (unixFile *)fd
333c0 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  ;   /* The under
333d0 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
333e0 69 6c 65 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f  ile */.  UNUSED_
333f0 50 41 52 41 4d 45 54 45 52 28 69 4f 66 66 29 3b  PARAMETER(iOff);
33400 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d 30 20 28  ..  /* If p==0 (
33410 75 6e 6d 61 70 20 74 68 65 20 65 6e 74 69 72 65  unmap the entire
33420 20 66 69 6c 65 29 20 74 68 65 6e 20 74 68 65 72   file) then ther
33430 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 6f 75 74  e must be no out
33440 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 78  standing .  ** x
33450 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65 73  Fetch references
33460 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30 20 28 6d  . Or, if p!=0 (m
33470 65 61 6e 69 6e 67 20 69 74 20 69 73 20 61 6e 20  eaning it is an 
33480 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65  xFetch reference
33490 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  ),.  ** then the
334a0 72 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  re must be at le
334b0 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64  ast one outstand
334c0 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ing.  */.  asser
334d0 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d  t( (p==0)==(pFd-
334e0 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 29 20 29  >nFetchOut==0) )
334f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c  ;..  /* If p!=0,
33500 20 69 74 20 6d 75 73 74 20 6d 61 74 63 68 20 74   it must match t
33510 68 65 20 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a  he iOff value. *
33520 2f 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  /.  assert( p==0
33530 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20 2a 29 70   || p==&((u8 *)p
33540 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b  Fd->pMapRegion)[
33550 69 4f 66 66 5d 20 29 3b 0a 0a 20 20 69 66 28 20  iOff] );..  if( 
33560 70 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e 6e 46  p ){.    pFd->nF
33570 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c  etchOut--;.  }el
33580 73 65 7b 0a 20 20 20 20 75 6e 69 78 55 6e 6d 61  se{.    unixUnma
33590 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a  pfile(pFd);.  }.
335a0 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e  .  assert( pFd->
335b0 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20 29 3b 0a  nFetchOut>=0 );.
335c0 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
335d0 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20  ARAMETER(fd);.  
335e0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
335f0 28 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  (p);.  UNUSED_PA
33600 52 41 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a 23  RAMETER(iOff);.#
33610 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
33620 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
33630 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68 65  ** Here ends the
33640 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
33650 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66  of all sqlite3_f
33660 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a  ile methods..**.
33670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33680 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74  ****** End sqlit
33690 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20  e3_file Methods 
336a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
336b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
336c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
336d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
336e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
336f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
33710 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69  ./*.** This divi
33720 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65  sion contains de
33730 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c  finitions of sql
33740 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
33750 6f 62 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a 20  objects that.** 
33760 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75  implement variou
33770 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73  s file locking s
33780 74 72 61 74 65 67 69 65 73 2e 20 20 49 74 20 61  trategies.  It a
33790 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65 66  lso contains def
337a0 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22  initions.** of "
337b0 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e  finder" function
337c0 73 2e 20 20 41 20 66 69 6e 64 65 72 2d 66 75 6e  s.  A finder-fun
337d0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
337e0 20 6c 6f 63 61 74 65 20 74 68 65 20 61 70 70 72   locate the appr
337f0 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74  opriate.** sqlit
33800 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
33810 6a 65 63 74 20 66 6f 72 20 61 20 70 61 72 74 69  ject for a parti
33820 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 66  cular database f
33830 69 6c 65 2e 20 20 54 68 65 20 70 41 70 70 44 61  ile.  The pAppDa
33840 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74  ta.** field of t
33850 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 20 56  he sqlite3_vfs V
33860 46 53 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69  FS objects are i
33870 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 62 65  nitialized to be
33880 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20   pointers to.** 
33890 74 68 65 20 63 6f 72 72 65 63 74 20 66 69 6e 64  the correct find
338a0 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er-function for 
338b0 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20  that VFS..**.** 
338c0 4d 6f 73 74 20 66 69 6e 64 65 72 20 66 75 6e 63  Most finder func
338d0 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 61 20 70  tions return a p
338e0 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65  ointer to a fixe
338f0 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  d sqlite3_io_met
33900 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20  hods.** object. 
33910 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65   The only intere
33920 73 74 69 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e  sting finder-fun
33930 63 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63  ction is autoloc
33940 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68 69 63 68  kIoFinder, which
33950 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65  .** looks at the
33960 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65   filesystem type
33970 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20 67 75   and tries to gu
33980 65 73 73 20 74 68 65 20 62 65 73 74 20 6c 6f 63  ess the best loc
33990 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67 79  king.** strategy
339a0 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a   from that..**.*
339b0 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e  * For finder-fun
339c0 63 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a  ction F, two obj
339d0 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64  ects are created
339e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54  :.**.**    (1) T
339f0 68 65 20 72 65 61 6c 20 66 69 6e 64 65 72 2d 66  he real finder-f
33a00 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46  unction named "F
33a10 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20  Impt()"..**.**  
33a20 20 20 28 32 29 20 41 20 63 6f 6e 73 74 61 6e 74    (2) A constant
33a30 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
33a40 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20   function named 
33a50 6a 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a  just "F"..**.**.
33a60 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** A pointer to 
33a70 74 68 65 20 46 20 70 6f 69 6e 74 65 72 20 69 73  the F pointer is
33a80 20 75 73 65 64 20 61 73 20 74 68 65 20 70 41 70   used as the pAp
33a90 70 44 61 74 61 20 76 61 6c 75 65 20 66 6f 72 20  pData value for 
33aa0 56 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20  VFS.** objects. 
33ab0 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 74   We have to do t
33ac0 68 69 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6c  his instead of l
33ad0 65 74 74 69 6e 67 20 70 41 70 70 44 61 74 61 20  etting pAppData 
33ae0 70 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c  point.** directl
33af0 79 20 61 74 20 74 68 65 20 66 69 6e 64 65 72 2d  y at the finder-
33b00 66 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20 43  function since C
33b10 39 30 20 72 75 6c 65 73 20 70 72 65 76 65 6e 74  90 rules prevent
33b20 20 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d   a void*.** from
33b30 20 62 65 20 63 61 73 74 20 69 6e 74 6f 20 61 20   be cast into a 
33b40 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  function pointer
33b50 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ..**.**.** Each 
33b60 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
33b70 20 6d 61 63 72 6f 20 67 65 6e 65 72 61 74 65 73   macro generates
33b80 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a   two objects:.**
33b90 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73 74  .**   *  A const
33ba0 61 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  ant sqlite3_io_m
33bb0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 63 61  ethods object ca
33bc0 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61 74 20 68  ll METHOD that h
33bd0 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20  as locking.**   
33be0 20 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45     methods CLOSE
33bf0 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20  , LOCK, UNLOCK, 
33c00 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  CKRESLOCK..**.**
33c10 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74     *  An I/O met
33c20 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74  hod finder funct
33c30 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44 45  ion called FINDE
33c40 52 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 61  R that returns a
33c50 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20   pointer.**     
33c60 20 74 6f 20 74 68 65 20 4d 45 54 48 4f 44 20 6f   to the METHOD o
33c70 62 6a 65 63 74 20 69 6e 20 74 68 65 20 70 72 65  bject in the pre
33c80 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f  vious bullet..*/
33c90 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f  .#define IOMETHO
33ca0 44 53 28 46 49 4e 44 45 52 2c 4d 45 54 48 4f 44  DS(FINDER,METHOD
33cb0 2c 56 45 52 53 49 4f 4e 2c 43 4c 4f 53 45 2c 4c  ,VERSION,CLOSE,L
33cc0 4f 43 4b 2c 55 4e 4c 4f 43 4b 2c 43 4b 4c 4f 43  OCK,UNLOCK,CKLOC
33cd0 4b 2c 53 48 4d 4d 41 50 29 20 20 20 20 20 5c 0a  K,SHMMAP)     \.
33ce0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
33cf0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
33d00 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20 20 20 20  METHOD = {      
33d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
33d30 20 20 56 45 52 53 49 4f 4e 2c 20 20 20 20 20 20    VERSION,      
33d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33d50 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20   iVersion */    
33d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d70 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
33d80 20 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20   CLOSE,         
33d90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33da0 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20  xClose */       
33db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33dc0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
33dd0 75 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20 20  unixRead,       
33de0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
33df0 52 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20 20  Read */         
33e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e10 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
33e20 6e 69 78 57 72 69 74 65 2c 20 20 20 20 20 20 20  nixWrite,       
33e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57             /* xW
33e40 72 69 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20  rite */         
33e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e60 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
33e70 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20  ixTruncate,     
33e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72            /* xTr
33e90 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20 20  uncate */       
33ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33eb0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
33ec0 78 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20  xSync,          
33ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e           /* xSyn
33ee0 63 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  c */            
33ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f00 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
33f10 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20  FileSize,       
33f20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
33f30 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20  Size */         
33f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f50 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c        \.   LOCK,
33f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f70 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
33f80 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
33f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33fa0 20 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b       \.   UNLOCK
33fb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
33fc0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
33fd0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
33fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33ff0 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c      \.   CKLOCK,
34000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34010 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
34020 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20  servedLock */   
34030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34040 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65     \.   unixFile
34050 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20  Control,        
34060 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74      /* xFileCont
34070 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20  rol */          
34080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34090 20 20 5c 0a 20 20 20 75 6e 69 78 53 65 63 74 6f    \.   unixSecto
340a0 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  rSize,          
340b0 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a     /* xSectorSiz
340c0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
340d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
340e0 20 5c 0a 20 20 20 75 6e 69 78 44 65 76 69 63 65   \.   unixDevice
340f0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2c  Characteristics,
34100 20 20 2f 2a 20 78 44 65 76 69 63 65 43 61 70 61    /* xDeviceCapa
34110 62 69 6c 69 74 69 65 73 20 2a 2f 20 20 20 20 20  bilities */     
34120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34130 5c 0a 20 20 20 53 48 4d 4d 41 50 2c 20 20 20 20  \.   SHMMAP,    
34140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34150 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 20 20   /* xShmMap */  
34160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
34180 0a 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c  .   unixShmLock,
34190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
341a0 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20  /* xShmLock */  
341b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
341c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
341d0 20 20 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65     unixShmBarrie
341e0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
341f0 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f  * xShmBarrier */
34200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34210 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
34220 20 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 2c 20    unixShmUnmap, 
34230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34240 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 20 20 20   xShmUnmap */   
34250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34260 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
34270 20 75 6e 69 78 46 65 74 63 68 2c 20 20 20 20 20   unixFetch,     
34280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34290 78 46 65 74 63 68 20 2a 2f 20 20 20 20 20 20 20  xFetch */       
342a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
342b0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
342c0 75 6e 69 78 55 6e 66 65 74 63 68 2c 20 20 20 20  unixUnfetch,    
342d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
342e0 55 6e 66 65 74 63 68 20 2a 2f 20 20 20 20 20 20  Unfetch */      
342f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34300 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20 20            \.};  
34310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34350 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69           \.stati
34360 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
34370 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44  io_methods *FIND
34380 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63  ER##Impl(const c
34390 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c 65  har *z, unixFile
343a0 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55 53   *p){   \.  UNUS
343b0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 29 3b  ED_PARAMETER(z);
343c0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
343d0 52 28 70 29 3b 20 20 20 20 20 20 20 20 20 20 20  R(p);           
343e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
343f0 20 20 20 20 20 20 20 5c 0a 20 20 72 65 74 75 72         \.  retur
34400 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20 20 20 20  n &METHOD;      
34410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34440 20 20 20 20 20 20 5c 0a 7d 20 20 20 20 20 20 20        \.}       
34450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34490 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f       \.static co
344a0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
344b0 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20  ethods *(*const 
344c0 46 49 4e 44 45 52 29 28 63 6f 6e 73 74 20 63 68  FINDER)(const ch
344d0 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29  ar*,unixFile *p)
344e0 20 20 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44      \.    = FIND
344f0 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a  ER##Impl;../*.**
34500 20 48 65 72 65 20 61 72 65 20 61 6c 6c 20 6f 66   Here are all of
34510 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
34520 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20  methods objects 
34530 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a  for each of the.
34540 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  ** locking strat
34550 65 67 69 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e  egies.  Function
34560 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 70 6f  s that return po
34570 69 6e 74 65 72 73 20 74 6f 20 74 68 65 73 65 20  inters to these 
34580 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61  methods.** are a
34590 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a  lso created..*/.
345a0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f 73  IOMETHODS(.  pos
345b0 69 78 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ixIoFinder,     
345c0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
345d0 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
345e0 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f  /.  posixIoMetho
345f0 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ds,           /*
34600 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
34610 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
34620 2a 2f 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20  */.  3,         
34630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34640 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
34650 61 6e 64 20 6d 6d 61 70 20 61 72 65 20 65 6e 61  and mmap are ena
34660 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c  bled */.  unixCl
34670 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
34680 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
34690 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f  thod */.  unixLo
346a0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
346b0 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
346c0 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c  hod */.  unixUnl
346d0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
346e0 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
346f0 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68  thod */.  unixCh
34700 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
34710 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
34720 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
34730 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4d 61 70   */.  unixShmMap
34740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34750 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f  /* xShmMap metho
34760 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53  d */.).IOMETHODS
34770 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64  (.  nolockIoFind
34780 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er,           /*
34790 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
347a0 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63   name */.  noloc
347b0 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  kIoMethods,     
347c0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
347d0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
347e0 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20  t name */.  3,  
347f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34800 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
34810 6d 65 6d 6f 72 79 20 61 6e 64 20 6d 6d 61 70 20  memory and mmap 
34820 61 72 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  are enabled */. 
34830 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20   nolockClose,   
34840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
34850 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
34860 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20   nolockLock,    
34870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
34880 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
34890 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20  nolockUnlock,   
348a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
348b0 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
348c0 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65   nolockCheckRese
348d0 72 76 65 64 4c 6f 63 6b 2c 20 20 2f 2a 20 78 43  rvedLock,  /* xC
348e0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
348f0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20   method */.  0  
34900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34910 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
34920 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f  p method */.).IO
34930 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f  METHODS(.  dotlo
34940 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ckIoFinder,     
34950 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
34960 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
34970 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f    dotlockIoMetho
34980 64 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ds,         /* s
34990 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
349a0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
349b0 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
349c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
349d0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
349e0 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64   disabled */.  d
349f0 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20  otlockClose,    
34a00 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
34a10 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64  se method */.  d
34a20 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20  otlockLock,     
34a30 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
34a40 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  k method */.  do
34a50 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20  tlockUnlock,    
34a60 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
34a70 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64  ck method */.  d
34a80 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  otlockCheckReser
34a90 76 65 64 4c 6f 63 6b 2c 20 2f 2a 20 78 43 68 65  vedLock, /* xChe
34aa0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
34ab0 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20  ethod */.  0    
34ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34ad0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
34ae0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66  method */.)..#if
34af0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
34b00 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d  OCKING_STYLE.IOM
34b10 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49  ETHODS(.  flockI
34b20 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
34b30 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
34b40 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
34b50 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c   flockIoMethods,
34b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
34b70 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
34b80 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
34b90 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
34ba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
34bb0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
34bc0 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c  disabled */.  fl
34bd0 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  ockClose,       
34be0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
34bf0 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c  e method */.  fl
34c00 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ockLock,        
34c10 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
34c20 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
34c30 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ckUnlock,       
34c40 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
34c50 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c  k method */.  fl
34c60 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
34c70 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78 43 68 65 63  Lock,   /* xChec
34c80 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
34c90 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20  thod */.  0     
34ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34cb0 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d      /* xShmMap m
34cc0 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
34cd0 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  f..#if OS_VXWORK
34ce0 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73  S.IOMETHODS(.  s
34cf0 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  emIoFinder,     
34d00 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
34d10 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
34d20 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f   */.  semIoMetho
34d30 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ds,             
34d40 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
34d50 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
34d60 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
34d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d80 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
34d90 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
34da0 0a 20 20 73 65 6d 58 43 6c 6f 73 65 2c 20 20 20  .  semXClose,   
34db0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34dc0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
34dd0 0a 20 20 73 65 6d 58 4c 6f 63 6b 2c 20 20 20 20  .  semXLock,    
34de0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34df0 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
34e00 20 20 73 65 6d 58 55 6e 6c 6f 63 6b 2c 20 20 20    semXUnlock,   
34e10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
34e20 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
34e30 0a 20 20 73 65 6d 58 43 68 65 63 6b 52 65 73 65  .  semXCheckRese
34e40 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20  rvedLock,    /* 
34e50 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
34e60 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30  ck method */.  0
34e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34e80 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
34e90 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  Map method */.).
34ea0 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
34eb0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
34ec0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
34ed0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f  LOCKING_STYLE.IO
34ee0 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70 49 6f  METHODS(.  afpIo
34ef0 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
34f00 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
34f10 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
34f20 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20    afpIoMethods, 
34f30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
34f40 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
34f50 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
34f60 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
34f70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34f80 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
34f90 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61   disabled */.  a
34fa0 66 70 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  fpClose,        
34fb0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
34fc0 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61  se method */.  a
34fd0 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  fpLock,         
34fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
34ff0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66  k method */.  af
35000 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  pUnlock,        
35010 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
35020 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61  ck method */.  a
35030 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  fpCheckReservedL
35040 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68 65  ock,     /* xChe
35050 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
35060 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20  ethod */.  0    
35070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35080 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
35090 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
350a0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72  if../*.** The pr
350b0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  oxy locking meth
350c0 6f 64 20 69 73 20 61 20 22 73 75 70 65 72 2d 6d  od is a "super-m
350d0 65 74 68 6f 64 22 20 69 6e 20 74 68 65 20 73 65  ethod" in the se
350e0 6e 73 65 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f  nse that it.** o
350f0 70 65 6e 73 20 73 65 63 6f 6e 64 61 72 79 20 66  pens secondary f
35100 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
35110 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 61 6e  for the conch an
35120 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64  d lock files and
35130 0a 2a 2a 20 69 74 20 75 73 65 73 20 70 72 6f 78  .** it uses prox
35140 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50  y, dot-file, AFP
35150 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f  , and flock() lo
35160 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e  cking methods on
35170 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64   those.** second
35180 61 72 79 20 66 69 6c 65 73 2e 20 20 46 6f 72 20  ary files.  For 
35190 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65  this reason, the
351a0 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69   division that i
351b0 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f  mplements.** pro
351c0 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f  xy locking is lo
351d0 63 61 74 65 64 20 6d 75 63 68 20 66 75 72 74 68  cated much furth
351e0 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 66  er down in the f
351f0 69 6c 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65  ile.  But we nee
35200 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61 64  d.** to go ahead
35210 20 61 6e 64 20 64 65 66 69 6e 65 20 74 68 65 20   and define the 
35220 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
35230 64 73 20 61 6e 64 20 66 69 6e 64 65 72 20 66 75  ds and finder fu
35240 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72  nction.** for pr
35250 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65  oxy locking here
35260 2e 20 20 53 6f 20 77 65 20 66 6f 72 77 61 72 64  .  So we forward
35270 20 64 65 63 6c 61 72 65 20 74 68 65 20 49 2f 4f   declare the I/O
35280 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66   methods..*/.#if
35290 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
352a0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
352b0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
352c0 4c 45 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  LE.static int pr
352d0 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  oxyClose(sqlite3
352e0 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20  _file*);.static 
352f0 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71  int proxyLock(sq
35300 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
35310 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
35320 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  oxyUnlock(sqlite
35330 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73  3_file*, int);.s
35340 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
35350 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
35360 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
35370 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53  int*);.IOMETHODS
35380 28 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65  (.  proxyIoFinde
35390 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
353a0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
353b0 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79   name */.  proxy
353c0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
353d0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
353e0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
353f0 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c 20 20  t name */.  2,  
35400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35410 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
35420 6d 65 6d 6f 72 79 20 69 73 20 65 6e 61 62 6c 65  memory is enable
35430 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73  d */.  proxyClos
35440 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
35450 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
35460 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  d */.  proxyLock
35470 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
35480 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
35490 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63   */.  proxyUnloc
354a0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
354b0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
354c0 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65 63  d */.  proxyChec
354d0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
354e0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
354f0 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
35500 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  .  0            
35510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35520 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
35530 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e  /.).#endif../* n
35540 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20  fs lockd on OSX 
35550 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c  10.3+ doesn't cl
35560 65 61 72 20 77 72 69 74 65 20 6c 6f 63 6b 73 20  ear write locks 
35570 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b  when a read lock
35580 20 69 73 20 73 65 74 20 2a 2f 0a 23 69 66 20 64   is set */.#if d
35590 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
355a0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
355b0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
355c0 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66  .IOMETHODS(.  nf
355d0 73 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  sIoFinder,      
355e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
355f0 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
35600 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f   */.  nfsIoMetho
35610 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ds,             
35620 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
35630 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
35640 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
35650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35660 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
35670 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
35680 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20  */.  unixClose, 
35690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
356a0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
356b0 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20   */.  unixLock, 
356c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
356d0 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
356e0 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c   */.  nfsUnlock,
356f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35700 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
35710 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63  od */.  unixChec
35720 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
35730 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
35740 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
35750 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
35760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35770 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f  /* xShmMap metho
35780 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23  d */.).#endif..#
35790 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
357a0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
357b0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
357c0 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  TYLE./* .** This
357d0 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69   "finder" functi
357e0 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64  on attempts to d
357f0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73  etermine the bes
35800 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65  t locking strate
35810 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64  gy .** for the d
35820 61 74 61 62 61 73 65 20 66 69 6c 65 20 22 66 69  atabase file "fi
35830 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74 68 65  lePath".  It the
35840 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 71  n returns the sq
35850 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
35860 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20  .** object that 
35870 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20  implements that 
35880 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20  strategy..**.** 
35890 54 68 69 73 20 69 73 20 66 6f 72 20 4d 61 63 4f  This is for MacO
358a0 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74  SX only..*/.stat
358b0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
358c0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74  _io_methods *aut
358d0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70  olockIoFinderImp
358e0 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l(.  const char 
358f0 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a  *filePath,    /*
35900 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
35910 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
35920 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20  unixFile *pNew  
35930 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e           /* open
35940 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72   file object for
35950 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35960 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69  le */.){.  stati
35970 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 4d  c const struct M
35980 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e  apping {.    con
35990 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 73 79  st char *zFilesy
359a0 73 74 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  stem;           
359b0 20 20 20 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d     /* Filesystem
359c0 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   type name */.  
359d0 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
359e0 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74  io_methods *pMet
359f0 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f  hods;   /* Appro
35a00 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d  priate locking m
35a10 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61  ethod */.  } aMa
35a20 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68  p[] = {.    { "h
35a30 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f  fs",    &posixIo
35a40 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
35a50 20 22 75 66 73 22 2c 20 20 20 20 26 70 6f 73 69   "ufs",    &posi
35a60 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  xIoMethods },.  
35a70 20 20 7b 20 22 61 66 70 66 73 22 2c 20 20 26 61    { "afpfs",  &a
35a80 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  fpIoMethods },. 
35a90 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20 20 26     { "smbfs",  &
35aa0 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  afpIoMethods },.
35ab0 20 20 20 20 7b 20 22 77 65 62 64 61 76 22 2c 20      { "webdav", 
35ac0 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
35ad0 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d   },.    { 0, 0 }
35ae0 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
35af0 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66   struct statfs f
35b00 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  sInfo;.  struct 
35b10 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a  flock lockInfo;.
35b20 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61 74 68  .  if( !filePath
35b30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69   ){.    /* If fi
35b40 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61  lePath==NULL tha
35b50 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64  t means we are d
35b60 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72  ealing with a tr
35b70 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20  ansient file.   
35b80 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f   ** that does no
35b90 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63  t need to be loc
35ba0 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ked. */.    retu
35bb0 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  rn &nolockIoMeth
35bc0 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  ods;.  }.  if( s
35bd0 74 61 74 66 73 28 66 69 6c 65 50 61 74 68 2c 20  tatfs(filePath, 
35be0 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29  &fsInfo) != -1 )
35bf0 7b 0a 20 20 20 20 69 66 28 20 66 73 49 6e 66 6f  {.    if( fsInfo
35c00 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52  .f_flags & MNT_R
35c10 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 72  DONLY ){.      r
35c20 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  eturn &nolockIoM
35c30 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20  ethods;.    }.  
35c40 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b    for(i=0; aMap[
35c50 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20  i].zFilesystem; 
35c60 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
35c70 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
35c80 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70  fstypename, aMap
35c90 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29  [i].zFilesystem)
35ca0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
35cb0 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d  eturn aMap[i].pM
35cc0 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a  ethods;.      }.
35cd0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
35ce0 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20 48 61  Default case. Ha
35cf0 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f  ndles, amongst o
35d00 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20  thers, "nfs"..  
35d10 2a 2a 20 54 65 73 74 20 62 79 74 65 2d 72 61 6e  ** Test byte-ran
35d20 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63  ge lock using fc
35d30 6e 74 6c 28 29 2e 20 49 66 20 74 68 65 20 63 61  ntl(). If the ca
35d40 6c 6c 20 73 75 63 63 65 65 64 73 2c 20 0a 20 20  ll succeeds, .  
35d50 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  ** assume that t
35d60 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
35d70 75 70 70 6f 72 74 73 20 50 4f 53 49 58 20 73 74  upports POSIX st
35d80 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f  yle locks. .  */
35d90 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65  .  lockInfo.l_le
35da0 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66  n = 1;.  lockInf
35db0 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20  o.l_start = 0;. 
35dc0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e   lockInfo.l_when
35dd0 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
35de0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65   lockInfo.l_type
35df0 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66   = F_RDLCK;.  if
35e00 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e  ( osFcntl(pNew->
35e10 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
35e20 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20  kInfo)!=-1 ) {. 
35e30 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66 73     if( strcmp(fs
35e40 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
35e50 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29 7b 0a  e, "nfs")==0 ){.
35e60 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e 66        return &nf
35e70 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  sIoMethods;.    
35e80 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72  } else {.      r
35e90 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65  eturn &posixIoMe
35ea0 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  thods;.    }.  }
35eb0 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
35ec0 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f   &dotlockIoMetho
35ed0 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ds;.  }.}.static
35ee0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
35ef0 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a  o_methods .  *(*
35f00 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f  const autolockIo
35f10 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68  Finder)(const ch
35f20 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d  ar*,unixFile*) =
35f30 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
35f40 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f  rImpl;..#endif /
35f50 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
35f60 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
35f70 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
35f80 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56  YLE */..#if OS_V
35f90 58 57 4f 52 4b 53 0a 2f 2a 0a 2a 2a 20 54 68 69  XWORKS./*.** Thi
35fa0 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74  s "finder" funct
35fb0 69 6f 6e 20 66 6f 72 20 56 78 57 6f 72 6b 73 20  ion for VxWorks 
35fc0 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
35fd0 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 0a   posix advisory.
35fe0 2a 2a 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73  ** locking works
35ff0 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74  .  If it does, t
36000 68 65 6e 20 74 68 61 74 20 69 73 20 77 68 61 74  hen that is what
36010 20 69 73 20 75 73 65 64 2e 20 20 49 66 20 69 74   is used.  If it
36020 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 77 6f 72   does not.** wor
36030 6b 2c 20 74 68 65 6e 20 66 61 6c 6c 62 61 63 6b  k, then fallback
36040 20 74 6f 20 6e 61 6d 65 64 20 73 65 6d 61 70 68   to named semaph
36050 6f 72 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  ore locking..*/.
36060 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
36070 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
36080 2a 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72  *vxworksIoFinder
36090 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68  Impl(.  const ch
360a0 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20  ar *filePath,   
360b0 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   /* name of the 
360c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
360d0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
360e0 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74  w           /* t
360f0 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a  he open file obj
36100 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ect */.){.  stru
36110 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66  ct flock lockInf
36120 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50  o;..  if( !fileP
36130 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ath ){.    /* If
36140 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20   filePath==NULL 
36150 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72  that means we ar
36160 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
36170 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a   transient file.
36180 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73      ** that does
36190 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
361a0 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72  locked. */.    r
361b0 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  eturn &nolockIoM
361c0 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f  ethods;.  }..  /
361d0 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74 6c 28  * Test if fcntl(
361e0 29 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 61  ) is supported a
361f0 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73 74 79  nd use POSIX sty
36200 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f  le locks..  ** O
36210 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 62 61  therwise fall ba
36220 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65 64 20  ck to the named 
36230 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68 6f 64  semaphore method
36240 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66  ..  */.  lockInf
36250 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c  o.l_len = 1;.  l
36260 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20  ockInfo.l_start 
36270 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 0;.  lockInfo.
36280 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
36290 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  SET;.  lockInfo.
362a0 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
362b0 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28  ;.  if( osFcntl(
362c0 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  pNew->h, F_GETLK
362d0 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31  , &lockInfo)!=-1
362e0 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20   ) {.    return 
362f0 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b  &posixIoMethods;
36300 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
36310 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f  turn &semIoMetho
36320 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ds;.  }.}.static
36330 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
36340 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a  o_methods .  *(*
36350 63 6f 6e 73 74 20 76 78 77 6f 72 6b 73 49 6f 46  const vxworksIoF
36360 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61  inder)(const cha
36370 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20  r*,unixFile*) = 
36380 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72 49  vxworksIoFinderI
36390 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  mpl;..#endif /* 
363a0 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 0a 2f  OS_VXWORKS */../
363b0 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61 63 74  *.** An abstract
363c0 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f 69 6e   type for a poin
363d0 74 65 72 20 74 6f 20 61 6e 20 49 4f 20 6d 65 74  ter to an IO met
363e0 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74  hod finder funct
363f0 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion:.*/.typedef 
36400 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
36410 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64  _methods *(*find
36420 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20 63  er_type)(const c
36430 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b  har*,unixFile*);
36440 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
36450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36490 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
364a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71  ************* sq
364b0 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64  lite3_vfs method
364c0 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
364d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
364e0 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69  *.** This divisi
364f0 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
36500 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
36510 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65  f methods on the
36520 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  .** sqlite3_vfs 
36530 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  object..*/../*.*
36540 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
36550 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
36560 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
36570 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ure pointed to b
36580 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  y pId..*/.static
36590 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46   int fillInUnixF
365a0 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ile(.  sqlite3_v
365b0 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f  fs *pVfs,      /
365c0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
365d0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
365e0 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   h,             
365f0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
36600 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20  e descriptor of 
36610 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
36620 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  d */.  sqlite3_f
36630 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f  ile *pId,      /
36640 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 75  * Write to the u
36650 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
36660 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
36670 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
36680 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
36690 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  he file being op
366a0 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 74  ened */.  int ct
366b0 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  rlFlags         
366c0 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72    /* Zero or mor
366d0 65 20 55 4e 49 58 46 49 4c 45 5f 2a 20 76 61 6c  e UNIXFILE_* val
366e0 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ues */.){.  cons
366f0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
36700 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74  hods *pLockingSt
36710 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  yle;.  unixFile 
36720 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c  *pNew = (unixFil
36730 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72  e *)pId;.  int r
36740 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
36750 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
36760 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a  pInode==NULL );.
36770 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63 6b 69 6e 67  .  /* No locking
36780 20 6f 63 63 75 72 73 20 69 6e 20 74 65 6d 70 6f   occurs in tempo
36790 72 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rary files */.  
367a0 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
367b0 65 21 3d 30 20 7c 7c 20 28 63 74 72 6c 46 6c 61  e!=0 || (ctrlFla
367c0 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f  gs & UNIXFILE_NO
367d0 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a 0a 20 20 4f  LOCK)!=0 );..  O
367e0 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 20 20  STRACE(("OPEN   
367f0 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20   %-3d %s\n", h, 
36800 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 70  zFilename));.  p
36810 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e  New->h = h;.  pN
36820 65 77 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  ew->pVfs = pVfs;
36830 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68 20 3d  .  pNew->zPath =
36840 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 70 4e   zFilename;.  pN
36850 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 3d 20  ew->ctrlFlags = 
36860 28 75 38 29 63 74 72 6c 46 6c 61 67 73 3b 0a 23  (u8)ctrlFlags;.#
36870 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
36880 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 4e 65 77  AP_SIZE>0.  pNew
36890 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20  ->mmapSizeMax = 
368a0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
368b0 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64  fig.szMmap;.#end
368c0 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  if.  if( sqlite3
368d0 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 28 28 63  _uri_boolean(((c
368e0 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
368f0 49 4c 45 5f 55 52 49 29 20 3f 20 7a 46 69 6c 65  ILE_URI) ? zFile
36900 6e 61 6d 65 20 3a 20 30 29 2c 0a 20 20 20 20 20  name : 0),.     
36910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36920 20 20 20 20 20 20 22 70 73 6f 77 22 2c 20 53 51        "psow", SQ
36930 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f  LITE_POWERSAFE_O
36940 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20 20 20  VERWRITE) ){.   
36950 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73   pNew->ctrlFlags
36960 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f   |= UNIXFILE_PSO
36970 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72  W;.  }.  if( str
36980 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c  cmp(pVfs->zName,
36990 22 75 6e 69 78 2d 65 78 63 6c 22 29 3d 3d 30 20  "unix-excl")==0 
369a0 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72  ){.    pNew->ctr
369b0 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
369c0 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a 23 69  LE_EXCL;.  }..#i
369d0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70  f OS_VXWORKS.  p
369e0 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72  New->pId = vxwor
369f0 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a 46 69  ksFindFileId(zFi
36a00 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  lename);.  if( p
36a10 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20  New->pId==0 ){. 
36a20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20     ctrlFlags |= 
36a30 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b  UNIXFILE_NOLOCK;
36a40 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
36a50 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
36a60 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63  .#endif..  if( c
36a70 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
36a80 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a 20 20  ILE_NOLOCK ){.  
36a90 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20    pLockingStyle 
36aa0 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  = &nolockIoMetho
36ab0 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ds;.  }else{.   
36ac0 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
36ad0 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70 65   (**(finder_type
36ae0 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61  *)pVfs->pAppData
36af0 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65  )(zFilename, pNe
36b00 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  w);.#if SQLITE_E
36b10 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
36b20 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63 68 65  YLE.    /* Cache
36b30 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68   zFilename in th
36b40 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  e locking contex
36b50 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f  t (AFP and dotlo
36b60 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66 6f 72  ck override) for
36b70 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63  .    ** proxyLoc
36b80 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69 73 20  k activation is 
36b90 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f 74 65  possible (remote
36ba0 20 70 72 6f 78 79 20 69 73 20 62 61 73 65 64 20   proxy is based 
36bb0 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20 20 20  on db name).    
36bc0 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d  ** zFilename rem
36bd0 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c  ains valid until
36be0 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c   file is closed,
36bf0 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20   to support */. 
36c00 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
36c10 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69 64 2a  Context = (void*
36c20 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64  )zFilename;.#end
36c30 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c  if.  }..  if( pL
36c40 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
36c50 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a 23  posixIoMethods.#
36c60 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
36c70 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
36c80 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
36c90 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f 63  TYLE.    || pLoc
36ca0 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e 66  kingStyle == &nf
36cb0 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69  sIoMethods.#endi
36cc0 66 0a 20 20 20 20 20 2f 2a 20 73 75 70 70 6f 72  f.     /* suppor
36cd0 74 20 57 41 4c 20 6d 6f 64 65 20 6f 6e 20 72 65  t WAL mode on re
36ce0 61 64 20 6f 6e 6c 79 20 6d 6f 75 6e 74 65 64 20  ad only mounted 
36cf0 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 20 20  filesystem */.  
36d00 20 20 7c 7c 20 28 70 4c 6f 63 6b 69 6e 67 53 74    || (pLockingSt
36d10 79 6c 65 20 3d 3d 20 26 6e 6f 6c 6f 63 6b 49 6f  yle == &nolockIo
36d20 4d 65 74 68 6f 64 73 20 26 26 20 7a 46 69 6c 65  Methods && zFile
36d30 6e 61 6d 65 21 3d 30 29 0a 20 20 29 7b 0a 20 20  name!=0).  ){.  
36d40 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
36d50 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e  ();.    rc = fin
36d60 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c  dInodeInfo(pNew,
36d70 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b   &pNew->pInode);
36d80 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
36d90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36da0 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
36db0 63 63 75 72 72 65 64 20 69 6e 20 66 69 6e 64 49  ccurred in findI
36dc0 6e 6f 64 65 49 6e 66 6f 28 29 2c 20 63 6c 6f 73  nodeInfo(), clos
36dd0 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
36de0 69 70 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69  iptor.      ** i
36df0 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62 65 66 6f  mmediately, befo
36e00 72 65 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  re releasing the
36e10 20 6d 75 74 65 78 2e 20 66 69 6e 64 49 6e 6f 64   mutex. findInod
36e20 65 49 6e 66 6f 28 29 20 6d 61 79 20 66 61 69 6c  eInfo() may fail
36e30 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f  .      ** in two
36e40 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20   scenarios:.    
36e50 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
36e60 28 61 29 20 41 20 63 61 6c 6c 20 74 6f 20 66 73  (a) A call to fs
36e70 74 61 74 28 29 20 66 61 69 6c 65 64 2e 0a 20 20  tat() failed..  
36e80 20 20 20 20 2a 2a 20 20 20 28 62 29 20 41 20 6d      **   (b) A m
36e90 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20  alloc failed..  
36ea0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
36eb0 53 63 65 6e 61 72 69 6f 20 28 62 29 20 6d 61 79  Scenario (b) may
36ec0 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 74   only occur if t
36ed0 68 65 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  he process is ho
36ee0 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20  lding no other. 
36ef0 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 64 65 73       ** file des
36f00 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e  criptors open on
36f10 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2e 20   the same file. 
36f20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6f 74  If there were ot
36f30 68 65 72 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  her file.      *
36f40 2a 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 6e  * descriptors on
36f50 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65 6e   this file, then
36f60 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64   no malloc would
36f70 20 62 65 20 72 65 71 75 69 72 65 64 20 62 79 0a   be required by.
36f80 20 20 20 20 20 20 2a 2a 20 66 69 6e 64 49 6e 6f        ** findIno
36f90 64 65 49 6e 66 6f 28 29 2e 20 49 66 20 74 68 69  deInfo(). If thi
36fa0 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 69  s is the case, i
36fb0 74 20 69 73 20 71 75 69 74 65 20 73 61 66 65 20  t is quite safe 
36fc0 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a  to close.      *
36fd0 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20 61 73 20  * handle h - as 
36fe0 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
36ff0 20 74 68 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c   that no posix l
37000 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20 72 65 6c  ocks will be rel
37010 65 61 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  eased.      ** b
37020 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20  y doing so..    
37030 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
37040 20 73 63 65 6e 61 72 69 6f 20 28 61 29 20 63 61   scenario (a) ca
37050 75 73 65 64 20 74 68 65 20 65 72 72 6f 72 20 74  used the error t
37060 68 65 6e 20 74 68 69 6e 67 73 20 61 72 65 20 6e  hen things are n
37070 6f 74 20 73 6f 20 73 61 66 65 2e 20 54 68 65 0a  ot so safe. The.
37080 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69        ** implici
37090 74 20 61 73 73 75 6d 70 74 69 6f 6e 20 68 65 72  t assumption her
370a0 65 20 69 73 20 74 68 61 74 20 69 66 20 66 73 74  e is that if fst
370b0 61 74 28 29 20 66 61 69 6c 73 2c 20 74 68 69 6e  at() fails, thin
370c0 67 73 20 61 72 65 20 69 6e 0a 20 20 20 20 20 20  gs are in.      
370d0 2a 2a 20 73 75 63 68 20 62 61 64 20 73 68 61 70  ** such bad shap
370e0 65 20 74 68 61 74 20 64 72 6f 70 70 69 6e 67 20  e that dropping 
370f0 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f  a lock or two do
37100 65 73 6e 27 74 20 6d 61 74 74 65 72 20 6d 75 63  esn't matter muc
37110 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
37120 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
37130 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  New, h, __LINE__
37140 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 2d 31 3b  );.      h = -1;
37150 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c  .    }.    unixL
37160 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
37170 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
37180 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
37190 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
371a0 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69  PPLE__).  else i
371b0 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
371c0 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64   == &afpIoMethod
371d0 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20  s ){.    /* AFP 
371e0 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65  locking uses the
371f0 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74   file path so it
37200 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63   needs to be inc
37210 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20  luded in.    ** 
37220 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  the afpLockingCo
37230 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ntext..    */.  
37240 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
37250 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 20 20 70  ext *pCtx;.    p
37260 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
37270 65 78 74 20 3d 20 70 43 74 78 20 3d 20 73 71 6c  ext = pCtx = sql
37280 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73  ite3_malloc64( s
37290 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a  izeof(*pCtx) );.
372a0 20 20 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20      if( pCtx==0 
372b0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
372c0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
372d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
372e0 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61    /* NB: zFilena
372f0 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20 72 65  me exists and re
37300 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69  mains valid unti
37310 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c  l the file is cl
37320 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 63  osed.      ** ac
37330 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71 75 69  cording to requi
37340 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e 20 20  rement F11141.  
37350 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  So we do not nee
37360 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20  d to make a.    
37370 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65    ** copy of the
37380 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20   filename. */.  
37390 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68      pCtx->dbPath
373a0 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20   = zFilename;.  
373b0 20 20 20 20 70 43 74 78 2d 3e 72 65 73 65 72 76      pCtx->reserv
373c0 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 72  ed = 0;.      sr
373d0 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20  andomdev();.    
373e0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
373f0 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  ();.      rc = f
37400 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65  indInodeInfo(pNe
37410 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  w, &pNew->pInode
37420 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
37430 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37440 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
37450 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67  ee(pNew->locking
37460 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
37470 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
37480 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  New, h, __LINE__
37490 29 3b 0a 20 20 20 20 20 20 20 20 68 20 3d 20 2d  );.        h = -
374a0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
374b0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
374c0 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20 7d  );        .    }
374d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65  .  }.#endif..  e
374e0 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  lse if( pLocking
374f0 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63  Style == &dotloc
37500 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  kIoMethods ){.  
37510 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63    /* Dotfile loc
37520 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69  king uses the fi
37530 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65  le path so it ne
37540 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64  eds to be includ
37550 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  ed in.    ** the
37560 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43   dotlockLockingC
37570 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20  ontext .    */. 
37580 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69     char *zLockFi
37590 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c  le;.    int nFil
375a0 65 6e 61 6d 65 3b 0a 20 20 20 20 61 73 73 65 72  ename;.    asser
375b0 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20  t( zFilename!=0 
375c0 29 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65  );.    nFilename
375d0 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
375e0 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20  Filename) + 6;. 
375f0 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28     zLockFile = (
37600 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  char *)sqlite3_m
37610 61 6c 6c 6f 63 36 34 28 6e 46 69 6c 65 6e 61 6d  alloc64(nFilenam
37620 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63  e);.    if( zLoc
37630 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  kFile==0 ){.    
37640 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
37650 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65  MEM_BKPT;.    }e
37660 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
37670 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c  e3_snprintf(nFil
37680 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65  ename, zLockFile
37690 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53  , "%s" DOTLOCK_S
376a0 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65  UFFIX, zFilename
376b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  );.    }.    pNe
376c0 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
376d0 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20  t = zLockFile;. 
376e0 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   }..#if OS_VXWOR
376f0 4b 53 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c  KS.  else if( pL
37700 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
37710 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  semIoMethods ){.
37720 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d      /* Named sem
37730 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75  aphore locking u
37740 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
37750 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
37760 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75   be.    ** inclu
37770 64 65 64 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f  ded in the semLo
37780 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20  ckingContext.   
37790 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74 65   */.    unixEnte
377a0 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63  rMutex();.    rc
377b0 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f   = findInodeInfo
377c0 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49  (pNew, &pNew->pI
377d0 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 28  node);.    if( (
377e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26  rc==SQLITE_OK) &
377f0 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d  & (pNew->pInode-
37800 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a  >pSem==NULL) ){.
37810 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 65 6d        char *zSem
37820 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70 49 6e  Name = pNew->pIn
37830 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20  ode->aSemName;. 
37840 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
37850 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
37860 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c  tf(MAX_PATHNAME,
37870 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e   zSemName, "/%s.
37880 73 65 6d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  sem",.          
37890 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
378a0 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63  w->pId->zCanonic
378b0 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66  alName);.      f
378c0 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d  or( n=1; zSemNam
378d0 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20  e[n]; n++ ).    
378e0 20 20 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65      if( zSemName
378f0 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e  [n]=='/' ) zSemN
37900 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20  ame[n] = '_';.  
37910 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65      pNew->pInode
37920 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65  ->pSem = sem_ope
37930 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52  n(zSemName, O_CR
37940 45 41 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20  EAT, 0666, 1);. 
37950 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70       if( pNew->p
37960 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d 20 53  Inode->pSem == S
37970 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20  EM_FAILED ){.   
37980 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
37990 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
379a0 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64       pNew->pInod
379b0 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d  e->aSemName[0] =
379c0 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20   '\0';.      }. 
379d0 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61     }.    unixLea
379e0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23  veMutex();.  }.#
379f0 65 6e 64 69 66 0a 20 20 0a 20 20 73 74 6f 72 65  endif.  .  store
37a00 4c 61 73 74 45 72 72 6e 6f 28 70 4e 65 77 2c 20  LastErrno(pNew, 
37a10 30 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  0);.#if OS_VXWOR
37a20 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  KS.  if( rc!=SQL
37a30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
37a40 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f  ( h>=0 ) robust_
37a50 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
37a60 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 68 20  _LINE__);.    h 
37a70 3d 20 2d 31 3b 0a 20 20 20 20 6f 73 55 6e 6c 69  = -1;.    osUnli
37a80 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  nk(zFilename);. 
37a90 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61     pNew->ctrlFla
37aa0 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44  gs |= UNIXFILE_D
37ab0 45 4c 45 54 45 3b 0a 20 20 7d 0a 23 65 6e 64 69  ELETE;.  }.#endi
37ac0 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  f.  if( rc!=SQLI
37ad0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
37ae0 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63   h>=0 ) robust_c
37af0 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
37b00 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65  LINE__);.  }else
37b10 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74  {.    pNew->pMet
37b20 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74  hod = pLockingSt
37b30 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75  yle;.    OpenCou
37b40 6e 74 65 72 28 2b 31 29 3b 0a 20 20 20 20 76 65  nter(+1);.    ve
37b50 72 69 66 79 44 62 46 69 6c 65 28 70 4e 65 77 29  rifyDbFile(pNew)
37b60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
37b70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
37b80 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  rn the name of a
37b90 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20 77 68   directory in wh
37ba0 69 63 68 20 74 6f 20 70 75 74 20 74 65 6d 70 6f  ich to put tempo
37bb0 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 20 49  rary files..** I
37bc0 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 74 65  f no suitable te
37bd0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 64 69 72  mporary file dir
37be0 65 63 74 6f 72 79 20 63 61 6e 20 62 65 20 66 6f  ectory can be fo
37bf0 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  und, return NULL
37c00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
37c10 74 20 63 68 61 72 20 2a 75 6e 69 78 54 65 6d 70  t char *unixTemp
37c20 46 69 6c 65 44 69 72 28 76 6f 69 64 29 7b 0a 20  FileDir(void){. 
37c30 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
37c40 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b  ar *azDirs[] = {
37c50 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30 2c  .     0,.     0,
37c60 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22  .     "/var/tmp"
37c70 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70  ,.     "/usr/tmp
37c80 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a  ",.     "/tmp",.
37c90 20 20 20 20 20 22 2e 22 0a 20 20 7d 3b 0a 20 20       ".".  };.  
37ca0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 20 3d  unsigned int i =
37cb0 20 30 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   0;.  struct sta
37cc0 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63  t buf;.  const c
37cd0 68 61 72 20 2a 7a 44 69 72 20 3d 20 73 71 6c 69  har *zDir = sqli
37ce0 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
37cf0 72 79 3b 0a 0a 20 20 69 66 28 20 21 61 7a 44 69  ry;..  if( !azDi
37d00 72 73 5b 30 5d 20 29 20 61 7a 44 69 72 73 5b 30  rs[0] ) azDirs[0
37d10 5d 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49  ] = getenv("SQLI
37d20 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20 69  TE_TMPDIR");.  i
37d30 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29 20  f( !azDirs[1] ) 
37d40 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74 65  azDirs[1] = gete
37d50 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20 20  nv("TMPDIR");.  
37d60 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 69 66  while(1){.    if
37d70 28 20 7a 44 69 72 21 3d 30 0a 20 20 20 20 20 26  ( zDir!=0.     &
37d80 26 20 6f 73 53 74 61 74 28 7a 44 69 72 2c 20 26  & osStat(zDir, &
37d90 62 75 66 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  buf)==0.     && 
37da0 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d  S_ISDIR(buf.st_m
37db0 6f 64 65 29 0a 20 20 20 20 20 26 26 20 6f 73 41  ode).     && osA
37dc0 63 63 65 73 73 28 7a 44 69 72 2c 20 30 33 29 3d  ccess(zDir, 03)=
37dd0 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
37de0 72 65 74 75 72 6e 20 7a 44 69 72 3b 0a 20 20 20  return zDir;.   
37df0 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 73 69   }.    if( i>=si
37e00 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a  zeof(azDirs)/siz
37e10 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 20 29  eof(azDirs[0]) )
37e20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a 44 69 72   break;.    zDir
37e30 20 3d 20 61 7a 44 69 72 73 5b 69 2b 2b 5d 3b 0a   = azDirs[i++];.
37e40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
37e50 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
37e60 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
37e70 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20   name in zBuf.  
37e80 7a 42 75 66 20 6d 75 73 74 20 62 65 20 61 6c 6c  zBuf must be all
37e90 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  ocated.** by the
37ea0 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 73 73   calling process
37eb0 20 61 6e 64 20 6d 75 73 74 20 62 65 20 62 69 67   and must be big
37ec0 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
37ed0 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70 56 66 73  at least.** pVfs
37ee0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74  ->mxPathname byt
37ef0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
37f00 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d  t unixGetTempnam
37f10 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  e(int nBuf, char
37f20 20 2a 7a 42 75 66 29 7b 0a 20 20 63 6f 6e 73 74   *zBuf){.  const
37f30 20 63 68 61 72 20 2a 7a 44 69 72 3b 0a 20 20 69   char *zDir;.  i
37f40 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a  nt iLimit = 0;..
37f50 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f    /* It's odd to
37f60 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d   simulate an io-
37f70 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20  error here, but 
37f80 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a  really this is j
37f90 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  ust.  ** using t
37fa0 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72  he io-error infr
37fb0 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65  astructure to te
37fc0 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68  st that SQLite h
37fd0 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a  andles this.  **
37fe0 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e   function failin
37ff0 67 2e 20 0a 20 20 2a 2f 0a 20 20 7a 42 75 66 5b  g. .  */.  zBuf[
38000 30 5d 20 3d 20 30 3b 0a 20 20 53 69 6d 75 6c 61  0] = 0;.  Simula
38010 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
38020 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  n SQLITE_IOERR )
38030 3b 0a 0a 20 20 7a 44 69 72 20 3d 20 75 6e 69 78  ;..  zDir = unix
38040 54 65 6d 70 46 69 6c 65 44 69 72 28 29 3b 0a 20  TempFileDir();. 
38050 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 72   if( zDir==0 ) r
38060 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
38070 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 3b 0a  RR_GETTEMPPATH;.
38080 20 20 64 6f 7b 0a 20 20 20 20 75 36 34 20 72 3b    do{.    u64 r;
38090 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  .    sqlite3_ran
380a0 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72  domness(sizeof(r
380b0 29 2c 20 26 72 29 3b 0a 20 20 20 20 61 73 73 65  ), &r);.    asse
380c0 72 74 28 20 6e 42 75 66 3e 32 20 29 3b 0a 20 20  rt( nBuf>2 );.  
380d0 20 20 7a 42 75 66 5b 6e 42 75 66 2d 32 5d 20 3d    zBuf[nBuf-2] =
380e0 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
380f0 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
38100 42 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45  Buf, "%s/"SQLITE
38110 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
38120 58 22 25 6c 6c 78 25 63 22 2c 0a 20 20 20 20 20  X"%llx%c",.     
38130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38140 7a 44 69 72 2c 20 72 2c 20 30 29 3b 0a 20 20 20  zDir, r, 0);.   
38150 20 69 66 28 20 7a 42 75 66 5b 6e 42 75 66 2d 32   if( zBuf[nBuf-2
38160 5d 21 3d 30 20 7c 7c 20 28 69 4c 69 6d 69 74 2b  ]!=0 || (iLimit+
38170 2b 29 3e 31 30 20 29 20 72 65 74 75 72 6e 20 53  +)>10 ) return S
38180 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
38190 77 68 69 6c 65 28 20 6f 73 41 63 63 65 73 73 28  while( osAccess(
381a0 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20  zBuf,0)==0 );.  
381b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
381c0 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
381d0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
381e0 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
381f0 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a  __APPLE__)./*.**
38200 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72 61 6e   Routine to tran
38210 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c 65  sform a unixFile
38220 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c 6f   into a proxy-lo
38230 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e 0a  cking unixFile..
38240 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
38250 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79 2d 6c  n in the proxy-l
38260 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62 75  ock division, bu
38270 74 20 75 73 65 64 20 62 79 20 75 6e 69 78 4f 70  t used by unixOp
38280 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49 54  en().** if SQLIT
38290 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
382a0 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69 6e 65  OCKING is define
382b0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
382c0 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55   proxyTransformU
382d0 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65  nixFile(unixFile
382e0 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  *, const char*);
382f0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
38300 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75  earch for an unu
38310 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
38320 74 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70 65  tor that was ope
38330 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ned on the datab
38340 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f  ase .** file (no
38350 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d  t a journal or m
38360 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
38370 6c 65 29 20 69 64 65 6e 74 69 66 69 65 64 20 62  le) identified b
38380 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50  y pathname.** zP
38390 61 74 68 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ath with SQLITE_
383a0 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 6d  OPEN_XXX flags m
383b0 61 74 63 68 69 6e 67 20 74 68 6f 73 65 20 70 61  atching those pa
383c0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
383d0 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74  nd.** argument t
383e0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
383f0 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66 69  .**.** Such a fi
38400 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 61  le descriptor ma
38410 79 20 65 78 69 73 74 20 69 66 20 61 20 64 61 74  y exist if a dat
38420 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
38430 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20 62   was closed.** b
38440 75 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  ut the associate
38450 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
38460 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63  r could not be c
38470 6c 6f 73 65 64 20 62 65 63 61 75 73 65 20 73 6f  losed because so
38480 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c 65  me.** other file
38490 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e   descriptor open
384a0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   on the same fil
384b0 65 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 66  e is holding a f
384c0 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66  ile-lock..** Ref
384d0 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20 69  er to comments i
384e0 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f 73 65 28  n the unixClose(
384f0 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 74  ) function and t
38500 68 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d 65  he lengthy comme
38510 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67  nt.** describing
38520 20 22 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79   "Posix Advisory
38530 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74 68 65   Loc