/ Hex Artifact Content
Login

Artifact e9666eb40f1dd211c362b08d595790acc7a02a62:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61  if../*.** standa
0c30: 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73  rd include files
0c40: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73  ..*/.#include <s
0c50: 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63  ys/types.h>.#inc
0c60: 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68  lude <sys/stat.h
0c70: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74  >.#include <fcnt
0c80: 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75  l.h>.#include <u
0c90: 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64  nistd.h>.#includ
0ca0: 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c  e <time.h>.#incl
0cb0: 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e  ude <sys/time.h>
0cc0: 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f  .#include <errno
0cd0: 2e 68 3e 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .h>.#if !defined
0ce0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
0cf0: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
0d00: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 69 6e  MMAP_SIZE>0.# in
0d10: 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e  clude <sys/mman.
0d20: 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53  h>.#endif..#if S
0d30: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0d40: 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 4f 53  KING_STYLE || OS
0d50: 5f 56 58 57 4f 52 4b 53 0a 23 20 69 6e 63 6c 75  _VXWORKS.# inclu
0d60: 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68 3e  de <sys/ioctl.h>
0d70: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 75 69 64  .# include <uuid
0d80: 2f 75 75 69 64 2e 68 3e 0a 23 20 69 66 20 4f 53  /uuid.h>.# if OS
0d90: 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 6e 63 6c  _VXWORKS.#  incl
0da0: 75 64 65 20 3c 73 65 6d 61 70 68 6f 72 65 2e 68  ude <semaphore.h
0db0: 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 6c 69  >.#  include <li
0dc0: 6d 69 74 73 2e 68 3e 0a 23 20 65 6c 73 65 0a 23  mits.h>.# else.#
0dd0: 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 66    include <sys/f
0de0: 69 6c 65 2e 68 3e 0a 23 20 20 69 6e 63 6c 75 64  ile.h>.#  includ
0df0: 65 20 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e 0a  e <sys/param.h>.
0e00: 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f  # endif.#endif /
0e10: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
0e20: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
0e30: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
0e40: 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 28 53 51 4c  APPLE__) || (SQL
0e50: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0e60: 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f  NG_STYLE && !OS_
0e70: 56 58 57 4f 52 4b 53 29 0a 23 20 69 6e 63 6c 75  VXWORKS).# inclu
0e80: 64 65 20 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e  de <sys/mount.h>
0e90: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
0ea0: 48 41 56 45 5f 55 54 49 4d 45 0a 23 20 69 6e 63  HAVE_UTIME.# inc
0eb0: 6c 75 64 65 20 3c 75 74 69 6d 65 2e 68 3e 0a 23  lude <utime.h>.#
0ec0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  endif../*.** All
0ed0: 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 75  owed values of u
0ee0: 6e 69 78 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a  nixFile.fsFlags.
0ef0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54  */.#define SQLIT
0f00: 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44  E_FSFLAGS_IS_MSD
0f10: 4f 53 20 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a  OS     0x1../*.*
0f20: 2a 20 49 66 20 77 65 20 61 72 65 20 74 6f 20 62  * If we are to b
0f30: 65 20 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69  e thread-safe, i
0f40: 6e 63 6c 75 64 65 20 74 68 65 20 70 74 68 72 65  nclude the pthre
0f50: 61 64 73 20 68 65 61 64 65 72 20 61 6e 64 20 64  ads header and d
0f60: 65 66 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c  efine.** the SQL
0f70: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
0f80: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53   macro..*/.#if S
0f90: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
0fa0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72  .# include <pthr
0fb0: 65 61 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20  ead.h>.# define 
0fc0: 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45  SQLITE_UNIX_THRE
0fd0: 41 44 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ADS 1.#endif../*
0fe0: 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d  .** Default perm
0ff0: 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65  issions when cre
1000: 61 74 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65  ating a new file
1010: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
1020: 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
1030: 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65  PERMISSIONS.# de
1040: 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41  fine SQLITE_DEFA
1050: 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
1060: 49 4f 4e 53 20 30 36 34 34 0a 23 65 6e 64 69 66  IONS 0644.#endif
1070: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20  ../*.** Default 
1080: 70 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e  permissions when
1090: 20 63 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70   creating auto p
10a0: 72 6f 78 79 20 64 69 72 0a 2a 2f 0a 23 69 66 6e  roxy dir.*/.#ifn
10b0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
10c0: 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d  LT_PROXYDIR_PERM
10d0: 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65  ISSIONS.# define
10e0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
10f0: 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
1100: 49 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66  IONS 0755.#endif
1110: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
1120: 73 75 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c  supported path-l
1130: 65 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ength..*/.#defin
1140: 65 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35  e MAX_PATHNAME 5
1150: 31 32 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73  12../*.** Only s
1160: 65 74 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f  et the lastErrno
1170: 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f   if the error co
1180: 64 65 20 69 73 20 61 20 72 65 61 6c 20 65 72 72  de is a real err
1190: 6f 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61  or and not .** a
11a0: 20 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64   normal expected
11b0: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20   return code of 
11c0: 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53  SQLITE_BUSY or S
11d0: 51 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66  QLITE_OK.*/.#def
11e0: 69 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  ine IS_LOCK_ERRO
11f0: 52 28 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c  R(x)  ((x != SQL
1200: 49 54 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d  ITE_OK) && (x !=
1210: 20 53 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a   SQLITE_BUSY))..
1220: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
1230: 65 6e 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66  ences */.typedef
1240: 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20   struct unixShm 
1250: 75 6e 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20  unixShm;        
1260: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
1270: 74 69 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  tion shared memo
1280: 72 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  ry */.typedef st
1290: 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ruct unixShmNode
12a0: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20   unixShmNode;   
12b0: 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65      /* Shared me
12c0: 6d 6f 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f  mory instance */
12d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
12e0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e  unixInodeInfo un
12f0: 69 78 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f  ixInodeInfo;   /
1300: 2a 20 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74  * An i-node */.t
1310: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 55 6e  ypedef struct Un
1320: 69 78 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55  ixUnusedFd UnixU
1330: 6e 75 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20  nusedFd;     /* 
1340: 41 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  An unused file d
1350: 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a  escriptor */../*
1360: 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61  .** Sometimes, a
1370: 66 74 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64  fter a file hand
1380: 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20  le is closed by 
1390: 53 51 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65  SQLite, the file
13a0: 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63   descriptor.** c
13b0: 61 6e 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20  annot be closed 
13c0: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20  immediately. In 
13d0: 74 68 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73  these cases, ins
13e0: 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f  tances of the fo
13f0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63  llowing.** struc
1400: 74 75 72 65 20 61 72 65 20 75 73 65 64 20 74 6f  ture are used to
1410: 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20   store the file 
1420: 64 65 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65  descriptor while
1430: 20 77 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a   waiting for an.
1440: 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  ** opportunity t
1450: 6f 20 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f  o either close o
1460: 72 20 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73  r reuse it..*/.s
1470: 74 72 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64  truct UnixUnused
1480: 46 64 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20  Fd {.  int fd;  
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a0: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
14b0: 74 6f 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a  tor to close */.
14c0: 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20    int flags;    
14d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
14e0: 6c 61 67 73 20 74 68 69 73 20 66 69 6c 65 20 64  lags this file d
14f0: 65 73 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70  escriptor was op
1500: 65 6e 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55  ened with */.  U
1510: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65  nixUnusedFd *pNe
1520: 78 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  xt;      /* Next
1530: 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
1540: 63 72 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20  criptor on same 
1550: 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  file */.};../*.*
1560: 2a 20 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73  * The unixFile s
1570: 74 72 75 63 74 75 72 65 20 69 73 20 73 75 62 63  tructure is subc
1580: 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f  lass of sqlite3_
1590: 66 69 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f  file specific to
15a0: 20 74 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53   the unix.** VFS
15b0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
15c0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
15d0: 75 63 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69  uct unixFile uni
15e0: 78 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e  xFile;.struct un
15f0: 69 78 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74  ixFile {.  sqlit
1600: 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f  e3_io_methods co
1610: 6e 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f  nst *pMethod;  /
1620: 2a 20 41 6c 77 61 79 73 20 74 68 65 20 66 69 72  * Always the fir
1630: 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71  st entry */.  sq
1640: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b  lite3_vfs *pVfs;
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 20 2f 2a 20 54 68 65 20 56 46 53 20 74 68 61    /* The VFS tha
1670: 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20 75  t created this u
1680: 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  nixFile */.  uni
1690: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
16a0: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
16b0: 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c   /* Info about l
16c0: 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f  ocks on this ino
16d0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20  de */.  int h;  
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1700: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
1710: 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  or */.  unsigned
1720: 20 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b   char eFileLock;
1730: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1740: 68 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20  he type of lock 
1750: 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20  held on this fd 
1760: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 68  */.  unsigned sh
1770: 6f 72 74 20 69 6e 74 20 63 74 72 6c 46 6c 61 67  ort int ctrlFlag
1780: 73 3b 20 20 20 20 20 20 20 2f 2a 20 42 65 68 61  s;       /* Beha
1790: 76 69 6f 72 61 6c 20 62 69 74 73 2e 20 20 55 4e  vioral bits.  UN
17a0: 49 58 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a  IXFILE_* flags *
17b0: 2f 0a 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e  /.  int lastErrn
17c0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
17d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
17e0: 6e 69 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c  nix errno from l
17f0: 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f  ast I/O error */
1800: 0a 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67  .  void *locking
1810: 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20  Context;        
1820: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e         /* Lockin
1830: 67 20 73 74 79 6c 65 20 73 70 65 63 69 66 69 63  g style specific
1840: 20 73 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78   state */.  Unix
1850: 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
1860: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1870: 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64  /* Pre-allocated
1880: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f   UnixUnusedFd */
1890: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
18a0: 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  Path;           
18b0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
18c0: 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  f the file */.  
18d0: 75 6e 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20  unixShm *pShm;  
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65      /* Shared me
1900: 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66  mory segment inf
1910: 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  ormation */.  in
1920: 74 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20  t szChunk;      
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1940: 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20    /* Configured 
1950: 62 79 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53  by FCNTL_CHUNK_S
1960: 49 5a 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54  IZE */.#if SQLIT
1970: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
1980: 30 0a 20 20 69 6e 74 20 6e 46 65 74 63 68 4f 75  0.  int nFetchOu
1990: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
19a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
19b0: 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  r of outstanding
19c0: 20 78 46 65 74 63 68 20 72 65 66 73 20 2a 2f 0a   xFetch refs */.
19d0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
19e0: 6d 6d 61 70 53 69 7a 65 3b 20 20 20 20 20 20 20  mmapSize;       
19f0: 20 20 20 20 20 20 2f 2a 20 55 73 61 62 6c 65 20        /* Usable 
1a00: 73 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20  size of mapping 
1a10: 61 74 20 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f  at pMapRegion */
1a20: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1a30: 20 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3b   mmapSizeActual;
1a40: 20 20 20 20 20 20 20 2f 2a 20 41 63 74 75 61 6c         /* Actual
1a50: 20 73 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67   size of mapping
1a60: 20 61 74 20 70 4d 61 70 52 65 67 69 6f 6e 20 2a   at pMapRegion *
1a70: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
1a80: 34 20 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 20 20  4 mmapSizeMax;  
1a90: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
1aa0: 67 75 72 65 64 20 46 43 4e 54 4c 5f 4d 4d 41 50  gured FCNTL_MMAP
1ab0: 5f 53 49 5a 45 20 76 61 6c 75 65 20 2a 2f 0a 20  _SIZE value */. 
1ac0: 20 76 6f 69 64 20 2a 70 4d 61 70 52 65 67 69 6f   void *pMapRegio
1ad0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1ae0: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d       /* Memory m
1af0: 61 70 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a  apped region */.
1b00: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f  #endif.#ifdef __
1b10: 51 4e 58 4e 54 4f 5f 5f 0a 20 20 69 6e 74 20 73  QNXNTO__.  int s
1b20: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b40: 2a 20 44 65 76 69 63 65 20 73 65 63 74 6f 72 20  * Device sector 
1b50: 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65  size */.  int de
1b60: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1b70: 69 63 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ics;          /*
1b80: 20 50 72 65 63 6f 6d 70 75 74 65 64 20 64 65 76   Precomputed dev
1b90: 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
1ba0: 69 63 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  ics */.#endif.#i
1bb0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1bc0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c  LOCKING_STYLE ||
1bd0: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1be0: 5f 5f 29 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c  __).  int openFl
1bf0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1c00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1c10: 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65 64   flags specified
1c20: 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65   at open() */.#e
1c30: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
1c40: 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54  ENABLE_DATA_PROT
1c50: 45 43 54 49 4f 4e 0a 20 20 69 6e 74 20 70 72 6f  ECTION.  int pro
1c60: 74 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  tFlags;         
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c80: 44 61 74 61 20 70 72 6f 74 65 63 74 69 6f 6e 20  Data protection 
1c90: 66 6c 61 67 73 20 66 72 6f 6d 20 75 6e 69 78 4f  flags from unixO
1ca0: 70 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  pen */.#endif.#i
1cb0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1cc0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c  LOCKING_STYLE ||
1cd0: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1ce0: 5f 5f 29 0a 20 20 75 6e 73 69 67 6e 65 64 20 66  __).  unsigned f
1cf0: 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  sFlags;         
1d00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 61 63            /* cac
1d10: 68 65 64 20 64 65 74 61 69 6c 73 20 66 72 6f 6d  hed details from
1d20: 20 73 74 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e   statfs() */.#en
1d30: 64 69 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  dif.#if OS_VXWOR
1d40: 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  KS.  struct vxwo
1d50: 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20  rksFileId *pId; 
1d60: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 71           /* Uniq
1d70: 75 65 20 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65  ue file ID */.#e
1d80: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
1d90: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
1da0: 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20  e next group of 
1db0: 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 75 73  variables are us
1dc0: 65 64 20 74 6f 20 74 72 61 63 6b 20 77 68 65 74  ed to track whet
1dd0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20  her or not the. 
1de0: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1df0: 63 6f 75 6e 74 65 72 20 69 6e 20 62 79 74 65 73  counter in bytes
1e00: 20 32 34 2d 32 37 20 6f 66 20 64 61 74 61 62 61   24-27 of databa
1e10: 73 65 20 66 69 6c 65 73 20 61 72 65 20 75 70 64  se files are upd
1e20: 61 74 65 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76  ated.  ** whenev
1e30: 65 72 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74  er any part of t
1e40: 68 65 20 64 61 74 61 62 61 73 65 20 63 68 61 6e  he database chan
1e50: 67 65 73 2e 20 20 41 6e 20 61 73 73 65 72 74 69  ges.  An asserti
1e60: 6f 6e 20 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20  on fault will.  
1e70: 2a 2a 20 6f 63 63 75 72 20 69 66 20 61 20 66 69  ** occur if a fi
1e80: 6c 65 20 69 73 20 75 70 64 61 74 65 64 20 77 69  le is updated wi
1e90: 74 68 6f 75 74 20 61 6c 73 6f 20 75 70 64 61 74  thout also updat
1ea0: 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74  ing the transact
1eb0: 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72  ion.  ** counter
1ec0: 2e 20 20 54 68 69 73 20 74 65 73 74 20 69 73 20  .  This test is 
1ed0: 6d 61 64 65 20 74 6f 20 61 76 6f 69 64 20 6e 65  made to avoid ne
1ee0: 77 20 70 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c  w problems simil
1ef0: 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f  ar to the.  ** o
1f00: 6e 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20  ne described by 
1f10: 74 69 63 6b 65 74 20 23 33 35 38 34 2e 20 0a 20  ticket #3584. . 
1f20: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1f30: 68 61 72 20 74 72 61 6e 73 43 6e 74 72 43 68 6e  har transCntrChn
1f40: 67 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  g;   /* True if 
1f50: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1f60: 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 64 20  counter changed 
1f70: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
1f80: 61 72 20 64 62 55 70 64 61 74 65 3b 20 20 20 20  ar dbUpdate;    
1f90: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
1fa0: 6e 79 20 70 61 72 74 20 6f 66 20 64 61 74 61 62  ny part of datab
1fb0: 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 64  ase file changed
1fc0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1fd0: 68 61 72 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  har inNormalWrit
1fe0: 65 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  e;   /* True if 
1ff0: 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74  in a normal writ
2000: 65 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a  e operation */..
2010: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
2020: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20  QLITE_TEST.  /* 
2030: 49 6e 20 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e  In test mode, in
2040: 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65 20  crease the size 
2050: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
2060: 65 20 61 20 62 69 74 20 73 6f 20 74 68 61 74 20  e a bit so that 
2070: 0a 20 20 2a 2a 20 69 74 20 69 73 20 6c 61 72 67  .  ** it is larg
2080: 65 72 20 74 68 61 6e 20 74 68 65 20 73 74 72 75  er than the stru
2090: 63 74 20 43 72 61 73 68 46 69 6c 65 20 64 65 66  ct CrashFile def
20a0: 69 6e 65 64 20 69 6e 20 74 65 73 74 36 2e 63 2e  ined in test6.c.
20b0: 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 61 50 61  .  */.  char aPa
20c0: 64 64 69 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69  dding[32];.#endi
20d0: 66 0a 7d 3b 0a 0a 2f 2a 20 54 68 69 73 20 76 61  f.};../* This va
20e0: 72 69 61 62 6c 65 20 68 6f 6c 64 73 20 74 68 65  riable holds the
20f0: 20 70 72 6f 63 65 73 73 20 69 64 20 28 70 69 64   process id (pid
2100: 29 20 66 72 6f 6d 20 77 68 65 6e 20 74 68 65 20  ) from when the 
2110: 78 52 61 6e 64 6f 6d 6e 65 73 73 28 29 0a 2a 2a  xRandomness().**
2120: 20 6d 65 74 68 6f 64 20 77 61 73 20 63 61 6c 6c   method was call
2130: 65 64 2e 20 20 49 66 20 78 4f 70 65 6e 28 29 20  ed.  If xOpen() 
2140: 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61  is called from a
2150: 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65   different proce
2160: 73 73 20 69 64 2c 0a 2a 2a 20 69 6e 64 69 63 61  ss id,.** indica
2170: 74 69 6e 67 20 74 68 61 74 20 61 20 66 6f 72 6b  ting that a fork
2180: 28 29 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c  () has occurred,
2190: 20 74 68 65 20 50 52 4e 47 20 77 69 6c 6c 20 62   the PRNG will b
21a0: 65 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  e reset..*/.stat
21b0: 69 63 20 69 6e 74 20 72 61 6e 64 6f 6d 6e 65 73  ic int randomnes
21c0: 73 50 69 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  sPid = 0;../*.**
21d0: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
21e0: 66 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65  for the unixFile
21f0: 2e 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61  .ctrlFlags bitma
2200: 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55  sk:.*/.#define U
2210: 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20  NIXFILE_EXCL    
2220: 20 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20      0x01     /* 
2230: 43 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d  Connections from
2240: 20 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c   one process onl
2250: 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  y */.#define UNI
2260: 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20  XFILE_RDONLY    
2270: 20 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f    0x02     /* Co
2280: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64  nnection is read
2290: 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65   only */.#define
22a0: 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53   UNIXFILE_PERSIS
22b0: 54 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f  T_WAL 0x04     /
22c0: 2a 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c  * Persistent WAL
22d0: 20 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66   mode */.#ifndef
22e0: 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
22f0: 44 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e 65  DIRSYNC.# define
2300: 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e   UNIXFILE_DIRSYN
2310: 43 20 20 20 20 30 78 30 38 20 20 20 20 20 2f 2a  C    0x08     /*
2320: 20 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20   Directory sync 
2330: 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a  needed */.#else.
2340: 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  # define UNIXFIL
2350: 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30  E_DIRSYNC    0x0
2360: 30 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  0.#endif.#define
2370: 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 20   UNIXFILE_PSOW  
2380: 20 20 20 20 20 20 30 78 31 30 20 20 20 20 20 2f        0x10     /
2390: 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  * SQLITE_IOCAP_P
23a0: 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
23b0: 54 45 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  TE */.#define UN
23c0: 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 20 20  IXFILE_DELETE   
23d0: 20 20 20 30 78 32 30 20 20 20 20 20 2f 2a 20 44     0x20     /* D
23e0: 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 2a  elete on close *
23f0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
2400: 4c 45 5f 55 52 49 20 20 20 20 20 20 20 20 20 30  LE_URI         0
2410: 78 34 30 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e  x40     /* Filen
2420: 61 6d 65 20 6d 69 67 68 74 20 68 61 76 65 20 71  ame might have q
2430: 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20  uery parameters 
2440: 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46  */.#define UNIXF
2450: 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 20 20 20 20 20  ILE_NOLOCK      
2460: 30 78 38 30 20 20 20 20 20 2f 2a 20 44 6f 20 6e  0x80     /* Do n
2470: 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a  o file locking *
2480: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
2490: 4c 45 5f 57 41 52 4e 45 44 20 20 20 20 30 78 30  LE_WARNED    0x0
24a0: 31 30 30 20 20 20 20 20 2f 2a 20 76 65 72 69 66  100     /* verif
24b0: 79 44 62 46 69 6c 65 28 29 20 77 61 72 6e 69 6e  yDbFile() warnin
24c0: 67 73 20 68 61 76 65 20 62 65 65 6e 20 69 73 73  gs have been iss
24d0: 75 65 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ued */../*.** In
24e0: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20  clude code that 
24f0: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  is common to all
2500: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f   os_*.c files.*/
2510: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f  .#include "os_co
2520: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44  mmon.h"../*.** D
2530: 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61  efine various ma
2540: 63 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69  cros that are mi
2550: 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20  ssing from some 
2560: 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e  systems..*/.#ifn
2570: 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a  def O_LARGEFILE.
2580: 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45  # define O_LARGE
2590: 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69  FILE 0.#endif.#i
25a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  fdef SQLITE_DISA
25b0: 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20  BLE_LFS.# undef 
25c0: 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65  O_LARGEFILE.# de
25d0: 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45  fine O_LARGEFILE
25e0: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   0.#endif.#ifnde
25f0: 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64  f O_NOFOLLOW.# d
2600: 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57  efine O_NOFOLLOW
2610: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   0.#endif.#ifnde
2620: 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66  f O_BINARY.# def
2630: 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23  ine O_BINARY 0.#
2640: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
2650: 20 74 68 72 65 61 64 69 64 20 6d 61 63 72 6f 20   threadid macro 
2660: 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68 65 20  resolves to the 
2670: 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74 6f 20  thread-id or to 
2680: 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20  0.  Used for.** 
2690: 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
26a0: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
26b0: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
26c0: 53 41 46 45 0a 23 64 65 66 69 6e 65 20 74 68 72  SAFE.#define thr
26d0: 65 61 64 69 64 20 70 74 68 72 65 61 64 5f 73 65  eadid pthread_se
26e0: 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  lf().#else.#defi
26f0: 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a 23 65  ne threadid 0.#e
2700: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 5f 5f 41  ndif..#ifdef __A
2710: 50 50 4c 45 5f 5f 0a 23 64 65 66 69 6e 65 20 53  PPLE__.#define S
2720: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 55 50  QLITE_ENABLE_SUP
2730: 45 52 4c 4f 43 4b 20 31 0a 23 65 6e 64 69 66 0a  ERLOCK 1.#endif.
2740: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
2750: 4c 45 5f 53 55 50 45 52 4c 4f 43 4b 0a 23 69 6e  LE_SUPERLOCK.#in
2760: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e 68  clude "sqlite3.h
2770: 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69  ".#include <stri
2780: 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ng.h>.#include <
2790: 61 73 73 65 72 74 2e 68 3e 0a 0a 2f 2a 0a 2a 2a  assert.h>../*.**
27a0: 20 41 20 73 74 72 75 63 74 75 72 65 20 74 6f 20   A structure to 
27b0: 63 6f 6c 6c 65 63 74 20 61 20 62 75 73 79 2d 68  collect a busy-h
27c0: 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
27d0: 61 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  and argument and
27e0: 20 61 20 63 6f 75 6e 74 0a 2a 2a 20 6f 66 20 74   a count.** of t
27f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d  he number of tim
2800: 65 73 20 69 74 20 68 61 73 20 62 65 65 6e 20 69  es it has been i
2810: 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 72 75 63  nvoked..*/.struc
2820: 74 20 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20  t SuperlockBusy 
2830: 7b 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 29  {.  int (*xBusy)
2840: 28 76 6f 69 64 2a 2c 69 6e 74 29 3b 20 20 20 20  (void*,int);    
2850: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2860: 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66  o busy-handler f
2870: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  unction */.  voi
2880: 64 20 2a 70 42 75 73 79 41 72 67 3b 20 20 20 20  d *pBusyArg;    
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28a0: 46 69 72 73 74 20 61 72 67 20 74 6f 20 70 61 73  First arg to pas
28b0: 73 20 74 6f 20 78 42 75 73 79 20 2a 2f 0a 20 20  s to xBusy */.  
28c0: 69 6e 74 20 6e 42 75 73 79 3b 20 20 20 20 20 20  int nBusy;      
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d  /* Number of tim
28f0: 65 73 20 78 42 75 73 79 20 68 61 73 20 62 65 65  es xBusy has bee
2900: 6e 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 7d 3b 0a  n invoked */.};.
2910: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
2920: 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 53 75 70  uperlockBusy Sup
2930: 65 72 6c 6f 63 6b 42 75 73 79 3b 0a 0a 2f 2a 0a  erlockBusy;../*.
2940: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
2950: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2960: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
2970: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
2980: 61 63 74 69 76 65 0a 2a 2a 20 73 75 70 65 72 6c  active.** superl
2990: 6f 63 6b 2e 20 54 68 65 20 6f 70 61 71 75 65 20  ock. The opaque 
29a0: 68 61 6e 64 6c 65 20 72 65 74 75 72 6e 65 64 20  handle returned 
29b0: 62 79 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73  by sqlite3demo_s
29c0: 75 70 65 72 6c 6f 63 6b 28 29 20 69 73 0a 2a 2a  uperlock() is.**
29d0: 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e   actually a poin
29e0: 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e  ter to an instan
29f0: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
2a00: 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ture..*/.struct 
2a10: 53 75 70 65 72 6c 6f 63 6b 20 7b 0a 20 20 73 71  Superlock {.  sq
2a20: 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a40: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
2a50: 20 75 73 65 64 20 74 6f 20 6c 6f 63 6b 20 64 62   used to lock db
2a60: 20 2a 2f 0a 20 20 69 6e 74 20 62 57 61 6c 3b 20   */.  int bWal; 
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2a90: 20 64 62 20 69 73 20 61 20 57 41 4c 20 64 61 74   db is a WAL dat
2aa0: 61 62 61 73 65 20 2a 2f 0a 7d 3b 0a 74 79 70 65  abase */.};.type
2ab0: 64 65 66 20 73 74 72 75 63 74 20 53 75 70 65 72  def struct Super
2ac0: 6c 6f 63 6b 20 53 75 70 65 72 6c 6f 63 6b 3b 0a  lock Superlock;.
2ad0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 43 74 78 20  ./*.** The pCtx 
2ae0: 70 6f 69 6e 74 65 72 20 70 61 73 73 65 64 20 74  pointer passed t
2af0: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
2b00: 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f  is actually a po
2b10: 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a 20 53 75  inter to a.** Su
2b20: 70 65 72 6c 6f 63 6b 42 75 73 79 20 73 74 72 75  perlockBusy stru
2b30: 63 74 75 72 65 2e 20 49 6e 76 6f 6b 65 20 74 68  cture. Invoke th
2b40: 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66  e busy-handler f
2b50: 75 6e 63 74 69 6f 6e 20 65 6e 63 61 70 73 75 6c  unction encapsul
2b60: 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73  ated.** by the s
2b70: 74 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74  tructure and ret
2b80: 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  urn the result..
2b90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
2ba0: 70 65 72 6c 6f 63 6b 42 75 73 79 48 61 6e 64 6c  perlockBusyHandl
2bb0: 65 72 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 69  er(void *pCtx, i
2bc0: 6e 74 20 55 4e 55 53 45 44 29 7b 0a 20 20 53 75  nt UNUSED){.  Su
2bd0: 70 65 72 6c 6f 63 6b 42 75 73 79 20 2a 70 42 75  perlockBusy *pBu
2be0: 73 79 20 3d 20 28 53 75 70 65 72 6c 6f 63 6b 42  sy = (SuperlockB
2bf0: 75 73 79 20 2a 29 70 43 74 78 3b 0a 20 20 69 66  usy *)pCtx;.  if
2c00: 28 20 70 42 75 73 79 2d 3e 78 42 75 73 79 3d 3d  ( pBusy->xBusy==
2c10: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
2c20: 72 65 74 75 72 6e 20 70 42 75 73 79 2d 3e 78 42  return pBusy->xB
2c30: 75 73 79 28 70 42 75 73 79 2d 3e 70 42 75 73 79  usy(pBusy->pBusy
2c40: 41 72 67 2c 20 70 42 75 73 79 2d 3e 6e 42 75 73  Arg, pBusy->nBus
2c50: 79 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  y++);.}../*.** T
2c60: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2c70: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
2c80: 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 64 61  e if the main da
2c90: 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
2ca0: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  .** connection d
2cb0: 62 20 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c  b is open in WAL
2cc0: 20 6d 6f 64 65 20 6f 72 20 6e 6f 74 2e 20 49 66   mode or not. If
2cd0: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
2ce0: 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74 61   and the.** data
2cf0: 62 61 73 65 20 66 69 6c 65 20 69 73 20 69 6e 20  base file is in 
2d00: 57 41 4c 20 6d 6f 64 65 2c 20 73 65 74 20 2a 70  WAL mode, set *p
2d10: 62 57 61 6c 20 74 6f 20 74 72 75 65 20 61 6e 64  bWal to true and
2d20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2d30: 4b 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 6e  K..** If it is n
2d40: 6f 74 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20  ot in WAL mode, 
2d50: 73 65 74 20 2a 70 62 57 61 6c 20 74 6f 20 66 61  set *pbWal to fa
2d60: 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  lse..**.** If an
2d70: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
2d80: 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
2d90: 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20  error code. The 
2da0: 76 61 6c 75 65 20 6f 66 20 2a 70 62 57 61 6c 0a  value of *pbWal.
2db0: 2a 2a 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  ** is undefined 
2dc0: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f  in this case..*/
2dd0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 70 65  .static int supe
2de0: 72 6c 6f 63 6b 49 73 57 61 6c 28 53 75 70 65 72  rlockIsWal(Super
2df0: 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20  lock *pLock){.  
2e00: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e20: 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
2e30: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
2e40: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20   *pStmt;        
2e50: 20 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20      /* Compiled 
2e60: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
2e70: 6f 64 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ode statement */
2e80: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
2e90: 5f 70 72 65 70 61 72 65 28 70 4c 6f 63 6b 2d 3e  _prepare(pLock->
2ea0: 64 62 2c 20 22 50 52 41 47 4d 41 20 6d 61 69 6e  db, "PRAGMA main
2eb0: 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 22 2c 20  .journal_mode", 
2ec0: 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
2ed0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ee0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
2ef0: 0a 0a 20 20 70 4c 6f 63 6b 2d 3e 62 57 61 6c 20  ..  pLock->bWal 
2f00: 3d 20 30 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  = 0;.  if( SQLIT
2f10: 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
2f20: 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
2f30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d    const char *zM
2f40: 6f 64 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ode = (const cha
2f50: 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r *)sqlite3_colu
2f60: 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30  mn_text(pStmt, 0
2f70: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 6f 64 65  );.    if( zMode
2f80: 20 26 26 20 73 74 72 6c 65 6e 28 7a 4d 6f 64 65   && strlen(zMode
2f90: 29 3d 3d 33 20 26 26 20 73 71 6c 69 74 65 33 5f  )==3 && sqlite3_
2fa0: 73 74 72 6e 69 63 6d 70 28 22 77 61 6c 22 2c 20  strnicmp("wal", 
2fb0: 7a 4d 6f 64 65 2c 20 33 29 3d 3d 30 20 29 7b 0a  zMode, 3)==0 ){.
2fc0: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 62 57 61        pLock->bWa
2fd0: 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  l = 1;.    }.  }
2fe0: 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ..  return sqlit
2ff0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
3000: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74  t);.}../*.** Obt
3010: 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ain an exclusive
3020: 20 73 68 6d 2d 6c 6f 63 6b 20 6f 6e 20 6e 42 79   shm-lock on nBy
3030: 74 65 20 62 79 74 65 73 20 73 74 61 72 74 69 6e  te bytes startin
3040: 67 20 61 74 20 6f 66 66 73 65 74 20 69 64 78 0a  g at offset idx.
3050: 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66  ** of the file f
3060: 64 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63  d. If the lock c
3070: 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  annot be obtaine
3080: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 69  d immediately, i
3090: 6e 76 6f 6b 65 0a 2a 2a 20 74 68 65 20 62 75 73  nvoke.** the bus
30a0: 79 2d 68 61 6e 64 6c 65 72 20 75 6e 74 69 6c 20  y-handler until 
30b0: 65 69 74 68 65 72 20 69 74 20 69 73 20 6f 62 74  either it is obt
30c0: 61 69 6e 65 64 20 6f 72 20 74 68 65 20 62 75 73  ained or the bus
30d0: 79 2d 68 61 6e 64 6c 65 72 0a 2a 2a 20 63 61 6c  y-handler.** cal
30e0: 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 30 2e  lback returns 0.
30f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
3100: 75 70 65 72 6c 6f 63 6b 53 68 6d 4c 6f 63 6b 28  uperlockShmLock(
3110: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
3120: 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *fd,            
3130: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
3140: 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ile handle */.  
3150: 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20 20  int idx,        
3160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3170: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 73 68 6d  /* Offset of shm
3180: 2d 6c 6f 63 6b 20 74 6f 20 6f 62 74 61 69 6e 20  -lock to obtain 
3190: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  */.  int nByte, 
31a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
31c0: 66 20 63 6f 6e 73 65 63 74 69 76 65 20 62 79 74  f consective byt
31d0: 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  es to lock */.  
31e0: 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 2a 70  SuperlockBusy *p
31f0: 42 75 73 79 20 20 20 20 20 20 20 20 20 20 20 20  Busy            
3200: 2f 2a 20 42 75 73 79 2d 68 61 6e 64 6c 65 72 20  /* Busy-handler 
3210: 77 72 61 70 70 65 72 20 6f 62 6a 65 63 74 20 2a  wrapper object *
3220: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
3230: 20 69 6e 74 20 28 2a 78 53 68 6d 4c 6f 63 6b 29   int (*xShmLock)
3240: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
3250: 69 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 29 20 3d  int, int, int) =
3260: 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78   fd->pMethods->x
3270: 53 68 6d 4c 6f 63 6b 3b 0a 20 20 64 6f 20 7b 0a  ShmLock;.  do {.
3280: 20 20 20 20 72 63 20 3d 20 78 53 68 6d 4c 6f 63      rc = xShmLoc
3290: 6b 28 66 64 2c 20 69 64 78 2c 20 6e 42 79 74 65  k(fd, idx, nByte
32a0: 2c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43  , SQLITE_SHM_LOC
32b0: 4b 7c 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  K|SQLITE_SHM_EXC
32c0: 4c 55 53 49 56 45 29 3b 0a 20 20 7d 77 68 69 6c  LUSIVE);.  }whil
32d0: 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
32e0: 53 59 20 26 26 20 73 75 70 65 72 6c 6f 63 6b 42  SY && superlockB
32f0: 75 73 79 48 61 6e 64 6c 65 72 28 28 76 6f 69 64  usyHandler((void
3300: 20 2a 29 70 42 75 73 79 2c 20 30 29 20 29 3b 0a   *)pBusy, 0) );.
3310: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
3320: 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 74 68 65  /*.** Obtain the
3330: 20 65 78 74 72 61 20 6c 6f 63 6b 73 20 6f 6e 20   extra locks on 
3340: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
3350: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 57  e required for W
3360: 41 4c 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a  AL databases..**
3370: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 75 70 70   Invoke the supp
3380: 6c 69 65 64 20 62 75 73 79 2d 68 61 6e 64 6c 65  lied busy-handle
3390: 72 20 61 73 20 72 65 71 75 69 72 65 64 2e 0a 2a  r as required..*
33a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 70  /.static int sup
33b0: 65 72 6c 6f 63 6b 57 61 6c 4c 6f 63 6b 28 0a 20  erlockWalLock(. 
33c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
33d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
33f0: 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 57 41 4c 20  dle open on WAL 
3400: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 53 75  database */.  Su
3410: 70 65 72 6c 6f 63 6b 42 75 73 79 20 2a 70 42 75  perlockBusy *pBu
3420: 73 79 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sy            /*
3430: 20 42 75 73 79 20 68 61 6e 64 6c 65 72 20 77 72   Busy handler wr
3440: 61 70 70 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  apper object */.
3450: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3470: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
3480: 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
3490: 5f 66 69 6c 65 20 2a 66 64 20 3d 20 30 3b 20 20  _file *fd = 0;  
34a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e           /* Main
34b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
34c0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 76 6f 69 64 20  andle */.  void 
34d0: 76 6f 6c 61 74 69 6c 65 20 2a 70 20 3d 20 30 3b  volatile *p = 0;
34e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
34f0: 69 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20 70  inter to first p
3500: 61 67 65 20 6f 66 20 73 68 61 72 65 64 20 6d 65  age of shared me
3510: 6d 6f 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62  mory */..  /* Ob
3520: 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
3530: 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  o the sqlite3_fi
3540: 6c 65 20 6f 62 6a 65 63 74 20 6f 70 65 6e 20 6f  le object open o
3550: 6e 20 74 68 65 20 6d 61 69 6e 20 64 62 20 66 69  n the main db fi
3560: 6c 65 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  le. */.  rc = sq
3570: 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
3580: 6f 6c 28 64 62 2c 20 22 6d 61 69 6e 22 2c 20 53  ol(db, "main", S
3590: 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45  QLITE_FCNTL_FILE
35a0: 5f 50 4f 49 4e 54 45 52 2c 20 28 76 6f 69 64 20  _POINTER, (void 
35b0: 2a 29 26 66 64 29 3b 0a 20 20 69 66 28 20 72 63  *)&fd);.  if( rc
35c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
35d0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4f  turn rc;..  /* O
35e0: 62 74 61 69 6e 20 74 68 65 20 22 72 65 63 6f 76  btain the "recov
35f0: 65 72 79 22 20 6c 6f 63 6b 2e 20 4e 6f 72 6d 61  ery" lock. Norma
3600: 6c 6c 79 2c 20 74 68 69 73 20 6c 6f 63 6b 20 69  lly, this lock i
3610: 73 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 65 64 20  s only obtained 
3620: 62 79 0a 20 20 2a 2a 20 63 6c 69 65 6e 74 73 20  by.  ** clients 
3630: 72 75 6e 6e 69 6e 67 20 64 61 74 61 62 61 73 65  running database
3640: 20 72 65 63 6f 76 65 72 79 2e 20 20 0a 20 20 2a   recovery.  .  *
3650: 2f 0a 20 20 72 63 20 3d 20 73 75 70 65 72 6c 6f  /.  rc = superlo
3660: 63 6b 53 68 6d 4c 6f 63 6b 28 66 64 2c 20 32 2c  ckShmLock(fd, 2,
3670: 20 31 2c 20 70 42 75 73 79 29 3b 0a 20 20 69 66   1, pBusy);.  if
3680: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
3690: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
36a0: 2f 2a 20 5a 65 72 6f 20 74 68 65 20 73 74 61 72  /* Zero the star
36b0: 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73  t of the first s
36c0: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 70 61 67  hared-memory pag
36d0: 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  e. This means th
36e0: 61 74 20 61 6e 79 0a 20 20 2a 2a 20 63 6c 69 65  at any.  ** clie
36f0: 6e 74 73 20 74 68 61 74 20 6f 70 65 6e 20 72 65  nts that open re
3700: 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
3710: 73 61 63 74 69 6f 6e 73 20 66 72 6f 6d 20 74 68  sactions from th
3720: 69 73 20 70 6f 69 6e 74 20 6f 6e 20 77 69 6c 6c  is point on will
3730: 0a 20 20 2a 2a 20 68 61 76 65 20 74 6f 20 72 75  .  ** have to ru
3740: 6e 20 72 65 63 6f 76 65 72 79 20 62 65 66 6f 72  n recovery befor
3750: 65 20 70 72 6f 63 65 65 64 69 6e 67 2e 20 53 69  e proceeding. Si
3760: 6e 63 65 20 74 68 65 79 20 6e 65 65 64 20 74 68  nce they need th
3770: 65 20 22 72 65 63 6f 76 65 72 79 22 0a 20 20 2a  e "recovery".  *
3780: 2a 20 6c 6f 63 6b 20 74 68 61 74 20 74 68 69 73  * lock that this
3790: 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
37a0: 69 6e 67 20 74 6f 20 64 6f 20 74 68 61 74 2c 20  ing to do that, 
37b0: 6e 6f 20 6e 65 77 20 72 65 61 64 20 6f 72 20 77  no new read or w
37c0: 72 69 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61  rite.  ** transa
37d0: 63 74 69 6f 6e 73 20 6d 61 79 20 6e 6f 77 20 62  ctions may now b
37e0: 65 20 6f 70 65 6e 65 64 2e 20 4e 6f 72 20 63 61  e opened. Nor ca
37f0: 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 62  n a checkpoint b
3800: 65 20 72 75 6e 2c 20 66 6f 72 20 74 68 65 0a 20  e run, for the. 
3810: 20 2a 2a 20 73 61 6d 65 20 72 65 61 73 6f 6e 2e   ** same reason.
3820: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 64 2d  .  */.  rc = fd-
3830: 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4d  >pMethods->xShmM
3840: 61 70 28 66 64 2c 20 30 2c 20 33 32 2a 31 30 32  ap(fd, 0, 32*102
3850: 34 2c 20 31 2c 20 26 70 29 3b 0a 20 20 69 66 28  4, 1, &p);.  if(
3860: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
3870: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65   return rc;.  me
3880: 6d 73 65 74 28 28 76 6f 69 64 20 2a 29 70 2c 20  mset((void *)p, 
3890: 30 2c 20 33 32 29 3b 0a 0a 20 20 2f 2a 20 4f 62  0, 32);..  /* Ob
38a0: 74 61 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  tain exclusive l
38b0: 6f 63 6b 73 20 6f 6e 20 61 6c 6c 20 74 68 65 20  ocks on all the 
38c0: 22 72 65 61 64 2d 6c 6f 63 6b 22 20 73 6c 6f 74  "read-lock" slot
38d0: 73 2e 20 4f 6e 63 65 20 74 68 65 73 65 20 6c 6f  s. Once these lo
38e0: 63 6b 73 0a 20 20 2a 2a 20 61 72 65 20 68 65 6c  cks.  ** are hel
38f0: 64 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  d, it is guarant
3900: 65 65 64 20 74 68 61 74 20 74 68 65 72 65 20 61  eed that there a
3910: 72 65 20 6e 6f 20 61 63 74 69 76 65 20 72 65 61  re no active rea
3920: 64 65 72 2c 20 77 72 69 74 65 72 20 6f 72 20 0a  der, writer or .
3930: 20 20 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65    ** checkpointe
3940: 72 20 63 6c 69 65 6e 74 73 2e 0a 20 20 2a 2f 0a  r clients..  */.
3950: 20 20 72 63 20 3d 20 73 75 70 65 72 6c 6f 63 6b    rc = superlock
3960: 53 68 6d 4c 6f 63 6b 28 66 64 2c 20 33 2c 20 53  ShmLock(fd, 3, S
3970: 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 2d  QLITE_SHM_NLOCK-
3980: 33 2c 20 70 42 75 73 79 29 3b 0a 20 20 72 65 74  3, pBusy);.  ret
3990: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
39a0: 20 52 65 6c 65 61 73 65 20 61 20 73 75 70 65 72   Release a super
39b0: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 61 20 64  lock held on a d
39c0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
39d0: 65 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  e argument passe
39e0: 64 20 74 6f 20 0a 2a 2a 20 74 68 69 73 20 66 75  d to .** this fu
39f0: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68 61 76 65  nction must have
3a00: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66   been obtained f
3a10: 72 6f 6d 20 61 20 73 75 63 63 65 73 73 66 75 6c  rom a successful
3a20: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69   call to.** sqli
3a30: 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63  te3demo_superloc
3a40: 6b 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  k()..*/.static v
3a50: 6f 69 64 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f  oid sqlite3demo_
3a60: 73 75 70 65 72 75 6e 6c 6f 63 6b 28 76 6f 69 64  superunlock(void
3a70: 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 53 75 70 65   *pLock){.  Supe
3a80: 72 6c 6f 63 6b 20 2a 70 20 3d 20 28 53 75 70 65  rlock *p = (Supe
3a90: 72 6c 6f 63 6b 20 2a 29 70 4c 6f 63 6b 3b 0a 20  rlock *)pLock;. 
3aa0: 20 69 66 28 20 70 2d 3e 62 57 61 6c 20 29 7b 0a   if( p->bWal ){.
3ab0: 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20      int rc;     
3ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ad0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
3ae0: 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 6c  de */.    int fl
3af0: 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d  ags = SQLITE_SHM
3b00: 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
3b10: 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 3b 0a  _SHM_EXCLUSIVE;.
3b20: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
3b30: 20 2a 66 64 20 3d 20 30 3b 0a 20 20 20 20 72 63   *fd = 0;.    rc
3b40: 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
3b50: 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 2c 20 22  control(p->db, "
3b60: 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43  main", SQLITE_FC
3b70: 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  NTL_FILE_POINTER
3b80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
3ba0: 76 6f 69 64 20 2a 29 26 66 64 29 3b 0a 20 20 20  void *)&fd);.   
3bb0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
3bc0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 64 2d 3e  OK ){.      fd->
3bd0: 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f  pMethods->xShmLo
3be0: 63 6b 28 66 64 2c 20 32 2c 20 31 2c 20 66 6c 61  ck(fd, 2, 1, fla
3bf0: 67 73 29 3b 0a 20 20 20 20 20 20 66 64 2d 3e 70  gs);.      fd->p
3c00: 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63  Methods->xShmLoc
3c10: 6b 28 66 64 2c 20 33 2c 20 53 51 4c 49 54 45 5f  k(fd, 3, SQLITE_
3c20: 53 48 4d 5f 4e 4c 4f 43 4b 2d 33 2c 20 66 6c 61  SHM_NLOCK-3, fla
3c30: 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  gs);.    }.  }. 
3c40: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
3c50: 2d 3e 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  ->db);.  sqlite3
3c60: 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  _free(p);.}../*.
3c70: 2a 2a 20 4f 62 74 61 69 6e 20 61 20 73 75 70 65  ** Obtain a supe
3c80: 72 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  rlock on the dat
3c90: 61 62 61 73 65 20 66 69 6c 65 20 69 64 65 6e 74  abase file ident
3ca0: 69 66 69 65 64 20 62 79 20 7a 50 61 74 68 2c 20  ified by zPath, 
3cb0: 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 6c 6f 63  using the.** loc
3cc0: 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20  king primitives 
3cd0: 70 72 6f 76 69 64 65 64 20 62 79 20 56 46 53 20  provided by VFS 
3ce0: 7a 56 66 73 2e 20 49 66 20 73 75 63 63 65 73 73  zVfs. If success
3cf0: 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
3d00: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e  s.** returned an
3d10: 64 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  d output variabl
3d20: 65 20 2a 70 70 4c 6f 63 6b 20 69 73 20 70 6f 70  e *ppLock is pop
3d30: 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e 20 6f  ulated with an o
3d40: 70 61 71 75 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  paque handle.** 
3d50: 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 65 64  that may be used
3d60: 20 77 69 74 68 20 73 71 6c 69 74 65 33 64 65 6d   with sqlite3dem
3d70: 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 28 29 20  o_superunlock() 
3d80: 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20 6c  to release the l
3d90: 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ock..**.** If an
3da0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
3db0: 70 70 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f  ppLock is set to
3dc0: 20 30 20 61 6e 64 20 61 6e 20 53 51 4c 69 74 65   0 and an SQLite
3dd0: 20 65 72 72 6f 72 20 63 6f 64 65 20 0a 2a 2a 20   error code .** 
3de0: 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 42 55 53  (e.g. SQLITE_BUS
3df0: 59 29 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  Y) is returned..
3e00: 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 71 75 69  **.** If a requi
3e10: 72 65 64 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20  red lock cannot 
3e20: 62 65 20 6f 62 74 61 69 6e 65 64 20 69 6d 6d 65  be obtained imme
3e30: 64 69 61 74 65 6c 79 20 61 6e 64 20 74 68 65 20  diately and the 
3e40: 78 42 75 73 79 20 70 61 72 61 6d 65 74 65 72 0a  xBusy parameter.
3e50: 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ** to this funct
3e60: 69 6f 6e 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ion is not NULL,
3e70: 20 74 68 65 6e 20 78 42 75 73 79 20 69 73 20 69   then xBusy is i
3e80: 6e 76 6f 6b 65 64 20 69 6e 20 74 68 65 20 73 61  nvoked in the sa
3e90: 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20 61 20 62  me way.** as a b
3ea0: 75 73 79 2d 68 61 6e 64 6c 65 72 20 72 65 67 69  usy-handler regi
3eb0: 73 74 65 72 65 64 20 77 69 74 68 20 53 51 4c 69  stered with SQLi
3ec0: 74 65 20 28 75 73 69 6e 67 20 73 71 6c 69 74 65  te (using sqlite
3ed0: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 29  3_busy_handler()
3ee0: 29 0a 2a 2a 20 75 6e 74 69 6c 20 65 69 74 68 65  ).** until eithe
3ef0: 72 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 20 62  r the lock can b
3f00: 65 20 6f 62 74 61 69 6e 65 64 20 6f 72 20 74 68  e obtained or th
3f10: 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66  e busy-handler f
3f20: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a  unction returns.
3f30: 2a 2a 20 30 20 28 69 6e 64 69 63 61 74 69 6e 67  ** 0 (indicating
3f40: 20 22 67 69 76 65 20 75 70 22 29 2e 0a 2a 2f 0a   "give up")..*/.
3f50: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
3f60: 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b  e3demo_superlock
3f70: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
3f80: 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
3f90: 20 20 20 20 2f 2a 20 50 61 74 68 20 74 6f 20 64      /* Path to d
3fa0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
3fb0: 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lock */.  const 
3fc0: 63 68 61 72 20 2a 7a 56 66 73 2c 20 20 20 20 20  char *zVfs,     
3fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53            /* VFS
3fe0: 20 74 6f 20 75 73 65 20 74 6f 20 61 63 63 65 73   to use to acces
3ff0: 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  s database file 
4000: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4020: 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20    /* Additional 
4030: 66 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f  flags to pass to
4040: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
4050: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73   */.  int (*xBus
4060: 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 20 20  y)(void*,int),  
4070: 20 20 20 20 20 20 2f 2a 20 42 75 73 79 20 68 61        /* Busy ha
4080: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 2a  ndler callback *
4090: 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 41  /.  void *pBusyA
40a0: 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
40b0: 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61      /* Context a
40c0: 72 67 20 66 6f 72 20 62 75 73 79 20 68 61 6e 64  rg for busy hand
40d0: 6c 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a  ler */.  void **
40e0: 70 70 4c 6f 63 6b 20 20 20 20 20 20 20 20 20 20  ppLock          
40f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
4100: 20 43 6f 6e 74 65 78 74 20 74 6f 20 70 61 73 73   Context to pass
4110: 20 74 6f 20 73 75 70 65 72 75 6e 6c 6f 63 6b 28   to superunlock(
4120: 29 20 2a 2f 0a 29 7b 0a 20 20 53 75 70 65 72 6c  ) */.){.  Superl
4130: 6f 63 6b 42 75 73 79 20 62 75 73 79 20 3d 20 7b  ockBusy busy = {
4140: 30 2c 20 30 2c 20 30 7d 3b 20 2f 2a 20 42 75 73  0, 0, 0}; /* Bus
4150: 79 20 68 61 6e 64 6c 65 72 20 77 72 61 70 70 65  y handler wrappe
4160: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
4170: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
4180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4190: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
41a0: 20 20 53 75 70 65 72 6c 6f 63 6b 20 2a 70 4c 6f    Superlock *pLo
41b0: 63 6b 3b 0a 0a 20 20 70 4c 6f 63 6b 20 3d 20 73  ck;..  pLock = s
41c0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
41d0: 7a 65 6f 66 28 53 75 70 65 72 6c 6f 63 6b 29 29  zeof(Superlock))
41e0: 3b 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29  ;.  if( !pLock )
41f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
4200: 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  OMEM;.  memset(p
4210: 4c 6f 63 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Lock, 0, sizeof(
4220: 53 75 70 65 72 6c 6f 63 6b 29 29 3b 0a 0a 20 20  Superlock));..  
4230: 2f 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61  /* Open a databa
4240: 73 65 20 68 61 6e 64 6c 65 20 6f 6e 20 74 68 65  se handle on the
4250: 20 66 69 6c 65 20 74 6f 20 73 75 70 65 72 6c 6f   file to superlo
4260: 63 6b 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ck. */.  rc = sq
4270: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20  lite3_open_v2(. 
4280: 20 20 20 20 20 7a 50 61 74 68 2c 20 26 70 4c 6f       zPath, &pLo
4290: 63 6b 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ck->db, SQLITE_O
42a0: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
42b0: 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
42c0: 7c 66 6c 61 67 73 2c 20 7a 56 66 73 0a 20 20 29  |flags, zVfs.  )
42d0: 3b 0a 0a 20 20 2f 2a 20 49 6e 73 74 61 6c 6c 20  ;..  /* Install 
42e0: 61 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 61  a busy-handler a
42f0: 6e 64 20 65 78 65 63 75 74 65 20 61 20 42 45 47  nd execute a BEG
4300: 49 4e 20 45 58 43 4c 55 53 49 56 45 2e 20 49 66  IN EXCLUSIVE. If
4310: 20 74 68 69 73 20 69 73 20 6e 6f 74 0a 20 20 2a   this is not.  *
4320: 2a 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  * a WAL database
4330: 2c 20 74 68 69 73 20 69 73 20 61 6c 6c 20 77 65  , this is all we
4340: 20 6e 65 65 64 20 74 6f 20 64 6f 2e 20 20 0a 20   need to do.  . 
4350: 20 2a 2a 0a 20 20 2a 2a 20 41 20 77 72 61 70 70   **.  ** A wrapp
4360: 65 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  er function is u
4370: 73 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  sed to invoke th
4380: 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69  e busy-handler i
4390: 6e 73 74 65 61 64 20 6f 66 0a 20 20 2a 2a 20 72  nstead of.  ** r
43a0: 65 67 69 73 74 65 72 69 6e 67 20 74 68 65 20 62  egistering the b
43b0: 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy-handler func
43c0: 74 69 6f 6e 20 73 75 70 70 6c 69 65 64 20 62 79  tion supplied by
43d0: 20 74 68 65 20 75 73 65 72 20 64 69 72 65 63 74   the user direct
43e0: 6c 79 0a 20 20 2a 2a 20 77 69 74 68 20 53 51 4c  ly.  ** with SQL
43f0: 69 74 65 2e 20 54 68 69 73 20 69 73 20 62 65 63  ite. This is bec
4400: 61 75 73 65 20 74 68 65 20 73 61 6d 65 20 62 75  ause the same bu
4410: 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy-handler funct
4420: 69 6f 6e 20 6d 61 79 20 62 65 0a 20 20 2a 2a 20  ion may be.  ** 
4430: 69 6e 76 6f 6b 65 64 20 64 69 72 65 63 74 6c 79  invoked directly
4440: 20 6c 61 74 65 72 20 6f 6e 20 77 68 65 6e 20 61   later on when a
4450: 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 6f 62 74  ttempting to obt
4460: 61 69 6e 20 74 68 65 20 65 78 74 72 61 20 6c 6f  ain the extra lo
4470: 63 6b 73 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  cks.  ** require
4480: 64 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 42  d in WAL mode. B
4490: 79 20 75 73 69 6e 67 20 74 68 65 20 77 72 61 70  y using the wrap
44a0: 70 65 72 2c 20 77 65 20 61 72 65 20 61 62 6c 65  per, we are able
44b0: 20 74 6f 20 67 75 61 72 61 6e 74 65 65 0a 20 20   to guarantee.  
44c0: 2a 2a 20 74 68 61 74 20 74 68 65 20 22 6e 42 75  ** that the "nBu
44d0: 73 79 22 20 69 6e 74 65 67 65 72 20 70 61 72 61  sy" integer para
44e0: 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20  meter passed to 
44f0: 74 68 65 20 75 73 65 72 73 20 62 75 73 79 2d 68  the users busy-h
4500: 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 72 65 70 72  andler.  ** repr
4510: 65 73 65 6e 74 73 20 74 68 65 20 74 6f 74 61 6c  esents the total
4520: 20 6e 75 6d 62 65 72 20 6f 66 20 62 75 73 79 2d   number of busy-
4530: 68 61 6e 64 6c 65 72 20 69 6e 76 6f 63 61 74 69  handler invocati
4540: 6f 6e 73 20 6d 61 64 65 20 77 69 74 68 69 6e 0a  ons made within.
4550: 20 20 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 74    ** this call t
4560: 6f 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75  o sqlite3demo_su
4570: 70 65 72 6c 6f 63 6b 28 29 2c 20 69 6e 63 6c 75  perlock(), inclu
4580: 64 69 6e 67 20 61 6e 79 20 6d 61 64 65 20 64 75  ding any made du
4590: 72 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 22 42  ring the.  ** "B
45a0: 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 22 2e  EGIN EXCLUSIVE".
45b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
45c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
45d0: 20 62 75 73 79 2e 78 42 75 73 79 20 3d 20 78 42   busy.xBusy = xB
45e0: 75 73 79 3b 0a 20 20 20 20 62 75 73 79 2e 70 42  usy;.    busy.pB
45f0: 75 73 79 41 72 67 20 3d 20 70 42 75 73 79 41 72  usyArg = pBusyAr
4600: 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  g;.    sqlite3_b
4610: 75 73 79 5f 68 61 6e 64 6c 65 72 28 70 4c 6f 63  usy_handler(pLoc
4620: 6b 2d 3e 64 62 2c 20 73 75 70 65 72 6c 6f 63 6b  k->db, superlock
4630: 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 28 76 6f  BusyHandler, (vo
4640: 69 64 20 2a 29 26 62 75 73 79 29 3b 0a 20 20 20  id *)&busy);.   
4650: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
4660: 65 63 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20 22 42  ec(pLock->db, "B
4670: 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 22 2c  EGIN EXCLUSIVE",
4680: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a   0, 0, 0);.  }..
4690: 20 20 2f 2a 20 49 66 20 74 68 65 20 42 45 47 49    /* If the BEGI
46a0: 4e 20 45 58 43 4c 55 53 49 56 45 20 77 61 73 20  N EXCLUSIVE was 
46b0: 65 78 65 63 75 74 65 64 20 73 75 63 63 65 73 73  executed success
46c0: 66 75 6c 6c 79 20 61 6e 64 20 74 68 69 73 20 69  fully and this i
46d0: 73 20 61 20 57 41 4c 0a 20 20 2a 2a 20 64 61 74  s a WAL.  ** dat
46e0: 61 62 61 73 65 2c 20 63 61 6c 6c 20 73 75 70 65  abase, call supe
46f0: 72 6c 6f 63 6b 57 61 6c 4c 6f 63 6b 28 29 20 74  rlockWalLock() t
4700: 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 65 78 74  o obtain the ext
4710: 72 61 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65  ra locks require
4720: 64 0a 20 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e  d.  ** to preven
4730: 74 20 72 65 61 64 65 72 73 2c 20 77 72 69 74 65  t readers, write
4740: 72 73 20 61 6e 64 2f 6f 72 20 63 68 65 63 6b 70  rs and/or checkp
4750: 6f 69 6e 74 65 72 73 20 66 72 6f 6d 20 61 63 63  ointers from acc
4760: 65 73 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  essing the.  ** 
4770: 64 62 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  db while this pr
4780: 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
4790: 20 74 68 65 20 73 75 70 65 72 6c 6f 63 6b 2e 0a   the superlock..
47a0: 20 20 2a 2a 0a 20 20 2a 2a 20 42 65 66 6f 72 65    **.  ** Before
47b0: 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20   attempting any 
47c0: 57 41 4c 20 6c 6f 63 6b 73 2c 20 63 6f 6d 6d 69  WAL locks, commi
47d0: 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
47e0: 6e 20 73 74 61 72 74 65 64 20 61 62 6f 76 65 0a  n started above.
47f0: 20 20 2a 2a 20 74 6f 20 64 72 6f 70 20 74 68 65    ** to drop the
4800: 20 57 41 4c 20 72 65 61 64 20 61 6e 64 20 77 72   WAL read and wr
4810: 69 74 65 20 6c 6f 63 6b 73 20 63 75 72 72 65 6e  ite locks curren
4820: 74 6c 79 20 68 65 6c 64 2e 20 4f 74 68 65 72 77  tly held. Otherw
4830: 69 73 65 2c 20 74 68 65 0a 20 20 2a 2a 20 6e 65  ise, the.  ** ne
4840: 77 20 57 41 4c 20 6c 6f 63 6b 73 20 6d 61 79 20  w WAL locks may 
4850: 63 6f 6e 66 6c 69 63 74 20 77 69 74 68 20 74 68  conflict with th
4860: 65 20 6f 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  e old..  */.  if
4870: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4880: 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  ){.    if( SQLIT
4890: 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 75 70 65  E_OK==(rc = supe
48a0: 72 6c 6f 63 6b 49 73 57 61 6c 28 70 4c 6f 63 6b  rlockIsWal(pLock
48b0: 29 29 20 26 26 20 70 4c 6f 63 6b 2d 3e 62 57 61  )) && pLock->bWa
48c0: 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
48d0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 4c 6f  sqlite3_exec(pLo
48e0: 63 6b 2d 3e 64 62 2c 20 22 43 4f 4d 4d 49 54 22  ck->db, "COMMIT"
48f0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
4900: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4910: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
4920: 63 20 3d 20 73 75 70 65 72 6c 6f 63 6b 57 61 6c  c = superlockWal
4930: 4c 6f 63 6b 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20  Lock(pLock->db, 
4940: 26 62 75 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a  &busy);.      }.
4950: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
4960: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
4970: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 64 65 6d  {.    sqlite3dem
4980: 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 28 70 4c  o_superunlock(pL
4990: 6f 63 6b 29 3b 0a 20 20 20 20 2a 70 70 4c 6f 63  ock);.    *ppLoc
49a0: 6b 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  k = 0;.  }else{.
49b0: 20 20 20 20 2a 70 70 4c 6f 63 6b 20 3d 20 70 4c      *ppLock = pL
49c0: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ock;.  }..  retu
49d0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 41 20 63  rn rc;.}../* A c
49e0: 6f 72 72 75 70 74 20 44 42 20 77 6f 6e 27 74 20  orrupt DB won't 
49f0: 77 6f 72 6b 20 77 69 74 68 20 74 68 65 20 73 71  work with the sq
4a00: 6c 2d 62 61 73 65 64 20 6c 6f 63 6b 69 6e 67 20  l-based locking 
4a10: 61 74 74 65 6d 70 74 2c 20 67 72 61 62 20 61 6e  attempt, grab an
4a20: 20 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c   .** exclusive l
4a30: 6f 63 6b 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ock and return S
4a40: 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49  QLITE_OK or SQLI
4a50: 54 45 5f 42 55 53 59 20 69 66 20 74 68 65 20 6c  TE_BUSY if the l
4a60: 6f 63 6b 20 66 61 69 6c 73 20 0a 2a 2a 20 72 65  ock fails .** re
4a70: 74 75 72 6e 73 20 74 68 65 20 63 75 72 72 65 6e  turns the curren
4a80: 74 20 6c 6f 63 6b 20 6c 65 76 65 6c 20 68 65 6c  t lock level hel
4a90: 64 20 6f 6e 20 73 71 6c 69 74 65 33 5f 66 69 6c  d on sqlite3_fil
4aa0: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
4ab0: 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65  sqlite3demo_supe
4ac0: 72 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 0a 20  rlock_corrupt(. 
4ad0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
4ae0: 64 2c 0a 20 20 69 6e 74 20 65 54 61 72 67 65 74  d,.  int eTarget
4af0: 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 69 6e 74 20  FileLock,.  int 
4b00: 2a 70 46 69 6c 65 4c 6f 63 6b 0a 29 7b 0a 20 20  *pFileLock.){.  
4b10: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
4b20: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
4b30: 0a 20 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  .  int eFileLock
4b40: 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c   = pFile->eFileL
4b50: 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ock;.  int rc = 
4b60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20  SQLITE_OK;.  .  
4b70: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 65 54  if( eFileLock<eT
4b80: 61 72 67 65 74 46 69 6c 65 4c 6f 63 6b 20 29 7b  argetFileLock ){
4b90: 0a 20 20 20 20 72 63 20 3d 20 70 46 69 6c 65 2d  .    rc = pFile-
4ba0: 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28  >pMethod->xLock(
4bb0: 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  id, SQLITE_LOCK_
4bc0: 53 48 41 52 45 44 29 3b 0a 20 20 7d 0a 20 20 69  SHARED);.  }.  i
4bd0: 66 28 20 21 72 63 20 26 26 20 53 51 4c 49 54 45  f( !rc && SQLITE
4be0: 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 3c 65 54 61  _LOCK_SHARED<eTa
4bf0: 72 67 65 74 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  rgetFileLock ){.
4c00: 20 20 20 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e      rc = pFile->
4c10: 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 69  pMethod->xLock(i
4c20: 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45  d, SQLITE_LOCK_E
4c30: 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 7d 0a 20  XCLUSIVE);.  }. 
4c40: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69   if( rc ){.    i
4c50: 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
4c60: 6f 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63 6b 20  ock > eFileLock 
4c70: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
4c80: 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b  pMethod->xUnlock
4c90: 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 29 3b  (id, eFileLock);
4ca0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
4cb0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 20 28  n rc;.  }.  if (
4cc0: 70 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 20  pFileLock) {.   
4cd0: 20 2a 70 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46   *pFileLock = eF
4ce0: 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72  ileLock;.  }.  r
4cf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
4d00: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .}..static int s
4d10: 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72  qlite3demo_super
4d20: 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 73  unlock_corrupt(s
4d30: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
4d40: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
4d50: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
4d60: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
4d70: 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  )id;.  int rc = 
4d80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20  SQLITE_OK;.  .  
4d90: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
4da0: 4c 6f 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63 6b  Lock > eFileLock
4db0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 46 69   ){.    rc = pFi
4dc0: 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e  le->pMethod->xUn
4dd0: 6c 6f 63 6b 28 69 64 2c 20 53 51 4c 49 54 45 5f  lock(id, SQLITE_
4de0: 4c 4f 43 4b 5f 53 48 41 52 45 44 29 3b 0a 20 20  LOCK_SHARED);.  
4df0: 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  }.  if( pFile->e
4e00: 46 69 6c 65 4c 6f 63 6b 20 3e 20 65 46 69 6c 65  FileLock > eFile
4e10: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20  Lock ){.    int 
4e20: 75 6e 6c 6f 63 6b 52 43 20 3d 20 70 46 69 6c 65  unlockRC = pFile
4e30: 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
4e40: 63 6b 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f  ck(id, SQLITE_LO
4e50: 43 4b 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 69 66  CK_NONE);.    if
4e60: 20 28 21 72 63 29 20 72 63 20 3d 20 75 6e 6c 6f   (!rc) rc = unlo
4e70: 63 6b 52 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ckRC;.  }.  retu
4e80: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66  rn rc;.}..#endif
4e90: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
4ea0: 45 5f 53 55 50 45 52 4c 4f 43 4b 20 2a 2f 0a 0a  E_SUPERLOCK */..
4eb0: 0a 2f 2a 0a 2a 2a 20 48 41 56 45 5f 4d 52 45 4d  ./*.** HAVE_MREM
4ec0: 41 50 20 64 65 66 61 75 6c 74 73 20 74 6f 20 74  AP defaults to t
4ed0: 72 75 65 20 6f 6e 20 4c 69 6e 75 78 20 61 6e 64  rue on Linux and
4ee0: 20 66 61 6c 73 65 20 65 76 65 72 79 77 68 65 72   false everywher
4ef0: 65 20 65 6c 73 65 2e 0a 2a 2f 0a 23 69 66 20 21  e else..*/.#if !
4f00: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 4d 52 45  defined(HAVE_MRE
4f10: 4d 41 50 29 0a 23 20 69 66 20 64 65 66 69 6e 65  MAP).# if define
4f20: 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20  d(__linux__) && 
4f30: 64 65 66 69 6e 65 64 28 5f 47 4e 55 5f 53 4f 55  defined(_GNU_SOU
4f40: 52 43 45 29 0a 23 20 20 64 65 66 69 6e 65 20 48  RCE).#  define H
4f50: 41 56 45 5f 4d 52 45 4d 41 50 20 31 0a 23 20 65  AVE_MREMAP 1.# e
4f60: 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 48 41  lse.#  define HA
4f70: 56 45 5f 4d 52 45 4d 41 50 20 30 0a 23 20 65 6e  VE_MREMAP 0.# en
4f80: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  dif.#endif../*.*
4f90: 2a 20 45 78 70 6c 69 63 69 74 6c 79 20 63 61 6c  * Explicitly cal
4fa0: 6c 20 74 68 65 20 36 34 2d 62 69 74 20 76 65 72  l the 64-bit ver
4fb0: 73 69 6f 6e 20 6f 66 20 6c 73 65 65 6b 28 29 20  sion of lseek() 
4fc0: 6f 6e 20 41 6e 64 72 6f 69 64 2e 20 4f 74 68 65  on Android. Othe
4fd0: 72 77 69 73 65 2c 20 6c 73 65 65 6b 28 29 0a 2a  rwise, lseek().*
4fe0: 2a 20 69 73 20 74 68 65 20 33 32 2d 62 69 74 20  * is the 32-bit 
4ff0: 76 65 72 73 69 6f 6e 2c 20 65 76 65 6e 20 69 66  version, even if
5000: 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49   _FILE_OFFSET_BI
5010: 54 53 3d 36 34 20 69 73 20 64 65 66 69 6e 65 64  TS=64 is defined
5020: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 41 4e  ..*/.#ifdef __AN
5030: 44 52 4f 49 44 5f 5f 0a 23 20 64 65 66 69 6e 65  DROID__.# define
5040: 20 6c 73 65 65 6b 20 6c 73 65 65 6b 36 34 0a 23   lseek lseek64.#
5050: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 66  endif../*.** Dif
5060: 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79 73 74  ferent Unix syst
5070: 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70 65 6e  ems declare open
5080: 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20  () in different 
5090: 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73 65 0a  ways.  Same use.
50a0: 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  ** open(const ch
50b0: 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e  ar*,int,mode_t).
50c0: 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f 70 65    Others use ope
50d0: 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  n(const char*,in
50e0: 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20 64  t,...)..** The d
50f0: 69 66 66 65 72 65 6e 63 65 20 69 73 20 69 6d 70  ifference is imp
5100: 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73 69 6e  ortant when usin
5110: 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  g a pointer to t
5120: 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  he function..**.
5130: 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20 77 61  ** The safest wa
5140: 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74  y to deal with t
5150: 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 6f  he problem is to
5160: 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 69 73   always use this
5170: 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68 69 63   wrapper.** whic
5180: 68 20 61 6c 77 61 79 73 20 68 61 73 20 74 68 65  h always has the
5190: 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69 6e   same well-defin
51a0: 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  ed interface..*/
51b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69  .static int posi
51c0: 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  xOpen(const char
51d0: 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61   *zFile, int fla
51e0: 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a 20  gs, int mode){. 
51f0: 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46 69   return open(zFi
5200: 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65 29  le, flags, mode)
5210: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f  ;.}../*.** On so
5220: 6d 65 20 73 79 73 74 65 6d 73 2c 20 63 61 6c 6c  me systems, call
5230: 73 20 74 6f 20 66 63 68 6f 77 6e 28 29 20 77 69  s to fchown() wi
5240: 6c 6c 20 74 72 69 67 67 65 72 20 61 20 6d 65 73  ll trigger a mes
5250: 73 61 67 65 20 69 6e 20 61 20 73 65 63 75 72 69  sage in a securi
5260: 74 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74 68 65  ty.** log if the
5270: 79 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f 6e 2d  y come from non-
5280: 72 6f 6f 74 20 70 72 6f 63 65 73 73 65 73 2e 20  root processes. 
5290: 20 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c 69 6e   So avoid callin
52a0: 67 20 66 63 68 6f 77 6e 28 29 20 69 66 0a 2a 2a  g fchown() if.**
52b0: 20 77 65 20 61 72 65 20 6e 6f 74 20 72 75 6e 6e   we are not runn
52c0: 69 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a 2f 0a  ing as root..*/.
52d0: 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78  static int posix
52e0: 46 63 68 6f 77 6e 28 69 6e 74 20 66 64 2c 20 75  Fchown(int fd, u
52f0: 69 64 5f 74 20 75 69 64 2c 20 67 69 64 5f 74 20  id_t uid, gid_t 
5300: 67 69 64 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  gid){.#if OS_VXW
5310: 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 30 3b  ORKS.  return 0;
5320: 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
5330: 67 65 74 65 75 69 64 28 29 20 3f 20 30 20 3a 20  geteuid() ? 0 : 
5340: 66 63 68 6f 77 6e 28 66 64 2c 75 69 64 2c 67 69  fchown(fd,uid,gi
5350: 64 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  d);.#endif.}../*
5360: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
5370: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ce */.static int
5380: 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63   openDirectory(c
5390: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 2a  onst char*, int*
53a0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  );.static int un
53b0: 69 78 47 65 74 70 61 67 65 73 69 7a 65 28 76 6f  ixGetpagesize(vo
53c0: 69 64 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79  id);../*.** Many
53d0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72   system calls ar
53e0: 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f 75  e accessed throu
53f0: 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75  gh pointer-to-fu
5400: 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a  nctions so that.
5410: 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f  ** they may be o
5420: 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e  verridden at run
5430: 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61  time to facilita
5440: 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69  te fault injecti
5450: 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73  on during.** tes
5460: 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78  ting and sandbox
5470: 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ing.  The follow
5480: 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20  ing array holds 
5490: 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f  the names and po
54a0: 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c  inters.** to all
54b0: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
54c0: 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73  stem calls..*/.s
54d0: 74 61 74 69 63 20 73 74 72 75 63 74 20 75 6e 69  tatic struct uni
54e0: 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f  x_syscall {.  co
54f0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
5500: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5510: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  ame of the syste
5520: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
5530: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
5540: 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72  pCurrent; /* Cur
5550: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68  rent value of th
5560: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
5570: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
5580: 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b  ll_ptr pDefault;
5590: 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75   /* Default valu
55a0: 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b  e */.} aSyscall[
55b0: 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70 65 6e 22  ] = {.  { "open"
55c0: 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ,         (sqlit
55d0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
55e0: 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20 20 7d 2c  osixOpen,  0  },
55f0: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 20  .#define osOpen 
5600: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
5610: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 69 6e  nst char*,int,in
5620: 74 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70  t))aSyscall[0].p
5630: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 63  Current)..  { "c
5640: 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 28 73  lose",        (s
5650: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
5660: 74 72 29 63 6c 6f 73 65 2c 20 20 20 20 20 20 30  tr)close,      0
5670: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 43    },.#define osC
5680: 6c 6f 73 65 20 20 20 20 20 28 28 69 6e 74 28 2a  lose     ((int(*
5690: 29 28 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b  )(int))aSyscall[
56a0: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  1].pCurrent)..  
56b0: 7b 20 22 61 63 63 65 73 73 22 2c 20 20 20 20 20  { "access",     
56c0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
56d0: 6c 6c 5f 70 74 72 29 61 63 63 65 73 73 2c 20 20  ll_ptr)access,  
56e0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
56f0: 20 6f 73 41 63 63 65 73 73 20 20 20 20 28 28 69   osAccess    ((i
5700: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
5710: 2a 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b  *,int))aSyscall[
5720: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
5730: 7b 20 22 67 65 74 63 77 64 22 2c 20 20 20 20 20  { "getcwd",     
5740: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
5750: 6c 6c 5f 70 74 72 29 67 65 74 63 77 64 2c 20 20  ll_ptr)getcwd,  
5760: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
5770: 20 6f 73 47 65 74 63 77 64 20 20 20 20 28 28 63   osGetcwd    ((c
5780: 68 61 72 2a 28 2a 29 28 63 68 61 72 2a 2c 73 69  har*(*)(char*,si
5790: 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 33  ze_t))aSyscall[3
57a0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
57b0: 20 22 73 74 61 74 22 2c 20 20 20 20 20 20 20 20   "stat",        
57c0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
57d0: 6c 5f 70 74 72 29 73 74 61 74 2c 20 20 20 20 20  l_ptr)stat,     
57e0: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
57f0: 6f 73 53 74 61 74 20 20 20 20 20 20 28 28 69 6e  osStat      ((in
5800: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
5810: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
5820: 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72  Syscall[4].pCurr
5830: 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ent)../*.** The 
5840: 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65  DJGPP compiler e
5850: 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73  nvironment looks
5860: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69   mostly like Uni
5870: 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63  x, but it.** lac
5880: 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73  ks the fcntl() s
5890: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20  ystem call.  So 
58a0: 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29  redefine fcntl()
58b0: 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
58c0: 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20  .** that always 
58d0: 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73 20  succeeds.  This 
58e0: 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69  means that locki
58f0: 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  ng does not occu
5900: 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50  r under.** DJGPP
5910: 2e 20 20 42 75 74 20 69 74 20 69 73 20 44 4f 53  .  But it is DOS
5920: 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 20   - what did you 
5930: 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65  expect?.*/.#ifde
5940: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 7b 20  f __DJGPP__.  { 
5950: 22 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20  "fstat",        
5960: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5970: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
5980: 20 6f 73 46 73 74 61 74 28 61 2c 62 2c 63 29 20   osFstat(a,b,c) 
5990: 20 20 20 30 0a 23 65 6c 73 65 20 20 20 20 20 0a     0.#else     .
59a0: 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20    { "fstat",    
59b0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
59c0: 63 61 6c 6c 5f 70 74 72 29 66 73 74 61 74 2c 20  call_ptr)fstat, 
59d0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
59e0: 6e 65 20 6f 73 46 73 74 61 74 20 20 20 20 20 28  ne osFstat     (
59f0: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73 74 72 75  (int(*)(int,stru
5a00: 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61  ct stat*))aSysca
5a10: 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[5].pCurrent).
5a20: 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 66 74 72  #endif..  { "ftr
5a30: 75 6e 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c  uncate",    (sql
5a40: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
5a50: 29 66 74 72 75 6e 63 61 74 65 2c 20 20 30 20 20  )ftruncate,  0  
5a60: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 74 72  },.#define osFtr
5a70: 75 6e 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28  uncate ((int(*)(
5a80: 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63  int,off_t))aSysc
5a90: 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29  all[6].pCurrent)
5aa0: 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22 2c 20 20  ..  { "fcntl",  
5ab0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
5ac0: 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 6e 74 6c  yscall_ptr)fcntl
5ad0: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
5ae0: 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 20 20 20  fine osFcntl    
5af0: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69 6e   ((int(*)(int,in
5b00: 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b  t,...))aSyscall[
5b10: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  7].pCurrent)..  
5b20: 7b 20 22 72 65 61 64 22 2c 20 20 20 20 20 20 20  { "read",       
5b30: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
5b40: 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20 20 20 20  ll_ptr)read,    
5b50: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
5b60: 20 6f 73 52 65 61 64 20 20 20 20 20 20 28 28 73   osRead      ((s
5b70: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f  size_t(*)(int,vo
5b80: 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73  id*,size_t))aSys
5b90: 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74  call[8].pCurrent
5ba0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  )..#if defined(U
5bb0: 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 28 53 51  SE_PREAD) || (SQ
5bc0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
5bd0: 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53  ING_STYLE && !OS
5be0: 5f 56 58 57 4f 52 4b 53 29 0a 20 20 7b 20 22 70  _VXWORKS).  { "p
5bf0: 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73  read",        (s
5c00: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
5c10: 74 72 29 70 72 65 61 64 2c 20 20 20 20 20 20 30  tr)pread,      0
5c20: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
5c30: 70 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28  pread",        (
5c40: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5c50: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
5c60: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
5c70: 66 69 6e 65 20 6f 73 50 72 65 61 64 20 20 20 20  fine osPread    
5c80: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
5c90: 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t,void*,size_t,o
5ca0: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 39  ff_t))aSyscall[9
5cb0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5cc0: 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
5cd0: 41 44 36 34 29 0a 20 20 7b 20 22 70 72 65 61 64  AD64).  { "pread
5ce0: 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74  64",      (sqlit
5cf0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
5d00: 72 65 61 64 36 34 2c 20 20 20 20 30 20 20 7d 2c  read64,    0  },
5d10: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61  .#else.  { "prea
5d20: 64 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69  d64",      (sqli
5d30: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
5d40: 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  0,          0  }
5d50: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
5d60: 20 6f 73 50 72 65 61 64 36 34 20 20 20 28 28 73   osPread64   ((s
5d70: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f  size_t(*)(int,vo
5d80: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
5d90: 29 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70  ))aSyscall[10].p
5da0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 77  Current)..  { "w
5db0: 72 69 74 65 22 2c 20 20 20 20 20 20 20 20 28 73  rite",        (s
5dc0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
5dd0: 74 72 29 77 72 69 74 65 2c 20 20 20 20 20 20 30  tr)write,      0
5de0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 57    },.#define osW
5df0: 72 69 74 65 20 20 20 20 20 28 28 73 73 69 7a 65  rite     ((ssize
5e00: 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20  _t(*)(int,const 
5e10: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53  void*,size_t))aS
5e20: 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72  yscall[11].pCurr
5e30: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
5e40: 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20  d(USE_PREAD) || 
5e50: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c  (SQLITE_ENABLE_L
5e60: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
5e70: 21 4f 53 5f 56 58 57 4f 52 4b 53 29 0a 20 20 7b  !OS_VXWORKS).  {
5e80: 20 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20   "pwrite",      
5e90: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
5ea0: 6c 5f 70 74 72 29 70 77 72 69 74 65 2c 20 20 20  l_ptr)pwrite,   
5eb0: 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20    0  },.#else.  
5ec0: 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20 20 20  { "pwrite",     
5ed0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
5ee0: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
5ef0: 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a     0  },.#endif.
5f00: 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65  #define osPwrite
5f10: 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29      ((ssize_t(*)
5f20: 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  (int,const void*
5f30: 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c  ,size_t,off_t))\
5f40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5f50: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 32       aSyscall[12
5f60: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5f70: 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
5f80: 41 44 36 34 29 0a 20 20 7b 20 22 70 77 72 69 74  AD64).  { "pwrit
5f90: 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74  e64",     (sqlit
5fa0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
5fb0: 77 72 69 74 65 36 34 2c 20 20 20 30 20 20 7d 2c  write64,   0  },
5fc0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69  .#else.  { "pwri
5fd0: 74 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69  te64",     (sqli
5fe0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
5ff0: 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  0,          0  }
6000: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
6010: 20 6f 73 50 77 72 69 74 65 36 34 20 20 28 28 73   osPwrite64  ((s
6020: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f  size_t(*)(int,co
6030: 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  nst void*,size_t
6040: 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20  ,off_t))\.      
6050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
6060: 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72  yscall[13].pCurr
6070: 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 68 6d 6f  ent)..  { "fchmo
6080: 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  d",       (sqlit
6090: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66  e3_syscall_ptr)f
60a0: 63 68 6d 6f 64 2c 20 20 20 20 20 30 20 20 7d 2c  chmod,     0  },
60b0: 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f  .#define osFchmo
60c0: 64 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e  d    ((int(*)(in
60d0: 74 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61  t,mode_t))aSysca
60e0: 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[14].pCurrent)
60f0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  ..#if defined(HA
6100: 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
6110: 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49  TE) && HAVE_POSI
6120: 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20  X_FALLOCATE.  { 
6130: 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20  "fallocate",    
6140: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
6150: 5f 70 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f  _ptr)posix_fallo
6160: 63 61 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73  cate,  0 },.#els
6170: 65 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65  e.  { "fallocate
6180: 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ",    (sqlite3_s
6190: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
61a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
61b0: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
61c0: 20 6f 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69   osFallocate ((i
61d0: 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c  nt(*)(int,off_t,
61e0: 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  off_t))aSyscall[
61f0: 31 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  15].pCurrent).. 
6200: 20 7b 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20   { "unlink",    
6210: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
6220: 61 6c 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20  all_ptr)unlink, 
6230: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6240: 64 65 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20  define osUnlink 
6250: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
6260: 74 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c  t char*))aSyscal
6270: 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[16].pCurrent).
6280: 0a 20 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74  .  { "openDirect
6290: 6f 72 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65  ory",    (sqlite
62a0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70  3_syscall_ptr)op
62b0: 65 6e 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20  enDirectory,    
62c0: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
62d0: 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28  sOpenDirectory (
62e0: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
62f0: 61 72 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61  ar*,int*))aSysca
6300: 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[17].pCurrent)
6310: 0a 0a 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20  ..  { "mkdir",  
6320: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
6330: 79 73 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72  yscall_ptr)mkdir
6340: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
6350: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72  .#define osMkdir
6360: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
6370: 6e 73 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74  nst char*,mode_t
6380: 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70  ))aSyscall[18].p
6390: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72  Current)..  { "r
63a0: 6d 64 69 72 22 2c 20 20 20 20 20 20 20 20 28 73  mdir",        (s
63b0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
63c0: 74 72 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20  tr)rmdir,       
63d0: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
63e0: 20 6f 73 52 6d 64 69 72 20 20 20 20 20 28 28 69   osRmdir     ((i
63f0: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
6400: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e  *))aSyscall[19].
6410: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
6420: 66 63 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28  fchown",       (
6430: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
6440: 70 74 72 29 70 6f 73 69 78 46 63 68 6f 77 6e 2c  ptr)posixFchown,
6450: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
6460: 65 20 6f 73 46 63 68 6f 77 6e 20 20 20 20 28 28  e osFchown    ((
6470: 69 6e 74 28 2a 29 28 69 6e 74 2c 75 69 64 5f 74  int(*)(int,uid_t
6480: 2c 67 69 64 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,gid_t))aSyscall
6490: 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [20].pCurrent)..
64a0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
64b0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
64c0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
64d0: 5f 53 49 5a 45 3e 30 0a 20 20 7b 20 22 6d 6d 61  _SIZE>0.  { "mma
64e0: 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  p",       (sqlit
64f0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d  e3_syscall_ptr)m
6500: 6d 61 70 2c 20 20 20 20 20 30 20 7d 2c 0a 23 64  map,     0 },.#d
6510: 65 66 69 6e 65 20 6f 73 4d 6d 61 70 20 28 28 76  efine osMmap ((v
6520: 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69  oid*(*)(void*,si
6530: 7a 65 5f 74 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74  ze_t,int,int,int
6540: 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,off_t))aSyscall
6550: 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [21].pCurrent)..
6560: 20 20 7b 20 22 6d 75 6e 6d 61 70 22 2c 20 20 20    { "munmap",   
6570: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
6580: 63 61 6c 6c 5f 70 74 72 29 6d 75 6e 6d 61 70 2c  call_ptr)munmap,
6590: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
65a0: 64 65 66 69 6e 65 20 6f 73 4d 75 6e 6d 61 70 20  define osMunmap 
65b0: 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a  ((void*(*)(void*
65c0: 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c  ,size_t))aSyscal
65d0: 6c 5b 32 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[22].pCurrent).
65e0: 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50  .#if HAVE_MREMAP
65f0: 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20  .  { "mremap",  
6600: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
6610: 73 63 61 6c 6c 5f 70 74 72 29 6d 72 65 6d 61 70  scall_ptr)mremap
6620: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
6630: 23 65 6c 73 65 0a 20 20 7b 20 22 6d 72 65 6d 61  #else.  { "mrema
6640: 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  p",       (sqlit
6650: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
6660: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6670: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66  0 },.#endif.#def
6680: 69 6e 65 20 6f 73 4d 72 65 6d 61 70 20 28 28 76  ine osMremap ((v
6690: 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69  oid*(*)(void*,si
66a0: 7a 65 5f 74 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c  ze_t,size_t,int,
66b0: 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b 32 33  ...))aSyscall[23
66c0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 20 20 7b 20  ].pCurrent).  { 
66d0: 22 67 65 74 70 61 67 65 73 69 7a 65 22 2c 20 20  "getpagesize",  
66e0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
66f0: 5f 70 74 72 29 75 6e 69 78 47 65 74 70 61 67 65  _ptr)unixGetpage
6700: 73 69 7a 65 2c 20 30 20 7d 2c 0a 23 64 65 66 69  size, 0 },.#defi
6710: 6e 65 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65  ne osGetpagesize
6720: 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 29 29   ((int(*)(void))
6730: 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75  aSyscall[24].pCu
6740: 72 72 65 6e 74 29 0a 0a 23 65 6e 64 69 66 0a 0a  rrent)..#endif..
6750: 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65  }; /* End of the
6760: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
6770: 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f  stem calls */../
6780: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
6790: 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28   xSetSystemCall(
67a0: 29 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69  ) method of sqli
67b0: 74 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20  te3_vfs for all 
67c0: 6f 66 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22  of the.** "unix"
67d0: 20 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20   VFSes.  Return 
67e0: 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73  SQLITE_OK opon s
67f0: 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61  uccessfully upda
6800: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74  ting the.** syst
6810: 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c  em call pointer,
6820: 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   or SQLITE_NOTFO
6830: 55 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20  UND if there is 
6840: 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a  no configurable.
6850: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ** system call n
6860: 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73  amed zName..*/.s
6870: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65  tatic int unixSe
6880: 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73  tSystemCall(.  s
6890: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74  qlite3_vfs *pNot
68a0: 55 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20  Used,        /* 
68b0: 54 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e  The VFS pointer.
68c0: 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20    Not used */.  
68d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
68e0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
68f0: 20 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20   Name of system 
6900: 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65  call to override
6910: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
6920: 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75  scall_ptr pNewFu
6930: 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  nc  /* Pointer t
6940: 6f 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c  o new system cal
6950: 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20  l value */.){.  
6960: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
6970: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
6980: 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55  E_NOTFOUND;..  U
6990: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
69a0: 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  pNotUsed);.  if(
69b0: 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
69c0: 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20   /* If no zName 
69d0: 69 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72  is given, restor
69e0: 65 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c  e all system cal
69f0: 6c 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61  ls to their defa
6a00: 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69  ult.    ** setti
6a10: 6e 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ngs and return N
6a20: 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ULL.    */.    r
6a30: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6a40: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
6a50: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
6a60: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
6a70: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
6a80: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
6a90: 70 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20  pDefault ){.    
6aa0: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e      aSyscall[i].
6ab0: 70 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63  pCurrent = aSysc
6ac0: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b  all[i].pDefault;
6ad0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6ae0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
6af0: 66 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69  f zName is speci
6b00: 66 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e  fied, operate on
6b10: 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79   only the one sy
6b20: 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  stem call.    **
6b30: 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20   specified..    
6b40: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
6b50: 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  i<sizeof(aSyscal
6b60: 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61  l)/sizeof(aSysca
6b70: 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ll[0]); i++){.  
6b80: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
6b90: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69  Name, aSyscall[i
6ba0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
6bb0: 20 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63         if( aSysc
6bc0: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d  all[i].pDefault=
6bd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6be0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
6bf0: 61 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b  ault = aSyscall[
6c00: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20  i].pCurrent;.   
6c10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
6c20: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6c30: 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46         if( pNewF
6c40: 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e  unc==0 ) pNewFun
6c50: 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  c = aSyscall[i].
6c60: 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20  pDefault;.      
6c70: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43    aSyscall[i].pC
6c80: 75 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e  urrent = pNewFun
6c90: 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  c;.        break
6ca0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6cb0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6cc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6cd0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
6ce0: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65  system call.  Re
6cf0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61  turn NULL if zNa
6d00: 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72  me is not a.** r
6d10: 65 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d  ecognized system
6d20: 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c   call name.  NUL
6d30: 4c 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  L is also return
6d40: 65 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d  ed if the system
6d50: 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72   call.** is curr
6d60: 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e  ently undefined.
6d70: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
6d80: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 75  e3_syscall_ptr u
6d90: 6e 69 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  nixGetSystemCall
6da0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
6db0: 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e  *pNotUsed,.  con
6dc0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29  st char *zName.)
6dd0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
6de0: 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41   i;..  UNUSED_PA
6df0: 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64  RAMETER(pNotUsed
6e00: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
6e10: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
6e20: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
6e30: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
6e40: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
6e50: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
6e60: 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ame)==0 ) return
6e70: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
6e80: 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74  rrent;.  }.  ret
6e90: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
6ea0: 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
6eb0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73  of the first sys
6ec0: 74 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a  tem call after z
6ed0: 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d  Name.  If zName=
6ee0: 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65  =NULL.** then re
6ef0: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
6f00: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
6f10: 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20  m call.  Return 
6f20: 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a  NULL if zName.**
6f30: 20 69 73 20 74 68 65 20 6c 61 73 74 20 73 79 73   is the last sys
6f40: 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a  tem call or if z
6f50: 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20  Name is not the 
6f60: 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a  name of a valid.
6f70: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a  ** system call..
6f80: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
6f90: 63 68 61 72 20 2a 75 6e 69 78 4e 65 78 74 53 79  char *unixNextSy
6fa0: 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33  stemCall(sqlite3
6fb0: 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63  _vfs *p, const c
6fc0: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
6fd0: 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e  nt i = -1;..  UN
6fe0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
6ff0: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  );.  if( zName )
7000: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
7010: 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63  <ArraySize(aSysc
7020: 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  all)-1; i++){.  
7030: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
7040: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69  Name, aSyscall[i
7050: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ].zName)==0 ) br
7060: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
7070: 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61   for(i++; i<Arra
7080: 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b  ySize(aSyscall);
7090: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
70a0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
70b0: 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20  ent!=0 ) return 
70c0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
70d0: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
70e0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e  0;.}../*.** Do n
70f0: 6f 74 20 61 63 63 65 70 74 20 61 6e 79 20 66 69  ot accept any fi
7100: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6c 65  le descriptor le
7110: 73 73 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c  ss than this val
7120: 75 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ue, in order to 
7130: 61 76 6f 69 64 0a 2a 2a 20 6f 70 65 6e 69 6e 67  avoid.** opening
7140: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
7150: 73 69 6e 67 20 66 69 6c 65 20 64 65 73 63 72 69  sing file descri
7160: 70 74 6f 72 73 20 74 68 61 74 20 61 72 65 20 63  ptors that are c
7170: 6f 6d 6d 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  ommonly used for
7180: 20 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e   .** standard in
7190: 70 75 74 2c 20 6f 75 74 70 75 74 2c 20 61 6e 64  put, output, and
71a0: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64   error..*/.#ifnd
71b0: 65 66 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55  ef SQLITE_MINIMU
71c0: 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f  M_FILE_DESCRIPTO
71d0: 52 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  R.# define SQLIT
71e0: 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44  E_MINIMUM_FILE_D
71f0: 45 53 43 52 49 50 54 4f 52 20 33 0a 23 65 6e 64  ESCRIPTOR 3.#end
7200: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  if../*.** Invoke
7210: 20 6f 70 65 6e 28 29 2e 20 20 44 6f 20 73 6f 20   open().  Do so 
7220: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c 20  multiple times, 
7230: 75 6e 74 69 6c 20 69 74 20 65 69 74 68 65 72 20  until it either 
7240: 73 75 63 63 65 65 64 73 20 6f 72 0a 2a 2a 20 66  succeeds or.** f
7250: 61 69 6c 73 20 66 6f 72 20 73 6f 6d 65 20 72 65  ails for some re
7260: 61 73 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  ason other than 
7270: 45 49 4e 54 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  EINTR..**.** If 
7280: 74 68 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f  the file creatio
7290: 6e 20 6d 6f 64 65 20 22 6d 22 20 69 73 20 30 20  n mode "m" is 0 
72a0: 74 68 65 6e 20 73 65 74 20 69 74 20 74 6f 20 74  then set it to t
72b0: 68 65 20 64 65 66 61 75 6c 74 20 66 6f 72 0a 2a  he default for.*
72c0: 2a 20 53 51 4c 69 74 65 2e 20 20 54 68 65 20 64  * SQLite.  The d
72d0: 65 66 61 75 6c 74 20 69 73 20 53 51 4c 49 54 45  efault is SQLITE
72e0: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
72f0: 52 4d 49 53 53 49 4f 4e 53 20 28 6e 6f 72 6d 61  RMISSIONS (norma
7300: 6c 6c 79 0a 2a 2a 20 30 36 34 34 29 20 61 73 20  lly.** 0644) as 
7310: 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65 20  modified by the 
7320: 73 79 73 74 65 6d 20 75 6d 61 73 6b 2e 20 20 49  system umask.  I
7330: 66 20 6d 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  f m is not 0, th
7340: 65 6e 0a 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66  en.** make the f
7350: 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64  ile creation mod
7360: 65 20 62 65 20 65 78 61 63 74 6c 79 20 6d 20 69  e be exactly m i
7370: 67 6e 6f 72 69 6e 67 20 74 68 65 20 75 6d 61 73  gnoring the umas
7380: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 20 70  k..**.** The m p
7390: 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 20 62 65  arameter will be
73a0: 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77   non-zero only w
73b0: 68 65 6e 20 63 72 65 61 74 69 6e 67 20 2d 77 61  hen creating -wa
73c0: 6c 2c 20 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20  l, -journal,.** 
73d0: 61 6e 64 20 2d 73 68 6d 20 66 69 6c 65 73 2e 20  and -shm files. 
73e0: 20 57 65 20 77 61 6e 74 20 74 68 6f 73 65 20 66   We want those f
73f0: 69 6c 65 73 20 74 6f 20 68 61 76 65 20 2a 65 78  iles to have *ex
7400: 61 63 74 6c 79 2a 20 74 68 65 20 73 61 6d 65 0a  actly* the same.
7410: 2a 2a 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 61  ** permissions a
7420: 73 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c  s their original
7430: 20 64 61 74 61 62 61 73 65 2c 20 75 6e 61 64 75   database, unadu
7440: 6c 74 65 72 61 74 65 64 20 62 79 20 74 68 65 20  lterated by the 
7450: 75 6d 61 73 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61  umask..** In tha
7460: 74 20 77 61 79 2c 20 69 66 20 61 20 64 61 74 61  t way, if a data
7470: 62 61 73 65 20 66 69 6c 65 20 69 73 20 2d 72 77  base file is -rw
7480: 2d 72 77 2d 72 77 20 6f 72 20 2d 72 77 2d 72 77  -rw-rw or -rw-rw
7490: 2d 72 2d 2c 20 61 6e 64 20 61 0a 2a 2a 20 74 72  -r-, and a.** tr
74a0: 61 6e 73 61 63 74 69 6f 6e 20 63 72 61 73 68 65  ansaction crashe
74b0: 73 20 61 6e 64 20 6c 65 61 76 65 73 20 62 65 68  s and leaves beh
74c0: 69 6e 64 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73  ind hot journals
74d0: 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 70 72  , then any.** pr
74e0: 6f 63 65 73 73 20 74 68 61 74 20 69 73 20 61 62  ocess that is ab
74f0: 6c 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  le to write to t
7500: 68 65 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c  he database will
7510: 20 61 6c 73 6f 20 62 65 20 61 62 6c 65 20 74 6f   also be able to
7520: 0a 2a 2a 20 72 65 63 6f 76 65 72 20 74 68 65 20  .** recover the 
7530: 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f  hot journals..*/
7540: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75  .static int robu
7550: 73 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  st_open(const ch
7560: 61 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f  ar *z, int f, mo
7570: 64 65 5f 74 20 6d 29 7b 0a 20 20 69 6e 74 20 66  de_t m){.  int f
7580: 64 3b 0a 20 20 6d 6f 64 65 5f 74 20 6d 32 20 3d  d;.  mode_t m2 =
7590: 20 6d 20 3f 20 6d 20 3a 20 53 51 4c 49 54 45 5f   m ? m : SQLITE_
75a0: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
75b0: 4d 49 53 53 49 4f 4e 53 3b 0a 20 20 77 68 69 6c  MISSIONS;.  whil
75c0: 65 28 31 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  e(1){.#if define
75d0: 64 28 4f 5f 43 4c 4f 45 58 45 43 29 0a 20 20 20  d(O_CLOEXEC).   
75e0: 20 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66   fd = osOpen(z,f
75f0: 7c 4f 5f 43 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a  |O_CLOEXEC,m2);.
7600: 23 65 6c 73 65 0a 20 20 20 20 66 64 20 3d 20 6f  #else.    fd = o
7610: 73 4f 70 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23  sOpen(z,f,m2);.#
7620: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 66 64  endif.    if( fd
7630: 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  <0 ){.      if( 
7640: 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 20 63  errno==EINTR ) c
7650: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 62  ontinue;.      b
7660: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
7670: 69 66 28 20 66 64 3e 3d 53 51 4c 49 54 45 5f 4d  if( fd>=SQLITE_M
7680: 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43  INIMUM_FILE_DESC
7690: 52 49 50 54 4f 52 20 29 20 62 72 65 61 6b 3b 0a  RIPTOR ) break;.
76a0: 20 20 20 20 6f 73 43 6c 6f 73 65 28 66 64 29 3b      osClose(fd);
76b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
76c0: 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c  (SQLITE_WARNING,
76d0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
76e0: 20 20 22 61 74 74 65 6d 70 74 20 74 6f 20 6f 70    "attempt to op
76f0: 65 6e 20 5c 22 25 73 5c 22 20 61 73 20 66 69 6c  en \"%s\" as fil
7700: 65 20 64 65 73 63 72 69 70 74 6f 72 20 25 64 22  e descriptor %d"
7710: 2c 20 7a 2c 20 66 64 29 3b 0a 20 20 20 20 66 64  , z, fd);.    fd
7720: 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 6f   = -1;.    if( o
7730: 73 4f 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c  sOpen("/dev/null
7740: 22 2c 20 66 2c 20 6d 29 3c 30 20 29 20 62 72 65  ", f, m)<0 ) bre
7750: 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64  ak;.  }.  if( fd
7760: 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6d  >=0 ){.    if( m
7770: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72  !=0 ){.      str
7780: 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66  uct stat statbuf
7790: 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73  ;.      if( osFs
77a0: 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66  tat(fd, &statbuf
77b0: 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  )==0 .       && 
77c0: 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d  statbuf.st_size=
77d0: 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 73 74  =0.       && (st
77e0: 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 26 30 37  atbuf.st_mode&07
77f0: 37 37 29 21 3d 6d 20 0a 20 20 20 20 20 20 29 7b  77)!=m .      ){
7800: 0a 20 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f  .        osFchmo
7810: 64 28 66 64 2c 20 6d 29 3b 0a 20 20 20 20 20 20  d(fd, m);.      
7820: 7d 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69  }.    }.#if defi
7830: 6e 65 64 28 46 44 5f 43 4c 4f 45 58 45 43 29 20  ned(FD_CLOEXEC) 
7840: 26 26 20 28 21 64 65 66 69 6e 65 64 28 4f 5f 43  && (!defined(O_C
7850: 4c 4f 45 58 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f  LOEXEC) || O_CLO
7860: 45 58 45 43 3d 3d 30 29 0a 20 20 20 20 6f 73 46  EXEC==0).    osF
7870: 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44  cntl(fd, F_SETFD
7880: 2c 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f  , osFcntl(fd, F_
7890: 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43  GETFD, 0) | FD_C
78a0: 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a  LOEXEC);.#endif.
78b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 64 3b    }.  return fd;
78c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72  .}../*.** Helper
78d0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62   functions to ob
78e0: 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75  tain and relinqu
78f0: 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  ish the global m
7900: 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f  utex. The.** glo
7910: 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65  bal mutex is use
7920: 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65  d to protect the
7930: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61   unixInodeInfo a
7940: 6e 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c  nd.** vxworksFil
7950: 65 49 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64  eId objects used
7960: 20 62 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61   by this file, a
7970: 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20  ll of which may 
7980: 62 65 20 0a 2a 2a 20 73 68 61 72 65 64 20 62 79  be .** shared by
7990: 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
79a0: 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f  s..**.** Functio
79b0: 6e 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  n unixMutexHeld(
79c0: 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73  ) is used to ass
79d0: 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67  ert() that the g
79e0: 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20  lobal mutex .** 
79f0: 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71  is held when req
7a00: 75 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63  uired. This func
7a10: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65  tion is only use
7a20: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
7a30: 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d  ert() .** statem
7a40: 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a  ents. e.g..**.**
7a50: 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
7a60: 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72  x().**     asser
7a70: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
7a80: 28 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45  () );.**   unixE
7a90: 6e 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73  nterLeave().*/.s
7aa0: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45  tatic void unixE
7ab0: 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b  nterMutex(void){
7ac0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
7ad0: 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75  _enter(sqlite3Mu
7ae0: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
7af0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
7b00: 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20  TER));.}.static 
7b10: 76 6f 69 64 20 75 6e 69 78 4c 65 61 76 65 4d 75  void unixLeaveMu
7b20: 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  tex(void){.  sql
7b30: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
7b40: 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
7b50: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
7b60: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b  STATIC_MASTER));
7b70: 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  .}.#ifdef SQLITE
7b80: 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  _DEBUG.static in
7b90: 74 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  t unixMutexHeld(
7ba0: 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e  void) {.  return
7bb0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
7bc0: 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78  eld(sqlite3Mutex
7bd0: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
7be0: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
7bf0: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23  ));.}.#endif...#
7c00: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
7c10: 45 5f 54 45 53 54 29 20 26 26 20 64 65 66 69 6e  E_TEST) && defin
7c20: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
7c30: 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
7c40: 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74  nction for print
7c50: 69 6e 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e  ing out trace in
7c60: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64  formation from d
7c70: 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61  ebugging.** bina
7c80: 72 69 65 73 2e 20 54 68 69 73 20 72 65 74 75 72  ries. This retur
7c90: 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 72 65  ns the string re
7ca0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
7cb0: 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20  the supplied.** 
7cc0: 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70  integer lock-typ
7cd0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  e..*/.static con
7ce0: 73 74 20 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c  st char *azFileL
7cf0: 6f 63 6b 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63  ock(int eFileLoc
7d00: 6b 29 7b 0a 20 20 73 77 69 74 63 68 28 20 65 46  k){.  switch( eF
7d10: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63  ileLock ){.    c
7d20: 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74  ase NO_LOCK: ret
7d30: 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20  urn "NONE";.    
7d40: 63 61 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b  case SHARED_LOCK
7d50: 3a 20 72 65 74 75 72 6e 20 22 53 48 41 52 45 44  : return "SHARED
7d60: 22 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53 45  ";.    case RESE
7d70: 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  RVED_LOCK: retur
7d80: 6e 20 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20  n "RESERVED";.  
7d90: 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c    case PENDING_L
7da0: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e  OCK: return "PEN
7db0: 44 49 4e 47 22 3b 0a 20 20 20 20 63 61 73 65 20  DING";.    case 
7dc0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20  EXCLUSIVE_LOCK: 
7dd0: 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56  return "EXCLUSIV
7de0: 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  E";.  }.  return
7df0: 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64   "ERROR";.}.#end
7e00: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
7e10: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a  E_LOCK_TRACE./*.
7e20: 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66  ** Print out inf
7e30: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
7e40: 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  ll locking opera
7e50: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
7e60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
7e70: 64 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f  d for troublesho
7e80: 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d  oting locks on m
7e90: 75 6c 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20  ultithreaded.** 
7ea0: 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62  platforms.  Enab
7eb0: 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20  le by compiling 
7ec0: 77 69 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54  with the -DSQLIT
7ed0: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20  E_LOCK_TRACE.** 
7ee0: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74  command-line opt
7ef0: 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69  ion on the compi
7f00: 6c 65 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20  ler.  This code 
7f10: 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74  is normally.** t
7f20: 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74  urned off..*/.st
7f30: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61  atic int lockTra
7f40: 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f  ce(int fd, int o
7f50: 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  p, struct flock 
7f60: 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70  *p){.  char *zOp
7f70: 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20  Name, *zType;.  
7f80: 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76  int s;.  int sav
7f90: 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f  edErrno;.  if( o
7fa0: 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20  p==F_GETLK ){.  
7fb0: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54    zOpName = "GET
7fc0: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  LK";.  }else if(
7fd0: 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a   op==F_SETLK ){.
7fe0: 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53      zOpName = "S
7ff0: 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ETLK";.  }else{.
8000: 20 20 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28      s = osFcntl(
8010: 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20  fd, op, p);.    
8020: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
8030: 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77  tf("fcntl unknow
8040: 6e 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66  n %d %d %d\n", f
8050: 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72  d, op, s);.    r
8060: 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69  eturn s;.  }.  i
8070: 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  f( p->l_type==F_
8080: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79  RDLCK ){.    zTy
8090: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
80a0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74  }else if( p->l_t
80b0: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a  ype==F_WRLCK ){.
80c0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c      zType = "WRL
80d0: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CK";.  }else if(
80e0: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e   p->l_type==F_UN
80f0: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
8100: 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65   = "UNLCK";.  }e
8110: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
8120: 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65   0 );.  }.  asse
8130: 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d  rt( p->l_whence=
8140: 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73  =SEEK_SET );.  s
8150: 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f   = osFcntl(fd, o
8160: 70 2c 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72  p, p);.  savedEr
8170: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73  rno = errno;.  s
8180: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
8190: 66 28 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25  f("fcntl %d %d %
81a0: 73 20 25 73 20 25 64 20 25 64 20 25 64 20 25 64  s %s %d %d %d %d
81b0: 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64  \n",.     thread
81c0: 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c  id, fd, zOpName,
81d0: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e   zType, (int)p->
81e0: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d  l_start, (int)p-
81f0: 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e  >l_len,.     (in
8200: 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a  t)p->l_pid, s);.
8210: 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26    if( s==(-1) &&
8220: 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20   op==F_SETLK && 
8230: 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44  (p->l_type==F_RD
8240: 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65  LCK || p->l_type
8250: 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20  ==F_WRLCK) ){.  
8260: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
8270: 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a  2;.    l2 = *p;.
8280: 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20      osFcntl(fd, 
8290: 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20  F_GETLK, &l2);. 
82a0: 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65     if( l2.l_type
82b0: 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
82c0: 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43     zType = "RDLC
82d0: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  K";.    }else if
82e0: 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57  ( l2.l_type==F_W
82f0: 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54  RLCK ){.      zT
8300: 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20  ype = "WRLCK";. 
8310: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e     }else if( l2.
8320: 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  l_type==F_UNLCK 
8330: 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  ){.      zType =
8340: 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65   "UNLCK";.    }e
8350: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
8360: 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  t( 0 );.    }.  
8370: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
8380: 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c  intf("fcntl-fail
8390: 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25  ure-reason: %s %
83a0: 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20  d %d %d\n",.    
83b0: 20 20 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c     zType, (int)l
83c0: 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29  2.l_start, (int)
83d0: 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c  l2.l_len, (int)l
83e0: 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20  2.l_pid);.  }.  
83f0: 65 72 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72  errno = savedErr
8400: 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a  no;.  return s;.
8410: 7d 0a 23 75 6e 64 65 66 20 6f 73 46 63 6e 74 6c  }.#undef osFcntl
8420: 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c  .#define osFcntl
8430: 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69   lockTrace.#endi
8440: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  f /* SQLITE_LOCK
8450: 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _TRACE */../*.**
8460: 20 52 65 74 72 79 20 66 74 72 75 6e 63 61 74 65   Retry ftruncate
8470: 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61  () calls that fa
8480: 69 6c 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a  il due to EINTR.
8490: 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 61 6c 6c 73 20  **.** All calls 
84a0: 74 6f 20 66 74 72 75 6e 63 61 74 65 28 29 20 77  to ftruncate() w
84b0: 69 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65 20  ithin this file 
84c0: 73 68 6f 75 6c 64 20 62 65 20 6d 61 64 65 20 74  should be made t
84d0: 68 72 6f 75 67 68 20 74 68 69 73 20 77 72 61 70  hrough this wrap
84e0: 70 65 72 2e 0a 2a 2a 20 4f 6e 20 74 68 65 20 41  per..** On the A
84f0: 6e 64 72 6f 69 64 20 70 6c 61 74 66 6f 72 6d 2c  ndroid platform,
8500: 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20 6c   bypassing the l
8510: 6f 67 69 63 20 62 65 6c 6f 77 20 63 6f 75 6c 64  ogic below could
8520: 20 6c 65 61 64 20 74 6f 20 61 20 63 6f 72 72 75   lead to a corru
8530: 70 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a  pt.** database..
8540: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f  */.static int ro
8550: 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 69  bust_ftruncate(i
8560: 6e 74 20 68 2c 20 73 71 6c 69 74 65 33 5f 69 6e  nt h, sqlite3_in
8570: 74 36 34 20 73 7a 29 7b 0a 20 20 69 6e 74 20 72  t64 sz){.  int r
8580: 63 3b 0a 23 69 66 64 65 66 20 5f 5f 41 4e 44 52  c;.#ifdef __ANDR
8590: 4f 49 44 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 41 6e  OID__.  /* On An
85a0: 64 72 6f 69 64 2c 20 66 74 72 75 6e 63 61 74 65  droid, ftruncate
85b0: 28 29 20 61 6c 77 61 79 73 20 75 73 65 73 20 33  () always uses 3
85c0: 32 2d 62 69 74 20 6f 66 66 73 65 74 73 2c 20 65  2-bit offsets, e
85d0: 76 65 6e 20 69 66 20 0a 20 20 2a 2a 20 5f 46 49  ven if .  ** _FI
85e0: 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 3d 36  LE_OFFSET_BITS=6
85f0: 34 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68  4 is defined. Th
8600: 69 73 20 6d 65 61 6e 73 20 69 74 20 69 73 20 75  is means it is u
8610: 6e 73 61 66 65 20 74 6f 20 61 74 74 65 6d 70 74  nsafe to attempt
8620: 20 74 6f 0a 20 20 2a 2a 20 74 72 75 6e 63 61 74   to.  ** truncat
8630: 65 20 61 20 66 69 6c 65 20 74 6f 20 61 6e 79 20  e a file to any 
8640: 73 69 7a 65 20 6c 61 72 67 65 72 20 74 68 61 6e  size larger than
8650: 20 32 47 69 42 2e 20 53 69 6c 65 6e 74 6c 79 20   2GiB. Silently 
8660: 69 67 6e 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20  ignore any.  ** 
8670: 73 75 63 68 20 61 74 74 65 6d 70 74 73 2e 20 20  such attempts.  
8680: 2a 2f 0a 20 20 69 66 28 20 73 7a 3e 28 73 71 6c  */.  if( sz>(sql
8690: 69 74 65 33 5f 69 6e 74 36 34 29 30 78 37 46 46  ite3_int64)0x7FF
86a0: 46 46 46 46 46 20 29 7b 0a 20 20 20 20 72 63 20  FFFFF ){.    rc 
86b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
86c0: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 64 6f  else.#endif.  do
86d0: 7b 20 72 63 20 3d 20 6f 73 46 74 72 75 6e 63 61  { rc = osFtrunca
86e0: 74 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c 65  te(h,sz); }while
86f0: 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
8700: 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75  =EINTR );.  retu
8710: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
8720: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61  This routine tra
8730: 6e 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64 61  nslates a standa
8740: 72 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20 63  rd POSIX errno c
8750: 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69  ode into somethi
8760: 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20  ng.** useful to 
8770: 74 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20 74  the clients of t
8780: 68 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63 74  he sqlite3 funct
8790: 69 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63 61  ions.  Specifica
87a0: 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e  lly, it is.** in
87b0: 74 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73 6c  tended to transl
87c0: 61 74 65 20 61 20 76 61 72 69 65 74 79 20 6f 66  ate a variety of
87d0: 20 22 74 72 79 20 61 67 61 69 6e 22 20 65 72 72   "try again" err
87e0: 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f  ors into SQLITE_
87f0: 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61  BUSY.** and a va
8800: 72 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73 65  riety of "please
8810: 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
8820: 64 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22 20  descriptor NOW" 
8830: 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20  errors into .** 
8840: 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20  SQLITE_IOERR.** 
8850: 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69 6e  .** Errors durin
8860: 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  g initialization
8870: 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69   of locks, or fi
8880: 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le system suppor
8890: 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20  t for locks,.** 
88a0: 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e  should handle EN
88b0: 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45  OLCK, ENOTSUP, E
88c0: 4f 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72 61  OPNOTSUPP separa
88d0: 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tely..*/.static 
88e0: 69 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72 46  int sqliteErrorF
88f0: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69 6e  romPosixError(in
8900: 74 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e  t posixError, in
8910: 74 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20 7b  t sqliteIOErr) {
8920: 0a 20 20 73 77 69 74 63 68 20 28 70 6f 73 69 78  .  switch (posix
8930: 45 72 72 6f 72 29 20 7b 0a 23 69 66 20 30 0a 20  Error) {.#if 0. 
8940: 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74   /* At one point
8950: 20 74 68 69 73 20 63 6f 64 65 20 77 61 73 20 6e   this code was n
8960: 6f 74 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74  ot commented out
8970: 2e 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 69  . In theory, thi
8980: 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 73 68  s branch.  ** sh
8990: 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 68 69  ould never be hi
89a0: 74 2c 20 61 73 20 74 68 69 73 20 66 75 6e 63 74  t, as this funct
89b0: 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ion should only 
89c0: 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 0a  be called after.
89d0: 20 20 2a 2a 20 61 20 6c 6f 63 6b 69 6e 67 2d 72    ** a locking-r
89e0: 65 6c 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20  elated function 
89f0: 28 69 2e 65 2e 20 66 63 6e 74 6c 28 29 29 20 68  (i.e. fcntl()) h
8a00: 61 73 20 72 65 74 75 72 6e 65 64 20 6e 6f 6e 2d  as returned non-
8a10: 7a 65 72 6f 20 77 69 74 68 0a 20 20 2a 2a 20 74  zero with.  ** t
8a20: 68 65 20 76 61 6c 75 65 20 6f 66 20 65 72 72 6e  he value of errn
8a30: 6f 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  o as the first a
8a40: 72 67 75 6d 65 6e 74 2e 20 53 69 6e 63 65 20 61  rgument. Since a
8a50: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 68 61 73   system call has
8a60: 20 66 61 69 6c 65 64 2c 0a 20 20 2a 2a 20 65 72   failed,.  ** er
8a70: 72 6e 6f 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f  rno should be no
8a80: 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a  n-zero..  **.  *
8a90: 2a 20 44 65 73 70 69 74 65 20 74 68 69 73 2c 20  * Despite this, 
8aa0: 69 66 20 65 72 72 6e 6f 20 72 65 61 6c 6c 79 20  if errno really 
8ab0: 69 73 20 7a 65 72 6f 2c 20 77 65 20 73 74 69 6c  is zero, we stil
8ac0: 6c 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20  l don't want to 
8ad0: 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49  return.  ** SQLI
8ae0: 54 45 5f 4f 4b 2e 20 54 68 65 20 73 79 73 74 65  TE_OK. The syste
8af0: 6d 20 63 61 6c 6c 20 66 61 69 6c 65 64 2c 20 61  m call failed, a
8b00: 6e 64 20 2a 73 6f 6d 65 2a 20 53 51 4c 69 74 65  nd *some* SQLite
8b10: 20 65 72 72 6f 72 20 73 68 6f 75 6c 64 20 62 65   error should be
8b20: 0a 20 20 2a 2a 20 70 72 6f 70 61 67 61 74 65 64  .  ** propagated
8b30: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 63 61 6c   back to the cal
8b40: 6c 65 72 2e 20 43 6f 6d 6d 65 6e 74 69 6e 67 20  ler. Commenting 
8b50: 74 68 69 73 20 62 72 61 6e 63 68 20 6f 75 74 20  this branch out 
8b60: 6d 65 61 6e 73 20 65 72 72 6e 6f 3d 3d 30 0a 20  means errno==0. 
8b70: 20 2a 2a 20 77 69 6c 6c 20 62 65 20 68 61 6e 64   ** will be hand
8b80: 6c 65 64 20 62 79 20 74 68 65 20 22 64 65 66 61  led by the "defa
8b90: 75 6c 74 3a 22 20 63 61 73 65 20 62 65 6c 6f 77  ult:" case below
8ba0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 30 3a  ..  */.  case 0:
8bb0: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c   .    return SQL
8bc0: 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a  ITE_OK;.#endif..
8bd0: 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20    case EAGAIN:. 
8be0: 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a   case ETIMEDOUT:
8bf0: 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20  .  case EBUSY:. 
8c00: 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63   case EINTR:.  c
8c10: 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20  ase ENOLCK:  .  
8c20: 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20    /* random NFS 
8c30: 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c  retry error, unl
8c40: 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20  ess during file 
8c50: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a  system support .
8c60: 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63       * introspec
8c70: 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69  tion, in which i
8c80: 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73  t actually means
8c90: 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f   what it says */
8ca0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8cb0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20  TE_BUSY;.    .  
8cc0: 63 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20  case EACCES: .  
8cd0: 20 20 2f 2a 20 45 41 43 43 45 53 20 69 73 20 6c    /* EACCES is l
8ce0: 69 6b 65 20 45 41 47 41 49 4e 20 64 75 72 69 6e  ike EAGAIN durin
8cf0: 67 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74  g locking operat
8d00: 69 6f 6e 73 2c 20 62 75 74 20 6e 6f 74 20 61 6e  ions, but not an
8d10: 79 20 6f 74 68 65 72 20 74 69 6d 65 2a 2f 0a 20  y other time*/. 
8d20: 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 49 4f     if( (sqliteIO
8d30: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
8d40: 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20  ERR_LOCK) || .  
8d50: 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45        (sqliteIOE
8d60: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
8d70: 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 20  RR_UNLOCK) || . 
8d80: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f         (sqliteIO
8d90: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
8da0: 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 20  ERR_RDLOCK) ||. 
8db0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f         (sqliteIO
8dc0: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
8dd0: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
8de0: 44 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20  DLOCK) ){.      
8df0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
8e00: 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  SY;.    }.    /*
8e10: 20 65 6c 73 65 20 66 61 6c 6c 20 74 68 72 6f 75   else fall throu
8e20: 67 68 20 2a 2f 0a 20 20 63 61 73 65 20 45 50 45  gh */.  case EPE
8e30: 52 4d 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20  RM: .    return 
8e40: 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20  SQLITE_PERM;.   
8e50: 20 0a 23 69 66 20 45 4f 50 4e 4f 54 53 55 50 50   .#if EOPNOTSUPP
8e60: 21 3d 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65  !=ENOTSUP.  case
8e70: 20 45 4f 50 4e 4f 54 53 55 50 50 3a 20 0a 20 20   EOPNOTSUPP: .  
8e80: 20 20 2f 2a 20 73 6f 6d 65 74 68 69 6e 67 20 77    /* something w
8e90: 65 6e 74 20 74 65 72 72 69 62 6c 79 20 61 77 72  ent terribly awr
8ea0: 79 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67  y, unless during
8eb0: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70   file system sup
8ec0: 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74  port .     * int
8ed0: 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77  rospection, in w
8ee0: 68 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79  hich it actually
8ef0: 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73   means what it s
8f00: 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  ays */.#endif.#i
8f10: 66 64 65 66 20 45 4e 4f 54 53 55 50 0a 20 20 63  fdef ENOTSUP.  c
8f20: 61 73 65 20 45 4e 4f 54 53 55 50 3a 20 0a 20 20  ase ENOTSUP: .  
8f30: 20 20 2f 2a 20 69 6e 76 61 6c 69 64 20 66 64 2c    /* invalid fd,
8f40: 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66   unless during f
8f50: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
8f60: 72 74 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e  rt introspection
8f70: 2c 20 69 6e 20 77 68 69 63 68 20 0a 20 20 20 20  , in which .    
8f80: 20 2a 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d   * it actually m
8f90: 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79  eans what it say
8fa0: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 61  s */.#endif.  ca
8fb0: 73 65 20 45 49 4f 3a 0a 20 20 63 61 73 65 20 45  se EIO:.  case E
8fc0: 42 41 44 46 3a 0a 20 20 63 61 73 65 20 45 49 4e  BADF:.  case EIN
8fd0: 56 41 4c 3a 0a 20 20 63 61 73 65 20 45 4e 4f 54  VAL:.  case ENOT
8fe0: 43 4f 4e 4e 3a 0a 20 20 63 61 73 65 20 45 4e 4f  CONN:.  case ENO
8ff0: 44 45 56 3a 0a 20 20 63 61 73 65 20 45 4e 58 49  DEV:.  case ENXI
9000: 4f 3a 0a 20 20 63 61 73 65 20 45 4e 4f 45 4e 54  O:.  case ENOENT
9010: 3a 0a 23 69 66 64 65 66 20 45 53 54 41 4c 45 20  :.#ifdef ESTALE 
9020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9030: 20 20 20 20 2f 2a 20 45 53 54 41 4c 45 20 69 73      /* ESTALE is
9040: 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 6f 6e 20   not defined on 
9050: 49 6e 74 65 72 69 78 20 73 79 73 74 65 6d 73 20  Interix systems 
9060: 2a 2f 0a 20 20 63 61 73 65 20 45 53 54 41 4c 45  */.  case ESTALE
9070: 3a 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20  :.#endif.  case 
9080: 45 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20 74  ENOSYS:.    /* t
9090: 68 65 73 65 20 73 68 6f 75 6c 64 20 66 6f 72 63  hese should forc
90a0: 65 20 74 68 65 20 63 6c 69 65 6e 74 20 74 6f 20  e the client to 
90b0: 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61  close the file a
90c0: 6e 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a  nd reconnect */.
90d0: 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74 3a 20      .  default: 
90e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
90f0: 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a  teIOErr;.  }.}..
9100: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
9110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9150: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
9160: 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71 75 65  *** Begin Unique
9170: 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79   File ID Utility
9180: 20 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73   Used By VxWorks
9190: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
91a0: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76  .**.** On most v
91b0: 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c  ersions of unix,
91c0: 20 77 65 20 63 61 6e 20 67 65 74 20 61 20 75 6e   we can get a un
91d0: 69 71 75 65 20 49 44 20 66 6f 72 20 61 20 66 69  ique ID for a fi
91e0: 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e 61 74  le by concatenat
91f0: 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76 69 63  ing.** the devic
9200: 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  e number and the
9210: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20   inode number.  
9220: 42 75 74 20 74 68 69 73 20 64 6f 65 73 20 6e 6f  But this does no
9230: 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b  t work on VxWork
9240: 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73  s..** On VxWorks
9250: 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20  , a unique file 
9260: 69 64 20 6d 75 73 74 20 62 65 20 62 61 73 65 64  id must be based
9270: 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61   on the canonica
9280: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a  l filename..**.*
9290: 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  * A pointer to a
92a0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
92b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
92c0: 63 74 75 72 65 20 63 61 6e 20 62 65 20 75 73 65  cture can be use
92d0: 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65  d as a.** unique
92e0: 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78 57 6f   file ID in VxWo
92f0: 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73 74 61  rks.  Each insta
9300: 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
9310: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a  cture contains.*
9320: 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  * a copy of the 
9330: 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  canonical filena
9340: 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20 61 6c  me.  There is al
9350: 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65 20 63  so a reference c
9360: 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73  ount.  .** The s
9370: 74 72 75 63 74 75 72 65 20 69 73 20 72 65 63 6c  tructure is recl
9380: 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65 20 6e  aimed when the n
9390: 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72  umber of pointer
93a0: 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20 74 6f  s to it drops to
93b0: 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  .** zero..**.** 
93c0: 54 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20  There are never 
93d0: 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65 73 20  very many files 
93e0: 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65  open at one time
93f0: 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65   and lookups are
9400: 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72   not.** a perfor
9410: 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c 20 70  mance-critical p
9420: 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20 73 75  ath, so it is su
9430: 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75 74 20  fficient to put 
9440: 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63 74 75  these.** structu
9450: 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20  res on a linked 
9460: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  list..*/.struct 
9470: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a  vxworksFileId {.
9480: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
9490: 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20 20  FileId *pNext;  
94a0: 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c 69 73  /* Next in a lis
94b0: 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f  t of them all */
94c0: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
94d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
94f0: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73  ferences to this
9500: 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e   one */.  int nN
9510: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
9520: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
9530: 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69  h of the zCanoni
9540: 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67  calName[] string
9550: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e   */.  char *zCan
9560: 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20  onicalName;     
9570: 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c      /* Canonical
9580: 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a   filename */.};.
9590: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
95a0: 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75  /* .** All uniqu
95b0: 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20  e filenames are 
95c0: 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64  held on a linked
95d0: 20 6c 69 73 74 20 68 65 61 64 65 64 20 62 79 20   list headed by 
95e0: 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65  this.** variable
95f0: 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  :.*/.static stru
9600: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
9610: 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73   *vxworksFileLis
9620: 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69  t = 0;../*.** Si
9630: 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d  mplify a filenam
9640: 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e  e into its canon
9650: 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20  ical form.** by 
9660: 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  making the follo
9670: 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a  wing changes:.**
9680: 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20  .**  * removing 
9690: 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61 6e 64  any trailing and
96a0: 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20   duplicate /.** 
96b0: 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69   * convert /./ i
96c0: 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a  nto just /.**  *
96d0: 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20   convert /A/../ 
96e0: 77 68 65 72 65 20 41 20 69 73 20 61 6e 79 20 73  where A is any s
96f0: 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20  imple name into 
9700: 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61  just /.**.** Cha
9710: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 6e  nges are made in
9720: 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72 6e 20  -place.  Return 
9730: 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e  the new name len
9740: 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  gth..**.** The o
9750: 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  riginal filename
9760: 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d   is in z[0..n-1]
9770: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
9780: 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61  mber of.** chara
9790: 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 69 6d  cters in the sim
97a0: 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f  plified name..*/
97b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78 77 6f  .static int vxwo
97c0: 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28  rksSimplifyName(
97d0: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b  char *z, int n){
97e0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77  .  int i, j;.  w
97f0: 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e  hile( n>1 && z[n
9800: 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b  -1]=='/' ){ n--;
9810: 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20   }.  for(i=j=0; 
9820: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<n; i++){.    i
9830: 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a  f( z[i]=='/' ){.
9840: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
9850: 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65  =='/' ) continue
9860: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  ;.      if( z[i+
9870: 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e  1]=='.' && i+2<n
9880: 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20   && z[i+2]=='/' 
9890: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20  ){.        i += 
98a0: 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  1;.        conti
98b0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
98c0: 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27     if( z[i+1]=='
98d0: 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a  .' && i+3<n && z
98e0: 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b  [i+2]=='.' && z[
98f0: 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i+3]=='/' ){.   
9900: 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20       while( j>0 
9910: 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29  && z[j-1]!='/' )
9920: 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20  { j--; }.       
9930: 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b   if( j>0 ){ j--;
9940: 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20   }.        i += 
9950: 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  2;.        conti
9960: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
9970: 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20   }.    z[j++] = 
9980: 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d  z[i];.  }.  z[j]
9990: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a   = 0;.  return j
99a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
99b0: 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44  a unique file ID
99c0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 61   for the given a
99d0: 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65  bsolute pathname
99e0: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  .  Return.** a p
99f0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 76 78  ointer to the vx
9a00: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
9a10: 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 65  ct.  This pointe
9a20: 72 20 69 73 20 74 68 65 20 75 6e 69 71 75 65 0a  r is the unique.
9a30: 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a  ** file ID..**.*
9a40: 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65 6c 64  * The nRef field
9a50: 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b 73 46   of the vxworksF
9a60: 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20  ileId object is 
9a70: 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65 66 6f  incremented befo
9a80: 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74  re.** the object
9a90: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41   is returned.  A
9aa0: 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69 6c 65   new vxworksFile
9ab0: 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  Id object is cre
9ac0: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65  ated.** and adde
9ad0: 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20  d to the global 
9ae0: 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73 61 72  list if necessar
9af0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  y..**.** If a me
9b00: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
9b10: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
9b20: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  turn NULL..*/.st
9b30: 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77 6f  atic struct vxwo
9b40: 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72  rksFileId *vxwor
9b50: 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e  ksFindFileId(con
9b60: 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75  st char *zAbsolu
9b70: 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75 63  teName){.  struc
9b80: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
9b90: 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 2f  *pNew;         /
9ba0: 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61 6e 64  * search key and
9bb0: 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a   new file ID */.
9bc0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
9bd0: 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69 64 61  FileId *pCandida
9be0: 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f  te;   /* For loo
9bf0: 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73 74 69  ping over existi
9c00: 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20  ng file IDs */. 
9c10: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
9c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c30: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
9c40: 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20  f zAbsoluteName 
9c50: 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73  string */..  ass
9c60: 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61  ert( zAbsoluteNa
9c70: 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20  me[0]=='/' );.  
9c80: 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
9c90: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a  zAbsoluteName);.
9ca0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
9cb0: 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
9cc0: 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29  *pNew) + (n+1) )
9cd0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
9ce0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
9cf0: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
9d00: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  me = (char*)&pNe
9d10: 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70  w[1];.  memcpy(p
9d20: 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  New->zCanonicalN
9d30: 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61  ame, zAbsoluteNa
9d40: 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20  me, n+1);.  n = 
9d50: 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e  vxworksSimplifyN
9d60: 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  ame(pNew->zCanon
9d70: 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20  icalName, n);.. 
9d80: 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
9d90: 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  n existing entry
9da0: 20 74 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74   that matching t
9db0: 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d  he canonical nam
9dc0: 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64  e..  ** If found
9dd0: 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  , increment the 
9de0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
9df0: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
9e00: 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65  nter to.  ** the
9e10: 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49   existing file I
9e20: 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e  D..  */.  unixEn
9e30: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f  terMutex();.  fo
9e40: 72 28 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77  r(pCandidate=vxw
9e50: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43  orksFileList; pC
9e60: 61 6e 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69  andidate; pCandi
9e70: 64 61 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d  date=pCandidate-
9e80: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
9e90: 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61   pCandidate->nNa
9ea0: 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d  me==n .     && m
9eb0: 65 6d 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65  emcmp(pCandidate
9ec0: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
9ed0: 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63  , pNew->zCanonic
9ee0: 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20  alName, n)==0.  
9ef0: 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69    ){.       sqli
9f00: 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
9f10: 20 20 20 20 20 20 20 70 43 61 6e 64 69 64 61 74         pCandidat
9f20: 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  e->nRef++;.     
9f30: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
9f40: 28 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72  ();.       retur
9f50: 6e 20 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20  n pCandidate;.  
9f60: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f    }.  }..  /* No
9f70: 20 6d 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64   match was found
9f80: 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20  .  We will make 
9f90: 61 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f  a new file ID */
9fa0: 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20  .  pNew->nRef = 
9fb0: 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65  1;.  pNew->nName
9fc0: 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e   = n;.  pNew->pN
9fd0: 65 78 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c  ext = vxworksFil
9fe0: 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73  eList;.  vxworks
9ff0: 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b  FileList = pNew;
a000: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
a010: 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  x();.  return pN
a020: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  ew;.}../*.** Dec
a030: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
a040: 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20  ence count on a 
a050: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
a060: 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74  ject.  Free.** t
a070: 68 65 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74  he object when t
a080: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
a090: 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e  nt reaches zero.
a0a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a0b0: 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69  vxworksReleaseFi
a0c0: 6c 65 49 64 28 73 74 72 75 63 74 20 76 78 77 6f  leId(struct vxwo
a0d0: 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b  rksFileId *pId){
a0e0: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
a0f0: 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x();.  assert( p
a100: 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Id->nRef>0 );.  
a110: 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pId->nRef--;.  i
a120: 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20  f( pId->nRef==0 
a130: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 76 78  ){.    struct vx
a140: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70  worksFileId **pp
a150: 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78  ;.    for(pp=&vx
a160: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a  worksFileList; *
a170: 70 70 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20  pp && *pp!=pId; 
a180: 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e  pp = &((*pp)->pN
a190: 65 78 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65  ext)){}.    asse
a1a0: 72 74 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a  rt( *pp==pId );.
a1b0: 20 20 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70      *pp = pId->p
a1c0: 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Next;.    sqlite
a1d0: 33 5f 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d  3_free(pId);.  }
a1e0: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
a1f0: 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  x();.}.#endif /*
a200: 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f   OS_VXWORKS */./
a210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
a220: 45 6e 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69  End of Unique Fi
a230: 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73  le ID Utility Us
a240: 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a  ed By VxWorks **
a250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
a260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a2a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
a2b0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
a2c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a2d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a2e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a2f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a300: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
a310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73  ************ Pos
a320: 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b  ix Advisory Lock
a330: 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
a340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a350: 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76  .**.** POSIX adv
a360: 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20  isory locks are 
a370: 62 72 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e  broken by design
a380: 2e 20 20 41 4e 53 49 20 53 54 44 20 31 30 30 33  .  ANSI STD 1003
a390: 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63  .1 (1996).** sec
a3a0: 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e  tion 6.5.2.2 lin
a3b0: 65 73 20 34 38 33 20 74 68 72 6f 75 67 68 20 34  es 483 through 4
a3c0: 39 30 20 73 70 65 63 69 66 79 20 74 68 61 74 20  90 specify that 
a3d0: 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a  when a process.*
a3e0: 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73  * sets or clears
a3f0: 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70   a lock, that op
a400: 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65  eration override
a410: 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b  s any prior lock
a420: 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20  s set.** by the 
a430: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49  same process.  I
a440: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69  t does not expli
a450: 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75  citly say so, bu
a460: 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a  t this implies.*
a470: 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72 72 69  * that it overri
a480: 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79  des locks set by
a490: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
a4a0: 73 20 75 73 69 6e 67 20 61 20 64 69 66 66 65 72  s using a differ
a4b0: 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  ent.** file desc
a4c0: 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65  riptor.  Conside
a4d0: 72 20 74 68 69 73 20 74 65 73 74 20 63 61 73 65  r this test case
a4e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e  :.**.**       in
a4f0: 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f  t fd1 = open("./
a500: 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f  file1", O_RDWR|O
a510: 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a  _CREAT, 0644);.*
a520: 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 32 20  *       int fd2 
a530: 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22  = open("./file2"
a540: 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  , O_RDWR|O_CREAT
a550: 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53  , 0644);.**.** S
a560: 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61  uppose ./file1 a
a570: 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72  nd ./file2 are r
a580: 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66  eally the same f
a590: 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ile (because.** 
a5a0: 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20 6f 72  one is a hard or
a5b0: 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74   symbolic link t
a5c0: 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74 68 65  o the other) the
a5d0: 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20  n if you set.** 
a5e0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
a5f0: 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74  k on fd1, then t
a600: 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63  ry to get an exc
a610: 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f  lusive lock.** o
a620: 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e  n fd2, it works.
a630: 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65    I would have e
a640: 78 70 65 63 74 65 64 20 74 68 65 20 73 65 63 6f  xpected the seco
a650: 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61  nd lock to.** fa
a660: 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77  il since there w
a670: 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  as already a loc
a680: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75  k on the file du
a690: 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74  e to fd1..** But
a6a0: 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20   not so.  Since 
a6b0: 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20  both locks came 
a6c0: 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72  from the same pr
a6d0: 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65  ocess, the.** se
a6e0: 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74  cond overrides t
a6f0: 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74  he first, even t
a700: 68 6f 75 67 68 20 74 68 65 79 20 77 65 72 65 20  hough they were 
a710: 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  on different.** 
a720: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
a730: 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65   opened on diffe
a740: 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e  rent file names.
a750: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e  .**.** This mean
a760: 73 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74  s that we cannot
a770: 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73   use POSIX locks
a780: 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20   to synchronize 
a790: 66 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61  file access.** a
a7a0: 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74  mong competing t
a7b0: 68 72 65 61 64 73 20 6f 66 20 74 68 65 20 73 61  hreads of the sa
a7c0: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53  me process.  POS
a7d0: 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f  IX locks will wo
a7e0: 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79  rk fine.** to sy
a7f0: 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73  nchronize access
a800: 20 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20   for threads in 
a810: 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73  separate process
a820: 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74  es, but not.** t
a830: 68 72 65 61 64 73 20 77 69 74 68 69 6e 20 74 68  hreads within th
a840: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a  e same process..
a850: 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72  **.** To work ar
a860: 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d  ound the problem
a870: 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20  , SQLite has to 
a880: 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b  manage file lock
a890: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  s internally.** 
a8a0: 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65  on its own.  Whe
a8b0: 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61 74 61  never a new data
a8c0: 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20  base is opened, 
a8d0: 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20  we have to find 
a8e0: 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  the.** specific 
a8f0: 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74  inode of the dat
a900: 61 62 61 73 65 20 66 69 6c 65 20 28 74 68 65 20  abase file (the 
a910: 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69  inode is determi
a920: 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74  ned by the.** st
a930: 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20  _dev and st_ino 
a940: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74  fields of the st
a950: 61 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61  at structure tha
a960: 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20  t fstat() fills 
a970: 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b  in).** and check
a980: 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61   for locks alrea
a990: 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74  dy existing on t
a9a0: 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e  hat inode.  When
a9b0: 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72   locks are.** cr
a9c0: 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64  eated or removed
a9d0: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f  , we have to loo
a9e0: 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74  k at our own int
a9f0: 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20  ernal record of 
aa00: 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20  the.** locks to 
aa10: 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74  see if another t
aa20: 68 72 65 61 64 20 68 61 73 20 70 72 65 76 69 6f  hread has previo
aa30: 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20  usly set a lock 
aa40: 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20  on that same.** 
aa50: 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73  inode..**.** (As
aa60: 69 64 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20  ide: The use of 
aa70: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73  inode numbers as
aa80: 20 75 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73   unique IDs does
aa90: 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57   not work on VxW
aaa0: 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57  orks..** For VxW
aab0: 6f 72 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f  orks, we have to
aac0: 20 75 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61   use the alterna
aad0: 74 69 76 65 20 75 6e 69 71 75 65 20 49 44 20 73  tive unique ID s
aae0: 79 73 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a  ystem based on.*
aaf0: 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  * canonical file
ab00: 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65  name and impleme
ab10: 6e 74 65 64 20 69 6e 20 74 68 65 20 70 72 65 76  nted in the prev
ab20: 69 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a  ious division.).
ab30: 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  **.** The sqlite
ab40: 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
ab50: 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f   for POSIX is no
ab60: 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20   longer just an 
ab70: 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20  integer file.** 
ab80: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20  descriptor.  It 
ab90: 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75  is now a structu
aba0: 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  re that holds th
abb0: 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a  e integer file.*
abc0: 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64  * descriptor and
abd0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
abe0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
abf0: 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6e 74  escribes the int
ac00: 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f  ernal.** locks o
ac10: 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
ac20: 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72  ing inode.  Ther
ac30: 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67  e is one locking
ac40: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65   structure.** pe
ac50: 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74  r inode, so if t
ac60: 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73  he same inode is
ac70: 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62   opened twice, b
ac80: 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72  oth unixFile str
ac90: 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74  uctures.** point
aca0: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63   to the same loc
acb0: 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20  king structure. 
acc0: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72   The locking str
acd0: 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20  ucture keeps.** 
ace0: 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  a reference coun
acf0: 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e  t (so we will kn
ad00: 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74  ow when to delet
ad10: 65 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74  e it) and a "cnt
ad20: 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20  ".** field that 
ad30: 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74  tells us its int
ad40: 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75  ernal lock statu
ad50: 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73  s.  cnt==0 means
ad60: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20   the.** file is 
ad70: 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d  unlocked.  cnt==
ad80: 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c  -1 means the fil
ad90: 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69  e has an exclusi
ada0: 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e  ve lock..** cnt>
adb0: 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72  0 means there ar
adc0: 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63  e cnt shared loc
add0: 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a  ks on the file..
ade0: 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70  **.** Any attemp
adf0: 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c  t to lock or unl
ae00: 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74  ock a file first
ae10: 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b   checks the lock
ae20: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
ae30: 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73  .  The fcntl() s
ae40: 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e  ystem call is on
ae50: 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65  ly invoked to se
ae60: 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f  t a .** POSIX lo
ae70: 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e  ck if the intern
ae80: 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72  al lock structur
ae90: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65  e transitions be
aea0: 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65  tween.** a locke
aeb0: 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65  d and an unlocke
aec0: 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42  d state..**.** B
aed0: 75 74 20 77 61 69 74 3a 20 20 74 68 65 72 65 20  ut wait:  there 
aee0: 61 72 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f  are yet more pro
aef0: 62 6c 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58  blems with POSIX
af00: 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e   advisory locks.
af10: 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c  .**.** If you cl
af20: 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72  ose a file descr
af30: 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74  iptor that point
af40: 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74  s to a file that
af50: 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61   has locks,.** a
af60: 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74  ll locks on that
af70: 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f   file that are o
af80: 77 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72  wned by the curr
af90: 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a  ent process are.
afa0: 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f  ** released.  To
afb0: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
afc0: 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20  s problem, each 
afd0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
afe0: 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e  ject.** maintain
aff0: 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  s a count of the
b000: 20 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69   number of pendi
b010: 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 20  ng locks on tha 
b020: 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20 61  inode..** When a
b030: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
b040: 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e  e to close an un
b050: 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65  ixFile, if there
b060: 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e   are.** other un
b070: 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74  ixFile open on t
b080: 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68  he same inode th
b090: 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c  at are holding l
b0a0: 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a  ocks, the call.*
b0b0: 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65  * to close() the
b0c0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
b0d0: 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
b0e0: 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f  il all of the lo
b0f0: 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68  cks clear..** Th
b100: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
b110: 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20  structure keeps 
b120: 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64  a list of file d
b130: 65 73 63 72 69 70 74 6f 72 73 20 74 68 61 74 20  escriptors that 
b140: 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c  need to.** be cl
b150: 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69  osed and that li
b160: 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e  st is walked (an
b170: 64 20 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20  d cleared) when 
b180: 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a  the last lock.**
b190: 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59   clears..**.** Y
b1a0: 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c  et another probl
b1b0: 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65 61 64  em:  LinuxThread
b1c0: 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65  s do not play we
b1d0: 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20 6c 6f  ll with posix lo
b1e0: 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20  cks..**.** Many 
b1f0: 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
b200: 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68 65 20  f linux use the 
b210: 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c 69 62  LinuxThreads lib
b220: 72 61 72 79 20 77 68 69 63 68 20 69 73 0a 2a 2a  rary which is.**
b230: 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c   not posix compl
b240: 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e  iant.  Under Lin
b250: 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c 6f 63  uxThreads, a loc
b260: 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72  k created by thr
b270: 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20  ead.** A cannot 
b280: 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f  be modified or o
b290: 76 65 72 72 69 64 64 65 6e 20 62 79 20 61 20 64  verridden by a d
b2a0: 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 20  ifferent thread 
b2b0: 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61  B..** Only threa
b2c0: 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79 20 74  d A can modify t
b2d0: 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e  he lock.  Lockin
b2e0: 67 20 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f  g behavior is co
b2f0: 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 20  rrect.** if the 
b300: 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65 73 20  appliation uses 
b310: 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69 76 65  the newer Native
b320: 20 50 6f 73 69 78 20 54 68 72 65 61 64 20 4c 69   Posix Thread Li
b330: 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20  brary (NPTL).** 
b340: 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74 68 20  on linux - with 
b350: 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61  NPTL a lock crea
b360: 74 65 64 20 62 79 20 74 68 72 65 61 64 20 41 20  ted by thread A 
b370: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63  can override loc
b380: 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64 20  ks.** in thread 
b390: 42 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73  B.  But there is
b3a0: 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20   no way to know 
b3b0: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
b3c0: 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61 64 69  which.** threadi
b3d0: 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20 62 65  ng library is be
b3e0: 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20 74 68  ing used.  So th
b3f0: 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f  ere is no way to
b400: 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70   know at.** comp
b410: 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72  ile-time whether
b420: 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 20 41   or not thread A
b430: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f   can override lo
b440: 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20 42 2e  cks on thread B.
b450: 0a 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20 64  .** One has to d
b460: 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65  o a run-time che
b470: 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  ck to discover t
b480: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
b490: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72  he.** current pr
b4a0: 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  ocess..**.** SQL
b4b0: 69 74 65 20 75 73 65 64 20 74 6f 20 73 75 70 70  ite used to supp
b4c0: 6f 72 74 20 4c 69 6e 75 78 54 68 72 65 61 64 73  ort LinuxThreads
b4d0: 2e 20 20 42 75 74 20 73 75 70 70 6f 72 74 20 66  .  But support f
b4e0: 6f 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73 0a  or LinuxThreads.
b4f0: 2a 2a 20 77 61 73 20 64 72 6f 70 70 65 64 20 62  ** was dropped b
b500: 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 76 65  eginning with ve
b510: 72 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53 51  rsion 3.7.0.  SQ
b520: 4c 69 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20  Lite will still 
b530: 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69 6e  work with.** Lin
b540: 75 78 54 68 72 65 61 64 73 20 70 72 6f 76 69 64  uxThreads provid
b550: 65 64 20 74 68 61 74 20 28 31 29 20 74 68 65 72  ed that (1) ther
b560: 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61  e is no more tha
b570: 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  n one connection
b580: 20 0a 2a 2a 20 70 65 72 20 64 61 74 61 62 61 73   .** per databas
b590: 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61  e file in the sa
b5a0: 6d 65 20 70 72 6f 63 65 73 73 20 61 6e 64 20 28  me process and (
b5b0: 32 29 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  2) database conn
b5c0: 65 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f  ections.** do no
b5d0: 74 20 6d 6f 76 65 20 61 63 72 6f 73 73 20 74 68  t move across th
b5e0: 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  reads..*/../*.**
b5f0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
b600: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
b610: 72 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61  ructure serves a
b620: 73 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a  s the key used.*
b630: 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61  * to locate a pa
b640: 72 74 69 63 75 6c 61 72 20 75 6e 69 78 49 6e 6f  rticular unixIno
b650: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a  deInfo object..*
b660: 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c  /.struct unixFil
b670: 65 49 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65  eId {.  dev_t de
b680: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
b690: 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75      /* Device nu
b6a0: 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56  mber */.#if OS_V
b6b0: 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
b6c0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
b6d0: 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66  Id;  /* Unique f
b6e0: 69 6c 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72  ile ID for vxwor
b6f0: 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69  ks. */.#else.  i
b700: 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20  no_t ino;       
b710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
b720: 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65  ode number */.#e
b730: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
b740: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
b750: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
b760: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
b770: 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e  ed for each open
b780: 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20  .** inode.  Or, 
b790: 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c  on LinuxThreads,
b7a0: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 66   there is one of
b7b0: 20 74 68 65 73 65 20 73 74 72 75 63 74 75 72 65   these structure
b7c0: 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e  s for.** each in
b7d0: 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20 65 61  ode opened by ea
b7e0: 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ch thread..**.**
b7f0: 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20   A single inode 
b800: 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c  can have multipl
b810: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
b820: 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78  rs, so each unix
b830: 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72  File.** structur
b840: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
b850: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61  nter to an insta
b860: 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
b870: 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f  ct and this.** o
b880: 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f  bject keeps a co
b890: 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
b8a0: 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f  r of unixFile po
b8b0: 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f  inting to it..*/
b8c0: 0a 73 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64  .struct unixInod
b8d0: 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74  eInfo {.  struct
b8e0: 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65   unixFileId file
b8f0: 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Id;       /* The
b900: 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20   lookup key */. 
b910: 20 69 6e 74 20 6e 53 68 61 72 65 64 3b 20 20 20   int nShared;   
b920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b930: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48   /* Number of SH
b940: 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20  ARED locks held 
b950: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
b960: 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20  ar eFileLock;   
b970: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53       /* One of S
b980: 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45  HARED_LOCK, RESE
b990: 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a  RVED_LOCK etc. *
b9a0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
b9b0: 72 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b 20  r bProcessLock; 
b9c0: 20 20 20 20 2f 2a 20 41 6e 20 65 78 63 6c 75 73      /* An exclus
b9d0: 69 76 65 20 70 72 6f 63 65 73 73 20 6c 6f 63 6b  ive process lock
b9e0: 20 69 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e   is held */.  in
b9f0: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ba10: 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   Number of point
ba20: 65 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75  ers to this stru
ba30: 63 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53  cture */.  unixS
ba40: 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
ba50: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68  ;          /* Sh
ba60: 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f  ared memory asso
ba70: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
ba80: 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20   inode */.  int 
ba90: 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  nLock;          
baa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
bab0: 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e  umber of outstan
bac0: 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20  ding file locks 
bad0: 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  */.  UnixUnusedF
bae0: 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20  d *pUnused;     
baf0: 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66       /* Unused f
bb00: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
bb10: 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e  to close */.  un
bb20: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65  ixInodeInfo *pNe
bb30: 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  xt;           /*
bb40: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69   List of all uni
bb50: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
bb60: 74 73 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  ts */.  unixInod
bb70: 65 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20 20  eInfo *pPrev;   
bb80: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e          /*    ..
bb90: 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64  .. doubly linked
bba0: 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45   */.#if SQLITE_E
bbb0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
bbc0: 59 4c 45 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  YLE.  unsigned l
bbd0: 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 42  ong long sharedB
bbe0: 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50  yte;  /* for AFP
bbf0: 20 73 69 6d 75 6c 61 74 65 64 20 73 68 61 72 65   simulated share
bc00: 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66  d lock */.#endif
bc10: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
bc20: 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20    sem_t *pSem;  
bc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc40: 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58    /* Named POSIX
bc50: 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20   semaphore */.  
bc60: 63 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41  char aSemName[MA
bc70: 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20  X_PATHNAME+2];  
bc80: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61 74 20  /* Name of that 
bc90: 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e  semaphore */.#en
bca0: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20  dif.};../*.** A 
bcb0: 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69  lists of all uni
bcc0: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
bcd0: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e  ts..*/.static un
bce0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f  ixInodeInfo *ino
bcf0: 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  deList = 0;../*.
bd00: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
bd10: 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72  ion - unixLogErr
bd20: 6f 72 5f 78 28 29 2c 20 69 73 20 6f 6e 6c 79 20  or_x(), is only 
bd30: 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20  ever called via 
bd40: 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69  the macro.** uni
bd50: 78 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a  xLogError()..**.
bd60: 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64  ** It is invoked
bd70: 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20   after an error 
bd80: 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20  occurs in an OS 
bd90: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 65 72 72  function and err
bda0: 6e 6f 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 73  no has been.** s
bdb0: 65 74 2e 20 49 74 20 6c 6f 67 73 20 61 20 6d 65  et. It logs a me
bdc0: 73 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69  ssage using sqli
bdd0: 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69  te3_log() contai
bde0: 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ning the current
bdf0: 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72   value of.** err
be00: 6e 6f 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69  no and, if possi
be10: 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72  ble, the human-r
be20: 65 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65  eadable equivale
be30: 6e 74 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72  nt from strerror
be40: 28 29 20 6f 72 0a 2a 2a 20 73 74 72 65 72 72 6f  () or.** strerro
be50: 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  r_r()..**.** The
be60: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
be70: 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61  passed to the ma
be80: 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68  cro should be th
be90: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61  e error code tha
bea0: 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74  t.** will be ret
beb0: 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20  urned to SQLite 
bec0: 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45  (e.g. SQLITE_IOE
bed0: 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54  RR_DELETE, SQLIT
bee0: 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a  E_CANTOPEN). .**
bef0: 20 54 68 65 20 74 77 6f 20 73 75 62 73 65 71 75   The two subsequ
bf00: 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68  ent arguments sh
bf10: 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65  ould be the name
bf20: 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74   of the OS funct
bf30: 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c  ion that.** fail
bf40: 65 64 20 28 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b  ed (e.g. "unlink
bf50: 22 2c 20 22 6f 70 65 6e 22 29 20 61 6e 64 20 74  ", "open") and t
bf60: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69  he associated fi
bf70: 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 0a  le-system path,.
bf80: 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64  ** if any..*/.#d
bf90: 65 66 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72  efine unixLogErr
bfa0: 6f 72 28 61 2c 62 2c 63 29 20 20 20 20 20 75 6e  or(a,b,c)     un
bfb0: 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  ixLogErrorAtLine
bfc0: 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29  (a,b,c,__LINE__)
bfd0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
bfe0: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a  LogErrorAtLine(.
bff0: 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20    int errcode,  
c000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c010: 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f    /* SQLite erro
c020: 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  r code */.  cons
c030: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20  t char *zFunc,  
c040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
c050: 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69  ame of OS functi
c060: 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a  on that failed *
c070: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
c080: 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
c090: 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68      /* File path
c0a0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
c0b0: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20   error */.  int 
c0c0: 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20 20 20  iLine           
c0d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
c0e0: 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65  ource line numbe
c0f0: 72 20 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63  r where error oc
c100: 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63  curred */.){.  c
c110: 68 61 72 20 2a 7a 45 72 72 3b 20 20 20 20 20 20  har *zErr;      
c120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c130: 2a 20 4d 65 73 73 61 67 65 20 66 72 6f 6d 20 73  * Message from s
c140: 74 72 65 72 72 6f 72 28 29 20 6f 72 20 65 71 75  trerror() or equ
c150: 69 76 61 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  ivalent */.  int
c160: 20 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   iErrno = errno;
c170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c180: 53 61 76 65 64 20 73 79 73 63 61 6c 6c 20 65 72  Saved syscall er
c190: 72 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20  ror number */.. 
c1a0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e   /* If this is n
c1b0: 6f 74 20 61 20 74 68 72 65 61 64 73 61 66 65 20  ot a threadsafe 
c1c0: 62 75 69 6c 64 20 28 53 51 4c 49 54 45 5f 54 48  build (SQLITE_TH
c1d0: 52 45 41 44 53 41 46 45 3d 3d 30 29 2c 20 74 68  READSAFE==0), th
c1e0: 65 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68 65 20  en use.  ** the 
c1f0: 73 74 72 65 72 72 6f 72 28 29 20 66 75 6e 63 74  strerror() funct
c200: 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  ion to obtain th
c210: 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  e human-readable
c220: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
c230: 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74   ** equivalent t
c240: 6f 20 65 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69  o errno. Otherwi
c250: 73 65 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72  se, use strerror
c260: 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20  _r()..  */ .#if 
c270: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
c280: 45 20 26 26 20 64 65 66 69 6e 65 64 28 48 41 56  E && defined(HAV
c290: 45 5f 53 54 52 45 52 52 4f 52 5f 52 29 0a 20 20  E_STRERROR_R).  
c2a0: 63 68 61 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20  char aErr[80];. 
c2b0: 20 6d 65 6d 73 65 74 28 61 45 72 72 2c 20 30 2c   memset(aErr, 0,
c2c0: 20 73 69 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a   sizeof(aErr));.
c2d0: 20 20 7a 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a    zErr = aErr;..
c2e0: 20 20 2f 2a 20 49 66 20 53 54 52 45 52 52 4f 52    /* If STRERROR
c2f0: 5f 52 5f 43 48 41 52 5f 50 20 28 73 65 74 20 62  _R_CHAR_P (set b
c300: 79 20 61 75 74 6f 63 6f 6e 66 20 73 63 72 69 70  y autoconf scrip
c310: 74 73 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55  ts) or __USE_GNU
c320: 20 69 73 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a   is defined,.  *
c330: 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  * assume that th
c340: 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65  e system provide
c350: 73 20 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f  s the GNU versio
c360: 6e 20 6f 66 20 73 74 72 65 72 72 6f 72 5f 72 28  n of strerror_r(
c370: 29 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 74 75  ) that.  ** retu
c380: 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
c390: 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
c3a0: 6e 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d  ning the error m
c3b0: 65 73 73 61 67 65 2e 20 54 68 61 74 20 70 6f 69  essage. That poi
c3c0: 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20 70  nter .  ** may p
c3d0: 6f 69 6e 74 20 74 6f 20 61 45 72 72 5b 5d 2c 20  oint to aErr[], 
c3e0: 6f 72 20 69 74 20 6d 61 79 20 70 6f 69 6e 74 20  or it may point 
c3f0: 74 6f 20 73 6f 6d 65 20 73 74 61 74 69 63 20 73  to some static s
c400: 74 6f 72 61 67 65 20 73 6f 6d 65 77 68 65 72 65  torage somewhere
c410: 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  . .  ** Otherwis
c420: 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  e, assume that t
c430: 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64  he system provid
c440: 65 73 20 74 68 65 20 50 4f 53 49 58 20 76 65 72  es the POSIX ver
c450: 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 73 74  sion of .  ** st
c460: 72 65 72 72 6f 72 5f 72 28 29 2c 20 77 68 69 63  rerror_r(), whic
c470: 68 20 61 6c 77 61 79 73 20 77 72 69 74 65 73 20  h always writes 
c480: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
c490: 20 69 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a 20 20   into aErr[]..  
c4a0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63  **.  ** If the c
c4b0: 6f 64 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20  ode incorrectly 
c4c0: 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74 20  assumes that it 
c4d0: 69 73 20 74 68 65 20 50 4f 53 49 58 20 76 65 72  is the POSIX ver
c4e0: 73 69 6f 6e 20 74 68 61 74 20 69 73 0a 20 20 2a  sion that is.  *
c4f0: 2a 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 65  * available, the
c500: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77   error message w
c510: 69 6c 6c 20 6f 66 74 65 6e 20 62 65 20 61 6e 20  ill often be an 
c520: 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 4e 6f  empty string. No
c530: 74 20 61 0a 20 20 2a 2a 20 68 75 67 65 20 70 72  t a.  ** huge pr
c540: 6f 62 6c 65 6d 2e 20 49 6e 63 6f 72 72 65 63 74  oblem. Incorrect
c550: 6c 79 20 63 6f 6e 63 6c 75 64 69 6e 67 20 74 68  ly concluding th
c560: 61 74 20 74 68 65 20 47 4e 55 20 76 65 72 73 69  at the GNU versi
c570: 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  on is available 
c580: 0a 20 20 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64  .  ** could lead
c590: 20 74 6f 20 61 20 73 65 67 66 61 75 6c 74 20 74   to a segfault t
c5a0: 68 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23 69 66 20  hough..  */.#if 
c5b0: 64 65 66 69 6e 65 64 28 53 54 52 45 52 52 4f 52  defined(STRERROR
c5c0: 5f 52 5f 43 48 41 52 5f 50 29 20 7c 7c 20 64 65  _R_CHAR_P) || de
c5d0: 66 69 6e 65 64 28 5f 5f 55 53 45 5f 47 4e 55 29  fined(__USE_GNU)
c5e0: 0a 20 20 7a 45 72 72 20 3d 20 0a 23 20 65 6e 64  .  zErr = .# end
c5f0: 69 66 0a 20 20 73 74 72 65 72 72 6f 72 5f 72 28  if.  strerror_r(
c600: 69 45 72 72 6e 6f 2c 20 61 45 72 72 2c 20 73 69  iErrno, aErr, si
c610: 7a 65 6f 66 28 61 45 72 72 29 2d 31 29 3b 0a 0a  zeof(aErr)-1);..
c620: 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 54 48 52  #elif SQLITE_THR
c630: 45 41 44 53 41 46 45 0a 20 20 2f 2a 20 54 68 69  EADSAFE.  /* Thi
c640: 73 20 69 73 20 61 20 74 68 72 65 61 64 73 61 66  s is a threadsaf
c650: 65 20 62 75 69 6c 64 2c 20 62 75 74 20 73 74 72  e build, but str
c660: 65 72 72 6f 72 5f 72 28 29 20 69 73 20 6e 6f 74  error_r() is not
c670: 20 61 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 20   available. */. 
c680: 20 7a 45 72 72 20 3d 20 22 22 3b 0a 23 65 6c 73   zErr = "";.#els
c690: 65 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65 61  e.  /* Non-threa
c6a0: 64 73 61 66 65 20 62 75 69 6c 64 2c 20 75 73 65  dsafe build, use
c6b0: 20 73 74 72 65 72 72 6f 72 28 29 2e 20 2a 2f 0a   strerror(). */.
c6c0: 20 20 7a 45 72 72 20 3d 20 73 74 72 65 72 72 6f    zErr = strerro
c6d0: 72 28 69 45 72 72 6e 6f 29 3b 0a 23 65 6e 64 69  r(iErrno);.#endi
c6e0: 66 0a 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d  f..  if( zPath==
c6f0: 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a  0 ) zPath = "";.
c700: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72    sqlite3_log(er
c710: 72 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73  rcode,.      "os
c720: 5f 75 6e 69 78 2e 63 3a 25 64 3a 20 28 25 64 29  _unix.c:%d: (%d)
c730: 20 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20   %s(%s) - %s",. 
c740: 20 20 20 20 20 69 4c 69 6e 65 2c 20 69 45 72 72       iLine, iErr
c750: 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68  no, zFunc, zPath
c760: 2c 20 7a 45 72 72 0a 20 20 29 3b 0a 0a 20 20 72  , zErr.  );..  r
c770: 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d  eturn errcode;.}
c780: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
c790: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
c7a0: 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65  .**.** We assume
c7b0: 20 74 68 61 74 20 63 6c 6f 73 65 28 29 20 61 6c   that close() al
c7c0: 6d 6f 73 74 20 61 6c 77 61 79 73 20 77 6f 72 6b  most always work
c7d0: 73 2c 20 73 69 6e 63 65 20 69 74 20 69 73 20 6f  s, since it is o
c7e0: 6e 6c 79 20 69 6e 20 61 0a 2a 2a 20 76 65 72 79  nly in a.** very
c7f0: 20 73 69 63 6b 20 61 70 70 6c 69 63 61 74 69 6f   sick applicatio
c800: 6e 20 6f 72 20 6f 6e 20 61 20 76 65 72 79 20 73  n or on a very s
c810: 69 63 6b 20 70 6c 61 74 66 6f 72 6d 20 74 68 61  ick platform tha
c820: 74 20 69 74 20 6d 69 67 68 74 20 66 61 69 6c 2e  t it might fail.
c830: 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73 20 66  .** If it does f
c840: 61 69 6c 2c 20 73 69 6d 70 6c 79 20 6c 65 61 6b  ail, simply leak
c850: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
c860: 70 74 6f 72 2c 20 62 75 74 20 64 6f 20 6c 6f 67  ptor, but do log
c870: 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a   the.** error..*
c880: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
c890: 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f  t is not safe to
c8a0: 20 72 65 74 72 79 20 63 6c 6f 73 65 28 29 20 61   retry close() a
c8b0: 66 74 65 72 20 45 49 4e 54 52 20 73 69 6e 63 65  fter EINTR since
c8c0: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73   the.** file des
c8d0: 63 72 69 70 74 6f 72 20 6d 69 67 68 74 20 68 61  criptor might ha
c8e0: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
c8f0: 72 65 75 73 65 64 20 62 79 20 61 6e 6f 74 68 65  reused by anothe
c900: 72 20 74 68 72 65 61 64 2e 0a 2a 2a 20 53 6f 20  r thread..** So 
c910: 77 65 20 64 6f 6e 27 74 20 65 76 65 6e 20 74 72  we don't even tr
c920: 79 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f  y to recover fro
c930: 6d 20 61 6e 20 45 49 4e 54 52 2e 20 20 4a 75 73  m an EINTR.  Jus
c940: 74 20 6c 6f 67 20 74 68 65 20 65 72 72 6f 72 0a  t log the error.
c950: 2a 2a 20 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e 0a  ** and move on..
c960: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
c970: 6f 62 75 73 74 5f 63 6c 6f 73 65 28 75 6e 69 78  obust_close(unix
c980: 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  File *pFile, int
c990: 20 68 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b   h, int lineno){
c9a0: 0a 20 20 69 66 28 20 6f 73 43 6c 6f 73 65 28 68  .  if( osClose(h
c9b0: 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c 6f 67  ) ){.    unixLog
c9c0: 45 72 72 6f 72 41 74 4c 69 6e 65 28 53 51 4c 49  ErrorAtLine(SQLI
c9d0: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20  TE_IOERR_CLOSE, 
c9e0: 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20 20 20 20  "close",.       
c9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca00: 70 46 69 6c 65 20 3f 20 70 46 69 6c 65 2d 3e 7a  pFile ? pFile->z
ca10: 50 61 74 68 20 3a 20 30 2c 20 6c 69 6e 65 6e 6f  Path : 0, lineno
ca20: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
ca30: 53 65 74 20 74 68 65 20 70 46 69 6c 65 2d 3e 6c  Set the pFile->l
ca40: 61 73 74 45 72 72 6e 6f 2e 20 20 44 6f 20 74 68  astErrno.  Do th
ca50: 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74 69  is in a subrouti
ca60: 6e 65 20 61 73 20 74 68 61 74 20 70 72 6f 76 69  ne as that provi
ca70: 64 65 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74  des a convenient
ca80: 0a 2a 2a 20 70 6c 61 63 65 20 74 6f 20 73 65 74  .** place to set
ca90: 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 2e 0a 2a   a breakpoint..*
caa0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74  /.static void st
cab0: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 75 6e 69  oreLastErrno(uni
cac0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e  xFile *pFile, in
cad0: 74 20 65 72 72 6f 72 29 7b 0a 20 20 70 46 69 6c  t error){.  pFil
cae0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
caf0: 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rror;.}../*.** C
cb00: 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20 64 65  lose all file de
cb10: 73 63 72 69 70 74 6f 72 73 20 61 63 63 75 6d 75  scriptors accumu
cb20: 61 74 65 64 20 69 6e 20 74 68 65 20 75 6e 69 78  ated in the unix
cb30: 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e 75 73  InodeInfo->pUnus
cb40: 65 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74 61  ed list..*/ .sta
cb50: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 50 65  tic void closePe
cb60: 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46 69 6c  ndingFds(unixFil
cb70: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69  e *pFile){.  uni
cb80: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
cb90: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
cba0: 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64  de;.  UnixUnused
cbb0: 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75  Fd *p;.  UnixUnu
cbc0: 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20  sedFd *pNext;.  
cbd0: 66 6f 72 28 70 3d 70 49 6e 6f 64 65 2d 3e 70 55  for(p=pInode->pU
cbe0: 6e 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78  nused; p; p=pNex
cbf0: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
cc00: 70 2d 3e 70 4e 65 78 74 3b 0a 23 69 66 20 4f 53  p->pNext;.#if OS
cc10: 43 4c 4f 53 45 5f 43 48 45 43 4b 5f 43 4c 4f 53  CLOSE_CHECK_CLOS
cc20: 45 5f 49 4f 45 52 52 0a 20 20 20 20 69 66 28 20  E_IOERR.    if( 
cc30: 63 6c 6f 73 65 28 70 2d 3e 66 64 29 20 29 7b 0a  close(p->fd) ){.
cc40: 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
cc50: 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
cc60: 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  o);.      rc = S
cc70: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
cc80: 45 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78  E;.      p->pNex
cc90: 74 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20 20  t = pError;.    
cca0: 20 20 70 45 72 72 6f 72 20 3d 20 70 3b 0a 20 20    pError = p;.  
ccb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
ccc0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
ccd0: 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
cce0: 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
ccf0: 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c 49 4e  le, p->fd, __LIN
cd00: 45 5f 5f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  E__);.    sqlite
cd10: 33 5f 66 72 65 65 28 70 29 3b 0a 23 65 6e 64 69  3_free(p);.#endi
cd20: 66 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e  f.  }.  pInode->
cd30: 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a  pUnused = 0;.}..
cd40: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
cd50: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74  unixInodeInfo st
cd60: 72 75 63 74 75 72 65 20 70 72 65 76 69 6f 75 73  ructure previous
cd70: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ly allocated by 
cd80: 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e  findInodeInfo().
cd90: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78  .**.** The mutex
cda0: 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74   entered using t
cdb0: 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
cdc0: 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  x() function mus
cdd0: 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65  t be held.** whe
cde0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
cdf0: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
ce00: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
ce10: 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46  eInodeInfo(unixF
ce20: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75  ile *pFile){.  u
ce30: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
ce40: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
ce50: 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  node;.  assert( 
ce60: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
ce70: 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
ce80: 70 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20 20 70  pInode) ){.    p
ce90: 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  Inode->nRef--;. 
cea0: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
ceb0: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
cec0: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
ced0: 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20  pShmNode==0 );. 
cee0: 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e       closePendin
cef0: 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20  gFds(pFile);.   
cf00: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70     if( pInode->p
cf10: 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  Prev ){.        
cf20: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
cf30: 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49  pPrev->pNext==pI
cf40: 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20  node );.        
cf50: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70  pInode->pPrev->p
cf60: 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  Next = pInode->p
cf70: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Next;.      }els
cf80: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
cf90: 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49  t( inodeList==pI
cfa0: 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20  node );.        
cfb0: 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f  inodeList = pIno
cfc0: 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  de->pNext;.     
cfd0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e   }.      if( pIn
cfe0: 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ode->pNext ){.  
cff0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
d000: 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  node->pNext->pPr
d010: 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  ev==pInode );.  
d020: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e        pInode->pN
d030: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e  ext->pPrev = pIn
d040: 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  ode->pPrev;.    
d050: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
d060: 33 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a  3_free(pInode);.
d070: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
d080: 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20  ** Given a file 
d090: 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61  descriptor, loca
d0a0: 74 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  te the unixInode
d0b0: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74  Info object that
d0c0: 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 68  .** describes th
d0d0: 61 74 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  at file descript
d0e0: 6f 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  or.  Create a ne
d0f0: 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
d100: 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75  ry.  The.** retu
d110: 72 6e 20 76 61 6c 75 65 20 6d 69 67 68 74 20 62  rn value might b
d120: 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  e uninitialized 
d130: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
d140: 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75  rs..**.** The mu
d150: 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e  tex entered usin
d160: 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d  g the unixEnterM
d170: 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20  utex() function 
d180: 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20  must be held.** 
d190: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
d1a0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  on is called..**
d1b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 70  .** Return an ap
d1c0: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
d1d0: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
d1e0: 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  int findInodeInf
d1f0: 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  o(.  unixFile *p
d200: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
d210: 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65      /* Unix file
d220: 20 77 69 74 68 20 66 69 6c 65 20 64 65 73 63 20   with file desc 
d230: 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20  used in the key 
d240: 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
d250: 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20  fo **ppInode    
d260: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
d270: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
d280: 6f 62 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a 29  object here */.)
d290: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
d2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2b0: 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c     /* System cal
d2c0: 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  l return code */
d2d0: 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2f0: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
d300: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46 69  scriptor for pFi
d310: 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  le */.  struct u
d320: 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64  nixFileId fileId
d330: 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70  ;      /* Lookup
d340: 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69   key for the uni
d350: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20  xInodeInfo */.  
d360: 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74  struct stat stat
d370: 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f  buf;           /
d380: 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65  * Low-level file
d390: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
d3a0: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
d3b0: 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20  *pInode = 0;    
d3c0: 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75 6e   /* Candidate un
d3d0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
d3e0: 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ct */..  assert(
d3f0: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
d400: 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f   );..  /* Get lo
d410: 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74  w-level informat
d420: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69  ion about the fi
d430: 6c 65 20 74 68 61 74 20 77 65 20 63 61 6e 20 75  le that we can u
d440: 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61  sed to.  ** crea
d450: 74 65 20 61 20 75 6e 69 71 75 65 20 6e 61 6d 65  te a unique name
d460: 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 20   for the file.. 
d470: 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c 65   */.  fd = pFile
d480: 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73  ->h;.  rc = osFs
d490: 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66  tat(fd, &statbuf
d4a0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
d4b0: 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45  {.    storeLastE
d4c0: 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
d4d0: 6f 29 3b 0a 23 69 66 64 65 66 20 45 4f 56 45 52  o);.#ifdef EOVER
d4e0: 46 4c 4f 57 0a 20 20 20 20 69 66 28 20 70 46 69  FLOW.    if( pFi
d4f0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  le->lastErrno==E
d500: 4f 56 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72  OVERFLOW ) retur
d510: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a  n SQLITE_NOLFS;.
d520: 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
d530: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
d540: 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50    }..#ifdef __AP
d550: 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53  PLE__.  /* On OS
d560: 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66   X on an msdos f
d570: 69 6c 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69  ilesystem, the i
d580: 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72  node number is r
d590: 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63  eported.  ** inc
d5a0: 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72  orrectly for zer
d5b0: 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53  o-size files.  S
d5c0: 65 65 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e  ee ticket #3260.
d5d0: 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61    To work.  ** a
d5e0: 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c  round this probl
d5f0: 65 6d 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20  em (we consider 
d600: 69 74 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58  it a bug in OS X
d610: 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20  , not SQLite).  
d620: 2a 2a 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63  ** we always inc
d630: 72 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 73  rease the file s
d640: 69 7a 65 20 74 6f 20 31 20 62 79 20 77 72 69 74  ize to 1 by writ
d650: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74  ing a single byt
d660: 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20  e.  ** prior to 
d670: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e  accessing the in
d680: 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  ode number.  The
d690: 20 6f 6e 65 20 62 79 74 65 20 77 72 69 74 74 65   one byte writte
d6a0: 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43  n is.  ** an ASC
d6b0: 49 49 20 27 53 27 20 63 68 61 72 61 63 74 65 72  II 'S' character
d6c0: 20 77 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70   which also happ
d6d0: 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20 66 69  ens to be the fi
d6e0: 72 73 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e  rst byte.  ** in
d6f0: 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 65   the header of e
d700: 76 65 72 79 20 53 51 4c 69 74 65 20 64 61 74 61  very SQLite data
d710: 62 61 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77  base.  In this w
d720: 61 79 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a  ay, if there.  *
d730: 2a 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64  * is a race cond
d740: 69 74 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ition such that 
d750: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68  another thread h
d760: 61 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c  as already popul
d770: 61 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69  ated.  ** the fi
d780: 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
d790: 64 61 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d  database, no dam
d7a0: 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a  age is done..  *
d7b0: 2f 0a 20 20 69 66 28 20 73 74 61 74 62 75 66 2e  /.  if( statbuf.
d7c0: 73 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70  st_size==0 && (p
d7d0: 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20  File->fsFlags & 
d7e0: 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49  SQLITE_FSFLAGS_I
d7f0: 53 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20  S_MSDOS)!=0 ){. 
d800: 20 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72     do{ rc = osWr
d810: 69 74 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b  ite(fd, "S", 1);
d820: 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
d830: 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
d840: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 31 20 29  .    if( rc!=1 )
d850: 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
d860: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
d870: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75  rno);.      retu
d880: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
d890: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
d8a0: 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61  osFstat(fd, &sta
d8b0: 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72  tbuf);.    if( r
d8c0: 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74  c!=0 ){.      st
d8d0: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
d8e0: 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
d8f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d900: 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  IOERR;.    }.  }
d910: 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65  .#endif..  memse
d920: 74 28 26 66 69 6c 65 49 64 2c 20 30 2c 20 73 69  t(&fileId, 0, si
d930: 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20  zeof(fileId));. 
d940: 20 66 69 6c 65 49 64 2e 64 65 76 20 3d 20 73 74   fileId.dev = st
d950: 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69  atbuf.st_dev;.#i
d960: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66  f OS_VXWORKS.  f
d970: 69 6c 65 49 64 2e 70 49 64 20 3d 20 70 46 69 6c  ileId.pId = pFil
d980: 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20  e->pId;.#else.  
d990: 66 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73 74 61  fileId.ino = sta
d9a0: 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e  tbuf.st_ino;.#en
d9b0: 64 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69  dif.  pInode = i
d9c0: 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c  nodeList;.  whil
d9d0: 65 28 20 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d  e( pInode && mem
d9e0: 63 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70 49  cmp(&fileId, &pI
d9f0: 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69  node->fileId, si
da00: 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b  zeof(fileId)) ){
da10: 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49  .    pInode = pI
da20: 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  node->pNext;.  }
da30: 0a 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30  .  if( pInode==0
da40: 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d   ){.    pInode =
da50: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
da60: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29   sizeof(*pInode)
da70: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   );.    if( pIno
da80: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  de==0 ){.      r
da90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
daa0: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  EM;.    }.    me
dab0: 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c 20  mset(pInode, 0, 
dac0: 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 29  sizeof(*pInode))
dad0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 49  ;.    memcpy(&pI
dae0: 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26 66  node->fileId, &f
daf0: 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69  ileId, sizeof(fi
db00: 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e 6f  leId));.    pIno
db10: 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  de->nRef = 1;.  
db20: 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20    pInode->pNext 
db30: 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20  = inodeList;.   
db40: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d   pInode->pPrev =
db50: 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f 64   0;.    if( inod
db60: 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69 73  eList ) inodeLis
db70: 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64  t->pPrev = pInod
db80: 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73 74  e;.    inodeList
db90: 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c   = pInode;.  }el
dba0: 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  se{.    pInode->
dbb0: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70  nRef++;.  }.  *p
dbc0: 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b  pInode = pInode;
dbd0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
dbe0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
dbf0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 70 46 69  turn TRUE if pFi
dc00: 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65 6e 61  le has been rena
dc10: 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 20  med or unlinked 
dc20: 73 69 6e 63 65 20 69 74 20 77 61 73 20 66 69 72  since it was fir
dc30: 73 74 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 74  st opened..*/.st
dc40: 61 74 69 63 20 69 6e 74 20 66 69 6c 65 48 61 73  atic int fileHas
dc50: 4d 6f 76 65 64 28 75 6e 69 78 46 69 6c 65 20 2a  Moved(unixFile *
dc60: 70 46 69 6c 65 29 7b 0a 23 69 66 20 4f 53 5f 56  pFile){.#if OS_V
dc70: 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20  XWORKS.  return 
dc80: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30  pFile->pInode!=0
dc90: 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 64 21 3d   && pFile->pId!=
dca0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 66  pFile->pInode->f
dcb0: 69 6c 65 49 64 2e 70 49 64 3b 0a 23 65 6c 73 65  ileId.pId;.#else
dcc0: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
dcd0: 75 66 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 69  uf;.  return pFi
dce0: 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20 26 26  le->pInode!=0 &&
dcf0: 0a 20 20 20 20 20 20 28 6f 73 53 74 61 74 28 70  .      (osStat(p
dd00: 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 62 75  File->zPath, &bu
dd10: 66 29 21 3d 30 20 7c 7c 20 62 75 66 2e 73 74 5f  f)!=0 || buf.st_
dd20: 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f  ino!=pFile->pIno
dd30: 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 29 3b  de->fileId.ino);
dd40: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
dd50: 2a 20 43 68 65 63 6b 20 61 20 75 6e 69 78 46 69  * Check a unixFi
dd60: 6c 65 20 74 68 61 74 20 69 73 20 61 20 64 61 74  le that is a dat
dd70: 61 62 61 73 65 2e 20 20 56 65 72 69 66 79 20 74  abase.  Verify t
dd80: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
dd90: 0a 2a 2a 20 28 31 29 20 54 68 65 72 65 20 69 73  .** (1) There is
dda0: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 68 61 72   exactly one har
ddb0: 64 20 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 66 69  d link on the fi
ddc0: 6c 65 0a 2a 2a 20 28 32 29 20 54 68 65 20 66 69  le.** (2) The fi
ddd0: 6c 65 20 69 73 20 6e 6f 74 20 61 20 73 79 6d 62  le is not a symb
dde0: 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20 28 33 29  olic link.** (3)
ddf0: 20 54 68 65 20 66 69 6c 65 20 68 61 73 20 6e 6f   The file has no
de00: 74 20 62 65 65 6e 20 72 65 6e 61 6d 65 64 20 6f  t been renamed o
de10: 72 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 0a 2a 2a  r unlinked.**.**
de20: 20 49 73 73 75 65 20 73 71 6c 69 74 65 33 5f 6c   Issue sqlite3_l
de30: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
de40: 47 2c 2e 2e 2e 29 20 6d 65 73 73 61 67 65 73 20  G,...) messages 
de50: 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 6e  if anything is n
de60: 6f 74 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61  ot right..*/.sta
de70: 74 69 63 20 76 6f 69 64 20 76 65 72 69 66 79 44  tic void verifyD
de80: 62 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  bFile(unixFile *
de90: 70 46 69 6c 65 29 7b 0a 20 20 73 74 72 75 63 74  pFile){.  struct
dea0: 20 73 74 61 74 20 62 75 66 3b 0a 20 20 69 6e 74   stat buf;.  int
deb0: 20 72 63 3b 0a 20 20 69 66 28 20 70 46 69 6c 65   rc;.  if( pFile
dec0: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
ded0: 49 58 46 49 4c 45 5f 57 41 52 4e 45 44 20 29 7b  IXFILE_WARNED ){
dee0: 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 6d  .    /* One or m
def0: 6f 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ore of the follo
df00: 77 69 6e 67 20 77 61 72 6e 69 6e 67 73 20 68 61  wing warnings ha
df10: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
df20: 69 73 73 75 65 64 2e 20 20 44 6f 20 6e 6f 74 0a  issued.  Do not.
df30: 20 20 20 20 2a 2a 20 72 65 70 65 61 74 20 74 68      ** repeat th
df40: 65 6d 20 73 6f 20 61 73 20 6e 6f 74 20 74 6f 20  em so as not to 
df50: 63 6c 75 74 74 65 72 20 74 68 65 20 65 72 72 6f  clutter the erro
df60: 72 20 6c 6f 67 20 2a 2f 0a 20 20 20 20 72 65 74  r log */.    ret
df70: 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  urn;.  }.  rc = 
df80: 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68  osFstat(pFile->h
df90: 2c 20 26 62 75 66 29 3b 0a 20 20 69 66 28 20 72  , &buf);.  if( r
dfa0: 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  c!=0 ){.    sqli
dfb0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
dfc0: 41 52 4e 49 4e 47 2c 20 22 63 61 6e 6e 6f 74 20  ARNING, "cannot 
dfd0: 66 73 74 61 74 20 64 62 20 66 69 6c 65 20 25 73  fstat db file %s
dfe0: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
dff0: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  ;.    pFile->ctr
e000: 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
e010: 4c 45 5f 57 41 52 4e 45 44 3b 0a 20 20 20 20 72  LE_WARNED;.    r
e020: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
e030: 20 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3d 3d 30   buf.st_nlink==0
e040: 20 26 26 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c   && (pFile->ctrl
e050: 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
e060: 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20  _DELETE)==0 ){. 
e070: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
e080: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22  QLITE_WARNING, "
e090: 66 69 6c 65 20 75 6e 6c 69 6e 6b 65 64 20 77 68  file unlinked wh
e0a0: 69 6c 65 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70  ile open: %s", p
e0b0: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
e0c0: 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
e0d0: 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 57  gs |= UNIXFILE_W
e0e0: 41 52 4e 45 44 3b 0a 20 20 20 20 72 65 74 75 72  ARNED;.    retur
e0f0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62 75 66  n;.  }.  if( buf
e100: 2e 73 74 5f 6e 6c 69 6e 6b 3e 31 20 29 7b 0a 20  .st_nlink>1 ){. 
e110: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
e120: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22  QLITE_WARNING, "
e130: 6d 75 6c 74 69 70 6c 65 20 6c 69 6e 6b 73 20 74  multiple links t
e140: 6f 20 66 69 6c 65 3a 20 25 73 22 2c 20 70 46 69  o file: %s", pFi
e150: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
e160: 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
e170: 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 57 41 52   |= UNIXFILE_WAR
e180: 4e 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  NED;.    return;
e190: 0a 20 20 7d 0a 20 20 69 66 28 20 66 69 6c 65 48  .  }.  if( fileH
e1a0: 61 73 4d 6f 76 65 64 28 70 46 69 6c 65 29 20 29  asMoved(pFile) )
e1b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
e1c0: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
e1d0: 2c 20 22 66 69 6c 65 20 72 65 6e 61 6d 65 64 20  , "file renamed 
e1e0: 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73 22 2c  while open: %s",
e1f0: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
e200: 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
e210: 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
e220: 5f 57 41 52 4e 45 44 3b 0a 20 20 20 20 72 65 74  _WARNED;.    ret
e230: 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  urn;.  }.}.../*.
e240: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
e250: 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
e260: 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
e270: 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
e280: 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
e290: 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
e2a0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
e2b0: 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
e2c0: 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
e2d0: 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
e2e0: 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
e2f0: 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
e300: 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
e310: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
e320: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
e330: 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
e340: 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
e350: 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
e360: 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
e370: 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52  c int unixCheckR
e380: 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
e390: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
e3a0: 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69  t *pResOut){.  i
e3b0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
e3c0: 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
e3d0: 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
e3e0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
e3f0: 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
e400: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
e410: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
e420: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
e430: 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72  OCK; );..  asser
e440: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 75 6e  t( pFile );.  un
e450: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20  ixEnterMutex(); 
e460: 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65  /* Because pFile
e470: 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
e480: 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
e490: 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  s */..  /* Check
e4a0: 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
e4b0: 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
e4c0: 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
e4d0: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  /.  if( pFile->p
e4e0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
e4f0: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
e500: 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
e510: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65  ;.  }..  /* Othe
e520: 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
e530: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
e540: 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23  holds it..  */.#
e550: 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f  ifndef __DJGPP__
e560: 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
e570: 20 26 26 20 21 70 46 69 6c 65 2d 3e 70 49 6e 6f   && !pFile->pIno
e580: 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
e590: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66   ){.    struct f
e5a0: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c  lock lock;.    l
e5b0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
e5c0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63  EEK_SET;.    loc
e5d0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45  k.l_start = RESE
e5e0: 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c  RVED_BYTE;.    l
e5f0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  ock.l_len = 1;. 
e600: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
e610: 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66   F_WRLCK;.    if
e620: 28 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d  ( osFcntl(pFile-
e630: 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f  >h, F_GETLK, &lo
e640: 63 6b 29 20 29 7b 0a 23 69 66 20 4f 53 4c 4f 43  ck) ){.#if OSLOC
e650: 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f  KING_CHECK_BUSY_
e660: 49 4f 45 52 52 0a 20 20 20 20 20 20 69 6e 74 20  IOERR.      int 
e670: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
e680: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e690: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
e6a0: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
e6b0: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
e6c0: 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20  ESERVEDLOCK);.  
e6d0: 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
e6e0: 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
e6f0: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72  );.#else.      r
e700: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
e710: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
e720: 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c  CK;.      storeL
e730: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
e740: 65 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 20  errno);.#endif. 
e750: 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f     } else if( lo
e760: 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c  ck.l_type!=F_UNL
e770: 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65  CK ){.      rese
e780: 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rved = 1;.    }.
e790: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
e7a0: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
e7b0: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ;.  OSTRACE(("TE
e7c0: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
e7d0: 20 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70   %d (unix)\n", p
e7e0: 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
e7f0: 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65  erved));..  *pRe
e800: 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
e810: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e820: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
e830: 6f 20 73 65 74 20 61 20 73 79 73 74 65 6d 2d 6c  o set a system-l
e840: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
e850: 70 46 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b  pFile.  The lock
e860: 20 69 73 20 0a 2a 2a 20 64 65 73 63 72 69 62 65   is .** describe
e870: 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a  d by pLock..**.*
e880: 2a 20 49 66 20 74 68 65 20 70 46 69 6c 65 20 77  * If the pFile w
e890: 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77  as opened read/w
e8a0: 72 69 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65  rite from unix-e
e8b0: 78 63 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e  xcl, then the on
e8c0: 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20  ly lock.** ever 
e8d0: 6f 62 74 61 69 6e 65 64 20 69 73 20 61 6e 20 65  obtained is an e
e8e0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61  xclusive lock, a
e8f0: 6e 64 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65  nd it is obtaine
e900: 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a  d exactly once.*
e910: 2a 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  * the first time
e920: 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74 74   any lock is att
e930: 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73 75 62  empted.  All sub
e940: 73 65 71 75 65 6e 74 20 73 79 73 74 65 6d 20 6c  sequent system l
e950: 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  ocking.** operat
e960: 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f  ions become no-o
e970: 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65  ps.  Locking ope
e980: 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61  rations still ha
e990: 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c  ppen internally,
e9a0: 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
e9b0: 63 6f 6f 72 64 69 6e 61 74 65 20 61 63 63 65 73  coordinate acces
e9c0: 73 20 62 65 74 77 65 65 6e 20 73 65 70 61 72 61  s between separa
e9d0: 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  te database conn
e9e0: 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69  ections.** withi
e9f0: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20  n this process, 
ea00: 62 75 74 20 61 6c 6c 20 6f 66 20 74 68 61 74 20  but all of that 
ea10: 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65  is handled in me
ea20: 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20  mory and the.** 
ea30: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
ea40: 20 64 6f 65 73 20 6e 6f 74 20 70 61 72 74 69 63   does not partic
ea50: 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ipate..**.** Thi
ea60: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
ea70: 70 61 73 73 2d 74 68 72 6f 75 67 68 20 74 6f 20  pass-through to 
ea80: 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69  fcntl(F_SETLK) i
ea90: 66 20 70 46 69 6c 65 20 69 73 20 75 73 69 6e 67  f pFile is using
eaa0: 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f 74 68 65  .** any VFS othe
eab0: 72 20 74 68 61 6e 20 22 75 6e 69 78 2d 65 78 63  r than "unix-exc
eac0: 6c 22 20 6f 72 20 69 66 20 70 46 69 6c 65 20 69  l" or if pFile i
ead0: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69  s opened on "uni
eae0: 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69  x-excl".** and i
eaf0: 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a  s read-only..**.
eb00: 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72  ** Zero is retur
eb10: 6e 65 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20  ned if the call 
eb20: 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73  completes succes
eb30: 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66  sfully, or -1 if
eb40: 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63   a call.** to fc
eb50: 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e 20  ntl() fails. In 
eb60: 74 68 69 73 20 63 61 73 65 2c 20 65 72 72 6e 6f  this case, errno
eb70: 20 69 73 20 73 65 74 20 61 70 70 72 6f 70 72 69   is set appropri
eb80: 61 74 65 6c 79 20 28 62 79 20 66 63 6e 74 6c 28  ately (by fcntl(
eb90: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ))..*/.static in
eba0: 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75  t unixFileLock(u
ebb0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
ebc0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c  struct flock *pL
ebd0: 6f 63 6b 2c 20 69 6e 74 20 6e 52 65 74 72 79 29  ock, int nRetry)
ebe0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  {.  int rc;.  un
ebf0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
ec00: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
ec10: 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75  ode;.  assert( u
ec20: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
ec30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f  ;.  assert( pIno
ec40: 64 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28  de!=0 );.  if( (
ec50: 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67  (pFile->ctrlFlag
ec60: 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 45 58 43  s & UNIXFILE_EXC
ec70: 4c 29 21 3d 30 20 7c 7c 20 70 49 6e 6f 64 65 2d  L)!=0 || pInode-
ec80: 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 29 0a 20  >bProcessLock). 
ec90: 20 20 26 26 20 28 28 70 46 69 6c 65 2d 3e 63 74    && ((pFile->ct
eca0: 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
ecb0: 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 29 0a 20  LE_RDONLY)==0). 
ecc0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   ){.    if( pIno
ecd0: 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
ece0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72  ==0 ){.      str
ecf0: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
ed00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
ed10: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29  node->nLock==0 )
ed20: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ;.      lock.l_w
ed30: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
ed40: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ;.      lock.l_s
ed50: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
ed60: 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  RST;.      lock.
ed70: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
ed80: 49 5a 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  IZE;.      lock.
ed90: 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b  l_type = F_WRLCK
eda0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73 46  ;.      rc = osF
edb0: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
edc0: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a  _SETLK, &lock);.
edd0: 20 20 20 20 20 20 69 66 28 20 72 63 3c 30 20 29        if( rc<0 )
ede0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
edf0: 20 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65    pInode->bProce
ee00: 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20  ssLock = 1;.    
ee10: 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
ee20: 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
ee30: 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
ee40: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
ee50: 6e 74 20 69 20 3d 20 30 3b 20 20 20 20 20 20 20  nt i = 0;       
ee60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
ee70: 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72      do {.      r
ee80: 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c  c = osFcntl(pFil
ee90: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 70  e->h, F_SETLK, p
eea0: 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 69 66 28  Lock);.      if(
eeb0: 20 72 63 20 26 26 20 6e 52 65 74 72 79 20 29 7b   rc && nRetry ){
eec0: 0a 20 20 20 20 20 20 20 20 20 75 73 6c 65 65 70  .         usleep
eed0: 28 31 30 30 20 2a 20 28 2b 2b 69 29 29 3b 0a 20  (100 * (++i));. 
eee0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c       }.    }whil
eef0: 65 28 20 21 72 63 20 26 26 20 6e 52 65 74 72 79  e( !rc && nRetry
ef00: 2d 2d 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  -- );.  }.  retu
ef10: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
ef20: 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
ef30: 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
ef40: 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
ef50: 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
ef60: 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
ef70: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
ef80: 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
ef90: 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
efa0: 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
efb0: 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
efc0: 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
efd0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
efe0: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
eff0: 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
f000: 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
f010: 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
f020: 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
f030: 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
f040: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
f050: 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
f060: 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
f070: 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
f080: 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
f090: 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
f0a0: 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
f0b0: 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
f0c0: 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
f0d0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
f0e0: 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
f0f0: 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
f100: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
f110: 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
f120: 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
f130: 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
f140: 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
f150: 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
f160: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
f170: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
f180: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
f190: 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
f1a0: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
f1b0: 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
f1c0: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
f1d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
f1e0: 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
f1f0: 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
f200: 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
f210: 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
f220: 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
f230: 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
f240: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63  atic int unixLoc
f250: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
f260: 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
f270: 6b 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  k){.  /* The fol
f280: 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65 73  lowing describes
f290: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
f2a0: 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f  ion of the vario
f2b0: 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a  us locks and.  *
f2c0: 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f  * lock transitio
f2d0: 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74  ns in terms of t
f2e0: 68 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  he POSIX advisor
f2f0: 79 20 73 68 61 72 65 64 20 61 6e 64 20 65 78 63  y shared and exc
f300: 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b  lusive.  ** lock
f310: 20 70 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c   primitives (cal
f320: 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61  led read-locks a
f330: 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62  nd write-locks b
f340: 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20  elow, to avoid. 
f350: 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69   ** confusion wi
f360: 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e  th SQLite lock n
f370: 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72  ames). The algor
f380: 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69  ithms are compli
f390: 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68  cated.  ** sligh
f3a0: 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  tly in order to 
f3b0: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
f3c0: 74 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65  th windows syste
f3d0: 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c  ms simultaneousl
f3e0: 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67  y.  ** accessing
f3f0: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
f400: 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65  se file, in case
f410: 20 74 68 61 74 20 69 73 20 65 76 65 72 20 72 65   that is ever re
f420: 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  quired..  **.  *
f430: 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65  * Symbols define
f440: 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74  d in os.h indent
f450: 69 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67  ify the 'pending
f460: 20 62 79 74 65 27 20 61 6e 64 20 74 68 65 20 27   byte' and the '
f470: 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79  reserved.  ** by
f480: 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65  te', each single
f490: 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b   bytes at well k
f4a0: 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e  nown offsets, an
f4b0: 64 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  d the 'shared by
f4c0: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20  te.  ** range', 
f4d0: 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62  a range of 510 b
f4e0: 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b  ytes at a well k
f4f0: 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a  nown offset..  *
f500: 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e  *.  ** To obtain
f510: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
f520: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f  a read-lock is o
f530: 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27  btained on the '
f540: 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74  pending.  ** byt
f550: 65 27 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  e'.  If this is 
f560: 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72 61  successful, a ra
f570: 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 74  ndom byte from t
f580: 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  he 'shared byte.
f590: 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 72    ** range' is r
f5a0: 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74  ead-locked and t
f5b0: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27  he lock on the '
f5c0: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65  pending byte' re
f5d0: 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  leased..  **.  *
f5e0: 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20  * A process may 
f5f0: 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45  only obtain a RE
f600: 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65  SERVED lock afte
f610: 72 20 69 74 20 68 61 73 20 61 20 53 48 41 52 45  r it has a SHARE
f620: 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52  D lock..  ** A R
f630: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
f640: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67  implemented by g
f650: 72 61 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d  rabbing a write-
f660: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
f670: 20 27 72 65 73 65 72 76 65 64 20 62 79 74 65 27   'reserved byte'
f680: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70  . .  **.  ** A p
f690: 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20  rocess may only 
f6a0: 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47  obtain a PENDING
f6b0: 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68   lock after it h
f6c0: 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20  as obtained a.  
f6d0: 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20  ** SHARED lock. 
f6e0: 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
f6f0: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
f700: 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69   obtaining a wri
f710: 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20  te-lock.  ** on 
f720: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
f730: 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  e'. This ensures
f740: 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41   that no new SHA
f750: 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65  RED locks can be
f760: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20  .  ** obtained, 
f770: 62 75 74 20 65 78 69 73 74 69 6e 67 20 53 48 41  but existing SHA
f780: 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c  RED locks are al
f790: 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73 74  lowed to persist
f7a0: 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a  . A process.  **
f7b0: 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
f7c0: 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52  o obtain a RESER
f7d0: 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
f7e0: 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47  way to a PENDING
f7f0: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73   lock..  ** This
f800: 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65   property is use
f810: 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74  d by the algorit
f820: 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  hm for rolling b
f830: 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ack a journal fi
f840: 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20  le.  ** after a 
f850: 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  crash..  **.  **
f860: 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   An EXCLUSIVE lo
f870: 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74  ck, obtained aft
f880: 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  er a PENDING loc
f890: 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20  k is held, is.  
f8a0: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  ** implemented b
f8b0: 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72  y obtaining a wr
f8c0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
f8d0: 65 6e 74 69 72 65 20 27 73 68 61 72 65 64 20 62  entire 'shared b
f8e0: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e  yte.  ** range'.
f8f0: 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72   Since all other
f900: 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61   locks require a
f910: 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e   read-lock on on
f920: 65 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20  e of the bytes. 
f930: 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20   ** within this 
f940: 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75  range, this ensu
f950: 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  res that no othe
f960: 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64  r locks are held
f970: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
f980: 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a  abase. .  **.  *
f990: 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20 73  * The reason a s
f9a0: 69 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f  ingle byte canno
f9b0: 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61  t be used instea
f9c0: 64 20 6f 66 20 74 68 65 20 27 73 68 61 72 65 64  d of the 'shared
f9d0: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
f9e0: 27 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20 76  ' is that some v
f9f0: 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f  ersions of windo
fa00: 77 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  ws do not suppor
fa10: 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79  t read-locks. By
fa20: 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20  .  ** locking a 
fa30: 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d  random byte from
fa40: 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72   a range, concur
fa50: 72 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63 6b  rent SHARED lock
fa60: 73 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a 2a  s may exist.  **
fa70: 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 63   even if the loc
fa80: 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20 75  king primitive u
fa90: 73 65 64 20 69 73 20 61 6c 77 61 79 73 20 61 20  sed is always a 
faa0: 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f  write-lock..  */
fab0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
fac0: 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
fad0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
fae0: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
faf0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
fb00: 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  e;.  struct floc
fb10: 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45  k lock;.  int tE
fb20: 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73  rrno = 0;..  ass
fb30: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
fb40: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
fb50: 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25    %d %s was %s(%
fb60: 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e  s,%d) pid=%d (un
fb70: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
fb80: 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f  ,.      azFileLo
fb90: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61  ck(eFileLock), a
fba0: 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d  zFileLock(pFile-
fbb0: 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20  >eFileLock),.   
fbc0: 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46     azFileLock(pF
fbd0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
fbe0: 6c 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e  leLock), pFile->
fbf0: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20  pInode->nShared 
fc00: 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20  , getpid()));.. 
fc10: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
fc20: 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
fc30: 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d  f this type or m
fc40: 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20  ore restrictive 
fc50: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78  on the.  ** unix
fc60: 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  File, do nothing
fc70: 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20  . Don't use the 
fc80: 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70  end_lock: exit p
fc90: 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69  ath, as.  ** uni
fca0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61  xEnterMutex() ha
fcb0: 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64  sn't been called
fcc0: 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   yet..  */.  if(
fcd0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
fce0: 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k>=eFileLock ){.
fcf0: 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f      OSTRACE(("LO
fd00: 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28  CK    %d %s ok (
fd10: 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 75  already held) (u
fd20: 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
fd30: 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  h,.            a
fd40: 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
fd50: 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75  ock)));.    retu
fd60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
fd70: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
fd80: 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
fd90: 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
fda0: 74 2e 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20  t..  **  (1) We 
fdb0: 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20  never move from 
fdc0: 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74  unlocked to anyt
fdd0: 68 69 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e  hing higher than
fde0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20   shared lock..  
fdf0: 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e  **  (2) SQLite n
fe00: 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20  ever explicitly 
fe10: 72 65 71 75 65 73 74 73 20 61 20 70 65 6e 64 69  requests a pendi
fe20: 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33  g lock..  **  (3
fe30: 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  ) A shared lock 
fe40: 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77  is always held w
fe50: 68 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f  hen a reserve lo
fe60: 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2e  ck is requested.
fe70: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
fe80: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
fe90: 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69  !=NO_LOCK || eFi
fea0: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
feb0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
fec0: 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44   eFileLock!=PEND
fed0: 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ING_LOCK );.  as
fee0: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21  sert( eFileLock!
fef0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
ff00: 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  | pFile->eFileLo
ff10: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
ff20: 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75  );..  /* This mu
ff30: 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62 65  tex is needed be
ff40: 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
ff50: 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
ff60: 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a  ross threads.  *
ff70: 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
ff80: 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
ff90: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
ffa0: 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68  .  /* If some th
ffb0: 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
ffc0: 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76  PID has a lock v
ffd0: 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75  ia a different u
ffe0: 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61  nixFile*.  ** ha
fff0: 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75  ndle that preclu
10000 64 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65  des the requeste
10010 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42  d lock, return B
10020 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  USY..  */.  if( 
10030 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
10040 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  k!=pInode->eFile
10050 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20  Lock && .       
10060 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c     (pInode->eFil
10070 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c  eLock>=PENDING_L
10080 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
10090 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20  >SHARED_LOCK)). 
100a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
100b0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f  ITE_BUSY;.    go
100c0 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  to end_lock;.  }
100d0 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52  ..  /* If a SHAR
100e0 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ED lock is reque
100f0 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74  sted, and some t
10100 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
10110 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a   PID already.  *
10120 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f  * has a SHARED o
10130 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  r RESERVED lock,
10140 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   then increment 
10150 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73  reference counts
10160 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e   and.  ** return
10170 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f   SQLITE_OK..  */
10180 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
10190 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
101a0 20 0a 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d   .      (pInode-
101b0 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  >eFileLock==SHAR
101c0 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64  ED_LOCK || pInod
101d0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45  e->eFileLock==RE
101e0 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a  SERVED_LOCK) ){.
101f0 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c      assert( eFil
10200 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
10210 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
10220 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
10230 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ck==0 );.    ass
10240 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
10250 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46  ared>0 );.    pF
10260 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
10270 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
10280 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
10290 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  d++;.    pInode-
102a0 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f  >nLock++;.    go
102b0 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  to end_lock;.  }
102c0 0a 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e  ...  /* A PENDIN
102d0 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64  G lock is needed
102e0 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e   before acquirin
102f0 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  g a SHARED lock 
10300 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20  and before.  ** 
10310 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43  acquiring an EXC
10320 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f  LUSIVE lock.  Fo
10330 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63  r the SHARED loc
10340 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77  k, the PENDING w
10350 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65  ill.  ** be rele
10360 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63  ased..  */.  loc
10370 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20  k.l_len = 1L;.  
10380 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
10390 53 45 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20  SEEK_SET;.  if( 
103a0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
103b0 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c  D_LOCK .      ||
103c0 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43   (eFileLock==EXC
103d0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
103e0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
103f0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20  PENDING_LOCK).  
10400 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  ){.    lock.l_ty
10410 70 65 20 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d  pe = (eFileLock=
10420 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52  =SHARED_LOCK?F_R
10430 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20  DLCK:F_WRLCK);. 
10440 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
10450 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
10460 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
10470 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
10480 6b 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 74  k, 0) ){.      t
10490 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
104a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
104b0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
104c0 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
104d0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
104e0 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
104f0 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
10500 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
10510 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
10520 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rno);.      }.  
10530 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
10540 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20  k;.    }.  }... 
10550 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67   /* If control g
10560 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ets to this poin
10570 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79  t, then actually
10580 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61   go ahead and ma
10590 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e  ke.  ** operatin
105a0 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66  g system calls f
105b0 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
105c0 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   lock..  */.  if
105d0 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
105e0 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
105f0 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
10600 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20  nShared==0 );.  
10610 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
10620 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29  ->eFileLock==0 )
10630 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
10640 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
10650 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
10660 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a  he read-lock */.
10670 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
10680 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
10690 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
106a0 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
106b0 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
106c0 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
106d0 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 74 45  , 0) ){.      tE
106e0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
106f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
10700 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
10710 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
10720 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
10730 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f     }..    /* Dro
10740 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  p the temporary 
10750 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a  PENDING lock */.
10760 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
10770 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
10780 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
10790 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  = 1L;.    lock.l
107a0 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
107b0 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
107c0 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
107d0 63 6b 2c 20 31 30 29 20 26 26 20 72 63 3d 3d 53  ck, 10) && rc==S
107e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
107f0 20 20 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64 20    /* This could 
10800 68 61 70 70 65 6e 20 77 69 74 68 20 61 20 6e 65  happen with a ne
10810 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20  twork mount */. 
10820 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
10830 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49  rno;.#if OSLOCKI
10840 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f  NG_CHECK_BUSY_IO
10850 45 52 52 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ERR.      rc = s
10860 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
10870 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
10880 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
10890 4c 4f 43 4b 29 3b 20 0a 23 65 6c 73 65 0a 20 20  LOCK); .#else.  
108a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
108b0 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 23  IOERR_UNLOCK; .#
108c0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
108d0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
108e0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
108f0 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
10900 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
10910 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
10920 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
10930 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
10940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
10950 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
10960 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
10970 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f       pInode->nLo
10980 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  ck++;.      pIno
10990 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b  de->nShared = 1;
109a0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
109b0 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
109c0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
109d0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
109e0 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  1 ){.    /* We a
109f0 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e  re trying for an
10a00 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
10a10 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  but another thre
10a20 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a  ad in this.    *
10a30 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69  * same process i
10a40 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  s still holding 
10a50 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a  a shared lock. *
10a60 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
10a70 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b  E_BUSY;.  }else{
10a80 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
10a90 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45  est was for a RE
10aa0 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
10ab0 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73  IVE lock.  It is
10ac0 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20  .    ** assumed 
10ad0 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20  that there is a 
10ae0 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
10af0 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  r lock on the fi
10b00 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  le.    ** alread
10b10 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  y..    */.    as
10b20 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e  sert( 0!=pFile->
10b30 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  eFileLock );.   
10b40 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
10b50 5f 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73 73  _WRLCK;..    ass
10b60 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ert( eFileLock==
10b70 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
10b80 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
10b90 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
10ba0 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
10bb0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
10bc0 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  {.      lock.l_s
10bd0 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f  tart = RESERVED_
10be0 42 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  BYTE;.      lock
10bf0 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20  .l_len = 1L;.   
10c00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f   }else{.      lo
10c10 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
10c20 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
10c30 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
10c40 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 7d  ARED_SIZE;.    }
10c50 0a 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ..    if( unixFi
10c60 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
10c70 6f 63 6b 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  ock, 0) ){.     
10c80 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
10c90 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
10ca0 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
10cb0 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
10cc0 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
10cd0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
10ce0 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
10cf0 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
10d00 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
10d10 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rno);.      }.  
10d20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 64    }.  }.  ..#ifd
10d30 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
10d40 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20    /* Set up the 
10d50 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e  transaction-coun
10d60 74 65 72 20 63 68 61 6e 67 65 20 63 68 65 63 6b  ter change check
10d70 69 6e 67 20 66 6c 61 67 73 20 77 68 65 6e 0a 20  ing flags when. 
10d80 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e   ** transitionin
10d90 67 20 66 72 6f 6d 20 61 20 53 48 41 52 45 44 20  g from a SHARED 
10da0 74 6f 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  to a RESERVED lo
10db0 63 6b 2e 20 20 54 68 65 20 63 68 61 6e 67 65 0a  ck.  The change.
10dc0 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45 44    ** from SHARED
10dd0 20 74 6f 20 52 45 53 45 52 56 45 44 20 6d 61 72   to RESERVED mar
10de0 6b 73 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ks the beginning
10df0 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a   of a normal.  *
10e00 2a 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  * write operatio
10e10 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75  n (not a hot jou
10e20 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a  rnal rollback)..
10e30 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
10e40 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70  QLITE_OK.   && p
10e50 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
10e60 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20  =SHARED_LOCK.   
10e70 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45  && eFileLock==RE
10e80 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b  SERVED_LOCK.  ){
10e90 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e  .    pFile->tran
10ea0 73 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20  sCntrChng = 0;. 
10eb0 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61     pFile->dbUpda
10ec0 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c  te = 0;.    pFil
10ed0 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
10ee0 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 1;.  }.#endif
10ef0 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
10f00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46  ITE_OK ){.    pF
10f10 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
10f20 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
10f30 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
10f40 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
10f50 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65   }else if( eFile
10f60 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
10f70 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
10f80 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
10f90 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20  ENDING_LOCK;.   
10fa0 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
10fb0 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ck = PENDING_LOC
10fc0 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b  K;.  }..end_lock
10fd0 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
10fe0 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
10ff0 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
11000 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  %s (unix)\n", pF
11010 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f  ile->h, azFileLo
11020 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a  ck(eFileLock), .
11030 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
11040 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
11050 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
11060 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
11070 64 64 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  dd the file desc
11080 72 69 70 74 6f 72 20 75 73 65 64 20 62 79 20 66  riptor used by f
11090 69 6c 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65  ile handle pFile
110a0 20 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f   to the correspo
110b0 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64  nding.** pUnused
110c0 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
110d0 20 76 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67   void setPending
110e0 46 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  Fd(unixFile *pFi
110f0 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  le){.  unixInode
11100 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
11110 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
11120 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 20  UnixUnusedFd *p 
11130 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64  = pFile->pUnused
11140 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  ;.  p->pNext = p
11150 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a  Inode->pUnused;.
11160 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65    pInode->pUnuse
11170 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e  d = p;.  pFile->
11180 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d  h = -1;.  pFile-
11190 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a  >pUnused = 0;.}.
111a0 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
111b0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
111c0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
111d0 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
111e0 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
111f0 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
11200 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
11210 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
11220 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
11230 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
11240 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
11250 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
11260 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
11270 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
11280 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
11290 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
112a0 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53  .** If handleNFS
112b0 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20  Unlock is true, 
112c0 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64  then on downgrad
112d0 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
112e0 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a  _LOCK to SHARED.
112f0 2a 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e 67  ** the byte rang
11300 65 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74  e is divided int
11310 6f 20 32 20 70 61 72 74 73 20 61 6e 64 20 74 68  o 2 parts and th
11320 65 20 66 69 72 73 74 20 70 61 72 74 20 69 73 20  e first part is 
11330 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a  unlocked then.**
11340 20 73 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c   set to a read l
11350 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74  ock, then the ot
11360 68 65 72 20 70 61 72 74 20 69 73 20 73 69 6d 70  her part is simp
11370 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68  ly unlocked.  Th
11380 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f  is works .** aro
11390 75 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53 44  und a bug in BSD
113a0 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f   NFS lockd (also
113b0 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20   seen on MacOSX 
113c0 31 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c  10.3+) that fail
113d0 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20  s to .** remove 
113e0 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
113f0 6e 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20  n a region when 
11400 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73  a read lock is s
11410 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
11420 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71  t posixUnlock(sq
11430 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
11440 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69  int eFileLock, i
11450 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  nt handleNFSUnlo
11460 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  ck){.  unixFile 
11470 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
11480 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
11490 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
114a0 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
114b0 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d  lock;.  int rc =
114c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
114d0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
114e0 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
114f0 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
11500 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%d,%d) pid=%d (
11510 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
11520 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
11530 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
11540 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49  eLock, pFile->pI
11550 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  node->eFileLock,
11560 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
11570 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 67  nShared,.      g
11580 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73  etpid()));..  as
11590 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
115a0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
115b0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
115c0 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63  leLock<=eFileLoc
115d0 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
115e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
115f0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
11600 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
11610 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
11620 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
11630 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69  Shared!=0 );.  i
11640 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
11650 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
11660 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
11670 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
11680 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ==pFile->eFileLo
11690 63 6b 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ck );..#ifdef SQ
116a0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
116b0 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20  * When reducing 
116c0 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74  a lock such that
116d0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
116e0 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a   can start.    *
116f0 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  * reading the da
11700 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69  tabase file agai
11710 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  n, make sure tha
11720 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  t the.    ** tra
11730 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
11740 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20   was updated if 
11750 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
11760 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
11770 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49  file changed.  I
11780 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
11790 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74  n counter is not
117a0 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a   updated,.    **
117b0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
117c0 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66  ns to the same f
117d0 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65  ile might not re
117e0 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a  alize that.    *
117f0 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63  * the file has c
11800 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65  hanged and hence
11810 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20   might not know 
11820 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20  to flush their. 
11830 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68     ** cache.  Th
11840 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65  e use of a stale
11850 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20   cache can lead 
11860 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
11870 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  uption..    */. 
11880 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d     pFile->inNorm
11890 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e  alWrite = 0;.#en
118a0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e  dif..    /* down
118b0 67 72 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61  grading to a sha
118c0 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20  red lock on NFS 
118d0 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e  involves clearin
118e0 67 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  g the write lock
118f0 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65  .    ** before e
11900 73 74 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20  stablishing the 
11910 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76  readlock - to av
11920 6f 69 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69  oid a race condi
11930 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64  tion we downgrad
11940 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  e.    ** the loc
11950 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73  k in 2 blocks, s
11960 6f 20 74 68 61 74 20 70 61 72 74 20 6f 66 20 74  o that part of t
11970 68 65 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65  he range will be
11980 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20   covered by a . 
11990 20 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b     ** write lock
119a0 20 75 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20   until the rest 
119b0 69 73 20 63 6f 76 65 72 65 64 20 62 79 20 61 20  is covered by a 
119c0 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a  read lock:.    *
119d0 2a 20 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a  *  1:   [WWWWW].
119e0 20 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e      **  2:   [..
119f0 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20  ..W].    **  3: 
11a00 20 20 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a    [RRRRW].    **
11a10 20 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20    4:   [RRRR.]. 
11a20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 46     */.    if( eF
11a30 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
11a40 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  LOCK ){.      in
11a50 74 20 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20  t tErrno;       
11a60 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
11a70 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65   code from syste
11a80 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f  m call errors */
11a90 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f  ..#if !defined(_
11aa0 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53 51  _APPLE__) || !SQ
11ab0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
11ac0 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20  ING_STYLE.      
11ad0 28 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53 55  (void)handleNFSU
11ae0 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73  nlock;.      ass
11af0 65 72 74 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e  ert( handleNFSUn
11b00 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  lock==0 );.#endi
11b10 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  f.#if defined(__
11b20 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
11b30 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
11b40 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69 66  G_STYLE.      if
11b50 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  ( handleNFSUnloc
11b60 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 66 66  k ){.        off
11b70 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53 48 41  _t divSize = SHA
11b80 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20  RED_SIZE - 1;.  
11b90 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 6c        .        l
11ba0 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
11bb0 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  NLCK;.        lo
11bc0 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
11bd0 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
11be0 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
11bf0 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
11c00 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
11c10 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  = divSize;.     
11c20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
11c30 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
11c40 2c 20 31 30 29 3d 3d 28 2d 31 29 20 29 7b 0a 20  , 10)==(-1) ){. 
11c50 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20           tErrno 
11c60 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c  = errno;.#if OSL
11c70 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53  OCKING_CHECK_BUS
11c80 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20  Y_IOERR.        
11c90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
11ca0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
11cb0 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
11cc0 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23  IOERR_UNLOCK);.#
11cd0 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 72  else.          r
11ce0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
11cf0 5f 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a  _UNLOCK;.#endif.
11d00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53            if( IS
11d10 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
11d20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
11d30 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
11d40 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
11d50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11d60 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c      goto end_unl
11d70 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ock;.        }. 
11d80 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79         lock.l_ty
11d90 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
11da0 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
11db0 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
11dc0 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
11dd0 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
11de0 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
11df0 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a  k.l_len = divSiz
11e00 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  e;.        if( u
11e10 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
11e20 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d 28  e, &lock, 10)==(
11e30 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
11e40 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
11e50 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43  .#if OSLOCKING_C
11e60 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a  HECK_BUSY_IOERR.
11e70 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
11e80 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
11e90 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
11ea0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
11eb0 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65 0a 20 20 20  LOCK);.#else.   
11ec0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
11ed0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
11ee0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
11ef0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
11f00 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
11f10 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
11f20 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
11f30 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rno);.          
11f40 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
11f50 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
11f60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c       }.        l
11f70 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
11f80 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  NLCK;.        lo
11f90 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
11fa0 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
11fb0 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
11fc0 48 41 52 45 44 5f 46 49 52 53 54 2b 64 69 76 53  HARED_FIRST+divS
11fd0 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  ize;.        loc
11fe0 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
11ff0 5f 53 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20  _SIZE-divSize;. 
12000 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46         if( unixF
12010 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
12020 6c 6f 63 6b 2c 20 31 30 29 3d 3d 28 2d 31 29 20  lock, 10)==(-1) 
12030 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72  ){.          tEr
12040 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66  rno = errno;.#if
12050 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b   OSLOCKING_CHECK
12060 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20  _BUSY_IOERR.    
12070 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12080 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
12090 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
120a0 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
120b0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  );.#else.       
120c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
120d0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 23 65 6e  OERR_UNLOCK;.#en
120e0 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 69 66  dif.          if
120f0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
12100 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rc) ){.         
12110 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
12120 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
12130 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
12140 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
12150 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
12160 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23   }.      }else.#
12170 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
12180 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
12190 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
121a0 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20  KING_STYLE */.  
121b0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f      {.        lo
121c0 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  ck.l_type = F_RD
121d0 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  LCK;.        loc
121e0 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
121f0 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c  K_SET;.        l
12200 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
12210 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
12220 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
12230 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
12240 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69        if( unixFi
12250 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
12260 6f 63 6b 2c 20 31 30 29 20 29 7b 0a 20 20 20 20  ock, 10) ){.    
12270 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
12280 72 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43 4b  rrno;.#if OSLOCK
12290 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49  ING_CHECK_BUSY_I
122a0 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 72  OERR.          r
122b0 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
122c0 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
122d0 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
122e0 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 23 65 6c 73  RR_RDLOCK);.#els
122f0 65 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  e.          /* I
12300 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63 61  n theory, the ca
12310 6c 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c 6f  ll to unixFileLo
12320 63 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c  ck() cannot fail
12330 20 62 65 63 61 75 73 65 20 61 6e 6f 74 68 65 72   because another
12340 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
12350 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
12360 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
12370 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f 65   lock. If it doe
12380 73 2c 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  s, this .       
12390 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 73 20     ** indicates 
123a0 74 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 70  that the other p
123b0 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f  rocess is not fo
123c0 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63 6b  llowing the lock
123d0 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
123e0 20 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74 68   protocol. If th
123f0 69 73 20 68 61 70 70 65 6e 73 2c 20 72 65 74 75  is happens, retu
12400 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
12410 52 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69 6e  RDLOCK. Returnin
12420 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53  g.          ** S
12430 51 4c 49 54 45 5f 42 55 53 59 20 77 6f 75 6c 64  QLITE_BUSY would
12440 20 63 6f 6e 66 75 73 65 20 74 68 65 20 75 70 70   confuse the upp
12450 65 72 20 6c 61 79 65 72 20 28 69 6e 20 70 72 61  er layer (in pra
12460 63 74 69 63 65 20 69 74 20 63 61 75 73 65 73 20  ctice it causes 
12470 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
12480 20 61 73 73 65 72 74 20 74 6f 20 66 61 69 6c 29   assert to fail)
12490 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20  . */ .          
124a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
124b0 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_RDLOCK;.      
124c0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
124d0 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
124e0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
124f0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
12500 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
12510 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61           storeLa
12520 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
12530 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  Errno);.        
12540 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f    }.          go
12550 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
12560 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12570 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e  .    }.    lock.
12580 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
12590 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65  ;.    lock.l_whe
125a0 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
125b0 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
125c0 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
125d0 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
125e0 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50  = 2L;  assert( P
125f0 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52  ENDING_BYTE+1==R
12600 45 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a  ESERVED_BYTE );.
12610 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
12620 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
12630 6b 2c 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20  k, 10)==0 ){.   
12640 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
12650 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
12660 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23  CK;.    }else{.#
12670 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45  if OSLOCKING_CHE
12680 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20  CK_BUSY_IOERR.  
12690 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
126a0 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
126b0 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
126c0 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
126d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
126e0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
126f0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
12700 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  c) ){.        st
12710 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
12720 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
12730 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20     }.#else.     
12740 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
12750 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20  RR_UNLOCK;.     
12760 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
12770 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 23  pFile, errno);.#
12780 65 6e 64 69 66 0a 20 20 20 20 20 20 67 6f 74 6f  endif.      goto
12790 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
127a0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 46 69   }.  }.  if( eFi
127b0 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  leLock==NO_LOCK 
127c0 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  ){.    /* Decrem
127d0 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c  ent the shared l
127e0 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65  ock counter.  Re
127f0 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75  lease the lock u
12800 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f  sing an.    ** O
12810 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e  S call only when
12820 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20   all threads in 
12830 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73  this same proces
12840 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a  s have released.
12850 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e      ** the lock.
12860 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f  .    */.    pIno
12870 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20  de->nShared--;. 
12880 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
12890 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Shared==0 ){.   
128a0 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
128b0 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20   F_UNLCK;.      
128c0 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
128d0 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
128e0 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c  lock.l_start = l
128f0 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a  ock.l_len = 0L;.
12900 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69        if( unixFi
12910 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
12920 6f 63 6b 2c 20 31 30 29 3d 3d 30 20 29 7b 0a 20  ock, 10)==0 ){. 
12930 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65         pInode->e
12940 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
12950 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  CK;.      }else{
12960 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43  .#if OSLOCKING_C
12970 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a  HECK_BUSY_IOERR.
12980 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d          tErrno =
12990 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
129a0 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
129b0 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
129c0 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
129d0 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20  ERR_UNLOCK);.   
129e0 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
129f0 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
12a00 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
12a10 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
12a20 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d  rrno);.        }
12a30 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 72  .#else.        r
12a40 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
12a50 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
12a60 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
12a70 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 23  pFile, errno);.#
12a80 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 70 49  endif.        pI
12a90 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
12aa0 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
12ab0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
12ac0 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
12ad0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
12ae0 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
12af0 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b  he count of lock
12b00 73 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 73  s against this s
12b10 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20  ame file.  When 
12b20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74  the.    ** count
12b30 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63   reaches zero, c
12b40 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66  lose any other f
12b50 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
12b60 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20  whose close.    
12b70 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65 64 20  ** was deferred 
12b80 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74  because of outst
12b90 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20  anding locks..  
12ba0 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d    */.    pInode-
12bb0 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73  >nLock--;.    as
12bc0 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c  sert( pInode->nL
12bd0 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  ock>=0 );.    if
12be0 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d  ( pInode->nLock=
12bf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73  =0 ){.      clos
12c00 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
12c10 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 65  e);.    }.  }..e
12c20 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e 69  nd_unlock:.  uni
12c30 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
12c40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12c50 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c  OK ) pFile->eFil
12c60 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
12c70 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  k;.  return rc;.
12c80 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
12c90 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
12ca0 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
12cb0 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
12cc0 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
12cd0 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
12ce0 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
12cf0 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
12d00 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
12d10 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
12d20 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
12d30 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
12d40 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
12d50 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
12d60 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
12d70 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
12d80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
12d90 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  xUnlock(sqlite3_
12da0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
12db0 69 6c 65 4c 6f 63 6b 29 7b 0a 23 69 66 20 53 51  ileLock){.#if SQ
12dc0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
12dd0 5a 45 3e 30 0a 20 20 61 73 73 65 72 74 28 20 65  ZE>0.  assert( e
12de0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
12df0 5f 4c 4f 43 4b 20 7c 7c 20 28 28 75 6e 69 78 46  _LOCK || ((unixF
12e00 69 6c 65 20 2a 29 69 64 29 2d 3e 6e 46 65 74 63  ile *)id)->nFetc
12e10 68 4f 75 74 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  hOut==0 );.#endi
12e20 66 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78  f.  return posix
12e30 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65  Unlock(id, eFile
12e40 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66  Lock, 0);.}..#if
12e50 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
12e60 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69  _SIZE>0.static i
12e70 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 75  nt unixMapfile(u
12e80 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 69 36  nixFile *pFd, i6
12e90 34 20 6e 42 79 74 65 29 3b 0a 73 74 61 74 69 63  4 nByte);.static
12ea0 20 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61 70 66   void unixUnmapf
12eb0 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ile(unixFile *pF
12ec0 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  d);.#endif../*.*
12ed0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
12ee0 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72  performs the par
12ef0 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65  ts of the "close
12f00 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e   file" operation
12f10 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61   .** common to a
12f20 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d  ll locking schem
12f30 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68  es. It closes th
12f40 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20  e directory and 
12f50 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c  file.** handles,
12f60 20 69 66 20 74 68 65 79 20 61 72 65 20 76 61 6c   if they are val
12f70 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c  id, and sets all
12f80 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75   fields of the u
12f90 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63  nixFile.** struc
12fa0 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a  ture to 0..**.**
12fb0 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63   It is *not* nec
12fc0 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74  essary to hold t
12fd0 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68  he mutex when th
12fe0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
12ff0 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e  lled,.** even on
13000 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74   VxWorks.  A mut
13010 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69  ex will be acqui
13020 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62  red on VxWorks b
13030 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73  y the.** vxworks
13040 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20  ReleaseFileId() 
13050 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74  routine..*/.stat
13060 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78  ic int closeUnix
13070 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  File(sqlite3_fil
13080 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69  e *id){.  unixFi
13090 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
130a0 78 46 69 6c 65 2a 29 69 64 3b 0a 23 69 66 20 53  xFile*)id;.#if S
130b0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
130c0 49 5a 45 3e 30 0a 20 20 75 6e 69 78 55 6e 6d 61  IZE>0.  unixUnma
130d0 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 23 65  pfile(pFile);.#e
130e0 6e 64 69 66 0a 20 20 69 66 28 20 70 46 69 6c 65  ndif.  if( pFile
130f0 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 72 6f  ->h>=0 ){.    ro
13100 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
13110 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49  , pFile->h, __LI
13120 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c 65  NE__);.    pFile
13130 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 69  ->h = -1;.  }.#i
13140 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
13150 66 28 20 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b  f( pFile->pId ){
13160 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
13170 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
13180 46 49 4c 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  FILE_DELETE ){. 
13190 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 46       osUnlink(pF
131a0 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e  ile->pId->zCanon
131b0 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  icalName);.    }
131c0 0a 20 20 20 20 76 78 77 6f 72 6b 73 52 65 6c 65  .    vxworksRele
131d0 61 73 65 46 69 6c 65 49 64 28 70 46 69 6c 65 2d  aseFileId(pFile-
131e0 3e 70 49 64 29 3b 0a 20 20 20 20 70 46 69 6c 65  >pId);.    pFile
131f0 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 7d 0a 23  ->pId = 0;.  }.#
13200 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
13210 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54 45 52  ITE_UNLINK_AFTER
13220 5f 43 4c 4f 53 45 0a 20 20 69 66 28 20 70 46 69  _CLOSE.  if( pFi
13230 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
13240 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20  UNIXFILE_DELETE 
13250 29 7b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  ){.    osUnlink(
13260 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
13270 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
13280 2a 28 63 68 61 72 2a 2a 29 26 70 46 69 6c 65 2d  *(char**)&pFile-
13290 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70 46 69  >zPath);.    pFi
132a0 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 30 3b 0a 20  le->zPath = 0;. 
132b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52   }.#endif.  OSTR
132c0 41 43 45 28 28 22 43 4c 4f 53 45 20 20 20 25 2d  ACE(("CLOSE   %-
132d0 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  3d\n", pFile->h)
132e0 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  );.  OpenCounter
132f0 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  (-1);.  sqlite3_
13300 66 72 65 65 28 70 46 69 6c 65 2d 3e 70 55 6e 75  free(pFile->pUnu
13310 73 65 64 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  sed);.  memset(p
13320 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  File, 0, sizeof(
13330 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 72 65  unixFile));.  re
13340 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13350 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
13360 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
13370 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73   int unixClose(s
13380 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
13390 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
133a0 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
133b0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
133c0 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 76 65  xFile *)id;.  ve
133d0 72 69 66 79 44 62 46 69 6c 65 28 70 46 69 6c 65  rifyDbFile(pFile
133e0 29 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28  );.  unixUnlock(
133f0 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
13400 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
13410 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65  ;..  /* unixFile
13420 2e 70 49 6e 6f 64 65 20 69 73 20 61 6c 77 61 79  .pInode is alway
13430 73 20 76 61 6c 69 64 20 68 65 72 65 2e 20 4f 74  s valid here. Ot
13440 68 65 72 77 69 73 65 2c 20 61 20 64 69 66 66 65  herwise, a diffe
13450 72 65 6e 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20  rent close.  ** 
13460 72 6f 75 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f  routine (e.g. no
13470 6c 6f 63 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75  lockClose()) wou
13480 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73  ld be called ins
13490 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tead..  */.  ass
134a0 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ert( pFile->pIno
134b0 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70  de->nLock>0 || p
134c0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  File->pInode->bP
134d0 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b  rocessLock==0 );
134e0 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 46  .  if( ALWAYS(pF
134f0 69 6c 65 2d 3e 70 49 6e 6f 64 65 29 20 26 26 20  ile->pInode) && 
13500 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
13510 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Lock ){.    /* I
13520 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
13530 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64  tanding locks, d
13540 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63  o not actually c
13550 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75  lose the file ju
13560 73 74 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65  st.    ** yet be
13570 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64  cause that would
13580 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63   clear those loc
13590 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64  ks.  Instead, ad
135a0 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  d the file.    *
135b0 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  * descriptor to 
135c0 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20  pInode->pUnused 
135d0 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 62  list.  It will b
135e0 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
135f0 63 6c 6f 73 65 64 20 0a 20 20 20 20 2a 2a 20 77  closed .    ** w
13600 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63  hen the last loc
13610 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20  k is cleared..  
13620 20 20 2a 2f 0a 20 20 20 20 73 65 74 50 65 6e 64    */.    setPend
13630 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20  ingFd(pFile);.  
13640 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65  }.  releaseInode
13650 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72  Info(pFile);.  r
13660 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
13670 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61  e(id);.  unixLea
13680 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
13690 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  urn rc;.}../****
136a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
136b0 66 20 74 68 65 20 70 6f 73 69 78 20 61 64 76 69  f the posix advi
136c0 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  sory lock implem
136d0 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
136e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
136f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
13740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
13790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70  ********** No-op
137b0 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
137c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
137e0 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75 73  * Of the various
137f0 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
13800 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61 62  ntations availab
13810 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79 20 66  le, this is by f
13820 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65  ar the.** simple
13830 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20  st:  locking is 
13840 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74  ignored.  No att
13850 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
13860 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
13870 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72 65  e.** file for re
13880 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
13890 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63  ..**.** This loc
138a0 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70 70  king mode is app
138b0 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73 65  ropriate for use
138c0 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61   on read-only da
138d0 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20  tabases.** (ex: 
138e0 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 61  databases that a
138f0 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20 43  re burned into C
13900 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70  D-ROM, for examp
13910 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20  le.)  It can.** 
13920 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66 20  also be used if 
13930 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  the application 
13940 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74  employs some ext
13950 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20  ernal mechanism 
13960 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73 69  to.** prevent si
13970 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65 73  multaneous acces
13980 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64 61  s of the same da
13990 74 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f 72  tabase by two or
139a0 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61 73   more.** databas
139b0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20  e connections.  
139c0 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20 73  But there is a s
139d0 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20 64  erious risk of d
139e0 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75  atabase.** corru
139f0 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f  ption if this lo
13a00 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73  cking mode is us
13a10 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e 73  ed in situations
13a20 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a   where multiple.
13a30 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
13a40 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63 65  ections are acce
13a50 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
13a60 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
13a70 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65  the same.** time
13a80 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   and one or more
13a90 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63   of those connec
13aa0 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69 6e  tions are writin
13ab0 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e  g..*/..static in
13ac0 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73  t nolockCheckRes
13ad0 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
13ae0 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
13af0 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
13b00 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
13b10 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a  ER(NotUsed);.  *
13b20 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72  pResOut = 0;.  r
13b30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13b40 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  .}.static int no
13b50 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
13b60 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20  _file *NotUsed, 
13b70 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20  int NotUsed2){. 
13b80 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
13b90 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
13ba0 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
13bb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61  SQLITE_OK;.}.sta
13bc0 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e  tic int nolockUn
13bd0 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
13be0 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  e *NotUsed, int 
13bf0 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
13c00 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
13c10 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
13c20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
13c30 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
13c40 43 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a  Close the file..
13c50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  */.static int no
13c60 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
13c70 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
13c80 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
13c90 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
13ca0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
13cb0 65 20 2a 29 69 64 3b 0a 20 20 75 6e 69 78 45 6e  e *)id;.  unixEn
13cc0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 0a 20  terMutex();.  . 
13cd0 20 2f 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49 6e   /* unixFile.pIn
13ce0 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 76 61  ode is always va
13cf0 6c 69 64 20 68 65 72 65 2e 20 4f 74 68 65 72 77  lid here. Otherw
13d00 69 73 65 2c 20 61 20 64 69 66 66 65 72 65 6e 74  ise, a different
13d10 20 63 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f 75 74   close.  ** rout
13d20 69 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b  ine (e.g. nolock
13d30 43 6c 6f 73 65 28 29 29 20 77 6f 75 6c 64 20 62  Close()) would b
13d40 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64  e called instead
13d50 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
13d60 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
13d70 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65  nLock>0 || pFile
13d80 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
13d90 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 69  ssLock==0 );.  i
13da0 66 28 20 41 4c 57 41 59 53 28 70 46 69 6c 65 2d  f( ALWAYS(pFile-
13db0 3e 70 49 6e 6f 64 65 29 20 26 26 20 70 46 69 6c  >pInode) && pFil
13dc0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  e->pInode->nLock
13dd0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
13de0 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
13df0 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f  ing locks, do no
13e00 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65  t actually close
13e10 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20   the file just. 
13e20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73     ** yet becaus
13e30 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65  e that would cle
13e40 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20  ar those locks. 
13e50 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68   Instead, add th
13e60 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65  e file.    ** de
13e70 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f  scriptor to pIno
13e80 64 65 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74  de->pUnused list
13e90 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75  .  It will be au
13ea0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
13eb0 65 64 20 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  ed .    ** when 
13ec0 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73  the last lock is
13ed0 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f   cleared..    */
13ee0 0a 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46  .    setPendingF
13ef0 64 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20  d(pFile);.  }.  
13f00 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f  releaseInodeInfo
13f10 28 70 46 69 6c 65 29 3b 0a 20 20 72 63 20 3d 20  (pFile);.  rc = 
13f20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
13f30 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  );.  unixLeaveMu
13f40 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
13f50 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  rc;.}../********
13f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
13f70 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63  of the no-op loc
13f80 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
13f90 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
13fa0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
13fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ff0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
14000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14040 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
14050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14060 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65  * Begin dot-file
14070 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
14080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14090 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
140a0 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  e dotfile lockin
140b0 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
140c0 20 75 73 65 73 20 74 68 65 20 65 78 69 73 74 65   uses the existe
140d0 6e 63 65 20 6f 66 20 73 65 70 61 72 61 74 65 20  nce of separate 
140e0 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 28 72  lock.** files (r
140f0 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72  eally a director
14100 79 29 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63  y) to control ac
14110 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61  cess to the data
14120 62 61 73 65 2e 20 20 54 68 69 73 20 77 6f 72 6b  base.  This work
14130 73 0a 2a 2a 20 6f 6e 20 6a 75 73 74 20 61 62 6f  s.** on just abo
14140 75 74 20 65 76 65 72 79 20 66 69 6c 65 73 79 73  ut every filesys
14150 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20  tem imaginable. 
14160 20 42 75 74 20 74 68 65 72 65 20 61 72 65 20 73   But there are s
14170 65 72 69 6f 75 73 20 64 6f 77 6e 73 69 64 65 73  erious downsides
14180 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
14190 54 68 65 72 65 20 69 73 20 7a 65 72 6f 20 63 6f  There is zero co
141a0 6e 63 75 72 72 65 6e 63 79 2e 20 20 41 20 73 69  ncurrency.  A si
141b0 6e 67 6c 65 20 72 65 61 64 65 72 20 62 6c 6f 63  ngle reader bloc
141c0 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20  ks all other.** 
141d0 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69          connecti
141e0 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64 69 6e 67  ons from reading
141f0 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
14200 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
14210 20 20 20 28 32 29 20 20 41 6e 20 61 70 70 6c 69     (2)  An appli
14220 63 61 74 69 6f 6e 20 63 72 61 73 68 20 6f 72 20  cation crash or 
14230 70 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c  power loss can l
14240 65 61 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20  eave stale lock 
14250 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  files.**        
14260 20 73 69 74 74 69 6e 67 20 61 72 6f 75 6e 64 20   sitting around 
14270 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
14280 63 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79  cleared manually
14290 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65  ..**.** Neverthe
142a0 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20  less, a dotlock 
142b0 69 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  is an appropriat
142c0 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66  e locking mode f
142d0 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20  or use if no.** 
142e0 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74  other locking st
142f0 72 61 74 65 67 79 20 69 73 20 61 76 61 69 6c 61  rategy is availa
14300 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69  ble..**.** Dotfi
14310 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73  le locking works
14320 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20 73   by creating a s
14330 75 62 64 69 72 65 63 74 6f 72 79 20 69 6e 20 74  ubdirectory in t
14340 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
14350 79 20 61 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  y as.** the data
14360 62 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68  base and with th
14370 65 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20  e same name but 
14380 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65  with a ".lock" e
14390 78 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a  xtension added..
143a0 2a 2a 20 54 68 65 20 65 78 69 73 74 65 6e 63 65  ** The existence
143b0 20 6f 66 20 61 20 6c 6f 63 6b 20 64 69 72 65 63   of a lock direc
143c0 74 6f 72 79 20 69 6d 70 6c 69 65 73 20 61 6e 20  tory implies an 
143d0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
143e0 20 41 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 6c 6f   All other.** lo
143f0 63 6b 20 74 79 70 65 73 20 28 53 48 41 52 45 44  ck types (SHARED
14400 2c 20 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44  , RESERVED, PEND
14410 49 4e 47 29 20 61 72 65 20 6d 61 70 70 65 64 20  ING) are mapped 
14420 69 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a  into EXCLUSIVE..
14430 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  */../*.** The fi
14440 6c 65 20 73 75 66 66 69 78 20 61 64 64 65 64 20  le suffix added 
14450 74 6f 20 74 68 65 20 64 61 74 61 20 62 61 73 65  to the data base
14460 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64   filename in ord
14470 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  er to create the
14480 0a 2a 2a 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f  .** lock directo
14490 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44  ry..*/.#define D
144a0 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e  OTLOCK_SUFFIX ".
144b0 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  lock"../*.** Thi
144c0 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
144d0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
144e0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
144f0 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
14500 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
14510 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
14520 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
14530 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
14540 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
14550 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
14560 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
14570 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
14580 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
14590 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
145a0 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
145b0 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
145c0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
145d0 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
145e0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69  ..**.** In dotfi
145f0 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68  le locking, eith
14600 65 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73  er a lock exists
14610 20 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   or it does not.
14620 20 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20    So in this.** 
14630 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65  variation of Che
14640 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29  ckReservedLock()
14650 2c 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  , *pResOut is se
14660 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79  t to true if any
14670 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64   lock.** is held
14680 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   on the file and
14690 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 66 69   false if the fi
146a0 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a  le is unlocked..
146b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
146c0 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  tlockCheckReserv
146d0 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
146e0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
146f0 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72  esOut) {.  int r
14700 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14710 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
14720 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
14730 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
14740 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
14750 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
14760 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
14770 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
14780 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
14790 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20   pFile );..  /* 
147a0 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
147b0 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
147c0 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
147d0 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
147e0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
147f0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
14800 20 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73 20   /* Either this 
14810 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f  connection or so
14820 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  me other connect
14830 69 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ion in the same 
14840 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 68  process.    ** h
14850 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  olds a lock on t
14860 68 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 65  he file.  No nee
14870 64 20 74 6f 20 63 68 65 63 6b 20 66 75 72 74 68  d to check furth
14880 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65 72  er. */.    reser
14890 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  ved = 1;.  }else
148a0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63  {.    /* The loc
148b0 6b 20 69 73 20 68 65 6c 64 20 69 66 20 61 6e 64  k is held if and
148c0 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f 63   only if the loc
148d0 6b 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a  kfile exists */.
148e0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
148f0 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f 6e  zLockFile = (con
14900 73 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e  st char*)pFile->
14910 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
14920 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 6f      reserved = o
14930 73 41 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69 6c  sAccess(zLockFil
14940 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20  e, 0)==0;.  }.  
14950 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
14960 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
14970 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  (dotlock)\n", pF
14980 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
14990 72 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73 4f  rved));.  *pResO
149a0 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
149b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
149c0 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
149d0 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
149e0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
149f0 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
14a00 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
14a10 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
14a20 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
14a30 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
14a40 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
14a50 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
14a60 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
14a70 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
14a80 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
14a90 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
14aa0 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
14ab0 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
14ac0 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
14ad0 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
14ae0 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
14af0 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
14b00 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
14b10 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
14b20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
14b30 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
14b40 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
14b50 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
14b60 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
14b70 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
14b80 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
14b90 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
14ba0 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
14bb0 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
14bc0 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
14bd0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
14be0 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
14bf0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
14c00 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
14c10 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
14c20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
14c30 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
14c40 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
14c50 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
14c60 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
14c70 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
14c80 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
14c90 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
14ca0 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
14cb0 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
14cc0 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
14cd0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
14ce0 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66 69  **.** With dotfi
14cf0 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72  le locking, we r
14d00 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f  eally only suppo
14d10 72 74 20 73 74 61 74 65 20 28 34 29 3a 20 45 58  rt state (4): EX
14d20 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20  CLUSIVE..** But 
14d30 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74 68  we track the oth
14d40 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  er locking level
14d50 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f  s internally..*/
14d60 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
14d70 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
14d80 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
14d90 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
14da0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
14db0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
14dc0 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
14dd0 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  = (char *)pFile-
14de0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
14df0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14e00 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66  TE_OK;...  /* If
14e10 20 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63   we have any loc
14e20 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b  k, then the lock
14e30 20 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78   file already ex
14e40 69 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61  ists.  All we ha
14e50 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73  ve.  ** to do is
14e60 20 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65   adjust our inte
14e70 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74  rnal record of t
14e80 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20  he lock level.. 
14e90 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
14ea0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f  >eFileLock > NO_
14eb0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
14ec0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
14ed0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a  FileLock;.    /*
14ee0 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20 74   Always update t
14ef0 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20  he timestamp on 
14f00 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a  the old file */.
14f10 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d  #ifdef HAVE_UTIM
14f20 45 0a 20 20 20 20 75 74 69 6d 65 28 7a 4c 6f 63  E.    utime(zLoc
14f30 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65  kFile, NULL);.#e
14f40 6c 73 65 0a 20 20 20 20 75 74 69 6d 65 73 28 7a  lse.    utimes(z
14f50 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b  LockFile, NULL);
14f60 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
14f70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14f80 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61  }.  .  /* grab a
14f90 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
14fa0 20 2a 2f 0a 20 20 72 63 20 3d 20 6f 73 4d 6b 64   */.  rc = osMkd
14fb0 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 37  ir(zLockFile, 07
14fc0 37 37 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20  77);.  if( rc<0 
14fd0 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64  ){.    /* failed
14fe0 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20   to open/create 
14ff0 74 68 65 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f  the lock directo
15000 72 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45  ry */.    int tE
15010 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
15020 20 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d 20    if( EEXIST == 
15030 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20  tErrno ){.      
15040 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
15050 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
15060 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
15070 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
15080 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
15090 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
150a0 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
150b0 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
150c0 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
150d0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
150e0 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rno);.      }.  
150f0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
15100 63 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f 2a 20  c;.  } .  .  /* 
15110 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20  got it, set the 
15120 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20  type and return 
15130 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65  ok */.  pFile->e
15140 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
15150 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72  Lock;.  return r
15160 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
15170 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
15180 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
15190 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
151a0 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
151b0 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
151c0 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
151d0 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
151e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
151f0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
15200 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
15210 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
15220 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
15230 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
15240 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
15250 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
15260 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ..**.** When the
15270 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 72   locking level r
15280 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20  eaches NO_LOCK, 
15290 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20  delete the lock 
152a0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
152b0 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63  int dotlockUnloc
152c0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
152d0 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
152e0 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
152f0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
15300 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a  le*)id;.  char *
15310 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61  zLockFile = (cha
15320 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  r *)pFile->locki
15330 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74  ngContext;.  int
15340 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
15350 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
15360 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
15370 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
15380 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70   (dotlock)\n", p
15390 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
153a0 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
153b0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
153c0 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61   getpid()));.  a
153d0 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
153e0 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
153f0 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69  .  .  /* no-op i
15400 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  f possible */.  
15410 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
15420 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock==eFileLock 
15430 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
15440 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
15450 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64 65 20  /* To downgrade 
15460 74 6f 20 73 68 61 72 65 64 2c 20 73 69 6d 70 6c  to shared, simpl
15470 79 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74  y update our int
15480 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20  ernal notion of 
15490 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73 74  the.  ** lock st
154a0 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f  ate.  No need to
154b0 20 6d 65 73 73 20 77 69 74 68 20 74 68 65 20 66   mess with the f
154c0 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a  ile on disk..  *
154d0 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
154e0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
154f0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
15500 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
15510 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e  LOCK;.    return
15520 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
15530 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75 6c 6c 79    .  /* To fully
15540 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
15550 62 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65  base, delete the
15560 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20   lock file */.  
15570 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
15580 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20  k==NO_LOCK );.  
15590 72 63 20 3d 20 6f 73 52 6d 64 69 72 28 7a 4c 6f  rc = osRmdir(zLo
155a0 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72  ckFile);.  if( r
155b0 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e  c<0 && errno==EN
155c0 4f 54 44 49 52 20 29 20 72 63 20 3d 20 6f 73 55  OTDIR ) rc = osU
155d0 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29  nlink(zLockFile)
155e0 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a  ;.  if( rc<0 ){.
155f0 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
15600 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d   errno;.    rc =
15610 20 30 3b 0a 20 20 20 20 69 66 28 20 45 4e 4f 45   0;.    if( ENOE
15620 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  NT != tErrno ){.
15630 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48  #if OSLOCKING_CH
15640 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20  ECK_BUSY_IOERR. 
15650 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
15660 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
15670 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
15680 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
15690 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63  ;.#else.      rc
156a0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
156b0 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a 20  UNLOCK;.#endif. 
156c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f     }.    if( IS_
156d0 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
156e0 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
156f0 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
15700 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rrno);.    }.   
15710 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d   return rc; .  }
15720 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
15730 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
15740 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15750 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  K;.}../*.** Clos
15760 65 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20  e a file.  Make 
15770 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61  sure the lock ha
15780 73 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20  s been released 
15790 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a  before closing..
157a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
157b0 74 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74  tlockClose(sqlit
157c0 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
157d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
157e0 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b  _OK;.  if( id ){
157f0 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
15800 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
15810 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c 6f 63  *)id;.    dotloc
15820 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  kUnlock(id, NO_L
15830 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  OCK);.    sqlite
15840 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f  3_free(pFile->lo
15850 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20  ckingContext);. 
15860 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69     rc = closeUni
15870 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20  xFile(id);.  }. 
15880 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a   return rc;.}./*
15890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
158a0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74  * End of the dot
158b0 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65  -file lock imple
158c0 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
158d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
158e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
158f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
15930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
15980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15990 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
159a0 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a  flock Locking **
159b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
159c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
159d0 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f  *.** Use the flo
159e0 63 6b 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  ck() system call
159f0 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b   to do file lock
15a00 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b  ing..**.** flock
15a10 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69  () locking is li
15a20 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  ke dot-file lock
15a30 69 6e 67 20 69 6e 20 74 68 61 74 20 74 68 65 20  ing in that the 
15a40 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d  various.** fine-
15a50 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65  grain locking le
15a60 76 65 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62  vels supported b
15a70 79 20 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c  y SQLite are col
15a80 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61  lapsed into.** a
15a90 20 73 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76   single exclusiv
15aa0 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65  e lock.  In othe
15ab0 72 20 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c  r words, SHARED,
15ac0 20 52 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a   RESERVED, and.*
15ad0 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20  * PENDING locks 
15ae0 61 72 65 20 74 68 65 20 73 61 6d 65 20 74 68 69  are the same thi
15af0 6e 67 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49  ng as an EXCLUSI
15b00 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65  VE lock.  SQLite
15b10 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20  .** still works 
15b20 77 68 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73  when you do this
15b30 2c 20 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63  , but concurrenc
15b40 79 20 69 73 20 72 65 64 75 63 65 64 20 73 69 6e  y is reduced sin
15b50 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  ce.** only a sin
15b60 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20  gle process can 
15b70 62 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  be reading the d
15b80 61 74 61 62 61 73 65 20 61 74 20 61 20 74 69 6d  atabase at a tim
15b90 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68  e..**.** Omit th
15ba0 69 73 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51  is section if SQ
15bb0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
15bc0 49 4e 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72  ING_STYLE is tur
15bd0 6e 65 64 20 6f 66 66 20 6f 72 20 69 66 0a 2a 2a  ned off or if.**
15be0 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 56   compiling for V
15bf0 58 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53  XWORKS..*/.#if S
15c00 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
15c10 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f  KING_STYLE && !O
15c20 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a  S_VXWORKS../*.**
15c30 20 52 65 74 72 79 20 66 6c 6f 63 6b 28 29 20 63   Retry flock() c
15c40 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 77  alls that fail w
15c50 69 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69 66  ith EINTR.*/.#if
15c60 64 65 66 20 45 49 4e 54 52 0a 73 74 61 74 69 63  def EINTR.static
15c70 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63   int robust_floc
15c80 6b 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70  k(int fd, int op
15c90 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64  ){.  int rc;.  d
15ca0 6f 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64  o{ rc = flock(fd
15cb0 2c 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20 72 63  ,op); }while( rc
15cc0 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
15cd0 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  TR );.  return r
15ce0 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  c;.}.#else.# def
15cf0 69 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  ine robust_flock
15d00 28 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62 29  (a,b) flock(a,b)
15d10 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a 2f  .#endif.     ../
15d20 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15d30 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
15d40 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
15d50 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
15d60 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
15d70 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
15d80 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
15d90 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
15da0 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
15db0 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
15dc0 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
15dd0 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
15de0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
15df0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
15e00 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
15e10 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
15e20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
15e30 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
15e40 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
15e50 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65  tic int flockChe
15e60 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
15e70 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
15e80 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
15e90 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15ea0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
15eb0 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
15ec0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
15ed0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a  nixFile*)id;.  .
15ee0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
15ef0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
15f00 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
15f10 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
15f20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
15f30 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b  );.  .  /* Check
15f40 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
15f50 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
15f60 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
15f70 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
15f80 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
15f90 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
15fa0 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  rved = 1;.  }.  
15fb0 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
15fc0 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
15fd0 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
15fe0 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  it. */.  if( !re
15ff0 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a  served ){.    /*
16000 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20   attempt to get 
16010 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  the lock */.    
16020 69 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75 73 74  int lrc = robust
16030 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c  _flock(pFile->h,
16040 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f   LOCK_EX | LOCK_
16050 4e 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72  NB);.    if( !lr
16060 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f  c ){.      /* go
16070 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f  t the lock, unlo
16080 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c  ck it */.      l
16090 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63  rc = robust_floc
160a0 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
160b0 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20 28  _UN);.      if (
160c0 20 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20 20   lrc ) {.       
160d0 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
160e0 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  rno;.        /* 
160f0 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77 69  unlock failed wi
16100 74 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 23  th an error */.#
16110 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45  if OSLOCKING_CHE
16120 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20  CK_BUSY_IOERR.  
16130 20 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69        lrc = sqli
16140 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
16150 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
16160 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
16170 4b 29 3b 0a 23 65 6c 73 65 20 0a 20 20 20 20 20  K);.#else .     
16180 20 20 20 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f     lrc = SQLITE_
16190 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 23  IOERR_UNLOCK; .#
161a0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66  endif.        if
161b0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
161c0 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  lrc) ){.        
161d0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
161e0 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
161f0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
16200 6c 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  lrc;.        }. 
16210 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
16220 65 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45  e {.      int tE
16230 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
16240 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
16250 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f  ;.      /* someo
16260 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20 68 61  ne else might ha
16270 76 65 20 69 74 20 72 65 73 65 72 76 65 64 20 2a  ve it reserved *
16280 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 73 71  /.      lrc = sq
16290 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
162a0 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
162b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
162c0 4b 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 49  K); .      if( I
162d0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
162e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  ) ){.        sto
162f0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
16300 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
16310 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20      rc = lrc;.  
16320 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
16330 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
16340 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
16350 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  d (flock)\n", pF
16360 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
16370 72 76 65 64 29 29 3b 0a 0a 23 69 66 64 65 66 20  rved));..#ifdef 
16380 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
16390 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  OCK_LOCK_ERRORS.
163a0 20 20 69 66 28 20 28 72 63 20 26 20 53 51 4c 49    if( (rc & SQLI
163b0 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c  TE_IOERR) == SQL
163c0 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
163d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
163e0 0a 20 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b  .    reserved=1;
163f0 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
16400 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
16410 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  CK_LOCK_ERRORS *
16420 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  /.  *pResOut = r
16430 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
16440 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
16450 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
16460 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
16470 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
16480 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
16490 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
164a0 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
164b0 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
164c0 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
164d0 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
164e0 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
164f0 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
16500 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
16510 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
16520 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
16530 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
16540 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
16550 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
16560 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
16570 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
16580 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
16590 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
165a0 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
165b0 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
165c0 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
165d0 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
165e0 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
165f0 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
16600 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
16610 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
16620 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
16630 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
16640 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
16650 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
16660 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
16670 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
16680 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
16690 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
166a0 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
166b0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
166c0 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
166d0 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
166e0 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
166f0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
16700 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72  * flock() only r
16710 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58  eally support EX
16720 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20  CLUSIVE locks.  
16730 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65  We track interme
16740 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74  diate.** lock st
16750 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69  ates in the sqli
16760 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
16770 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b  re, but all lock
16780 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61  s SHARED or.** a
16790 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20  bove are really 
167a0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20  EXCLUSIVE locks 
167b0 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20  and exclude all 
167c0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
167d0 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74  from.** access t
167e0 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
167f0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
16800 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
16810 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
16820 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
16830 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
16840 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
16850 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
16860 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73   int flockLock(s
16870 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
16880 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
16890 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
168a0 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
168b0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
168c0 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73  xFile*)id;..  as
168d0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a  sert( pFile );..
168e0 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61    /* if we alrea
168f0 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20  dy have a lock, 
16900 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e  it is exclusive.
16910 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a    .  ** Just adj
16920 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75  ust level and pu
16930 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65  nt on outta here
16940 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65  . */.  if (pFile
16950 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f  ->eFileLock > NO
16960 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
16970 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
16980 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72  eFileLock;.    r
16990 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
169a0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61  .  }.  .  /* gra
169b0 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  b an exclusive l
169c0 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28  ock */.  .  if (
169d0 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69  robust_flock(pFi
169e0 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c  le->h, LOCK_EX |
169f0 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20   LOCK_NB)) {.   
16a00 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
16a10 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e  rno;.    /* didn
16a20 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20  't get, must be 
16a30 62 75 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d  busy */.    rc =
16a40 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
16a50 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
16a60 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
16a70 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49  LOCK);.    if( I
16a80 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
16a90 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
16aa0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
16ab0 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20  tErrno);.    }. 
16ac0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a   } else {.    /*
16ad0 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65   got it, set the
16ae0 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e   type and return
16af0 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65   ok */.    pFile
16b00 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
16b10 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f  ileLock;.  }.  O
16b20 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
16b30 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f 63 6b   %d %s %s (flock
16b40 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
16b50 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
16b60 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20  Lock), .        
16b70 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
16b80 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
16b90 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  d"));.#ifdef SQL
16ba0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
16bb0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69  _LOCK_ERRORS.  i
16bc0 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f  f( (rc & SQLITE_
16bd0 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45  IOERR) == SQLITE
16be0 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63  _IOERR ){.    rc
16bf0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
16c00 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
16c10 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
16c20 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f  K_LOCK_ERRORS */
16c30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16c40 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
16c50 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
16c60 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
16c70 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
16c80 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
16c90 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
16ca0 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
16cb0 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
16cc0 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
16cd0 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
16ce0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
16cf0 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
16d00 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
16d10 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
16d20 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
16d30 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
16d40 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
16d50 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
16d60 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
16d70 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
16d80 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
16d90 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
16da0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
16db0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
16dc0 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
16dd0 73 20 25 64 20 70 69 64 3d 25 64 20 28 66 6c 6f  s %d pid=%d (flo
16de0 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
16df0 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
16e00 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
16e10 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64  FileLock, getpid
16e20 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ()));.  assert( 
16e30 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
16e40 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
16e50 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
16e60 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
16e70 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
16e80 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
16e90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16ea0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68  ;.  }.  .  /* sh
16eb0 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65  ared can just be
16ec0 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20   set because we 
16ed0 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65  always have an e
16ee0 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66  xclusive */.  if
16ef0 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
16f00 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  RED_LOCK) {.    
16f10 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16f20 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
16f30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16f40 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
16f50 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f  no, really, unlo
16f60 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72 6f 62  ck. */.  if( rob
16f70 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
16f80 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a  >h, LOCK_UN) ){.
16f90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
16fa0 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
16fb0 45 52 52 4f 52 53 0a 20 20 20 20 72 65 74 75 72  ERRORS.    retur
16fc0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
16fd0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
16fe0 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
16ff0 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 72 65  ERRORS */.    re
17000 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
17010 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73  R_UNLOCK;.  }els
17020 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  e{.    pFile->eF
17030 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
17040 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  K;.    return SQ
17050 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
17060 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
17070 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
17080 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c  t flockClose(sql
17090 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
170a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
170b0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20  TE_OK;.  if( id 
170c0 29 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f  ){.    flockUnlo
170d0 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
170e0 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55  .    rc = closeU
170f0 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d  nixFile(id);.  }
17100 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17110 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
17120 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
17130 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58  _STYLE && !OS_VX
17140 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  WORK */../******
17150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
17160 64 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c  d of the flock l
17170 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
17180 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
17190 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
171a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171e0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
171f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17230 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
17240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17250 2a 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64 20 53  ** Begin Named S
17260 65 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67  emaphore Locking
17270 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
17280 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
17290 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  Named semaphore 
172a0 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20  locking is only 
172b0 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 56 78 57  supported on VxW
172c0 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61  orks..**.** Sema
172d0 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73  phore locking is
172e0 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61   like dot-lock a
172f0 6e 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74  nd flock in that
17300 20 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a   it really only.
17310 2a 2a 20 73 75 70 70 6f 72 74 73 20 45 58 43 4c  ** supports EXCL
17320 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20  USIVE locking.  
17330 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72  Only a single pr
17340 6f 63 65 73 73 20 63 61 6e 20 72 65 61 64 20 6f  ocess can read o
17350 72 20 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 64  r write.** the d
17360 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
17370 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 65  a time.  This re
17380 64 75 63 65 73 20 70 6f 74 65 6e 74 69 61 6c 20  duces potential 
17390 63 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62 75 74  concurrency, but
173a0 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f  .** makes the lo
173b0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
173c0 6e 20 6d 75 63 68 20 65 61 73 69 65 72 2e 0a 2a  n much easier..*
173d0 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  /.#if OS_VXWORKS
173e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
173f0 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
17400 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
17410 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
17420 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
17430 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
17440 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
17450 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
17460 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
17470 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
17480 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
17490 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
174a0 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
174b0 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
174c0 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
174d0 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
174e0 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
174f0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
17500 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
17510 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 68  static int semCh
17520 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
17530 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
17540 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20  , int *pResOut) 
17550 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
17560 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
17570 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
17580 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
17590 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
175a0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
175b0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
175c0 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
175d0 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
175e0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
175f0 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  );..  /* Check i
17600 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
17610 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
17620 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
17630 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
17640 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
17650 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76  CK ){.    reserv
17660 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20  ed = 1;.  }.  . 
17670 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65   /* Otherwise se
17680 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  e if some other 
17690 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74  process holds it
176a0 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65  . */.  if( !rese
176b0 72 76 65 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f  rved ){.    sem_
176c0 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
176d0 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a  >pInode->pSem;..
176e0 20 20 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77      if( sem_tryw
176f0 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b  ait(pSem)==-1 ){
17700 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e  .      int tErrn
17710 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
17720 20 69 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74   if( EAGAIN != t
17730 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  Errno ){.       
17740 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
17750 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
17760 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
17770 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
17780 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  EDLOCK);.       
17790 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
177a0 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
177b0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
177c0 20 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e         /* someon
177d0 65 20 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c  e else has the l
177e0 6f 63 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20  ock when we are 
177f0 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20  in NO_LOCK */.  
17800 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
17810 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
17820 63 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck < SHARED_LOCK
17830 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
17840 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77  else{.      /* w
17850 65 20 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20  e could have it 
17860 69 66 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f  if we want it */
17870 0a 20 20 20 20 20 20 73 65 6d 5f 70 6f 73 74 28  .      sem_post(
17880 70 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pSem);.    }.  }
17890 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
178a0 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
178b0 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69  %d (sem)\n", pFi
178c0 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
178d0 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f  ved));..  *pResO
178e0 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
178f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17900 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
17910 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
17920 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
17930 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
17940 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
17950 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
17960 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
17970 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
17980 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
17990 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
179a0 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
179b0 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
179c0 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
179d0 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
179e0 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
179f0 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
17a00 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
17a10 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
17a20 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
17a30 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
17a40 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
17a50 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
17a60 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
17a70 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
17a80 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
17a90 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
17aa0 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
17ab0 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
17ac0 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
17ad0 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
17ae0 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
17af0 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
17b00 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
17b10 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
17b20 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
17b30 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
17b40 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
17b50 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
17b60 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
17b70 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
17b80 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
17b90 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
17ba0 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
17bb0 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72  E.**.** Semaphor
17bc0 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61  e locks only rea
17bd0 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c  lly support EXCL
17be0 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65  USIVE locks.  We
17bf0 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69   track intermedi
17c00 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74  ate.** lock stat
17c10 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  es in the sqlite
17c20 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
17c30 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20  , but all locks 
17c40 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f  SHARED or.** abo
17c50 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58  ve are really EX
17c60 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e  CLUSIVE locks an
17c70 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74  d exclude all ot
17c80 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72  her processes fr
17c90 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65  om.** access the
17ca0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   file..**.** Thi
17cb0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
17cc0 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
17cd0 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
17ce0 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
17cf0 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
17d00 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
17d10 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
17d20 6e 74 20 73 65 6d 4c 6f 63 6b 28 73 71 6c 69 74  nt semLock(sqlit
17d30 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
17d40 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
17d50 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
17d60 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
17d70 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d  .  sem_t *pSem =
17d80 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
17d90 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pSem;.  int rc =
17da0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
17db0 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20  * if we already 
17dc0 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20  have a lock, it 
17dd0 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a  is exclusive.  .
17de0 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74    ** Just adjust
17df0 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20   level and punt 
17e00 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a  on outta here. *
17e10 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65  /.  if (pFile->e
17e20 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f  FileLock > NO_LO
17e30 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
17e40 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
17e50 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d  leLock;.    rc =
17e60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
17e70 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63  goto sem_end_loc
17e80 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c  k;.  }.  .  /* l
17e90 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f  ock semaphore no
17ea0 77 20 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77  w but bail out w
17eb0 68 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b  hen already lock
17ec0 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d  ed. */.  if( sem
17ed0 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d  _trywait(pSem)==
17ee0 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  -1 ){.    rc = S
17ef0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
17f00 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63  goto sem_end_loc
17f10 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74  k;.  }..  /* got
17f20 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70   it, set the typ
17f30 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20  e and return ok 
17f40 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  */.  pFile->eFil
17f50 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
17f60 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63  k;.. sem_end_loc
17f70 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  k:.  return rc;.
17f80 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
17f90 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
17fa0 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
17fb0 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
17fc0 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
17fd0 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
17fe0 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
17ff0 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
18000 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
18010 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
18020 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
18030 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
18040 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
18050 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
18060 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
18070 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
18080 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
18090 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
180a0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
180b0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
180c0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
180d0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  nixFile*)id;.  s
180e0 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69  em_t *pSem = pFi
180f0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  le->pInode->pSem
18100 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
18110 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
18120 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43  pSem );.  OSTRAC
18130 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
18140 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20  d was %d pid=%d 
18150 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (sem)\n", pFile-
18160 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
18170 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
18180 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70  >eFileLock, getp
18190 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74  id()));.  assert
181a0 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
181b0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
181c0 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
181d0 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
181e0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
181f0 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
18200 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18210 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
18220 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20  shared can just 
18230 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77  be set because w
18240 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e  e always have an
18250 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20   exclusive */.  
18260 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if (eFileLock==S
18270 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  HARED_LOCK) {.  
18280 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
18290 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
182a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
182b0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
182c0 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c  * no, really unl
182d0 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73  ock. */.  if ( s
182e0 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d  em_post(pSem)==-
182f0 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63  1 ) {.    int rc
18300 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  , tErrno = errno
18310 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
18320 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
18330 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
18340 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
18350 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
18360 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
18370 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
18380 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
18390 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  no);.    }.    r
183a0 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20  eturn rc; .  }. 
183b0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
183c0 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72  k = NO_LOCK;.  r
183d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
183e0 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65  .}../*. ** Close
183f0 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61   a file.. */.sta
18400 74 69 63 20 69 6e 74 20 73 65 6d 43 6c 6f 73 65  tic int semClose
18410 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
18420 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b  d) {.  if( id ){
18430 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
18440 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
18450 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 55 6e 6c  *)id;.    semUnl
18460 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
18470 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
18480 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69 78 45  ile );.    unixE
18490 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
184a0 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
184b0 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e  o(pFile);.    un
184c0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
184d0 20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c      closeUnixFil
184e0 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(id);.  }.  ret
184f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
18500 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56  ..#endif /* OS_V
18510 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20  XWORKS */./*.** 
18520 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  Named semaphore 
18530 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20  locking is only 
18540 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57  available on VxW
18550 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  orks..**.*******
18560 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
18570 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68  the named semaph
18580 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ore lock impleme
18590 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
185a0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
185b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
185c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
185d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
185e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
185f0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a  *******/.../****
18600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
18650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18660 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50  ****** Begin AFP
18670 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
18680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
186a0 20 41 46 50 20 69 73 20 74 68 65 20 41 70 70 6c   AFP is the Appl
186b0 65 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f  e Filing Protoco
186c0 6c 2e 20 20 41 46 50 20 69 73 20 61 20 6e 65 74  l.  AFP is a net
186d0 77 6f 72 6b 20 66 69 6c 65 73 79 73 74 65 6d 20  work filesystem 
186e0 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c  found.** on Appl
186f0 65 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70  e Macintosh comp
18700 75 74 65 72 73 20 2d 20 62 6f 74 68 20 4f 53 39  uters - both OS9
18710 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20   and OSX..**.** 
18720 54 68 69 72 64 2d 70 61 72 74 79 20 69 6d 70 6c  Third-party impl
18730 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41  ementations of A
18740 46 50 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  FP are available
18750 2e 20 20 42 75 74 20 74 68 69 73 20 63 6f 64 65  .  But this code
18760 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f   here.** only wo
18770 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a  rks on OSX..*/..
18780 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
18790 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
187a0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
187b0 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20  STYLE./*.** The 
187c0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
187d0 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  t structure cont
187e0 61 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63  ains all afp loc
187f0 6b 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65  k specific state
18800 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
18810 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  ct afpLockingCon
18820 74 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43  text afpLockingC
18830 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61  ontext;.struct a
18840 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
18850 20 7b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65   {.  int reserve
18860 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  d;.  const char 
18870 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20  *dbPath;        
18880 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
18890 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f  the open file */
188a0 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65  .};..struct Byte
188b0 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20  RangeLockPB2.{. 
188c0 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
188d0 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20  ong offset;     
188e0 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20     /* offset to 
188f0 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f  first byte to lo
18900 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
18910 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74   long long lengt
18920 68 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72  h;        /* nbr
18930 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63   of bytes to loc
18940 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  k */.  unsigned 
18950 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e  long long retRan
18960 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20  geStart; /* nbr 
18970 6f 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b  of 1st byte lock
18980 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ed if successful
18990 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
189a0 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20  har unLockFlag; 
189b0 20 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75          /* 1 = u
189c0 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20  nlock, 0 = lock 
189d0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
189e0 61 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b  ar startEndFlag;
189f0 20 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20         /* 1=rel 
18a00 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20  to end of fork, 
18a10 30 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a  0=rel to start *
18a20 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  /.  int fd;     
18a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a40 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65        /* file de
18a50 73 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73  sc to assoc this
18a60 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b   lock with */.};
18a70 0a 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73 42  ..#define afpfsB
18a80 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43  yteRangeLock2FSC
18a90 54 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28  TL        _IOWR(
18aa0 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20  'z', 23, struct 
18ab0 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
18ac0 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  )../*.** This is
18ad0 20 61 20 75 74 69 6c 69 74 79 20 66 6f 72 20 73   a utility for s
18ae0 65 74 74 69 6e 67 20 6f 72 20 63 6c 65 61 72 69  etting or cleari
18af0 6e 67 20 61 20 62 69 74 2d 72 61 6e 67 65 20 6c  ng a bit-range l
18b00 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50  ock on an.** AFP
18b10 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20   filesystem..** 
18b20 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
18b30 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c  E_OK on success,
18b40 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20   SQLITE_BUSY on 
18b50 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
18b60 69 63 20 69 6e 74 20 61 66 70 53 65 74 4c 6f 63  ic int afpSetLoc
18b70 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  k(.  const char 
18b80 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  *path,          
18b90 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
18ba0 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f  he file to be lo
18bb0 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64  cked or unlocked
18bc0 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
18bd0 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  pFile,          
18be0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
18bf0 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  e descriptor on 
18c00 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  path */.  unsign
18c10 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66  ed long long off
18c20 73 65 74 2c 20 20 20 20 20 2f 2a 20 46 69 72 73  set,     /* Firs
18c30 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63  t byte to be loc
18c40 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ked */.  unsigne
18c50 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67  d long long leng
18c60 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  th,     /* Numbe
18c70 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
18c80 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c  ck */.  int setL
18c90 6f 63 6b 46 6c 61 67 20 20 20 20 20 20 20 20 20  ockFlag         
18ca0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
18cb0 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c  o set lock.  Fal
18cc0 73 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b  se to clear lock
18cd0 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
18ce0 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
18cf0 20 70 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a   pb;.  int err;.
18d00 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c    .  pb.unLockFl
18d10 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67  ag = setLockFlag
18d20 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73   ? 0 : 1;.  pb.s
18d30 74 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b  tartEndFlag = 0;
18d40 0a 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f  .  pb.offset = o
18d50 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67  ffset;.  pb.leng
18d60 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20  th = length; .  
18d70 70 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68  pb.fd = pFile->h
18d80 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 28 28  ;.  .  OSTRACE((
18d90 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d  "AFPSETLOCK [%s]
18da0 20 66 6f 72 20 25 64 25 73 20 69 6e 20 72 61 6e   for %d%s in ran
18db0 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c  ge %llx:%llx\n",
18dc0 20 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c   .    (setLockFl
18dd0 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20  ag?"ON":"OFF"), 
18de0 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64  pFile->h, (pb.fd
18df0 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31  ==-1?"[testval-1
18e00 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66 73  ]":""),.    offs
18e10 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20  et, length));.  
18e20 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68  err = fsctl(path
18e30 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65  , afpfsByteRange
18e40 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c  Lock2FSCTL, &pb,
18e50 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d   0);.  if ( err=
18e60 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20  =-1 ) {.    int 
18e70 72 63 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72  rc;.    int tErr
18e80 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
18e90 4f 53 54 52 41 43 45 28 28 22 41 46 50 53 45 54  OSTRACE(("AFPSET
18ea0 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66  LOCK failed to f
18eb0 73 63 74 6c 28 29 20 27 25 73 27 20 25 64 20 25  sctl() '%s' %d %
18ec0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
18ed0 20 20 20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c     path, tErrno,
18ee0 20 73 74 72 65 72 72 6f 72 28 74 45 72 72 6e 6f   strerror(tErrno
18ef0 29 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  )));.#ifdef SQLI
18f00 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f  TE_IGNORE_AFP_LO
18f10 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 63  CK_ERRORS.    rc
18f20 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
18f30 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 73  #else.    rc = s
18f40 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
18f50 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
18f60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18f70 20 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67       setLockFlag
18f80 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   ? SQLITE_IOERR_
18f90 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f  LOCK : SQLITE_IO
18fa0 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e  ERR_UNLOCK);.#en
18fb0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
18fc0 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52  NORE_AFP_LOCK_ER
18fd0 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66 28 20  RORS */.    if( 
18fe0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
18ff0 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65  ) ){.      store
19000 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
19010 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a   tErrno);.    }.
19020 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19030 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65   } else {.    re
19040 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19050 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
19060 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
19070 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
19080 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
19090 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
190a0 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
190b0 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
190c0 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
190d0 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
190e0 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
190f0 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
19100 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
19110 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
19120 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
19130 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
19140 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
19150 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
19160 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
19170 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
19180 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19190 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64  afpCheckReserved
191a0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
191b0 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
191c0 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Out){.  int rc =
191d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
191e0 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
191f0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
19200 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
19210 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  d;.  afpLockingC
19220 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b  ontext *context;
19230 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  .  .  SimulateIO
19240 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
19250 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
19260 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
19270 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
19280 69 6c 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74  ile );.  context
19290 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
192a0 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
192b0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
192c0 20 20 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72    if( context->r
192d0 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a  eserved ){.    *
192e0 70 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20  pResOut = 1;.   
192f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19300 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  K;.  }.  unixEnt
19310 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65  erMutex(); /* Be
19320 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
19330 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
19340 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a  ross threads */.
19350 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66    .  /* Check if
19360 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
19370 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
19380 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
19390 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f   if( pFile->pIno
193a0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  de->eFileLock>SH
193b0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
193c0 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
193d0 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
193e0 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
193f0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
19400 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20  olds it..   */. 
19410 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
19420 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68  {.    /* lock th
19430 65 20 52 45 53 45 52 56 45 44 20 62 79 74 65 20  e RESERVED byte 
19440 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d  */.    int lrc =
19450 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
19460 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
19470 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
19480 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69  E, 1,1);  .    i
19490 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72  f( SQLITE_OK==lr
194a0 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66  c ){.      /* if
194b0 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e   we succeeded in
194c0 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65   taking the rese
194d0 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63  rved lock, unloc
194e0 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a  k it to restore.
194f0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69        ** the ori
19500 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20  ginal state */. 
19510 20 20 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65       lrc = afpSe
19520 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
19530 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
19540 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20  SERVED_BYTE, 1, 
19550 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  0);.    } else {
19560 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20  .      /* if we 
19570 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68  failed to get th
19580 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65  e lock then some
19590 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61  one else must ha
195a0 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72  ve it */.      r
195b0 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
195c0 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f   }.    if( IS_LO
195d0 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b  CK_ERROR(lrc) ){
195e0 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20  .      rc=lrc;. 
195f0 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e     }.  }.  .  un
19600 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
19610 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
19620 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
19630 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
19640 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
19650 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73  ed));.  .  *pRes
19660 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
19670 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19680 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
19690 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
196a0 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
196b0 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
196c0 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
196d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
196e0 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
196f0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
19700 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
19710 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
19720 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
19730 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
19740 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
19750 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
19760 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
19770 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
19780 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
19790 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
197a0 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
197b0 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
197c0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
197d0 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
197e0 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
197f0 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
19800 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
19810 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
19820 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
19830 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
19840 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
19850 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
19860 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
19870 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
19880 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
19890 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
198a0 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
198b0 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
198c0 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
198d0 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
198e0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
198f0 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
19900 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
19910 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
19920 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
19930 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
19940 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
19950 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
19960 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
19970 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
19980 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
19990 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
199a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
199b0 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  fpLock(sqlite3_f
199c0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
199d0 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  leLock){.  int r
199e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
199f0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
19a00 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
19a10 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
19a20 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
19a30 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70  e->pInode;.  afp
19a40 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
19a50 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
19a60 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
19a70 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
19a80 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65  ntext;.  .  asse
19a90 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
19aa0 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
19ab0 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73   %d %s was %s(%s
19ac0 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70  ,%d) pid=%d (afp
19ad0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
19ae0 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
19af0 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
19b00 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69  , azFileLock(pFi
19b10 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a  le->eFileLock),.
19b20 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
19b30 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46  eLock(pInode->eF
19b40 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65  ileLock), pInode
19b50 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74 70  ->nShared , getp
19b60 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  id()));..  /* If
19b70 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
19b80 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
19b90 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
19ba0 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
19bb0 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20  .  ** unixFile, 
19bc0 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
19bd0 74 20 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e  t use the afp_en
19be0 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
19bf0 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45  h, as.  ** unixE
19c00 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
19c10 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
19c20 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
19c30 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
19c40 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
19c50 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
19c60 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c      %d %s ok (al
19c70 72 65 61 64 79 20 68 65 6c 64 29 20 28 61 66 70  ready held) (afp
19c80 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
19c90 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
19ca0 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
19cb0 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
19cc0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
19cd0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
19ce0 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e  e locking sequen
19cf0 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20  ce is correct.  
19d00 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72  **  (1) We never
19d10 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63   move from unloc
19d20 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20  ked to anything 
19d30 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72  higher than shar
19d40 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28  ed lock..  **  (
19d50 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20  2) SQLite never 
19d60 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65  explicitly reque
19d70 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63  sts a pendig loc
19d80 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73  k..  **  (3) A s
19d90 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c  hared lock is al
19da0 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61  ways held when a
19db0 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73   reserve lock is
19dc0 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
19dd0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
19de0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f  ->eFileLock!=NO_
19df0 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
19e00 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
19e10 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
19e20 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c  eLock!=PENDING_L
19e30 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
19e40 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45   eFileLock!=RESE
19e50 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69  RVED_LOCK || pFi
19e60 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  le->eFileLock==S
19e70 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
19e80 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78  .  /* This mutex
19e90 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75   is needed becau
19ea0 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
19eb0 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
19ec0 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20  s threads.  */. 
19ed0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
19ee0 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
19ef0 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20  ile->pInode;..  
19f00 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61  /* If some threa
19f10 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
19f20 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20   has a lock via 
19f30 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78  a different unix
19f40 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c  File*.  ** handl
19f50 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73  e that precludes
19f60 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
19f70 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59  ock, return BUSY
19f80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46  ..  */.  if( (pF
19f90 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
19fa0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
19fb0 6b 20 26 26 20 0a 20 20 20 20 20 20 20 28 70 49  k && .       (pI
19fc0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
19fd0 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c  =PENDING_LOCK ||
19fe0 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45   eFileLock>SHARE
19ff0 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b  D_LOCK)).     ){
1a000 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1a010 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
1a020 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
1a030 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 20 53  }.  .  /* If a S
1a040 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65  HARED lock is re
1a050 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d  quested, and som
1a060 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
1a070 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a  his PID already.
1a080 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45    ** has a SHARE
1a090 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f  D or RESERVED lo
1a0a0 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  ck, then increme
1a0b0 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  nt reference cou
1a0c0 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74  nts and.  ** ret
1a0d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20  urn SQLITE_OK.. 
1a0e0 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
1a0f0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
1a100 20 26 26 20 0a 20 20 20 20 20 28 70 49 6e 6f 64   && .     (pInod
1a110 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
1a120 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e  ARED_LOCK || pIn
1a130 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
1a140 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29  RESERVED_LOCK) )
1a150 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46  {.    assert( eF
1a160 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
1a170 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
1a180 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
1a190 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Lock==0 );.    a
1a1a0 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
1a1b0 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20  Shared>0 );.    
1a1c0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
1a1d0 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
1a1e0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
1a1f0 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64  red++;.    pInod
1a200 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
1a210 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
1a220 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a  k;.  }.    .  /*
1a230 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
1a240 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65  is needed before
1a250 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
1a260 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66  RED lock and bef
1a270 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69  ore.  ** acquiri
1a280 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
1a290 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53  lock.  For the S
1a2a0 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
1a2b0 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a  PENDING will.  *
1a2c0 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20  * be released.. 
1a2d0 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
1a2e0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
1a2f0 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c   .      || (eFil
1a300 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
1a310 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
1a320 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e  eFileLock<PENDIN
1a330 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20  G_LOCK).  ){.   
1a340 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20 20   int failed;.   
1a350 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74   failed = afpSet
1a360 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
1a370 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e  Path, pFile, PEN
1a380 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29  DING_BYTE, 1, 1)
1a390 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65 64  ;.    if (failed
1a3a0 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  ) {.      rc = f
1a3b0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f 74  ailed;.      got
1a3c0 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
1a3d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f      }.  }.  .  /
1a3e0 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74  * If control get
1a3f0 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
1a400 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67   then actually g
1a410 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65  o ahead and make
1a420 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  .  ** operating 
1a430 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72  system calls for
1a440 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
1a450 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
1a460 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
1a470 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e  D_LOCK ){.    in
1a480 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72  t lrc1, lrc2, lr
1a490 63 31 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20  c1Errno = 0;.   
1a4a0 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a   long lk, mask;.
1a4b0 20 20 20 20 0a 20 20 20 20 61 73 73 65 72 74 28      .    assert(
1a4c0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
1a4d0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
1a4e0 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
1a4f0 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Lock==0 );.     
1a500 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28     .    mask = (
1a510 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29  sizeof(long)==8)
1a520 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34   ? LARGEST_INT64
1a530 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20   : 0x7fffffff;. 
1a540 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68     /* Now get th
1a550 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52  e read-lock SHAR
1a560 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f  ED_LOCK */.    /
1a570 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * note that the 
1a580 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72  quality of the r
1a590 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27  andomness doesn'
1a5a0 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75  t matter that mu
1a5b0 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72  ch */.    lk = r
1a5c0 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49  andom(); .    pI
1a5d0 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
1a5e0 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28   = (lk & mask)%(
1a5f0 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29  SHARED_SIZE - 1)
1a600 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70  ;.    lrc1 = afp
1a610 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
1a620 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
1a630 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45  .          SHARE
1a640 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e  D_FIRST+pInode->
1a650 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31  sharedByte, 1, 1
1a660 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
1a670 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29  CK_ERROR(lrc1) )
1a680 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e  {.      lrc1Errn
1a690 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  o = pFile->lastE
1a6a0 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
1a6b0 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70  /* Drop the temp
1a6c0 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f  orary PENDING lo
1a6d0 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d  ck */.    lrc2 =
1a6e0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
1a6f0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
1a700 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
1a710 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20  , 1, 0);.    .  
1a720 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
1a730 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20  ROR(lrc1) ) {.  
1a740 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
1a750 6e 6f 28 70 46 69 6c 65 2c 20 6c 72 63 31 45 72  no(pFile, lrc1Er
1a760 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  rno);.      rc =
1a770 20 6c 72 63 31 3b 0a 20 20 20 20 20 20 67 6f 74   lrc1;.      got
1a780 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
1a790 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 49      } else if( I
1a7a0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
1a7b0 32 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  2) ){.      rc =
1a7c0 20 6c 72 63 32 3b 0a 20 20 20 20 20 20 67 6f 74   lrc2;.      got
1a7d0 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
1a7e0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c      } else if( l
1a7f0 72 63 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b  rc1 != SQLITE_OK
1a800 20 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20   ) {.      rc = 
1a810 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lrc1;.    } else
1a820 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
1a830 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
1a840 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  ED_LOCK;.      p
1a850 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
1a860 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53        pInode->nS
1a870 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  hared = 1;.    }
1a880 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
1a890 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
1a8a0 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65  E_LOCK && pInode
1a8b0 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20  ->nShared>1 ){. 
1a8c0 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79     /* We are try
1a8d0 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75  ing for an exclu
1a8e0 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e  sive lock but an
1a8f0 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20  other thread in 
1a900 74 68 69 73 0a 20 20 20 20 20 2a 2a 20 73 61 6d  this.     ** sam
1a910 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  e process is sti
1a920 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61  ll holding a sha
1a930 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20  red lock. */.   
1a940 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
1a950 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
1a960 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77  /* The request w
1a970 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45  as for a RESERVE
1a980 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
1a990 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ock.  It is.    
1a9a0 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  ** assumed that 
1a9b0 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45  there is a SHARE
1a9c0 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
1a9d0 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20  k on the file.  
1a9e0 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20    ** already..  
1a9f0 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61 69    */.    int fai
1aa00 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  led = 0;.    ass
1aa10 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65  ert( 0!=pFile->e
1aa20 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  FileLock );.    
1aa30 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d  if (eFileLock >=
1aa40 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26   RESERVED_LOCK &
1aa50 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
1aa60 63 6b 20 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f  ck < RESERVED_LO
1aa70 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  CK) {.        /*
1aa80 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52   Acquire a RESER
1aa90 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  VED lock */.    
1aaa0 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70      failed = afp
1aab0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
1aac0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
1aad0 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
1aae0 2c 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ,1);.      if( !
1aaf0 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  failed ){.      
1ab00 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72    context->reser
1ab10 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ved = 1;.      }
1ab20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21  .    }.    if (!
1ab30 66 61 69 6c 65 64 20 26 26 20 65 46 69 6c 65 4c  failed && eFileL
1ab40 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53 49 56 45  ock == EXCLUSIVE
1ab50 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f  _LOCK) {.      /
1ab60 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58 43  * Acquire an EXC
1ab70 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20  LUSIVE lock */. 
1ab80 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a         .      /*
1ab90 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61 72   Remove the shar
1aba0 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74  ed lock before t
1abb0 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2e  rying the range.
1abc0 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20    we'll need to 
1abd0 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73 74 61  .      ** reesta
1abe0 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
1abf0 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61 6e 27   lock if we can'
1ac00 74 20 67 65 74 20 74 68 65 20 20 61 66 70 55 6e  t get the  afpUn
1ac10 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20  lock.      */.  
1ac20 20 20 20 20 69 66 28 20 21 28 66 61 69 6c 65 64      if( !(failed
1ac30 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
1ac40 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
1ac50 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
1ac60 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20  ST +.           
1ac70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
1ac80 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
1ac90 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20 20 20 20  , 1, 0)) ){.    
1aca0 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 32 20      int failed2 
1acb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1acc0 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65       /* now atte
1acd0 6d 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20  mmpt to get the 
1ace0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72  exclusive lock r
1acf0 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  ange */.        
1ad00 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
1ad10 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
1ad20 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
1ad30 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20  ED_FIRST, .     
1ad40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad50 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
1ad60 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20  _SIZE, 1);.     
1ad70 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 26 26     if( failed &&
1ad80 20 28 66 61 69 6c 65 64 32 20 3d 20 61 66 70 53   (failed2 = afpS
1ad90 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
1ada0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a  dbPath, pFile, .
1adb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1adc0 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
1add0 52 53 54 20 2b 20 70 49 6e 6f 64 65 2d 3e 73 68  RST + pInode->sh
1ade0 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 29  aredByte, 1, 1))
1adf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1ae00 20 43 61 6e 27 74 20 72 65 65 73 74 61 62 6c 69   Can't reestabli
1ae10 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
1ae20 63 6b 2e 20 20 53 71 6c 69 74 65 20 63 61 6e 27  ck.  Sqlite can'
1ae30 74 20 64 65 61 6c 2c 20 74 68 69 73 20 69 73 0a  t deal, this is.
1ae40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63            ** a c
1ae50 72 69 74 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f  ritical I/O erro
1ae60 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  r.          */. 
1ae70 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 28 28           rc = ((
1ae80 66 61 69 6c 65 64 20 26 20 53 51 4c 49 54 45 5f  failed & SQLITE_
1ae90 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45  IOERR) == SQLITE
1aea0 5f 49 4f 45 52 52 29 20 3f 20 66 61 69 6c 65 64  _IOERR) ? failed
1aeb0 32 20 3a 20 0a 20 20 20 20 20 20 20 20 20 20 20  2 : .           
1aec0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52      SQLITE_IOERR
1aed0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20  _LOCK;.         
1aee0 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
1aef0 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a 20  ck;.        } . 
1af00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1af10 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
1af20 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a   .      }.    }.
1af30 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 29      if( failed )
1af40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69  {.      rc = fai
1af50 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  led;.    }.  }. 
1af60 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49   .  if( rc==SQLI
1af70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69  TE_OK ){.    pFi
1af80 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
1af90 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70  eFileLock;.    p
1afa0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
1afb0 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
1afc0 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
1afd0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
1afe0 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
1aff0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45  ->eFileLock = PE
1b000 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20  NDING_LOCK;.    
1b010 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
1b020 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  k = PENDING_LOCK
1b030 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65 6e 64  ;.  }.  .afp_end
1b040 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61  _lock:.  unixLea
1b050 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
1b060 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
1b070 64 20 25 73 20 25 73 20 28 61 66 70 29 5c 6e 22  d %s %s (afp)\n"
1b080 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69  , pFile->h, azFi
1b090 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
1b0a0 29 2c 20 0a 20 20 20 20 20 20 20 20 20 72 63 3d  ), .         rc=
1b0b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
1b0c0 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
1b0d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1b0e0 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
1b0f0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
1b100 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1b110 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
1b120 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
1b130 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
1b140 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
1b150 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
1b160 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
1b170 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
1b180 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
1b190 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
1b1a0 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
1b1b0 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
1b1c0 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
1b1d0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
1b1e0 74 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e 6c  tatic int afpUnl
1b1f0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
1b200 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
1b210 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  ock) {.  int rc 
1b220 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
1b230 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1b240 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
1b250 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
1b260 2a 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f  *pInode;.  afpLo
1b270 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
1b280 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
1b290 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
1b2a0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
1b2b0 65 78 74 3b 0a 20 20 69 6e 74 20 73 6b 69 70 53  ext;.  int skipS
1b2c0 68 61 72 65 64 20 3d 20 30 3b 0a 23 69 66 64 65  hared = 0;.#ifde
1b2d0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
1b2e0 69 6e 74 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68  int h = pFile->h
1b2f0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
1b300 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
1b310 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
1b320 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64   %d %d was %d(%d
1b330 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70  ,%d) pid=%d (afp
1b340 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
1b350 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
1b360 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
1b370 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
1b380 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
1b390 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
1b3a0 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20  >nShared,.      
1b3b0 20 20 20 20 20 67 65 74 70 69 64 28 29 29 29 3b       getpid()));
1b3c0 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ..  assert( eFil
1b3d0 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
1b3e0 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  CK );.  if( pFil
1b3f0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46  e->eFileLock<=eF
1b400 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
1b410 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b420 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72  .  }.  unixEnter
1b430 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64  Mutex();.  pInod
1b440 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
1b450 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  e;.  assert( pIn
1b460 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20  ode->nShared!=0 
1b470 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
1b480 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
1b490 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  _LOCK ){.    ass
1b4a0 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69  ert( pInode->eFi
1b4b0 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65  leLock==pFile->e
1b4c0 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  FileLock );.    
1b4d0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1b4e0 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69  enign(1);.    Si
1b4f0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68  mulateIOError( h
1b500 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75  =(-1) ).    Simu
1b510 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1b520 6e 28 30 29 3b 0a 20 20 20 20 0a 23 69 66 64 65  n(0);.    .#ifde
1b530 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1b540 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63     /* When reduc
1b550 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20  ing a lock such 
1b560 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65  that other proce
1b570 73 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20  sses can start. 
1b580 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68     ** reading th
1b590 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1b5a0 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65  again, make sure
1b5b0 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a   that the.    **
1b5c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1b5d0 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64  nter was updated
1b5e0 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20   if any part of 
1b5f0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
1b600 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64   ** file changed
1b610 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  .  If the transa
1b620 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73  ction counter is
1b630 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20   not updated,.  
1b640 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65    ** other conne
1b650 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61  ctions to the sa
1b660 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f  me file might no
1b670 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20  t realize that. 
1b680 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68     ** the file h
1b690 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68  as changed and h
1b6a0 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b  ence might not k
1b6b0 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65  now to flush the
1b6c0 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e  ir.    ** cache.
1b6d0 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 20 73    The use of a s
1b6e0 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c  tale cache can l
1b6f0 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20  ead to database 
1b700 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
1b710 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1b720 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
1b730 69 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ite==0.         
1b740 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70    || pFile->dbUp
1b750 64 61 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20  date==0.        
1b760 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61     || pFile->tra
1b770 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b  nsCntrChng==1 );
1b780 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f  .    pFile->inNo
1b790 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23  rmalWrite = 0;.#
1b7a0 65 6e 64 69 66 0a 20 20 20 20 0a 20 20 20 20 69  endif.    .    i
1b7b0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
1b7c0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
1b7d0 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  OCK ){.      rc 
1b7e0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
1b7f0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
1b800 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ile, SHARED_FIRS
1b810 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20  T, SHARED_SIZE, 
1b820 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1b830 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
1b840 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
1b850 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65  D_LOCK || pInode
1b860 2d 3e 6e 53 68 61 72 65 64 3e 31 29 20 29 7b 0a  ->nShared>1) ){.
1b870 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20          /* only 
1b880 72 65 2d 65 73 74 61 62 6c 69 73 68 20 74 68 65  re-establish the
1b890 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20   shared lock if 
1b8a0 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20  necessary */.   
1b8b0 20 20 20 20 20 69 6e 74 20 73 68 61 72 65 64 4c       int sharedL
1b8c0 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44  ockByte = SHARED
1b8d0 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73  _FIRST+pInode->s
1b8e0 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 20  haredByte;.     
1b8f0 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
1b900 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
1b910 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65  th, pFile, share
1b920 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29  dLockByte, 1, 1)
1b930 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;.      } else {
1b940 0a 20 20 20 20 20 20 20 20 73 6b 69 70 53 68 61  .        skipSha
1b950 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  red = 1;.      }
1b960 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1b970 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1b980 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
1b990 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  >=PENDING_LOCK )
1b9a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70  {.      rc = afp
1b9b0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
1b9c0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
1b9d0 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c  PENDING_BYTE, 1,
1b9e0 20 30 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20   0);.    } .    
1b9f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ba00 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K && pFile->eFil
1ba10 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f  eLock>=RESERVED_
1ba20 4c 4f 43 4b 20 26 26 20 63 6f 6e 74 65 78 74 2d  LOCK && context-
1ba30 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  >reserved ){.   
1ba40 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
1ba50 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
1ba60 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
1ba70 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  VED_BYTE, 1, 0);
1ba80 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29  .      if( !rc )
1ba90 7b 20 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65  { .        conte
1baa0 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30  xt->reserved = 0
1bab0 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ; .      }.    }
1bac0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1bad0 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65  ITE_OK && (eFile
1bae0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
1baf0 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K || pInode->nSh
1bb00 61 72 65 64 3e 31 29 29 7b 0a 20 20 20 20 20 20  ared>1)){.      
1bb10 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
1bb20 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
1bb30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1bb40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1bb50 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f  & eFileLock==NO_
1bb60 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  LOCK ){..    /* 
1bb70 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68  Decrement the sh
1bb80 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65  ared lock counte
1bb90 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20  r.  Release the 
1bba0 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20  lock using an.  
1bbb0 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c    ** OS call onl
1bbc0 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61  y when all threa
1bbd0 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20  ds in this same 
1bbe0 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c  process have rel
1bbf0 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65  eased.    ** the
1bc00 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   lock..    */.  
1bc10 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
1bc20 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b 42  long sharedLockB
1bc30 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52  yte = SHARED_FIR
1bc40 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65  ST+pInode->share
1bc50 64 42 79 74 65 3b 0a 20 20 20 20 70 49 6e 6f 64  dByte;.    pInod
1bc60 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20  e->nShared--;.  
1bc70 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53    if( pInode->nS
1bc80 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  hared==0 ){.    
1bc90 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1bca0 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
1bcb0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1bcc0 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20  r( h=(-1) ).    
1bcd0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1bce0 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
1bcf0 20 20 69 66 28 20 21 73 6b 69 70 53 68 61 72 65    if( !skipShare
1bd00 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  d ){.        rc 
1bd10 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
1bd20 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
1bd30 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42  ile, sharedLockB
1bd40 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  yte, 1, 0);.    
1bd50 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 72    }.      if( !r
1bd60 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  c ){.        pIn
1bd70 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
1bd80 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
1bd90 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
1bda0 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
1bdb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1bdc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1bdd0 4b 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64  K ){.      pInod
1bde0 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20  e->nLock--;.    
1bdf0 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
1be00 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20  ->nLock>=0 );.  
1be10 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
1be20 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  nLock==0 ){.    
1be30 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67      closePending
1be40 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  Fds(pFile);.    
1be50 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1be60 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
1be70 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  x();.  if( rc==S
1be80 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65  QLITE_OK ) pFile
1be90 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
1bea0 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72  ileLock;.  retur
1beb0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
1bec0 6c 6f 73 65 20 61 20 66 69 6c 65 20 26 20 63 6c  lose a file & cl
1bed0 65 61 6e 75 70 20 41 46 50 20 73 70 65 63 69 66  eanup AFP specif
1bee0 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  ic locking conte
1bef0 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  xt .*/.static in
1bf00 74 20 61 66 70 43 6c 6f 73 65 28 73 71 6c 69 74  t afpClose(sqlit
1bf10 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
1bf20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1bf30 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b  _OK;.  if( id ){
1bf40 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
1bf50 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
1bf60 2a 29 69 64 3b 0a 20 20 20 20 61 66 70 55 6e 6c  *)id;.    afpUnl
1bf70 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
1bf80 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  ;.    unixEnterM
1bf90 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20  utex();.    if( 
1bfa0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26  pFile->pInode &&
1bfb0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
1bfc0 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f  nLock ){.      /
1bfd0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
1bfe0 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
1bff0 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c  , do not actuall
1c000 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  y close the file
1c010 20 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 79   just.      ** y
1c020 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20  et because that 
1c030 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73  would clear thos
1c040 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61  e locks.  Instea
1c050 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a  d, add the file.
1c060 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70        ** descrip
1c070 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 61  tor to pInode->a
1c080 50 65 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c  Pending.  It wil
1c090 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  l be automatical
1c0a0 6c 79 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20  ly closed when. 
1c0b0 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74       ** the last
1c0c0 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64   lock is cleared
1c0d0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1c0e0 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46   setPendingFd(pF
1c0f0 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ile);.    }.    
1c100 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f  releaseInodeInfo
1c110 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 73 71 6c  (pFile);.    sql
1c120 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
1c130 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
1c140 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65  ;.    rc = close
1c150 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
1c160 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
1c170 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ();.  }.  return
1c180 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f   rc;.}..#endif /
1c190 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
1c1a0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
1c1b0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1c1c0 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65  YLE */./*.** The
1c1d0 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74   code above is t
1c1e0 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c  he AFP lock impl
1c1f0 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65  ementation.  The
1c200 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69   code is specifi
1c210 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61  c.** to MacOSX a
1c220 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  nd does not work
1c230 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70   on other unix p
1c240 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c  latforms.  No al
1c250 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20  ternative.** is 
1c260 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 79  available.  If y
1c270 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65  ou don't compile
1c280 20 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65 6e   for a mac, then
1c290 20 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22 0a   the "unix-afp".
1c2a0 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61 76  ** VFS is not av
1c2b0 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ailable..**.****
1c2c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c2d0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46 50  * End of the AFP
1c2e0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
1c2f0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
1c300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
1c310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
1c360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c3a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
1c3b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c3c0 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e  ******** Begin N
1c3d0 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  FS Locking *****
1c3e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c3f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69  ***********/..#i
1c400 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1c410 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
1c420 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1c430 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72  YLE./*. ** Lower
1c440 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
1c450 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
1c460 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
1c470 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
1c480 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65  Lock. ** must be
1c490 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
1c4a0 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
1c4b0 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c   **. ** If the l
1c4c0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
1c4d0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
1c4e0 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
1c4f0 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74  t or below. ** t
1c500 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
1c510 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
1c520 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
1c530 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  -op.. */.static 
1c540 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71  int nfsUnlock(sq
1c550 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1c560 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
1c570 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e    return posixUn
1c580 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f  lock(id, eFileLo
1c590 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69  ck, 1);.}..#endi
1c5a0 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
1c5b0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
1c5c0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1c5d0 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20  _STYLE */./*.** 
1c5e0 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69  The code above i
1c5f0 73 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69  s the NFS lock i
1c600 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
1c610 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65 63  The code is spec
1c620 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53  ific.** to MacOS
1c630 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77  X and does not w
1c640 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69  ork on other uni
1c650 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f  x platforms.  No
1c660 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20   alternative.** 
1c670 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a  is available.  .
1c680 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
1c690 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
1c6a0 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70  the NFS lock imp
1c6b0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
1c6c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c6d0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
1c6e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c6f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c720 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
1c730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c770 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
1c780 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67  **** Non-locking
1c790 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65   sqlite3_file me
1c7a0 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
1c7b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c7c0 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ***.**.** The ne
1c7d0 78 74 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  xt division cont
1c7e0 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  ains implementat
1c7f0 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74  ions for all met
1c800 68 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  hods of the .** 
1c810 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a  sqlite3_file obj
1c820 65 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ect other than t
1c830 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  he locking metho
1c840 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  ds.  The locking
1c850 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65  .** methods were
1c860 20 64 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69   defined in divi
1c870 73 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65  sions above (one
1c880 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
1c890 70 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29  per.** division)
1c8a0 2e 20 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73  .  Those methods
1c8b0 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e   that are common
1c8c0 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20   to all locking 
1c8d0 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74  modes.** are gat
1c8e0 68 65 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74  her together int
1c8f0 6f 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e  o this division.
1c900 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  .*/../*.** Seek 
1c910 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70 61  to the offset pa
1c920 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
1c930 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65  nd argument, the
1c940 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62  n read cnt .** b
1c950 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20  ytes into pBuf. 
1c960 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1c970 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
1c980 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  lly read..**.** 
1c990 4e 42 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69  NB:  If you defi
1c9a0 6e 65 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20  ne USE_PREAD or 
1c9b0 55 53 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65  USE_PREAD64, the
1c9c0 6e 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a  n it might also.
1c9d0 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20  ** be necessary 
1c9e0 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e  to define _XOPEN
1c9f0 5f 53 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30  _SOURCE to be 50
1ca00 30 2e 20 20 54 68 69 73 20 76 61 72 69 65 73 20  0.  This varies 
1ca10 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74  from.** one syst
1ca20 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20  em to another.  
1ca30 53 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65  Since SQLite doe
1ca40 73 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45  s not define USE
1ca50 5f 50 52 45 41 44 0a 2a 2a 20 69 6e 20 61 6e 79  _PREAD.** in any
1ca60 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74   form by default
1ca70 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74  , we will not at
1ca80 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20  tempt to define 
1ca90 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a  _XOPEN_SOURCE..*
1caa0 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20 23 32  * See tickets #2
1cab0 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a  741 and #2681..*
1cac0 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74  *.** To avoid st
1cad0 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f  omping the errno
1cae0 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c   value on a fail
1caf0 65 64 20 72 65 61 64 20 74 68 65 20 6c 61 73 74  ed read the last
1cb00 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69  Errno value.** i
1cb10 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74  s set before ret
1cb20 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
1cb30 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61  c int seekAndRea
1cb40 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20  d(unixFile *id, 
1cb50 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
1cb60 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66  fset, void *pBuf
1cb70 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e  , int cnt){.  in
1cb80 74 20 67 6f 74 3b 0a 20 20 69 6e 74 20 70 72 69  t got;.  int pri
1cb90 6f 72 20 3d 20 30 3b 0a 23 69 66 20 28 21 64 65  or = 0;.#if (!de
1cba0 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
1cbb0 20 26 26 20 21 64 65 66 69 6e 65 64 28 55 53 45   && !defined(USE
1cbc0 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69 36 34  _PREAD64)).  i64
1cbd0 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64   newOffset;.#end
1cbe0 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54  if.  TIMER_START
1cbf0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d  ;.  assert( cnt=
1cc00 3d 28 63 6e 74 26 30 78 31 66 66 66 66 29 20 29  =(cnt&0x1ffff) )
1cc10 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e  ;.  assert( id->
1cc20 68 3e 32 20 29 3b 0a 20 20 63 6e 74 20 26 3d 20  h>2 );.  cnt &= 
1cc30 30 78 31 66 66 66 66 3b 0a 20 20 64 6f 7b 0a 23  0x1ffff;.  do{.#
1cc40 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
1cc50 52 45 41 44 29 0a 20 20 20 20 67 6f 74 20 3d 20  READ).    got = 
1cc60 6f 73 50 72 65 61 64 28 69 64 2d 3e 68 2c 20 70  osPread(id->h, p
1cc70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
1cc80 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
1cc90 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31  OError( got = -1
1cca0 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65   );.#elif define
1ccb0 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
1ccc0 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64     got = osPread
1ccd0 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  64(id->h, pBuf, 
1cce0 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  cnt, offset);.  
1ccf0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1cd00 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23  r( got = -1 );.#
1cd10 65 6c 73 65 0a 20 20 20 20 6e 65 77 4f 66 66 73  else.    newOffs
1cd20 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68  et = lseek(id->h
1cd30 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53  , offset, SEEK_S
1cd40 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  ET);.    Simulat
1cd50 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66  eIOError( newOff
1cd60 73 65 74 2d 2d 20 29 3b 0a 20 20 20 20 69 66 28  set-- );.    if(
1cd70 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73   newOffset!=offs
1cd80 65 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  et ){.      if( 
1cd90 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20  newOffset == -1 
1cda0 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  ){.        store
1cdb0 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46  LastErrno((unixF
1cdc0 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b  ile*)id, errno);
1cdd0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1cde0 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
1cdf0 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29  rrno((unixFile*)
1ce00 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  id, 0);.      }.
1ce10 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
1ce20 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d  .    }.    got =
1ce30 20 6f 73 52 65 61 64 28 69 64 2d 3e 68 2c 20 70   osRead(id->h, p
1ce40 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69  Buf, cnt);.#endi
1ce50 66 0a 20 20 20 20 69 66 28 20 67 6f 74 3d 3d 63  f.    if( got==c
1ce60 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  nt ) break;.    
1ce70 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
1ce80 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49     if( errno==EI
1ce90 4e 54 52 20 29 7b 20 67 6f 74 20 3d 20 31 3b 20  NTR ){ got = 1; 
1cea0 63 6f 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20 20  continue; }.    
1ceb0 20 20 70 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20    prior = 0;.   
1cec0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
1ced0 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c  o((unixFile*)id,
1cee0 20 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20    errno);.      
1cef0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  break;.    }else
1cf00 20 69 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20   if( got>0 ){.  
1cf10 20 20 20 20 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a      cnt -= got;.
1cf20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
1cf30 67 6f 74 3b 0a 20 20 20 20 20 20 70 72 69 6f 72  got;.      prior
1cf40 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70   += got;.      p
1cf50 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 28 67 6f  Buf = (void*)(go
1cf60 74 20 2b 20 28 63 68 61 72 2a 29 70 42 75 66 29  t + (char*)pBuf)
1cf70 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
1cf80 28 20 67 6f 74 3e 30 20 29 3b 0a 20 20 54 49 4d  ( got>0 );.  TIM
1cf90 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43  ER_END;.  OSTRAC
1cfa0 45 28 28 22 52 45 41 44 20 20 20 20 25 2d 33 64  E(("READ    %-3d
1cfb0 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c   %5d %7lld %llu\
1cfc0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1cfd0 69 64 2d 3e 68 2c 20 67 6f 74 2b 70 72 69 6f 72  id->h, got+prior
1cfe0 2c 20 6f 66 66 73 65 74 2d 70 72 69 6f 72 2c 20  , offset-prior, 
1cff0 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b  TIMER_ELAPSED));
1d000 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 2b 70 72  .  return got+pr
1d010 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ior;.}../*.** Re
1d020 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66  ad data from a f
1d030 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65  ile into a buffe
1d040 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
1d050 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62  E_OK if all.** b
1d060 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73  ytes were read s
1d070 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20  uccessfully and 
1d080 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20  SQLITE_IOERR if 
1d090 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
1d0a0 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
1d0b0 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a  c int unixRead(.
1d0c0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1d0d0 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75  id, .  void *pBu
1d0e0 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20  f, .  int amt,. 
1d0f0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
1d100 66 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46  ffset.){.  unixF
1d110 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1d120 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69  ixFile *)id;.  i
1d130 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74  nt got;.  assert
1d140 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74  ( id );.  assert
1d150 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20  ( offset>=0 );. 
1d160 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29   assert( amt>0 )
1d170 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1d180 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69  is a database fi
1d190 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
1d1a0 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  l, master-journa
1d1b0 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66  l or temp.  ** f
1d1c0 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20  ile), the bytes 
1d1d0 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72  in the locking r
1d1e0 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  ange should neve
1d1f0 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69  r be read or wri
1d200 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20  tten. */.#if 0. 
1d210 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
1d220 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20  pUnused==0.     
1d230 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e    || offset>=PEN
1d240 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20  DING_BYTE+512.  
1d250 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61       || offset+a
1d260 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  mt<=PENDING_BYTE
1d270 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23   .  );.#endif..#
1d280 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1d290 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44  AP_SIZE>0.  /* D
1d2a0 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68  eal with as much
1d2b0 20 6f 66 20 74 68 69 73 20 72 65 61 64 20 72 65   of this read re
1d2c0 71 75 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c  quest as possibl
1d2d0 65 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67  e by transfering
1d2e0 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20  .  ** data from 
1d2f0 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  the memory mappi
1d300 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28  ng using memcpy(
1d310 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66  ).  */.  if( off
1d320 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  set<pFile->mmapS
1d330 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f  ize ){.    if( o
1d340 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69  ffset+amt <= pFi
1d350 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
1d360 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75        memcpy(pBu
1d370 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c  f, &((u8 *)(pFil
1d380 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
1d390 6f 66 66 73 65 74 5d 2c 20 61 6d 74 29 3b 0a 20  offset], amt);. 
1d3a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1d3b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
1d3c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70  {.      int nCop
1d3d0 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  y = pFile->mmapS
1d3e0 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  ize - offset;.  
1d3f0 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
1d400 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d   &((u8 *)(pFile-
1d410 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66  >pMapRegion))[of
1d420 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20  fset], nCopy);. 
1d430 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 75       pBuf = &((u
1d440 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d  8 *)pBuf)[nCopy]
1d450 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e  ;.      amt -= n
1d460 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73  Copy;.      offs
1d470 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  et += nCopy;.   
1d480 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1d490 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65   got = seekAndRe
1d4a0 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74  ad(pFile, offset
1d4b0 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20  , pBuf, amt);.  
1d4c0 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a  if( got==amt ){.
1d4d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d4e0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  E_OK;.  }else if
1d4f0 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f  ( got<0 ){.    /
1d500 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20  * lastErrno set 
1d510 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a  by seekAndRead *
1d520 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
1d530 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a  ITE_IOERR_READ;.
1d540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 6f    }else{.    sto
1d550 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
1d560 65 2c 20 30 29 3b 20 20 20 2f 2a 20 6e 6f 74 20  e, 0);   /* not 
1d570 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a  a system error *
1d580 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20  /.    /* Unread 
1d590 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66  parts of the buf
1d5a0 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  fer must be zero
1d5b0 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d  -filled */.    m
1d5c0 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70  emset(&((char*)p
1d5d0 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d  Buf)[got], 0, am
1d5e0 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75  t-got);.    retu
1d5f0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1d600 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a  SHORT_READ;.  }.
1d610 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
1d620 20 74 6f 20 73 65 65 6b 20 74 68 65 20 66 69 6c   to seek the fil
1d630 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70 61 73  e-descriptor pas
1d640 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
1d650 20 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20   argument to.** 
1d660 61 62 73 6f 6c 75 74 65 20 6f 66 66 73 65 74 20  absolute offset 
1d670 69 4f 66 66 2c 20 74 68 65 6e 20 61 74 74 65 6d  iOff, then attem
1d680 70 74 20 74 6f 20 77 72 69 74 65 20 6e 42 75 66  pt to write nBuf
1d690 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66   bytes of data f
1d6a0 72 6f 6d 0a 2a 2a 20 70 42 75 66 20 74 6f 20 69  rom.** pBuf to i
1d6b0 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  t. If an error o
1d6c0 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 2d 31  ccurs, return -1
1d6d0 20 61 6e 64 20 73 65 74 20 2a 70 69 45 72 72 6e   and set *piErrn
1d6e0 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a  o. Otherwise, .*
1d6f0 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61 63 74  * return the act
1d700 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  ual number of by
1d710 74 65 73 20 77 72 69 74 74 65 6e 20 28 77 68 69  tes written (whi
1d720 63 68 20 6d 61 79 20 62 65 20 6c 65 73 73 20 74  ch may be less t
1d730 68 61 6e 0a 2a 2a 20 6e 42 75 66 29 2e 0a 2a 2f  han.** nBuf)..*/
1d740 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
1d750 41 6e 64 57 72 69 74 65 46 64 28 0a 20 20 69 6e  AndWriteFd(.  in
1d760 74 20 66 64 2c 20 20 20 20 20 20 20 20 20 20 20  t fd,           
1d770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d780 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
1d790 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
1d7a0 20 20 69 36 34 20 69 4f 66 66 2c 20 20 20 20 20    i64 iOff,     
1d7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7c0 20 20 2f 2a 20 46 69 6c 65 20 6f 66 66 73 65 74    /* File offset
1d7d0 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e   to begin writin
1d7e0 67 20 61 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  g at */.  const 
1d7f0 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
1d800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70            /* Cop
1d810 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73  y data from this
1d820 20 62 75 66 66 65 72 20 74 6f 20 74 68 65 20 66   buffer to the f
1d830 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 75  ile */.  int nBu
1d840 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
1d850 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1d860 20 6f 66 20 62 75 66 66 65 72 20 70 42 75 66 20   of buffer pBuf 
1d870 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
1d880 74 20 2a 70 69 45 72 72 6e 6f 20 20 20 20 20 20  t *piErrno      
1d890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d8a0 20 4f 55 54 3a 20 45 72 72 6f 72 20 6e 75 6d 62   OUT: Error numb
1d8b0 65 72 20 69 66 20 65 72 72 6f 72 20 6f 63 63 75  er if error occu
1d8c0 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  rs */.){.  int r
1d8d0 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
1d8e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1d8f0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
1d900 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 0a  system call */..
1d910 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3d 3d    assert( nBuf==
1d920 28 6e 42 75 66 26 30 78 31 66 66 66 66 29 20 29  (nBuf&0x1ffff) )
1d930 3b 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e 32  ;.  assert( fd>2
1d940 20 29 3b 0a 20 20 6e 42 75 66 20 26 3d 20 30 78   );.  nBuf &= 0x
1d950 31 66 66 66 66 3b 0a 20 20 54 49 4d 45 52 5f 53  1ffff;.  TIMER_S
1d960 54 41 52 54 3b 0a 0a 23 69 66 20 64 65 66 69 6e  TART;..#if defin
1d970 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20  ed(USE_PREAD).  
1d980 64 6f 7b 20 72 63 20 3d 20 6f 73 50 77 72 69 74  do{ rc = osPwrit
1d990 65 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66  e(fd, pBuf, nBuf
1d9a0 2c 20 69 4f 66 66 29 3b 20 7d 77 68 69 6c 65 28  , iOff); }while(
1d9b0 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
1d9c0 45 49 4e 54 52 20 29 3b 0a 23 65 6c 69 66 20 64  EINTR );.#elif d
1d9d0 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
1d9e0 36 34 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f  64).  do{ rc = o
1d9f0 73 50 77 72 69 74 65 36 34 28 66 64 2c 20 70 42  sPwrite64(fd, pB
1da00 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b  uf, nBuf, iOff);
1da10 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
1da20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23  errno==EINTR);.#
1da30 65 6c 73 65 0a 20 20 64 6f 7b 0a 20 20 20 20 69  else.  do{.    i
1da40 36 34 20 69 53 65 65 6b 20 3d 20 6c 73 65 65 6b  64 iSeek = lseek
1da50 28 66 64 2c 20 69 4f 66 66 2c 20 53 45 45 4b 5f  (fd, iOff, SEEK_
1da60 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  SET);.    Simula
1da70 74 65 49 4f 45 72 72 6f 72 28 20 69 53 65 65 6b  teIOError( iSeek
1da80 2d 2d 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 69  -- );..    if( i
1da90 53 65 65 6b 21 3d 69 4f 66 66 20 29 7b 0a 20 20  Seek!=iOff ){.  
1daa0 20 20 20 20 69 66 28 20 70 69 45 72 72 6e 6f 20      if( piErrno 
1dab0 29 20 2a 70 69 45 72 72 6e 6f 20 3d 20 28 69 53  ) *piErrno = (iS
1dac0 65 65 6b 3d 3d 2d 31 20 3f 20 65 72 72 6e 6f 20  eek==-1 ? errno 
1dad0 3a 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  : 0);.      retu
1dae0 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
1daf0 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64   rc = osWrite(fd
1db00 2c 20 70 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20  , pBuf, nBuf);. 
1db10 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
1db20 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
1db30 0a 23 65 6e 64 69 66 0a 0a 20 20 54 49 4d 45 52  .#endif..  TIMER
1db40 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28  _END;.  OSTRACE(
1db50 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25  ("WRITE   %-3d %
1db60 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
1db70 2c 20 66 64 2c 20 72 63 2c 20 69 4f 66 66 2c 20  , fd, rc, iOff, 
1db80 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b  TIMER_ELAPSED));
1db90 0a 0a 20 20 69 66 28 20 72 63 3c 30 20 26 26 20  ..  if( rc<0 && 
1dba0 70 69 45 72 72 6e 6f 20 29 20 2a 70 69 45 72 72  piErrno ) *piErr
1dbb0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 72 65  no = errno;.  re
1dbc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
1dbd0 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f  ** Seek to the o
1dbe0 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66  ffset in id->off
1dbf0 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e  set then read cn
1dc00 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75  t bytes into pBu
1dc10 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  f..** Return the
1dc20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1dc30 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20   actually read. 
1dc40 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66 73   Update the offs
1dc50 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  et..**.** To avo
1dc60 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20  id stomping the 
1dc70 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61  errno value on a
1dc80 20 66 61 69 6c 65 64 20 77 72 69 74 65 20 74 68   failed write th
1dc90 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75  e lastErrno valu
1dca0 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f  e.** is set befo
1dcb0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
1dcc0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
1dcd0 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69 6c  AndWrite(unixFil
1dce0 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65  e *id, i64 offse
1dcf0 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  t, const void *p
1dd00 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
1dd10 20 72 65 74 75 72 6e 20 73 65 65 6b 41 6e 64 57   return seekAndW
1dd20 72 69 74 65 46 64 28 69 64 2d 3e 68 2c 20 6f 66  riteFd(id->h, of
1dd30 66 73 65 74 2c 20 70 42 75 66 2c 20 63 6e 74 2c  fset, pBuf, cnt,
1dd40 20 26 69 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 29   &id->lastErrno)
1dd50 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
1dd60 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  e data from a bu
1dd70 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65  ffer into a file
1dd80 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1dd90 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
1dda0 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
1ddb0 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61  error code on fa
1ddc0 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
1ddd0 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28 0a   int unixWrite(.
1dde0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1ddf0 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69  id, .  const voi
1de00 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20  d *pBuf, .  int 
1de10 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69  amt,.  sqlite3_i
1de20 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a  nt64 offset .){.
1de30 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1de40 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
1de50 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20 3d  d;.  int wrote =
1de60 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   0;.  assert( id
1de70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d   );.  assert( am
1de80 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  t>0 );..  /* If 
1de90 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61  this is a databa
1dea0 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a  se file (not a j
1deb0 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a  ournal, master-j
1dec0 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20  ournal or temp. 
1ded0 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62   ** file), the b
1dee0 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b  ytes in the lock
1def0 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64  ing range should
1df00 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f   never be read o
1df10 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69  r written. */.#i
1df20 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46  f 0.  assert( pF
1df30 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a  ile->pUnused==0.
1df40 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
1df50 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35  >=PENDING_BYTE+5
1df60 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  12.       || off
1df70 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47  set+amt<=PENDING
1df80 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64  _BYTE .  );.#end
1df90 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
1dfa0 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20  E_DEBUG.  /* If 
1dfb0 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e  we are doing a n
1dfc0 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61  ormal write to a
1dfd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
1dfe0 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20  as opposed to.  
1dff0 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a  ** doing a hot-j
1e000 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
1e010 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f  or a write to so
1e020 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68  me file other th
1e030 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c  an a.  ** normal
1e040 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20   database file) 
1e050 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20  then record the 
1e060 66 61 63 74 20 74 68 61 74 20 74 68 65 20 64 61  fact that the da
1e070 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20  tabase.  ** has 
1e080 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
1e090 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1e0a0 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64  nter is modified
1e0b0 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20  , record that.  
1e0c0 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a  ** fact too..  *
1e0d0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69  /.  if( pFile->i
1e0e0 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a  nNormalWrite ){.
1e0f0 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64      pFile->dbUpd
1e100 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65  ate = 1;  /* The
1e110 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
1e120 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20  en modified */. 
1e130 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32     if( offset<=2
1e140 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e  4 && offset+amt>
1e150 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  =27 ){.      int
1e160 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20   rc;.      char 
1e170 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20  oldCntr[4];.    
1e180 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1e190 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
1e1a0 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65    rc = seekAndRe
1e1b0 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c  ad(pFile, 24, ol
1e1c0 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20  dCntr, 4);.     
1e1d0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1e1e0 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
1e1f0 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65   if( rc!=4 || me
1e200 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28  mcmp(oldCntr, &(
1e210 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d  (char*)pBuf)[24-
1e220 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29  offset], 4)!=0 )
1e230 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
1e240 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
1e250 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e   1;  /* The tran
1e260 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
1e270 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  has changed */. 
1e280 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1e290 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
1e2a0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1e2b0 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69  E>0.  /* Deal wi
1e2c0 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  th as much of th
1e2d0 69 73 20 77 72 69 74 65 20 72 65 71 75 65 73 74  is write request
1e2e0 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20   as possible by 
1e2f0 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a  transfering.  **
1e300 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d   data from the m
1e310 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73  emory mapping us
1e320 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a  ing memcpy().  *
1e330 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  /.  if( offset<p
1e340 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
1e350 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74  {.    if( offset
1e360 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d  +amt <= pFile->m
1e370 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  mapSize ){.     
1e380 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29   memcpy(&((u8 *)
1e390 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
1e3a0 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42  on))[offset], pB
1e3b0 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20  uf, amt);.      
1e3c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e3d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e3e0 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70     int nCopy = p
1e3f0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d  File->mmapSize -
1e400 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d   offset;.      m
1e410 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70  emcpy(&((u8 *)(p
1e420 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1e430 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ))[offset], pBuf
1e440 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , nCopy);.      
1e450 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70  pBuf = &((u8 *)p
1e460 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20  Buf)[nCopy];.   
1e470 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b     amt -= nCopy;
1e480 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
1e490 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20   nCopy;.    }.  
1e4a0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c  }.#endif..  whil
1e4b0 65 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f  e( amt>0 && (wro
1e4c0 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74  te = seekAndWrit
1e4d0 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c  e(pFile, offset,
1e4e0 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29   pBuf, amt))>0 )
1e4f0 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f  {.    amt -= wro
1e500 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b  te;.    offset +
1e510 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75  = wrote;.    pBu
1e520 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75  f = &((char*)pBu
1e530 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20  f)[wrote];.  }. 
1e540 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1e550 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61  (( wrote=(-1), a
1e560 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c  mt=1 ));.  Simul
1e570 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
1e580 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d  (( wrote=0, amt=
1e590 31 20 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74  1 ));..  if( amt
1e5a0 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72  >0 ){.    if( wr
1e5b0 6f 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e  ote<0 && pFile->
1e5c0 6c 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53 50  lastErrno!=ENOSP
1e5d0 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61  C ){.      /* la
1e5e0 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73  stErrno set by s
1e5f0 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20  eekAndWrite */. 
1e600 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1e610 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
1e620 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e630 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
1e640 70 46 69 6c 65 2c 20 30 29 3b 20 2f 2a 20 6e 6f  pFile, 0); /* no
1e650 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72  t a system error
1e660 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1e670 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
1e680 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
1e690 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1e6a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1e6b0 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74  ST./*.** Count t
1e6c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c  he number of ful
1e6d0 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61  lsyncs and norma
1e6e0 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69  l syncs.  This i
1e6f0 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a  s used to test.*
1e700 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64  * that syncs and
1e710 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f   fullsyncs are o
1e720 63 63 75 72 72 69 6e 67 20 61 74 20 74 68 65 20  ccurring at the 
1e730 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a  right times..*/.
1e740 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  int sqlite3_sync
1e750 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20  _count = 0;.int 
1e760 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
1e770 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
1e780 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20  if../*.** We do 
1e790 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74 65 6d  not trust system
1e7a0 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20 77  s to provide a w
1e7b0 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79 6e 63  orking fdatasync
1e7c0 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a  ().  Some do..**
1e7d0 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20 20   Others do no.  
1e7e0 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65 20 77  To be safe, we w
1e7f0 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68 20 74  ill stick with t
1e800 68 65 20 28 73 6c 69 67 68 74 6c 79 20 73 6c 6f  he (slightly slo
1e810 77 65 72 29 0a 2a 2a 20 66 73 79 6e 63 28 29 2e  wer).** fsync().
1e820 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61   If you know tha
1e830 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64 6f  t your system do
1e840 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74 61  es support fdata
1e850 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c 79  sync() correctly
1e860 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79  ,.** then simply
1e870 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44   compile with -D
1e880 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61 73  fdatasync=fdatas
1e890 79 6e 63 20 6f 72 20 2d 44 48 41 56 45 5f 46 44  ync or -DHAVE_FD
1e8a0 41 54 41 53 59 4e 43 0a 2a 2f 0a 23 69 66 20 21  ATASYNC.*/.#if !
1e8b0 64 65 66 69 6e 65 64 28 66 64 61 74 61 73 79 6e  defined(fdatasyn
1e8c0 63 29 20 26 26 20 21 48 41 56 45 5f 46 44 41 54  c) && !HAVE_FDAT
1e8d0 41 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 66  ASYNC.# define f
1e8e0 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23  datasync fsync.#
1e8f0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  endif../*.** Def
1e900 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
1e910 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70  NC to 0 or 1 dep
1e920 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
1e930 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20  r or not.** the 
1e940 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72  F_FULLFSYNC macr
1e950 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46  o is defined.  F
1e960 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75  _FULLFSYNC is cu
1e970 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20  rrently.** only 
1e980 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
1e990 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61 74   OS X.  But that
1e9a0 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a   could change..*
1e9b0 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46  /.#ifdef F_FULLF
1e9c0 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41  SYNC.# define HA
1e9d0 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23  VE_FULLFSYNC 1.#
1e9e0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41  else.# define HA
1e9f0 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23  VE_FULLFSYNC 0.#
1ea00 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
1ea10 4c 49 54 45 5f 55 53 45 5f 52 45 51 55 45 53 54  LITE_USE_REQUEST
1ea20 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 69 6d 70 6f  _FULLFSYNC.#impo
1ea30 72 74 20 3c 6e 6f 74 69 66 79 2e 68 3e 0a 23 69  rt <notify.h>.#i
1ea40 6d 70 6f 72 74 20 3c 6c 69 62 6b 65 72 6e 2f 4f  mport <libkern/O
1ea50 53 41 74 6f 6d 69 63 2e 68 3e 0a 73 74 61 74 69  SAtomic.h>.stati
1ea60 63 20 4f 53 53 70 69 6e 4c 6f 63 6b 20 6e 6f 74  c OSSpinLock not
1ea70 69 66 79 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 23 64  ify_lock = 0;.#d
1ea80 65 66 69 6e 65 20 52 45 51 55 45 53 54 5f 46 55  efine REQUEST_FU
1ea90 4c 4c 53 59 4e 43 5f 4e 4f 54 49 46 49 43 41 54  LLSYNC_NOTIFICAT
1eaa0 49 4f 4e 20 20 20 20 22 63 6f 6d 2e 61 70 70 6c  ION    "com.appl
1eab0 65 2e 72 65 71 73 79 6e 63 22 0a 23 65 6e 64 69  e.reqsync".#endi
1eac0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79  f../*.** The fsy
1ead0 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  nc() system call
1eae0 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61   does not work a
1eaf0 73 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20  s advertised on 
1eb00 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73  many.** unix sys
1eb10 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  tems.  The follo
1eb20 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69  wing procedure i
1eb30 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  s an attempt to 
1eb40 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20  make.** it work 
1eb50 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  better..**.** Th
1eb60 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
1eb70 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20   macro disables 
1eb80 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54  all fsync()s.  T
1eb90 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a  his is useful.**
1eba0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65   for testing whe
1ebb0 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e  n we want to run
1ebc0 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 73   through the tes
1ebd0 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e  t suite quickly.
1ebe0 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f  .** You are stro
1ebf0 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f  ngly advised *no
1ec00 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74  t* to deploy wit
1ec10 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  h SQLITE_NO_SYNC
1ec20 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77  .** enabled, how
1ec30 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68  ever, since with
1ec40 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
1ec50 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63  enabled, an OS c
1ec60 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72  rash.** or power
1ec70 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69   failure will li
1ec80 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65  kely corrupt the
1ec90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1eca0 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74  **.** SQLite set
1ecb0 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66  s the dataOnly f
1ecc0 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a 65 20  lag if the size 
1ecd0 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  of the file is u
1ece0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65  nchanged..** The
1ecf0 20 69 64 65 61 20 62 65 68 69 6e 64 20 64 61 74   idea behind dat
1ed00 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74  aOnly is that it
1ed10 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69   should only wri
1ed20 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  te the file cont
1ed30 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20  ent.** to disk, 
1ed40 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20  not the inode.  
1ed50 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61  We only set data
1ed60 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65  Only if the file
1ed70 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63   size is .** unc
1ed80 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65  hanged since the
1ed90 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61   file size is pa
1eda0 72 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e  rt of the inode.
1edb0 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54    However, .** T
1edc0 65 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73  ed Ts'o tells us
1edd0 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28   that fdatasync(
1ede0 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74  ) will also writ
1edf0 65 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74  e the inode if t
1ee00 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20  he.** file size 
1ee10 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68  has changed.  Th
1ee20 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66  e only real diff
1ee30 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66  erence between f
1ee40 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e  datasync().** an
1ee50 64 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74  d fsync(), Ted t
1ee60 65 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74  ells us, is that
1ee70 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c   fdatasync() wil
1ee80 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a  l not flush the.
1ee90 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20  ** inode if the 
1eea0 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f  mtime or owner o
1eeb0 72 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74  r other inode at
1eec0 74 72 69 62 75 74 65 73 20 68 61 76 65 20 63 68  tributes have ch
1eed0 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c  anged..** We onl
1eee0 79 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  y care about the
1eef0 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20   file size, not 
1ef00 74 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61  the other file a
1ef10 74 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a  ttributes, so.**
1ef20 20 61 73 20 66 61 72 20 61 73 20 53 51 4c 69 74   as far as SQLit
1ef30 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20  e is concerned, 
1ef40 61 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20 69  an fdatasync() i
1ef50 73 20 61 6c 77 61 79 73 20 61 64 65 71 75 61 74  s always adequat
1ef60 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77  e..** So, we alw
1ef70 61 79 73 20 75 73 65 20 66 64 61 74 61 73 79 6e  ays use fdatasyn
1ef80 63 28 29 20 69 66 20 69 74 20 69 73 20 61 76 61  c() if it is ava
1ef90 69 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65  ilable, regardle
1efa0 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c  ss of.** the val
1efb0 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e  ue of the dataOn
1efc0 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74  ly flag..*/.stat
1efd0 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e  ic int full_fsyn
1efe0 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75  c(int fd, int fu
1eff0 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61  llSync, int data
1f000 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Only){.  int rc;
1f010 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
1f020 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66  wing "ifdef/elif
1f030 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61  /else/" block ha
1f040 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 75 63  s the same struc
1f050 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65  ture as.  ** the
1f060 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69   one below. It i
1f070 73 20 72 65 70 6c 69 63 61 74 65 64 20 68 65 72  s replicated her
1f080 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69  e solely to avoi
1f090 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20  d cluttering .  
1f0a0 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20 63  ** up the real c
1f0b0 6f 64 65 20 77 69 74 68 20 74 68 65 20 55 4e 55  ode with the UNU
1f0c0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20  SED_PARAMETER() 
1f0d0 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66  macros..  */.#if
1f0e0 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
1f0f0 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  NC.  UNUSED_PARA
1f100 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55  METER(fd);.  UNU
1f110 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75  SED_PARAMETER(fu
1f120 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45  llSync);.  UNUSE
1f130 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61  D_PARAMETER(data
1f140 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56  Only);.#elif HAV
1f150 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e  E_FULLFSYNC.  UN
1f160 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
1f170 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a  ataOnly);.#else.
1f180 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1f190 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  ER(fullSync);.  
1f1a0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1f1b0 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64  (dataOnly);.#end
1f1c0 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  if..  /* Record 
1f1d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  the number of ti
1f1e0 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61  mes that we do a
1f1f0 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20   normal fsync() 
1f200 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59  and .  ** FULLSY
1f210 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  NC.  This is use
1f220 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  d during testing
1f230 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
1f240 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20  this procedure. 
1f250 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20   ** gets called 
1f260 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
1f270 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f   arguments..  */
1f280 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1f290 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  EST.  if( fullSy
1f2a0 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c  nc ) sqlite3_ful
1f2b0 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20  lsync_count++;. 
1f2c0 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
1f2d0 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
1f2e0 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c   /* If we compil
1f2f0 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
1f300 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c  TE_NO_SYNC flag,
1f310 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73   then syncing is
1f320 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20   a.  ** no-op.  
1f330 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1f340 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20  _NO_SYNC.  rc = 
1f350 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66  SQLITE_OK;.#elif
1f360 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a   HAVE_FULLFSYNC.
1f370 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29    if( fullSync )
1f380 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
1f390 55 53 45 5f 52 45 51 55 45 53 54 5f 46 55 4c 4c  USE_REQUEST_FULL
1f3a0 46 53 59 4e 43 0a 20 20 20 20 72 63 20 3d 20 6f  FSYNC.    rc = o
1f3b0 73 46 73 79 6e 63 28 66 64 29 3b 0a 20 20 20 20  sFsync(fd);.    
1f3c0 69 66 20 28 21 72 63 29 20 7b 0a 20 20 20 20 20  if (!rc) {.     
1f3d0 20 4f 53 53 70 69 6e 4c 6f 63 6b 4c 6f 63 6b 28   OSSpinLockLock(
1f3e0 26 6e 6f 74 69 66 79 5f 6c 6f 63 6b 29 3b 0a 20  &notify_lock);. 
1f3f0 20 20 20 20 20 72 63 20 3d 20 6e 6f 74 69 66 79       rc = notify
1f400 5f 70 6f 73 74 28 52 45 51 55 45 53 54 5f 46 55  _post(REQUEST_FU
1f410 4c 4c 53 59 4e 43 5f 4e 4f 54 49 46 49 43 41 54  LLSYNC_NOTIFICAT
1f420 49 4f 4e 29 3b 0a 20 20 20 20 20 20 4f 53 53 70  ION);.      OSSp
1f430 69 6e 4c 6f 63 6b 55 6e 6c 6f 63 6b 28 26 6e 6f  inLockUnlock(&no
1f440 74 69 66 79 5f 6c 6f 63 6b 29 3b 0a 20 20 20 20  tify_lock);.    
1f450 7d 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d  }.#else.    rc =
1f460 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 46   osFcntl(fd, F_F
1f470 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 23 65  ULLFSYNC, 0);.#e
1f480 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
1f490 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20    rc = 1;.  }.  
1f4a0 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 46 53  /* If the FULLFS
1f4b0 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c  YNC failed, fall
1f4c0 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d 70 74   back to attempt
1f4d0 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a  ing an fsync()..
1f4e0 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27    ** It shouldn'
1f4f0 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 66 6f  t be possible fo
1f500 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66  r fullfsync to f
1f510 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ail on the local
1f520 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79 73 74   .  ** file syst
1f530 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20  em (on OSX), so 
1f540 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61 74 65  failure indicate
1f550 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59 4e 43  s that FULLFSYNC
1f560 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75 70 70  .  ** isn't supp
1f570 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73 20 66  orted for this f
1f580 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20  ile system. So, 
1f590 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79 6e 63  attempt an fsync
1f5a0 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72 20   .  ** and (for 
1f5b0 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68 65 20  now) ignore the 
1f5c0 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20 73 75  overhead of a su
1f5d0 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20  perfluous fcntl 
1f5e0 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74 27  call.  .  ** It'
1f5f0 64 20 62 65 20 62 65 74 74 65 72 20 74 6f 20 64  d be better to d
1f600 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e 63 20  etect fullfsync 
1f610 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64  support once and
1f620 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68 65   avoid .  ** the
1f630 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72   fcntl call ever
1f640 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73 20 63  y time sync is c
1f650 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  alled..  */.  if
1f660 28 20 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e  ( rc ) rc = fsyn
1f670 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64 65  c(fd);..#elif de
1f680 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1f690 0a 20 20 2f 2a 20 66 64 61 74 61 73 79 6e 63 28  .  /* fdatasync(
1f6a0 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e 27  ) on HFS+ doesn'
1f6b0 74 20 79 65 74 20 66 6c 75 73 68 20 74 68 65 20  t yet flush the 
1f6c0 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69 74 20  file size if it 
1f6d0 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63 74 6c  changed correctl
1f6e0 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72 65 6e  y.  ** so curren
1f6f0 74 6c 79 20 77 65 20 64 65 66 61 75 6c 74 20 74  tly we default t
1f700 6f 20 74 68 65 20 6d 61 63 72 6f 20 74 68 61 74  o the macro that
1f710 20 72 65 64 65 66 69 6e 65 73 20 66 64 61 74 61   redefines fdata
1f720 73 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20 20  sync to fsync.  
1f730 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e 63 28  */.  rc = fsync(
1f740 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72 63  fd);.#else .  rc
1f750 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64 29   = fdatasync(fd)
1f760 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ;.#if OS_VXWORKS
1f770 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31 20 26 26  .  if( rc==-1 &&
1f780 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20   errno==ENOTSUP 
1f790 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e  ){.    rc = fsyn
1f7a0 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  c(fd);.  }.#endi
1f7b0 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
1f7c0 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64  */.#endif /* ifd
1f7d0 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
1f7e0 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c  C elif HAVE_FULL
1f7f0 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28 20  FSYNC */..  if( 
1f800 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 72 63  OS_VXWORKS && rc
1f810 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72 63 20  != -1 ){.    rc 
1f820 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1f830 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n rc;.}../*.** O
1f840 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72  pen a file descr
1f850 69 70 74 6f 72 20 74 6f 20 74 68 65 20 64 69 72  iptor to the dir
1f860 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e  ectory containin
1f870 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65  g file zFilename
1f880 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  ..** If successf
1f890 75 6c 2c 20 2a 70 46 64 20 69 73 20 73 65 74 20  ul, *pFd is set 
1f8a0 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69  to the opened fi
1f8b0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e  le descriptor an
1f8c0 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  d.** SQLITE_OK i
1f8d0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
1f8e0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
1f8f0 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f  either SQLITE_NO
1f900 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  MEM.** or SQLITE
1f910 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72 65 74  _CANTOPEN is ret
1f920 75 72 6e 65 64 20 61 6e 64 20 2a 70 46 64 20 69  urned and *pFd i
1f930 73 20 73 65 74 20 74 6f 20 61 6e 20 75 6e 64 65  s set to an unde
1f940 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a  fined.** value..
1f950 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 72 65 63 74  **.** The direct
1f960 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ory file descrip
1f970 74 6f 72 20 69 73 20 75 73 65 64 20 66 6f 72 20  tor is used for 
1f980 6f 6e 6c 79 20 6f 6e 65 20 74 68 69 6e 67 20 2d  only one thing -
1f990 20 74 6f 0a 2a 2a 20 66 73 79 6e 63 28 29 20 61   to.** fsync() a
1f9a0 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 6d 61   directory to ma
1f9b0 6b 65 20 73 75 72 65 20 66 69 6c 65 20 63 72 65  ke sure file cre
1f9c0 61 74 69 6f 6e 20 61 6e 64 20 64 65 6c 65 74 69  ation and deleti
1f9d0 6f 6e 20 65 76 65 6e 74 73 0a 2a 2a 20 61 72 65  on events.** are
1f9e0 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b   flushed to disk
1f9f0 2e 20 20 53 75 63 68 20 66 73 79 6e 63 73 20 61  .  Such fsyncs a
1fa00 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e  re not needed on
1fa10 20 6e 65 77 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61   newer.** journa
1fa20 6c 69 6e 67 20 66 69 6c 65 73 79 73 74 65 6d 73  ling filesystems
1fa30 2c 20 62 75 74 20 61 72 65 20 72 65 71 75 69 72  , but are requir
1fa40 65 64 20 6f 6e 20 6f 6c 64 65 72 20 66 69 6c 65  ed on older file
1fa50 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54  systems..**.** T
1fa60 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
1fa70 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 75 73  be overridden us
1fa80 69 6e 67 20 74 68 65 20 78 53 65 74 53 79 73 43  ing the xSetSysC
1fa90 61 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  all interface..*
1faa0 2a 20 54 68 65 20 61 62 69 6c 69 74 79 20 74 6f  * The ability to
1fab0 20 6f 76 65 72 72 69 64 65 20 74 68 69 73 20 72   override this r
1fac0 6f 75 74 69 6e 65 20 77 61 73 20 61 64 64 65 64  outine was added
1fad0 20 69 6e 20 73 75 70 70 6f 72 74 20 6f 66 20 74   in support of t
1fae0 68 65 0a 2a 2a 20 63 68 72 6f 6d 69 75 6d 20 73  he.** chromium s
1faf0 61 6e 64 62 6f 78 2e 20 20 4f 70 65 6e 69 6e 67  andbox.  Opening
1fb00 20 61 20 64 69 72 65 63 74 6f 72 79 20 69 73 20   a directory is 
1fb10 61 20 73 65 63 75 72 69 74 79 20 72 69 73 6b 20  a security risk 
1fb20 28 77 65 20 61 72 65 0a 2a 2a 20 74 6f 6c 64 29  (we are.** told)
1fb30 20 73 6f 20 6d 61 6b 69 6e 67 20 69 74 20 6f 76   so making it ov
1fb40 65 72 72 69 64 65 61 62 6c 65 20 61 6c 6c 6f 77  errideable allow
1fb50 73 20 74 68 65 20 63 68 72 6f 6d 69 75 6d 20 73  s the chromium s
1fb60 61 6e 64 62 6f 78 20 74 6f 0a 2a 2a 20 72 65 70  andbox to.** rep
1fb70 6c 61 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e  lace this routin
1fb80 65 20 77 69 74 68 20 61 20 68 61 72 6d 6c 65 73  e with a harmles
1fb90 73 20 6e 6f 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b  s no-op.  To mak
1fba0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  e this routine.*
1fbb0 2a 20 61 20 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61  * a no-op, repla
1fbc0 63 65 20 69 74 20 77 69 74 68 20 61 20 73 74 75  ce it with a stu
1fbd0 62 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 53  b that returns S
1fbe0 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61  QLITE_OK but lea
1fbf0 76 65 73 0a 2a 2a 20 2a 70 46 64 20 73 65 74 20  ves.** *pFd set 
1fc00 74 6f 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  to a negative nu
1fc10 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  mber..**.** If S
1fc20 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1fc30 72 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72  rned, the caller
1fc40 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
1fc50 66 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74  for closing.** t
1fc60 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
1fc70 6f 72 20 2a 70 46 64 20 75 73 69 6e 67 20 63 6c  or *pFd using cl
1fc80 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ose()..*/.static
1fc90 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f   int openDirecto
1fca0 72 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ry(const char *z
1fcb0 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70  Filename, int *p
1fcc0 46 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20  Fd){.  int ii;. 
1fcd0 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20   int fd = -1;.  
1fce0 63 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41  char zDirname[MA
1fcf0 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a  X_PATHNAME+1];..
1fd00 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1fd10 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c  tf(MAX_PATHNAME,
1fd20 20 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c   zDirname, "%s",
1fd30 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66   zFilename);.  f
1fd40 6f 72 28 69 69 3d 28 69 6e 74 29 73 74 72 6c 65  or(ii=(int)strle
1fd50 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e  n(zDirname); ii>
1fd60 31 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69  1 && zDirname[ii
1fd70 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20  ]!='/'; ii--);. 
1fd80 20 69 66 28 20 69 69 3e 30 20 29 7b 0a 20 20 20   if( ii>0 ){.   
1fd90 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20   zDirname[ii] = 
1fda0 27 5c 30 27 3b 0a 20 20 20 20 66 64 20 3d 20 72  '\0';.    fd = r
1fdb0 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44 69 72 6e  obust_open(zDirn
1fdc0 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f  ame, O_RDONLY|O_
1fdd0 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20 20  BINARY, 0);.    
1fde0 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20  if( fd>=0 ){.   
1fdf0 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
1fe00 4e 44 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c  NDIR %-3d %s\n",
1fe10 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b   fd, zDirname));
1fe20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46  .    }.  }.  *pF
1fe30 64 20 3d 20 66 64 3b 0a 20 20 72 65 74 75 72 6e  d = fd;.  return
1fe40 20 28 66 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f   (fd>=0?SQLITE_O
1fe50 4b 3a 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  K:unixLogError(S
1fe60 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
1fe70 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 44 69  KPT, "open", zDi
1fe80 72 6e 61 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rname));.}../*.*
1fe90 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
1fea0 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74  writes to a part
1feb0 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20  icular file are 
1fec0 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73  committed to dis
1fed0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61  k..**.** If data
1fee0 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74  Only==0 then bot
1fef0 68 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c  h the file itsel
1ff00 66 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61  f and its metada
1ff10 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65  ta (file.** size
1ff20 2c 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65  , access time, e
1ff30 74 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20  tc) are synced. 
1ff40 20 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20   If dataOnly!=0 
1ff50 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a  then only the.**
1ff60 20 66 69 6c 65 20 64 61 74 61 20 69 73 20 73 79   file data is sy
1ff70 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65  nced..**.** Unde
1ff80 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b  r Unix, also mak
1ff90 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
1ffa0 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20  directory entry 
1ffb0 66 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20  for the file.** 
1ffc0 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64  has been created
1ffd0 20 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68   by fsync-ing th
1ffe0 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74  e directory that
1fff0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69   contains the fi
20000 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20  le..** If we do 
20010 6e 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20  not do this and 
20020 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70  we encounter a p
20030 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
20040 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65  e directory.** e
20050 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75  ntry for the jou
20060 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65  rnal might not e
20070 78 69 73 74 20 61 66 74 65 72 20 77 65 20 72 65  xist after we re
20080 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a  boot.  The next.
20090 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63  ** SQLite to acc
200a0 65 73 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c  ess the file wil
200b0 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20  l not know that 
200c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  the journal exis
200d0 74 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74  ts (because.** t
200e0 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74  he directory ent
200f0 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  ry for the journ
20100 61 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72 65  al was never cre
20110 61 74 65 64 29 20 61 6e 64 20 74 68 65 20 74 72  ated) and the tr
20120 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c  ansaction.** wil
20130 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20  l not roll back 
20140 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69  - possibly leadi
20150 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ng to database c
20160 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
20170 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e  atic int unixSyn
20180 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  c(sqlite3_file *
20190 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  id, int flags){.
201a0 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78    int rc;.  unix
201b0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
201c0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
201d0 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d  int isDataOnly =
201e0 20 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53   (flags&SQLITE_S
201f0 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20  YNC_DATAONLY);. 
20200 20 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20   int isFullsync 
20210 3d 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  = (flags&0x0F)==
20220 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
20230 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
20240 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  at one of SQLITE
20250 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20  _SYNC_NORMAL or 
20260 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20  FULL was passed 
20270 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61  */.  assert((fla
20280 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
20290 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20  _SYNC_NORMAL.   
202a0 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30     || (flags&0x0
202b0 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
202c0 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  FULL.  );..  /* 
202d0 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74  Unix cannot, but
202e0 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61   some systems ma
202f0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
20300 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20  FULL from here. 
20310 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69  This.  ** line i
20320 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64  s to test that d
20330 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74  oing so does not
20340 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c   cause any probl
20350 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ems..  */.  Simu
20360 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
20370 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
20380 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65  _FULL );..  asse
20390 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
203a0 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 20 20  STRACE(("SYNC   
203b0 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d   %-3d\n", pFile-
203c0 3e 68 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c  >h));.  rc = ful
203d0 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68  l_fsync(pFile->h
203e0 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73  , isFullsync, is
203f0 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d  DataOnly);.  Sim
20400 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
20410 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29  =1 );.  if( rc )
20420 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45  {.    storeLastE
20430 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
20440 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75  o);.    return u
20450 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
20460 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20  TE_IOERR_FSYNC, 
20470 22 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46  "full_fsync", pF
20480 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
20490 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73 79 6e  ..  /* Also fsyn
204a0 63 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  c the directory 
204b0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66  containing the f
204c0 69 6c 65 20 69 66 20 74 68 65 20 44 49 52 53 59  ile if the DIRSY
204d0 4e 43 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20  NC flag.  ** is 
204e0 73 65 74 2e 20 20 54 68 69 73 20 69 73 20 61 20  set.  This is a 
204f0 6f 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72 72 65  one-time occurre
20500 6e 63 65 2e 20 20 4d 61 6e 79 20 73 79 73 74 65  nce.  Many syste
20510 6d 73 20 28 65 78 61 6d 70 6c 65 73 3a 20 41 49  ms (examples: AI
20520 58 29 0a 20 20 2a 2a 20 61 72 65 20 75 6e 61 62  X).  ** are unab
20530 6c 65 20 74 6f 20 66 73 79 6e 63 20 61 20 64 69  le to fsync a di
20540 72 65 63 74 6f 72 79 2c 20 73 6f 20 69 67 6e 6f  rectory, so igno
20550 72 65 20 65 72 72 6f 72 73 20 6f 6e 20 74 68 65  re errors on the
20560 20 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69   fsync..  */.  i
20570 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  f( pFile->ctrlFl
20580 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44  ags & UNIXFILE_D
20590 49 52 53 59 4e 43 20 29 7b 0a 20 20 20 20 69 6e  IRSYNC ){.    in
205a0 74 20 64 69 72 66 64 3b 0a 20 20 20 20 4f 53 54  t dirfd;.    OST
205b0 52 41 43 45 28 28 22 44 49 52 53 59 4e 43 20 25  RACE(("DIRSYNC %
205c0 73 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e  s (have_fullfsyn
205d0 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64  c=%d fullsync=%d
205e0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  )\n", pFile->zPa
205f0 74 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  th,.            
20600 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20  HAVE_FULLFSYNC, 
20610 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 20 20  isFullsync));.  
20620 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72    rc = osOpenDir
20630 65 63 74 6f 72 79 28 70 46 69 6c 65 2d 3e 7a 50  ectory(pFile->zP
20640 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20  ath, &dirfd);.  
20650 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20660 5f 4f 4b 20 26 26 20 64 69 72 66 64 3e 3d 30 20  _OK && dirfd>=0 
20670 29 7b 0a 20 20 20 20 20 20 66 75 6c 6c 5f 66 73  ){.      full_fs
20680 79 6e 63 28 64 69 72 66 64 2c 20 30 2c 20 30 29  ync(dirfd, 0, 0)
20690 3b 0a 23 69 66 20 4f 53 43 4c 4f 53 45 5f 43 48  ;.#if OSCLOSE_CH
206a0 45 43 4b 5f 43 4c 4f 53 45 5f 49 4f 45 52 52 0a  ECK_CLOSE_IOERR.
206b0 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 28        if( close(
206c0 70 46 69 6c 65 2d 3e 64 69 72 66 64 29 20 29 7b  pFile->dirfd) ){
206d0 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
206e0 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65  stErrno(pFile, e
206f0 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72  rrno);.        r
20700 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
20710 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20  _DIR_CLOSE;.    
20720 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20    }.#else.      
20730 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
20740 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e  le, dirfd, __LIN
20750 45 5f 5f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  E__);.#endif.   
20760 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
20770 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29  QLITE_CANTOPEN )
20780 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
20790 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
207a0 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
207b0 67 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f  gs &= ~UNIXFILE_
207c0 44 49 52 53 59 4e 43 3b 0a 0a 20 20 7d 0a 20 20  DIRSYNC;..  }.  
207d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
207e0 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20  .** Truncate an 
207f0 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73  open file to a s
20800 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f  pecified size.*/
20810 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
20820 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33  Truncate(sqlite3
20830 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e  _file *id, i64 n
20840 42 79 74 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c  Byte){.  unixFil
20850 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
20860 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74  File *)id;.  int
20870 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
20880 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61  File );.  Simula
20890 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
208a0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  n SQLITE_IOERR_T
208b0 52 55 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a  RUNCATE );..  /*
208c0 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73   If the user has
208d0 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68   configured a ch
208e0 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69  unk-size for thi
208f0 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65  s file, truncate
20900 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73   the.  ** file s
20910 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73  o that it consis
20920 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72  ts of an integer
20930 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b   number of chunk
20940 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a  s (i.e. the.  **
20950 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a   actual file siz
20960 65 20 61 66 74 65 72 20 74 68 65 20 6f 70 65 72  e after the oper
20970 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72  ation may be lar
20980 67 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ger than the req
20990 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65  uested.  ** size
209a0 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  )..  */.  if( pF
209b0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29  ile->szChunk>0 )
209c0 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28  {.    nByte = ((
209d0 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73  nByte + pFile->s
209e0 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c  zChunk - 1)/pFil
209f0 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46  e->szChunk) * pF
20a00 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20  ile->szChunk;.  
20a10 7d 0a 0a 20 20 72 63 20 3d 20 72 6f 62 75 73 74  }..  rc = robust
20a20 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65  _ftruncate(pFile
20a30 2d 3e 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  ->h, nByte);.  i
20a40 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f  f( rc ){.    sto
20a50 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
20a60 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72  e, errno);.    r
20a70 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72  eturn unixLogErr
20a80 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
20a90 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e  TRUNCATE, "ftrun
20aa0 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  cate", pFile->zP
20ab0 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23  ath);.  }else{.#
20ac0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
20ad0 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  UG.    /* If we 
20ae0 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d  are doing a norm
20af0 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61  al write to a da
20b00 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20  tabase file (as 
20b10 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a  opposed to.    *
20b20 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  * doing a hot-jo
20b30 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f  urnal rollback o
20b40 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d  r a write to som
20b50 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61  e file other tha
20b60 6e 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61  n a.    ** norma
20b70 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  l database file)
20b80 20 61 6e 64 20 77 65 20 74 72 75 6e 63 61 74 65   and we truncate
20b90 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72   the file to zer
20ba0 6f 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a  o length,.    **
20bb0 20 74 68 61 74 20 65 66 66 65 63 74 69 76 65 6c   that effectivel
20bc0 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68  y updates the ch
20bd0 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 20 54  ange counter.  T
20be0 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e  his might happen
20bf0 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 72 65 73  .    ** when res
20c00 74 6f 72 69 6e 67 20 61 20 64 61 74 61 62 61 73  toring a databas
20c10 65 20 75 73 69 6e 67 20 74 68 65 20 62 61 63 6b  e using the back
20c20 75 70 20 41 50 49 20 66 72 6f 6d 20 61 20 7a 65  up API from a ze
20c30 72 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a  ro-length.    **
20c40 20 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a   source..    */.
20c50 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69      if( pFile->i
20c60 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20  nNormalWrite && 
20c70 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
20c80 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e    pFile->transCn
20c90 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20  trChng = 1;.    
20ca0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  }.#endif..#if SQ
20cb0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
20cc0 5a 45 3e 30 0a 20 20 20 20 2f 2a 20 49 66 20 74  ZE>0.    /* If t
20cd0 68 65 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74  he file was just
20ce0 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20   truncated to a 
20cf0 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61  size smaller tha
20d00 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a  n the currently.
20d10 20 20 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65      ** mapped re
20d20 67 69 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65  gion, reduce the
20d30 20 65 66 66 65 63 74 69 76 65 20 6d 61 70 70 69   effective mappi
20d40 6e 67 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e  ng size as well.
20d50 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 20   SQLite will.   
20d60 20 2a 2a 20 75 73 65 20 72 65 61 64 28 29 20 61   ** use read() a
20d70 6e 64 20 77 72 69 74 65 28 29 20 74 6f 20 61 63  nd write() to ac
20d80 63 65 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64  cess data beyond
20d90 20 74 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d   this point from
20da0 20 6e 6f 77 20 6f 6e 2e 20 20 0a 20 20 20 20 2a   now on.  .    *
20db0 2f 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c  /.    if( nByte<
20dc0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
20dd0 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
20de0 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65  mmapSize = nByte
20df0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
20e00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20e10 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
20e20 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  ** Determine the
20e30 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
20e40 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73   a file in bytes
20e50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
20e60 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69  nixFileSize(sqli
20e70 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36  te3_file *id, i6
20e80 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74  4 *pSize){.  int
20e90 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74   rc;.  struct st
20ea0 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74  at buf;.  assert
20eb0 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f  ( id );.  rc = o
20ec0 73 46 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c  sFstat(((unixFil
20ed0 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29  e*)id)->h, &buf)
20ee0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
20ef0 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69  ror( rc=1 );.  i
20f00 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
20f10 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28  storeLastErrno((
20f20 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72  unixFile*)id, er
20f30 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  rno);.    return
20f40 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
20f50 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a  TAT;.  }.  *pSiz
20f60 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b  e = buf.st_size;
20f70 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e  ..  /* When open
20f80 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20  ing a zero-size 
20f90 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 66 69  database, the fi
20fa0 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72  ndInodeInfo() pr
20fb0 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69  ocedure.  ** wri
20fc0 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74  tes a single byt
20fd0 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65  e into that file
20fe0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72   in order to wor
20ff0 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20  k around a bug. 
21000 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20   ** in the OS-X 
21010 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d  msdos filesystem
21020 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61  .  In order to a
21030 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69  void problems wi
21040 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61  th upper.  ** la
21050 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  yers, we need to
21060 20 72 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c   report this fil
21070 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65  e size as zero e
21080 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73  ven though it is
21090 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20  .  ** really 1. 
210a0 20 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a    Ticket #3260..
210b0 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a    */.  if( *pSiz
210c0 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20  e==1 ) *pSize = 
210d0 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  0;...  return SQ
210e0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
210f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
21100 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
21110 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
21120 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20  )./*.** Handler 
21130 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e  for proxy-lockin
21140 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76  g file-control v
21150 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62  erbs.  Defined b
21160 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70  elow in the.** p
21170 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20  roxying locking 
21180 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  division..*/.sta
21190 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c  tic int proxyFil
211a0 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
211b0 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a  _file*,int,void*
211c0 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a  );.#endif../* .*
211d0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
211e0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e  is called to han
211f0 64 6c 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46  dle the SQLITE_F
21200 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a  CNTL_SIZE_HINT .
21210 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ** file-control 
21220 6f 70 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61  operation.  Enla
21230 72 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65  rge the database
21240 20 74 6f 20 6e 42 79 74 65 73 20 69 6e 20 73 69   to nBytes in si
21250 7a 65 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75  ze.** (rounded u
21260 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68  p to the next ch
21270 75 6e 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20 74  unk-size).  If t
21280 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
21290 6c 72 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73  lready.** nBytes
212a0 20 6f 72 20 6c 61 72 67 65 72 2c 20 74 68 69 73   or larger, this
212b0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
212c0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
212d0 6e 74 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74  nt fcntlSizeHint
212e0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
212f0 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  , i64 nByte){.  
21300 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
21310 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 69 36 34 20  nk>0 ){.    i64 
21320 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
21330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71            /* Req
21340 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20  uired file size 
21350 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  */.    struct st
21360 61 74 20 62 75 66 3b 20 20 20 20 20 20 20 20 20  at buf;         
21370 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
21380 68 6f 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75  hold return valu
21390 65 73 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f  es of fstat() */
213a0 0a 20 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46  .   .    if( osF
213b0 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26  stat(pFile->h, &
213c0 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20 73 74  buf) ){.      st
213d0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
213e0 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
213f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21400 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20  IOERR_FSTAT;.   
21410 20 7d 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20   }..    nSize = 
21420 28 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e 73  ((nByte+pFile->s
21430 7a 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69 6c  zChunk-1) / pFil
21440 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46  e->szChunk) * pF
21450 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20  ile->szChunk;.  
21460 20 20 69 66 28 20 6e 53 69 7a 65 3e 28 69 36 34    if( nSize>(i64
21470 29 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b 0a  )buf.st_size ){.
21480 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  .#if defined(HAV
21490 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54  E_POSIX_FALLOCAT
214a0 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58  E) && HAVE_POSIX
214b0 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20 20  _FALLOCATE.     
214c0 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 62 65 6c   /* The code bel
214d0 6f 77 20 69 73 20 68 61 6e 64 6c 69 6e 67 20 74  ow is handling t
214e0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
214f0 6f 66 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 29  of osFallocate()
21500 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65   .      ** corre
21510 63 74 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c 6c  ctly. posix_fall
21520 6f 63 61 74 65 28 29 20 69 73 20 64 65 66 69 6e  ocate() is defin
21530 65 64 20 74 6f 20 22 72 65 74 75 72 6e 73 20 7a  ed to "returns z
21540 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ero on success, 
21550 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e 20  .      ** or an 
21560 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e 20  error number on 
21570 20 66 61 69 6c 75 72 65 22 2e 20 53 65 65 20 74   failure". See t
21580 68 65 20 6d 61 6e 70 61 67 65 20 66 6f 72 20 64  he manpage for d
21590 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20  etails. */.     
215a0 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20 20 20   int err;.      
215b0 64 6f 7b 0a 20 20 20 20 20 20 20 20 65 72 72 20  do{.        err 
215c0 3d 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70 46  = osFallocate(pF
215d0 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 73  ile->h, buf.st_s
215e0 69 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e 73  ize, nSize-buf.s
215f0 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  t_size);.      }
21600 77 68 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e 54  while( err==EINT
21610 52 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  R );.      if( e
21620 72 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  rr ) return SQLI
21630 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
21640 23 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20 49  #else.      /* I
21650 66 20 74 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f  f the OS does no
21660 74 20 68 61 76 65 20 70 6f 73 69 78 5f 66 61 6c  t have posix_fal
21670 6c 6f 63 61 74 65 28 29 2c 20 66 61 6b 65 20 69  locate(), fake i
21680 74 2e 20 57 72 69 74 65 20 61 20 0a 20 20 20 20  t. Write a .    
21690 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65    ** single byte
216a0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 62 79 74   to the last byt
216b0 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b 20  e in each block 
216c0 74 68 61 74 20 66 61 6c 6c 73 20 65 6e 74 69 72  that falls entir
216d0 65 6c 79 0a 20 20 20 20 20 20 2a 2a 20 77 69 74  ely.      ** wit
216e0 68 69 6e 20 74 68 65 20 65 78 74 65 6e 64 65 64  hin the extended
216f0 20 72 65 67 69 6f 6e 2e 20 54 68 65 6e 2c 20 69   region. Then, i
21700 66 20 72 65 71 75 69 72 65 64 2c 20 61 20 73 69  f required, a si
21710 6e 67 6c 65 20 62 79 74 65 0a 20 20 20 20 20 20  ngle byte.      
21720 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 28 6e 53  ** at offset (nS
21730 69 7a 65 2d 31 29 2c 20 74 6f 20 73 65 74 20 74  ize-1), to set t
21740 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
21750 69 6c 65 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20  ile correctly.. 
21760 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
21770 61 20 73 69 6d 69 6c 61 72 20 74 65 63 68 6e 69  a similar techni
21780 71 75 65 20 74 6f 20 74 68 61 74 20 75 73 65 64  que to that used
21790 20 62 79 20 67 6c 69 62 63 20 6f 6e 20 73 79 73   by glibc on sys
217a0 74 65 6d 73 0a 20 20 20 20 20 20 2a 2a 20 74 68  tems.      ** th
217b0 61 74 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61  at do not have a
217c0 20 72 65 61 6c 20 66 61 6c 6c 6f 63 61 74 65 28   real fallocate(
217d0 29 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f  ) call..      */
217e0 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b 20  .      int nBlk 
217f0 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a 65  = buf.st_blksize
21800 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74 65  ;  /* File-syste
21810 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a  m block size */.
21820 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74 65        int nWrite
21830 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
21840 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
21850 79 74 65 73 20 77 72 69 74 74 65 6e 20 62 79 20  ytes written by 
21860 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a  seekAndWrite */.
21870 20 20 20 20 20 20 69 36 34 20 69 57 72 69 74 65        i64 iWrite
21880 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21890 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65 74    /* Next offset
218a0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
218b0 0a 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73  .      if( robus
218c0 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c  t_ftruncate(pFil
218d0 65 2d 3e 68 2c 20 6e 53 69 7a 65 29 20 29 7b 0a  e->h, nSize) ){.
218e0 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
218f0 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
21900 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 65  rno);.        re
21910 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
21920 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  r(SQLITE_IOERR_T
21930 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63  RUNCATE, "ftrunc
21940 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ate", pFile->zPa
21950 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  th);.      }.   
21960 20 20 20 69 57 72 69 74 65 20 3d 20 28 28 62 75     iWrite = ((bu
21970 66 2e 73 74 5f 73 69 7a 65 20 2b 20 32 2a 6e 42  f.st_size + 2*nB
21980 6c 6b 20 2d 20 31 29 2f 6e 42 6c 6b 29 2a 6e 42  lk - 1)/nBlk)*nB
21990 6c 6b 2d 31 3b 0a 20 20 20 20 20 20 61 73 73 65  lk-1;.      asse
219a0 72 74 28 20 69 57 72 69 74 65 3e 3d 62 75 66 2e  rt( iWrite>=buf.
219b0 73 74 5f 73 69 7a 65 20 29 3b 0a 20 20 20 20 20  st_size );.     
219c0 20 61 73 73 65 72 74 28 20 28 69 57 72 69 74 65   assert( (iWrite
219d0 2f 6e 42 6c 6b 29 3d 3d 28 28 62 75 66 2e 73 74  /nBlk)==((buf.st
219e0 5f 73 69 7a 65 2b 6e 42 6c 6b 2d 31 29 2f 6e 42  _size+nBlk-1)/nB
219f0 6c 6b 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  lk) );.      ass
21a00 65 72 74 28 20 28 28 69 57 72 69 74 65 2b 31 29  ert( ((iWrite+1)
21a10 25 6e 42 6c 6b 29 3d 3d 30 20 29 3b 0a 20 20 20  %nBlk)==0 );.   
21a20 20 20 20 66 6f 72 28 2f 2a 6e 6f 2d 6f 70 2a 2f     for(/*no-op*/
21a30 3b 20 69 57 72 69 74 65 3c 6e 53 69 7a 65 3b 20  ; iWrite<nSize; 
21a40 69 57 72 69 74 65 2b 3d 6e 42 6c 6b 20 29 7b 0a  iWrite+=nBlk ){.
21a50 20 20 20 20 20 20 20 20 6e 57 72 69 74 65 20 3d          nWrite =
21a60 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46   seekAndWrite(pF
21a70 69 6c 65 2c 20 69 57 72 69 74 65 2c 20 22 22 2c  ile, iWrite, "",
21a80 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
21a90 20 6e 57 72 69 74 65 21 3d 31 20 29 20 72 65 74   nWrite!=1 ) ret
21aa0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
21ab0 5f 57 52 49 54 45 3b 0a 20 20 20 20 20 20 7d 0a  _WRITE;.      }.
21ac0 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74 65        if( nWrite
21ad0 3d 3d 30 20 7c 7c 20 28 6e 53 69 7a 65 25 6e 42  ==0 || (nSize%nB
21ae0 6c 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  lk) ){.        n
21af0 57 72 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57  Write = seekAndW
21b00 72 69 74 65 28 70 46 69 6c 65 2c 20 6e 53 69 7a  rite(pFile, nSiz
21b10 65 2d 31 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20  e-1, "", 1);.   
21b20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 21       if( nWrite!
21b30 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =1 ) return SQLI
21b40 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
21b50 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
21b60 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 20 53 51     }.  }..#if SQ
21b70 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
21b80 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 69 6c 65  ZE>0.  if( pFile
21b90 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20  ->mmapSizeMax>0 
21ba0 26 26 20 6e 42 79 74 65 3e 70 46 69 6c 65 2d 3e  && nByte>pFile->
21bb0 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
21bc0 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 66 28 20  int rc;.    if( 
21bd0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3c 3d  pFile->szChunk<=
21be0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  0 ){.      if( r
21bf0 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
21c00 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29  pFile->h, nByte)
21c10 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
21c20 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
21c30 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
21c40 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
21c50 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
21c60 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74  RR_TRUNCATE, "ft
21c70 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d  runcate", pFile-
21c80 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d  >zPath);.      }
21c90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
21ca0 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69   unixMapfile(pFi
21cb0 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  le, nByte);.    
21cc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
21cd0 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
21ce0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23  SQLITE_OK;.}...#
21cf0 69 66 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  if (SQLITE_ENABL
21d00 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26  E_APPLE_SPI>0) &
21d10 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
21d20 45 5f 5f 29 0a 23 69 6e 63 6c 75 64 65 20 22 73  E__).#include "s
21d30 71 6c 69 74 65 33 5f 70 72 69 76 61 74 65 2e 68  qlite3_private.h
21d40 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63 6f 70 79  ".#include <copy
21d50 66 69 6c 65 2e 68 3e 0a 73 74 61 74 69 63 20 69  file.h>.static i
21d60 6e 74 20 70 72 6f 78 79 47 65 74 44 62 50 61 74  nt proxyGetDbPat
21d70 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 75 6e 69  hForUnixFile(uni
21d80 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 68  xFile *pFile, ch
21d90 61 72 20 2a 64 62 50 61 74 68 29 3b 0a 23 65 6e  ar *dbPath);.#en
21da0 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
21db0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
21dc0 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74 20  TYLE.static int 
21dd0 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f  isProxyLockingMo
21de0 64 65 28 75 6e 69 78 46 69 6c 65 20 2a 29 3b 0a  de(unixFile *);.
21df0 23 65 6e 64 69 66 0a 0a 23 69 66 20 28 53 51 4c  #endif..#if (SQL
21e00 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45  ITE_ENABLE_APPLE
21e10 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e  _SPI>0) && defin
21e20 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 73 74  ed(__APPLE__).st
21e30 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75  atic int unixTru
21e40 6e 63 61 74 65 44 61 74 61 62 61 73 65 28 75 6e  ncateDatabase(un
21e50 69 78 46 69 6c 65 20 2a 2c 20 69 6e 74 29 3b 0a  ixFile *, int);.
21e60 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
21e70 49 6e 76 61 6c 69 64 61 74 65 53 75 70 70 6f 72  InvalidateSuppor
21e80 74 46 69 6c 65 73 28 75 6e 69 78 46 69 6c 65 20  tFiles(unixFile 
21e90 2a 2c 20 69 6e 74 29 3b 0a 0a 73 74 61 74 69 63  *, int);..static
21ea0 20 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46   int findCreateF
21eb0 69 6c 65 4d 6f 64 65 28 63 6f 6e 73 74 20 63 68  ileMode(const ch
21ec0 61 72 20 2a 2c 20 69 6e 74 2c 20 6d 6f 64 65 5f  ar *, int, mode_
21ed0 74 2a 2c 20 75 69 64 5f 74 20 2a 2c 67 69 64 5f  t*, uid_t *,gid_
21ee0 74 20 2a 29 3b 0a 0a 2f 2a 20 6f 70 65 6e 73 20  t *);../* opens 
21ef0 61 20 72 65 61 64 2f 77 72 69 74 65 20 63 6f 6e  a read/write con
21f00 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 66 69 6c  nection to a fil
21f10 65 20 7a 4e 61 6d 65 20 69 6e 68 65 72 69 74 69  e zName inheriti
21f20 6e 67 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  ng the appropria
21f30 74 65 0a 2a 2a 20 75 73 65 72 2f 70 65 72 6d 73  te.** user/perms
21f40 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
21f50 73 65 20 66 69 6c 65 20 69 66 20 72 75 6e 6e 69  se file if runni
21f60 6e 67 20 61 73 20 72 6f 6f 74 2e 20 20 52 65 74  ng as root.  Ret
21f70 75 72 6e 73 20 74 68 65 20 66 69 6c 65 20 0a 2a  urns the file .*
21f80 2a 20 64 65 73 63 72 69 70 74 6f 72 20 62 79 20  * descriptor by 
21f90 72 65 66 65 72 65 6e 63 65 0a 2a 2f 0a 73 74 61  reference.*/.sta
21fa0 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e  tic int unixOpen
21fb0 43 68 69 6c 64 46 69 6c 65 28 0a 20 20 63 6f 6e  ChildFile(.  con
21fc0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a  st char *zName,.
21fd0 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 2c    int openFlags,
21fe0 0a 20 20 69 6e 74 20 64 62 4f 70 65 6e 46 6c 61  .  int dbOpenFla
21ff0 67 73 2c 0a 20 20 69 6e 74 20 70 72 6f 74 46 6c  gs,.  int protFl
22000 61 67 73 2c 0a 20 20 69 6e 74 20 2a 70 46 64 0a  ags,.  int *pFd.
22010 29 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  ){.  int fd = -1
22020 3b 0a 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d  ;.  mode_t openM
22030 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
22040 20 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73    /* Permissions
22050 20 74 6f 20 63 72 65 61 74 65 20 66 69 6c 65 20   to create file 
22060 77 69 74 68 20 2a 2f 0a 20 20 75 69 64 5f 74 20  with */.  uid_t 
22070 75 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  uid;            
22080 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 72 69          /* Useri
22090 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a  d for the file *
220a0 2f 0a 20 20 67 69 64 5f 74 20 67 69 64 3b 20 20  /.  gid_t gid;  
220b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220c0 20 20 2f 2a 20 47 72 6f 75 70 69 64 20 66 6f 72    /* Groupid for
220d0 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69   the file */.  i
220e0 6e 74 20 72 63 3b 0a 20 20 0a 20 20 61 73 73 65  nt rc;.  .  asse
220f0 72 74 28 70 46 64 21 3d 4e 55 4c 4c 29 3b 0a 20  rt(pFd!=NULL);. 
22100 20 72 63 20 3d 20 66 69 6e 64 43 72 65 61 74 65   rc = findCreate
22110 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20  FileMode(zName, 
22120 64 62 4f 70 65 6e 46 6c 61 67 73 2c 20 26 6f 70  dbOpenFlags, &op
22130 65 6e 4d 6f 64 65 2c 20 26 75 69 64 2c 20 26 67  enMode, &uid, &g
22140 69 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  id);.  if( rc!=S
22150 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22160 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
22170 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
22180 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  n(zName, openFla
22190 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20  gs, openMode);. 
221a0 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 58   OSTRACE(("OPENX
221b0 20 20 20 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e     %-3d %s 0%o\n
221c0 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70  ", fd, zName, op
221d0 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20 69 66 28  enFlags));.  if(
221e0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 72 63 20   fd<0 ){.    rc 
221f0 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
22200 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
22210 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e 61  KPT, "open", zNa
22220 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
22230 72 63 3b 0a 20 20 7d 0a 20 20 2f 2a 20 69 66 20  rc;.  }.  /* if 
22240 77 65 27 72 65 20 6f 70 65 6e 69 6e 67 20 74 68  we're opening th
22250 65 20 77 61 6c 20 6f 72 20 6a 6f 75 72 6e 61 6c  e wal or journal
22260 20 61 6e 64 20 72 75 6e 6e 69 6e 67 20 61 73 20   and running as 
22270 72 6f 6f 74 2c 20 73 65 74 0a 20 20 2a 2a 20 74  root, set.  ** t
22280 68 65 20 6a 6f 75 72 6e 61 6c 20 75 69 64 2f 67  he journal uid/g
22290 69 64 20 2a 2f 0a 20 20 69 66 28 20 64 62 4f 70  id */.  if( dbOp
222a0 65 6e 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54  enFlags & (SQLIT
222b0 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54  E_OPEN_WAL|SQLIT
222c0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
222d0 4e 41 4c 29 20 29 7b 0a 20 20 20 20 75 69 64 5f  NAL) ){.    uid_
222e0 74 20 65 75 69 64 20 3d 20 67 65 74 65 75 69 64  t euid = geteuid
222f0 28 29 3b 0a 20 20 20 20 69 66 28 20 65 75 69 64  ();.    if( euid
22300 3d 3d 30 20 26 26 20 28 65 75 69 64 21 3d 75 69  ==0 && (euid!=ui
22310 64 20 7c 7c 20 67 65 74 65 67 69 64 28 29 21 3d  d || getegid()!=
22320 67 69 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66  gid) ){.      if
22330 28 20 66 63 68 6f 77 6e 28 66 64 2c 20 75 69 64  ( fchown(fd, uid
22340 2c 20 67 69 64 29 20 29 7b 0a 20 20 20 20 20 20  , gid) ){.      
22350 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
22360 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
22370 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
22380 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22390 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 46 64 20 3d  OK ){.    *pFd =
223a0 20 66 64 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a   fd;.  } else {.
223b0 20 20 20 20 2a 70 46 64 20 3d 20 2d 31 3b 0a 20      *pFd = -1;. 
223c0 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20     close(fd);.  
223d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
223e0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  ..static int uni
223f0 78 52 65 70 6c 61 63 65 44 61 74 61 62 61 73 65  xReplaceDatabase
22400 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
22410 2c 20 73 71 6c 69 74 65 33 20 2a 73 72 63 64 62  , sqlite3 *srcdb
22420 29 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ) {.  sqlite3_fi
22430 6c 65 20 2a 69 64 20 3d 20 28 73 71 6c 69 74 65  le *id = (sqlite
22440 33 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  3_file *)pFile;.
22450 20 20 42 74 72 65 65 20 2a 70 53 72 63 42 74 72    Btree *pSrcBtr
22460 65 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 73 71 6c  ee = NULL;.  sql
22470 69 74 65 33 5f 66 69 6c 65 20 2a 73 72 63 5f 66  ite3_file *src_f
22480 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 75 6e  ile = NULL;.  un
22490 69 78 46 69 6c 65 20 2a 70 53 72 63 46 69 6c 65  ixFile *pSrcFile
224a0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63 68 61 72 20   = NULL;.  char 
224b0 73 72 63 57 61 6c 50 61 74 68 5b 4d 41 58 50 41  srcWalPath[MAXPA
224c0 54 48 4c 45 4e 2b 35 5d 3b 0a 20 20 69 6e 74 20  THLEN+5];.  int 
224d0 73 72 63 57 61 6c 46 44 20 3d 20 2d 31 3b 0a 20  srcWalFD = -1;. 
224e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
224f0 5f 4f 4b 3b 0a 20 20 76 6f 69 64 20 2a 70 4c 6f  _OK;.  void *pLo
22500 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 69 6e 74  ck = NULL;.  int
22510 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 73 71   flags = 0;.  sq
22520 6c 69 74 65 33 20 2a 73 72 63 64 62 32 20 3d 20  lite3 *srcdb2 = 
22530 4e 55 4c 4c 3b 0a 20 20 63 6f 70 79 66 69 6c 65  NULL;.  copyfile
22540 5f 73 74 61 74 65 5f 74 20 73 3b 0a 20 20 69 6e  _state_t s;.  in
22550 74 20 63 6f 72 72 75 70 74 53 72 63 46 69 6c 65  t corruptSrcFile
22560 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Lock = 0;.  int 
22570 63 6f 72 72 75 70 74 44 73 74 46 69 6c 65 4c 6f  corruptDstFileLo
22580 63 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73  ck = 0;.  int is
22590 53 72 63 43 6f 72 72 75 70 74 20 3d 20 30 3b 0a  SrcCorrupt = 0;.
225a0 20 20 69 6e 74 20 69 73 44 73 74 43 6f 72 72 75    int isDstCorru
225b0 70 74 20 3d 20 30 3b 0a 20 20 0a 20 20 69 66 28  pt = 0;.  .  if(
225c0 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
225d0 68 65 63 6b 4f 6b 28 73 72 63 64 62 29 20 29 7b  heckOk(srcdb) ){
225e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
225f0 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20  TE_MISUSE;.  }. 
22600 20 20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45     .#if SQLITE_E
22610 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45  NABLE_DATA_PROTE
22620 43 54 49 4f 4e 0a 20 20 66 6c 61 67 73 20 7c 3d  CTION.  flags |=
22630 20 70 46 69 6c 65 2d 3e 70 72 6f 74 46 6c 61 67   pFile->protFlag
22640 73 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  s;.#endif.#if SQ
22650 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
22660 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66 28 20  ING_STYLE.  if( 
22670 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f  isProxyLockingMo
22680 64 65 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  de(pFile) ){.   
22690 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
226a0 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 3b  _OPEN_AUTOPROXY;
226b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
226c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 64 65 6d   rc = sqlite3dem
226d0 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 70 46 69 6c  o_superlock(pFil
226e0 65 2d 3e 7a 50 61 74 68 2c 20 30 2c 20 66 6c 61  e->zPath, 0, fla
226f0 67 73 2c 20 30 2c 20 30 2c 20 26 70 4c 6f 63 6b  gs, 0, 0, &pLock
22700 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
22710 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22720 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 72 63 3d  E_CORRUPT || rc=
22730 3d 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 29  =SQLITE_NOTADB )
22740 7b 0a 20 20 20 20 20 20 69 73 44 73 74 43 6f 72  {.      isDstCor
22750 72 75 70 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  rupt = 1;.      
22760 72 63 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f  rc = sqlite3demo
22770 5f 73 75 70 65 72 6c 6f 63 6b 5f 63 6f 72 72 75  _superlock_corru
22780 70 74 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f  pt(id, SQLITE_LO
22790 43 4b 5f 45 58 43 4c 55 53 49 56 45 2c 0a 20 20  CK_EXCLUSIVE,.  
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227c0 20 20 20 20 20 20 20 26 63 6f 72 72 75 70 74 44         &corruptD
227d0 73 74 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20  stFileLock);.   
227e0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b   }.    if( rc ){
227f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
22800 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  ;.    }.  }.  /*
22810 20 67 65 74 20 74 68 65 20 73 72 63 20 66 69 6c   get the src fil
22820 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 64 68  e descriptor adh
22830 65 72 69 6e 67 20 74 6f 20 74 68 65 20 64 62 20  ering to the db 
22840 73 74 72 75 63 74 20 61 63 63 65 73 73 20 72 75  struct access ru
22850 6c 65 73 20 0a 20 20 20 2a 2a 20 74 68 69 73 20  les .   ** this 
22860 63 6f 64 65 20 69 73 20 6d 6f 64 65 6c 65 64 20  code is modeled 
22870 61 66 74 65 72 20 73 71 6c 69 74 65 33 5f 66 69  after sqlite3_fi
22880 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 69 6e 20  le_control() in 
22890 6d 61 69 6e 2e 63 0a 20 20 20 2a 2f 20 0a 20 20  main.c.   */ .  
228a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
228b0 74 65 72 28 73 72 63 64 62 2d 3e 6d 75 74 65 78  ter(srcdb->mutex
228c0 29 3b 0a 20 20 69 66 28 20 73 72 63 64 62 2d 3e  );.  if( srcdb->
228d0 6e 44 62 3e 30 20 29 7b 0a 20 20 20 20 70 53 72  nDb>0 ){.    pSr
228e0 63 42 74 72 65 65 20 3d 20 73 72 63 64 62 2d 3e  cBtree = srcdb->
228f0 61 44 62 5b 30 5d 2e 70 42 74 3b 0a 20 20 7d 0a  aDb[0].pBt;.  }.
22900 20 20 69 66 28 20 70 53 72 63 42 74 72 65 65 20    if( pSrcBtree 
22910 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 53  ){.    Pager *pS
22920 72 63 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c  rcPager;.    sql
22930 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
22940 53 72 63 42 74 72 65 65 29 3b 0a 20 20 20 20 70  SrcBtree);.    p
22950 53 72 63 50 61 67 65 72 20 3d 20 73 71 6c 69 74  SrcPager = sqlit
22960 65 33 42 74 72 65 65 50 61 67 65 72 28 70 53 72  e3BtreePager(pSr
22970 63 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73  cBtree);.    ass
22980 65 72 74 28 20 70 53 72 63 50 61 67 65 72 21 3d  ert( pSrcPager!=
22990 30 20 29 3b 0a 20 20 20 20 73 72 63 5f 66 69 6c  0 );.    src_fil
229a0 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
229b0 46 69 6c 65 28 70 53 72 63 50 61 67 65 72 29 3b  File(pSrcPager);
229c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 72 63  .    assert( src
229d0 5f 66 69 6c 65 21 3d 30 20 29 3b 0a 20 20 20 20  _file!=0 );.    
229e0 69 66 28 20 73 72 63 5f 66 69 6c 65 2d 3e 70 4d  if( src_file->pM
229f0 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
22a00 69 6e 74 20 73 72 63 46 6c 61 67 73 20 3d 20 30  int srcFlags = 0
22a10 3b 0a 20 20 20 20 20 20 70 53 72 63 46 69 6c 65  ;.      pSrcFile
22a20 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 73   = (unixFile *)s
22a30 72 63 5f 66 69 6c 65 3b 0a 23 69 66 20 53 51 4c  rc_file;.#if SQL
22a40 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
22a50 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65 66 69  NG_STYLE || defi
22a60 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
22a70 20 20 20 20 20 69 66 20 28 28 70 53 72 63 46 69       if ((pSrcFi
22a80 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20  le->openFlags & 
22a90 4f 5f 52 44 57 52 29 20 3d 3d 20 4f 5f 52 44 57  O_RDWR) == O_RDW
22aa0 52 29 20 7b 0a 20 20 20 20 20 20 20 20 73 72 63  R) {.        src
22ab0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  Flags = SQLITE_O
22ac0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20  PEN_READWRITE;. 
22ad0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
22ae0 20 20 20 20 20 20 73 72 63 46 6c 61 67 73 20 3d        srcFlags =
22af0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
22b00 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 23  DONLY;.      }.#
22b10 65 6c 73 65 0a 20 20 20 20 20 20 73 72 63 46 6c  else.      srcFl
22b20 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
22b30 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 23 65 6e  N_READWRITE;.#en
22b40 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
22b50 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45  NABLE_DATA_PROTE
22b60 43 54 49 4f 4e 0a 20 20 20 20 20 20 73 72 63 46  CTION.      srcF
22b70 6c 61 67 73 20 7c 3d 20 70 53 72 63 46 69 6c 65  lags |= pSrcFile
22b80 2d 3e 70 72 6f 74 46 6c 61 67 73 3b 0a 23 65 6e  ->protFlags;.#en
22b90 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
22ba0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
22bb0 59 4c 45 0a 20 20 20 20 20 20 69 66 28 20 69 73  YLE.      if( is
22bc0 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65  ProxyLockingMode
22bd0 28 70 53 72 63 46 69 6c 65 29 20 29 7b 0a 20 20  (pSrcFile) ){.  
22be0 20 20 20 20 20 20 73 72 63 46 6c 61 67 73 20 7c        srcFlags |
22bf0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55  = SQLITE_OPEN_AU
22c00 54 4f 50 52 4f 58 59 3b 0a 20 20 20 20 20 20 7d  TOPROXY;.      }
22c10 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63  .#endif.      rc
22c20 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f   = sqlite3_open_
22c30 76 32 28 70 53 72 63 46 69 6c 65 2d 3e 7a 50 61  v2(pSrcFile->zPa
22c40 74 68 2c 20 26 73 72 63 64 62 32 2c 20 73 72 63  th, &srcdb2, src
22c50 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20  Flags, 0);.     
22c60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22c70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
22c80 20 73 74 61 72 74 20 61 20 64 65 66 65 72 72 65   start a deferre
22c90 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  d transaction an
22ca0 64 20 72 65 61 64 20 74 6f 20 65 73 74 61 62 6c  d read to establ
22cb0 69 73 68 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  ish a read lock 
22cc0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
22cd0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 73 72 63  sqlite3_exec(src
22ce0 64 62 32 2c 20 22 42 45 47 49 4e 20 44 45 46 45  db2, "BEGIN DEFE
22cf0 52 52 45 44 3b 20 50 52 41 47 4d 41 20 73 63 68  RRED; PRAGMA sch
22d00 65 6d 61 5f 76 65 72 73 69 6f 6e 22 2c 0a 20 20  ema_version",.  
22d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 29          0, 0, 0)
22d30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
22d40 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
22d50 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
22d60 4f 54 41 44 42 20 29 7b 0a 20 20 20 20 20 20 20  OTADB ){.       
22d70 20 20 20 69 73 53 72 63 43 6f 72 72 75 70 74 20     isSrcCorrupt 
22d80 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 1;.          r
22d90 63 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f  c = sqlite3demo_
22da0 73 75 70 65 72 6c 6f 63 6b 5f 63 6f 72 72 75 70  superlock_corrup
22db0 74 28 73 72 63 5f 66 69 6c 65 2c 20 53 51 4c 49  t(src_file, SQLI
22dc0 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 2c 0a  TE_LOCK_SHARED,.
22dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22df0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 63 6f               &co
22e00 72 72 75 70 74 53 72 63 46 69 6c 65 4c 6f 63 6b  rruptSrcFileLock
22e10 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
22e20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
22e30 20 69 66 28 20 21 73 72 63 64 62 32 20 7c 7c 20   if( !srcdb2 || 
22e40 70 53 72 63 46 69 6c 65 3d 3d 4e 55 4c 4c 20 7c  pSrcFile==NULL |
22e50 7c 20 70 53 72 63 46 69 6c 65 2d 3e 68 3c 30 29  | pSrcFile->h<0)
22e60 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
22e70 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d 0a  E_INTERNAL;.  }.
22e80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
22e90 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
22ea0 65 6e 64 5f 72 65 70 6c 61 63 65 5f 64 61 74 61  end_replace_data
22eb0 62 61 73 65 3b 0a 20 20 7d 0a 20 20 2f 2a 20 62  base;.  }.  /* b
22ec0 6f 74 68 20 64 61 74 61 62 61 73 65 73 20 61 72  oth databases ar
22ed0 65 20 6c 6f 63 6b 65 64 20 61 70 70 72 6f 70 72  e locked appropr
22ee0 69 61 74 65 6c 79 2c 20 63 6f 70 79 20 74 68 65  iately, copy the
22ef0 20 73 72 63 20 77 61 6c 20 6a 6f 75 72 6e 61 6c   src wal journal
22f00 20 69 66 20 0a 20 20 20 2a 2a 20 6f 6e 65 20 65   if .   ** one e
22f10 78 69 73 74 73 20 61 6e 64 20 74 68 65 6e 20 74  xists and then t
22f20 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61  he actual databa
22f30 73 65 20 66 69 6c 65 0a 20 20 20 2a 2f 0a 20 20  se file.   */.  
22f40 73 74 72 6c 63 70 79 28 73 72 63 57 61 6c 50 61  strlcpy(srcWalPa
22f50 74 68 2c 20 70 53 72 63 46 69 6c 65 2d 3e 7a 50  th, pSrcFile->zP
22f60 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 2b  ath, MAXPATHLEN+
22f70 35 29 3b 0a 20 20 73 74 72 6c 63 61 74 28 73 72  5);.  strlcat(sr
22f80 63 57 61 6c 50 61 74 68 2c 20 22 2d 77 61 6c 22  cWalPath, "-wal"
22f90 2c 20 4d 41 58 50 41 54 48 4c 45 4e 2b 35 29 3b  , MAXPATHLEN+5);
22fa0 0a 20 20 73 72 63 57 61 6c 46 44 20 3d 20 6f 70  .  srcWalFD = op
22fb0 65 6e 28 73 72 63 57 61 6c 50 61 74 68 2c 20 4f  en(srcWalPath, O
22fc0 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 69 66 28 20  _RDONLY);.  if( 
22fd0 21 28 73 72 63 57 61 6c 46 44 3c 30 29 20 29 7b  !(srcWalFD<0) ){
22fe0 0a 20 20 20 20 63 68 61 72 20 64 73 74 57 61 6c  .    char dstWal
22ff0 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b  Path[MAXPATHLEN+
23000 35 5d 3b 0a 20 20 20 20 69 6e 74 20 64 73 74 57  5];.    int dstW
23010 61 6c 46 44 20 3d 20 2d 31 3b 0a 20 20 20 20 69  alFD = -1;.    i
23020 6e 74 20 70 72 6f 74 46 6c 61 67 73 20 3d 20 30  nt protFlags = 0
23030 3b 0a 20 20 20 20 73 74 72 6c 63 70 79 28 64 73  ;.    strlcpy(ds
23040 74 57 61 6c 50 61 74 68 2c 20 70 46 69 6c 65 2d  tWalPath, pFile-
23050 3e 7a 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  >zPath, MAXPATHL
23060 45 4e 2b 35 29 3b 0a 20 20 20 20 73 74 72 6c 63  EN+5);.    strlc
23070 61 74 28 64 73 74 57 61 6c 50 61 74 68 2c 20 22  at(dstWalPath, "
23080 2d 77 61 6c 22 2c 20 4d 41 58 50 41 54 48 4c 45  -wal", MAXPATHLE
23090 4e 2b 35 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20  N+5);..    rc = 
230a0 75 6e 69 78 4f 70 65 6e 43 68 69 6c 64 46 69 6c  unixOpenChildFil
230b0 65 28 64 73 74 57 61 6c 50 61 74 68 2c 20 4f 5f  e(dstWalPath, O_
230c0 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 53 51  RDWR|O_CREAT, SQ
230d0 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 2c 0a 20  LITE_OPEN_WAL,. 
230e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230f0 20 20 20 20 20 20 20 20 20 20 70 72 6f 74 46 6c            protFl
23100 61 67 73 2c 20 26 64 73 74 57 61 6c 46 44 29 3b  ags, &dstWalFD);
23110 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
23120 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23130 73 20 3d 20 63 6f 70 79 66 69 6c 65 5f 73 74 61  s = copyfile_sta
23140 74 65 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  te_alloc();.    
23150 20 20 6c 73 65 65 6b 28 73 72 63 57 61 6c 46 44    lseek(srcWalFD
23160 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a  , 0, SEEK_SET);.
23170 20 20 20 20 20 20 6c 73 65 65 6b 28 64 73 74 57        lseek(dstW
23180 61 6c 46 44 2c 20 30 2c 20 53 45 45 4b 5f 53 45  alFD, 0, SEEK_SE
23190 54 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63  T);.      if( fc
231a0 6f 70 79 66 69 6c 65 28 73 72 63 57 61 6c 46 44  opyfile(srcWalFD
231b0 2c 20 64 73 74 57 61 6c 46 44 2c 20 73 2c 20 43  , dstWalFD, s, C
231c0 4f 50 59 46 49 4c 45 5f 44 41 54 41 29 20 29 7b  OPYFILE_DATA) ){
231d0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72  .        int err
231e0 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  =errno;.        
231f0 73 77 69 74 63 68 28 65 72 72 29 20 7b 0a 20 20  switch(err) {.  
23200 20 20 20 20 20 20 20 20 63 61 73 65 20 45 4e 4f          case ENO
23210 4d 45 4d 3a 0a 20 20 20 20 20 20 20 20 20 20 20  MEM:.           
23220 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
23230 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EM;.            
23240 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
23250 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
23260 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
23270 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 29  rrno(pFile, err)
23280 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
23290 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b   = SQLITE_IOERR;
232a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
232b0 20 7d 0a 20 20 20 20 20 20 63 6f 70 79 66 69 6c   }.      copyfil
232c0 65 5f 73 74 61 74 65 5f 66 72 65 65 28 73 29 3b  e_state_free(s);
232d0 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 64 73 74  .      close(dst
232e0 57 61 6c 46 44 29 3b 0a 20 20 20 20 7d 0a 20 20  WalFD);.    }.  
232f0 20 20 63 6c 6f 73 65 28 73 72 63 57 61 6c 46 44    close(srcWalFD
23300 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
23310 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23320 20 20 2f 2a 20 62 65 66 6f 72 65 20 77 65 20 63    /* before we c
23330 6f 70 79 2c 20 65 6e 73 75 72 65 20 74 68 61 74  opy, ensure that
23340 20 74 68 65 20 66 69 6c 65 20 63 68 61 6e 67 65   the file change
23350 20 63 6f 75 6e 74 65 72 20 77 69 6c 6c 20 62 65   counter will be
23360 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20   modified */.   
23370 20 75 69 6e 74 33 32 5f 74 20 73 72 63 43 68 61   uint32_t srcCha
23380 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 75 69 6e  nge = 0;.    uin
23390 74 33 32 5f 74 20 64 73 74 43 68 61 6e 67 65 20  t32_t dstChange 
233a0 3d 20 30 3b 0a 20 20 20 20 70 72 65 61 64 28 70  = 0;.    pread(p
233b0 53 72 63 46 69 6c 65 2d 3e 68 2c 20 26 73 72 63  SrcFile->h, &src
233c0 43 68 61 6e 67 65 2c 20 34 2c 20 32 34 29 3b 0a  Change, 4, 24);.
233d0 20 20 20 20 70 72 65 61 64 28 70 46 69 6c 65 2d      pread(pFile-
233e0 3e 68 2c 20 26 64 73 74 43 68 61 6e 67 65 2c 20  >h, &dstChange, 
233f0 34 2c 20 32 34 29 3b 0a 20 20 20 20 0a 20 20 20  4, 24);.    .   
23400 20 2f 2a 20 63 6f 70 79 20 74 68 65 20 61 63 74   /* copy the act
23410 75 61 6c 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ual database */.
23420 20 20 20 20 73 20 3d 20 63 6f 70 79 66 69 6c 65      s = copyfile
23430 5f 73 74 61 74 65 5f 61 6c 6c 6f 63 28 29 3b 0a  _state_alloc();.
23440 20 20 20 20 6c 73 65 65 6b 28 70 53 72 63 46 69      lseek(pSrcFi
23450 6c 65 2d 3e 68 2c 20 30 2c 20 53 45 45 4b 5f 53  le->h, 0, SEEK_S
23460 45 54 29 3b 0a 20 20 20 20 6c 73 65 65 6b 28 70  ET);.    lseek(p
23470 46 69 6c 65 2d 3e 68 2c 20 30 2c 20 53 45 45 4b  File->h, 0, SEEK
23480 5f 53 45 54 29 3b 0a 20 20 20 20 69 66 28 20 66  _SET);.    if( f
23490 63 6f 70 79 66 69 6c 65 28 70 53 72 63 46 69 6c  copyfile(pSrcFil
234a0 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  e->h, pFile->h, 
234b0 73 2c 20 43 4f 50 59 46 49 4c 45 5f 44 41 54 41  s, COPYFILE_DATA
234c0 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  ) ){.      int e
234d0 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20  rr=errno;.      
234e0 73 77 69 74 63 68 28 65 72 72 29 20 7b 0a 20 20  switch(err) {.  
234f0 20 20 20 20 20 20 63 61 73 65 20 45 4e 4f 4d 45        case ENOME
23500 4d 3a 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  M:.          rc 
23510 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
23520 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
23530 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74  .        default
23540 3a 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72  :.          stor
23550 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
23560 2c 20 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20  , err);.        
23570 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
23580 45 52 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ERR;.      }.   
23590 20 7d 0a 20 20 20 20 63 6f 70 79 66 69 6c 65 5f   }.    copyfile_
235a0 73 74 61 74 65 5f 66 72 65 65 28 73 29 3b 0a 20  state_free(s);. 
235b0 20 20 20 0a 20 20 20 20 69 66 20 28 73 72 63 43     .    if (srcC
235c0 68 61 6e 67 65 20 3d 3d 20 64 73 74 43 68 61 6e  hange == dstChan
235d0 67 65 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6d  ge) {.      /* m
235e0 6f 64 69 66 79 20 74 68 65 20 63 68 61 6e 67 65  odify the change
235f0 20 63 6f 75 6e 74 65 72 20 74 6f 20 66 6f 72 63   counter to forc
23600 65 20 70 61 67 65 20 7a 65 72 6f 20 74 6f 20 62  e page zero to b
23610 65 20 72 65 6c 6f 61 64 65 64 20 2a 2f 0a 20 20  e reloaded */.  
23620 20 20 20 20 64 73 74 43 68 61 6e 67 65 20 2b 2b      dstChange ++
23630 3b 0a 20 20 20 20 20 20 70 77 72 69 74 65 28 70  ;.      pwrite(p
23640 46 69 6c 65 2d 3e 68 2c 20 26 64 73 74 43 68 61  File->h, &dstCha
23650 6e 67 65 2c 20 34 2c 20 32 34 29 3b 0a 20 20 20  nge, 4, 24);.   
23660 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 53   }.  }.  if( isS
23670 72 63 43 6f 72 72 75 70 74 20 29 7b 0a 20 20 20  rcCorrupt ){.   
23680 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70   sqlite3demo_sup
23690 65 72 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70 74  erunlock_corrupt
236a0 28 73 72 63 5f 66 69 6c 65 2c 20 63 6f 72 72 75  (src_file, corru
236b0 70 74 53 72 63 46 69 6c 65 4c 6f 63 6b 29 3b 0a  ptSrcFileLock);.
236c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
236d0 64 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6f  done with the so
236e0 75 72 63 65 20 64 62 20 73 6f 20 65 6e 64 20 74  urce db so end t
236f0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  he transaction *
23700 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  /.    sqlite3_ex
23710 65 63 28 73 72 63 64 62 32 2c 20 22 43 4f 4d 4d  ec(srcdb2, "COMM
23720 49 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  IT", 0, 0, 0);. 
23730 20 7d 0a 20 20 2f 2a 20 7a 65 72 6f 20 6f 75 74   }.  /* zero out
23740 20 61 6e 79 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c   any old journal
23750 20 63 6c 75 74 74 65 72 20 2a 2f 0a 20 20 69 66   clutter */.  if
23760 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23770 29 7b 0a 20 20 20 20 69 6e 74 20 73 6b 69 70 57  ){.    int skipW
23780 41 4c 20 3d 20 28 73 72 63 57 61 6c 46 44 3c 30  AL = (srcWalFD<0
23790 29 3f 30 3a 31 3b 0a 20 20 20 20 75 6e 69 78 49  )?0:1;.    unixI
237a0 6e 76 61 6c 69 64 61 74 65 53 75 70 70 6f 72 74  nvalidateSupport
237b0 46 69 6c 65 73 28 70 46 69 6c 65 2c 20 73 6b 69  Files(pFile, ski
237c0 70 57 41 4c 29 3b 0a 20 20 7d 0a 20 20 0a 65 6e  pWAL);.  }.  .en
237d0 64 5f 72 65 70 6c 61 63 65 5f 64 61 74 61 62 61  d_replace_databa
237e0 73 65 3a 0a 20 20 69 66 28 20 70 53 72 63 42 74  se:.  if( pSrcBt
237f0 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ree ){.    sqlit
23800 65 33 5f 63 6c 6f 73 65 28 73 72 63 64 62 32 29  e3_close(srcdb2)
23810 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
23820 65 65 4c 65 61 76 65 28 70 53 72 63 42 74 72 65  eeLeave(pSrcBtre
23830 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
23840 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 72  3_mutex_leave(sr
23850 63 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  cdb->mutex);.  i
23860 66 28 20 69 73 44 73 74 43 6f 72 72 75 70 74 20  f( isDstCorrupt 
23870 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 64 65  ){.    sqlite3de
23880 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 5f 63  mo_superunlock_c
23890 6f 72 72 75 70 74 28 69 64 2c 20 63 6f 72 72 75  orrupt(id, corru
238a0 70 74 44 73 74 46 69 6c 65 4c 6f 63 6b 29 3b 0a  ptDstFileLock);.
238b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
238c0 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e  ite3demo_superun
238d0 6c 6f 63 6b 28 70 4c 6f 63 6b 29 3b 0a 20 20 7d  lock(pLock);.  }
238e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
238f0 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46  #define SQLITE_F
23900 49 4c 45 5f 48 45 41 44 45 52 5f 4c 45 4e 20 31  ILE_HEADER_LEN 1
23910 36 0a 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61  6./* Check for a
23920 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c 6f 63   conflicting loc
23930 6b 2e 20 20 49 66 20 6f 6e 65 20 69 73 20 66 6f  k.  If one is fo
23940 75 6e 64 2c 20 70 72 69 6e 74 20 61 6e 20 74 68  und, print an th
23950 69 73 0a 20 2a 2a 20 6f 6e 20 73 74 61 6e 64 61  is. ** on standa
23960 72 64 20 6f 75 74 70 75 74 20 75 73 69 6e 67 20  rd output using 
23970 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  the format strin
23980 67 20 67 69 76 65 6e 20 61 6e 64 20 72 65 74 75  g given and retu
23990 72 6e 20 31 2e 0a 20 2a 2a 20 49 66 20 74 68 65  rn 1.. ** If the
239a0 72 65 20 61 72 65 20 6e 6f 20 63 6f 6e 66 6c 69  re are no confli
239b0 63 74 69 6e 67 20 6c 6f 63 6b 73 2c 20 72 65 74  cting locks, ret
239c0 75 72 6e 20 30 2e 0a 20 2a 2f 0a 73 74 61 74 69  urn 0.. */.stati
239d0 63 20 69 6e 74 20 75 6e 69 78 49 73 4c 6f 63 6b  c int unixIsLock
239e0 65 64 28 0a 20 20 70 69 64 5f 74 20 70 69 64 2c  ed(.  pid_t pid,
239f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
23a00 49 44 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6c  ID to test for l
23a10 6f 63 6b 20 6f 77 6e 65 72 20 2a 2f 0a 20 20 69  ock owner */.  i
23a20 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20  nt h,           
23a30 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
23a40 63 72 69 70 74 6f 72 20 74 6f 20 63 68 65 63 6b  criptor to check
23a50 20 2a 2f 0a 20 20 69 6e 74 20 74 79 70 65 2c 20   */.  int type, 
23a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
23a70 5f 52 44 4c 43 4b 20 6f 72 20 46 5f 57 52 4c 43  _RDLCK or F_WRLC
23a80 4b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  K */.  unsigned 
23a90 69 6e 74 20 69 4f 66 73 74 2c 20 20 20 2f 2a 20  int iOfst,   /* 
23aa0 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  First byte of th
23ab0 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  e lock */.  unsi
23ac0 67 6e 65 64 20 69 6e 74 20 69 43 6e 74 2c 20 20  gned int iCnt,  
23ad0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
23ae0 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b  ytes in the lock
23af0 20 72 61 6e 67 65 20 2a 2f 0a 20 20 63 6f 6e 73   range */.  cons
23b00 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20 20  t char *zType   
23b10 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 6c 6f 63    /* Type of loc
23b20 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  k */.){.  struct
23b30 20 66 6c 6f 63 6b 20 6c 6b 3b 0a 20 20 69 6e 74   flock lk;.  int
23b40 20 65 72 72 3b 0a 20 20 0a 20 20 6d 65 6d 73 65   err;.  .  memse
23b50 74 28 26 6c 6b 2c 20 30 2c 20 73 69 7a 65 6f 66  t(&lk, 0, sizeof
23b60 28 6c 6b 29 29 3b 0a 20 20 6c 6b 2e 6c 5f 74 79  (lk));.  lk.l_ty
23b70 70 65 20 3d 20 74 79 70 65 3b 0a 20 20 6c 6b 2e  pe = type;.  lk.
23b80 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
23b90 53 45 54 3b 0a 20 20 6c 6b 2e 6c 5f 73 74 61 72  SET;.  lk.l_star
23ba0 74 20 3d 20 69 4f 66 73 74 3b 0a 20 20 6c 6b 2e  t = iOfst;.  lk.
23bb0 6c 5f 6c 65 6e 20 3d 20 69 43 6e 74 3b 0a 20 20  l_len = iCnt;.  
23bc0 0a 20 20 69 66 28 20 70 69 64 21 3d 53 51 4c 49  .  if( pid!=SQLI
23bd0 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 41 4e 59  TE_LOCKSTATE_ANY
23be0 50 49 44 20 29 7b 0a 23 69 66 6e 64 65 66 20 46  PID ){.#ifndef F
23bf0 5f 47 45 54 4c 4b 50 49 44 0a 23 20 77 61 72 6e  _GETLKPID.# warn
23c00 69 6e 67 20 46 5f 47 45 54 4c 4b 50 49 44 20 75  ing F_GETLKPID u
23c10 6e 64 65 66 69 6e 65 64 2c 20 5f 73 71 6c 69 74  ndefined, _sqlit
23c20 65 33 5f 6c 6f 63 6b 73 74 61 74 65 20 66 61 6c  e3_lockstate fal
23c30 6c 69 6e 67 20 62 61 63 6b 20 74 6f 20 46 5f 47  ling back to F_G
23c40 45 54 4c 4b 0a 20 20 20 20 65 72 72 20 3d 20 66  ETLK.    err = f
23c50 63 6e 74 6c 28 68 2c 20 46 5f 47 45 54 4c 4b 2c  cntl(h, F_GETLK,
23c60 20 26 6c 6b 29 3b 0a 23 65 6c 73 65 0a 20 20 20   &lk);.#else.   
23c70 20 6c 6b 2e 6c 5f 70 69 64 20 3d 20 70 69 64 3b   lk.l_pid = pid;
23c80 0a 20 20 20 20 65 72 72 20 3d 20 66 63 6e 74 6c  .    err = fcntl
23c90 28 68 2c 20 46 5f 47 45 54 4c 4b 50 49 44 2c 20  (h, F_GETLKPID, 
23ca0 26 6c 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  &lk);.#endif.  }
23cb0 65 6c 73 65 7b 0a 20 20 20 20 65 72 72 20 3d 20  else{.    err = 
23cc0 66 63 6e 74 6c 28 68 2c 20 46 5f 47 45 54 4c 4b  fcntl(h, F_GETLK
23cd0 2c 20 26 6c 6b 29 3b 0a 20 20 7d 0a 20 20 0a 20  , &lk);.  }.  . 
23ce0 20 69 66 28 20 65 72 72 3d 3d 28 2d 31 29 20 29   if( err==(-1) )
23cf0 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
23d00 64 65 72 72 2c 20 22 66 63 6e 74 6c 28 25 64 29  derr, "fcntl(%d)
23d10 20 66 61 69 6c 65 64 3a 20 65 72 72 6e 6f 3d 25   failed: errno=%
23d20 64 5c 6e 22 2c 20 68 2c 20 65 72 72 6e 6f 29 3b  d\n", h, errno);
23d30 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
23d40 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 6c 6b 2e    }.  .  if( lk.
23d50 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20  l_type!=F_UNLCK 
23d60 26 26 20 28 70 69 64 3d 3d 53 51 4c 49 54 45 5f  && (pid==SQLITE_
23d70 4c 4f 43 4b 53 54 41 54 45 5f 41 4e 59 50 49 44  LOCKSTATE_ANYPID
23d80 20 7c 7c 20 6c 6b 2e 6c 5f 70 69 64 3d 3d 70 69   || lk.l_pid==pi
23d90 64 29 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  d) ){.#ifdef SQL
23da0 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 66 70  ITE_DEBUG.    fp
23db0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
23dc0 73 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79 20 25  s lock held by %
23dd0 64 5c 6e 22 2c 20 7a 54 79 70 65 2c 20 28 69 6e  d\n", zType, (in
23de0 74 29 6c 6b 2e 6c 5f 70 69 64 29 3b 0a 23 65 6e  t)lk.l_pid);.#en
23df0 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31  dif.    return 1
23e00 3b 0a 20 20 7d 20 0a 20 20 72 65 74 75 72 6e 20  ;.  } .  return 
23e10 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  0;.}..static int
23e20 20 75 6e 69 78 4c 6f 63 6b 73 74 61 74 65 50 69   unixLockstatePi
23e30 64 28 75 6e 69 78 46 69 6c 65 20 2a 2c 20 70 69  d(unixFile *, pi
23e40 64 5f 74 2c 20 69 6e 74 20 2a 29 3b 0a 0a 23 65  d_t, int *);..#e
23e50 6e 64 69 66 20 2f 2a 20 28 53 51 4c 49 54 45 5f  ndif /* (SQLITE_
23e60 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49  ENABLE_APPLE_SPI
23e70 3e 30 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f  >0) && defined(_
23e80 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 0a 0a 2f  _APPLE__) */.../
23e90 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73  *.** If *pArg is
23ea0 20 69 6e 69 74 69 61 6c 6c 79 20 6e 65 67 61 74   initially negat
23eb0 69 76 65 20 74 68 65 6e 20 74 68 69 73 20 69 73  ive then this is
23ec0 20 61 20 71 75 65 72 79 2e 20 20 53 65 74 20 2a   a query.  Set *
23ed0 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20  pArg to.** 1 or 
23ee0 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  0 depending on w
23ef0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62 69  hether or not bi
23f00 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d  t mask of pFile-
23f10 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73 65  >ctrlFlags is se
23f20 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72  t..**.** If *pAr
23f30 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68 65  g is 0 or 1, the
23f40 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20 74  n clear or set t
23f50 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20 70  he mask bit of p
23f60 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e  File->ctrlFlags.
23f70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
23f80 75 6e 69 78 4d 6f 64 65 42 69 74 28 75 6e 69 78  unixModeBit(unix
23f90 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73  File *pFile, uns
23fa0 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c  igned char mask,
23fb0 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69   int *pArg){.  i
23fc0 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20  f( *pArg<0 ){.  
23fd0 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65    *pArg = (pFile
23fe0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61  ->ctrlFlags & ma
23ff0 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20  sk)!=0;.  }else 
24000 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29  if( (*pArg)==0 )
24010 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
24020 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b  lFlags &= ~mask;
24030 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
24040 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
24050 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = mask;.  }.}../
24060 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
24070 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  ation */.static 
24080 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e  int unixGetTempn
24090 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68  ame(int nBuf, ch
240a0 61 72 20 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a  ar *zBuf);../*.*
240b0 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e  * Information an
240c0 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20  d control of an 
240d0 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65  open file handle
240e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
240f0 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  unixFileControl(
24100 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
24110 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
24120 70 41 72 67 29 7b 0a 20 20 75 6e 69 78 46 69 6c  pArg){.  unixFil
24130 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
24140 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69 74  File*)id;.  swit
24150 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
24160 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
24170 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20  LOCKSTATE: {.   
24180 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
24190 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
241a0 6b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  k;.      return 
241b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
241c0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
241d0 5f 46 43 4e 54 4c 5f 4c 41 53 54 5f 45 52 52 4e  _FCNTL_LAST_ERRN
241e0 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  O: {.      *(int
241f0 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
24200 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
24210 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
24220 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
24230 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  e SQLITE_FCNTL_C
24240 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  HUNK_SIZE: {.   
24250 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e     pFile->szChun
24260 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67  k = *(int *)pArg
24270 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
24280 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
24290 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
242a0 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a  FCNTL_SIZE_HINT:
242b0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b   {.      int rc;
242c0 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
242d0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
242e0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 63 6e 74  .      rc = fcnt
242f0 6c 53 69 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c  lSizeHint(pFile,
24300 20 2a 28 69 36 34 20 2a 29 70 41 72 67 29 3b 0a   *(i64 *)pArg);.
24310 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
24320 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
24330 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
24340 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
24350 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52  SQLITE_FCNTL_PER
24360 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20  SIST_WAL: {.    
24370 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46    unixModeBit(pF
24380 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 45  ile, UNIXFILE_PE
24390 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a  RSIST_WAL, (int*
243a0 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65  )pArg);.      re
243b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
243c0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
243d0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45  QLITE_FCNTL_POWE
243e0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a  RSAFE_OVERWRITE:
243f0 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64   {.      unixMod
24400 65 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58  eBit(pFile, UNIX
24410 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a  FILE_PSOW, (int*
24420 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65  )pArg);.      re
24430 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24440 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
24450 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e  QLITE_FCNTL_VFSN
24460 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63  AME: {.      *(c
24470 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c  har**)pArg = sql
24480 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
24490 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e  ", pFile->pVfs->
244a0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  zName);.      re
244b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
244c0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
244d0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50  QLITE_FCNTL_TEMP
244e0 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20  FILENAME: {.    
244f0 20 20 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d    char *zTFile =
24500 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
24510 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78   pFile->pVfs->mx
24520 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 20 20  Pathname );.    
24530 20 20 69 66 28 20 7a 54 46 69 6c 65 20 29 7b 0a    if( zTFile ){.
24540 20 20 20 20 20 20 20 20 75 6e 69 78 47 65 74 54          unixGetT
24550 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70  empname(pFile->p
24560 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c  Vfs->mxPathname,
24570 20 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20 20 20   zTFile);.      
24580 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20    *(char**)pArg 
24590 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20  = zTFile;.      
245a0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
245b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
245c0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
245d0 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 3a  FCNTL_HAS_MOVED:
245e0 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
245f0 70 41 72 67 20 3d 20 66 69 6c 65 48 61 73 4d 6f  pArg = fileHasMo
24600 76 65 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ved(pFile);.    
24610 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24620 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51  OK;.    }.#if SQ
24630 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
24640 5a 45 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51  ZE>0.    case SQ
24650 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
24660 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 36  SIZE: {.      i6
24670 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69  4 newLimit = *(i
24680 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  64*)pArg;.      
24690 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
246a0 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  OK;.      if( ne
246b0 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c  wLimit>sqlite3Gl
246c0 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61  obalConfig.mxMma
246d0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77  p ){.        new
246e0 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 47  Limit = sqlite3G
246f0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d  lobalConfig.mxMm
24700 61 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ap;.      }.    
24710 20 20 2a 28 69 36 34 2a 29 70 41 72 67 20 3d 20    *(i64*)pArg = 
24720 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
24730 61 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ax;.      if( ne
24740 77 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e 65 77  wLimit>=0 && new
24750 4c 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d  Limit!=pFile->mm
24760 61 70 53 69 7a 65 4d 61 78 20 26 26 20 70 46 69  apSizeMax && pFi
24770 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  le->nFetchOut==0
24780 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
24790 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d  e->mmapSizeMax =
247a0 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20 20 20   newLimit;.     
247b0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d     if( pFile->mm
247c0 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  apSize>0 ){.    
247d0 20 20 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66        unixUnmapf
247e0 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ile(pFile);.    
247f0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4d        rc = unixM
24800 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 2d 31  apfile(pFile, -1
24810 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
24820 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
24830 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  n rc;.    }.#end
24840 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
24850 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68  _DEBUG.    /* Th
24860 65 20 70 61 67 65 72 20 63 61 6c 6c 73 20 74 68  e pager calls th
24870 69 73 20 6d 65 74 68 6f 64 20 74 6f 20 73 69 67  is method to sig
24880 6e 61 6c 20 74 68 61 74 20 69 74 20 68 61 73 20  nal that it has 
24890 64 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 20 72 6f  done.    ** a ro
248a0 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20  llback and that 
248b0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
248c0 74 68 65 72 65 66 6f 72 65 20 75 6e 63 68 61 6e  therefore unchan
248d0 67 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69  ged and.    ** i
248e0 74 20 68 65 6e 63 65 20 69 74 20 69 73 20 4f 4b  t hence it is OK
248f0 20 66 6f 72 20 74 68 65 20 74 72 61 6e 73 61 63   for the transac
24900 74 69 6f 6e 20 63 68 61 6e 67 65 20 63 6f 75 6e  tion change coun
24910 74 65 72 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  ter to be.    **
24920 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20   unchanged..    
24930 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
24940 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
24950 41 4e 47 45 44 3a 20 7b 0a 20 20 20 20 20 20 28  ANGED: {.      (
24960 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
24970 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20  dbUpdate = 0;.  
24980 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24990 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  E_OK;.    }.#end
249a0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  if.#if SQLITE_EN
249b0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
249c0 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
249d0 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73  APPLE__).    cas
249e0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
249f0 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
24a00 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  :.    case SQLIT
24a10 45 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43 4b  E_FCNTL_GET_LOCK
24a20 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20  PROXYFILE: {.   
24a30 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79 46     return proxyF
24a40 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70  ileControl(id,op
24a50 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65  ,pArg);.    }.#e
24a60 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
24a70 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
24a80 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
24a90 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 23 69 66  _APPLE__) */.#if
24aa0 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f   (SQLITE_ENABLE_
24ab0 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26 20  APPLE_SPI>0) && 
24ac0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
24ad0 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  _).    case SQLI
24ae0 54 45 5f 46 43 4e 54 4c 5f 54 52 55 4e 43 41 54  TE_FCNTL_TRUNCAT
24af0 45 5f 44 41 54 41 42 41 53 45 3a 20 7b 0a 20 20  E_DATABASE: {.  
24b00 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 54      return unixT
24b10 72 75 6e 63 61 74 65 44 61 74 61 62 61 73 65 28  runcateDatabase(
24b20 70 46 69 6c 65 2c 20 28 70 41 72 67 20 3f 20 28  pFile, (pArg ? (
24b30 2a 28 69 6e 74 20 2a 29 70 41 72 67 29 20 3a 20  *(int *)pArg) : 
24b40 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  0));.    }.    c
24b50 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
24b60 5f 52 45 50 4c 41 43 45 5f 44 41 54 41 42 41 53  _REPLACE_DATABAS
24b70 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E: {.      retur
24b80 6e 20 75 6e 69 78 52 65 70 6c 61 63 65 44 61 74  n unixReplaceDat
24b90 61 62 61 73 65 28 70 46 69 6c 65 2c 20 28 73 71  abase(pFile, (sq
24ba0 6c 69 74 65 33 20 2a 29 70 41 72 67 29 3b 0a 20  lite3 *)pArg);. 
24bb0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
24bc0 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53  LITE_FCNTL_LOCKS
24bd0 54 41 54 45 5f 50 49 44 3a 20 7b 0a 20 20 20 20  TATE_PID: {.    
24be0 20 20 4c 6f 63 6b 73 74 61 74 65 50 49 44 20 2a    LockstatePID *
24bf0 70 4c 6f 63 6b 73 74 61 74 65 3b 0a 20 20 20 20  pLockstate;.    
24c00 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
24c10 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67 3d  .      if( pArg=
24c20 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  =NULL ){.       
24c30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
24c40 49 53 55 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20  ISUSE;.      }. 
24c50 20 20 20 20 20 70 4c 6f 63 6b 73 74 61 74 65 20       pLockstate 
24c60 3d 20 28 4c 6f 63 6b 73 74 61 74 65 50 49 44 20  = (LockstatePID 
24c70 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72 63  *)pArg;.      rc
24c80 20 3d 20 75 6e 69 78 4c 6f 63 6b 73 74 61 74 65   = unixLockstate
24c90 50 69 64 28 70 46 69 6c 65 2c 20 70 4c 6f 63 6b  Pid(pFile, pLock
24ca0 73 74 61 74 65 2d 3e 70 69 64 2c 20 26 28 70 4c  state->pid, &(pL
24cb0 6f 63 6b 73 74 61 74 65 2d 3e 73 74 61 74 65 29  ockstate->state)
24cc0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
24cd0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 20 20  rc;.    }.      
24ce0 0a 23 65 6e 64 69 66 20 2f 2a 20 28 53 51 4c 49  .#endif /* (SQLI
24cf0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f  TE_ENABLE_APPLE_
24d00 53 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65  SPI>0) && define
24d10 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a  d(__APPLE__) */.
24d20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
24d30 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a  ITE_NOTFOUND;.}.
24d40 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
24d50 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e  e sector size in
24d60 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e   bytes of the un
24d70 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64  derlying block d
24d80 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65  evice for.** the
24d90 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e   specified file.
24da0 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20   This is almost 
24db0 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73  always 512 bytes
24dc0 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20  , but may be.** 
24dd0 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20  larger for some 
24de0 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53  devices..**.** S
24df0 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d  QLite code assum
24e00 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  es this function
24e10 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74   cannot fail. It
24e20 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68   also assumes th
24e30 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c  at.** if two fil
24e40 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69  es are created i
24e50 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d  n the same file-
24e60 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79  system directory
24e70 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61   (i.e..** a data
24e80 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75  base and its jou
24e90 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20  rnal file) that 
24ea0 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
24eb0 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73  will be the.** s
24ec0 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f  ame for both..*/
24ed0 0a 23 69 66 6e 64 65 66 20 5f 5f 51 4e 58 4e 54  .#ifndef __QNXNT
24ee0 4f 5f 5f 20 0a 73 74 61 74 69 63 20 69 6e 74 20  O__ .static int 
24ef0 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73  unixSectorSize(s
24f00 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
24f10 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
24f20 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
24f30 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  d);.  return SQL
24f40 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
24f50 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 23 65 6e 64 69  OR_SIZE;.}.#endi
24f60 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
24f70 6c 6f 77 69 6e 67 20 76 65 72 73 69 6f 6e 20 6f  lowing version o
24f80 66 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65  f unixSectorSize
24f90 28 29 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20  () is optimized 
24fa0 66 6f 72 20 51 4e 58 2e 0a 2a 2f 0a 23 69 66 64  for QNX..*/.#ifd
24fb0 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 23 69  ef __QNXNTO__.#i
24fc0 6e 63 6c 75 64 65 20 3c 73 79 73 2f 64 63 6d 64  nclude <sys/dcmd
24fd0 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  _blk.h>.#include
24fe0 20 3c 73 79 73 2f 73 74 61 74 76 66 73 2e 68 3e   <sys/statvfs.h>
24ff0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
25000 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74  SectorSize(sqlit
25010 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
25020 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
25030 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
25040 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 65  .  if( pFile->se
25050 63 74 6f 72 53 69 7a 65 20 3d 3d 20 30 20 29 7b  ctorSize == 0 ){
25060 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
25070 76 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20  vfs fsInfo;.    
25080 20 20 20 0a 20 20 20 20 2f 2a 20 53 65 74 20 64     .    /* Set d
25090 65 66 61 75 6c 74 73 20 66 6f 72 20 6e 6f 6e 2d  efaults for non-
250a0 73 75 70 70 6f 72 74 65 64 20 66 69 6c 65 73 79  supported filesy
250b0 73 74 65 6d 73 20 2a 2f 0a 20 20 20 20 70 46 69  stems */.    pFi
250c0 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
250d0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
250e0 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 20  SECTOR_SIZE;.   
250f0 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
25100 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 20  aracteristics = 
25110 30 3b 0a 20 20 20 20 69 66 28 20 66 73 74 61 74  0;.    if( fstat
25120 76 66 73 28 70 46 69 6c 65 2d 3e 68 2c 20 26 66  vfs(pFile->h, &f
25130 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20 7b  sInfo) == -1 ) {
25140 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 46  .      return pF
25150 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ile->sectorSize;
25160 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
25170 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66  !strcmp(fsInfo.f
25180 5f 62 61 73 65 74 79 70 65 2c 20 22 74 6d 70 22  _basetype, "tmp"
25190 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ) ) {.      pFil
251a0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  e->sectorSize = 
251b0 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a  fsInfo.f_bsize;.
251c0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76        pFile->dev
251d0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
251e0 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c  cs =.        SQL
251f0 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
25200 34 4b 20 7c 20 20 20 20 20 20 20 2f 2a 20 41 6c  4K |       /* Al
25210 6c 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  l ram filesystem
25220 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d   writes are atom
25230 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  ic */.        SQ
25240 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
25250 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67  APPEND |    /* g
25260 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20  rowing the file 
25270 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
25280 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20  ntil.           
25290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252a0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
252b0 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73  e write succeeds
252c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
252d0 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
252e0 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65  IAL |     /* The
252f0 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
25300 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68  has no write beh
25310 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ind.            
25320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25330 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
25340 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f  it is ordered */
25350 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
25360 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73 74 72  }else if( strstr
25370 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79  (fsInfo.f_basety
25380 70 65 2c 20 22 65 74 66 73 22 29 20 29 7b 0a 20  pe, "etfs") ){. 
25390 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74       pFile->sect
253a0 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e  orSize = fsInfo.
253b0 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70  f_bsize;.      p
253c0 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
253d0 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20  acteristics =.  
253e0 20 20 20 20 20 20 2f 2a 20 65 74 66 73 20 63 6c        /* etfs cl
253f0 75 73 74 65 72 20 73 69 7a 65 20 77 72 69 74 65  uster size write
25400 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a  s are atomic */.
25410 20 20 20 20 20 20 20 20 28 70 46 69 6c 65 2d 3e          (pFile->
25420 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32  sectorSize / 512
25430 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   * SQLITE_IOCAP_
25440 41 54 4f 4d 49 43 35 31 32 29 20 7c 0a 20 20 20  ATOMIC512) |.   
25450 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
25460 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20  P_SAFE_APPEND | 
25470 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68     /* growing th
25480 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
25490 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20  occur until.    
254a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254c0 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73    ** the write s
254d0 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20  ucceeds */.     
254e0 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
254f0 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20  SEQUENTIAL |    
25500 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65   /* The ram file
25510 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72  system has no wr
25520 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20  ite behind.     
25530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25550 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64   ** so it is ord
25560 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
25570 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
25580 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e   !strcmp(fsInfo.
25590 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71 6e 78  f_basetype, "qnx
255a0 36 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  6") ){.      pFi
255b0 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
255c0 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
255d0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
255e0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
255f0 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51  ics =.        SQ
25600 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
25610 43 20 7c 20 20 20 20 20 20 20 20 20 2f 2a 20 41  C |         /* A
25620 6c 6c 20 66 69 6c 65 73 79 73 74 65 6d 20 77 72  ll filesystem wr
25630 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20  ites are atomic 
25640 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  */.        SQLIT
25650 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
25660 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77  END |    /* grow
25670 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65  ing the file doe
25680 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69  s not occur unti
25690 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l.              
256a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256b0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77          ** the w
256c0 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f  rite succeeds */
256d0 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
256e0 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
256f0 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61   |     /* The ra
25700 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73  m filesystem has
25710 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64   no write behind
25720 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25740 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20         ** so it 
25750 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20  is ordered */.  
25760 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c        0;.    }el
25770 73 65 20 69 66 28 20 21 73 74 72 63 6d 70 28 66  se if( !strcmp(f
25780 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65  sInfo.f_basetype
25790 2c 20 22 71 6e 78 34 22 29 20 29 7b 0a 20 20 20  , "qnx4") ){.   
257a0 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72     pFile->sector
257b0 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f  Size = fsInfo.f_
257c0 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69  bsize;.      pFi
257d0 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
257e0 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20  teristics =.    
257f0 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73      /* full bits
25800 65 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66 72  et of atomics fr
25810 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73 69  om max sector si
25820 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a  ze and smaller *
25830 2f 0a 20 20 20 20 20 20 20 20 28 28 70 46 69 6c  /.        ((pFil
25840 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20  e->sectorSize / 
25850 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43  512 * SQLITE_IOC
25860 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c  AP_ATOMIC512) <<
25870 20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20 20   1) - 2 |.      
25880 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
25890 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20  EQUENTIAL |     
258a0 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73  /* The ram files
258b0 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69  ystem has no wri
258c0 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20  te behind.      
258d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258f0 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65  ** so it is orde
25900 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30  red */.        0
25910 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
25920 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f  strstr(fsInfo.f_
25930 62 61 73 65 74 79 70 65 2c 20 22 64 6f 73 22 29  basetype, "dos")
25940 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
25950 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73  >sectorSize = fs
25960 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20  Info.f_bsize;.  
25970 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
25980 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
25990 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 75   =.        /* fu
259a0 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74 6f  ll bitset of ato
259b0 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73 65  mics from max se
259c0 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73 6d  ctor size and sm
259d0 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  aller */.       
259e0 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72   ((pFile->sector
259f0 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c  Size / 512 * SQL
25a00 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
25a10 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c  512) << 1) - 2 |
25a20 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
25a30 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
25a40 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61   |     /* The ra
25a50 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73  m filesystem has
25a60 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64   no write behind
25a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a90 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20         ** so it 
25aa0 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20  is ordered */.  
25ab0 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c        0;.    }el
25ac0 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
25ad0 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
25ae0 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20  istics =.       
25af0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
25b00 4f 4d 49 43 35 31 32 20 7c 20 20 20 20 20 20 2f  OMIC512 |      /
25b10 2a 20 62 6c 6f 63 6b 73 20 61 72 65 20 61 74 6f  * blocks are ato
25b20 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  mic */.        S
25b30 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
25b40 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20  _APPEND |    /* 
25b50 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  growing the file
25b60 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
25b70 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20  until.          
25b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b90 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
25ba0 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64  he write succeed
25bb0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a  s */.        0;.
25bc0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4c      }.  }.  /* L
25bd0 61 73 74 20 63 68 61 6e 63 65 20 76 65 72 69 66  ast chance verif
25be0 69 63 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  ication.  If the
25bf0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 6e   sector size isn
25c00 27 74 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66  't a multiple of
25c10 20 35 31 32 0a 20 20 2a 2a 20 74 68 65 6e 20 69   512.  ** then i
25c20 74 20 69 73 6e 27 74 20 76 61 6c 69 64 2e 2a 2f  t isn't valid.*/
25c30 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 65  .  if( pFile->se
25c40 63 74 6f 72 53 69 7a 65 20 25 20 35 31 32 20 21  ctorSize % 512 !
25c50 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  = 0 ){.    pFile
25c60 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
25c70 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20 20  ristics = 0;.   
25c80 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
25c90 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ze = SQLITE_DEFA
25ca0 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  ULT_SECTOR_SIZE;
25cb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 46  .  }.  return pF
25cc0 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ile->sectorSize;
25cd0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 51  .}.#endif /* __Q
25ce0 4e 58 4e 54 4f 5f 5f 20 2a 2f 0a 0a 2f 2a 0a 2a  NXNTO__ */../*.*
25cf0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76  * Return the dev
25d00 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
25d10 69 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ics for the file
25d20 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 56 46 53  ..**.** This VFS
25d30 20 69 73 20 73 65 74 20 75 70 20 74 6f 20 72 65   is set up to re
25d40 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41  turn SQLITE_IOCA
25d50 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
25d60 57 52 49 54 45 20 62 79 20 64 65 66 61 75 6c 74  WRITE by default
25d70 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68  ..** However, th
25d80 61 74 20 63 68 6f 69 63 65 20 69 73 20 63 6f 6e  at choice is con
25d90 74 72 6f 76 65 72 73 69 61 6c 20 73 69 6e 63 65  troversial since
25da0 20 74 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65   technically the
25db0 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 66   underlying.** f
25dc0 69 6c 65 20 73 79 73 74 65 6d 20 64 6f 65 73 20  ile system does 
25dd0 6e 6f 74 20 61 6c 77 61 79 73 20 70 72 6f 76 69  not always provi
25de0 64 65 20 70 6f 77 65 72 73 61 66 65 20 6f 76 65  de powersafe ove
25df0 72 77 72 69 74 65 73 2e 20 20 28 49 6e 20 6f 74  rwrites.  (In ot
25e00 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 66  her.** words, af
25e10 74 65 72 20 61 20 70 6f 77 65 72 2d 6c 6f 73 73  ter a power-loss
25e20 20 65 76 65 6e 74 2c 20 70 61 72 74 73 20 6f 66   event, parts of
25e30 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77   the file that w
25e40 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20 77 72 69  ere never.** wri
25e50 74 74 65 6e 20 6d 69 67 68 74 20 65 6e 64 20 75  tten might end u
25e60 70 20 62 65 69 6e 67 20 61 6c 74 65 72 65 64 2e  p being altered.
25e70 29 20 20 48 6f 77 65 76 65 72 2c 20 6e 6f 6e 2d  )  However, non-
25e80 50 53 4f 57 20 62 65 68 61 76 69 6f 72 20 69 73  PSOW behavior is
25e90 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72 79 20 72   very,.** very r
25ea0 61 72 65 2e 20 20 41 6e 64 20 61 73 73 65 72 74  are.  And assert
25eb0 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65 73 20 61  ing PSOW makes a
25ec0 20 6c 61 72 67 65 20 72 65 64 75 63 74 69 6f 6e   large reduction
25ed0 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a   in the amount.*
25ee0 2a 20 6f 66 20 72 65 71 75 69 72 65 64 20 49 2f  * of required I/
25ef0 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e 67  O for journaling
25f00 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74 20 6f 66  , since a lot of
25f10 20 70 61 64 64 69 6e 67 20 69 73 20 65 6c 69 6d   padding is elim
25f20 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48 65 6e 63  inated..**  Henc
25f30 65 2c 20 77 68 69 6c 65 20 50 4f 57 45 52 53 41  e, while POWERSA
25f40 46 45 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20  FE_OVERWRITE is 
25f50 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 2c 20 74  on by default, t
25f60 68 65 72 65 20 69 73 20 61 20 66 69 6c 65 2d 63  here is a file-c
25f70 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c 61  ontrol.** availa
25f80 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f  ble to turn it o
25f90 66 66 20 61 6e 64 20 55 52 49 20 71 75 65 72 79  ff and URI query
25fa0 20 70 61 72 61 6d 65 74 65 72 20 61 76 61 69 6c   parameter avail
25fb0 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20  able to turn it 
25fc0 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  off..*/.static i
25fd0 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68 61  nt unixDeviceCha
25fe0 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c  racteristics(sql
25ff0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
26000 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20    unixFile *p = 
26010 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
26020 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69 66   int rc = 0;.#if
26030 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 20  def __QNXNTO__. 
26040 20 69 66 28 20 70 2d 3e 73 65 63 74 6f 72 53 69   if( p->sectorSi
26050 7a 65 3d 3d 30 20 29 20 75 6e 69 78 53 65 63 74  ze==0 ) unixSect
26060 6f 72 53 69 7a 65 28 69 64 29 3b 0a 20 20 72 63  orSize(id);.  rc
26070 20 3d 20 70 2d 3e 64 65 76 69 63 65 43 68 61 72   = p->deviceChar
26080 61 63 74 65 72 69 73 74 69 63 73 3b 0a 23 65 6e  acteristics;.#en
26090 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 63 74 72  dif.  if( p->ctr
260a0 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
260b0 45 5f 50 53 4f 57 20 29 7b 0a 20 20 20 20 72 63  E_PSOW ){.    rc
260c0 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41 50   |= SQLITE_IOCAP
260d0 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
260e0 52 49 54 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RITE;.  }.  retu
260f0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64  rn rc;.}..#if !d
26100 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
26110 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
26120 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
26130 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  0../*.** Return 
26140 74 68 65 20 73 79 73 74 65 6d 20 70 61 67 65 20  the system page 
26150 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  size..**.** This
26160 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
26170 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 64   not be called d
26180 69 72 65 63 74 6c 79 20 62 79 20 6f 74 68 65 72  irectly by other
26190 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69   code in this fi
261a0 6c 65 2e 20 0a 2a 2a 20 49 6e 73 74 65 61 64 2c  le. .** Instead,
261b0 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 63 61   it should be ca
261c0 6c 6c 65 64 20 76 69 61 20 6d 61 63 72 6f 20 6f  lled via macro o
261d0 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 2e 0a  sGetpagesize()..
261e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
261f0 69 78 47 65 74 70 61 67 65 73 69 7a 65 28 76 6f  ixGetpagesize(vo
26200 69 64 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  id){.#if defined
26210 28 5f 42 53 44 5f 53 4f 55 52 43 45 29 0a 20 20  (_BSD_SOURCE).  
26220 72 65 74 75 72 6e 20 67 65 74 70 61 67 65 73 69  return getpagesi
26230 7a 65 28 29 3b 0a 23 65 6c 73 65 0a 20 20 72 65  ze();.#else.  re
26240 74 75 72 6e 20 28 69 6e 74 29 73 79 73 63 6f 6e  turn (int)syscon
26250 66 28 5f 53 43 5f 50 41 47 45 53 49 5a 45 29 3b  f(_SC_PAGESIZE);
26260 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 65 6e 64 69  .#endif.}..#endi
26270 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
26280 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c  LITE_OMIT_WAL) |
26290 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  | SQLITE_MAX_MMA
262a0 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 23 69 66  P_SIZE>0 */..#if
262b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
262c0 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65  _WAL../*.** Obje
262d0 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ct used to repre
262e0 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20 6d  sent an shared m
262f0 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20 0a  emory buffer.  .
26300 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74 69  **.** When multi
26310 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20  ple threads all 
26320 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61  reference the sa
26330 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65 61  me wal-index, ea
26340 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61 73  ch thread.** has
26350 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68 6d   its own unixShm
26360 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65   object, but the
26370 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 61  y all point to a
26380 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65   single instance
26390 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69 78  .** of this unix
263a0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e 20  ShmNode object. 
263b0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
263c0 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78 20   each wal-index 
263d0 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c  is opened.** onl
263e0 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65  y once per proce
263f0 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 75  ss..**.** Each u
26400 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
26410 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74  t is connected t
26420 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78 49  o a single unixI
26430 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  nodeInfo object.
26440 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f 61  .** We could coa
26450 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65 63  lesce this objec
26460 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64 65  t into unixInode
26470 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20 77  Info, but that w
26480 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76 65  ould mean.** eve
26490 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68 61  ry open file tha
264a0 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 73  t does not use s
264b0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69 6e  hared memory (in
264c0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 6f   other words, mo
264d0 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65 73  st.** open files
264e0 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f 20  ) would have to 
264f0 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68 69  carry around thi
26500 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  s extra informat
26510 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65 20  ion.  So.** the 
26520 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
26530 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  ject contains a 
26540 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
26550 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
26560 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75 6e  ct.** and the un
26570 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
26580 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c 79   is created only
26590 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a   when needed..**
265a0 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  .** unixMutexHel
265b0 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65  d() must be true
265c0 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f   when creating o
265d0 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20  r destroying.** 
265e0 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77  this object or w
265f0 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20  hile reading or 
26600 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c  writing the foll
26610 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a  owing fields:.**
26620 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a  .**      nRef.**
26630 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
26640 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  g fields are rea
26650 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65  d-only after the
26660 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
26670 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20  ed:.** .**      
26680 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c  fid.**      zFil
26690 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68  ename.**.** Eith
266a0 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6d  er unixShmNode.m
266b0 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
266c0 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65  d or unixShmNode
266d0 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20  .nRef==0 and.** 
266e0 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
266f0 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61  is true when rea
26700 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
26710 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a  any other field.
26720 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ** in this struc
26730 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ture..*/.struct 
26740 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20 20  unixShmNode {.  
26750 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
26760 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75 6e  Inode;     /* un
26770 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61 74  ixInodeInfo that
26780 20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20 6e   owns this SHM n
26790 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
267a0 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20  _mutex *mutex;  
267b0 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20      /* Mutex to 
267c0 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65  access this obje
267d0 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  ct */.  char *zF
267e0 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
267f0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
26800 65 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a  e mmapped file *
26810 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20  /.  int h;      
26820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26830 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  * Open file desc
26840 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  riptor */.  int 
26850 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  szRegion;       
26860 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
26870 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  f shared-memory 
26880 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31 36  regions */.  u16
26890 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20   nRegion;       
268a0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
268b0 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69 6f  of array apRegio
268c0 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52 65 61 64  n */.  u8 isRead
268d0 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20  only;           
268e0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61    /* True if rea
268f0 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68 61 72  d-only */.  char
26900 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20 20   **apRegion;    
26910 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
26920 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72 65 64  of mapped shared
26930 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20  -memory regions 
26940 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
26950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26960 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69  /* Number of uni
26970 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69  xShm objects poi
26980 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f  nting to this */
26990 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69 72  .  unixShm *pFir
269a0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
269b0 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62 6a   All unixShm obj
269c0 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ects pointing to
269d0 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66 20   this */.#ifdef 
269e0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75  SQLITE_DEBUG.  u
269f0 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20  8 exclMask;     
26a00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
26a10 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c  k of exclusive l
26a20 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
26a30 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20  8 sharedMask;   
26a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
26a50 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b  k of shared lock
26a60 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 6e  s held */.  u8 n
26a70 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20  extShmId;       
26a80 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61         /* Next a
26a90 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68 6d  vailable unixShm
26aa0 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e  .id value */.#en
26ab0 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74  dif.};../*.** St
26ac0 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74  ructure used int
26ad0 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20  ernally by this 
26ae0 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68  VFS to record th
26af0 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a  e state of an.**
26b00 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d   open shared mem
26b10 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ory connection..
26b20 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
26b30 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 69  ing fields are i
26b40 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20  nitialized when 
26b50 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63  this object is c
26b60 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72  reated and.** ar
26b70 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72  e read-only ther
26b80 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20  eafter:.**.**   
26b90 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a 2a   unixShm.pFile.*
26ba0 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64 0a  *    unixShm.id.
26bb0 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20  **.** All other 
26bc0 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f  fields are read/
26bd0 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e 69 78  write.  The unix
26be0 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65 78  Shm.pFile->mutex
26bf0 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a   must be held.**
26c00 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67   while accessing
26c10 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20   any read/write 
26c20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63  fields..*/.struc
26c30 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75 6e  t unixShm {.  un
26c40 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
26c50 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ode;     /* The 
26c60 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69 78 53  underlying unixS
26c70 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f  hmNode object */
26c80 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65 78  .  unixShm *pNex
26c90 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
26ca0 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20 77 69   Next unixShm wi
26cb0 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e 69 78  th the same unix
26cc0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20  ShmNode */.  u8 
26cd0 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20  hasMutex;       
26ce0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
26cf0 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 75  if holding the u
26d00 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78  nixShmNode mutex
26d10 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20 20 20   */.  u8 id;    
26d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d30 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63   /* Id of this c
26d40 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 69 6e  onnection within
26d50 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65   its unixShmNode
26d60 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64   */.  u16 shared
26d70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
26d80 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
26d90 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
26da0 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b  .  u16 exclMask;
26db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26dc0 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
26dd0 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
26de0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  .};../*.** Const
26df0 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f  ants used for lo
26e00 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65  cking.*/.#define
26e10 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20 20   UNIX_SHM_BASE  
26e20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d   ((22+SQLITE_SHM
26e30 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20  _NLOCK)*4)      
26e40 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b     /* first lock
26e50 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65   byte */.#define
26e60 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20   UNIX_SHM_DMS   
26e70 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2b   (UNIX_SHM_BASE+
26e80 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
26e90 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77  )  /* deadman sw
26ea0 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  itch */../*.** A
26eb0 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69 73  pply posix advis
26ec0 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c  ory locks for al
26ed0 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66 73  l bytes from ofs
26ee0 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b 6e  t through ofst+n
26ef0 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20  -1..**.** Locks 
26f00 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61 73  block if the mas
26f10 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e 49  k is exactly UNI
26f20 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65 20  X_SHM_C and are 
26f30 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  non-blocking.** 
26f40 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
26f50 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
26f60 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e  SystemLock(.  un
26f70 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
26f80 6f 64 65 2c 20 2f 2a 20 41 70 70 6c 79 20 6c 6f  ode, /* Apply lo
26f90 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e  cks to this open
26fa0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
26fb0 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  egment */.  int 
26fc0 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20  lockType,       
26fd0 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46     /* F_UNLCK, F
26fe0 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52 4c  _RDLCK, or F_WRL
26ff0 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74  CK */.  int ofst
27000 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
27010 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
27020 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67  the locking rang
27030 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20 20  e */.  int n    
27040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27050 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
27060 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20   to lock */.){. 
27070 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b   struct flock f;
27080 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f         /* The po
27090 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  six advisory loc
270a0 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 2a  king structure *
270b0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
270c0 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 52 65 73  ITE_OK;   /* Res
270d0 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 66 63  ult code form fc
270e0 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41  ntl() */..  /* A
270f0 63 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e 69  ccess to the uni
27100 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
27110 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79  is serialized by
27120 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20   the caller */. 
27130 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
27140 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 53 68 6d  _mutex_held(pShm
27150 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20  Node->mutex) || 
27160 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  pShmNode->nRef==
27170 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 68 61 72 65  0 );..  /* Share
27180 64 20 6c 6f 63 6b 73 20 6e 65 76 65 72 20 73 70  d locks never sp
27190 61 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  an more than one
271a0 20 62 79 74 65 20 2a 2f 0a 20 20 61 73 73 65 72   byte */.  asser
271b0 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54  t( n==1 || lockT
271c0 79 70 65 21 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a  ype!=F_RDLCK );.
271d0 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20 61 72 65 20  .  /* Locks are 
271e0 77 69 74 68 69 6e 20 72 61 6e 67 65 20 2a 2f 0a  within range */.
271f0 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 26    assert( n>=1 &
27200 26 20 6e 3c 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  & n<SQLITE_SHM_N
27210 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70  LOCK );..  if( p
27220 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b  ShmNode->h>=0 ){
27230 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
27240 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70  ze the locking p
27250 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20  arameters */.   
27260 20 6d 65 6d 73 65 74 28 26 66 2c 20 30 2c 20 73   memset(&f, 0, s
27270 69 7a 65 6f 66 28 66 29 29 3b 0a 20 20 20 20 66  izeof(f));.    f
27280 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f 63 6b 54 79  .l_type = lockTy
27290 70 65 3b 0a 20 20 20 20 66 2e 6c 5f 77 68 65 6e  pe;.    f.l_when
272a0 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
272b0 20 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20 6f     f.l_start = o
272c0 66 73 74 3b 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e  fst;.    f.l_len
272d0 20 3d 20 6e 3b 0a 0a 20 20 20 20 72 63 20 3d 20   = n;..    rc = 
272e0 6f 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65  osFcntl(pShmNode
272f0 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 66  ->h, F_SETLK, &f
27300 29 3b 0a 20 20 20 20 72 63 20 3d 20 28 72 63 21  );.    rc = (rc!
27310 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45 5f  =(-1)) ? SQLITE_
27320 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59  OK : SQLITE_BUSY
27330 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  ;.  }..  /* Upda
27340 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 6f  te the global lo
27350 63 6b 20 73 74 61 74 65 20 61 6e 64 20 64 6f 20  ck state and do 
27360 64 65 62 75 67 20 74 72 61 63 69 6e 67 20 2a 2f  debug tracing */
27370 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
27380 45 42 55 47 0a 20 20 7b 20 75 31 36 20 6d 61 73  EBUG.  { u16 mas
27390 6b 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  k;.  OSTRACE(("S
273a0 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20 20 6d  HM-LOCK "));.  m
273b0 61 73 6b 20 3d 20 6f 66 73 74 3e 33 31 20 3f 20  ask = ofst>31 ? 
273c0 30 78 66 66 66 66 20 3a 20 28 31 3c 3c 28 6f 66  0xffff : (1<<(of
273d0 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73  st+n)) - (1<<ofs
273e0 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
273f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
27400 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55  f( lockType==F_U
27410 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  NLCK ){.      OS
27420 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25  TRACE(("unlock %
27430 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20  d ok", ofst));. 
27440 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65       pShmNode->e
27450 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  xclMask &= ~mask
27460 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
27470 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20  ->sharedMask &= 
27480 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  ~mask;.    }else
27490 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
274a0 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _RDLCK ){.      
274b0 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c  OSTRACE(("read-l
274c0 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74  ock %d ok", ofst
274d0 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ));.      pShmNo
274e0 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20  de->exclMask &= 
274f0 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68  ~mask;.      pSh
27500 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
27510 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d  k |= mask;.    }
27520 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
27530 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  rt( lockType==F_
27540 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f  WRLCK );.      O
27550 53 54 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c  STRACE(("write-l
27560 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74  ock %d ok", ofst
27570 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ));.      pShmNo
27580 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20  de->exclMask |= 
27590 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d  mask;.      pShm
275a0 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
275b0 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d   &= ~mask;.    }
275c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
275d0 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e  ( lockType==F_UN
275e0 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  LCK ){.      OST
275f0 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64  RACE(("unlock %d
27600 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29   failed", ofst))
27610 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
27620 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43  lockType==F_RDLC
27630 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  K ){.      OSTRA
27640 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 66  CE(("read-lock f
27650 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d 65  ailed"));.    }e
27660 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
27670 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57  t( lockType==F_W
27680 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53  RLCK );.      OS
27690 54 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f  TRACE(("write-lo
276a0 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f  ck %d failed", o
276b0 66 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  fst));.    }.  }
276c0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 20 2d 20  .  OSTRACE((" - 
276d0 61 66 74 65 72 77 61 72 64 73 20 25 30 33 78 2c  afterwards %03x,
276e0 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %03x\n",.       
276f0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68      pShmNode->sh
27700 61 72 65 64 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f  aredMask, pShmNo
27710 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a  de->exclMask));.
27720 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
27730 74 75 72 6e 20 72 63 3b 20 20 20 20 20 20 20 20  turn rc;        
27740 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
27750 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6e 75 6d   the minimum num
27760 62 65 72 20 6f 66 20 33 32 4b 42 20 73 68 6d 20  ber of 32KB shm 
27770 72 65 67 69 6f 6e 73 20 74 68 61 74 20 73 68 6f  regions that sho
27780 75 6c 64 20 62 65 20 6d 61 70 70 65 64 20 61 74  uld be mapped at
27790 0a 2a 2a 20 61 20 74 69 6d 65 2c 20 61 73 73 75  .** a time, assu
277a0 6d 69 6e 67 20 74 68 61 74 20 65 61 63 68 20 6d  ming that each m
277b0 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20 61  apping must be a
277c0 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70  n integer multip
277d0 6c 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72  le of the.** cur
277e0 72 65 6e 74 20 73 79 73 74 65 6d 20 70 61 67 65  rent system page
277f0 2d 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 75  -size..**.** Usu
27800 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 31 2e  ally, this is 1.
27810 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 73   The exception s
27820 65 65 6d 73 20 74 6f 20 62 65 20 73 79 73 74 65  eems to be syste
27830 6d 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 66  ms that are conf
27840 69 67 75 72 65 64 0a 2a 2a 20 74 6f 20 75 73 65  igured.** to use
27850 20 36 34 4b 42 20 70 61 67 65 73 20 2d 20 69 6e   64KB pages - in
27860 20 74 68 69 73 20 63 61 73 65 20 65 61 63 68 20   this case each 
27870 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 63 6f 76  mapping must cov
27880 65 72 20 61 74 20 6c 65 61 73 74 20 74 77 6f 0a  er at least two.
27890 2a 2a 20 73 68 6d 20 72 65 67 69 6f 6e 73 2e 0a  ** shm regions..
278a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
278b0 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61  ixShmRegionPerMa
278c0 70 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 73  p(void){.  int s
278d0 68 6d 73 7a 20 3d 20 33 32 2a 31 30 32 34 3b 20  hmsz = 32*1024; 
278e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 48             /* SH
278f0 4d 20 72 65 67 69 6f 6e 20 73 69 7a 65 20 2a 2f  M region size */
27900 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 6f 73  .  int pgsz = os
27910 47 65 74 70 61 67 65 73 69 7a 65 28 29 3b 20 20  Getpagesize();  
27920 20 2f 2a 20 53 79 73 74 65 6d 20 70 61 67 65 20   /* System page 
27930 73 69 7a 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  size */.  assert
27940 28 20 28 28 70 67 73 7a 2d 31 29 26 70 67 73 7a  ( ((pgsz-1)&pgsz
27950 29 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 50 61 67  )==0 );   /* Pag
27960 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61  e size must be a
27970 20 70 6f 77 65 72 20 6f 66 20 32 20 2a 2f 0a 20   power of 2 */. 
27980 20 69 66 28 20 70 67 73 7a 3c 73 68 6d 73 7a 20   if( pgsz<shmsz 
27990 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
279a0 74 75 72 6e 20 70 67 73 7a 2f 73 68 6d 73 7a 3b  turn pgsz/shmsz;
279b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20  .}../*.** Purge 
279c0 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 4c  the unixShmNodeL
279d0 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ist list of all 
279e0 65 6e 74 72 69 65 73 20 77 69 74 68 20 75 6e 69  entries with uni
279f0 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30  xShmNode.nRef==0
27a00 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
27a10 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64  not a VFS shared
27a20 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20  -memory method; 
27a30 69 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20  it is a utility 
27a40 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a  function called.
27a50 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64  ** by VFS shared
27a60 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e  -memory methods.
27a70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
27a80 75 6e 69 78 53 68 6d 50 75 72 67 65 28 75 6e 69  unixShmPurge(uni
27a90 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 75  xFile *pFd){.  u
27aa0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 20 3d 20  nixShmNode *p = 
27ab0 70 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  pFd->pInode->pSh
27ac0 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  mNode;.  assert(
27ad0 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
27ae0 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70   );.  if( p && p
27af0 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
27b00 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d 61 70 20   int nShmPerMap 
27b10 3d 20 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50  = unixShmRegionP
27b20 65 72 4d 61 70 28 29 3b 0a 20 20 20 20 69 6e 74  erMap();.    int
27b30 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   i;.    assert( 
27b40 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e  p->pInode==pFd->
27b50 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 73 71  pInode );.    sq
27b60 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
27b70 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  (p->mutex);.    
27b80 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52  for(i=0; i<p->nR
27b90 65 67 69 6f 6e 3b 20 69 2b 3d 6e 53 68 6d 50 65  egion; i+=nShmPe
27ba0 72 4d 61 70 29 7b 0a 20 20 20 20 20 20 69 66 28  rMap){.      if(
27bb0 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20   p->h>=0 ){.    
27bc0 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 2d 3e      osMunmap(p->
27bd0 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e  apRegion[i], p->
27be0 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20  szRegion);.     
27bf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27c00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
27c10 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20  apRegion[i]);.  
27c20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
27c30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
27c40 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69  apRegion);.    i
27c50 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  f( p->h>=0 ){.  
27c60 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
27c70 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49  (pFd, p->h, __LI
27c80 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e  NE__);.      p->
27c90 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  h = -1;.    }.  
27ca0 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68    p->pInode->pSh
27cb0 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73  mNode = 0;.    s
27cc0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
27cd0 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e    }.}..#if defin
27ce0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
27cf0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
27d00 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61  OCKING_STYLE.sta
27d10 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
27d20 70 72 6f 78 79 53 68 61 72 65 64 4d 65 6d 6f 72  proxySharedMemor
27d30 79 42 61 73 65 50 61 74 68 28 75 6e 69 78 46 69  yBasePath(unixFi
27d40 6c 65 20 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  le *);.#endif../
27d50 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61 72  *.** Open a shar
27d60 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61  ed-memory area a
27d70 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6f  ssociated with o
27d80 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
27d90 65 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54 68  e pDbFd.  .** Th
27da0 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 69 6d  is particular im
27db0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65  plementation use
27dc0 73 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73 2e  s mmapped files.
27dd0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20  .**.** The file 
27de0 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
27df0 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  t shared-memory 
27e00 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  is in the same d
27e10 69 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20 74  irectory.** as t
27e20 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
27e30 20 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74 68   file and has th
27e40 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74  e same name as t
27e50 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
27e60 0a 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74 68  .** file with th
27e70 65 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78 20  e "-shm" suffix 
27e80 61 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61 6d  added.  For exam
27e90 70 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74 61  ple, if the data
27ea0 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20  base file.** is 
27eb0 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e  "/home/user1/con
27ec0 66 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68 65  fig.db" then the
27ed0 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 63 72   file that is cr
27ee0 65 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70 65  eated and mmappe
27ef0 64 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64 20  d.** for shared 
27f00 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 63  memory will be c
27f10 61 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73 65  alled "/home/use
27f20 72 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68 6d  r1/config.db-shm
27f30 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68  ".  .**.** Anoth
27f40 65 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20 69  er approach to i
27f50 73 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20 69  s to use files i
27f60 6e 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f 64  n /dev/shm or /d
27f70 65 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20  ev/tmp or an.** 
27f80 73 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66 73  some other tmpfs
27f90 20 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20 61   mount. But if a
27fa0 20 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66 65   file in a diffe
27fb0 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a 2a  rent directory.*
27fc0 2a 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  * from the datab
27fd0 61 73 65 20 66 69 6c 65 20 69 73 20 75 73 65 64  ase file is used
27fe0 2c 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e 67  , then differing
27ff0 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69   access permissi
28000 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f  ons.** or a chro
28010 6f 74 28 29 20 6d 69 67 68 74 20 63 61 75 73 65  ot() might cause
28020 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20 70   two different p
28030 72 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65 20  rocesses on the 
28040 73 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73 65  same.** database
28050 20 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e 67   to end up using
28060 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 73   different files
28070 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f   for shared memo
28080 72 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67  ry - .** meaning
28090 20 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d 6f   that their memo
280a0 72 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61  ry would not rea
280b0 6c 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d 20  lly be shared - 
280c0 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20  resulting.** in 
280d0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
280e0 69 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c 65  ion.  Neverthele
280f0 73 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20 66  ss, this tmpfs f
28100 69 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61 6e  ile usage.** can
28110 20 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20 63   be enabled at c
28120 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e  ompile-time usin
28130 67 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f 44  g -DSQLITE_SHM_D
28140 49 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f 73  IRECTORY="/dev/s
28150 68 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65 71  hm".** or the eq
28160 75 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20 75  uivalent.  The u
28170 73 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45  se of the SQLITE
28180 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63  _SHM_DIRECTORY c
28190 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f  ompile-time.** o
281a0 70 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e  ption results in
281b0 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
281c0 20 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74 65   build of SQLite
281d0 3b 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51 4c  ;  builds of SQL
281e0 69 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74 68  ite.** that with
281f0 20 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49 54   differing SQLIT
28200 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
28210 73 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70 74  settings attempt
28220 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 73   to use the.** s
28230 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ame database fil
28240 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  e at the same ti
28250 6d 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f 72  me, database cor
28260 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b  ruption will lik
28270 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 54  ely.** result. T
28280 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  he SQLITE_SHM_DI
28290 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d  RECTORY compile-
282a0 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 63  time option is c
282b0 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75 6e  onsidered.** "un
282c0 73 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20 6d  supported" and m
282d0 61 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61 20  ay go away in a 
282e0 66 75 74 75 72 65 20 53 51 4c 69 74 65 20 72 65  future SQLite re
282f0 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  lease..**.** Whe
28300 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20  n opening a new 
28310 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
28320 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20  le, if no other 
28330 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61  instances of tha
28340 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75  t.** file are cu
28350 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e  rrently open, in
28360 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
28370 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73   in other proces
28380 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ses, then.** the
28390 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72   file must be tr
283a0 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
283b0 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69  length or have i
283c0 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65  ts header cleare
283d0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
283e0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
283f0 65 20 66 69 6c 65 20 28 70 44 62 46 64 29 20 69  e file (pDbFd) i
28400 73 20 75 73 69 6e 67 20 74 68 65 20 22 75 6e 69  s using the "uni
28410 78 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20 74  x-excl" VFS.** t
28420 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61  hat means that a
28430 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
28440 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
28450 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
28460 64 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74 68  d.** that no oth
28470 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 72 65  er processes are
28480 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6f 72   able to read or
28490 20 77 72 69 74 65 20 74 68 65 20 64 61 74 61 62   write the datab
284a0 61 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61 74  ase.  In.** that
284b0 20 63 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f 74   case, we do not
284c0 20 72 65 61 6c 6c 79 20 6e 65 65 64 20 73 68 61   really need sha
284d0 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f 20  red memory.  No 
284e0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a  shared memory.**
284f0 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
28500 2e 20 20 54 68 65 20 73 68 61 72 65 64 20 6d 65  .  The shared me
28510 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 73 69 6d  mory will be sim
28520 75 6c 61 74 65 64 20 77 69 74 68 20 68 65 61 70  ulated with heap
28530 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
28540 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 53  ic int unixOpenS
28550 68 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78  haredMemory(unix
28560 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20  File *pDbFd){.  
28570 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 2a  struct unixShm *
28580 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  p = 0;          
28590 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
285a0 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a  n to be opened *
285b0 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53  /.  struct unixS
285c0 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
285d0 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  ;   /* The under
285e0 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69  lying mmapped fi
285f0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  le */.  int rc; 
28600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28610 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
28620 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78  t code */.  unix
28630 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
28640 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
28650 68 65 20 69 6e 6f 64 65 20 6f 66 20 66 64 20 2a  he inode of fd *
28660 2f 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d 46 69  /.  char *zShmFi
28670 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
28680 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
28690 68 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  he file used for
286a0 20 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53   SHM */.  int nS
286b0 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  hmFilename;     
286c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
286d0 65 20 6f 66 20 74 68 65 20 53 48 4d 20 66 69 6c  e of the SHM fil
286e0 65 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a  ename in bytes *
286f0 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
28700 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   space for the n
28710 65 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63  ew unixShm objec
28720 74 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69  t. */.  p = sqli
28730 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
28740 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20  of(*p) );.  if( 
28750 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
28760 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
28770 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
28780 66 28 2a 70 29 29 3b 0a 20 20 61 73 73 65 72 74  f(*p));.  assert
28790 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30  ( pDbFd->pShm==0
287a0 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
287b0 74 6f 20 73 65 65 20 69 66 20 61 20 75 6e 69 78  to see if a unix
287c0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 61  ShmNode object a
287d0 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 52  lready exists. R
287e0 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  euse an existing
287f0 0a 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72 65  .  ** one if pre
28800 73 65 6e 74 2e 20 43 72 65 61 74 65 20 61 20 6e  sent. Create a n
28810 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
28820 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78  ary..  */.  unix
28830 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
28840 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e  pInode = pDbFd->
28850 70 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e 6f  pInode;.  pShmNo
28860 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53 68  de = pInode->pSh
28870 6d 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70 53 68  mNode;.  if( pSh
28880 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  mNode==0 ){.    
28890 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
288a0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
288b0 20 20 20 2f 2a 20 66 73 74 61 74 28 29 20 69 6e     /* fstat() in
288c0 66 6f 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  fo for database 
288d0 66 69 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  file */.#ifndef 
288e0 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
288f0 54 4f 52 59 0a 20 20 20 20 63 6f 6e 73 74 20 63  TORY.    const c
28900 68 61 72 20 2a 7a 42 61 73 65 50 61 74 68 20 3d  har *zBasePath =
28910 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 3b 0a 23   pDbFd->zPath;.#
28920 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 61  endif..    /* Ca
28930 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20 66 69  ll fstat() to fi
28940 67 75 72 65 20 6f 75 74 20 74 68 65 20 70 65 72  gure out the per
28950 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20  missions on the 
28960 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
28970 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77 20 2a  f.    ** a new *
28980 2d 73 68 6d 20 66 69 6c 65 20 69 73 20 63 72 65  -shm file is cre
28990 61 74 65 64 2c 20 61 6e 20 61 74 74 65 6d 70 74  ated, an attempt
289a0 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f   will be made to
289b0 20 63 72 65 61 74 65 20 69 74 0a 20 20 20 20 2a   create it.    *
289c0 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  * with the same 
289d0 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 20 20 20  permissions..   
289e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46 73   */.    if( osFs
289f0 74 61 74 28 70 44 62 46 64 2d 3e 68 2c 20 26 73  tat(pDbFd->h, &s
28a00 53 74 61 74 29 20 26 26 20 70 49 6e 6f 64 65 2d  Stat) && pInode-
28a10 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
28a20 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
28a30 61 73 74 45 72 72 6e 6f 28 70 44 62 46 64 2c 20  astErrno(pDbFd, 
28a40 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63  errno);.      rc
28a50 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
28a60 46 53 54 41 54 3b 0a 20 20 20 20 20 20 67 6f 74  FSTAT;.      got
28a70 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
28a80 20 20 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e      }..#if defin
28a90 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
28aa0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
28ab0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 5c 0a 20  OCKING_STYLE \. 
28ac0 20 20 20 20 20 26 26 20 21 64 65 66 69 6e 65 64       && !defined
28ad0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45  (SQLITE_SHM_DIRE
28ae0 43 54 4f 52 59 29 0a 20 20 20 20 2f 2a 20 49 66  CTORY).    /* If
28af0 20 70 44 62 46 64 20 69 73 20 63 6f 6e 66 69 67   pDbFd is config
28b00 75 72 65 64 20 77 69 74 68 20 70 72 6f 78 79 20  ured with proxy 
28b10 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 75 73  locking mode, us
28b20 65 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20 20  e the local .   
28b30 20 2a 2a 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61   ** lock file pa
28b40 74 68 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  th to determine 
28b50 74 68 65 20 2d 73 68 6d 20 66 69 6c 65 20 70 61  the -shm file pa
28b60 74 68 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  th.    */.    if
28b70 28 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67  ( isProxyLocking
28b80 4d 6f 64 65 28 70 44 62 46 64 29 20 29 7b 0a 20  Mode(pDbFd) ){. 
28b90 20 20 20 20 20 7a 42 61 73 65 50 61 74 68 20 3d       zBasePath =
28ba0 20 70 72 6f 78 79 53 68 61 72 65 64 4d 65 6d 6f   proxySharedMemo
28bb0 72 79 42 61 73 65 50 61 74 68 28 70 44 62 46 64  ryBasePath(pDbFd
28bc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 42  );.      if( !zB
28bd0 61 73 65 50 61 74 68 20 29 7b 0a 20 20 20 20 20  asePath ){.     
28be0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
28bf0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
28c00 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
28c10 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  pen_err;.      }
28c20 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
28c30 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45    .#ifdef SQLITE
28c40 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20  _SHM_DIRECTORY. 
28c50 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20     nShmFilename 
28c60 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49 54 45 5f  = sizeof(SQLITE_
28c70 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 29 20 2b  SHM_DIRECTORY) +
28c80 20 33 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e   31;.#else.    n
28c90 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 36 20  ShmFilename = 6 
28ca0 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42  + (int)strlen(zB
28cb0 61 73 65 50 61 74 68 29 3b 0a 23 65 6e 64 69 66  asePath);.#endif
28cc0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  .    pShmNode = 
28cd0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
28ce0 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65  sizeof(*pShmNode
28cf0 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  ) + nShmFilename
28d00 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d   );.    if( pShm
28d10 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Node==0 ){.     
28d20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
28d30 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  EM;.      goto s
28d40 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
28d50 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 53   }.    memset(pS
28d60 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f  hmNode, 0, sizeo
28d70 66 28 2a 70 53 68 6d 4e 6f 64 65 29 2b 6e 53 68  f(*pShmNode)+nSh
28d80 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  mFilename);.    
28d90 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 70  zShmFilename = p
28da0 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
28db0 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 53 68  me = (char*)&pSh
28dc0 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66 64 65 66  mNode[1];.#ifdef
28dd0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
28de0 43 54 4f 52 59 0a 20 20 20 20 73 71 6c 69 74 65  CTORY.    sqlite
28df0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46  3_snprintf(nShmF
28e00 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c  ilename, zShmFil
28e10 65 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  ename, .        
28e20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
28e30 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
28e40 59 20 22 2f 73 71 6c 69 74 65 2d 73 68 6d 2d 25  Y "/sqlite-shm-%
28e50 78 2d 25 78 22 2c 0a 20 20 20 20 20 20 20 20 20  x-%x",.         
28e60 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32              (u32
28e70 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f 2c 20 28  )sStat.st_ino, (
28e80 75 33 32 29 73 53 74 61 74 2e 73 74 5f 64 65 76  u32)sStat.st_dev
28e90 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 71 6c  );.#else.    sql
28ea0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53  ite3_snprintf(nS
28eb0 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d  hmFilename, zShm
28ec0 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68  Filename, "%s-sh
28ed0 6d 22 2c 20 7a 42 61 73 65 50 61 74 68 29 3b 0a  m", zBasePath);.
28ee0 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
28ef0 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50  uffix3(pDbFd->zP
28f00 61 74 68 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d  ath, zShmFilenam
28f10 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  e);.#endif.    p
28f20 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b  ShmNode->h = -1;
28f30 0a 20 20 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f  .    pDbFd->pIno
28f40 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70  de->pShmNode = p
28f50 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68  ShmNode;.    pSh
28f60 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20  mNode->pInode = 
28f70 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pDbFd->pInode;. 
28f80 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74     pShmNode->mut
28f90 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex = sqlite3_mut
28fa0 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
28fb0 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
28fc0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d   if( pShmNode->m
28fd0 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
28fe0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
28ff0 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  EM;.      goto s
29000 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
29010 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   }..    if( pIno
29020 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
29030 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
29040 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
29050 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20  DWR | O_CREAT;. 
29060 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
29070 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 70 44 62  _uri_boolean(pDb
29080 46 64 2d 3e 7a 50 61 74 68 2c 20 22 72 65 61 64  Fd->zPath, "read
29090 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30 29 0a 23 69  only_shm", 0).#i
290a0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
290b0 5f 45 4e 41 42 4c 45 5f 50 45 52 53 49 53 54 5f  _ENABLE_PERSIST_
290c0 57 41 4c 29 26 26 28 53 51 4c 49 54 45 5f 45 4e  WAL)&&(SQLITE_EN
290d0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
290e0 4c 45 20 5c 0a 20 20 20 20 7c 7c 20 64 65 66 69  LE \.    || defi
290f0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 29 0a  ned(__APPLE__)).
29100 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 44 62           || (pDb
29110 46 64 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20  Fd->openFlags & 
29120 4f 5f 52 44 57 52 29 20 21 3d 20 4f 5f 52 44 57  O_RDWR) != O_RDW
29130 52 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  R.#endif.       
29140 20 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 65    ){.        ope
29150 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c  nFlags = O_RDONL
29160 59 3b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  Y;.        pShmN
29170 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20  ode->isReadonly 
29180 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
29190 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d     pShmNode->h =
291a0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68   robust_open(zSh
291b0 6d 46 69 6c 65 6e 61 6d 65 2c 20 6f 70 65 6e 46  mFilename, openF
291c0 6c 61 67 73 2c 20 28 73 53 74 61 74 2e 73 74 5f  lags, (sStat.st_
291d0 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a 20 20 20  mode&0777));.   
291e0 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
291f0 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >h<0 ){.        
29200 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
29210 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
29220 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20  N_BKPT, "open", 
29230 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  zShmFilename);. 
29240 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f         goto shm_
29250 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20  open_err;.      
29260 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  }..      /* Chec
29270 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74  k to see if anot
29280 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68  her process is h
29290 6f 6c 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d  olding the dead-
292a0 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20  man switch..    
292b0 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75    ** If not, tru
292c0 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
292d0 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a  o zero length. .
292e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
292f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
29300 20 20 20 20 20 69 66 28 20 75 6e 69 78 53 68 6d       if( unixShm
29310 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
29320 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 55 4e  ode, F_WRLCK, UN
29330 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d  IX_SHM_DMS, 1)==
29340 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29350 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f       if( robust_
29360 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f  ftruncate(pShmNo
29370 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a 20 20 20  de->h, 0) ){.   
29380 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
29390 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
293a0 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 22  IOERR_SHMOPEN, "
293b0 66 74 72 75 6e 63 61 74 65 22 2c 20 7a 53 68 6d  ftruncate", zShm
293c0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
293d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
293e0 20 20 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e      /* If runnin
293f0 67 20 61 73 20 72 6f 6f 74 20 73 65 74 20 74 68  g as root set th
29400 65 20 75 69 64 2f 67 69 64 20 6f 66 20 74 68 65  e uid/gid of the
29410 20 73 68 6d 20 66 69 6c 65 20 74 6f 20 6d 61 74   shm file to mat
29420 63 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ch.          ** 
29430 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
29440 20 20 20 20 20 20 20 20 20 20 75 69 64 5f 74 20            uid_t 
29450 65 75 69 64 20 3d 20 67 65 74 65 75 69 64 28 29  euid = geteuid()
29460 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29470 28 21 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65  (!pShmNode->isRe
29480 61 64 6f 6e 6c 79 29 20 26 26 20 65 75 69 64 3d  adonly) && euid=
29490 3d 30 20 26 26 20 28 65 75 69 64 21 3d 73 53 74  =0 && (euid!=sSt
294a0 61 74 2e 73 74 5f 75 69 64 20 7c 7c 20 67 65 74  at.st_uid || get
294b0 65 67 69 64 28 29 21 3d 73 53 74 61 74 2e 73 74  egid()!=sStat.st
294c0 5f 67 69 64 29 20 29 7b 0a 20 20 20 20 20 20 20  _gid) ){.       
294d0 20 20 20 20 20 69 66 28 20 6f 73 46 63 68 6f 77       if( osFchow
294e0 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73  n(pShmNode->h, s
294f0 53 74 61 74 2e 73 74 5f 75 69 64 2c 20 73 53 74  Stat.st_uid, sSt
29500 61 74 2e 73 74 5f 67 69 64 29 20 29 7b 0a 20 20  at.st_gid) ){.  
29510 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
29520 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
29530 4d 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 20  MOPEN;.         
29540 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
29550 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29560 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
29570 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29580 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
29590 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
295a0 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20  mNode, F_RDLCK, 
295b0 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29  UNIX_SHM_DMS, 1)
295c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
295d0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68  if( rc ) goto sh
295e0 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
295f0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  }.  }..  /* Make
29600 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74   the new connect
29610 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74  ion a child of t
29620 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  he unixShmNode *
29630 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20  /.  p->pShmNode 
29640 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64  = pShmNode;.#ifd
29650 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
29660 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f    p->id = pShmNo
29670 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b  de->nextShmId++;
29680 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f  .#endif.  pShmNo
29690 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44  de->nRef++;.  pD
296a0 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20  bFd->pShm = p;. 
296b0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
296c0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66  );..  /* The ref
296d0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
296e0 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72  pShmNode has alr
296f0 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d  eady been increm
29700 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a  ented under.  **
29710 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68   the cover of th
29720 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  e unixEnterMutex
29730 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65  () mutex and the
29740 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68   pointer from th
29750 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75  e.  ** new (stru
29760 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a 65  ct unixShm) obje
29770 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f  ct to the pShmNo
29780 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  de has been set.
29790 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a   All that is.  *
297a0 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20  * left to do is 
297b0 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20  to link the new 
297c0 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20  object into the 
297d0 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
297e0 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68  ting.  ** at pSh
297f0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54  mNode->pFirst. T
29800 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65  his must be done
29810 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74   while holding t
29820 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  he pShmNode->mut
29830 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a  ex .  ** mutex..
29840 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d    */.  sqlite3_m
29850 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
29860 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  ode->mutex);.  p
29870 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f  ->pNext = pShmNo
29880 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53  de->pFirst;.  pS
29890 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d  hmNode->pFirst =
298a0 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   p;.  sqlite3_mu
298b0 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
298c0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  de->mutex);.  re
298d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
298e0 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
298f0 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a  on any error */.
29900 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20  shm_open_err:.  
29910 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44 62  unixShmPurge(pDb
29920 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Fd);       /* Th
29930 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53  is call frees pS
29940 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72  hmNode if requir
29950 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
29960 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69 78 4c  free(p);.  unixL
29970 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72  eaveMutex();.  r
29980 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
29990 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
299a0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
299b0 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
299c0 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e  o region iRegion
299d0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72   of the .** shar
299e0 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ed-memory associ
299f0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64 61  ated with the da
29a00 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20  tabase file fd. 
29a10 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  Shared-memory re
29a20 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75  gions .** are nu
29a30 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20  mbered starting 
29a40 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20  from zero. Each 
29a50 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
29a60 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e  gion is szRegion
29a70 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69   .** bytes in si
29a80 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ze..**.** If an 
29a90 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
29aa0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
29ab0 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20  eturned and *pp 
29ac0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
29ad0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
29ae0 20 69 66 20 74 68 65 20 62 45 78 74 65 6e 64 20   if the bExtend 
29af0 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 61  parameter is 0 a
29b00 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
29b10 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a   shared-memory.*
29b20 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  * region has not
29b30 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
29b40 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20  (by any client, 
29b50 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75  including one ru
29b60 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65  nning in a.** se
29b70 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c  parate process),
29b80 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74   then *pp is set
29b90 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c   to NULL and SQL
29ba0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
29bb0 20 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64 20   If .** bExtend 
29bc0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20  is non-zero and 
29bd0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68  the requested sh
29be0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
29bf0 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a  on has not yet .
29c00 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ** been allocate
29c10 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74  d, it is allocat
29c20 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
29c30 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ion..**.** If th
29c40 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
29c50 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  region has alrea
29c60 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
29c70 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  d or is allocate
29c80 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c  d by.** this cal
29c90 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  l as described a
29ca0 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73  bove, then it is
29cb0 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69   mapped into thi
29cc0 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20  s processes .** 
29cd0 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28 69  address space (i
29ce0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
29cf0 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74  ady), *pp is set
29d00 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
29d10 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f   mapped .** memo
29d20 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ry and SQLITE_OK
29d30 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
29d40 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
29d50 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  Map(.  sqlite3_f
29d60 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
29d70 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
29d80 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73   open on databas
29d90 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
29da0 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  iRegion,        
29db0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
29dc0 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76  egion to retriev
29dd0 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67  e */.  int szReg
29de0 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
29df0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
29e00 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69  f regions */.  i
29e10 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20 20 20  nt bExtend,     
29e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29e30 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64  * True to extend
29e40 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61   file if necessa
29e50 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c  ry */.  void vol
29e60 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20  atile **pp      
29e70 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
29e80 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  Mapped memory */
29e90 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
29ea0 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c  pDbFd = (unixFil
29eb0 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d  e*)fd;.  unixShm
29ec0 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f   *p;.  unixShmNo
29ed0 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de *pShmNode;.  
29ee0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
29ef0 4f 4b 3b 0a 20 20 69 6e 74 20 6e 53 68 6d 50 65  OK;.  int nShmPe
29f00 72 4d 61 70 20 3d 20 75 6e 69 78 53 68 6d 52 65  rMap = unixShmRe
29f10 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b 0a 20 20  gionPerMap();.  
29f20 69 6e 74 20 6e 52 65 71 52 65 67 69 6f 6e 3b 0a  int nReqRegion;.
29f30 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68 61  .  /* If the sha
29f40 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20  red-memory file 
29f50 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
29f60 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74   opened, open it
29f70 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20 70   now. */.  if( p
29f80 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 7b  DbFd->pShm==0 ){
29f90 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4f 70  .    rc = unixOp
29fa0 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70  enSharedMemory(p
29fb0 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72  DbFd);.    if( r
29fc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
29fd0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
29fe0 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d   p = pDbFd->pShm
29ff0 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  ;.  pShmNode = p
2a000 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73 71  ->pShmNode;.  sq
2a010 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
2a020 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
2a030 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a  x);.  assert( sz
2a040 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65  Region==pShmNode
2a050 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53  ->szRegion || pS
2a060 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d  hmNode->nRegion=
2a070 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2a080 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65  pShmNode->pInode
2a090 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20  ==pDbFd->pInode 
2a0a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
2a0b0 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70  mNode->h>=0 || p
2a0c0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  DbFd->pInode->bP
2a0d0 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b  rocessLock==1 );
2a0e0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
2a0f0 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46  ode->h<0 || pDbF
2a100 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  d->pInode->bProc
2a110 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20  essLock==0 );.. 
2a120 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75 6d 62   /* Minimum numb
2a130 65 72 20 6f 66 20 72 65 67 69 6f 6e 73 20 72 65  er of regions re
2a140 71 75 69 72 65 64 20 74 6f 20 62 65 20 6d 61 70  quired to be map
2a150 70 65 64 2e 20 2a 2f 0a 20 20 6e 52 65 71 52 65  ped. */.  nReqRe
2a160 67 69 6f 6e 20 3d 20 28 28 69 52 65 67 69 6f 6e  gion = ((iRegion
2a170 2b 6e 53 68 6d 50 65 72 4d 61 70 29 20 2f 20 6e  +nShmPerMap) / n
2a180 53 68 6d 50 65 72 4d 61 70 29 20 2a 20 6e 53 68  ShmPerMap) * nSh
2a190 6d 50 65 72 4d 61 70 3b 0a 0a 20 20 69 66 28 20  mPerMap;..  if( 
2a1a0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
2a1b0 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b 0a  n<nReqRegion ){.
2a1c0 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e 65 77      char **apNew
2a1d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a1e0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 70         /* New ap
2a1f0 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a  Region[] array *
2a200 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  /.    int nByte 
2a210 3d 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73 7a 52  = nReqRegion*szR
2a220 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 4d 69 6e 69  egion;   /* Mini
2a230 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c  mum required fil
2a240 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74  e size */.    st
2a250 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b  ruct stat sStat;
2a260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a270 20 2f 2a 20 55 73 65 64 20 62 79 20 66 73 74 61   /* Used by fsta
2a280 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d  t() */..    pShm
2a290 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d  Node->szRegion =
2a2a0 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20   szRegion;..    
2a2b0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e  if( pShmNode->h>
2a2c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
2a2d0 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67  he requested reg
2a2e0 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65  ion is not mappe
2a2f0 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  d into this proc
2a300 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70  esses address sp
2a310 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68  ace..      ** Ch
2a320 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74  eck to see if it
2a330 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
2a340 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65  ted (i.e. if the
2a350 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20   wal-index file 
2a360 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72 67  is.      ** larg
2a370 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74  e enough to cont
2a380 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  ain the requeste
2a390 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 20  d region)..     
2a3a0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 73   */.      if( os
2a3b0 46 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e  Fstat(pShmNode->
2a3c0 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20  h, &sStat) ){.  
2a3d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2a3e0 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3b  E_IOERR_SHMSIZE;
2a3f0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68  .        goto sh
2a400 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
2a410 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20   }.  .      if( 
2a420 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e 42  sStat.st_size<nB
2a430 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  yte ){.        /
2a440 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
2a450 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f  memory region do
2a460 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66  es not exist. If
2a470 20 62 45 78 74 65 6e 64 20 69 73 20 73 65 74 20   bExtend is set 
2a480 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61  to.        ** fa
2a490 6c 73 65 2c 20 65 78 69 74 20 65 61 72 6c 79 2e  lse, exit early.
2a4a0 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65 74   *pp will be set
2a4b0 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c   to NULL and SQL
2a4c0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
2a4d0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2a4e0 20 20 20 20 69 66 28 20 21 62 45 78 74 65 6e 64      if( !bExtend
2a4f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
2a500 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
2a510 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
2a520 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76     /* Alternativ
2a530 65 6c 79 2c 20 69 66 20 62 45 78 74 65 6e 64 20  ely, if bExtend 
2a540 69 73 20 74 72 75 65 2c 20 65 78 74 65 6e 64 20  is true, extend 
2a550 74 68 65 20 66 69 6c 65 2e 20 44 6f 20 74 68 69  the file. Do thi
2a560 73 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  s by.        ** 
2a570 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65  writing a single
2a580 20 62 79 74 65 20 74 6f 20 74 68 65 20 65 6e 64   byte to the end
2a590 20 6f 66 20 65 61 63 68 20 28 4f 53 29 20 70 61   of each (OS) pa
2a5a0 67 65 20 62 65 69 6e 67 0a 20 20 20 20 20 20 20  ge being.       
2a5b0 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72   ** allocated or
2a5c0 20 65 78 74 65 6e 64 65 64 2e 20 54 65 63 68 6e   extended. Techn
2a5d0 69 63 61 6c 6c 79 2c 20 77 65 20 6e 65 65 64 20  ically, we need 
2a5e0 6f 6e 6c 79 20 77 72 69 74 65 20 74 6f 20 74 68  only write to th
2a5f0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 61 73  e.        ** las
2a600 74 20 70 61 67 65 20 69 6e 20 6f 72 64 65 72 20  t page in order 
2a610 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 66 69  to extend the fi
2a620 6c 65 2e 20 42 75 74 20 77 72 69 74 69 6e 67 20  le. But writing 
2a630 74 6f 20 61 6c 6c 20 6e 65 77 0a 20 20 20 20 20  to all new.     
2a640 20 20 20 2a 2a 20 70 61 67 65 73 20 66 6f 72 63     ** pages forc
2a650 65 73 20 74 68 65 20 4f 53 20 74 6f 20 61 6c 6c  es the OS to all
2a660 6f 63 61 74 65 20 74 68 65 6d 20 69 6d 6d 65 64  ocate them immed
2a670 69 61 74 65 6c 79 2c 20 77 68 69 63 68 20 72 65  iately, which re
2a680 64 75 63 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  duces.        **
2a690 20 74 68 65 20 63 68 61 6e 63 65 73 20 6f 66 20   the chances of 
2a6a0 53 49 47 42 55 53 20 77 68 69 6c 65 20 61 63 63  SIGBUS while acc
2a6b0 65 73 73 69 6e 67 20 74 68 65 20 6d 61 70 70 65  essing the mappe
2a6c0 64 20 72 65 67 69 6f 6e 20 6c 61 74 65 72 20 6f  d region later o
2a6d0 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  n..        */.  
2a6e0 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20        else{.    
2a6f0 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
2a700 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 34 30  st int pgsz = 40
2a710 39 36 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  96;.          in
2a720 74 20 69 50 67 3b 0a 0a 20 20 20 20 20 20 20 20  t iPg;..        
2a730 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68    /* Write to th
2a740 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20 65  e last byte of e
2a750 61 63 68 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61  ach newly alloca
2a760 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65 64 20  ted or extended 
2a770 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
2a780 20 20 61 73 73 65 72 74 28 20 28 6e 42 79 74 65    assert( (nByte
2a790 20 25 20 70 67 73 7a 29 3d 3d 30 20 29 3b 0a 20   % pgsz)==0 );. 
2a7a0 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 50 67           for(iPg
2a7b0 3d 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 2f  =(sStat.st_size/
2a7c0 70 67 73 7a 29 3b 20 69 50 67 3c 28 6e 42 79 74  pgsz); iPg<(nByt
2a7d0 65 2f 70 67 73 7a 29 3b 20 69 50 67 2b 2b 29 7b  e/pgsz); iPg++){
2a7e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2a7f0 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64 28   seekAndWriteFd(
2a800 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 69 50 67  pShmNode->h, iPg
2a810 2a 70 67 73 7a 20 2b 20 70 67 73 7a 2d 31 2c 20  *pgsz + pgsz-1, 
2a820 22 22 2c 20 31 2c 20 30 29 21 3d 31 20 29 7b 0a  "", 1, 0)!=1 ){.
2a830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
2a840 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20  nst char *zFile 
2a850 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  = pShmNode->zFil
2a860 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  ename;.         
2a870 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
2a880 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
2a890 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22 77 72  ERR_SHMSIZE, "wr
2a8a0 69 74 65 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20  ite", zFile);.  
2a8b0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2a8c0 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
2a8d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a8e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a8f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2a900 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20  .    /* Map the 
2a910 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
2a920 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69   region into thi
2a930 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72  s processes addr
2a940 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20  ess space. */.  
2a950 20 20 61 70 4e 65 77 20 3d 20 28 63 68 61 72 20    apNew = (char 
2a960 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  **)sqlite3_reall
2a970 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d  oc(.        pShm
2a980 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 2c 20  Node->apRegion, 
2a990 6e 52 65 71 52 65 67 69 6f 6e 2a 73 69 7a 65 6f  nReqRegion*sizeo
2a9a0 66 28 63 68 61 72 20 2a 29 0a 20 20 20 20 29 3b  f(char *).    );
2a9b0 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20  .    if( !apNew 
2a9c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
2a9d0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
2a9e0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
2a9f0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
2aa00 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70      pShmNode->ap
2aa10 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a  Region = apNew;.
2aa20 20 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e      while( pShmN
2aa30 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65  ode->nRegion<nRe
2aa40 71 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20  qRegion ){.     
2aa50 20 69 6e 74 20 6e 4d 61 70 20 3d 20 73 7a 52 65   int nMap = szRe
2aa60 67 69 6f 6e 2a 6e 53 68 6d 50 65 72 4d 61 70 3b  gion*nShmPerMap;
2aa70 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
2aa80 20 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a      void *pMem;.
2aa90 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f        if( pShmNo
2aaa0 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20  de->h>=0 ){.    
2aab0 20 20 20 20 70 4d 65 6d 20 3d 20 6f 73 4d 6d 61      pMem = osMma
2aac0 70 28 30 2c 20 6e 4d 61 70 2c 0a 20 20 20 20 20  p(0, nMap,.     
2aad0 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
2aae0 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50 52  >isReadonly ? PR
2aaf0 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f 52  OT_READ : PROT_R
2ab00 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20  EAD|PROT_WRITE, 
2ab10 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d 41 50  .            MAP
2ab20 5f 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64  _SHARED, pShmNod
2ab30 65 2d 3e 68 2c 20 73 7a 52 65 67 69 6f 6e 2a 28  e->h, szRegion*(
2ab40 69 36 34 29 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  i64)pShmNode->nR
2ab50 65 67 69 6f 6e 0a 20 20 20 20 20 20 20 20 29 3b  egion.        );
2ab60 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65  .        if( pMe
2ab70 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b  m==MAP_FAILED ){
2ab80 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2ab90 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
2aba0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50  ITE_IOERR_SHMMAP
2abb0 2c 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e 6f  , "mmap", pShmNo
2abc0 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  de->zFilename);.
2abd0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
2abe0 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
2abf0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
2ac00 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20  e{.        pMem 
2ac10 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
2ac20 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  (szRegion);.    
2ac30 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30 20      if( pMem==0 
2ac40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2ac50 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2ac60 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
2ac70 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
2ac80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65      }.        me
2ac90 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c 20 73 7a  mset(pMem, 0, sz
2aca0 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d  Region);.      }
2acb0 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ..      for(i=0;
2acc0 20 69 3c 6e 53 68 6d 50 65 72 4d 61 70 3b 20 69   i<nShmPerMap; i
2acd0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68  ++){.        pSh
2ace0 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b  mNode->apRegion[
2acf0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
2ad00 6e 2b 69 5d 20 3d 20 26 28 28 63 68 61 72 2a 29  n+i] = &((char*)
2ad10 70 4d 65 6d 29 5b 73 7a 52 65 67 69 6f 6e 2a 69  pMem)[szRegion*i
2ad20 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
2ad30 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
2ad40 6f 6e 20 2b 3d 20 6e 53 68 6d 50 65 72 4d 61 70  on += nShmPerMap
2ad50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d  ;.    }.  }..shm
2ad60 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
2ad70 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
2ad80 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  n>iRegion ){.   
2ad90 20 2a 70 70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d   *pp = pShmNode-
2ada0 3e 61 70 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f  >apRegion[iRegio
2adb0 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  n];.  }else{.   
2adc0 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   *pp = 0;.  }.  
2add0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73  if( pShmNode->is
2ade0 52 65 61 64 6f 6e 6c 79 20 26 26 20 72 63 3d 3d  Readonly && rc==
2adf0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
2ae00 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
2ae10 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
2ae20 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
2ae30 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
2ae40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2ae50 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20  Change the lock 
2ae60 73 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72  state for a shar
2ae70 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed-memory segmen
2ae80 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  t..**.** Note th
2ae90 61 74 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73  at the relations
2aea0 68 69 70 20 62 65 74 77 65 65 6e 20 53 48 41 52  hip between SHAR
2aeb0 45 64 20 61 6e 64 20 45 58 43 4c 55 53 49 56 45  Ed and EXCLUSIVE
2aec0 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c 69 74 74   locks is a litt
2aed0 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  le.** different 
2aee0 68 65 72 65 20 74 68 61 6e 20 69 6e 20 70 6f 73  here than in pos
2aef0 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b  ix.  In xShmLock
2af00 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66  (), one can go f
2af10 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20  rom unlocked.** 
2af20 74 6f 20 73 68 61 72 65 64 20 61 6e 64 20 62 61  to shared and ba
2af30 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63  ck or from unloc
2af40 6b 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ked to exclusive
2af50 20 61 6e 64 20 62 61 63 6b 2e 20 20 42 75 74 20   and back.  But 
2af60 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67  one may.** not g
2af70 6f 20 66 72 6f 6d 20 73 68 61 72 65 64 20 74 6f  o from shared to
2af80 20 65 78 63 6c 75 73 69 76 65 20 6f 72 20 66 72   exclusive or fr
2af90 6f 6d 20 65 78 63 6c 75 73 69 76 65 20 74 6f 20  om exclusive to 
2afa0 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  shared..*/.stati
2afb0 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63  c int unixShmLoc
2afc0 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  k(.  sqlite3_fil
2afd0 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
2afe0 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
2aff0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
2b000 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
2b010 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
2b020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2b030 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75  rst lock to acqu
2b040 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
2b050 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
2b060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b070 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b  * Number of lock
2b080 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  s to acquire or 
2b090 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
2b0a0 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
2b0b0 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
2b0c0 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c  to do with the l
2b0d0 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  ock */.){.  unix
2b0e0 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75  File *pDbFd = (u
2b0f0 6e 69 78 46 69 6c 65 2a 29 66 64 3b 20 20 20 20  nixFile*)fd;    
2b100 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
2b110 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d  holding shared m
2b120 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53  emory */.  unixS
2b130 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70  hm *p = pDbFd->p
2b140 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
2b150 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d   /* The shared m
2b160 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b  emory being lock
2b170 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  ed */.  unixShm 
2b180 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
2b190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b1a0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
2b1b0 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a  r all siblings *
2b1c0 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  /.  unixShmNode 
2b1d0 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70  *pShmNode = p->p
2b1e0 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65  ShmNode;  /* The
2b1f0 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65   underlying file
2b200 20 69 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20   iNode */.  int 
2b210 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2b220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b230 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
2b240 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20   */.  u16 mask; 
2b250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2b270 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20  ask of locks to 
2b280 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20  take or release 
2b290 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  */..  assert( pS
2b2a0 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  hmNode==pDbFd->p
2b2b0 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
2b2c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
2b2d0 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70  mNode->pInode==p
2b2e0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  DbFd->pInode );.
2b2f0 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d    assert( ofst>=
2b300 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c  0 && ofst+n<=SQL
2b310 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b  ITE_SHM_NLOCK );
2b320 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20  .  assert( n>=1 
2b330 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  );.  assert( fla
2b340 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
2b350 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
2b360 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
2b370 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
2b380 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
2b390 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
2b3a0 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  VE).       || fl
2b3b0 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
2b3c0 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
2b3d0 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
2b3e0 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
2b3f0 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
2b400 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
2b410 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73  CLUSIVE) );.  as
2b420 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66  sert( n==1 || (f
2b430 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
2b440 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20  M_EXCLUSIVE)!=0 
2b450 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
2b460 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70  mNode->h>=0 || p
2b470 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  DbFd->pInode->bP
2b480 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b  rocessLock==1 );
2b490 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
2b4a0 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46  ode->h<0 || pDbF
2b4b0 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  d->pInode->bProc
2b4c0 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20  essLock==0 );.. 
2b4d0 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73   mask = (1<<(ofs
2b4e0 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74  t+n)) - (1<<ofst
2b4f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31  );.  assert( n>1
2b500 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66   || mask==(1<<of
2b510 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  st) );.  sqlite3
2b520 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
2b530 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
2b540 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
2b550 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29  ITE_SHM_UNLOCK )
2b560 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73  {.    u16 allMas
2b570 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f  k = 0; /* Mask o
2b580 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
2b590 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20  siblings */..   
2b5a0 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73   /* See if any s
2b5b0 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69  iblings hold thi
2b5c0 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20  s same lock */. 
2b5d0 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
2b5e0 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
2b5f0 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
2b600 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29       if( pX==p )
2b610 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2b620 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78   assert( (pX->ex
2b630 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63  clMask & (p->exc
2b640 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d  lMask|p->sharedM
2b650 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ask))==0 );.    
2b660 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d    allMask |= pX-
2b670 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
2b680 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63   }..    /* Unloc
2b690 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76  k the system-lev
2b6a0 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  el locks */.    
2b6b0 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d  if( (mask & allM
2b6c0 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
2b6d0 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
2b6e0 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
2b6f0 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b  , F_UNLCK, ofst+
2b700 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
2b710 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2b720 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2b730 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OK;.    }..    /
2b740 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c  * Undo the local
2b750 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
2b760 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b770 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c  ){.      p->excl
2b780 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
2b790 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
2b7a0 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
2b7b0 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   } .  }else if( 
2b7c0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
2b7d0 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  HM_SHARED ){.   
2b7e0 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d   u16 allShared =
2b7f0 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66   0;  /* Union of
2b800 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63   locks held by c
2b810 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72  onnections other
2b820 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20   than "p" */..  
2b830 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68    /* Find out wh
2b840 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  ich shared locks
2b850 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c   are already hel
2b860 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e  d by sibling con
2b870 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  nections..    **
2b880 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20   If any sibling 
2b890 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e  already holds an
2b8a0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c   exclusive lock,
2b8b0 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65   go ahead and re
2b8c0 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49  turn.    ** SQLI
2b8d0 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a  TE_BUSY..    */.
2b8e0 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
2b8f0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
2b900 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
2b910 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65        if( (pX->e
2b920 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  xclMask & mask)!
2b930 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
2b940 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
2b950 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2b960 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c       }.      all
2b970 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68  Shared |= pX->sh
2b980 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  aredMask;.    }.
2b990 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72  .    /* Get shar
2b9a0 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ed locks at the 
2b9b0 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66  system level, if
2b9c0 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
2b9d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2b9e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
2b9f0 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61   (allShared & ma
2ba00 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
2ba10 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
2ba20 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
2ba30 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74  e, F_RDLCK, ofst
2ba40 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20  +UNIX_SHM_BASE, 
2ba50 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
2ba60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2ba70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2ba80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
2ba90 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61  et the local sha
2baa0 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  red locks */.   
2bab0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2bac0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  OK ){.      p->s
2bad0 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73  haredMask |= mas
2bae0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  k;.    }.  }else
2baf0 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  {.    /* Make su
2bb00 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f  re no sibling co
2bb10 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c  nnections hold l
2bb20 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62  ocks that will b
2bb30 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a  lock this.    **
2bb40 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64   lock.  If any d
2bb50 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  o, return SQLITE
2bb60 5f 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79  _BUSY right away
2bb70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
2bb80 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
2bb90 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
2bba0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
2bbb0 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  f( (pX->exclMask
2bbc0 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28   & mask)!=0 || (
2bbd0 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  pX->sharedMask &
2bbe0 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20   mask)!=0 ){.   
2bbf0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2bc00 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62  _BUSY;.        b
2bc10 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2bc20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65    }.  .    /* Ge
2bc30 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  t the exclusive 
2bc40 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73  locks at the sys
2bc50 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e  tem level.  Then
2bc60 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20   if successful. 
2bc70 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20     ** also mark 
2bc80 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63  the local connec
2bc90 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f  tion as being lo
2bca0 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cked..    */.   
2bcb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2bcc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
2bcd0 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
2bce0 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57  ck(pShmNode, F_W
2bcf0 52 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f  RLCK, ofst+UNIX_
2bd00 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
2bd10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2bd20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2bd30 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61   assert( (p->sha
2bd40 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d  redMask & mask)=
2bd50 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =0 );.        p-
2bd60 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73  >exclMask |= mas
2bd70 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
2bd80 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
2bd90 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
2bda0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f  ode->mutex);.  O
2bdb0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
2bdc0 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d  K shmid-%d, pid-
2bdd0 25 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33 78  %d got %03x,%03x
2bde0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2bdf0 70 2d 3e 69 64 2c 20 67 65 74 70 69 64 28 29 2c  p->id, getpid(),
2be00 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20   p->sharedMask, 
2be10 70 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20  p->exclMask));. 
2be20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2be30 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61  *.** Implement a
2be40 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20   memory barrier 
2be50 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20  or memory fence 
2be60 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  on shared memory
2be70 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f  .  .**.** All lo
2be80 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62  ads and stores b
2be90 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20  egun before the 
2bea0 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d  barrier must com
2beb0 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20  plete before.** 
2bec0 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72  any load or stor
2bed0 65 20 62 65 67 75 6e 20 61 66 74 65 72 20 74 68  e begun after th
2bee0 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74  e barrier..*/.st
2bef0 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68  atic void unixSh
2bf00 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69  mBarrier(.  sqli
2bf10 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20  te3_file *fd    
2bf20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2bf30 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
2bf40 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ding the shared 
2bf50 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55  memory */.){.  U
2bf60 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2bf70 66 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  fd);.  unixEnter
2bf80 4d 75 74 65 78 28 29 3b 0a 20 20 75 6e 69 78 4c  Mutex();.  unixL
2bf90 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a  eaveMutex();.}..
2bfa0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f  /*.** Close a co
2bfb0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72  nnection to shar
2bfc0 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65  ed-memory.  Dele
2bfd0 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  te the underlyin
2bfe0 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66  g .** storage if
2bff0 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74   deleteFlag is t
2c000 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  rue..**.** If th
2c010 65 72 65 20 69 73 20 6e 6f 20 73 68 61 72 65 64  ere is no shared
2c020 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
2c030 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e 6e  ed with the conn
2c040 65 63 74 69 6f 6e 20 74 68 65 6e 20 74 68 69 73  ection then this
2c050 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 61  .** routine is a
2c060 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e   harmless no-op.
2c070 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2c080 6e 69 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73  nixShmUnmap(.  s
2c090 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
2c0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c0b0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
2c0c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2c0d0 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c  /.  int deleteFl
2c0e0 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ag              
2c0f0 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 73 68      /* Delete sh
2c100 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74  ared-memory if t
2c110 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  rue */.){.  unix
2c120 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Shm *p;         
2c130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2c140 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
2c150 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20   be closed */.  
2c160 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
2c170 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  mNode;          
2c180 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
2c190 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  g shared-memory 
2c1a0 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68  file */.  unixSh
2c1b0 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20  m **pp;         
2c1c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
2c1d0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69   looping over si
2c1e0 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
2c1f0 73 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  s */.  unixFile 
2c200 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 20 20  *pDbFd;         
2c210 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
2c220 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
2c230 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62  e file */..  pDb
2c240 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
2c250 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d  fd;.  p = pDbFd-
2c260 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d  >pShm;.  if( p==
2c270 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
2c280 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  E_OK;.  pShmNode
2c290 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a   = p->pShmNode;.
2c2a0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
2c2b0 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
2c2c0 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a  de->pShmNode );.
2c2d0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
2c2e0 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46  de->pInode==pDbF
2c2f0 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20  d->pInode );..  
2c300 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63  /* Remove connec
2c310 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20  tion p from the 
2c320 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f  set of connectio
2c330 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  ns associated.  
2c340 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65  ** with pShmNode
2c350 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
2c360 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
2c370 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f  de->mutex);.  fo
2c380 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e  r(pp=&pShmNode->
2c390 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70  pFirst; (*pp)!=p
2c3a0 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70  ; pp = &(*pp)->p
2c3b0 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20  Next){}.  *pp = 
2c3c0 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20  p->pNext;..  /* 
2c3d0 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  Free the connect
2c3e0 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74  ion p */.  sqlit
2c3f0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44  e3_free(p);.  pD
2c400 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20  bFd->pShm = 0;. 
2c410 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
2c420 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
2c430 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  utex);..  /* If 
2c440 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68  pShmNode->nRef h
2c450 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74 68  as reached 0, th
2c460 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64  en close the und
2c470 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61  erlying.  ** sha
2c480 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
2c490 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e   too */.  unixEn
2c4a0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73  terMutex();.  as
2c4b0 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
2c4c0 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d  nRef>0 );.  pShm
2c4d0 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  Node->nRef--;.  
2c4e0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
2c4f0 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ef==0 ){.    if(
2c500 20 64 65 6c 65 74 65 46 6c 61 67 20 26 26 20 70   deleteFlag && p
2c510 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 20  ShmNode->h>=0 ) 
2c520 7b 0a 20 20 20 20 20 20 69 66 20 28 64 65 6c 65  {.      if (dele
2c530 74 65 46 6c 61 67 20 3d 3d 20 31 29 20 7b 20 0a  teFlag == 1) { .
2c540 20 20 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b          osUnlink
2c550 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65  (pShmNode->zFile
2c560 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 20 65  name);.      } e
2c570 6c 73 65 20 69 66 20 28 64 65 6c 65 74 65 46 6c  lse if (deleteFl
2c580 61 67 20 3d 3d 20 32 29 20 7b 0a 20 20 20 20 20  ag == 2) {.     
2c590 20 20 20 2f 2a 20 66 74 72 75 6e 63 61 74 65 28     /* ftruncate(
2c5a0 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 33 32 20  pShmNode->h, 32 
2c5b0 2a 20 31 30 32 34 29 3b 20 2a 2f 0a 20 20 20 20  * 1024); */.    
2c5c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e    }.    }.    un
2c5d0 69 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  ixShmPurge(pDbFd
2c5e0 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61  );.  }.  unixLea
2c5f0 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65  veMutex();..  re
2c600 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2c610 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }...#else.# defi
2c620 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20  ne unixShmMap   
2c630 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69    0.# define uni
2c640 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20  xShmLock    0.# 
2c650 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 42 61  define unixShmBa
2c660 72 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65  rrier 0.# define
2c670 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20   unixShmUnmap   
2c680 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  0.#endif /* #ifn
2c690 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2c6a0 57 41 4c 20 2a 2f 0a 0a 23 69 66 20 28 53 51 4c  WAL */..#if (SQL
2c6b0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45  ITE_ENABLE_APPLE
2c6c0 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e  _SPI>0) && defin
2c6d0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 73 74  ed(__APPLE__).st
2c6e0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
2c6f0 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72  *unixTempFileDir
2c700 28 76 6f 69 64 29 3b 0a 0a 73 74 61 74 69 63 20  (void);..static 
2c710 69 6e 74 20 75 6e 69 78 49 6e 76 61 6c 69 64 61  int unixInvalida
2c720 74 65 53 75 70 70 6f 72 74 46 69 6c 65 73 28 75  teSupportFiles(u
2c730 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
2c740 69 6e 74 20 73 6b 69 70 57 41 4c 29 20 7b 0a 20  int skipWAL) {. 
2c750 20 63 68 61 72 20 6a 50 61 74 68 5b 4d 41 58 50   char jPath[MAXP
2c760 41 54 48 4c 45 4e 2b 39 5d 3b 0a 20 20 69 6e 74  ATHLEN+9];.  int
2c770 20 7a 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28   zLen = strlcpy(
2c780 6a 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 7a 50  jPath, pFile->zP
2c790 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 2b  ath, MAXPATHLEN+
2c7a0 39 29 3b 0a 20 20 69 66 28 20 7a 4c 65 6e 3c 4d  9);.  if( zLen<M
2c7b0 41 58 50 41 54 48 4c 45 4e 20 29 7b 0a 20 20 20  AXPATHLEN ){.   
2c7c0 20 73 69 7a 65 5f 74 20 6a 4c 65 6e 3b 0a 20 20   size_t jLen;.  
2c7d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 65 78 74    const char ext
2c7e0 65 6e 73 69 6f 6e 73 5b 33 5d 5b 39 5d 20 3d 20  ensions[3][9] = 
2c7f0 7b 20 22 2d 77 61 6c 22 2c 20 22 2d 6a 6f 75 72  { "-wal", "-jour
2c800 6e 61 6c 22 2c 20 22 2d 73 68 6d 22 20 7d 3b 0a  nal", "-shm" };.
2c810 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 73 6b 69      int j = (ski
2c820 70 57 41 4c 20 3f 20 31 20 3a 20 30 29 3b 0a 20  pWAL ? 1 : 0);. 
2c830 20 20 20 66 6f 72 28 20 3b 20 6a 3c 33 3b 20 6a     for( ; j<3; j
2c840 2b 2b 20 29 7b 0a 20 20 20 20 20 20 0a 20 20 20  ++ ){.      .   
2c850 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
2c860 65 65 20 69 66 20 74 68 65 20 73 68 6d 20 66 69  ee if the shm fi
2c870 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  le is already op
2c880 65 6e 65 64 20 66 6f 72 20 74 68 69 73 20 70 46  ened for this pF
2c890 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ile */.      if(
2c8a0 20 6a 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20   j==2 ){.       
2c8b0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
2c8c0 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46  ); /* Because pF
2c8d0 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
2c8e0 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
2c8f0 65 61 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  eads */.        
2c900 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
2c910 6d 4e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  mNode = pFile->p
2c920 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
2c930 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 68  .        if( pSh
2c940 6d 4e 6f 64 65 20 26 26 20 21 70 53 68 6d 4e 6f  mNode && !pShmNo
2c950 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 29  de->isReadonly )
2c960 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
2c970 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 0a 20  ct stat sStat;. 
2c980 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2c990 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
2c9a0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
2c9b0 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
2c9c0 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
2c9d0 2d 3e 68 3e 3d 30 20 26 26 20 21 6f 73 46 73 74  ->h>=0 && !osFst
2c9e0 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  at(pShmNode->h, 
2c9f0 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20  &sStat) ){.     
2ca00 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
2ca10 6c 6f 6e 67 20 73 69 7a 65 20 3d 20 28 73 53 74  long size = (sSt
2ca20 61 74 2e 73 74 5f 73 69 7a 65 3c 34 29 20 3f 20  at.st_size<4) ? 
2ca30 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 20 3a 20  sStat.st_size : 
2ca40 34 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  4;.            i
2ca50 66 28 20 73 69 7a 65 3e 30 20 29 7b 0a 20 20 20  f( size>0 ){.   
2ca60 20 20 20 20 20 20 20 20 20 20 20 62 7a 65 72 6f             bzero
2ca70 28 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67  (pShmNode->apReg
2ca80 69 6f 6e 5b 30 5d 2c 20 73 69 7a 65 29 3b 0a 20  ion[0], size);. 
2ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2caa0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
2cab0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
2cac0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2cad0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2cae0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2caf0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2cb00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2cb10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
2cb20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
2cb30 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
2cb40 65 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ex);.        }. 
2cb50 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65         unixLeave
2cb60 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 7d  Mutex();.      }
2cb70 0a 20 20 20 20 20 20 6a 4c 65 6e 20 3d 20 73 74  .      jLen = st
2cb80 72 6c 63 70 79 28 26 6a 50 61 74 68 5b 7a 4c 65  rlcpy(&jPath[zLe
2cb90 6e 5d 2c 20 65 78 74 65 6e 73 69 6f 6e 73 5b 6a  n], extensions[j
2cba0 5d 2c 20 39 29 3b 0a 20 20 20 20 20 20 69 66 28  ], 9);.      if(
2cbb0 20 6a 4c 65 6e 20 3c 20 39 20 29 7b 0a 20 20 20   jLen < 9 ){.   
2cbc0 20 20 20 20 20 69 6e 74 20 6a 66 6c 61 67 73 20       int jflags 
2cbd0 3d 20 28 6a 3c 32 29 20 3f 20 4f 5f 54 52 55 4e  = (j<2) ? O_TRUN
2cbe0 43 20 3a 20 4f 5f 52 44 57 52 3b 0a 20 20 20 20  C : O_RDWR;.    
2cbf0 20 20 20 20 69 6e 74 20 6a 66 64 20 3d 20 6f 70      int jfd = op
2cc00 65 6e 28 6a 50 61 74 68 2c 20 6a 66 6c 61 67 73  en(jPath, jflags
2cc10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  );.        if( j
2cc20 66 64 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  fd==(-1) ){.    
2cc30 20 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f 21        if( errno!
2cc40 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20  =ENOENT ){.     
2cc50 20 20 20 20 20 20 20 70 65 72 72 6f 72 28 6a 50         perror(jP
2cc60 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ath);.          
2cc70 7d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  }.        } else
2cc80 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   {.          if(
2cc90 20 6a 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20   j==2 ){.       
2cca0 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
2ccb0 20 73 53 74 61 74 3b 0a 20 20 20 20 20 20 20 20   sStat;.        
2ccc0 20 20 20 20 69 66 28 20 21 6f 73 46 73 74 61 74      if( !osFstat
2ccd0 28 6a 66 64 2c 20 26 73 53 74 61 74 29 20 29 7b  (jfd, &sStat) ){
2cce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75  .              u
2ccf0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 7a  nsigned long siz
2cd00 65 20 3d 20 28 73 53 74 61 74 2e 73 74 5f 73 69  e = (sStat.st_si
2cd10 7a 65 3c 34 29 20 3f 20 73 53 74 61 74 2e 73 74  ze<4) ? sStat.st
2cd20 5f 73 69 7a 65 20 3a 20 34 3b 0a 20 20 20 20 20  _size : 4;.     
2cd30 20 20 20 20 20 20 20 20 20 69 66 28 20 73 69 7a           if( siz
2cd40 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  e>0 ){.         
2cd50 20 20 20 20 20 20 20 75 69 6e 74 33 32 5f 74 20         uint32_t 
2cd60 7a 65 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  zero = 0;.      
2cd70 20 20 20 20 20 20 20 20 20 20 70 77 72 69 74 65            pwrite
2cd80 28 6a 66 64 2c 20 26 7a 65 72 6f 2c 20 28 73 69  (jfd, &zero, (si
2cd90 7a 65 5f 74 29 73 69 7a 65 2c 20 30 29 3b 0a 20  ze_t)size, 0);. 
2cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2cdb0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2cdc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2cdd0 20 20 20 66 73 79 6e 63 28 6a 66 64 29 3b 0a 20     fsync(jfd);. 
2cde0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 6a           close(j
2cdf0 66 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fd);.        }. 
2ce00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2ce10 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2ce20 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  _OK;.}..static i
2ce30 6e 74 20 75 6e 69 78 55 6e 73 61 66 65 54 72 75  nt unixUnsafeTru
2ce40 6e 63 61 74 65 44 61 74 61 62 61 73 65 28 75 6e  ncateDatabase(un
2ce50 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
2ce60 20 20 2f 2a 20 74 68 69 73 20 69 73 20 6e 61 73    /* this is nas
2ce70 74 79 20 26 20 62 61 64 2e 20 20 64 65 73 74 72  ty & bad.  destr
2ce80 75 63 74 69 6f 6e 20 77 69 74 68 20 70 72 65 6a  uction with prej
2ce90 75 64 69 63 65 2e 20 20 77 65 27 6c 6c 20 6c 6f  udice.  we'll lo
2cea0 73 65 20 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20  se all the.  ** 
2ceb0 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 20 74 68  file locks in th
2cec0 69 73 20 70 72 6f 63 65 73 73 2c 20 68 6f 77 65  is process, howe
2ced0 76 65 72 2e 20 73 71 6c 69 74 65 33 5f 66 69 6c  ver. sqlite3_fil
2cee0 65 5f 63 6f 6e 74 72 6f 6c 20 77 6f 72 6b 73 20  e_control works 
2cef0 70 72 6f 70 65 72 6c 79 2e 0a 20 20 2a 2a 20 42  properly..  ** B
2cf00 75 74 20 69 66 20 69 74 20 66 61 69 6c 73 2c 20  ut if it fails, 
2cf10 74 68 69 73 20 77 6f 72 6b 73 20 61 70 70 72 6f  this works appro
2cf20 78 69 6d 61 74 65 6c 79 0a 20 20 2a 2f 0a 20 20  ximately.  */.  
2cf30 63 68 61 72 20 6a 6f 75 72 6e 61 6c 50 61 74 68  char journalPath
2cf40 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20  [MAXPATHLEN];.  
2cf50 63 68 61 72 20 77 61 6c 50 61 74 68 5b 4d 41 58  char walPath[MAX
2cf60 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20  PATHLEN];.  int 
2cf70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2cf80 20 20 0a 23 69 66 64 65 66 20 44 45 42 55 47 0a    .#ifdef DEBUG.
2cf90 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
2cfa0 2c 20 22 46 6f 72 63 65 20 74 72 75 6e 63 61 74  , "Force truncat
2cfb0 69 6e 67 20 64 61 74 61 62 61 73 65 20 25 73 5c  ing database %s\
2cfc0 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  n", pFile->zPath
2cfd0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 74 72 6c  );.#endif.  strl
2cfe0 63 70 79 28 6a 6f 75 72 6e 61 6c 50 61 74 68 2c  cpy(journalPath,
2cff0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d   pFile->zPath, M
2d000 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 73 74  AXPATHLEN);.  st
2d010 72 6c 63 61 74 28 6a 6f 75 72 6e 61 6c 50 61 74  rlcat(journalPat
2d020 68 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 4d  h, "-journal", M
2d030 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 73 74  AXPATHLEN);.  st
2d040 72 6c 63 70 79 28 77 61 6c 50 61 74 68 2c 20 70  rlcpy(walPath, p
2d050 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58  File->zPath, MAX
2d060 50 41 54 48 4c 45 4e 29 3b 0a 20 20 73 74 72 6c  PATHLEN);.  strl
2d070 63 61 74 28 77 61 6c 50 61 74 68 2c 20 22 2d 77  cat(walPath, "-w
2d080 61 6c 22 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  al", MAXPATHLEN)
2d090 3b 0a 20 20 69 6e 74 20 66 64 31 20 3d 20 70 46  ;.  int fd1 = pF
2d0a0 69 6c 65 2d 3e 68 3b 0a 20 20 69 6e 74 20 72 65  ile->h;.  int re
2d0b0 73 75 6c 74 20 3d 20 30 3b 0a 20 20 72 65 73 75  sult = 0;.  resu
2d0c0 6c 74 20 3d 20 66 74 72 75 6e 63 61 74 65 28 66  lt = ftruncate(f
2d0d0 64 31 2c 20 30 6c 6c 29 3b 0a 20 20 69 66 20 28  d1, 0ll);.  if (
2d0e0 72 65 73 75 6c 74 29 20 7b 0a 20 20 20 20 72 65  result) {.    re
2d0f0 73 75 6c 74 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  sult = errno;.  
2d100 7d 0a 20 20 69 66 20 28 72 65 73 75 6c 74 29 20  }.  if (result) 
2d110 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
2d120 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 73 74 6f  E_IOERR;.    sto
2d130 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
2d140 65 2c 20 72 65 73 75 6c 74 29 3b 0a 20 20 7d 0a  e, result);.  }.
2d150 20 20 0a 20 20 69 6e 74 20 66 64 32 20 3d 20 6f    .  int fd2 = o
2d160 70 65 6e 28 6a 6f 75 72 6e 61 6c 50 61 74 68 2c  pen(journalPath,
2d170 20 4f 5f 52 44 57 52 29 3b 0a 20 20 69 6e 74 20   O_RDWR);.  int 
2d180 72 65 73 75 6c 74 32 20 3d 20 30 3b 0a 20 20 69  result2 = 0;.  i
2d190 66 20 28 66 64 32 20 3c 20 30 29 20 7b 0a 20 20  f (fd2 < 0) {.  
2d1a0 20 20 69 66 20 28 65 72 72 6e 6f 20 21 3d 20 45    if (errno != E
2d1b0 4e 4f 45 4e 54 29 20 7b 0a 20 20 20 20 20 20 72  NOENT) {.      r
2d1c0 65 73 75 6c 74 32 20 3d 20 65 72 72 6e 6f 3b 0a  esult2 = errno;.
2d1d0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
2d1e0 20 20 20 72 65 73 75 6c 74 32 20 3d 20 30 3b 0a     result2 = 0;.
2d1f0 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b      }.  } else {
2d200 0a 20 20 20 20 72 65 73 75 6c 74 32 20 3d 20 66  .    result2 = f
2d210 74 72 75 6e 63 61 74 65 28 66 64 32 2c 20 30 6c  truncate(fd2, 0l
2d220 6c 29 3b 0a 20 20 20 20 69 66 20 28 72 65 73 75  l);.    if (resu
2d230 6c 74 32 29 20 7b 0a 20 20 20 20 20 20 72 65 73  lt2) {.      res
2d240 75 6c 74 32 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  ult2 = errno;.  
2d250 20 20 7d 0a 20 20 7d 0a 20 20 69 66 20 28 72 65    }.  }.  if (re
2d260 73 75 6c 74 32 20 26 26 20 21 72 65 73 75 6c 74  sult2 && !result
2d270 29 20 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ) {.    rc = SQL
2d280 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 73  ITE_IOERR;.    s
2d290 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
2d2a0 69 6c 65 2c 20 72 65 73 75 6c 74 32 29 3b 0a 20  ile, result2);. 
2d2b0 20 7d 0a 20 20 0a 20 20 69 6e 74 20 66 64 33 20   }.  .  int fd3 
2d2c0 3d 20 6f 70 65 6e 28 77 61 6c 50 61 74 68 2c 20  = open(walPath, 
2d2d0 4f 5f 52 44 57 52 29 3b 0a 20 20 69 6e 74 20 72  O_RDWR);.  int r
2d2e0 65 73 75 6c 74 33 20 3d 20 30 3b 0a 20 20 69 66  esult3 = 0;.  if
2d2f0 20 28 66 64 33 20 3c 20 30 29 20 7b 0a 20 20 20   (fd3 < 0) {.   
2d300 20 69 66 20 28 65 72 72 6e 6f 20 21 3d 20 45 4e   if (errno != EN
2d310 4f 45 4e 54 29 20 7b 0a 20 20 20 20 20 20 72 65  OENT) {.      re
2d320 73 75 6c 74 33 20 3d 20 65 72 72 6e 6f 3b 0a 20  sult3 = errno;. 
2d330 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
2d340 20 20 72 65 73 75 6c 74 33 20 3d 20 30 3b 0a 20    result3 = 0;. 
2d350 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a     }.  } else {.
2d360 20 20 20 20 72 65 73 75 6c 74 33 20 3d 20 66 74      result3 = ft
2d370 72 75 6e 63 61 74 65 28 66 64 33 2c 20 30 6c 6c  runcate(fd3, 0ll
2d380 29 3b 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c  );.    if (resul
2d390 74 33 29 20 7b 0a 20 20 20 20 20 20 72 65 73 75  t3) {.      resu
2d3a0 6c 74 33 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  lt3 = errno;.   
2d3b0 20 7d 0a 20 20 7d 0a 20 20 69 66 20 28 72 65 73   }.  }.  if (res
2d3c0 75 6c 74 33 20 26 26 20 21 28 72 65 73 75 6c 74  ult3 && !(result
2d3d0 20 7c 7c 20 72 65 73 75 6c 74 32 29 29 20 7b 0a   || result2)) {.
2d3e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2d3f0 49 4f 45 52 52 3b 0a 20 20 20 20 73 74 6f 72 65  IOERR;.    store
2d400 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
2d410 20 72 65 73 75 6c 74 32 29 3b 0a 20 20 7d 0a 20   result2);.  }. 
2d420 20 0a 20 20 69 66 20 28 66 64 33 20 3e 3d 20 30   .  if (fd3 >= 0
2d430 29 20 7b 0a 20 20 20 20 66 73 79 6e 63 28 66 64  ) {.    fsync(fd
2d440 33 29 3b 0a 20 20 20 20 63 6c 6f 73 65 28 66 64  3);.    close(fd
2d450 33 29 3b 0a 20 20 7d 0a 20 20 69 66 20 28 66 64  3);.  }.  if (fd
2d460 32 20 3e 3d 20 30 29 20 7b 0a 20 20 20 20 66 73  2 >= 0) {.    fs
2d470 79 6e 63 28 66 64 32 29 3b 0a 20 20 20 20 63 6c  ync(fd2);.    cl
2d480 6f 73 65 28 66 64 32 29 3b 0a 20 20 7d 0a 20 20  ose(fd2);.  }.  
2d490 66 73 79 6e 63 28 66 64 31 29 3b 0a 09 0a 20 20  fsync(fd1);...  
2d4a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
2d4b0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75  atic int unixTru
2d4c0 6e 63 61 74 65 44 61 74 61 62 61 73 65 28 75 6e  ncateDatabase(un
2d4d0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  ixFile *pFile, i
2d4e0 6e 74 20 62 46 6c 61 67 73 29 20 7b 0a 20 20 73  nt bFlags) {.  s
2d4f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 20  qlite3_file *id 
2d500 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
2d510 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72  *)pFile;.  int r
2d520 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2d530 20 76 6f 69 64 20 2a 70 4c 6f 63 6b 20 3d 20 4e   void *pLock = N
2d540 55 4c 4c 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73  ULL;.  int flags
2d550 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63 6f 72 72   = 0;.  int corr
2d560 75 70 74 46 69 6c 65 4c 6f 63 6b 20 3d 20 30 3b  uptFileLock = 0;
2d570 0a 20 20 69 6e 74 20 69 73 43 6f 72 72 75 70 74  .  int isCorrupt
2d580 20 3d 20 30 3b 0a 20 20 69 6e 74 20 66 6f 72 63   = 0;.  int forc
2d590 65 20 3d 20 28 62 46 6c 61 67 73 20 26 20 53 51  e = (bFlags & SQ
2d5a0 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 46 4f  LITE_TRUNCATE_FO
2d5b0 52 43 45 29 3b 0a 20 20 69 6e 74 20 73 61 66 65  RCE);.  int safe
2d5c0 46 61 69 6c 65 64 20 3d 20 30 3b 0a 0a 23 69 66  Failed = 0;..#if
2d5d0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44   SQLITE_ENABLE_D
2d5e0 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20  ATA_PROTECTION. 
2d5f0 20 66 6c 61 67 73 20 7c 3d 20 70 46 69 6c 65 2d   flags |= pFile-
2d600 3e 70 72 6f 74 46 6c 61 67 73 3b 0a 23 65 6e 64  >protFlags;.#end
2d610 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  if.#if SQLITE_EN
2d620 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2d630 4c 45 0a 20 20 69 66 28 20 69 73 50 72 6f 78 79  LE.  if( isProxy
2d640 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 46 69 6c  LockingMode(pFil
2d650 65 29 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20  e) ){.    flags 
2d660 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41  |= SQLITE_OPEN_A
2d670 55 54 4f 50 52 4f 58 59 3b 0a 20 20 7d 0a 23 65  UTOPROXY;.  }.#e
2d680 6e 64 69 66 0a 20 20 0a 20 20 72 63 20 3d 20 73  ndif.  .  rc = s
2d690 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72  qlite3demo_super
2d6a0 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 7a 50 61 74  lock(pFile->zPat
2d6b0 68 2c 20 30 2c 20 66 6c 61 67 73 2c 20 30 2c 20  h, 0, flags, 0, 
2d6c0 30 2c 20 26 70 4c 6f 63 6b 29 3b 0a 20 20 69 66  0, &pLock);.  if
2d6d0 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20  ( rc ){.    if( 
2d6e0 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  rc==SQLITE_CORRU
2d6f0 50 54 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  PT || rc==SQLITE
2d700 5f 4e 4f 54 41 44 42 20 29 7b 0a 20 20 20 20 20  _NOTADB ){.     
2d710 20 69 73 43 6f 72 72 75 70 74 20 3d 20 31 3b 0a   isCorrupt = 1;.
2d720 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2d730 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b  e3demo_superlock
2d740 5f 63 6f 72 72 75 70 74 28 69 64 2c 20 53 51 4c  _corrupt(id, SQL
2d750 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49  ITE_LOCK_EXCLUSI
2d760 56 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  VE,.            
2d770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d780 20 20 20 20 20 20 20 20 20 20 20 20 20 26 63 6f               &co
2d790 72 72 75 70 74 46 69 6c 65 4c 6f 63 6b 29 3b 0a  rruptFileLock);.
2d7a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2d7b0 20 26 26 20 21 66 6f 72 63 65 20 29 7b 0a 20 20   && !force ){.  
2d7c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2d7d0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 53 51     }.    rc = SQ
2d7e0 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 49 67 6e 6f  LITE_OK; /* Igno
2d7f0 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 66  re the locking f
2d800 61 69 6c 75 72 65 20 69 66 20 66 6f 72 63 65 20  ailure if force 
2d810 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 7d 0a 20  is true */.  }. 
2d820 20 69 66 28 20 28 62 46 6c 61 67 73 26 53 51 4c   if( (bFlags&SQL
2d830 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 49 4e 49  ITE_TRUNCATE_INI
2d840 54 49 41 4c 49 5a 45 5f 48 45 41 44 45 52 5f 4d  TIALIZE_HEADER_M
2d850 41 53 4b 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f  ASK)!=0 ){.    /
2d860 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  * initialize a n
2d870 65 77 20 64 61 74 61 62 61 73 65 20 69 6e 20 54  ew database in T
2d880 4d 50 44 49 52 20 61 6e 64 20 63 6f 70 79 20 74  MPDIR and copy t
2d890 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 76 65 72  he contents over
2d8a0 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
2d8b0 61 72 20 2a 74 44 69 72 20 3d 20 75 6e 69 78 54  ar *tDir = unixT
2d8c0 65 6d 70 46 69 6c 65 44 69 72 28 29 3b 0a 20 20  empFileDir();.  
2d8d0 20 20 69 6e 74 20 74 44 69 72 4c 65 6e 20 3d 20    int tDirLen = 
2d8e0 73 74 72 6c 65 6e 28 74 44 69 72 29 3b 0a 20 20  strlen(tDir);.  
2d8f0 20 20 69 6e 74 20 74 4c 65 6e 20 3d 20 73 69 7a    int tLen = siz
2d900 65 6f 66 28 63 68 61 72 29 20 2a 20 28 74 44 69  eof(char) * (tDi
2d910 72 4c 65 6e 20 2b 20 31 32 29 3b 0a 20 20 20 20  rLen + 12);.    
2d920 63 68 61 72 20 2a 74 44 62 50 61 74 68 20 3d 20  char *tDbPath = 
2d930 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 74  (char *)malloc(t
2d940 4c 65 6e 29 3b 0a 20 20 20 20 69 6e 74 20 74 46  Len);.    int tF
2d950 64 20 3d 20 2d 31 3b 0a 20 20 20 20 0a 20 20 20  d = -1;.    .   
2d960 20 73 74 72 6c 63 70 79 28 74 44 62 50 61 74 68   strlcpy(tDbPath
2d970 2c 20 74 44 69 72 2c 20 74 4c 65 6e 29 3b 0a 20  , tDir, tLen);. 
2d980 20 20 20 69 66 28 20 74 44 62 50 61 74 68 5b 28     if( tDbPath[(
2d990 74 44 69 72 4c 65 6e 2d 31 29 5d 20 21 3d 20 27  tDirLen-1)] != '
2d9a0 2f 27 20 29 7b 0a 20 20 20 20 20 20 73 74 72 6c  /' ){.      strl
2d9b0 63 61 74 28 74 44 62 50 61 74 68 2c 20 22 2f 74  cat(tDbPath, "/t
2d9c0 6d 70 64 62 58 58 58 58 58 22 2c 20 74 4c 65 6e  mpdbXXXXX", tLen
2d9d0 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
2d9e0 20 20 20 20 20 20 73 74 72 6c 63 61 74 28 74 44        strlcat(tD
2d9f0 62 50 61 74 68 2c 20 22 74 6d 70 64 62 58 58 58  bPath, "tmpdbXXX
2da00 58 58 22 2c 20 74 4c 65 6e 29 3b 0a 20 20 20 20  XX", tLen);.    
2da10 7d 0a 20 20 20 20 74 46 64 20 3d 20 6d 6b 73 74  }.    tFd = mkst
2da20 65 6d 70 28 74 44 62 50 61 74 68 29 3b 0a 20 20  emp(tDbPath);.  
2da30 20 20 69 66 28 20 74 46 64 3d 3d 2d 31 20 29 7b    if( tFd==-1 ){
2da40 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
2da50 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
2da60 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  no);.      rc = 
2da70 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
2da80 20 20 20 20 73 61 66 65 46 61 69 6c 65 64 20 3d      safeFailed =
2da90 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
2daa0 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 74 44       sqlite3 *tD
2dab0 62 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  b = NULL;.      
2dac0 63 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 74  copyfile_state_t
2dad0 20 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 72   s;.      int tr
2dae0 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  c = sqlite3_open
2daf0 5f 76 32 28 74 44 62 50 61 74 68 2c 20 26 74 44  _v2(tDbPath, &tD
2db00 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
2db10 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50        (SQLITE_OP
2db20 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49  EN_CREATE | SQLI
2db30 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
2db40 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E.              
2db50 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
2db60 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29  _OPEN_AUTOPROXY)
2db70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 63  , NULL);.      c
2db80 68 61 72 20 2a 65 72 72 6d 73 67 20 3d 20 4e 55  har *errmsg = NU
2db90 4c 4c 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  LL;.      const 
2dba0 63 68 61 72 20 2a 73 71 6c 20 3d 20 22 22 3b 0a  char *sql = "";.
2dbb0 20 20 20 20 20 20 69 66 28 20 21 74 72 63 20 26        if( !trc &
2dbc0 26 20 28 62 46 6c 61 67 73 26 53 51 4c 49 54 45  & (bFlags&SQLITE
2dbd0 5f 54 52 55 4e 43 41 54 45 5f 50 41 47 45 53 49  _TRUNCATE_PAGESI
2dbe0 5a 45 5f 4d 41 53 4b 29 20 29 7b 0a 20 20 20 20  ZE_MASK) ){.    
2dbf0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 70      const char p
2dc00 61 67 65 73 69 7a 65 5f 73 71 6c 5b 34 5d 5b 32  agesize_sql[4][2
2dc10 32 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20  2] = {.         
2dc20 20 22 70 72 61 67 6d 61 20 70 61 67 65 5f 73 69   "pragma page_si
2dc30 7a 65 3d 31 30 32 34 22 2c 0a 20 20 20 20 20 20  ze=1024",.      
2dc40 20 20 20 20 22 70 72 61 67 6d 61 20 70 61 67 65      "pragma page
2dc50 5f 73 69 7a 65 3d 32 30 34 38 22 2c 0a 20 20 20  _size=2048",.   
2dc60 20 20 20 20 20 20 20 22 70 72 61 67 6d 61 20 70         "pragma p
2dc70 61 67 65 5f 73 69 7a 65 3d 34 30 39 36 22 2c 0a  age_size=4096",.
2dc80 20 20 20 20 20 20 20 20 20 20 22 70 72 61 67 6d            "pragm
2dc90 61 20 70 61 67 65 5f 73 69 7a 65 3d 38 31 39 32  a page_size=8192
2dca0 22 20 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20  " .        };.  
2dcb0 20 20 20 20 20 20 69 6e 74 20 69 50 61 67 65 73        int iPages
2dcc0 69 7a 65 20 3d 20 28 28 28 62 46 6c 61 67 73 26  ize = (((bFlags&
2dcd0 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f  SQLITE_TRUNCATE_
2dce0 50 41 47 45 53 49 5a 45 5f 4d 41 53 4b 29 20 3e  PAGESIZE_MASK) >
2dcf0 3e 20 34 29 20 2d 20 31 29 3b 0a 20 20 20 20 20  > 4) - 1);.     
2dd00 20 20 20 61 73 73 65 72 74 28 20 69 50 61 67 65     assert( iPage
2dd10 73 69 7a 65 3e 3d 30 20 26 26 20 69 50 61 67 65  size>=0 && iPage
2dd20 73 69 7a 65 3c 3d 34 20 29 3b 0a 20 20 20 20 20  size<=4 );.     
2dd30 20 20 20 73 71 6c 20 3d 20 70 61 67 65 73 69 7a     sql = pagesiz
2dd40 65 5f 73 71 6c 5b 69 50 61 67 65 73 69 7a 65 5d  e_sql[iPagesize]
2dd50 3b 0a 20 20 20 20 20 20 20 20 74 72 63 20 3d 20  ;.        trc = 
2dd60 73 71 6c 69 74 65 33 5f 65 78 65 63 28 74 44 62  sqlite3_exec(tDb
2dd70 2c 20 73 71 6c 2c 20 30 2c 20 30 2c 20 26 65 72  , sql, 0, 0, &er
2dd80 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rmsg);.      }. 
2dd90 20 20 20 20 20 69 66 28 20 21 74 72 63 20 29 7b       if( !trc ){
2dda0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
2ddb0 68 61 72 20 61 75 74 6f 76 61 63 75 75 6d 5f 73  har autovacuum_s
2ddc0 71 6c 5b 33 5d 5b 32 31 5d 20 3d 20 7b 0a 20 20  ql[3][21] = {.  
2ddd0 20 20 20 20 20 20 20 20 22 70 72 61 67 6d 61 20          "pragma 
2dde0 61 75 74 6f 5f 76 61 63 75 75 6d 3d 30 22 2c 0a  auto_vacuum=0",.
2ddf0 20 20 20 20 20 20 20 20 20 20 22 70 72 61 67 6d            "pragm
2de00 61 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 31 22  a auto_vacuum=1"
2de10 2c 0a 20 20 20 20 20 20 20 20 20 20 22 70 72 61  ,.          "pra
2de20 67 6d 61 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d  gma auto_vacuum=
2de30 32 22 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20  2".        };.  
2de40 20 20 20 20 20 20 69 6e 74 20 69 41 75 74 6f 76        int iAutov
2de50 61 63 75 75 6d 20 3d 20 32 3b 20 2f 2a 20 64 65  acuum = 2; /* de
2de60 66 61 75 6c 74 20 74 6f 20 69 6e 63 72 65 6d 65  fault to increme
2de70 6e 74 61 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20  ntal */.        
2de80 69 66 28 20 28 62 46 6c 61 67 73 26 53 51 4c 49  if( (bFlags&SQLI
2de90 54 45 5f 54 52 55 4e 43 41 54 45 5f 41 55 54 4f  TE_TRUNCATE_AUTO
2dea0 56 41 43 55 55 4d 5f 4d 41 53 4b 29 20 29 7b 0a  VACUUM_MASK) ){.
2deb0 20 20 20 20 20 20 20 20 20 20 69 41 75 74 6f 76            iAutov
2dec0 61 63 75 75 6d 20 3d 20 28 28 28 62 46 6c 61 67  acuum = (((bFlag
2ded0 73 26 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54  s&SQLITE_TRUNCAT
2dee0 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4d 41 53  E_AUTOVACUUM_MAS
2def0 4b 29 20 3e 3e 20 32 29 20 2d 20 31 29 3b 0a 20  K) >> 2) - 1);. 
2df00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2df10 20 61 73 73 65 72 74 28 20 69 41 75 74 6f 76 61   assert( iAutova
2df20 63 75 75 6d 3e 3d 30 20 26 26 20 69 41 75 74 6f  cuum>=0 && iAuto
2df30 76 61 63 75 75 6d 3c 3d 32 20 29 3b 0a 20 20 20  vacuum<=2 );.   
2df40 20 20 20 20 20 73 71 6c 20 3d 20 61 75 74 6f 76       sql = autov
2df50 61 63 75 75 6d 5f 73 71 6c 5b 69 41 75 74 6f 76  acuum_sql[iAutov
2df60 61 63 75 75 6d 5d 3b 0a 20 20 20 20 20 20 20 20  acuum];.        
2df70 74 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  trc = sqlite3_ex
2df80 65 63 28 74 44 62 2c 20 73 71 6c 2c 20 30 2c 20  ec(tDb, sql, 0, 
2df90 30 2c 20 26 65 72 72 6d 73 67 29 3b 0a 20 20 20  0, &errmsg);.   
2dfa0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
2dfb0 74 72 63 20 26 26 20 28 62 46 6c 61 67 73 26 53  trc && (bFlags&S
2dfc0 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 4a  QLITE_TRUNCATE_J
2dfd0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 20  OURNALMODE_WAL) 
2dfe0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 20 3d  ){.        sql =
2dff0 20 22 70 72 61 67 6d 61 20 6a 6f 75 72 6e 61 6c   "pragma journal
2e000 5f 6d 6f 64 65 3d 77 61 6c 22 3b 0a 20 20 20 20  _mode=wal";.    
2e010 20 20 20 20 74 72 63 20 3d 20 73 71 6c 69 74 65      trc = sqlite
2e020 33 5f 65 78 65 63 28 74 44 62 2c 20 73 71 6c 2c  3_exec(tDb, sql,
2e030 20 30 2c 20 30 2c 20 26 65 72 72 6d 73 67 29 3b   0, 0, &errmsg);
2e040 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2e050 66 28 20 74 72 63 20 29 7b 0a 20 20 20 20 20 20  f( trc ){.      
2e060 20 20 69 66 28 20 21 74 44 62 20 29 7b 0a 20 20    if( !tDb ){.  
2e070 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
2e080 73 74 64 65 72 72 2c 20 22 66 61 69 6c 65 64 20  stderr, "failed 
2e090 74 6f 20 6f 70 65 6e 20 74 65 6d 70 20 64 61 74  to open temp dat
2e0a0 61 62 61 73 65 20 27 25 73 27 20 74 6f 20 72 65  abase '%s' to re
2e0b0 73 65 74 20 22 0a 20 20 20 20 20 20 20 20 20 20  set ".          
2e0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e0d0 22 74 72 75 6e 63 61 74 65 64 20 64 61 74 61 62  "truncated datab
2e0e0 61 73 65 20 25 73 20 77 69 74 68 20 66 6c 61 67  ase %s with flag
2e0f0 73 20 25 78 3a 20 25 64 5c 6e 22 2c 0a 20 20 20  s %x: %d\n",.   
2e100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e110 20 20 20 20 20 20 20 20 74 44 62 50 61 74 68 2c          tDbPath,
2e120 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 62   pFile->zPath, b
2e130 46 6c 61 67 73 2c 20 74 72 63 29 3b 0a 20 20 20  Flags, trc);.   
2e140 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2e150 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
2e160 64 65 72 72 2c 20 22 66 61 69 6c 65 64 20 74 6f  derr, "failed to
2e170 20 73 65 74 20 27 25 73 27 20 6f 6e 20 74 72 75   set '%s' on tru
2e180 6e 63 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ncated database 
2e190 25 73 2c 20 25 64 3a 20 22 0a 20 20 20 20 20 20  %s, %d: ".      
2e1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1b0 20 20 20 20 22 25 73 5c 6e 22 2c 20 73 71 6c 2c      "%s\n", sql,
2e1c0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 74   pFile->zPath, t
2e1d0 72 63 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20 20  rc, errmsg);.   
2e1e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2e1f0 20 20 20 20 20 69 66 28 20 74 44 62 20 29 7b 0a       if( tDb ){.
2e200 20 20 20 20 20 20 20 20 69 6e 74 20 6f 66 66 20          int off 
2e210 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  = 0;.        /* 
2e220 6d 65 72 67 65 20 74 68 65 20 77 61 6c 20 69 6e  merge the wal in
2e230 74 6f 20 74 68 65 20 64 62 20 2a 2f 0a 20 20 20  to the db */.   
2e240 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
2e250 65 5f 63 6f 6e 74 72 6f 6c 28 74 44 62 2c 20 4e  e_control(tDb, N
2e260 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  ULL, SQLITE_FCNT
2e270 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 26  L_PERSIST_WAL, &
2e280 6f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 73 71  off);.        sq
2e290 6c 69 74 65 33 5f 63 6c 6f 73 65 28 74 44 62 29  lite3_close(tDb)
2e2a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2e2b0 73 20 3d 20 63 6f 70 79 66 69 6c 65 5f 73 74 61  s = copyfile_sta
2e2c0 74 65 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  te_alloc();.    
2e2d0 20 20 6c 73 65 65 6b 28 74 46 64 2c 20 30 2c 20    lseek(tFd, 0, 
2e2e0 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 20  SEEK_SET);.     
2e2f0 20 6c 73 65 65 6b 28 70 46 69 6c 65 2d 3e 68 2c   lseek(pFile->h,
2e300 20 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20   0, SEEK_SET);. 
2e310 20 20 20 20 20 69 66 28 20 66 63 6f 70 79 66 69       if( fcopyfi
2e320 6c 65 28 74 46 64 2c 20 70 46 69 6c 65 2d 3e 68  le(tFd, pFile->h
2e330 2c 20 73 2c 20 43 4f 50 59 46 49 4c 45 5f 44 41  , s, COPYFILE_DA
2e340 54 41 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  TA) ){.        i
2e350 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20  nt err=errno;.  
2e360 20 20 20 20 20 20 73 77 69 74 63 68 28 65 72 72        switch(err
2e370 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61  ) {.          ca
2e380 73 65 20 45 4e 4f 4d 45 4d 3a 0a 20 20 20 20 20  se ENOMEM:.     
2e390 20 20 20 20 20 20 20 74 72 63 20 3d 20 53 51 4c         trc = SQL
2e3a0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2e3b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2e3c0 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
2e3d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 6f  .            sto
2e3e0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
2e3f0 65 2c 20 65 72 72 29 3b 0a 20 20 20 20 20 20 20  e, err);.       
2e400 20 20 20 20 20 74 72 63 20 3d 20 53 51 4c 49 54       trc = SQLIT
2e410 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20  E_IOERR;.       
2e420 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2e430 20 63 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f   copyfile_state_
2e440 66 72 65 65 28 73 29 3b 0a 20 20 20 20 20 20 66  free(s);.      f
2e450 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 29 3b 0a  sync(pFile->h);.
2e460 20 20 20 20 20 20 63 6c 6f 73 65 28 74 46 64 29        close(tFd)
2e470 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 28 74  ;.      unlink(t
2e480 44 62 50 61 74 68 29 3b 0a 20 20 20 20 20 20 69  DbPath);.      i
2e490 66 28 20 74 72 63 21 3d 53 51 4c 49 54 45 5f 4f  f( trc!=SQLITE_O
2e4a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 61 66  K ){.        saf
2e4b0 65 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  eFailed = 1;.   
2e4c0 20 20 20 20 20 72 63 20 3d 20 74 72 63 3b 0a 20       rc = trc;. 
2e4d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2e4e0 20 66 72 65 65 28 74 44 62 50 61 74 68 29 3b 0a   free(tDbPath);.
2e4f0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72    } else {.    r
2e500 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  c = pFile->pMeth
2e510 6f 64 2d 3e 78 54 72 75 6e 63 61 74 65 28 69 64  od->xTruncate(id
2e520 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 28 28  , .           ((
2e530 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26  pFile->fsFlags &
2e540 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
2e550 49 53 5f 4d 53 44 4f 53 29 20 21 3d 20 30 29 20  IS_MSDOS) != 0) 
2e560 3f 20 31 4c 20 3a 20 30 4c 29 3b 0a 20 20 20 20  ? 1L : 0L);.    
2e570 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2e580 73 61 66 65 46 61 69 6c 65 64 20 3d 20 31 3b 0a  safeFailed = 1;.
2e590 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2e5a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
2e5b0 20 66 6f 72 63 65 20 29 7b 0a 20 20 20 20 72 63   force ){.    rc
2e5c0 20 3d 20 75 6e 69 78 49 6e 76 61 6c 69 64 61 74   = unixInvalidat
2e5d0 65 53 75 70 70 6f 72 74 46 69 6c 65 73 28 70 46  eSupportFiles(pF
2e5e0 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ile, 0);.    if(
2e5f0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 73 61 66   rc ){.      saf
2e600 65 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  eFailed = 1;.   
2e610 20 7d 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e   }.  }.  pFile->
2e620 70 4d 65 74 68 6f 64 2d 3e 78 53 79 6e 63 28 69  pMethod->xSync(i
2e630 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  d, SQLITE_SYNC_F
2e640 55 4c 4c 29 3b 0a 0a 0a 20 20 69 66 28 20 69 73  ULL);...  if( is
2e650 43 6f 72 72 75 70 74 20 29 7b 0a 20 20 20 20 73  Corrupt ){.    s
2e660 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72  qlite3demo_super
2e670 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 69  unlock_corrupt(i
2e680 64 2c 20 63 6f 72 72 75 70 74 46 69 6c 65 4c 6f  d, corruptFileLo
2e690 63 6b 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ck);.  }else if(
2e6a0 20 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71   pLock ){.    sq
2e6b0 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75  lite3demo_superu
2e6c0 6e 6c 6f 63 6b 28 70 4c 6f 63 6b 29 3b 0a 20 20  nlock(pLock);.  
2e6d0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
2e6e0 74 28 66 6f 72 63 65 29 3b 0a 20 20 7d 0a 20 20  t(force);.  }.  
2e6f0 0a 20 20 69 66 28 20 66 6f 72 63 65 20 26 26 20  .  if( force && 
2e700 73 61 66 65 46 61 69 6c 65 64 29 7b 0a 20 20 20  safeFailed){.   
2e710 20 72 63 20 3d 20 75 6e 69 78 55 6e 73 61 66 65   rc = unixUnsafe
2e720 54 72 75 6e 63 61 74 65 44 61 74 61 62 61 73 65  TruncateDatabase
2e730 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 0a  (pFile);.  }.  .
2e740 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2e750 2f 2a 0a 20 2a 2a 20 4c 6f 63 6b 20 6c 6f 63 61  /*. ** Lock loca
2e760 74 69 6f 6e 73 20 66 6f 72 20 73 68 61 72 65 64  tions for shared
2e770 2d 6d 65 6d 6f 72 79 20 6c 6f 63 6b 73 20 75 73  -memory locks us
2e780 65 64 20 62 79 20 57 41 4c 20 6d 6f 64 65 2e 0a  ed by WAL mode..
2e790 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 48 4d 5f   */.#ifndef SHM_
2e7a0 42 41 53 45 0a 23 20 64 65 66 69 6e 65 20 53 48  BASE.# define SH
2e7b0 4d 5f 42 41 53 45 20 20 20 20 20 20 20 20 20 20  M_BASE          
2e7c0 31 32 30 0a 23 20 64 65 66 69 6e 65 20 53 48 4d  120.# define SHM
2e7d0 5f 57 52 49 54 45 20 20 20 20 20 20 20 20 20 53  _WRITE         S
2e7e0 48 4d 5f 42 41 53 45 0a 23 20 64 65 66 69 6e 65  HM_BASE.# define
2e7f0 20 53 48 4d 5f 43 48 45 43 4b 50 4f 49 4e 54 20   SHM_CHECKPOINT 
2e800 20 20 20 28 53 48 4d 5f 42 41 53 45 2b 31 29 0a     (SHM_BASE+1).
2e810 23 20 64 65 66 69 6e 65 20 53 48 4d 5f 52 45 43  # define SHM_REC
2e820 4f 56 45 52 20 20 20 20 20 20 20 28 53 48 4d 5f  OVER       (SHM_
2e830 42 41 53 45 2b 32 29 0a 23 20 64 65 66 69 6e 65  BASE+2).# define
2e840 20 53 48 4d 5f 52 45 41 44 5f 46 49 52 53 54 20   SHM_READ_FIRST 
2e850 20 20 20 28 53 48 4d 5f 42 41 53 45 2b 33 29 0a     (SHM_BASE+3).
2e860 23 20 64 65 66 69 6e 65 20 53 48 4d 5f 52 45 41  # define SHM_REA
2e870 44 5f 53 49 5a 45 20 20 20 20 20 35 0a 23 65 6e  D_SIZE     5.#en
2e880 64 69 66 20 2f 2a 20 53 48 4d 5f 42 41 53 45 20  dif /* SHM_BASE 
2e890 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 74  */../*.** This t
2e8a0 65 73 74 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  est only works f
2e8b0 6f 72 20 6c 6f 63 6b 20 74 65 73 74 69 6e 67 20  or lock testing 
2e8c0 6f 6e 20 75 6e 69 78 2f 70 6f 73 69 78 20 56 46  on unix/posix VF
2e8d0 53 2e 0a 2a 2a 20 41 64 61 70 74 65 64 20 66 72  S..** Adapted fr
2e8e0 6f 6d 20 74 6f 6f 6c 2f 67 65 74 6c 6f 63 6b 2e  om tool/getlock.
2e8f0 63 20 66 34 63 33 39 62 36 35 31 33 37 30 31 35  c f4c39b65137015
2e900 36 63 61 65 39 37 39 35 30 31 61 37 62 31 35 36  6cae979501a7b156
2e910 62 64 62 61 35 30 65 37 63 65 0a 2a 2f 0a 73 74  bdba50e7ce.*/.st
2e920 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63  atic int unixLoc
2e930 6b 73 74 61 74 65 50 69 64 28 75 6e 69 78 46 69  kstatePid(unixFi
2e940 6c 65 20 2a 70 46 69 6c 65 2c 20 70 69 64 5f 74  le *pFile, pid_t
2e950 20 70 69 64 2c 20 69 6e 74 20 2a 70 4c 6f 63 6b   pid, int *pLock
2e960 73 74 61 74 65 29 7b 0a 20 20 69 6e 74 20 68 44  state){.  int hD
2e970 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  b;        /* Fil
2e980 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
2e990 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
2e9a0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
2e9b0 20 68 53 68 6d 20 3d 20 2d 31 3b 20 20 2f 2a 20   hShm = -1;  /* 
2e9c0 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
2e9d0 66 6f 72 20 57 41 4c 20 73 68 61 72 65 64 2d 6d  for WAL shared-m
2e9e0 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
2e9f0 73 73 69 7a 65 5f 74 20 67 6f 74 3b 20 20 20 20  ssize_t got;    
2ea00 2f 2a 20 42 79 74 65 73 20 72 65 61 64 20 66 72  /* Bytes read fr
2ea10 6f 6d 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  om header */.  i
2ea20 6e 74 20 69 73 57 61 6c 20 3d 20 30 3b 20 20 20  nt isWal = 0;   
2ea30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2ea40 65 20 69 66 20 69 6e 20 57 41 4c 20 6d 6f 64 65  e if in WAL mode
2ea50 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 20   */.  int nLock 
2ea60 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2ea70 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f   /* Number of lo
2ea80 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e  cks held */.  in
2ea90 74 20 6e 6f 48 64 72 20 3d 20 30 3b 20 20 20 20  t noHdr = 0;    
2eaa0 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f           /* Zero
2eab0 20 62 79 74 65 20 44 42 20 68 61 73 20 6e 6f 20   byte DB has no 
2eac0 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 6e 73 69  header */.  unsi
2ead0 67 6e 65 64 20 63 68 61 72 20 61 48 64 72 5b 31  gned char aHdr[1
2eae0 30 30 5d 3b 20 20 20 2f 2a 20 44 61 74 61 62 61  00];   /* Databa
2eaf0 73 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 0a  se header */.  .
2eb00 20 20 61 73 73 65 72 74 28 70 4c 6f 63 6b 73 74    assert(pLockst
2eb10 61 74 65 29 3b 0a 20 20 0a 20 20 2f 2a 20 6d 61  ate);.  .  /* ma
2eb20 6b 65 20 73 75 72 65 20 77 65 20 61 72 65 20 64  ke sure we are d
2eb30 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 64 61  ealing with a da
2eb40 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2eb50 20 68 44 62 20 3d 20 70 46 69 6c 65 2d 3e 68 3b   hDb = pFile->h;
2eb60 0a 20 20 69 66 28 20 68 44 62 3c 30 20 29 7b 0a  .  if( hDb<0 ){.
2eb70 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61 74 65 20      *pLockstate 
2eb80 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41  = SQLITE_LOCKSTA
2eb90 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65  TE_ERROR;.    re
2eba0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2ebb0 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  R;.  }.  assert(
2ebc0 20 28 73 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f   (strlen(SQLITE_
2ebd0 46 49 4c 45 5f 48 45 41 44 45 52 29 2b 31 29 3d  FILE_HEADER)+1)=
2ebe0 3d 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41  =SQLITE_FILE_HEA
2ebf0 44 45 52 5f 4c 45 4e 20 29 3b 0a 20 20 67 6f 74  DER_LEN );.  got
2ec00 20 3d 20 70 72 65 61 64 28 68 44 62 2c 20 61 48   = pread(hDb, aH
2ec10 64 72 2c 20 31 30 30 2c 20 30 29 3b 0a 20 20 69  dr, 100, 0);.  i
2ec20 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
2ec30 2a 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53 51  *pLockstate = SQ
2ec40 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 45  LITE_LOCKSTATE_E
2ec50 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
2ec60 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2ec70 20 7d 0a 20 20 69 66 28 20 67 6f 74 3d 3d 30 20   }.  if( got==0 
2ec80 29 7b 0a 20 20 20 20 6e 6f 48 64 72 20 3d 20 31  ){.    noHdr = 1
2ec90 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f  ;.  }else if( go
2eca0 74 21 3d 31 30 30 0a 20 20 20 20 20 20 20 20 20  t!=100.         
2ecb0 7c 7c 20 6d 65 6d 63 6d 70 28 61 48 64 72 2c 20  || memcmp(aHdr, 
2ecc0 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41 44  SQLITE_FILE_HEAD
2ecd0 45 52 2c 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f  ER, SQLITE_FILE_
2ece0 48 45 41 44 45 52 5f 4c 45 4e 29 21 3d 30 0a 20  HEADER_LEN)!=0. 
2ecf0 20 29 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b 73 74   ){.    *pLockst
2ed00 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43  ate = SQLITE_LOC
2ed10 4b 53 54 41 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  KSTATE_NOTADB;. 
2ed20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2ed30 5f 4e 4f 54 41 44 42 3b 0a 20 20 7d 0a 20 20 0a  _NOTADB;.  }.  .
2ed40 20 20 2f 2a 20 46 69 72 73 74 20 63 68 65 63 6b    /* First check
2ed50 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
2ed60 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 6e 4c 6f 63  e lock */.  nLoc
2ed70 6b 20 2b 3d 20 75 6e 69 78 49 73 4c 6f 63 6b 65  k += unixIsLocke
2ed80 64 28 70 69 64 2c 20 68 44 62 2c 20 46 5f 52 44  d(pid, hDb, F_RD
2ed90 4c 43 4b 2c 20 53 48 41 52 45 44 5f 46 49 52 53  LCK, SHARED_FIRS
2eda0 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 0a  T, SHARED_SIZE,.
2edb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2edc0 20 20 20 20 20 20 20 20 22 45 58 43 4c 55 53 49          "EXCLUSI
2edd0 56 45 22 29 3b 0a 20 20 69 66 20 28 21 6e 6f 48  VE");.  if (!noH
2ede0 64 72 29 20 7b 0a 20 20 20 20 69 73 57 61 6c 20  dr) {.    isWal 
2edf0 3d 20 61 48 64 72 5b 31 38 5d 3d 3d 32 3b 0a 20  = aHdr[18]==2;. 
2ee00 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 63 6b 3d 3d   }.  if( nLock==
2ee10 30 20 26 26 20 69 73 57 61 6c 3d 3d 30 20 29 7b  0 && isWal==0 ){
2ee20 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  .    /* Rollback
2ee30 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 6e 4c 6f   mode */.    nLo
2ee40 63 6b 20 2b 3d 20 75 6e 69 78 49 73 4c 6f 63 6b  ck += unixIsLock
2ee50 65 64 28 70 69 64 2c 20 68 44 62 2c 20 46 5f 57  ed(pid, hDb, F_W
2ee60 52 4c 43 4b 2c 20 50 45 4e 44 49 4e 47 5f 42 59  RLCK, PENDING_BY
2ee70 54 45 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2b  TE, SHARED_SIZE+
2ee80 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2,.             
2ee90 20 20 20 20 20 20 20 20 20 20 20 20 20 22 50 45               "PE
2eea0 4e 44 49 4e 47 7c 52 45 53 45 52 56 45 44 7c 53  NDING|RESERVED|S
2eeb0 48 41 52 45 44 22 29 3b 0a 20 20 7d 0a 20 20 69  HARED");.  }.  i
2eec0 66 28 20 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 69  f( nLock==0 && i
2eed0 73 57 61 6c 21 3d 30 20 29 7b 0a 20 20 20 20 2f  sWal!=0 ){.    /
2eee0 2a 20 6c 6f 6f 6b 75 70 20 74 68 65 20 66 69 6c  * lookup the fil
2eef0 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
2ef00 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
2ef10 72 79 20 66 69 6c 65 20 69 66 20 77 65 20 68 61  ry file if we ha
2ef20 76 65 20 69 74 20 6f 70 65 6e 0a 20 20 20 20 2a  ve it open.    *
2ef30 2a 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  * in this proces
2ef40 73 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74  s */.    unixEnt
2ef50 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65  erMutex(); /* Be
2ef60 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
2ef70 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
2ef80 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a  ross threads */.
2ef90 20 20 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20      unixShmNode 
2efa0 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 46 69 6c  *pShmNode = pFil
2efb0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  e->pInode->pShmN
2efc0 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 70 53 68  ode;.    if( pSh
2efd0 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 73  mNode ){.      s
2efe0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
2eff0 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
2f000 65 78 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  ex);.      .    
2f010 20 20 68 53 68 6d 20 3d 20 70 53 68 6d 4e 6f 64    hShm = pShmNod
2f020 65 2d 3e 68 3b 0a 20 20 20 20 20 20 69 66 28 20  e->h;.      if( 
2f030 68 53 68 6d 20 3e 3d 20 30 29 7b 0a 20 20 20 20  hShm >= 0){.    
2f040 20 20 20 20 69 66 28 20 75 6e 69 78 49 73 4c 6f      if( unixIsLo
2f050 63 6b 65 64 28 70 69 64 2c 20 68 53 68 6d 2c 20  cked(pid, hShm, 
2f060 46 5f 52 44 4c 43 4b 2c 20 53 48 4d 5f 52 45 43  F_RDLCK, SHM_REC
2f070 4f 56 45 52 2c 20 31 2c 20 22 57 41 4c 2d 52 45  OVER, 1, "WAL-RE
2f080 43 4f 56 45 52 59 22 29 20 7c 7c 0a 20 20 20 20  COVERY") ||.    
2f090 20 20 20 20 20 20 20 75 6e 69 78 49 73 4c 6f 63         unixIsLoc
2f0a0 6b 65 64 28 70 69 64 2c 20 68 53 68 6d 2c 20 46  ked(pid, hShm, F
2f0b0 5f 52 44 4c 43 4b 2c 20 53 48 4d 5f 57 52 49 54  _RDLCK, SHM_WRIT
2f0c0 45 2c 20 31 2c 20 22 57 41 4c 2d 57 52 49 54 45  E, 1, "WAL-WRITE
2f0d0 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ") ){.          
2f0e0 6e 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20  nLock = 1;.     
2f0f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2f100 20 20 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65     .      sqlite
2f110 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
2f120 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
2f130 20 20 20 20 7d 20 0a 20 20 20 20 0a 20 20 20 20      } .    .    
2f140 69 66 28 20 68 53 68 6d 3c 30 20 29 7b 0a 20 20  if( hShm<0 ){.  
2f150 20 20 20 20 2f 2a 20 74 68 65 20 73 68 61 72 65      /* the share
2f160 64 20 6d 65 6d 6f 72 79 20 66 69 6c 65 20 69 73  d memory file is
2f170 6e 27 74 20 6f 70 65 6e 20 69 6e 20 74 68 69 73  n't open in this
2f180 20 70 72 6f 63 65 73 73 20 73 70 61 63 65 2c 20   process space, 
2f190 6f 70 65 6e 20 6f 75 72 0a 20 20 20 20 20 20 2a  open our.      *
2f1a0 2a 20 6f 77 6e 20 46 44 20 2a 2f 0a 20 20 20 20  * own FD */.    
2f1b0 20 20 63 68 61 72 20 7a 53 68 6d 5b 4d 41 58 50    char zShm[MAXP
2f1c0 41 54 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 0a  ATHLEN];.      .
2f1d0 20 20 20 20 20 20 2f 2a 20 57 41 4c 20 6d 6f 64        /* WAL mod
2f1e0 65 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 6c 63  e */.      strlc
2f1f0 70 79 28 7a 53 68 6d 2c 20 70 46 69 6c 65 2d 3e  py(zShm, pFile->
2f200 7a 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  zPath, MAXPATHLE
2f210 4e 29 3b 0a 20 20 20 20 20 20 73 74 72 6c 63 61  N);.      strlca
2f220 74 28 7a 53 68 6d 2c 20 22 2d 73 68 6d 22 2c 20  t(zShm, "-shm", 
2f230 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20  MAXPATHLEN);.   
2f240 20 20 20 68 53 68 6d 20 3d 20 6f 70 65 6e 28 7a     hShm = open(z
2f250 53 68 6d 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30  Shm, O_RDONLY, 0
2f260 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 53 68  );.      if( hSh
2f270 6d 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  m<0 ){.        *
2f280 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53 51 4c  pLockstate = SQL
2f290 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4f 46  ITE_LOCKSTATE_OF
2f2a0 46 3b 0a 20 20 20 20 20 20 20 20 75 6e 69 78 4c  F;.        unixL
2f2b0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
2f2c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2f2d0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2f2e0 20 20 20 20 20 69 66 28 20 75 6e 69 78 49 73 4c       if( unixIsL
2f2f0 6f 63 6b 65 64 28 70 69 64 2c 20 68 53 68 6d 2c  ocked(pid, hShm,
2f300 20 46 5f 52 44 4c 43 4b 2c 20 53 48 4d 5f 52 45   F_RDLCK, SHM_RE
2f310 43 4f 56 45 52 2c 20 31 2c 20 22 57 41 4c 2d 52  COVER, 1, "WAL-R
2f320 45 43 4f 56 45 52 59 22 29 20 7c 7c 0a 20 20 20  ECOVERY") ||.   
2f330 20 20 20 20 20 20 75 6e 69 78 49 73 4c 6f 63 6b        unixIsLock
2f340 65 64 28 70 69 64 2c 20 68 53 68 6d 2c 20 46 5f  ed(pid, hShm, F_
2f350 52 44 4c 43 4b 2c 20 53 48 4d 5f 57 52 49 54 45  RDLCK, SHM_WRITE
2f360 2c 20 31 2c 20 22 57 41 4c 2d 57 52 49 54 45 22  , 1, "WAL-WRITE"
2f370 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4c 6f  ) ){.        nLo
2f380 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ck = 1;.      }.
2f390 20 20 20 20 20 20 63 6c 6f 73 65 28 68 53 68 6d        close(hShm
2f3a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69  );.    }.    uni
2f3b0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
2f3c0 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 63 6b 3e 30   }.  if( nLock>0
2f3d0 20 29 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b 73 74   ){.    *pLockst
2f3e0 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43  ate = SQLITE_LOC
2f3f0 4b 53 54 41 54 45 5f 4f 4e 3b 0a 20 20 7d 20 65  KSTATE_ON;.  } e
2f400 6c 73 65 20 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b  lse {.    *pLock
2f410 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c  state = SQLITE_L
2f420 4f 43 4b 53 54 41 54 45 5f 4f 46 46 3b 0a 20 20  OCKSTATE_OFF;.  
2f430 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
2f440 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  E_OK;.}..#endif 
2f450 2f 2a 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  /* (SQLITE_ENABL
2f460 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26  E_APPLE_SPI>0) &
2f470 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
2f480 45 5f 5f 29 20 2a 2f 0a 0a 23 69 66 20 53 51 4c  E__) */..#if SQL
2f490 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
2f4a0 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20  E>0./*.** If it 
2f4b0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6d 65 6d  is currently mem
2f4c0 6f 72 79 20 6d 61 70 70 65 64 2c 20 75 6e 6d 61  ory mapped, unma
2f4d0 70 20 66 69 6c 65 20 70 46 64 2e 0a 2a 2f 0a 73  p file pFd..*/.s
2f4e0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 55  tatic void unixU
2f4f0 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c  nmapfile(unixFil
2f500 65 20 2a 70 46 64 29 7b 0a 20 20 61 73 73 65 72  e *pFd){.  asser
2f510 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  t( pFd->nFetchOu
2f520 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46  t==0 );.  if( pF
2f530 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b  d->pMapRegion ){
2f540 0a 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 46  .    osMunmap(pF
2f550 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 20 70  d->pMapRegion, p
2f560 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
2f570 61 6c 29 3b 0a 20 20 20 20 70 46 64 2d 3e 70 4d  al);.    pFd->pM
2f580 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20  apRegion = 0;.  
2f590 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20    pFd->mmapSize 
2f5a0 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d  = 0;.    pFd->mm
2f5b0 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30  apSizeActual = 0
2f5c0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
2f5d0 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68  ttempt to set th
2f5e0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 65  e size of the me
2f5f0 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 69  mory mapping mai
2f600 6e 74 61 69 6e 65 64 20 62 79 20 66 69 6c 65 20  ntained by file 
2f610 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 70  .** descriptor p
2f620 46 64 20 74 6f 20 6e 4e 65 77 20 62 79 74 65 73  Fd to nNew bytes
2f630 2e 20 41 6e 79 20 65 78 69 73 74 69 6e 67 20 6d  . Any existing m
2f640 61 70 70 69 6e 67 20 69 73 20 64 69 73 63 61 72  apping is discar
2f650 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ded..**.** If su
2f660 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 66  ccessful, this f
2f670 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65  unction sets the
2f680 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
2f690 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  bles:.**.**     
2f6a0 20 20 75 6e 69 78 46 69 6c 65 2e 70 4d 61 70 52    unixFile.pMapR
2f6b0 65 67 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 75  egion.**       u
2f6c0 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65  nixFile.mmapSize
2f6d0 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69  .**       unixFi
2f6e0 6c 65 2e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  le.mmapSizeActua
2f6f0 6c 0a 2a 2a 0a 2a 2a 20 49 66 20 75 6e 73 75 63  l.**.** If unsuc
2f700 63 65 73 73 66 75 6c 2c 20 61 6e 20 65 72 72 6f  cessful, an erro
2f710 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 6f 67  r message is log
2f720 67 65 64 20 76 69 61 20 73 71 6c 69 74 65 33 5f  ged via sqlite3_
2f730 6c 6f 67 28 29 20 61 6e 64 0a 2a 2a 20 74 68 65  log() and.** the
2f740 20 74 68 72 65 65 20 76 61 72 69 61 62 6c 65 73   three variables
2f750 20 61 62 6f 76 65 20 61 72 65 20 7a 65 72 6f 65   above are zeroe
2f760 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
2f770 53 51 4c 69 74 65 20 73 68 6f 75 6c 64 0a 2a 2a  SQLite should.**
2f780 20 63 6f 6e 74 69 6e 75 65 20 61 63 63 65 73 73   continue access
2f790 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
2f7a0 20 75 73 69 6e 67 20 74 68 65 20 78 52 65 61 64   using the xRead
2f7b0 28 29 20 61 6e 64 20 78 57 72 69 74 65 28 29 0a  () and xWrite().
2f7c0 2a 2a 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73  ** methods..*/.s
2f7d0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 52  tatic void unixR
2f7e0 65 6d 61 70 66 69 6c 65 28 0a 20 20 75 6e 69 78  emapfile(.  unix
2f7f0 46 69 6c 65 20 2a 70 46 64 2c 20 20 20 20 20 20  File *pFd,      
2f800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2f810 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
2f820 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36 34 20 6e  bject */.  i64 n
2f830 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 20 20  New             
2f840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2f850 71 75 69 72 65 64 20 6d 61 70 70 69 6e 67 20 73  quired mapping s
2f860 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ize */.){.  cons
2f870 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 22  t char *zErr = "
2f880 6d 6d 61 70 22 3b 0a 20 20 69 6e 74 20 68 20 3d  mmap";.  int h =
2f890 20 70 46 64 2d 3e 68 3b 20 20 20 20 20 20 20 20   pFd->h;        
2f8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f8b0 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
2f8c0 20 6f 70 65 6e 20 6f 6e 20 64 62 20 66 69 6c 65   open on db file
2f8d0 20 2a 2f 0a 20 20 75 38 20 2a 70 4f 72 69 67 20   */.  u8 *pOrig 
2f8e0 3d 20 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61  = (u8 *)pFd->pMa
2f8f0 70 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 50 6f  pRegion;   /* Po
2f900 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74  inter to current
2f910 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 2a 2f   file mapping */
2f920 0a 20 20 69 36 34 20 6e 4f 72 69 67 20 3d 20 70  .  i64 nOrig = p
2f930 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
2f940 61 6c 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  al;     /* Size 
2f950 6f 66 20 70 4f 72 69 67 20 72 65 67 69 6f 6e 20  of pOrig region 
2f960 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 38  in bytes */.  u8
2f970 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20   *pNew = 0;     
2f980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f990 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 6f     /* Location o
2f9a0 66 20 6e 65 77 20 6d 61 70 70 69 6e 67 20 2a 2f  f new mapping */
2f9b0 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 50  .  int flags = P
2f9c0 52 4f 54 5f 52 45 41 44 3b 20 20 20 20 20 20 20  ROT_READ;       
2f9d0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
2f9e0 20 74 6f 20 70 61 73 73 20 74 6f 20 6d 6d 61 70   to pass to mmap
2f9f0 28 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  () */..  assert(
2fa00 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d   pFd->nFetchOut=
2fa10 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2fa20 6e 4e 65 77 3e 70 46 64 2d 3e 6d 6d 61 70 53 69  nNew>pFd->mmapSi
2fa30 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
2fa40 6e 4e 65 77 3c 3d 70 46 64 2d 3e 6d 6d 61 70 53  nNew<=pFd->mmapS
2fa50 69 7a 65 4d 61 78 20 29 3b 0a 20 20 61 73 73 65  izeMax );.  asse
2fa60 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20  rt( nNew>0 );.  
2fa70 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6d 6d 61  assert( pFd->mma
2fa80 70 53 69 7a 65 41 63 74 75 61 6c 3e 3d 70 46 64  pSizeActual>=pFd
2fa90 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20  ->mmapSize );.  
2faa0 61 73 73 65 72 74 28 20 4d 41 50 5f 46 41 49 4c  assert( MAP_FAIL
2fab0 45 44 21 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  ED!=0 );..  if( 
2fac0 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20  (pFd->ctrlFlags 
2fad0 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c  & UNIXFILE_RDONL
2fae0 59 29 3d 3d 30 20 29 20 66 6c 61 67 73 20 7c 3d  Y)==0 ) flags |=
2faf0 20 50 52 4f 54 5f 57 52 49 54 45 3b 0a 0a 20 20   PROT_WRITE;..  
2fb00 69 66 28 20 70 4f 72 69 67 20 29 7b 0a 23 69 66  if( pOrig ){.#if
2fb10 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20   HAVE_MREMAP.   
2fb20 20 69 36 34 20 6e 52 65 75 73 65 20 3d 20 70 46   i64 nReuse = pF
2fb30 64 2d 3e 6d 6d 61 70 53 69 7a 65 3b 0a 23 65 6c  d->mmapSize;.#el
2fb40 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  se.    const int
2fb50 20 73 7a 53 79 73 70 61 67 65 20 3d 20 6f 73 47   szSyspage = osG
2fb60 65 74 70 61 67 65 73 69 7a 65 28 29 3b 0a 20 20  etpagesize();.  
2fb70 20 20 69 36 34 20 6e 52 65 75 73 65 20 3d 20 28    i64 nReuse = (
2fb80 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 26 20  pFd->mmapSize & 
2fb90 7e 28 73 7a 53 79 73 70 61 67 65 2d 31 29 29 3b  ~(szSyspage-1));
2fba0 0a 23 65 6e 64 69 66 0a 20 20 20 20 75 38 20 2a  .#endif.    u8 *
2fbb0 70 52 65 71 20 3d 20 26 70 4f 72 69 67 5b 6e 52  pReq = &pOrig[nR
2fbc0 65 75 73 65 5d 3b 0a 0a 20 20 20 20 2f 2a 20 55  euse];..    /* U
2fbd0 6e 6d 61 70 20 61 6e 79 20 70 61 67 65 73 20 6f  nmap any pages o
2fbe0 66 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d  f the existing m
2fbf0 61 70 70 69 6e 67 20 74 68 61 74 20 63 61 6e 6e  apping that cann
2fc00 6f 74 20 62 65 20 72 65 75 73 65 64 2e 20 2a 2f  ot be reused. */
2fc10 0a 20 20 20 20 69 66 28 20 6e 52 65 75 73 65 21  .    if( nReuse!
2fc20 3d 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  =nOrig ){.      
2fc30 6f 73 4d 75 6e 6d 61 70 28 70 52 65 71 2c 20 6e  osMunmap(pReq, n
2fc40 4f 72 69 67 2d 6e 52 65 75 73 65 29 3b 0a 20 20  Orig-nReuse);.  
2fc50 20 20 7d 0a 0a 23 69 66 20 48 41 56 45 5f 4d 52    }..#if HAVE_MR
2fc60 45 4d 41 50 0a 20 20 20 20 70 4e 65 77 20 3d 20  EMAP.    pNew = 
2fc70 6f 73 4d 72 65 6d 61 70 28 70 4f 72 69 67 2c 20  osMremap(pOrig, 
2fc80 6e 52 65 75 73 65 2c 20 6e 4e 65 77 2c 20 4d 52  nReuse, nNew, MR
2fc90 45 4d 41 50 5f 4d 41 59 4d 4f 56 45 29 3b 0a 20  EMAP_MAYMOVE);. 
2fca0 20 20 20 7a 45 72 72 20 3d 20 22 6d 72 65 6d 61     zErr = "mrema
2fcb0 70 22 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 4e  p";.#else.    pN
2fcc0 65 77 20 3d 20 6f 73 4d 6d 61 70 28 70 52 65 71  ew = osMmap(pReq
2fcd0 2c 20 6e 4e 65 77 2d 6e 52 65 75 73 65 2c 20 66  , nNew-nReuse, f
2fce0 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41 52 45 44  lags, MAP_SHARED
2fcf0 2c 20 68 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20  , h, nReuse);.  
2fd00 20 20 69 66 28 20 70 4e 65 77 21 3d 4d 41 50 5f    if( pNew!=MAP_
2fd10 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20  FAILED ){.      
2fd20 69 66 28 20 70 4e 65 77 21 3d 70 52 65 71 20 29  if( pNew!=pReq )
2fd30 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d 75 6e 6d  {.        osMunm
2fd40 61 70 28 70 4e 65 77 2c 20 6e 4e 65 77 20 2d 20  ap(pNew, nNew - 
2fd50 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 20 20 20  nReuse);.       
2fd60 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 20   pNew = 0;.     
2fd70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2fd80 70 4e 65 77 20 3d 20 70 4f 72 69 67 3b 0a 20 20  pNew = pOrig;.  
2fd90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
2fda0 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 61  if..    /* The a
2fdb0 74 74 65 6d 70 74 20 74 6f 20 65 78 74 65 6e 64  ttempt to extend
2fdc0 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61   the existing ma
2fdd0 70 70 69 6e 67 20 66 61 69 6c 65 64 2e 20 46 72  pping failed. Fr
2fde0 65 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66  ee it. */.    if
2fdf0 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c  ( pNew==MAP_FAIL
2fe00 45 44 20 7c 7c 20 70 4e 65 77 3d 3d 30 20 29 7b  ED || pNew==0 ){
2fe10 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28  .      osMunmap(
2fe20 70 4f 72 69 67 2c 20 6e 52 65 75 73 65 29 3b 0a  pOrig, nReuse);.
2fe30 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2fe40 49 66 20 70 4e 65 77 20 69 73 20 73 74 69 6c 6c  If pNew is still
2fe50 20 4e 55 4c 4c 2c 20 74 72 79 20 74 6f 20 63 72   NULL, try to cr
2fe60 65 61 74 65 20 61 6e 20 65 6e 74 69 72 65 6c 79  eate an entirely
2fe70 20 6e 65 77 20 6d 61 70 70 69 6e 67 2e 20 2a 2f   new mapping. */
2fe80 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
2fe90 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d  {.    pNew = osM
2fea0 6d 61 70 28 30 2c 20 6e 4e 65 77 2c 20 66 6c 61  map(0, nNew, fla
2feb0 67 73 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c 20  gs, MAP_SHARED, 
2fec0 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  h, 0);.  }..  if
2fed0 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c  ( pNew==MAP_FAIL
2fee0 45 44 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d  ED ){.    pNew =
2fef0 20 30 3b 0a 20 20 20 20 6e 4e 65 77 20 3d 20 30   0;.    nNew = 0
2ff00 3b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72  ;.    unixLogErr
2ff10 6f 72 28 53 51 4c 49 54 45 5f 4f 4b 2c 20 7a 45  or(SQLITE_OK, zE
2ff20 72 72 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b  rr, pFd->zPath);
2ff30 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
2ff40 6d 6d 61 70 28 29 20 61 62 6f 76 65 20 66 61 69  mmap() above fai
2ff50 6c 65 64 2c 20 61 73 73 75 6d 65 20 74 68 61 74  led, assume that
2ff60 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   all subsequent 
2ff70 6d 6d 61 70 28 29 20 63 61 6c 6c 73 0a 20 20 20  mmap() calls.   
2ff80 20 2a 2a 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c   ** will probabl
2ff90 79 20 66 61 69 6c 20 74 6f 6f 2e 20 46 61 6c 6c  y fail too. Fall
2ffa0 20 62 61 63 6b 20 74 6f 20 75 73 69 6e 67 20 78   back to using x
2ffb0 52 65 61 64 2f 78 57 72 69 74 65 20 65 78 63 6c  Read/xWrite excl
2ffc0 75 73 69 76 65 6c 79 0a 20 20 20 20 2a 2a 20 69  usively.    ** i
2ffd0 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f  n this case.  */
2ffe0 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69  .    pFd->mmapSi
2fff0 7a 65 4d 61 78 20 3d 20 30 3b 0a 20 20 7d 0a 20  zeMax = 0;.  }. 
30000 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
30010 20 3d 20 28 76 6f 69 64 20 2a 29 70 4e 65 77 3b   = (void *)pNew;
30020 0a 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  .  pFd->mmapSize
30030 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65   = pFd->mmapSize
30040 41 63 74 75 61 6c 20 3d 20 6e 4e 65 77 3b 0a 7d  Actual = nNew;.}
30050 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d  ../*.** Memory m
30060 61 70 20 6f 72 20 72 65 6d 61 70 20 74 68 65 20  ap or remap the 
30070 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 66  file opened by f
30080 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70  ile-descriptor p
30090 46 64 20 28 69 66 20 74 68 65 20 66 69 6c 65 0a  Fd (if the file.
300a0 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6d 61  ** is already ma
300b0 70 70 65 64 2c 20 74 68 65 20 65 78 69 73 74 69  pped, the existi
300c0 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20 72 65  ng mapping is re
300d0 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 6e 65  placed by the ne
300e0 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a 20 74  w). Or, if .** t
300f0 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69  here already exi
30100 73 74 73 20 61 20 6d 61 70 70 69 6e 67 20 66 6f  sts a mapping fo
30110 72 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e 64  r this file, and
30120 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c   there are still
30130 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67   .** outstanding
30140 20 78 46 65 74 63 68 28 29 20 72 65 66 65 72 65   xFetch() refere
30150 6e 63 65 73 20 74 6f 20 69 74 2c 20 74 68 69 73  nces to it, this
30160 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
30170 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  o-op..**.** If p
30180 61 72 61 6d 65 74 65 72 20 6e 42 79 74 65 20 69  arameter nByte i
30190 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c 20  s non-negative, 
301a0 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72  then it is the r
301b0 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 66  equested size of
301c0 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e 67   .** the mapping
301d0 20 74 6f 20 63 72 65 61 74 65 2e 20 4f 74 68 65   to create. Othe
301e0 72 77 69 73 65 2c 20 69 66 20 6e 42 79 74 65 20  rwise, if nByte 
301f0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
30200 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20  o, then the .** 
30210 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 69  requested size i
30220 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
30230 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  e file on disk. 
30240 54 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20  The actual size 
30250 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65 61 74 65  of the.** create
30260 64 20 6d 61 70 70 69 6e 67 20 69 73 20 65 69 74  d mapping is eit
30270 68 65 72 20 74 68 65 20 72 65 71 75 65 73 74 65  her the requeste
30280 64 20 73 69 7a 65 20 6f 72 20 74 68 65 20 76 61  d size or the va
30290 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20 0a  lue configured .
302a0 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49 54 45 5f  ** using SQLITE_
302b0 46 43 4e 54 4c 5f 4d 4d 41 50 5f 4c 49 4d 49 54  FCNTL_MMAP_LIMIT
302c0 2c 20 77 68 69 63 68 65 76 65 72 20 69 73 20 73  , whichever is s
302d0 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51  maller..**.** SQ
302e0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
302f0 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  ned if no error 
30300 6f 63 63 75 72 73 20 28 65 76 65 6e 20 69 66 20  occurs (even if 
30310 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e  the mapping is n
30320 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74 65 64 20  ot.** recreated 
30330 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 6f  as a result of o
30340 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
30350 65 6e 63 65 73 29 20 6f 72 20 61 6e 20 53 51 4c  ences) or an SQL
30360 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  ite error.** cod
30370 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
30380 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d  static int unixM
30390 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  apfile(unixFile 
303a0 2a 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65 29  *pFd, i64 nByte)
303b0 7b 0a 20 20 69 36 34 20 6e 4d 61 70 20 3d 20 6e  {.  i64 nMap = n
303c0 42 79 74 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Byte;.  int rc;.
303d0 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e  .  assert( nMap>
303e0 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65 74 63  =0 || pFd->nFetc
303f0 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28  hOut==0 );.  if(
30400 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e   pFd->nFetchOut>
30410 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
30420 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d 61  E_OK;..  if( nMa
30430 70 3c 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63  p<0 ){.    struc
30440 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 20  t stat statbuf; 
30450 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d           /* Low-
30460 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72  level file infor
30470 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 72 63  mation */.    rc
30480 20 3d 20 6f 73 46 73 74 61 74 28 70 46 64 2d 3e   = osFstat(pFd->
30490 68 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20  h, &statbuf);.  
304a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
304b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
304c0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
304d0 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20  _FSTAT;.    }.  
304e0 20 20 6e 4d 61 70 20 3d 20 73 74 61 74 62 75 66    nMap = statbuf
304f0 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 7d 0a 20 20  .st_size;.  }.  
30500 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d  if( nMap>pFd->mm
30510 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20  apSizeMax ){.   
30520 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61   nMap = pFd->mma
30530 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 0a 20  pSizeMax;.  }.. 
30540 20 69 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e   if( nMap!=pFd->
30550 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
30560 69 66 28 20 6e 4d 61 70 3e 30 20 29 7b 0a 20 20  if( nMap>0 ){.  
30570 20 20 20 20 75 6e 69 78 52 65 6d 61 70 66 69 6c      unixRemapfil
30580 65 28 70 46 64 2c 20 6e 4d 61 70 29 3b 0a 20 20  e(pFd, nMap);.  
30590 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
305a0 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 64  nixUnmapfile(pFd
305b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
305c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
305d0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
305e0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
305f0 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ZE>0 */../*.** I
30600 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 74 75  f possible, retu
30610 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
30620 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69 6c  a mapping of fil
30630 65 20 66 64 20 73 74 61 72 74 69 6e 67 20 61 74  e fd starting at
30640 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e   offset.** iOff.
30650 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d 75 73   The mapping mus
30660 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72 20 61  t be valid for a
30670 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62 79 74  t least nAmt byt
30680 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  es..**.** If suc
30690 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61 6e 20  h a pointer can 
306a0 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f  be obtained, sto
306b0 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61 6e 64  re it in *pp and
306c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
306d0 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65  K..** Or, if one
306e0 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65   cannot but no e
306f0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
30700 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20 72 65   *pp to 0 and re
30710 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
30720 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61  ** Finally, if a
30730 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  n error does occ
30740 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51  ur, return an SQ
30750 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
30760 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61   The final.** va
30770 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75 6e  lue of *pp is un
30780 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
30790 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
307a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
307b0 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  s return a point
307c0 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d  er, the caller m
307d0 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 20 0a  ust eventually .
307e0 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65 20 72  ** release the r
307f0 65 66 65 72 65 6e 63 65 20 62 79 20 63 61 6c 6c  eference by call
30800 69 6e 67 20 75 6e 69 78 55 6e 66 65 74 63 68 28  ing unixUnfetch(
30810 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
30820 20 75 6e 69 78 46 65 74 63 68 28 73 71 6c 69 74   unixFetch(sqlit
30830 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
30840 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c   iOff, int nAmt,
30850 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66   void **pp){.#if
30860 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
30870 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69  _SIZE>0.  unixFi
30880 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46  le *pFd = (unixF
30890 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54  ile *)fd;   /* T
308a0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
308b0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23  tabase file */.#
308c0 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b  endif.  *pp = 0;
308d0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
308e0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69  _MMAP_SIZE>0.  i
308f0 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  f( pFd->mmapSize
30900 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  Max>0 ){.    if(
30910 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
30920 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
30930 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c   rc = unixMapfil
30940 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20  e(pFd, -1);.    
30950 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30960 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
30970 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
30980 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20  Fd->mmapSize >= 
30990 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20  iOff+nAmt ){.   
309a0 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a     *pp = &((u8 *
309b0 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  )pFd->pMapRegion
309c0 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70  )[iOff];.      p
309d0 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b  Fd->nFetchOut++;
309e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
309f0 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
30a00 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
30a10 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  f the third argu
30a20 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  ment is non-NULL
30a30 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
30a40 74 69 6f 6e 20 72 65 6c 65 61 73 65 73 20 61 20  tion releases a 
30a50 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 62  .** reference ob
30a60 74 61 69 6e 65 64 20 62 79 20 61 6e 20 65 61 72  tained by an ear
30a70 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 75 6e 69  lier call to uni
30a80 78 46 65 74 63 68 28 29 2e 20 54 68 65 20 73 65  xFetch(). The se
30a90 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  cond.** argument
30aa0 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
30ab0 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
30ac0 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
30ad0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
30ae0 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61 74 20  * argument that 
30af0 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  was passed to th
30b00 65 20 75 6e 69 78 46 65 74 63 68 28 29 20 69 6e  e unixFetch() in
30b10 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  vocation. .**.**
30b20 20 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69 72   Or, if the thir
30b30 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55  d argument is NU
30b40 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  LL, then this fu
30b50 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  nction is being 
30b60 63 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20 69 6e  called .** to in
30b70 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c 61 79  form the VFS lay
30b80 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72 64 69  er that, accordi
30b90 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79  ng to POSIX, any
30ba0 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
30bb0 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65  g .** may now be
30bc0 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f   invalid and sho
30bd0 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64 2e  uld be unmapped.
30be0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
30bf0 6e 69 78 55 6e 66 65 74 63 68 28 73 71 6c 69 74  nixUnfetch(sqlit
30c00 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
30c10 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b   iOff, void *p){
30c20 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
30c30 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e  MMAP_SIZE>0.  un
30c40 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75  ixFile *pFd = (u
30c50 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20 20  nixFile *)fd;   
30c60 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
30c70 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
30c80 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
30c90 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a 0a 20 20  METER(iOff);..  
30ca0 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61  /* If p==0 (unma
30cb0 70 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c  p the entire fil
30cc0 65 29 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e) then there mu
30cd0 73 74 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e  st be no outstan
30ce0 64 69 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74 63  ding .  ** xFetc
30cf0 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72  h references. Or
30d00 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69  , if p!=0 (meani
30d10 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46 65 74  ng it is an xFet
30d20 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20  ch reference),. 
30d30 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d   ** then there m
30d40 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
30d50 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e  one outstanding.
30d60 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
30d70 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65  p==0)==(pFd->nFe
30d80 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20  tchOut==0) );.. 
30d90 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20   /* If p!=0, it 
30da0 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65 20 69  must match the i
30db0 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  Off value. */.  
30dc0 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20  assert( p==0 || 
30dd0 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64 2d 3e  p==&((u8 *)pFd->
30de0 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66  pMapRegion)[iOff
30df0 5d 20 29 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b  ] );..  if( p ){
30e00 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68  .    pFd->nFetch
30e10 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Out--;.  }else{.
30e20 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c      unixUnmapfil
30e30 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61  e(pFd);.  }..  a
30e40 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74  ssert( pFd->nFet
30e50 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6c 73  chOut>=0 );.#els
30e60 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
30e70 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53  ETER(fd);.  UNUS
30e80 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
30e90 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
30ea0 54 45 52 28 69 4f 66 66 29 3b 0a 23 65 6e 64 69  TER(iOff);.#endi
30eb0 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
30ec0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48  E_OK;.}../*.** H
30ed0 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70  ere ends the imp
30ee0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
30ef0 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ll sqlite3_file 
30f00 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  methods..**.****
30f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30f20 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66  ** End sqlite3_f
30f30 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a  ile Methods ****
30f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
30f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
30fb0 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e  ** This division
30fc0 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69   contains defini
30fd0 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
30fe0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
30ff0 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c  cts that.** impl
31000 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66 69  ement various fi
31010 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  le locking strat
31020 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f 20  egies.  It also 
31030 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74  contains definit
31040 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64  ions.** of "find
31050 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  er" functions.  
31060 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  A finder-functio
31070 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63  n is used to loc
31080 61 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69  ate the appropri
31090 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69  ate.** sqlite3_i
310a0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
310b0 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61   for a particula
310c0 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  r database file.
310d0 20 20 54 68 65 20 70 41 70 70 44 61 74 61 0a 2a    The pAppData.*
310e0 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73  * field of the s
310f0 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20 6f  qlite3_vfs VFS o
31100 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74 69  bjects are initi
31110 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f 69  alized to be poi
31120 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  nters to.** the 
31130 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d 66  correct finder-f
31140 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61 74  unction for that
31150 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74   VFS..**.** Most
31160 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
31170 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  s return a point
31180 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71  er to a fixed sq
31190 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
311a0 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68 65  .** object.  The
311b0 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69 6e   only interestin
311c0 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  g finder-functio
311d0 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  n is autolockIoF
311e0 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20  inder, which.** 
311f0 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c  looks at the fil
31200 65 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e 64  esystem type and
31210 20 74 72 69 65 73 20 74 6f 20 67 75 65 73 73 20   tries to guess 
31220 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67  the best locking
31230 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72 6f  .** strategy fro
31240 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  m that..**.** Fo
31250 72 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  r finder-functio
31260 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73  n F, two objects
31270 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a   are created:.**
31280 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20 72  .**    (1) The r
31290 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  eal finder-funct
312a0 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74  ion named "FImpt
312b0 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  ()"..**.**    (2
312c0 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69  ) A constant poi
312d0 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e  nter to this fun
312e0 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74  ction named just
312f0 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41   "F"..**.**.** A
31300 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
31310 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65  F pointer is use
31320 64 20 61 73 20 74 68 65 20 70 41 70 70 44 61 74  d as the pAppDat
31330 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a  a value for VFS.
31340 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20  ** objects.  We 
31350 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20  have to do this 
31360 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69  instead of letti
31370 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e  ng pAppData poin
31380 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74  t.** directly at
31390 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63   the finder-func
313a0 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72  tion since C90 r
313b0 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20 76  ules prevent a v
313c0 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20  oid*.** from be 
313d0 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63  cast into a func
313e0 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  tion pointer..**
313f0 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74  .**.** Each inst
31400 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63  ance of this mac
31410 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f  ro generates two
31420 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20   objects:.**.** 
31430 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20    *  A constant 
31440 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
31450 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d  ds object call M
31460 45 54 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c  ETHOD that has l
31470 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d  ocking.**      m
31480 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f  ethods CLOSE, LO
31490 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45  CK, UNLOCK, CKRE
314a0 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  SLOCK..**.**   *
314b0 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20    An I/O method 
314c0 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  finder function 
314d0 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68  called FINDER th
314e0 61 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  at returns a poi
314f0 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20  nter.**      to 
31500 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63  the METHOD objec
31510 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
31520 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65  s bullet..*/.#de
31530 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46  fine IOMETHODS(F
31540 49 4e 44 45 52 2c 20 4d 45 54 48 4f 44 2c 20 56  INDER, METHOD, V
31550 45 52 53 49 4f 4e 2c 20 43 4c 4f 53 45 2c 20 4c  ERSION, CLOSE, L
31560 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 4c  OCK, UNLOCK, CKL
31570 4f 43 4b 2c 20 53 48 4d 4d 41 50 29 20 5c 0a 73  OCK, SHMMAP) \.s
31580 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
31590 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d  te3_io_methods M
315a0 45 54 48 4f 44 20 3d 20 7b 20 20 20 20 20 20 20  ETHOD = {       
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 20 20 20 5c 0a 20 20              \.  
315d0 20 56 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20   VERSION,       
315e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
315f0 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20  iVersion */     
31600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31610 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
31620 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20  CLOSE,          
31630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
31640 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20  Close */        
31650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31660 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
31670 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20 20 20  nixRead,        
31680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
31690 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ead */          
316a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
316b0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
316c0 69 78 57 72 69 74 65 2c 20 20 20 20 20 20 20 20  ixWrite,        
316d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72            /* xWr
316e0 69 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ite */          
316f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31700 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
31710 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  xTruncate,      
31720 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75           /* xTru
31730 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20 20 20  ncate */        
31740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31750 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
31760 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Sync,           
31770 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63          /* xSync
31780 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
31790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317a0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46        \.   unixF
317b0 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ileSize,        
317c0 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53         /* xFileS
317d0 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ize */          
317e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317f0 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20       \.   LOCK, 
31800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31810 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a        /* xLock *
31820 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
31830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31840 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c      \.   UNLOCK,
31850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31860 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
31870 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
31880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31890 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20     \.   CKLOCK, 
318a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318b0 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
318c0 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20  ervedLock */    
318d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318e0 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 43    \.   unixFileC
318f0 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20  ontrol,         
31900 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72     /* xFileContr
31910 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ol */           
31920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31930 20 5c 0a 20 20 20 75 6e 69 78 53 65 63 74 6f 72   \.   unixSector
31940 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
31950 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65    /* xSectorSize
31960 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
31970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31980 5c 0a 20 20 20 75 6e 69 78 44 65 76 69 63 65 43  \.   unixDeviceC
31990 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20  haracteristics, 
319a0 20 2f 2a 20 78 44 65 76 69 63 65 43 61 70 61 62   /* xDeviceCapab
319b0 69 6c 69 74 69 65 73 20 2a 2f 20 20 20 20 20 20  ilities */      
319c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
319d0 0a 20 20 20 53 48 4d 4d 41 50 2c 20 20 20 20 20  .   SHMMAP,     
319e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319f0 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20  /* xShmMap */   
31a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
31a20 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20     unixShmLock, 
31a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31a40 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20  * xShmLock */   
31a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a60 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
31a70 20 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72    unixShmBarrier
31a80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
31a90 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 20   xShmBarrier */ 
31aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ab0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
31ac0 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 2c 20 20   unixShmUnmap,  
31ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31ae0 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20  xShmUnmap */    
31af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b00 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
31b10 75 6e 69 78 46 65 74 63 68 2c 20 20 20 20 20 20  unixFetch,      
31b20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
31b30 46 65 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20  Fetch */        
31b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b50 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
31b60 6e 69 78 55 6e 66 65 74 63 68 2c 20 20 20 20 20  nixUnfetch,     
31b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
31b80 6e 66 65 74 63 68 20 2a 2f 20 20 20 20 20 20 20  nfetch */       
31b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ba0 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20           \.};   
31bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31bf0 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63          \.static
31c00 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
31c10 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44 45  o_methods *FINDE
31c20 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68  R##Impl(const ch
31c30 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20  ar *z, unixFile 
31c40 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45  *p){   \.  UNUSE
31c50 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 29 3b 20  D_PARAMETER(z); 
31c60 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
31c70 28 70 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  (p);            
31c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c90 20 20 20 20 20 20 5c 0a 20 20 72 65 74 75 72 6e        \.  return
31ca0 20 26 4d 45 54 48 4f 44 3b 20 20 20 20 20 20 20   &METHOD;       
31cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ce0 20 20 20 20 20 5c 0a 7d 20 20 20 20 20 20 20 20       \.}        
31cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d30 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e      \.static con
31d40 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
31d50 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46  thods *(*const F
31d60 49 4e 44 45 52 29 28 63 6f 6e 73 74 20 63 68 61  INDER)(const cha
31d70 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29 20  r*,unixFile *p) 
31d80 20 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45     \.    = FINDE
31d90 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20  R##Impl;../*.** 
31da0 48 65 72 65 20 61 72 65 20 61 6c 6c 20 6f 66 20  Here are all of 
31db0 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
31dc0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 66  ethods objects f
31dd0 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a  or each of the.*
31de0 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65  * locking strate
31df0 67 69 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73  gies.  Functions
31e00 20 74 68 61 74 20 72 65 74 75 72 6e 20 70 6f 69   that return poi
31e10 6e 74 65 72 73 20 74 6f 20 74 68 65 73 65 20 6d  nters to these m
31e20 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c  ethods.** are al
31e30 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49  so created..*/.I
31e40 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f 73 69  OMETHODS(.  posi
31e50 78 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  xIoFinder,      
31e60 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
31e70 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
31e80 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  .  posixIoMethod
31e90 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
31ea0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
31eb0 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
31ec0 2f 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20 20  /.  3,          
31ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31ee0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61   shared memory a
31ef0 6e 64 20 6d 6d 61 70 20 61 72 65 20 65 6e 61 62  nd mmap are enab
31f00 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f  led */.  unixClo
31f10 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
31f20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
31f30 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63  hod */.  unixLoc
31f40 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
31f50 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
31f60 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f  od */.  unixUnlo
31f70 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
31f80 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
31f90 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65  hod */.  unixChe
31fa0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20  ckReservedLock, 
31fb0 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
31fc0 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
31fd0 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4d 61 70 20  */.  unixShmMap 
31fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31ff0 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64  * xShmMap method
32000 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28   */.).IOMETHODS(
32010 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  .  nolockIoFinde
32020 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r,           /* 
32030 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
32040 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  name */.  nolock
32050 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
32060 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
32070 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
32080 20 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c 20 20 20   name */.  2,   
32090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
320a0 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
320b0 65 6d 6f 72 79 20 69 73 20 65 6e 61 62 6c 65 64  emory is enabled
320c0 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73   */.  nolockClos
320d0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
320e0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
320f0 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b   */.  nolockLock
32100 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32110 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
32120 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63  */.  nolockUnloc
32130 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k,             /
32140 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
32150 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63   */.  nolockChec
32160 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
32170 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
32180 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
32190 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
321a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
321b0 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
321c0 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  .).IOMETHODS(.  
321d0 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c  dotlockIoFinder,
321e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
321f0 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
32200 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f  e */.  dotlockIo
32210 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
32220 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
32230 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
32240 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
32250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32260 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
32270 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
32280 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65  /.  dotlockClose
32290 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
322a0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
322b0 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c  /.  dotlockLock,
322c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
322d0 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
322e0 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b  .  dotlockUnlock
322f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
32300 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
32310 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b  /.  dotlockCheck
32320 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 2f 2a  ReservedLock, /*
32330 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
32340 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
32350 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
32360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
32370 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  mMap method */.)
32380 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
32390 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
323a0 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53  E && !OS_VXWORKS
323b0 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c  .IOMETHODS(.  fl
323c0 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
323d0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
323e0 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
323f0 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68  */.  flockIoMeth
32400 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
32410 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
32420 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
32430 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
32440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32450 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
32460 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
32470 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20    flockClose,   
32480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
32490 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
324a0 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20    flockLock,    
324b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
324c0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
324d0 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20   flockUnlock,   
324e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
324f0 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
32500 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65    flockCheckRese
32510 72 76 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78  rvedLock,   /* x
32520 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
32530 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
32540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32550 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
32560 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ap method */.).#
32570 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58  endif..#if OS_VX
32580 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28  WORKS.IOMETHODS(
32590 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20  .  semIoFinder, 
325a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
325b0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
325c0 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d  name */.  semIoM
325d0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
325e0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
325f0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
32600 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
32610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32620 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
32630 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
32640 64 20 2a 2f 0a 20 20 73 65 6d 43 6c 6f 73 65 2c  d */.  semClose,
32650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32660 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
32670 64 20 2a 2f 0a 20 20 73 65 6d 4c 6f 63 6b 2c 20  d */.  semLock, 
32680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32690 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
326a0 20 2a 2f 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b 2c   */.  semUnlock,
326b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
326c0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
326d0 64 20 2a 2f 0a 20 20 73 65 6d 43 68 65 63 6b 52  d */.  semCheckR
326e0 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
326f0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
32700 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
32710 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  .  0            
32720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32730 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
32740 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  /.).#endif..#if 
32750 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
32760 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
32770 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
32780 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61  E.IOMETHODS(.  a
32790 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  fpIoFinder,     
327a0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
327b0 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
327c0 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f   */.  afpIoMetho
327d0 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ds,             
327e0 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
327f0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
32800 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
32810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32820 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
32830 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
32840 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20  .  afpClose,    
32850 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32860 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
32870 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20  .  afpLock,     
32880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32890 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
328a0 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20    afpUnlock,    
328b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
328c0 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
328d0 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73 65 72  .  afpCheckReser
328e0 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20  vedLock,     /* 
328f0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
32900 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30  ck method */.  0
32910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32920 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
32930 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  Map method */.).
32940 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
32950 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
32960 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73 75 70  method is a "sup
32970 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68  er-method" in th
32980 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a  e sense that it.
32990 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61  ** opens seconda
329a0 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
329b0 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63  ors for the conc
329c0 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73  h and lock files
329d0 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20   and.** it uses 
329e0 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c  proxy, dot-file,
329f0 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28   AFP, and flock(
32a00 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  ) locking method
32a10 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65  s on those.** se
32a20 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20  condary files.  
32a30 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  For this reason,
32a40 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68   the division th
32a50 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a  at implements.**
32a60 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   proxy locking i
32a70 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66  s located much f
32a80 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74  urther down in t
32a90 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65  he file.  But we
32aa0 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61   need.** to go a
32ab0 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20  head and define 
32ac0 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
32ad0 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65  ethods and finde
32ae0 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f  r function.** fo
32af0 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  r proxy locking 
32b00 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72  here.  So we for
32b10 77 61 72 64 20 64 65 63 6c 61 72 65 20 74 68 65  ward declare the
32b20 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f   I/O methods..*/
32b30 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
32b40 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
32b50 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
32b60 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e  _STYLE.static in
32b70 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c  t proxyClose(sql
32b80 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61  ite3_file*);.sta
32b90 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63  tic int proxyLoc
32ba0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
32bb0 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e   int);.static in
32bc0 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71  t proxyUnlock(sq
32bd0 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
32be0 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
32bf0 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
32c00 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
32c10 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54  e*, int*);.IOMET
32c20 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46  HODS(.  proxyIoF
32c30 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
32c40 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
32c50 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70  tion name */.  p
32c60 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20  roxyIoMethods,  
32c70 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
32c80 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
32c90 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
32ca0 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2,              
32cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
32cc0 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 65 6e  red memory is en
32cd0 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79  abled */.  proxy
32ce0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
32cf0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
32d00 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
32d10 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
32d20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
32d30 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55  thod */.  proxyU
32d40 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
32d50 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
32d60 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
32d70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
32d80 6b 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  k,   /* xCheckRe
32d90 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
32da0 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
32db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32dc0 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
32dd0 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
32de0 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20  /* nfs lockd on 
32df0 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27  OSX 10.3+ doesn'
32e00 74 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c 6f  t clear write lo
32e10 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64 20  cks when a read 
32e20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23  lock is set */.#
32e30 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
32e40 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
32e50 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
32e60 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  TYLE.IOMETHODS(.
32e70 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20 20    nfsIoFinder,  
32e80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32e90 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
32ea0 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d  name */.  nfsIoM
32eb0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
32ec0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
32ed0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
32ee0 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
32ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f00 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
32f10 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
32f20 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f  led */.  unixClo
32f30 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
32f40 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
32f50 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f  thod */.  unixLo
32f60 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
32f70 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
32f80 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c  thod */.  nfsUnl
32f90 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
32fa0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
32fb0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
32fc0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
32fd0 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  k,     /* xCheck
32fe0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
32ff0 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  hod */.  0      
33000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33010 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d      /* xShmMap m
33020 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
33030 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  f..#if defined(_
33040 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
33050 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
33060 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20  NG_STYLE./* .** 
33070 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75  This "finder" fu
33080 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
33090 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
330a0 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74   best locking st
330b0 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74  rategy .** for t
330c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
330d0 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74   "filePath".  It
330e0 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68   then returns th
330f0 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
33100 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  hods.** object t
33110 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
33120 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a  hat strategy..**
33130 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20  .** This is for 
33140 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a  MacOSX only..*/.
33150 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
33160 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
33170 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  *autolockIoFinde
33180 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63  rImpl(.  const c
33190 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20  har *filePath,  
331a0 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65    /* name of the
331b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
331c0 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  /.  unixFile *pN
331d0 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew           /* 
331e0 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74  open file object
331f0 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
33200 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73  e file */.){.  s
33210 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
33220 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20  ct Mapping {.   
33230 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
33240 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20  lesystem;       
33250 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79         /* Filesy
33260 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a  stem type name *
33270 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69  /.    const sqli
33280 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
33290 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41  pMethods;   /* A
332a0 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
332b0 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d  ng method */.  }
332c0 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20   aMap[] = {.    
332d0 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73  { "hfs",    &pos
332e0 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ixIoMethods },. 
332f0 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26     { "ufs",    &
33300 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d  posixIoMethods }
33310 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c  ,.    { "afpfs",
33320 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20    &afpIoMethods 
33330 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22  },.    { "smbfs"
33340 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  ,  &afpIoMethods
33350 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61   },.    { "webda
33360 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  v", &nolockIoMet
33370 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c  hods },.    { 0,
33380 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20   0 }.  };.  int 
33390 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  i;.  struct stat
333a0 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72  fs fsInfo;.  str
333b0 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e  uct flock lockIn
333c0 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65  fo;..  if( !file
333d0 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Path ){.    /* I
333e0 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c  f filePath==NULL
333f0 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61   that means we a
33400 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
33410 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
33420 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65  .    ** that doe
33430 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
33440 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20   locked. */.    
33450 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
33460 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69  Methods;.  }.  i
33470 66 28 20 73 74 61 74 66 73 28 66 69 6c 65 50 61  f( statfs(filePa
33480 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20  th, &fsInfo) != 
33490 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73  -1 ){.    if( fs
334a0 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d  Info.f_flags & M
334b0 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  NT_RDONLY ){.   
334c0 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63     return &noloc
334d0 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  kIoMethods;.    
334e0 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61  }.    for(i=0; a
334f0 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74  Map[i].zFilesyst
33500 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  em; i++){.      
33510 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66  if( strcmp(fsInf
33520 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
33530 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73  aMap[i].zFilesys
33540 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tem)==0 ){.     
33550 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69     return aMap[i
33560 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  ].pMethods;.    
33570 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
33580 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65   /* Default case
33590 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67  . Handles, among
335a0 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22  st others, "nfs"
335b0 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65  ..  ** Test byte
335c0 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e  -range lock usin
335d0 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68  g fcntl(). If th
335e0 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c  e call succeeds,
335f0 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68   .  ** assume th
33600 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  at the file-syst
33610 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49  em supports POSI
33620 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a  X style locks. .
33630 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e    */.  lockInfo.
33640 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63  l_len = 1;.  loc
33650 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20  kInfo.l_start = 
33660 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  0;.  lockInfo.l_
33670 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
33680 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  T;.  lockInfo.l_
33690 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
336a0 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e    if( osFcntl(pN
336b0 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  ew->h, F_GETLK, 
336c0 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29  &lockInfo)!=-1 )
336d0 20 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   {.    if( strcm
336e0 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  p(fsInfo.f_fstyp
336f0 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30  ename, "nfs")==0
33700 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
33710 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a   &nfsIoMethods;.
33720 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
33730 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78     return &posix
33740 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
33750 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
33760 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d  turn &dotlockIoM
33770 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74  ethods;.  }.}.st
33780 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
33790 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20  e3_io_methods . 
337a0 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f   *(*const autolo
337b0 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73  ckIoFinder)(cons
337c0 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
337d0 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  *) = autolockIoF
337e0 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64  inderImpl;..#end
337f0 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
33800 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
33810 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
33820 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20  G_STYLE */..#if 
33830 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51  OS_VXWORKS && SQ
33840 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
33850 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a  ING_STYLE./* .**
33860 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66   This "finder" f
33870 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
33880 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
33890 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73  e best locking s
338a0 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20  trategy .** for 
338b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
338c0 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49  e "filePath".  I
338d0 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74  t then returns t
338e0 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
338f0 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20  thods.** object 
33900 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
33910 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a  that strategy..*
33920 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72  *.** This is for
33930 20 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a   VXWorks only..*
33940 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
33950 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
33960 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  s *autolockIoFin
33970 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74  derImpl(.  const
33980 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c   char *filePath,
33990 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74      /* name of t
339a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
339b0 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
339c0 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f  pNew           /
339d0 2a 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  * the open file 
339e0 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73  object */.){.  s
339f0 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
33a00 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69  Info;..  if( !fi
33a10 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a  lePath ){.    /*
33a20 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55   If filePath==NU
33a30 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65  LL that means we
33a40 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
33a50 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69  h a transient fi
33a60 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64  le.    ** that d
33a70 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
33a80 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20  be locked. */.  
33a90 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b    return &nolock
33aa0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a  IoMethods;.  }..
33ab0 20 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e    /* Test if fcn
33ac0 74 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74 65  tl() is supporte
33ad0 64 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20  d and use POSIX 
33ae0 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a  style locks..  *
33af0 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c  * Otherwise fall
33b00 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d   back to the nam
33b10 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74  ed semaphore met
33b20 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b  hod..  */.  lock
33b30 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  Info.l_len = 1;.
33b40 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61    lockInfo.l_sta
33b50 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e  rt = 0;.  lockIn
33b60 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  fo.l_whence = SE
33b70 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e  EK_SET;.  lockIn
33b80 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  fo.l_type = F_RD
33b90 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e  LCK;.  if( osFcn
33ba0 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45  tl(pNew->h, F_GE
33bb0 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21  TLK, &lockInfo)!
33bc0 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75  =-1 ) {.    retu
33bd0 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  rn &posixIoMetho
33be0 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ds;.  }else{.   
33bf0 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65   return &semIoMe
33c00 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61  thods;.  }.}.sta
33c10 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
33c20 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20  3_io_methods .  
33c30 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63  *(*const autoloc
33c40 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74  kIoFinder)(const
33c50 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
33c60 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ) = autolockIoFi
33c70 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
33c80 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
33c90 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
33ca0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
33cb0 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74  /../*.** An abst
33cc0 72 61 63 74 20 74 79 70 65 20 66 6f 72 20 61 20  ract type for a 
33cd0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 49 4f  pointer to an IO
33ce0 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66   method finder f
33cf0 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65  unction:.*/.type
33d00 64 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  def const sqlite
33d10 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a  3_io_methods *(*
33d20 66 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e  finder_type)(con
33d30 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
33d40 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  e*);.../********
33d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d90 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
33da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33db0 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65  * sqlite3_vfs me
33dc0 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
33dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33de0 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69  **.**.** This di
33df0 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  vision contains 
33e00 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
33e10 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e  on of methods on
33e20 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   the.** sqlite3_
33e30 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a  vfs object..*/..
33e40 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
33e50 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
33e60 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   the unixFile st
33e70 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20  ructure pointed 
33e80 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74  to by pId..*/.st
33e90 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55  atic int fillInU
33ea0 6e 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74  nixFile(.  sqlit
33eb0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
33ec0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
33ed0 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   vfs object */. 
33ee0 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20   int h,         
33ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
33f00 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
33f10 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f   of file being o
33f20 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  pened */.  sqlit
33f30 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20  e3_file *pId,   
33f40 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74     /* Write to t
33f50 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
33f60 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
33f70 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
33f80 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20  ename,  /* Name 
33f90 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e  of the file bein
33fa0 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e  g opened */.  in
33fb0 74 20 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20  t ctrlFlags     
33fc0 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72        /* Zero or
33fd0 20 6d 6f 72 65 20 55 4e 49 58 46 49 4c 45 5f 2a   more UNIXFILE_*
33fe0 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
33ff0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
34000 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69  _methods *pLocki
34010 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46  ngStyle;.  unixF
34020 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69  ile *pNew = (uni
34030 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69  xFile *)pId;.  i
34040 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
34050 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e  K;..  assert( pN
34060 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c  ew->pInode==NULL
34070 20 29 3b 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c   );..  /* Usuall
34080 79 20 74 68 65 20 70 61 74 68 20 7a 46 69 6c 65  y the path zFile
34090 6e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  name should not 
340a0 62 65 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  be a relative pa
340b0 74 68 6e 61 6d 65 2e 20 54 68 65 0a 20 20 2a 2a  thname. The.  **
340c0 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77 68   exception is wh
340d0 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 70  en opening the p
340e0 72 6f 78 79 20 22 63 6f 6e 63 68 22 20 66 69 6c  roxy "conch" fil
340f0 65 20 69 6e 20 62 75 69 6c 64 73 20 74 68 61 74  e in builds that
34100 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 65 20 74 68  .  ** include th
34110 65 20 73 70 65 63 69 61 6c 20 41 70 70 6c 65 20  e special Apple 
34120 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 73 2e 0a  locking styles..
34130 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64    */.#if defined
34140 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
34150 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
34160 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 61 73 73  KING_STYLE.  ass
34170 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d  ert( zFilename==
34180 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  0 || zFilename[0
34190 5d 3d 3d 27 2f 27 20 0a 20 20 20 20 7c 7c 20 70  ]=='/' .    || p
341a0 56 66 73 2d 3e 70 41 70 70 44 61 74 61 3d 3d 28  Vfs->pAppData==(
341b0 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49  void*)&autolockI
341c0 6f 46 69 6e 64 65 72 20 29 3b 0a 23 65 6c 73 65  oFinder );.#else
341d0 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65  .  assert( zFile
341e0 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65  name==0 || zFile
341f0 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a  name[0]=='/' );.
34200 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4e 6f 20  #endif..  /* No 
34210 6c 6f 63 6b 69 6e 67 20 6f 63 63 75 72 73 20 69  locking occurs i
34220 6e 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  n temporary file
34230 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a  s */.  assert( z
34240 46 69 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c 20 28  Filename!=0 || (
34250 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
34260 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20  FILE_NOLOCK)!=0 
34270 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
34280 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c  OPEN    %-3d %s\
34290 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65  n", h, zFilename
342a0 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20  ));.  pNew->h = 
342b0 68 3b 0a 20 20 70 4e 65 77 2d 3e 70 56 66 73 20  h;.  pNew->pVfs 
342c0 3d 20 70 56 66 73 3b 0a 20 20 70 4e 65 77 2d 3e  = pVfs;.  pNew->
342d0 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d  zPath = zFilenam
342e0 65 3b 0a 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46  e;.  pNew->ctrlF
342f0 6c 61 67 73 20 3d 20 28 75 38 29 63 74 72 6c 46  lags = (u8)ctrlF
34300 6c 61 67 73 3b 0a 23 69 66 20 53 51 4c 49 54 45  lags;.#if SQLITE
34310 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
34320 0a 20 20 70 4e 65 77 2d 3e 6d 6d 61 70 53 69 7a  .  pNew->mmapSiz
34330 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47 6c  eMax = sqlite3Gl
34340 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61  obalConfig.szMma
34350 70 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  p;.#endif.  if( 
34360 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
34370 65 61 6e 28 28 28 63 74 72 6c 46 6c 61 67 73 20  ean(((ctrlFlags 
34380 26 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 29 20  & UNIXFILE_URI) 
34390 3f 20 7a 46 69 6c 65 6e 61 6d 65 20 3a 20 30 29  ? zFilename : 0)
343a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
343b0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70 73               "ps
343c0 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45  ow", SQLITE_POWE
343d0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29  RSAFE_OVERWRITE)
343e0 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74   ){.    pNew->ct
343f0 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
34400 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20  ILE_PSOW;.  }.  
34410 69 66 28 20 73 74 72 63 6d 70 28 70 56 66 73 2d  if( strcmp(pVfs-
34420 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d 65 78 63  >zName,"unix-exc
34430 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e  l")==0 ){.    pN
34440 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  ew->ctrlFlags |=
34450 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 3b 0a   UNIXFILE_EXCL;.
34460 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f    }..#if OS_VXWO
34470 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20  RKS.  pNew->pId 
34480 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c  = vxworksFindFil
34490 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  eId(zFilename);.
344a0 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d    if( pNew->pId=
344b0 3d 30 20 29 7b 0a 20 20 20 20 63 74 72 6c 46 6c  =0 ){.    ctrlFl
344c0 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
344d0 4e 4f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d  NOLOCK;.    rc =
344e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
344f0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
34500 20 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49   ctrlFlags & UNI
34510 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a  XFILE_NOLOCK ){.
34520 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c      pLockingStyl
34530 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  e = &nolockIoMet
34540 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hods;.  }else{. 
34550 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65     pLockingStyle
34560 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79   = (**(finder_ty
34570 70 65 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61  pe*)pVfs->pAppDa
34580 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  ta)(zFilename, p
34590 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  New);.#if SQLITE
345a0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
345b0 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63  STYLE.    /* Cac
345c0 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20  he zFilename in 
345d0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  the locking cont
345e0 65 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74  ext (AFP and dot
345f0 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66  lock override) f
34600 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c  or.    ** proxyL
34610 6f 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69  ock activation i
34620 73 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f  s possible (remo
34630 74 65 20 70 72 6f 78 79 20 69 73 20 62 61 73 65  te proxy is base
34640 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20  d on db name).  
34650 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72    ** zFilename r
34660 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74  emains valid unt
34670 69 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  il file is close
34680 64 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f  d, to support */
34690 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
346a0 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69  ngContext = (voi
346b0 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65  d*)zFilename;.#e
346c0 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ndif.  }..  if( 
346d0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
346e0 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
346f0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
34700 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
34710 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
34720 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c  _STYLE.    || pL
34730 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
34740 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e  nfsIoMethods.#en
34750 64 69 66 0a 20 20 20 20 20 2f 2a 20 73 75 70 70  dif.     /* supp
34760 6f 72 74 20 57 41 4c 20 6d 6f 64 65 20 6f 6e 20  ort WAL mode on 
34770 72 65 61 64 20 6f 6e 6c 79 20 6d 6f 75 6e 74 65  read only mounte
34780 64 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a  d filesystem */.
34790 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53      || pLockingS
347a0 74 79 6c 65 20 3d 3d 20 26 6e 6f 6c 6f 63 6b 49  tyle == &nolockI
347b0 6f 4d 65 74 68 6f 64 73 20 0a 20 20 29 7b 0a 20  oMethods .  ){. 
347c0 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
347d0 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69  x();.    rc = fi
347e0 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77  ndInodeInfo(pNew
347f0 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29  , &pNew->pInode)
34800 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
34810 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
34820 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
34830 6f 63 63 75 72 72 65 64 20 69 6e 20 66 69 6e 64  occurred in find
34840 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20 63 6c 6f  InodeInfo(), clo
34850 73 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  se the file desc
34860 72 69 70 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20  riptor.      ** 
34870 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62 65 66  immediately, bef
34880 6f 72 65 20 72 65 6c 65 61 73 69 6e 67 20 74 68  ore releasing th
34890 65 20 6d 75 74 65 78 2e 20 66 69 6e 64 49 6e 6f  e mutex. findIno
348a0 64 65 49 6e 66 6f 28 29 20 6d 61 79 20 66 61 69  deInfo() may fai
348b0 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 77  l.      ** in tw
348c0 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20 20 20  o scenarios:.   
348d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
348e0 20 28 61 29 20 41 20 63 61 6c 6c 20 74 6f 20 66   (a) A call to f
348f0 73 74 61 74 28 29 20 66 61 69 6c 65 64 2e 0a 20  stat() failed.. 
34900 20 20 20 20 20 2a 2a 20 20 20 28 62 29 20 41 20       **   (b) A 
34910 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e 0a 20  malloc failed.. 
34920 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
34930 20 53 63 65 6e 61 72 69 6f 20 28 62 29 20 6d 61   Scenario (b) ma
34940 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20  y only occur if 
34950 74 68 65 20 70 72 6f 63 65 73 73 20 69 73 20 68  the process is h
34960 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0a  olding no other.
34970 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 64 65        ** file de
34980 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f  scriptors open o
34990 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2e  n the same file.
349a0 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6f   If there were o
349b0 74 68 65 72 20 66 69 6c 65 0a 20 20 20 20 20 20  ther file.      
349c0 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  ** descriptors o
349d0 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65  n this file, the
349e0 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c  n no malloc woul
349f0 64 20 62 65 20 72 65 71 75 69 72 65 64 20 62 79  d be required by
34a00 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e 64 49 6e  .      ** findIn
34a10 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66 20 74 68  odeInfo(). If th
34a20 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
34a30 69 74 20 69 73 20 71 75 69 74 65 20 73 61 66 65  it is quite safe
34a40 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20 20 20   to close.      
34a50 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20 61 73  ** handle h - as
34a60 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
34a70 64 20 74 68 61 74 20 6e 6f 20 70 6f 73 69 78 20  d that no posix 
34a80 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20 72 65  locks will be re
34a90 6c 65 61 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  leased.      ** 
34aa0 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20 20 20  by doing so..   
34ab0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
34ac0 66 20 73 63 65 6e 61 72 69 6f 20 28 61 29 20 63  f scenario (a) c
34ad0 61 75 73 65 64 20 74 68 65 20 65 72 72 6f 72 20  aused the error 
34ae0 74 68 65 6e 20 74 68 69 6e 67 73 20 61 72 65 20  then things are 
34af0 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20 54 68 65  not so safe. The
34b00 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 69 63  .      ** implic
34b10 69 74 20 61 73 73 75 6d 70 74 69 6f 6e 20 68 65  it assumption he
34b20 72 65 20 69 73 20 74 68 61 74 20 69 66 20 66 73  re is that if fs
34b30 74 61 74 28 29 20 66 61 69 6c 73 2c 20 74 68 69  tat() fails, thi
34b40 6e 67 73 20 61 72 65 20 69 6e 0a 20 20 20 20 20  ngs are in.     
34b50 20 2a 2a 20 73 75 63 68 20 62 61 64 20 73 68 61   ** such bad sha
34b60 70 65 20 74 68 61 74 20 64 72 6f 70 70 69 6e 67  pe that dropping
34b70 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f 20 64   a lock or two d
34b80 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 6d 75  oesn't matter mu
34b90 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ch..      */.   
34ba0 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
34bb0 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
34bc0 5f 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 2d 31  _);.      h = -1
34bd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78  ;.    }.    unix
34be0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
34bf0 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  }..#if SQLITE_EN
34c00 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
34c10 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
34c20 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20  APPLE__).  else 
34c30 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
34c40 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f  e == &afpIoMetho
34c50 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50  ds ){.    /* AFP
34c60 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
34c70 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
34c80 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e  t needs to be in
34c90 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a  cluded in.    **
34ca0 20 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43   the afpLockingC
34cb0 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20  ontext..    */. 
34cc0 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e     afpLockingCon
34cd0 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 20 20  text *pCtx;.    
34ce0 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
34cf0 74 65 78 74 20 3d 20 70 43 74 78 20 3d 20 73 71  text = pCtx = sq
34d00 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
34d10 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20  zeof(*pCtx) );. 
34d20 20 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29     if( pCtx==0 )
34d30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
34d40 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
34d50 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  else{.      /* N
34d60 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69  B: zFilename exi
34d70 73 74 73 20 61 6e 64 20 72 65 6d 61 69 6e 73 20  sts and remains 
34d80 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20  valid until the 
34d90 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a 20  file is closed. 
34da0 20 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e       ** accordin
34db0 67 20 74 6f 20 72 65 71 75 69 72 65 6d 65 6e 74  g to requirement
34dc0 20 46 31 31 31 34 31 2e 20 20 53 6f 20 77 65 20   F11141.  So we 
34dd0 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d  do not need to m
34de0 61 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63  ake a.      ** c
34df0 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65 6e  opy of the filen
34e00 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43  ame. */.      pC
34e10 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46 69  tx->dbPath = zFi
34e20 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43  lename;.      pC
34e30 74 78 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30  tx->reserved = 0
34e40 3b 0a 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64  ;.      srandomd
34e50 65 76 28 29 3b 0a 20 20 20 20 20 20 75 6e 69 78  ev();.      unix
34e60 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
34e70 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f      rc = findIno
34e80 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e  deInfo(pNew, &pN
34e90 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ew->pInode);.   
34ea0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
34eb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
34ec0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
34ed0 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
34ee0 74 29 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75  t);.        robu
34ef0 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68  st_close(pNew, h
34f00 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
34f10 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20       h = -1;.   
34f20 20 20 20 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c     }.      unixL
34f30 65 61 76 65 4d 75 74 65 78 28 29 3b 20 20 20 20  eaveMutex();    
34f40 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23      .    }.  }.#
34f50 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20 69 66  endif..  else if
34f60 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
34f70 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  == &dotlockIoMet
34f80 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44  hods ){.    /* D
34f90 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75  otfile locking u
34fa0 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
34fb0 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
34fc0 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a   be included in.
34fd0 20 20 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f      ** the dotlo
34fe0 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
34ff0 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61   .    */.    cha
35000 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20  r *zLockFile;.  
35010 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b    int nFilename;
35020 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69  .    assert( zFi
35030 6c 65 6e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20  lename!=0 );.   
35040 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e   nFilename = (in
35050 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61  t)strlen(zFilena
35060 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f  me) + 6;.    zLo
35070 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a  ckFile = (char *
35080 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
35090 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  nFilename);.    
350a0 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30  if( zLockFile==0
350b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
350c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
350d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
350e0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
350f0 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46  Filename, zLockF
35100 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43  ile, "%s" DOTLOC
35110 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e  K_SUFFIX, zFilen
35120 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
35130 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
35140 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65  text = zLockFile
35150 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58  ;.  }..#if OS_VX
35160 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66 28  WORKS.  else if(
35170 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
35180 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20  = &semIoMethods 
35190 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20  ){.    /* Named 
351a0 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
351b0 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20  g uses the file 
351c0 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73  path so it needs
351d0 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e   to be.    ** in
351e0 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73 65  cluded in the se
351f0 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a  mLockingContext.
35200 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45      */.    unixE
35210 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
35220 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
35230 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
35240 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66  >pInode);.    if
35250 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( (rc==SQLITE_OK
35260 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f  ) && (pNew->pIno
35270 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20  de->pSem==NULL) 
35280 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
35290 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e  SemName = pNew->
352a0 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65  pInode->aSemName
352b0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  ;.      int n;. 
352c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
352d0 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41  rintf(MAX_PATHNA
352e0 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f  ME, zSemName, "/
352f0 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20 20  %s.sem",.       
35300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35310 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f  pNew->pId->zCano
35320 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  nicalName);.    
35330 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d    for( n=1; zSem
35340 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20  Name[n]; n++ ). 
35350 20 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d 4e         if( zSemN
35360 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53  ame[n]=='/' ) zS
35370 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b  emName[n] = '_';
35380 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e  .      pNew->pIn
35390 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f  ode->pSem = sem_
353a0 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f  open(zSemName, O
353b0 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31 29  _CREAT, 0666, 1)
353c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
353d0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d  ->pInode->pSem =
353e0 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a  = SEM_FAILED ){.
353f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
35400 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
35410 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d     pNew->pInode-
35420 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27  >aSemName[0] = '
35430 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  \0';.      }.   
35440 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65   }.    unixLeave
35450 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e  Mutex();.  }.#en
35460 64 69 66 0a 20 20 0a 20 20 73 74 6f 72 65 4c 61  dif.  .  storeLa
35470 73 74 45 72 72 6e 6f 28 70 4e 65 77 2c 20 30 29  stErrno(pNew, 0)
35480 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ;.#if OS_VXWORKS
35490 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
354a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
354b0 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c  h>=0 ) robust_cl
354c0 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c  ose(pNew, h, __L
354d0 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 68 20 3d 20  INE__);.    h = 
354e0 2d 31 3b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b  -1;.    osUnlink
354f0 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
35500 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73   pNew->ctrlFlags
35510 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c   |= UNIXFILE_DEL
35520 45 54 45 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ETE;.  }.#endif.
35530 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
35540 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68  _OK ){.    if( h
35550 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f  >=0 ) robust_clo
35560 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49  se(pNew, h, __LI
35570 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NE__);.  }else{.
35580 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f      pNew->pMetho
35590 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  d = pLockingStyl
355a0 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74  e;.    OpenCount
355b0 65 72 28 2b 31 29 3b 0a 20 20 20 20 76 65 72 69  er(+1);.    veri
355c0 66 79 44 62 46 69 6c 65 28 70 4e 65 77 29 3b 0a  fyDbFile(pNew);.
355d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
355e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
355f0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64   the name of a d
35600 69 72 65 63 74 6f 72 79 20 69 6e 20 77 68 69 63  irectory in whic
35610 68 20 74 6f 20 70 75 74 20 74 65 6d 70 6f 72 61  h to put tempora
35620 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 20 49 66 20  ry files..** If 
35630 6e 6f 20 73 75 69 74 61 62 6c 65 20 74 65 6d 70  no suitable temp
35640 6f 72 61 72 79 20 66 69 6c 65 20 64 69 72 65 63  orary file direc
35650 74 6f 72 79 20 63 61 6e 20 62 65 20 66 6f 75 6e  tory can be foun
35660 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  d, return NULL..
35670 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
35680 63 68 61 72 20 2a 75 6e 69 78 54 65 6d 70 46 69  char *unixTempFi
35690 6c 65 44 69 72 28 76 6f 69 64 29 7b 0a 20 20 73  leDir(void){.  s
356a0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
356b0 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20   *azDirs[] = {. 
356c0 20 20 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20      0,.     0,. 
356d0 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61      0,.     "/va
356e0 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75  r/tmp",.     "/u
356f0 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f  sr/tmp",.     "/
35700 74 6d 70 22 2c 0a 20 20 20 20 20 30 20 20 20 20  tmp",.     0    
35710 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d      /* List term
35720 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d 3b 0a 20  inator */.  };. 
35730 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
35740 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
35750 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  uf;.  const char
35760 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20 61   *zDir = 0;..  a
35770 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74  zDirs[0] = sqlit
35780 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
35790 79 3b 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73  y;.  if( !azDirs
357a0 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20  [1] ) azDirs[1] 
357b0 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45  = getenv("SQLITE
357c0 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20 69 66 28  _TMPDIR");.  if(
357d0 20 21 61 7a 44 69 72 73 5b 32 5d 20 29 20 61 7a   !azDirs[2] ) az
357e0 44 69 72 73 5b 32 5d 20 3d 20 67 65 74 65 6e 76  Dirs[2] = getenv
357f0 28 22 54 4d 50 44 49 52 22 29 3b 0a 20 20 66 6f  ("TMPDIR");.  fo
35800 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
35810 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61  azDirs)/sizeof(a
35820 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d  zDirs[0]); zDir=
35830 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20  azDirs[i++]){.  
35840 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20    if( zDir==0 ) 
35850 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
35860 28 20 6f 73 53 74 61 74 28 7a 44 69 72 2c 20 26  ( osStat(zDir, &
35870 62 75 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  buf) ) continue;
35880 0a 20 20 20 20 69 66 28 20 21 53 5f 49 53 44 49  .    if( !S_ISDI
35890 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29  R(buf.st_mode) )
358a0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
358b0 66 28 20 6f 73 41 63 63 65 73 73 28 7a 44 69 72  f( osAccess(zDir
358c0 2c 20 30 37 29 20 29 20 63 6f 6e 74 69 6e 75 65  , 07) ) continue
358d0 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
358e0 0a 20 20 72 65 74 75 72 6e 20 7a 44 69 72 3b 0a  .  return zDir;.
358f0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
35900 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
35910 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20   name in zBuf.  
35920 7a 42 75 66 20 6d 75 73 74 20 62 65 20 61 6c 6c  zBuf must be all
35930 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  ocated.** by the
35940 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 73 73   calling process
35950 20 61 6e 64 20 6d 75 73 74 20 62 65 20 62 69 67   and must be big
35960 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
35970 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70 56 66 73  at least.** pVfs
35980 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74  ->mxPathname byt
35990 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
359a0 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d  t unixGetTempnam
359b0 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  e(int nBuf, char
359c0 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69   *zBuf){.  stati
359d0 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
359e0 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d   char zChars[] =
359f0 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a  .    "abcdefghij
35a00 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
35a10 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49  ".    "ABCDEFGHI
35a20 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59  JKLMNOPQRSTUVWXY
35a30 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37  Z".    "01234567
35a40 38 39 22 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  89";.  unsigned 
35a50 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 6f 6e 73  int i, j;.  cons
35a60 74 20 63 68 61 72 20 2a 7a 44 69 72 3b 0a 0a 20  t char *zDir;.. 
35a70 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
35a80 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
35a90 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
35aa0 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
35ab0 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
35ac0 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
35ad0 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
35ae0 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
35af0 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
35b00 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
35b10 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  . .  */.  Simula
35b20 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
35b30 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  n SQLITE_IOERR )
35b40 3b 0a 0a 20 20 7a 44 69 72 20 3d 20 75 6e 69 78  ;..  zDir = unix
35b50 54 65 6d 70 46 69 6c 65 44 69 72 28 29 3b 0a 20  TempFileDir();. 
35b60 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 7a   if( zDir==0 ) z
35b70 44 69 72 20 3d 20 22 2e 22 3b 0a 0a 20 20 2f 2a  Dir = ".";..  /*
35b80 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
35b90 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73  output buffer is
35ba0 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f   large enough fo
35bb0 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  r the temporary 
35bc0 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e  file .  ** name.
35bd0 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 72   If it is not, r
35be0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
35bf0 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  OR..  */.  if( (
35c00 73 74 72 6c 65 6e 28 7a 44 69 72 29 20 2b 20 73  strlen(zDir) + s
35c10 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f 54 45 4d  trlen(SQLITE_TEM
35c20 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20 2b  P_FILE_PREFIX) +
35c30 20 31 38 29 20 3e 3d 20 28 73 69 7a 65 5f 74 29   18) >= (size_t)
35c40 6e 42 75 66 20 29 7b 0a 20 20 20 20 72 65 74 75  nBuf ){.    retu
35c50 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
35c60 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20  .  }..  do{.    
35c70 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
35c80 28 6e 42 75 66 2d 31 38 2c 20 7a 42 75 66 2c 20  (nBuf-18, zBuf, 
35c90 22 25 73 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50  "%s/"SQLITE_TEMP
35ca0 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44  _FILE_PREFIX, zD
35cb0 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20 28 69 6e  ir);.    j = (in
35cc0 74 29 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a  t)strlen(zBuf);.
35cd0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
35ce0 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66  omness(15, &zBuf
35cf0 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  [j]);.    for(i=
35d00 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b  0; i<15; i++, j+
35d10 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a  +){.      zBuf[j
35d20 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73  ] = (char)zChars
35d30 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  [ ((unsigned cha
35d40 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65  r)zBuf[j])%(size
35d50 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b  of(zChars)-1) ];
35d60 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b  .    }.    zBuf[
35d70 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 7a 42 75 66  j] = 0;.    zBuf
35d80 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20 7d 77 68  [j+1] = 0;.  }wh
35d90 69 6c 65 28 20 6f 73 41 63 63 65 73 73 28 7a 42  ile( osAccess(zB
35da0 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65  uf,0)==0 );.  re
35db0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
35dc0 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  }..#if SQLITE_EN
35dd0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
35de0 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
35df0 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52  APPLE__)./*.** R
35e00 6f 75 74 69 6e 65 20 74 6f 20 74 72 61 6e 73 66  outine to transf
35e10 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c 65 20 69  orm a unixFile i
35e20 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c 6f 63 6b  nto a proxy-lock
35e30 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a  ing unixFile..**
35e40 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
35e50 69 6e 20 74 68 65 20 70 72 6f 78 79 2d 6c 6f 63  in the proxy-loc
35e60 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62 75 74 20  k division, but 
35e70 75 73 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e  used by unixOpen
35e80 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f  ().** if SQLITE_
35e90 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
35ea0 4b 49 4e 47 20 69 73 20 64 65 66 69 6e 65 64 2e  KING is defined.
35eb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
35ec0 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69  roxyTransformUni
35ed0 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 2a 2c  xFile(unixFile*,
35ee0 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 23   const char*);.#
35ef0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  endif../*.** Sea
35f00 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65  rch for an unuse
35f10 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
35f20 72 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 65  r that was opene
35f30 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
35f40 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f 74 20  e .** file (not 
35f50 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d 61 73  a journal or mas
35f60 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
35f70 29 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  ) identified by 
35f80 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74  pathname.** zPat
35f90 68 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 50  h with SQLITE_OP
35fa0 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 6d 61 74  EN_XXX flags mat
35fb0 63 68 69 6e 67 20 74 68 6f 73 65 20 70 61 73 73  ching those pass
35fc0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
35fd0 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  .** argument to 
35fe0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
35ff0 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66 69 6c 65  *.** Such a file
36000 20 64 65 73 63 72 69 70 74 6f 72 20 6d 61 79 20   descriptor may 
36010 65 78 69 73 74 20 69 66 20 61 20 64 61 74 61 62  exist if a datab
36020 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  ase connection w
36030 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 75 74  as closed.** but
36040 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
36050 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
36060 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6c 6f  could not be clo
36070 73 65 64 20 62 65 63 61 75 73 65 20 73 6f 6d 65  sed because some
36080 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c 65 20 64  .** other file d
36090 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f  escriptor open o
360a0 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  n the same file 
360b0 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 66 69 6c  is holding a fil
360c0 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65 72  e-lock..** Refer
360d0 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20   to comments in 
360e0 74 68 65 20 75 6e 69 78 43 6c 6f 73 65 28 29 20  the unixClose() 
360f0 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 74 68 65  function and the
36100 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d 65 6e 74   lengthy comment
36110 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 22  .** describing "
36120 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c  Posix Advisory L
36130 6f 63 6b 69 6e 67 22 20 61 74 20 74 68 65 20 73  ocking" at the s
36140 74 61 72 74 20 6f 66 20 74 68 69 73 20 66 69 6c  tart of this fil
36150 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72 74 68 65  e for .** furthe
36160 72 20 64 65 74 61 69 6c 73 2e 20 41 6c 73 6f 2c  r details. Also,
36170 20 74 69 63 6b 65 74 20 23 34 30 31 38 2e 0a 2a   ticket #4018..*
36180 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69 74 61 62  *.** If a suitab
36190 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  le file descript
361a0 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65  or is found, the
361b0 6e 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  n it is returned
361c0 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 63 68 20  . If no.** such 
361d0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
361e0 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d 31 20 69  is located, -1 i
361f0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
36200 74 61 74 69 63 20 55 6e 69 78 55 6e 75 73 65 64  tatic UnixUnused
36210 46 64 20 2a 66 69 6e 64 52 65 75 73 61 62 6c 65  Fd *findReusable
36220 46 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  Fd(const char *z
36230 50 61 74 68 2c 20 69 6e 74 20 66 6c 61 67 73 29  Path, int flags)
36240 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  {.  UnixUnusedFd
36250 20 2a 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 0a   *pUnused = 0;..
36260 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 65 61 72    /* Do not sear
36270 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64  ch for an unused
36280 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
36290 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 4e 6f 74   on vxworks. Not
362a0 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 76 78   because.  ** vx
362b0 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e 6f 74 20  works would not 
362c0 62 65 6e 65 66 69 74 20 66 72 6f 6d 20 74 68 65  benefit from the
362d0 20 63 68 61 6e 67 65 20 28 69 74 20 6d 69 67 68   change (it migh
362e0 74 2c 20 77 65 27 72 65 20 6e 6f 74 20 73 75 72  t, we're not sur
362f0 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20 62 65 63  e),.  ** but bec
36300 61 75 73 65 20 6e 6f 20 77 61 79 20 74 6f 20 74  ause no way to t
36310 65 73 74 20 69 74 20 69 73 20 63 75 72 72 65 6e  est it is curren
36320 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 2e 20 49  tly available. I
36330 74 20 69 73 20 62 65 74 74 65 72 20 0a 20 20 2a  t is better .  *
36340 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b 20 62 72  * not to risk br
36350 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b 73 20 73  eaking vxworks s
36360 75 70 70 6f 72 74 20 66 6f 72 20 74 68 65 20 73  upport for the s
36370 61 6b 65 20 6f 66 20 73 75 63 68 20 61 6e 20 6f  ake of such an o
36380 62 73 63 75 72 65 20 0a 20 20 2a 2a 20 66 65 61  bscure .  ** fea
36390 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66 20 21 4f  ture.  */.#if !O
363a0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
363b0 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
363c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
363d0 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f 66 20 73   /* Results of s
363e0 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20  tat() call */.. 
363f0 20 2f 2a 20 41 20 73 74 61 74 28 29 20 63 61 6c   /* A stat() cal
36400 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f 72 20 76  l may fail for v
36410 61 72 69 6f 75 73 20 72 65 61 73 6f 6e 73 2e 20  arious reasons. 
36420 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c  If this happens,
36430 20 69 74 20 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f   it is.  ** almo
36440 73 74 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  st certain that 
36450 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 6f  an open() call o
36460 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74 68 20  n the same path 
36470 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69 6c 2e 0a  will also fail..
36480 20 20 2a 2a 20 46 6f 72 20 74 68 69 73 20 72 65    ** For this re
36490 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65 72 72 6f  ason, if an erro
364a0 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  r occurs in the 
364b0 73 74 61 74 28 29 20 63 61 6c 6c 20 68 65 72 65  stat() call here
364c0 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 67 6e  , it is.  ** ign
364d0 6f 72 65 64 20 61 6e 64 20 2d 31 20 69 73 20 72  ored and -1 is r
364e0 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c  eturned. The cal
364f0 6c 65 72 20 77 69 6c 6c 20 74 72 79 20 74 6f 20  ler will try to 
36500 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 0a  open a new file.
36510 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20    ** descriptor 
36520 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74 68  on the same path
36530 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72 65 74 75  , fail, and retu
36540 72 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 53  rn an error to S
36550 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  QLite..  **.  **
36560 20 45 76 65 6e 20 69 66 20 61 20 73 75 62 73 65   Even if a subse
36570 71 75 65 6e 74 20 6f 70 65 6e 28 29 20 63 61 6c  quent open() cal
36580 6c 20 64 6f 65 73 20 73 75 63 63 65 65 64 2c 20  l does succeed, 
36590 74 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 73  the consequences
365a0 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20 73 65 61   of.  ** not sea
365b0 72 63 68 69 6e 67 20 66 6f 72 20 61 20 72 65 75  rching for a reu
365c0 73 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72  sable file descr
365d0 69 70 74 6f 72 20 61 72 65 20 6e 6f 74 20 64 69  iptor are not di
365e0 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d  re.  */.  if( 0=
365f0 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26  =osStat(zPath, &
36600 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 75 6e  sStat) ){.    un
36610 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
36620 6f 64 65 3b 0a 0a 20 20 20 20 75 6e 69 78 45 6e  ode;..    unixEn
36630 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
36640 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69  pInode = inodeLi
36650 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  st;.    while( p
36660 49 6e 6f 64 65 20 26 26 20 28 70 49 6e 6f 64 65  Inode && (pInode
36670 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21 3d 73 53  ->fileId.dev!=sS
36680 74 61 74 2e 73 74 5f 64 65 76 0a 20 20 20 20 20  tat.st_dev.     
36690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
366a0 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  || pInode->fileI
366b0 64 2e 69 6e 6f 21 3d 73 53 74 61 74 2e 73 74 5f  d.ino!=sStat.st_
366c0 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 70  ino) ){.       p
366d0 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e  Inode = pInode->
366e0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
366f0 20 69 66 28 20 70 49 6e 6f 64 65 20 29 7b 0a 20   if( pInode ){. 
36700 20 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46       UnixUnusedF
36710 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20 66 6f  d **pp;.      fo
36720 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e 70 55  r(pp=&pInode->pU
36730 6e 75 73 65 64 3b 20 2a 70 70 20 26 26 20 28 2a  nused; *pp && (*
36740 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c 61 67  pp)->flags!=flag
36750 73 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70  s; pp=&((*pp)->p
36760 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20 70 55  Next));.      pU
36770 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20 20 20  nused = *pp;.   
36780 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29     if( pUnused )
36790 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20 3d 20  {.        *pp = 
367a0 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74 3b 0a  pUnused->pNext;.
367b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
367c0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
367d0 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 20  ();.  }.#endif  
367e0 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58 57 4f    /* if !OS_VXWO
367f0 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  RKS */.  return 
36800 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  pUnused;.}../*.*
36810 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
36820 69 73 20 63 61 6c 6c 65 64 20 62 79 20 75 6e 69  is called by uni
36830 78 4f 70 65 6e 28 29 20 74 6f 20 64 65 74 65 72  xOpen() to deter
36840 6d 69 6e 65 20 74 68 65 20 75 6e 69 78 20 70 65  mine the unix pe
36850 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 74 6f 20  rmissions.** to 
36860 63 72 65 61 74 65 20 6e 65 77 20 66 69 6c 65 73  create new files
36870 20 77 69 74 68 2e 20 49 66 20 6e 6f 20 65 72 72   with. If no err
36880 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
36890 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
368a0 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 20 76  urned.** and a v
368b0 61 6c 75 65 20 73 75 69 74 61 62 6c 65 20 66 6f  alue suitable fo
368c0 72 20 70 61 73 73 69 6e 67 20 61 73 20 74 68 65  r passing as the
368d0 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
368e0 74 6f 20 6f 70 65 6e 28 32 29 20 69 73 0a 2a 2a  to open(2) is.**
368f0 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 4d 6f   written to *pMo
36900 64 65 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  de. If an IO err
36910 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51  or occurs, an SQ
36920 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
36930 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  is .** returned 
36940 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  and the value of
36950 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f 74 20 6d   *pMode is not m
36960 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  odified..**.** I
36970 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 74 68  n most cases, th
36980 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
36990 2a 70 4d 6f 64 65 20 74 6f 20 30 2c 20 77 68 69  *pMode to 0, whi
369a0 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65 0a 2a  ch will become.*
369b0 2a 20 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20  * an indication 
369c0 74 6f 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 29  to robust_open()
369d0 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 66   to create the f
369e0 69 6c 65 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c  ile using.** SQL
369f0 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
36a00 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 61 64 6a  _PERMISSIONS adj
36a10 75 73 74 65 64 20 62 79 20 74 68 65 20 75 6d 61  usted by the uma
36a20 73 6b 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68  sk..** But if th
36a30 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  e file being ope
36a40 6e 65 64 20 69 73 20 61 20 57 41 4c 20 6f 72 20  ned is a WAL or 
36a50 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20  regular journal 
36a60 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74  file, then .** t
36a70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 71 75 65  his function que
36a80 72 69 65 73 20 74 68 65 20 66 69 6c 65 2d 73 79  ries the file-sy
36a90 73 74 65 6d 20 66 6f 72 20 74 68 65 20 70 65 72  stem for the per
36aa0 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20  missions on the 
36ab0 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
36ac0 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
36ad0 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f 64 65 20  and sets *pMode 
36ae0 74 6f 20 74 68 69 73 20 76 61 6c 75 65 2e 20 57  to this value. W
36af0 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70 6f 73 73  henever .** poss
36b00 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f  ible, WAL and jo
36b10 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20  urnal files are 
36b20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68  created using th
36b30 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f  e same permissio
36b40 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65 20 61 73  ns .** as the as
36b50 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
36b60 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
36b70 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42   the SQLITE_ENAB
36b80 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f 70 74  LE_8_3_NAMES opt
36b90 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
36ba0 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f 72 69 67  then the.** orig
36bb0 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  inal filename is
36bc0 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 42   unavailable.  B
36bd0 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20  ut 8_3_NAMES is 
36be0 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a  only used for.**
36bf0 20 46 41 54 20 66 69 6c 65 73 79 73 74 65 6d 73   FAT filesystems
36c00 20 61 6e 64 20 70 65 72 6d 69 73 73 69 6f 6e 73   and permissions
36c10 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65 72 20 74   do not matter t
36c20 68 65 72 65 2c 20 73 6f 20 6a 75 73 74 20 75 73  here, so just us
36c30 65 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74  e.** the default
36c40 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f   permissions..*/
36c50 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64  .static int find
36c60 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 0a  CreateFileMode(.
36c70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
36c80 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
36c90 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 66 69 6c    /* Path of fil
36ca0 65 20 28 70 6f 73 73 69 62 6c 79 29 20 62 65 69  e (possibly) bei
36cb0 6e 67 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  ng created */.  
36cc0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
36cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ce0 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
36cf0 61 73 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20  as 4th argument 
36d00 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  to xOpen() */.  
36d10 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 2c 20 20  mode_t *pMode,  
36d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d30 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73 73 69  /* OUT: Permissi
36d40 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65  ons to open file
36d50 20 77 69 74 68 20 2a 2f 0a 20 20 75 69 64 5f 74   with */.  uid_t
36d60 20 2a 70 55 69 64 2c 20 20 20 20 20 20 20 20 20   *pUid,         
36d70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
36d80 54 3a 20 75 69 64 20 74 6f 20 73 65 74 20 6f 6e  T: uid to set on
36d90 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 67   the file */.  g
36da0 69 64 5f 74 20 2a 70 47 69 64 20 20 20 20 20 20  id_t *pGid      
36db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36dc0 2a 20 4f 55 54 3a 20 67 69 64 20 74 6f 20 73 65  * OUT: gid to se
36dd0 74 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f  t on the file */
36de0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
36df0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
36e00 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
36e10 43 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d 6f 64 65  Code */.  *pMode
36e20 20 3d 20 30 3b 0a 20 20 2a 70 55 69 64 20 3d 20   = 0;.  *pUid = 
36e30 30 3b 0a 20 20 2a 70 47 69 64 20 3d 20 30 3b 0a  0;.  *pGid = 0;.
36e40 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 53    if( flags & (S
36e50 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53  QLITE_OPEN_WAL|S
36e60 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
36e70 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20  JOURNAL) ){.    
36e80 63 68 61 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54  char zDb[MAX_PAT
36e90 48 4e 41 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a  HNAME+1];     /*
36ea0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   Database file p
36eb0 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ath */.    int n
36ec0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
36ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
36ee0 65 72 20 6f 66 20 76 61 6c 69 64 20 62 79 74 65  er of valid byte
36ef0 73 20 69 6e 20 7a 44 62 20 2a 2f 0a 20 20 20 20  s in zDb */.    
36f00 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
36f10 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
36f20 20 4f 75 74 70 75 74 20 6f 66 20 73 74 61 74 28   Output of stat(
36f30 29 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69  ) on database fi
36f40 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50  le */..    /* zP
36f50 61 74 68 20 69 73 20 61 20 70 61 74 68 20 74 6f  ath is a path to
36f60 20 61 20 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61   a WAL or journa
36f70 6c 20 66 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c  l file. The foll
36f80 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69  owing block deri
36f90 76 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  ves.    ** the p
36fa0 61 74 68 20 74 6f 20 74 68 65 20 61 73 73 6f 63  ath to the assoc
36fb0 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66  iated database f
36fc0 69 6c 65 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20  ile from zPath. 
36fd0 54 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c  This block handl
36fe0 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 6f  es.    ** the fo
36ff0 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63  llowing naming c
37000 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20  onventions:.    
37010 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  **.    **   "<pa
37020 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61  th to db>-journa
37030 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  l".    **   "<pa
37040 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20  th to db>-wal". 
37050 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74     **   "<path t
37060 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22  o db>-journalNN"
37070 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68  .    **   "<path
37080 20 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20   to db>-walNN". 
37090 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65     **.    ** whe
370a0 72 65 20 4e 4e 20 69 73 20 61 20 64 65 63 69 6d  re NN is a decim
370b0 61 6c 20 6e 75 6d 62 65 72 2e 20 54 68 65 20 4e  al number. The N
370c0 4e 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65 73  N naming schemes
370d0 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 75 73 65   are .    ** use
370e0 64 20 62 79 20 74 68 65 20 74 65 73 74 5f 6d 75  d by the test_mu
370f0 6c 74 69 70 6c 65 78 2e 63 20 6d 6f 64 75 6c 65  ltiplex.c module
37100 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 44 62  ..    */.    nDb
37110 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
37120 33 30 28 7a 50 61 74 68 29 20 2d 20 31 3b 20 0a  30(zPath) - 1; .
37130 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
37140 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 0a 20  ABLE_8_3_NAMES. 
37150 20 20 20 77 68 69 6c 65 28 20 6e 44 62 3e 30 20     while( nDb>0 
37160 26 26 20 73 71 6c 69 74 65 33 49 73 61 6c 6e 75  && sqlite3Isalnu
37170 6d 28 7a 50 61 74 68 5b 6e 44 62 5d 29 20 29 20  m(zPath[nDb]) ) 
37180 6e 44 62 2d 2d 3b 0a 20 20 20 20 69 66 28 20 6e  nDb--;.    if( n
37190 44 62 3d 3d 30 20 7c 7c 20 7a 50 61 74 68 5b 6e  Db==0 || zPath[n
371a0 44 62 5d 21 3d 27 2d 27 20 29 20 72 65 74 75 72  Db]!='-' ) retur
371b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c  n SQLITE_OK;.#el
371c0 73 65 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 50  se.    while( zP
371d0 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 7b  ath[nDb]!='-' ){
371e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
371f0 44 62 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73  Db>0 );.      as
37200 73 65 72 74 28 20 7a 50 61 74 68 5b 6e 44 62 5d  sert( zPath[nDb]
37210 21 3d 27 5c 6e 27 20 29 3b 0a 20 20 20 20 20 20  !='\n' );.      
37220 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d 0a 23 65 6e  nDb--;.    }.#en
37230 64 69 66 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  dif.    memcpy(z
37240 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b  Db, zPath, nDb);
37250 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20  .    zDb[nDb] = 
37260 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66 28 20 30  '\0';..    if( 0
37270 3d 3d 6f 73 53 74 61 74 28 7a 44 62 2c 20 26 73  ==osStat(zDb, &s
37280 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 2a  Stat) ){.      *
37290 70 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e 73 74  pMode = sStat.st
372a0 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a 20 20  _mode & 0777;.  
372b0 20 20 20 20 2a 70 55 69 64 20 3d 20 73 53 74 61      *pUid = sSta
372c0 74 2e 73 74 5f 75 69 64 3b 0a 20 20 20 20 20 20  t.st_uid;.      
372d0 2a 70 47 69 64 20 3d 20 73 53 74 61 74 2e 73 74  *pGid = sStat.st
372e0 5f 67 69 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  _gid;.    }else{
372f0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
37300 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
37310 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
37320 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
37330 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
37340 4f 53 45 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64  OSE ){.    *pMod
37350 65 20 3d 20 30 36 30 30 3b 0a 20 20 7d 0a 20 20  e = 0600;.  }.  
37360 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
37370 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c  .** Open the fil
37380 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20  e zPath..** .** 
37390 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20  Previously, the 
373a0 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20  SQLite OS layer 
373b0 75 73 65 64 20 74 68 72 65 65 20 66 75 6e 63 74  used three funct
373c0 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66  ions in place of
373d0 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a   this.** one:.**
373e0 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
373f0 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 29  sOpenReadWrite()
37400 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
37410 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29  OsOpenReadOnly()
37420 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
37430 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
37440 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  );.**.** These c
37450 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20  alls correspond 
37460 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
37470 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
37480 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
37490 20 20 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e    ReadWrite() ->
374a0 20 20 20 20 20 28 52 45 41 44 57 52 49 54 45 20       (READWRITE 
374b0 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20  | CREATE).**    
374c0 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20   ReadOnly()  -> 
374d0 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a      (READONLY) .
374e0 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75  **     OpenExclu
374f0 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57  sive() -> (READW
37500 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20  RITE | CREATE | 
37510 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a  EXCLUSIVE).**.**
37520 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63   The old OpenExc
37530 6c 75 73 69 76 65 28 29 20 61 63 63 65 70 74 65  lusive() accepte
37540 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75  d a boolean argu
37550 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22  ment - "delFlag"
37560 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68  . If.** true, th
37570 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69  e file was confi
37580 67 75 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f  gured to be auto
37590 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
375a0 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69  d when the.** fi
375b0 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64  le handle closed
375c0 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74 68 65  . To achieve the
375d0 20 73 61 6d 65 20 65 66 66 65 63 74 20 75 73 69   same effect usi
375e0 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20  ng this new .** 
375f0 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20 74  interface, add t
37600 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  he DELETEONCLOSE
37610 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73   flag to those s
37620 70 65 63 69 66 69 65 64 20 61 62 6f 76 65 20 66  pecified above f
37630 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75  or .** OpenExclu
37640 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  sive()..*/.stati
37650 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a  c int unixOpen(.
37660 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
37670 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Vfs,           /
37680 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20 77 68  * The VFS for wh
37690 69 63 68 20 74 68 69 73 20 69 73 20 74 68 65 20  ich this is the 
376a0 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a  xOpen method */.
376b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
376c0 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ath,           /
376d0 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69  * Pathname of fi
376e0 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  le to be opened 
376f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
37700 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
37710 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
37720 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66  scriptor to be f
37730 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e  illed in */.  in
37740 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
37750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
37760 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e  put flags to con
37770 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67  trol the opening
37780 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46   */.  int *pOutF
37790 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
377a0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61     /* Output fla
377b0 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  gs returned to S
377c0 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b  QLite core */.){
377d0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d  .  unixFile *p =
377e0 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 46 69   (unixFile *)pFi
377f0 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  le;.  int fd = -
37800 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
37810 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
37820 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64  criptor returned
37830 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20   by open() */.  
37840 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20  int openFlags = 
37850 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
37860 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20  * Flags to pass 
37870 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 69 66  to open() */.#if
37880 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44   SQLITE_ENABLE_D
37890 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20  ATA_PROTECTION. 
378a0 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61   int eType = fla
378b0 67 73 26 30 78 46 46 30 46 46 46 30 30 3b 20 20  gs&0xFF0FFF00;  
378c0 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20  /* Type of file 
378d0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6c 73 65  to open */.#else
378e0 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66  .  int eType = f
378f0 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b  lags&0xFFFFFF00;
37900 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c    /* Type of fil
37910 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e  e to open */.#en
37920 64 69 66 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b  dif.  int noLock
37930 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37940 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
37950 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69  omit locking pri
37960 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74  mitives */.  int
37970 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
37980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
37990 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43  unction Return C
379a0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72  ode */.  int ctr
379b0 6c 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20  lFlags = 0;     
379c0 20 20 20 20 20 20 20 20 2f 2a 20 55 4e 49 58 46          /* UNIXF
379d0 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a  ILE_* flags */..
379e0 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76    int isExclusiv
379f0 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  e  = (flags & SQ
37a00 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
37a10 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65  IVE);.  int isDe
37a20 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67  lete     = (flag
37a30 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
37a40 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a  DELETEONCLOSE);.
37a50 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20    int isCreate  
37a60 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
37a70 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
37a80 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f  );.  int isReado
37a90 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26  nly   = (flags &
37aa0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
37ab0 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73  DONLY);.  int is
37ac0 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c  ReadWrite  = (fl
37ad0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
37ae0 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 23 69  N_READWRITE);.#i
37af0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
37b00 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
37b10 69 6e 74 20 69 73 41 75 74 6f 50 72 6f 78 79 20  int isAutoProxy 
37b20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
37b30 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58  TE_OPEN_AUTOPROX
37b40 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  Y);.#endif.#if d
37b50 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
37b60 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) || SQLITE_ENAB
37b70 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
37b80 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73  .  struct statfs
37b90 20 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a   fsInfo;.#endif.
37ba0 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e  .  /* If creatin
37bb0 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61  g a master or ma
37bc0 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c  in-file journal,
37bd0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
37be0 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20  ill open.  ** a 
37bf0 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
37c00 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  on the directory
37c10 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20   too. The first 
37c20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a  time unixSync().
37c30 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74    ** is called t
37c40 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c  he directory fil
37c50 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
37c60 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20 61  l be fsync()ed a
37c70 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a  nd close()d..  *
37c80 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20  /.  int syncDir 
37c90 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28  = (isCreate && (
37ca0 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d  .        eType==
37cb0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
37cc0 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  ER_JOURNAL .    
37cd0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
37ce0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
37cf0 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79  NAL .     || eTy
37d00 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
37d10 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20  WAL.  ));..  /* 
37d20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74  If argument zPat
37d30 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  h is a NULL poin
37d40 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ter, this functi
37d50 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74  on is required t
37d60 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65  o open.  ** a te
37d70 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73  mporary file. Us
37d80 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f  e this buffer to
37d90 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20   store the file 
37da0 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  name in..  */.  
37db0 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41  char zTmpname[MA
37dc0 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20  X_PATHNAME+2];. 
37dd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
37de0 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f  me = zPath;..  /
37df0 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c  * Check the foll
37e00 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
37e10 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a   are true: .  **
37e20 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63  .  **   (a) Exac
37e30 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52  tly one of the R
37e40 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41  EADWRITE and REA
37e50 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74  DONLY flags must
37e60 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20   be set, and .  
37e70 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41  **   (b) if CREA
37e80 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  TE is set, then 
37e90 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61  READWRITE must a
37ea0 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a  lso be set, and.
37eb0 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58    **   (c) if EX
37ec0 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20  CLUSIVE is set, 
37ed0 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
37ee0 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
37ef0 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45  **   (d) if DELE
37f00 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74  TEONCLOSE is set
37f10 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
37f20 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
37f30 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69    */.  assert((i
37f40 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20  sReadonly==0 || 
37f50 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20  isReadWrite==0) 
37f60 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20  && (isReadWrite 
37f70 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b  || isReadonly));
37f80 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61  .  assert(isCrea
37f90 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  te==0 || isReadW
37fa0 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  rite);.  assert(
37fb0 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c  isExclusive==0 |
37fc0 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61  | isCreate);.  a
37fd0 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d  ssert(isDelete==
37fe0 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
37ff0 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44  .  /* The main D
38000 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  B, main journal,
38010 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61   WAL file and ma
38020 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65  ster journal are
38030 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74   never .  ** aut
38040 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
38050 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79  ed. Nor are they
38060 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20   ever temporary 
38070 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73  files.  */.  ass
38080 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
38090 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
380a0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
380b0 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73  MAIN_DB );.  ass
380c0 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
380d0 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
380e0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
380f0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  MAIN_JOURNAL );.
38100 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
38110 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
38120 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
38130 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
38140 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
38150 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
38160 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
38170 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
38180 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
38190 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c  that the upper l
381a0 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65  ayer has set one
381b0 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79   of the "file-ty
381c0 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20  pe" flags. */.  
381d0 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
381e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
381f0 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  DB      || eType
38200 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
38210 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c  MP_DB .       ||
38220 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
38230 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
38240 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
38250 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
38260 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
38270 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
38280 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c  N_SUBJOURNAL   |
38290 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
382a0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
382b0 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
382c0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
382d0 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c  N_TRANSIENT_DB |
382e0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
382f0 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20  OPEN_WAL.  );.. 
38300 20 2f 2a 20 44 65 74 65 63 74 20 61 20 70 69 64   /* Detect a pid
38310 20 63 68 61 6e 67 65 20 61 6e 64 20 72 65 73 65   change and rese
38320 74 20 74 68 65 20 50 52 4e 47 2e 20 20 54 68 65  t the PRNG.  The
38330 72 65 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e  re is a race con
38340 64 69 74 69 6f 6e 0a 20 20 2a 2a 20 68 65 72 65  dition.  ** here
38350 20 73 75 63 68 20 74 68 61 74 20 74 77 6f 20 6f   such that two o
38360 72 20 6d 6f 72 65 20 74 68 72 65 61 64 73 20 61  r more threads a
38370 6c 6c 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65  ll trying to ope
38380 6e 20 64 61 74 61 62 61 73 65 73 20 61 74 0a 20  n databases at. 
38390 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 69 6e 73   ** the same ins
383a0 74 61 6e 74 20 6d 69 67 68 74 20 61 6c 6c 20 72  tant might all r
383b0 65 73 65 74 20 74 68 65 20 50 52 4e 47 2e 20 20  eset the PRNG.  
383c0 42 75 74 20 6d 75 6c 74 69 70 6c 65 20 72 65 73  But multiple res
383d0 65 74 73 0a 20 20 2a 2a 20 61 72 65 20 68 61 72  ets.  ** are har
383e0 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  mless..  */.  if
383f0 28 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 21  ( randomnessPid!
38400 3d 67 65 74 70 69 64 28 29 20 29 7b 0a 20 20 20  =getpid() ){.   
38410 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d   randomnessPid =
38420 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20 20 73   getpid();.    s
38430 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
38440 73 28 30 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20 6d  s(0,0);.  }..  m
38450 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
38460 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a  of(unixFile));..
38470 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c    if( eType==SQL
38480 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
38490 20 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75 73   ){.    UnixUnus
384a0 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a 20  edFd *pUnused;. 
384b0 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e     pUnused = fin
384c0 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e 61 6d  dReusableFd(zNam
384d0 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69  e, flags);.    i
384e0 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  f( pUnused ){.  
384f0 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64      fd = pUnused
38500 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ->fd;.    }else{
38510 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d  .      pUnused =
38520 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
38530 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29  sizeof(*pUnused)
38540 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 55  );.      if( !pU
38550 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20  nused ){.       
38560 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
38570 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
38580