/ Hex Artifact Content
Login

Artifact 895648d4453400e599aa13f5547b96931264ac84:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72  f../*.** standar
0b40: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
0b50: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0b60: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0b70: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0b80: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0b90: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e  .h>.#include <un
0ba0: 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  istd.h>.#include
0bb0: 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75   <time.h>.#inclu
0bc0: 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
0bd0: 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e  #include <errno.
0be0: 68 3e 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  h>.#if !defined(
0bf0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
0c00: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
0c10: 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 69 6e 63  MAP_SIZE>0.# inc
0c20: 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68  lude <sys/mman.h
0c30: 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  >.#endif..#if SQ
0c40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0c50: 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c  ING_STYLE.# incl
0c60: 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68  ude <sys/ioctl.h
0c70: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 75 69  >.# include <uui
0c80: 64 2f 75 75 69 64 2e 68 3e 0a 23 20 69 6e 63 6c  d/uuid.h>.# incl
0c90: 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e  ude <sys/file.h>
0ca0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  .# include <sys/
0cb0: 70 61 72 61 6d 2e 68 3e 0a 23 65 6e 64 69 66 20  param.h>.#endif 
0cc0: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
0cd0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
0ce0: 2f 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  /..#if OS_VXWORK
0cf0: 53 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  S.# include <sys
0d00: 2f 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e 63 6c  /ioctl.h>.# incl
0d10: 75 64 65 20 3c 73 65 6d 61 70 68 6f 72 65 2e 68  ude <semaphore.h
0d20: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 6c 69 6d  >.# include <lim
0d30: 69 74 73 2e 68 3e 0a 23 65 6e 64 69 66 20 2f 2a  its.h>.#endif /*
0d40: 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 0a   OS_VXWORKS */..
0d50: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
0d60: 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45  PLE__) || SQLITE
0d70: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0d80: 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64 65 20  STYLE.# include 
0d90: 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65  <sys/mount.h>.#e
0da0: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 48 41 56  ndif..#ifdef HAV
0db0: 45 5f 55 54 49 4d 45 0a 23 20 69 6e 63 6c 75 64  E_UTIME.# includ
0dc0: 65 20 3c 75 74 69 6d 65 2e 68 3e 0a 23 65 6e 64  e <utime.h>.#end
0dd0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  if../*.** Allowe
0de0: 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69 78  d values of unix
0df0: 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a  File.fsFlags.*/.
0e00: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46  #define SQLITE_F
0e10: 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20  SFLAGS_IS_MSDOS 
0e20: 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49      0x1../*.** I
0e30: 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20 74  f we are to be t
0e40: 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c  hread-safe, incl
0e50: 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64 73  ude the pthreads
0e60: 20 68 65 61 64 65 72 20 61 6e 64 20 64 65 66 69   header and defi
0e70: 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  ne.** the SQLITE
0e80: 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61  _UNIX_THREADS ma
0e90: 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  cro..*/.#if SQLI
0ea0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20  TE_THREADSAFE.# 
0eb0: 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64  include <pthread
0ec0: 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  .h>.# define SQL
0ed0: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
0ee0: 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   1.#endif../*.**
0ef0: 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73   Default permiss
0f00: 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69  ions when creati
0f10: 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f  ng a new file.*/
0f20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0f30: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
0f40: 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e  MISSIONS.# defin
0f50: 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
0f60: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
0f70: 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f  S 0644.#endif../
0f80: 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72  *.** Default per
0f90: 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72  missions when cr
0fa0: 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f 78  eating auto prox
0fb0: 79 20 64 69 72 0a 2a 2f 0a 23 69 66 6e 64 65 66  y dir.*/.#ifndef
0fc0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
0fd0: 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
0fe0: 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51  IONS.# define SQ
0ff0: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
1000: 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
1010: 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f  S 0755.#endif../
1020: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70  *.** Maximum sup
1030: 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67  ported path-leng
1040: 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  th..*/.#define M
1050: 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a  AX_PATHNAME 512.
1060: 0a 2f 2a 20 41 6c 77 61 79 73 20 63 61 73 74 20  ./* Always cast 
1070: 74 68 65 20 67 65 74 70 69 64 28 29 20 72 65 74  the getpid() ret
1080: 75 72 6e 20 74 79 70 65 20 66 6f 72 20 63 6f 6d  urn type for com
1090: 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 0a  patibility with.
10a0: 2a 2a 20 6b 65 72 6e 65 6c 20 6d 6f 64 75 6c 65  ** kernel module
10b0: 73 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20 2a 2f  s in VxWorks. */
10c0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 70 69  .#define osGetpi
10d0: 64 28 58 29 20 28 70 69 64 5f 74 29 67 65 74 70  d(X) (pid_t)getp
10e0: 69 64 28 29 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79  id()../*.** Only
10f0: 20 73 65 74 20 74 68 65 20 6c 61 73 74 45 72 72   set the lastErr
1100: 6e 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20  no if the error 
1110: 63 6f 64 65 20 69 73 20 61 20 72 65 61 6c 20 65  code is a real e
1120: 72 72 6f 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a  rror and not .**
1130: 20 61 20 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74   a normal expect
1140: 65 64 20 72 65 74 75 72 6e 20 63 6f 64 65 20 6f  ed return code o
1150: 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72  f SQLITE_BUSY or
1160: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64   SQLITE_OK.*/.#d
1170: 65 66 69 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52  efine IS_LOCK_ER
1180: 52 4f 52 28 78 29 20 20 28 28 78 20 21 3d 20 53  ROR(x)  ((x != S
1190: 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 78 20  QLITE_OK) && (x 
11a0: 21 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 29 29  != SQLITE_BUSY))
11b0: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
11c0: 65 72 65 6e 63 65 73 20 2a 2f 0a 74 79 70 65 64  erences */.typed
11d0: 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 53 68  ef struct unixSh
11e0: 6d 20 75 6e 69 78 53 68 6d 3b 20 20 20 20 20 20  m unixShm;      
11f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e           /* Conn
1200: 65 63 74 69 6f 6e 20 73 68 61 72 65 64 20 6d 65  ection shared me
1210: 6d 6f 72 79 20 2a 2f 0a 74 79 70 65 64 65 66 20  mory */.typedef 
1220: 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f  struct unixShmNo
1230: 64 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 3b 20  de unixShmNode; 
1240: 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
1250: 6d 65 6d 6f 72 79 20 69 6e 73 74 61 6e 63 65 20  memory instance 
1260: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1270: 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  t unixInodeInfo 
1280: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 3b 20 20  unixInodeInfo;  
1290: 20 2f 2a 20 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f   /* An i-node */
12a0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
12b0: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 55 6e 69  UnixUnusedFd Uni
12c0: 78 55 6e 75 73 65 64 46 64 3b 20 20 20 20 20 2f  xUnusedFd;     /
12d0: 2a 20 41 6e 20 75 6e 75 73 65 64 20 66 69 6c 65  * An unused file
12e0: 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 0a   descriptor */..
12f0: 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 2c  /*.** Sometimes,
1300: 20 61 66 74 65 72 20 61 20 66 69 6c 65 20 68 61   after a file ha
1310: 6e 64 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 62  ndle is closed b
1320: 79 20 53 51 4c 69 74 65 2c 20 74 68 65 20 66 69  y SQLite, the fi
1330: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a  le descriptor.**
1340: 20 63 61 6e 6e 6f 74 20 62 65 20 63 6c 6f 73 65   cannot be close
1350: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49  d immediately. I
1360: 6e 20 74 68 65 73 65 20 63 61 73 65 73 2c 20 69  n these cases, i
1370: 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
1380: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72  following.** str
1390: 75 63 74 75 72 65 20 61 72 65 20 75 73 65 64 20  ucture are used 
13a0: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c  to store the fil
13b0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 68 69  e descriptor whi
13c0: 6c 65 20 77 61 69 74 69 6e 67 20 66 6f 72 20 61  le waiting for a
13d0: 6e 0a 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79  n.** opportunity
13e0: 20 74 6f 20 65 69 74 68 65 72 20 63 6c 6f 73 65   to either close
13f0: 20 6f 72 20 72 65 75 73 65 20 69 74 2e 0a 2a 2f   or reuse it..*/
1400: 0a 73 74 72 75 63 74 20 55 6e 69 78 55 6e 75 73  .struct UnixUnus
1410: 65 64 46 64 20 7b 0a 20 20 69 6e 74 20 66 64 3b  edFd {.  int fd;
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1430: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
1440: 69 70 74 6f 72 20 74 6f 20 63 6c 6f 73 65 20 2a  iptor to close *
1450: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20  /.  int flags;  
1460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1470: 20 46 6c 61 67 73 20 74 68 69 73 20 66 69 6c 65   Flags this file
1480: 20 64 65 73 63 72 69 70 74 6f 72 20 77 61 73 20   descriptor was 
1490: 6f 70 65 6e 65 64 20 77 69 74 68 20 2a 2f 0a 20  opened with */. 
14a0: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
14b0: 4e 65 78 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65  Next;      /* Ne
14c0: 78 74 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  xt unused file d
14d0: 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 73 61 6d  escriptor on sam
14e0: 65 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  e file */.};../*
14f0: 0a 2a 2a 20 54 68 65 20 75 6e 69 78 46 69 6c 65  .** The unixFile
1500: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 73 75   structure is su
1510: 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65  bclass of sqlite
1520: 33 5f 66 69 6c 65 20 73 70 65 63 69 66 69 63 20  3_file specific 
1530: 74 6f 20 74 68 65 20 75 6e 69 78 0a 2a 2a 20 56  to the unix.** V
1540: 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  FS implementatio
1550: 6e 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ns..*/.typedef s
1560: 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 20 75  truct unixFile u
1570: 6e 69 78 46 69 6c 65 3b 0a 73 74 72 75 63 74 20  nixFile;.struct 
1580: 75 6e 69 78 46 69 6c 65 20 7b 0a 20 20 73 71 6c  unixFile {.  sql
1590: 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
15a0: 63 6f 6e 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20  const *pMethod; 
15b0: 20 2f 2a 20 41 6c 77 61 79 73 20 74 68 65 20 66   /* Always the f
15c0: 69 72 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  irst entry */.  
15d0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
15e0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
15f0: 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 74      /* The VFS t
1600: 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73  hat created this
1610: 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20 75   unixFile */.  u
1620: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
1630: 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  node;           
1640: 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74     /* Info about
1650: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20 69   locks on this i
1660: 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b  node */.  int h;
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1690: 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   The file descri
16a0: 70 74 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ptor */.  unsign
16b0: 65 64 20 63 68 61 72 20 65 46 69 6c 65 4c 6f 63  ed char eFileLoc
16c0: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
16d0: 20 54 68 65 20 74 79 70 65 20 6f 66 20 6c 6f 63   The type of loc
16e0: 6b 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66  k held on this f
16f0: 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  d */.  unsigned 
1700: 73 68 6f 72 74 20 69 6e 74 20 63 74 72 6c 46 6c  short int ctrlFl
1710: 61 67 73 3b 20 20 20 20 20 20 20 2f 2a 20 42 65  ags;       /* Be
1720: 68 61 76 69 6f 72 61 6c 20 62 69 74 73 2e 20 20  havioral bits.  
1730: 55 4e 49 58 46 49 4c 45 5f 2a 20 66 6c 61 67 73  UNIXFILE_* flags
1740: 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 73 74 45 72   */.  int lastEr
1750: 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  rno;            
1760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1770: 20 75 6e 69 78 20 65 72 72 6e 6f 20 66 72 6f 6d   unix errno from
1780: 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20   last I/O error 
1790: 2a 2f 0a 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69  */.  void *locki
17a0: 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 20  ngContext;      
17b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b           /* Lock
17c0: 69 6e 67 20 73 74 79 6c 65 20 73 70 65 63 69 66  ing style specif
17d0: 69 63 20 73 74 61 74 65 20 2a 2f 0a 20 20 55 6e  ic state */.  Un
17e0: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
17f0: 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  sed;            
1800: 20 20 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63 61 74    /* Pre-allocat
1810: 65 64 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  ed UnixUnusedFd 
1820: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1830: 2a 7a 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  *zPath;         
1840: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1850: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   of the file */.
1860: 20 20 75 6e 69 78 53 68 6d 20 2a 70 53 68 6d 3b    unixShm *pShm;
1870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1880: 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
1890: 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 69  memory segment i
18a0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
18b0: 69 6e 74 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20  int szChunk;    
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65      /* Configure
18e0: 64 20 62 79 20 46 43 4e 54 4c 5f 43 48 55 4e 4b  d by FCNTL_CHUNK
18f0: 5f 53 49 5a 45 20 2a 2f 0a 23 69 66 20 53 51 4c  _SIZE */.#if SQL
1900: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1910: 45 3e 30 0a 20 20 69 6e 74 20 6e 46 65 74 63 68  E>0.  int nFetch
1920: 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Out;            
1930: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1940: 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  ber of outstandi
1950: 6e 67 20 78 46 65 74 63 68 20 72 65 66 73 20 2a  ng xFetch refs *
1960: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
1970: 34 20 6d 6d 61 70 53 69 7a 65 3b 20 20 20 20 20  4 mmapSize;     
1980: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 61 62 6c          /* Usabl
1990: 65 20 73 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e  e size of mappin
19a0: 67 20 61 74 20 70 4d 61 70 52 65 67 69 6f 6e 20  g at pMapRegion 
19b0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
19c0: 36 34 20 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  64 mmapSizeActua
19d0: 6c 3b 20 20 20 20 20 20 20 2f 2a 20 41 63 74 75  l;       /* Actu
19e0: 61 6c 20 73 69 7a 65 20 6f 66 20 6d 61 70 70 69  al size of mappi
19f0: 6e 67 20 61 74 20 70 4d 61 70 52 65 67 69 6f 6e  ng at pMapRegion
1a00: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
1a10: 74 36 34 20 6d 6d 61 70 53 69 7a 65 4d 61 78 3b  t64 mmapSizeMax;
1a20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
1a30: 66 69 67 75 72 65 64 20 46 43 4e 54 4c 5f 4d 4d  figured FCNTL_MM
1a40: 41 50 5f 53 49 5a 45 20 76 61 6c 75 65 20 2a 2f  AP_SIZE value */
1a50: 0a 20 20 76 6f 69 64 20 2a 70 4d 61 70 52 65 67  .  void *pMapReg
1a60: 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
1a70: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
1a80: 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20 2a   mapped region *
1a90: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  /.#endif.#ifdef 
1aa0: 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 20 20 69 6e 74  __QNXNTO__.  int
1ab0: 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20   sectorSize;    
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad0: 20 2f 2a 20 44 65 76 69 63 65 20 73 65 63 74 6f   /* Device secto
1ae0: 72 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20  r size */.  int 
1af0: 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
1b00: 73 74 69 63 73 3b 20 20 20 20 20 20 20 20 20 20  stics;          
1b10: 2f 2a 20 50 72 65 63 6f 6d 70 75 74 65 64 20 64  /* Precomputed d
1b20: 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
1b30: 73 74 69 63 73 20 2a 2f 0a 23 65 6e 64 69 66 0a  stics */.#endif.
1b40: 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
1b50: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
1b60: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  || defined(__APP
1b70: 4c 45 5f 5f 29 0a 20 20 69 6e 74 20 6f 70 65 6e  LE__).  int open
1b80: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1ba0: 68 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69  he flags specifi
1bb0: 65 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a  ed at open() */.
1bc0: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
1bd0: 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52  E_ENABLE_DATA_PR
1be0: 4f 54 45 43 54 49 4f 4e 0a 20 20 69 6e 74 20 70  OTECTION.  int p
1bf0: 72 6f 74 46 6c 61 67 73 3b 20 20 20 20 20 20 20  rotFlags;       
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c10: 2a 20 44 61 74 61 20 70 72 6f 74 65 63 74 69 6f  * Data protectio
1c20: 6e 20 66 6c 61 67 73 20 66 72 6f 6d 20 75 6e 69  n flags from uni
1c30: 78 4f 70 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a  xOpen */.#endif.
1c40: 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
1c50: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
1c60: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  || defined(__APP
1c70: 4c 45 5f 5f 29 0a 20 20 75 6e 73 69 67 6e 65 64  LE__).  unsigned
1c80: 20 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20   fsFlags;       
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
1ca0: 61 63 68 65 64 20 64 65 74 61 69 6c 73 20 66 72  ached details fr
1cb0: 6f 6d 20 73 74 61 74 66 73 28 29 20 2a 2f 0a 23  om statfs() */.#
1cc0: 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56 58 57  endif.#if OS_VXW
1cd0: 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78  ORKS.  struct vx
1ce0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
1cf0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e  ;          /* Un
1d00: 69 71 75 65 20 66 69 6c 65 20 49 44 20 2a 2f 0a  ique file ID */.
1d10: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
1d20: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
1d30: 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f  The next group o
1d40: 66 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  f variables are 
1d50: 75 73 65 64 20 74 6f 20 74 72 61 63 6b 20 77 68  used to track wh
1d60: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
1d70: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
1d80: 6e 20 63 6f 75 6e 74 65 72 20 69 6e 20 62 79 74  n counter in byt
1d90: 65 73 20 32 34 2d 32 37 20 6f 66 20 64 61 74 61  es 24-27 of data
1da0: 62 61 73 65 20 66 69 6c 65 73 20 61 72 65 20 75  base files are u
1db0: 70 64 61 74 65 64 0a 20 20 2a 2a 20 77 68 65 6e  pdated.  ** when
1dc0: 65 76 65 72 20 61 6e 79 20 70 61 72 74 20 6f 66  ever any part of
1dd0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 68   the database ch
1de0: 61 6e 67 65 73 2e 20 20 41 6e 20 61 73 73 65 72  anges.  An asser
1df0: 74 69 6f 6e 20 66 61 75 6c 74 20 77 69 6c 6c 0a  tion fault will.
1e00: 20 20 2a 2a 20 6f 63 63 75 72 20 69 66 20 61 20    ** occur if a 
1e10: 66 69 6c 65 20 69 73 20 75 70 64 61 74 65 64 20  file is updated 
1e20: 77 69 74 68 6f 75 74 20 61 6c 73 6f 20 75 70 64  without also upd
1e30: 61 74 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61  ating the transa
1e40: 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74  ction.  ** count
1e50: 65 72 2e 20 20 54 68 69 73 20 74 65 73 74 20 69  er.  This test i
1e60: 73 20 6d 61 64 65 20 74 6f 20 61 76 6f 69 64 20  s made to avoid 
1e70: 6e 65 77 20 70 72 6f 62 6c 65 6d 73 20 73 69 6d  new problems sim
1e80: 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ilar to the.  **
1e90: 20 6f 6e 65 20 64 65 73 63 72 69 62 65 64 20 62   one described b
1ea0: 79 20 74 69 63 6b 65 74 20 23 33 35 38 34 2e 20  y ticket #3584. 
1eb0: 0a 20 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  .  */.  unsigned
1ec0: 20 63 68 61 72 20 74 72 61 6e 73 43 6e 74 72 43   char transCntrC
1ed0: 68 6e 67 3b 20 20 20 2f 2a 20 54 72 75 65 20 69  hng;   /* True i
1ee0: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1ef0: 6e 20 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65  n counter change
1f00: 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  d */.  unsigned 
1f10: 63 68 61 72 20 64 62 55 70 64 61 74 65 3b 20 20  char dbUpdate;  
1f20: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1f30: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 64 61 74   any part of dat
1f40: 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
1f50: 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ed */.  unsigned
1f60: 20 63 68 61 72 20 69 6e 4e 6f 72 6d 61 6c 57 72   char inNormalWr
1f70: 69 74 65 3b 20 20 20 2f 2a 20 54 72 75 65 20 69  ite;   /* True i
1f80: 66 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 77 72  f in a normal wr
1f90: 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ite operation */
1fa0: 0a 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ..#endif..#ifdef
1fb0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f   SQLITE_TEST.  /
1fc0: 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64 65 2c 20  * In test mode, 
1fd0: 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a  increase the siz
1fe0: 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
1ff0: 75 72 65 20 61 20 62 69 74 20 73 6f 20 74 68 61  ure a bit so tha
2000: 74 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 6c 61  t .  ** it is la
2010: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 74  rger than the st
2020: 72 75 63 74 20 43 72 61 73 68 46 69 6c 65 20 64  ruct CrashFile d
2030: 65 66 69 6e 65 64 20 69 6e 20 74 65 73 74 36 2e  efined in test6.
2040: 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 61  c..  */.  char a
2050: 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a 23 65 6e  Padding[32];.#en
2060: 64 69 66 0a 7d 3b 0a 0a 2f 2a 20 54 68 69 73 20  dif.};../* This 
2070: 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73 20 74  variable holds t
2080: 68 65 20 70 72 6f 63 65 73 73 20 69 64 20 28 70  he process id (p
2090: 69 64 29 20 66 72 6f 6d 20 77 68 65 6e 20 74 68  id) from when th
20a0: 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73 28 29 0a  e xRandomness().
20b0: 2a 2a 20 6d 65 74 68 6f 64 20 77 61 73 20 63 61  ** method was ca
20c0: 6c 6c 65 64 2e 20 20 49 66 20 78 4f 70 65 6e 28  lled.  If xOpen(
20d0: 29 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  ) is called from
20e0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f   a different pro
20f0: 63 65 73 73 20 69 64 2c 0a 2a 2a 20 69 6e 64 69  cess id,.** indi
2100: 63 61 74 69 6e 67 20 74 68 61 74 20 61 20 66 6f  cating that a fo
2110: 72 6b 28 29 20 68 61 73 20 6f 63 63 75 72 72 65  rk() has occurre
2120: 64 2c 20 74 68 65 20 50 52 4e 47 20 77 69 6c 6c  d, the PRNG will
2130: 20 62 65 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74   be reset..*/.st
2140: 61 74 69 63 20 70 69 64 5f 74 20 72 61 6e 64 6f  atic pid_t rando
2150: 6d 6e 65 73 73 50 69 64 20 3d 20 30 3b 0a 0a 2f  mnessPid = 0;../
2160: 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c  *.** Allowed val
2170: 75 65 73 20 66 6f 72 20 74 68 65 20 75 6e 69 78  ues for the unix
2180: 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73 20 62  File.ctrlFlags b
2190: 69 74 6d 61 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69  itmask:.*/.#defi
21a0: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c  ne UNIXFILE_EXCL
21b0: 20 20 20 20 20 20 20 20 30 78 30 31 20 20 20 20          0x01    
21c0: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 73 20   /* Connections 
21d0: 66 72 6f 6d 20 6f 6e 65 20 70 72 6f 63 65 73 73  from one process
21e0: 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65   only */.#define
21f0: 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59   UNIXFILE_RDONLY
2200: 20 20 20 20 20 20 30 78 30 32 20 20 20 20 20 2f        0x02     /
2210: 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  * Connection is 
2220: 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65  read only */.#de
2230: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 50 45  fine UNIXFILE_PE
2240: 52 53 49 53 54 5f 57 41 4c 20 30 78 30 34 20 20  RSIST_WAL 0x04  
2250: 20 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74     /* Persistent
2260: 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 69 66   WAL mode */.#if
2270: 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  ndef SQLITE_DISA
2280: 42 4c 45 5f 44 49 52 53 59 4e 43 0a 23 20 64 65  BLE_DIRSYNC.# de
2290: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44 49  fine UNIXFILE_DI
22a0: 52 53 59 4e 43 20 20 20 20 30 78 30 38 20 20 20  RSYNC    0x08   
22b0: 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 73    /* Directory s
22c0: 79 6e 63 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65  ync needed */.#e
22d0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 55 4e 49  lse.# define UNI
22e0: 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 20 20  XFILE_DIRSYNC   
22f0: 20 30 78 30 30 0a 23 65 6e 64 69 66 0a 23 64 65   0x00.#endif.#de
2300: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 50 53  fine UNIXFILE_PS
2310: 4f 57 20 20 20 20 20 20 20 20 30 78 31 30 20 20  OW        0x10  
2320: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43     /* SQLITE_IOC
2330: 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
2340: 52 57 52 49 54 45 20 2a 2f 0a 23 64 65 66 69 6e  RWRITE */.#defin
2350: 65 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54  e UNIXFILE_DELET
2360: 45 20 20 20 20 20 20 30 78 32 30 20 20 20 20 20  E      0x20     
2370: 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f  /* Delete on clo
2380: 73 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  se */.#define UN
2390: 49 58 46 49 4c 45 5f 55 52 49 20 20 20 20 20 20  IXFILE_URI      
23a0: 20 20 20 30 78 34 30 20 20 20 20 20 2f 2a 20 46     0x40     /* F
23b0: 69 6c 65 6e 61 6d 65 20 6d 69 67 68 74 20 68 61  ilename might ha
23c0: 76 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ve query paramet
23d0: 65 72 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55  ers */.#define U
23e0: 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 20  NIXFILE_NOLOCK  
23f0: 20 20 20 20 30 78 38 30 20 20 20 20 20 2f 2a 20      0x80     /* 
2400: 44 6f 20 6e 6f 20 66 69 6c 65 20 6c 6f 63 6b 69  Do no file locki
2410: 6e 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  ng */.#define UN
2420: 49 58 46 49 4c 45 5f 57 41 52 4e 45 44 20 20 20  IXFILE_WARNED   
2430: 20 30 78 30 31 30 30 20 20 20 20 20 2f 2a 20 76   0x0100     /* v
2440: 65 72 69 66 79 44 62 46 69 6c 65 28 29 20 77 61  erifyDbFile() wa
2450: 72 6e 69 6e 67 73 20 69 73 73 75 65 64 20 2a 2f  rnings issued */
2460: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2470: 45 5f 42 4c 4f 43 4b 20 20 20 20 20 30 78 30 32  E_BLOCK     0x02
2480: 30 30 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 53  00     /* Next S
2490: 48 4d 20 6c 6f 63 6b 20 6d 69 67 68 74 20 62 6c  HM lock might bl
24a0: 6f 63 6b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ock */../*.** In
24b0: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20  clude code that 
24c0: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  is common to all
24d0: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f   os_*.c files.*/
24e0: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f  .#include "os_co
24f0: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44  mmon.h"../*.** D
2500: 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61  efine various ma
2510: 63 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69  cros that are mi
2520: 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20  ssing from some 
2530: 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e  systems..*/.#ifn
2540: 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a  def O_LARGEFILE.
2550: 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45  # define O_LARGE
2560: 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69  FILE 0.#endif.#i
2570: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  fdef SQLITE_DISA
2580: 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20  BLE_LFS.# undef 
2590: 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65  O_LARGEFILE.# de
25a0: 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45  fine O_LARGEFILE
25b0: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   0.#endif.#ifnde
25c0: 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64  f O_NOFOLLOW.# d
25d0: 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57  efine O_NOFOLLOW
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 42 49 4e 41 52 59 0a 23 20 64 65 66  f O_BINARY.# def
2600: 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23  ine O_BINARY 0.#
2610: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
2620: 20 74 68 72 65 61 64 69 64 20 6d 61 63 72 6f 20   threadid macro 
2630: 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68 65 20  resolves to the 
2640: 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74 6f 20  thread-id or to 
2650: 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20  0.  Used for.** 
2660: 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
2670: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
2680: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
2690: 53 41 46 45 0a 23 64 65 66 69 6e 65 20 74 68 72  SAFE.#define thr
26a0: 65 61 64 69 64 20 70 74 68 72 65 61 64 5f 73 65  eadid pthread_se
26b0: 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  lf().#else.#defi
26c0: 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a 23 65  ne threadid 0.#e
26d0: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 5f 5f 41  ndif..#ifdef __A
26e0: 50 50 4c 45 5f 5f 0a 23 64 65 66 69 6e 65 20 53  PPLE__.#define S
26f0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 55 50  QLITE_ENABLE_SUP
2700: 45 52 4c 4f 43 4b 20 31 0a 23 65 6e 64 69 66 0a  ERLOCK 1.#endif.
2710: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
2720: 4c 45 5f 53 55 50 45 52 4c 4f 43 4b 0a 23 69 6e  LE_SUPERLOCK.#in
2730: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e 68  clude "sqlite3.h
2740: 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69  ".#include <stri
2750: 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ng.h>.#include <
2760: 61 73 73 65 72 74 2e 68 3e 0a 0a 2f 2a 0a 2a 2a  assert.h>../*.**
2770: 20 41 20 73 74 72 75 63 74 75 72 65 20 74 6f 20   A structure to 
2780: 63 6f 6c 6c 65 63 74 20 61 20 62 75 73 79 2d 68  collect a busy-h
2790: 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
27a0: 61 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  and argument and
27b0: 20 61 20 63 6f 75 6e 74 0a 2a 2a 20 6f 66 20 74   a count.** of t
27c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d  he number of tim
27d0: 65 73 20 69 74 20 68 61 73 20 62 65 65 6e 20 69  es it has been i
27e0: 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 72 75 63  nvoked..*/.struc
27f0: 74 20 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20  t SuperlockBusy 
2800: 7b 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 29  {.  int (*xBusy)
2810: 28 76 6f 69 64 2a 2c 69 6e 74 29 3b 20 20 20 20  (void*,int);    
2820: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2830: 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66  o busy-handler f
2840: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  unction */.  voi
2850: 64 20 2a 70 42 75 73 79 41 72 67 3b 20 20 20 20  d *pBusyArg;    
2860: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2870: 46 69 72 73 74 20 61 72 67 20 74 6f 20 70 61 73  First arg to pas
2880: 73 20 74 6f 20 78 42 75 73 79 20 2a 2f 0a 20 20  s to xBusy */.  
2890: 69 6e 74 20 6e 42 75 73 79 3b 20 20 20 20 20 20  int nBusy;      
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d  /* Number of tim
28c0: 65 73 20 78 42 75 73 79 20 68 61 73 20 62 65 65  es xBusy has bee
28d0: 6e 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 7d 3b 0a  n invoked */.};.
28e0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
28f0: 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 53 75 70  uperlockBusy Sup
2900: 65 72 6c 6f 63 6b 42 75 73 79 3b 0a 0a 2f 2a 0a  erlockBusy;../*.
2910: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
2920: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2930: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
2940: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
2950: 61 63 74 69 76 65 0a 2a 2a 20 73 75 70 65 72 6c  active.** superl
2960: 6f 63 6b 2e 20 54 68 65 20 6f 70 61 71 75 65 20  ock. The opaque 
2970: 68 61 6e 64 6c 65 20 72 65 74 75 72 6e 65 64 20  handle returned 
2980: 62 79 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73  by sqlite3demo_s
2990: 75 70 65 72 6c 6f 63 6b 28 29 20 69 73 0a 2a 2a  uperlock() is.**
29a0: 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e   actually a poin
29b0: 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e  ter to an instan
29c0: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
29d0: 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ture..*/.struct 
29e0: 53 75 70 65 72 6c 6f 63 6b 20 7b 0a 20 20 73 71  Superlock {.  sq
29f0: 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a10: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
2a20: 20 75 73 65 64 20 74 6f 20 6c 6f 63 6b 20 64 62   used to lock db
2a30: 20 2a 2f 0a 20 20 69 6e 74 20 62 57 61 6c 3b 20   */.  int bWal; 
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a50: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2a60: 20 64 62 20 69 73 20 61 20 57 41 4c 20 64 61 74   db is a WAL dat
2a70: 61 62 61 73 65 20 2a 2f 0a 7d 3b 0a 74 79 70 65  abase */.};.type
2a80: 64 65 66 20 73 74 72 75 63 74 20 53 75 70 65 72  def struct Super
2a90: 6c 6f 63 6b 20 53 75 70 65 72 6c 6f 63 6b 3b 0a  lock Superlock;.
2aa0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 43 74 78 20  ./*.** The pCtx 
2ab0: 70 6f 69 6e 74 65 72 20 70 61 73 73 65 64 20 74  pointer passed t
2ac0: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
2ad0: 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f  is actually a po
2ae0: 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a 20 53 75  inter to a.** Su
2af0: 70 65 72 6c 6f 63 6b 42 75 73 79 20 73 74 72 75  perlockBusy stru
2b00: 63 74 75 72 65 2e 20 49 6e 76 6f 6b 65 20 74 68  cture. Invoke th
2b10: 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66  e busy-handler f
2b20: 75 6e 63 74 69 6f 6e 20 65 6e 63 61 70 73 75 6c  unction encapsul
2b30: 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73  ated.** by the s
2b40: 74 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74  tructure and ret
2b50: 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  urn the result..
2b60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
2b70: 70 65 72 6c 6f 63 6b 42 75 73 79 48 61 6e 64 6c  perlockBusyHandl
2b80: 65 72 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 69  er(void *pCtx, i
2b90: 6e 74 20 55 4e 55 53 45 44 29 7b 0a 20 20 53 75  nt UNUSED){.  Su
2ba0: 70 65 72 6c 6f 63 6b 42 75 73 79 20 2a 70 42 75  perlockBusy *pBu
2bb0: 73 79 20 3d 20 28 53 75 70 65 72 6c 6f 63 6b 42  sy = (SuperlockB
2bc0: 75 73 79 20 2a 29 70 43 74 78 3b 0a 20 20 69 66  usy *)pCtx;.  if
2bd0: 28 20 70 42 75 73 79 2d 3e 78 42 75 73 79 3d 3d  ( pBusy->xBusy==
2be0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
2bf0: 72 65 74 75 72 6e 20 70 42 75 73 79 2d 3e 78 42  return pBusy->xB
2c00: 75 73 79 28 70 42 75 73 79 2d 3e 70 42 75 73 79  usy(pBusy->pBusy
2c10: 41 72 67 2c 20 70 42 75 73 79 2d 3e 6e 42 75 73  Arg, pBusy->nBus
2c20: 79 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  y++);.}../*.** T
2c30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2c40: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
2c50: 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 64 61  e if the main da
2c60: 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
2c70: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  .** connection d
2c80: 62 20 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c  b is open in WAL
2c90: 20 6d 6f 64 65 20 6f 72 20 6e 6f 74 2e 20 49 66   mode or not. If
2ca0: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
2cb0: 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74 61   and the.** data
2cc0: 62 61 73 65 20 66 69 6c 65 20 69 73 20 69 6e 20  base file is in 
2cd0: 57 41 4c 20 6d 6f 64 65 2c 20 73 65 74 20 2a 70  WAL mode, set *p
2ce0: 62 57 61 6c 20 74 6f 20 74 72 75 65 20 61 6e 64  bWal to true and
2cf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2d00: 4b 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 6e  K..** If it is n
2d10: 6f 74 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20  ot in WAL mode, 
2d20: 73 65 74 20 2a 70 62 57 61 6c 20 74 6f 20 66 61  set *pbWal to fa
2d30: 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  lse..**.** If an
2d40: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
2d50: 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
2d60: 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20  error code. The 
2d70: 76 61 6c 75 65 20 6f 66 20 2a 70 62 57 61 6c 0a  value of *pbWal.
2d80: 2a 2a 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  ** is undefined 
2d90: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f  in this case..*/
2da0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 70 65  .static int supe
2db0: 72 6c 6f 63 6b 49 73 57 61 6c 28 53 75 70 65 72  rlockIsWal(Super
2dc0: 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20  lock *pLock){.  
2dd0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
2de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df0: 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
2e00: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
2e10: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20   *pStmt;        
2e20: 20 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20      /* Compiled 
2e30: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
2e40: 6f 64 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ode statement */
2e50: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
2e60: 5f 70 72 65 70 61 72 65 28 70 4c 6f 63 6b 2d 3e  _prepare(pLock->
2e70: 64 62 2c 20 22 50 52 41 47 4d 41 20 6d 61 69 6e  db, "PRAGMA main
2e80: 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 22 2c 20  .journal_mode", 
2e90: 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
2ea0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2eb0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
2ec0: 0a 0a 20 20 70 4c 6f 63 6b 2d 3e 62 57 61 6c 20  ..  pLock->bWal 
2ed0: 3d 20 30 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  = 0;.  if( SQLIT
2ee0: 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
2ef0: 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
2f00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d    const char *zM
2f10: 6f 64 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ode = (const cha
2f20: 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r *)sqlite3_colu
2f30: 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30  mn_text(pStmt, 0
2f40: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 6f 64 65  );.    if( zMode
2f50: 20 26 26 20 73 74 72 6c 65 6e 28 7a 4d 6f 64 65   && strlen(zMode
2f60: 29 3d 3d 33 20 26 26 20 73 71 6c 69 74 65 33 5f  )==3 && sqlite3_
2f70: 73 74 72 6e 69 63 6d 70 28 22 77 61 6c 22 2c 20  strnicmp("wal", 
2f80: 7a 4d 6f 64 65 2c 20 33 29 3d 3d 30 20 29 7b 0a  zMode, 3)==0 ){.
2f90: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 62 57 61        pLock->bWa
2fa0: 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  l = 1;.    }.  }
2fb0: 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ..  return sqlit
2fc0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
2fd0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74  t);.}../*.** Obt
2fe0: 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ain an exclusive
2ff0: 20 73 68 6d 2d 6c 6f 63 6b 20 6f 6e 20 6e 42 79   shm-lock on nBy
3000: 74 65 20 62 79 74 65 73 20 73 74 61 72 74 69 6e  te bytes startin
3010: 67 20 61 74 20 6f 66 66 73 65 74 20 69 64 78 0a  g at offset idx.
3020: 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66  ** of the file f
3030: 64 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63  d. If the lock c
3040: 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  annot be obtaine
3050: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 69  d immediately, i
3060: 6e 76 6f 6b 65 0a 2a 2a 20 74 68 65 20 62 75 73  nvoke.** the bus
3070: 79 2d 68 61 6e 64 6c 65 72 20 75 6e 74 69 6c 20  y-handler until 
3080: 65 69 74 68 65 72 20 69 74 20 69 73 20 6f 62 74  either it is obt
3090: 61 69 6e 65 64 20 6f 72 20 74 68 65 20 62 75 73  ained or the bus
30a0: 79 2d 68 61 6e 64 6c 65 72 0a 2a 2a 20 63 61 6c  y-handler.** cal
30b0: 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 30 2e  lback returns 0.
30c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
30d0: 75 70 65 72 6c 6f 63 6b 53 68 6d 4c 6f 63 6b 28  uperlockShmLock(
30e0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
30f0: 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *fd,            
3100: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
3110: 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ile handle */.  
3120: 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20 20  int idx,        
3130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3140: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 73 68 6d  /* Offset of shm
3150: 2d 6c 6f 63 6b 20 74 6f 20 6f 62 74 61 69 6e 20  -lock to obtain 
3160: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  */.  int nByte, 
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3180: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3190: 66 20 63 6f 6e 73 65 63 74 69 76 65 20 62 79 74  f consective byt
31a0: 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  es to lock */.  
31b0: 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 2a 70  SuperlockBusy *p
31c0: 42 75 73 79 20 20 20 20 20 20 20 20 20 20 20 20  Busy            
31d0: 2f 2a 20 42 75 73 79 2d 68 61 6e 64 6c 65 72 20  /* Busy-handler 
31e0: 77 72 61 70 70 65 72 20 6f 62 6a 65 63 74 20 2a  wrapper object *
31f0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
3200: 20 69 6e 74 20 28 2a 78 53 68 6d 4c 6f 63 6b 29   int (*xShmLock)
3210: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
3220: 69 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 29 20 3d  int, int, int) =
3230: 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78   fd->pMethods->x
3240: 53 68 6d 4c 6f 63 6b 3b 0a 20 20 64 6f 20 7b 0a  ShmLock;.  do {.
3250: 20 20 20 20 72 63 20 3d 20 78 53 68 6d 4c 6f 63      rc = xShmLoc
3260: 6b 28 66 64 2c 20 69 64 78 2c 20 6e 42 79 74 65  k(fd, idx, nByte
3270: 2c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43  , SQLITE_SHM_LOC
3280: 4b 7c 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  K|SQLITE_SHM_EXC
3290: 4c 55 53 49 56 45 29 3b 0a 20 20 7d 77 68 69 6c  LUSIVE);.  }whil
32a0: 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
32b0: 53 59 20 26 26 20 73 75 70 65 72 6c 6f 63 6b 42  SY && superlockB
32c0: 75 73 79 48 61 6e 64 6c 65 72 28 28 76 6f 69 64  usyHandler((void
32d0: 20 2a 29 70 42 75 73 79 2c 20 30 29 20 29 3b 0a   *)pBusy, 0) );.
32e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
32f0: 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 74 68 65  /*.** Obtain the
3300: 20 65 78 74 72 61 20 6c 6f 63 6b 73 20 6f 6e 20   extra locks on 
3310: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
3320: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 57  e required for W
3330: 41 4c 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a  AL databases..**
3340: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 75 70 70   Invoke the supp
3350: 6c 69 65 64 20 62 75 73 79 2d 68 61 6e 64 6c 65  lied busy-handle
3360: 72 20 61 73 20 72 65 71 75 69 72 65 64 2e 0a 2a  r as required..*
3370: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 70  /.static int sup
3380: 65 72 6c 6f 63 6b 57 61 6c 4c 6f 63 6b 28 0a 20  erlockWalLock(. 
3390: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
33c0: 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 57 41 4c 20  dle open on WAL 
33d0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 53 75  database */.  Su
33e0: 70 65 72 6c 6f 63 6b 42 75 73 79 20 2a 70 42 75  perlockBusy *pBu
33f0: 73 79 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sy            /*
3400: 20 42 75 73 79 20 68 61 6e 64 6c 65 72 20 77 72   Busy handler wr
3410: 61 70 70 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  apper object */.
3420: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
3430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3440: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
3450: 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
3460: 5f 66 69 6c 65 20 2a 66 64 20 3d 20 30 3b 20 20  _file *fd = 0;  
3470: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e           /* Main
3480: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
3490: 61 6e 64 6c 65 20 2a 2f 0a 20 20 76 6f 69 64 20  andle */.  void 
34a0: 76 6f 6c 61 74 69 6c 65 20 2a 70 20 3d 20 30 3b  volatile *p = 0;
34b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
34c0: 69 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20 70  inter to first p
34d0: 61 67 65 20 6f 66 20 73 68 61 72 65 64 20 6d 65  age of shared me
34e0: 6d 6f 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62  mory */..  /* Ob
34f0: 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
3500: 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  o the sqlite3_fi
3510: 6c 65 20 6f 62 6a 65 63 74 20 6f 70 65 6e 20 6f  le object open o
3520: 6e 20 74 68 65 20 6d 61 69 6e 20 64 62 20 66 69  n the main db fi
3530: 6c 65 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  le. */.  rc = sq
3540: 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
3550: 6f 6c 28 64 62 2c 20 22 6d 61 69 6e 22 2c 20 53  ol(db, "main", S
3560: 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45  QLITE_FCNTL_FILE
3570: 5f 50 4f 49 4e 54 45 52 2c 20 28 76 6f 69 64 20  _POINTER, (void 
3580: 2a 29 26 66 64 29 3b 0a 20 20 69 66 28 20 72 63  *)&fd);.  if( rc
3590: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
35a0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4f  turn rc;..  /* O
35b0: 62 74 61 69 6e 20 74 68 65 20 22 72 65 63 6f 76  btain the "recov
35c0: 65 72 79 22 20 6c 6f 63 6b 2e 20 4e 6f 72 6d 61  ery" lock. Norma
35d0: 6c 6c 79 2c 20 74 68 69 73 20 6c 6f 63 6b 20 69  lly, this lock i
35e0: 73 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 65 64 20  s only obtained 
35f0: 62 79 0a 20 20 2a 2a 20 63 6c 69 65 6e 74 73 20  by.  ** clients 
3600: 72 75 6e 6e 69 6e 67 20 64 61 74 61 62 61 73 65  running database
3610: 20 72 65 63 6f 76 65 72 79 2e 20 20 0a 20 20 2a   recovery.  .  *
3620: 2f 0a 20 20 72 63 20 3d 20 73 75 70 65 72 6c 6f  /.  rc = superlo
3630: 63 6b 53 68 6d 4c 6f 63 6b 28 66 64 2c 20 32 2c  ckShmLock(fd, 2,
3640: 20 31 2c 20 70 42 75 73 79 29 3b 0a 20 20 69 66   1, pBusy);.  if
3650: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
3660: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
3670: 2f 2a 20 5a 65 72 6f 20 74 68 65 20 73 74 61 72  /* Zero the star
3680: 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73  t of the first s
3690: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 70 61 67  hared-memory pag
36a0: 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  e. This means th
36b0: 61 74 20 61 6e 79 0a 20 20 2a 2a 20 63 6c 69 65  at any.  ** clie
36c0: 6e 74 73 20 74 68 61 74 20 6f 70 65 6e 20 72 65  nts that open re
36d0: 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
36e0: 73 61 63 74 69 6f 6e 73 20 66 72 6f 6d 20 74 68  sactions from th
36f0: 69 73 20 70 6f 69 6e 74 20 6f 6e 20 77 69 6c 6c  is point on will
3700: 0a 20 20 2a 2a 20 68 61 76 65 20 74 6f 20 72 75  .  ** have to ru
3710: 6e 20 72 65 63 6f 76 65 72 79 20 62 65 66 6f 72  n recovery befor
3720: 65 20 70 72 6f 63 65 65 64 69 6e 67 2e 20 53 69  e proceeding. Si
3730: 6e 63 65 20 74 68 65 79 20 6e 65 65 64 20 74 68  nce they need th
3740: 65 20 22 72 65 63 6f 76 65 72 79 22 0a 20 20 2a  e "recovery".  *
3750: 2a 20 6c 6f 63 6b 20 74 68 61 74 20 74 68 69 73  * lock that this
3760: 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
3770: 69 6e 67 20 74 6f 20 64 6f 20 74 68 61 74 2c 20  ing to do that, 
3780: 6e 6f 20 6e 65 77 20 72 65 61 64 20 6f 72 20 77  no new read or w
3790: 72 69 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61  rite.  ** transa
37a0: 63 74 69 6f 6e 73 20 6d 61 79 20 6e 6f 77 20 62  ctions may now b
37b0: 65 20 6f 70 65 6e 65 64 2e 20 4e 6f 72 20 63 61  e opened. Nor ca
37c0: 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 62  n a checkpoint b
37d0: 65 20 72 75 6e 2c 20 66 6f 72 20 74 68 65 0a 20  e run, for the. 
37e0: 20 2a 2a 20 73 61 6d 65 20 72 65 61 73 6f 6e 2e   ** same reason.
37f0: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 64 2d  .  */.  rc = fd-
3800: 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4d  >pMethods->xShmM
3810: 61 70 28 66 64 2c 20 30 2c 20 33 32 2a 31 30 32  ap(fd, 0, 32*102
3820: 34 2c 20 31 2c 20 26 70 29 3b 0a 20 20 69 66 28  4, 1, &p);.  if(
3830: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
3840: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65   return rc;.  me
3850: 6d 73 65 74 28 28 76 6f 69 64 20 2a 29 70 2c 20  mset((void *)p, 
3860: 30 2c 20 33 32 29 3b 0a 0a 20 20 2f 2a 20 4f 62  0, 32);..  /* Ob
3870: 74 61 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  tain exclusive l
3880: 6f 63 6b 73 20 6f 6e 20 61 6c 6c 20 74 68 65 20  ocks on all the 
3890: 22 72 65 61 64 2d 6c 6f 63 6b 22 20 73 6c 6f 74  "read-lock" slot
38a0: 73 2e 20 4f 6e 63 65 20 74 68 65 73 65 20 6c 6f  s. Once these lo
38b0: 63 6b 73 0a 20 20 2a 2a 20 61 72 65 20 68 65 6c  cks.  ** are hel
38c0: 64 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  d, it is guarant
38d0: 65 65 64 20 74 68 61 74 20 74 68 65 72 65 20 61  eed that there a
38e0: 72 65 20 6e 6f 20 61 63 74 69 76 65 20 72 65 61  re no active rea
38f0: 64 65 72 2c 20 77 72 69 74 65 72 20 6f 72 20 0a  der, writer or .
3900: 20 20 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65    ** checkpointe
3910: 72 20 63 6c 69 65 6e 74 73 2e 0a 20 20 2a 2f 0a  r clients..  */.
3920: 20 20 72 63 20 3d 20 73 75 70 65 72 6c 6f 63 6b    rc = superlock
3930: 53 68 6d 4c 6f 63 6b 28 66 64 2c 20 33 2c 20 53  ShmLock(fd, 3, S
3940: 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 2d  QLITE_SHM_NLOCK-
3950: 33 2c 20 70 42 75 73 79 29 3b 0a 20 20 72 65 74  3, pBusy);.  ret
3960: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
3970: 20 52 65 6c 65 61 73 65 20 61 20 73 75 70 65 72   Release a super
3980: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 61 20 64  lock held on a d
3990: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
39a0: 65 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  e argument passe
39b0: 64 20 74 6f 20 0a 2a 2a 20 74 68 69 73 20 66 75  d to .** this fu
39c0: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68 61 76 65  nction must have
39d0: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66   been obtained f
39e0: 72 6f 6d 20 61 20 73 75 63 63 65 73 73 66 75 6c  rom a successful
39f0: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69   call to.** sqli
3a00: 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63  te3demo_superloc
3a10: 6b 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  k()..*/.static v
3a20: 6f 69 64 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f  oid sqlite3demo_
3a30: 73 75 70 65 72 75 6e 6c 6f 63 6b 28 76 6f 69 64  superunlock(void
3a40: 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 53 75 70 65   *pLock){.  Supe
3a50: 72 6c 6f 63 6b 20 2a 70 20 3d 20 28 53 75 70 65  rlock *p = (Supe
3a60: 72 6c 6f 63 6b 20 2a 29 70 4c 6f 63 6b 3b 0a 20  rlock *)pLock;. 
3a70: 20 69 66 28 20 70 2d 3e 62 57 61 6c 20 29 7b 0a   if( p->bWal ){.
3a80: 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20      int rc;     
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3aa0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
3ab0: 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 6c  de */.    int fl
3ac0: 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d  ags = SQLITE_SHM
3ad0: 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
3ae0: 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 3b 0a  _SHM_EXCLUSIVE;.
3af0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
3b00: 20 2a 66 64 20 3d 20 30 3b 0a 20 20 20 20 72 63   *fd = 0;.    rc
3b10: 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
3b20: 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 2c 20 22  control(p->db, "
3b30: 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43  main", SQLITE_FC
3b40: 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  NTL_FILE_POINTER
3b50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
3b70: 76 6f 69 64 20 2a 29 26 66 64 29 3b 0a 20 20 20  void *)&fd);.   
3b80: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
3b90: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 64 2d 3e  OK ){.      fd->
3ba0: 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f  pMethods->xShmLo
3bb0: 63 6b 28 66 64 2c 20 32 2c 20 31 2c 20 66 6c 61  ck(fd, 2, 1, fla
3bc0: 67 73 29 3b 0a 20 20 20 20 20 20 66 64 2d 3e 70  gs);.      fd->p
3bd0: 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63  Methods->xShmLoc
3be0: 6b 28 66 64 2c 20 33 2c 20 53 51 4c 49 54 45 5f  k(fd, 3, SQLITE_
3bf0: 53 48 4d 5f 4e 4c 4f 43 4b 2d 33 2c 20 66 6c 61  SHM_NLOCK-3, fla
3c00: 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  gs);.    }.  }. 
3c10: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
3c20: 2d 3e 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  ->db);.  sqlite3
3c30: 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  _free(p);.}../*.
3c40: 2a 2a 20 4f 62 74 61 69 6e 20 61 20 73 75 70 65  ** Obtain a supe
3c50: 72 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  rlock on the dat
3c60: 61 62 61 73 65 20 66 69 6c 65 20 69 64 65 6e 74  abase file ident
3c70: 69 66 69 65 64 20 62 79 20 7a 50 61 74 68 2c 20  ified by zPath, 
3c80: 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 6c 6f 63  using the.** loc
3c90: 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20  king primitives 
3ca0: 70 72 6f 76 69 64 65 64 20 62 79 20 56 46 53 20  provided by VFS 
3cb0: 7a 56 66 73 2e 20 49 66 20 73 75 63 63 65 73 73  zVfs. If success
3cc0: 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
3cd0: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e  s.** returned an
3ce0: 64 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  d output variabl
3cf0: 65 20 2a 70 70 4c 6f 63 6b 20 69 73 20 70 6f 70  e *ppLock is pop
3d00: 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e 20 6f  ulated with an o
3d10: 70 61 71 75 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  paque handle.** 
3d20: 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 65 64  that may be used
3d30: 20 77 69 74 68 20 73 71 6c 69 74 65 33 64 65 6d   with sqlite3dem
3d40: 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 28 29 20  o_superunlock() 
3d50: 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20 6c  to release the l
3d60: 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ock..**.** If an
3d70: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
3d80: 70 70 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f  ppLock is set to
3d90: 20 30 20 61 6e 64 20 61 6e 20 53 51 4c 69 74 65   0 and an SQLite
3da0: 20 65 72 72 6f 72 20 63 6f 64 65 20 0a 2a 2a 20   error code .** 
3db0: 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 42 55 53  (e.g. SQLITE_BUS
3dc0: 59 29 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  Y) is returned..
3dd0: 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 71 75 69  **.** If a requi
3de0: 72 65 64 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20  red lock cannot 
3df0: 62 65 20 6f 62 74 61 69 6e 65 64 20 69 6d 6d 65  be obtained imme
3e00: 64 69 61 74 65 6c 79 20 61 6e 64 20 74 68 65 20  diately and the 
3e10: 78 42 75 73 79 20 70 61 72 61 6d 65 74 65 72 0a  xBusy parameter.
3e20: 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ** to this funct
3e30: 69 6f 6e 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ion is not NULL,
3e40: 20 74 68 65 6e 20 78 42 75 73 79 20 69 73 20 69   then xBusy is i
3e50: 6e 76 6f 6b 65 64 20 69 6e 20 74 68 65 20 73 61  nvoked in the sa
3e60: 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20 61 20 62  me way.** as a b
3e70: 75 73 79 2d 68 61 6e 64 6c 65 72 20 72 65 67 69  usy-handler regi
3e80: 73 74 65 72 65 64 20 77 69 74 68 20 53 51 4c 69  stered with SQLi
3e90: 74 65 20 28 75 73 69 6e 67 20 73 71 6c 69 74 65  te (using sqlite
3ea0: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 29  3_busy_handler()
3eb0: 29 0a 2a 2a 20 75 6e 74 69 6c 20 65 69 74 68 65  ).** until eithe
3ec0: 72 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 20 62  r the lock can b
3ed0: 65 20 6f 62 74 61 69 6e 65 64 20 6f 72 20 74 68  e obtained or th
3ee0: 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66  e busy-handler f
3ef0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a  unction returns.
3f00: 2a 2a 20 30 20 28 69 6e 64 69 63 61 74 69 6e 67  ** 0 (indicating
3f10: 20 22 67 69 76 65 20 75 70 22 29 2e 0a 2a 2f 0a   "give up")..*/.
3f20: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
3f30: 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b  e3demo_superlock
3f40: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
3f50: 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
3f60: 20 20 20 20 2f 2a 20 50 61 74 68 20 74 6f 20 64      /* Path to d
3f70: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
3f80: 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lock */.  const 
3f90: 63 68 61 72 20 2a 7a 56 66 73 2c 20 20 20 20 20  char *zVfs,     
3fa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53            /* VFS
3fb0: 20 74 6f 20 75 73 65 20 74 6f 20 61 63 63 65 73   to use to acces
3fc0: 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  s database file 
3fd0: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
3fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ff0: 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20    /* Additional 
4000: 66 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f  flags to pass to
4010: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
4020: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73   */.  int (*xBus
4030: 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 20 20  y)(void*,int),  
4040: 20 20 20 20 20 20 2f 2a 20 42 75 73 79 20 68 61        /* Busy ha
4050: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 2a  ndler callback *
4060: 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 41  /.  void *pBusyA
4070: 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
4080: 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61      /* Context a
4090: 72 67 20 66 6f 72 20 62 75 73 79 20 68 61 6e 64  rg for busy hand
40a0: 6c 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a  ler */.  void **
40b0: 70 70 4c 6f 63 6b 20 20 20 20 20 20 20 20 20 20  ppLock          
40c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
40d0: 20 43 6f 6e 74 65 78 74 20 74 6f 20 70 61 73 73   Context to pass
40e0: 20 74 6f 20 73 75 70 65 72 75 6e 6c 6f 63 6b 28   to superunlock(
40f0: 29 20 2a 2f 0a 29 7b 0a 20 20 53 75 70 65 72 6c  ) */.){.  Superl
4100: 6f 63 6b 42 75 73 79 20 62 75 73 79 20 3d 20 7b  ockBusy busy = {
4110: 30 2c 20 30 2c 20 30 7d 3b 20 2f 2a 20 42 75 73  0, 0, 0}; /* Bus
4120: 79 20 68 61 6e 64 6c 65 72 20 77 72 61 70 70 65  y handler wrappe
4130: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
4140: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
4150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4160: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
4170: 20 20 53 75 70 65 72 6c 6f 63 6b 20 2a 70 4c 6f    Superlock *pLo
4180: 63 6b 3b 0a 0a 20 20 70 4c 6f 63 6b 20 3d 20 73  ck;..  pLock = s
4190: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
41a0: 7a 65 6f 66 28 53 75 70 65 72 6c 6f 63 6b 29 29  zeof(Superlock))
41b0: 3b 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29  ;.  if( !pLock )
41c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
41d0: 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  OMEM;.  memset(p
41e0: 4c 6f 63 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Lock, 0, sizeof(
41f0: 53 75 70 65 72 6c 6f 63 6b 29 29 3b 0a 0a 20 20  Superlock));..  
4200: 2f 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61  /* Open a databa
4210: 73 65 20 68 61 6e 64 6c 65 20 6f 6e 20 74 68 65  se handle on the
4220: 20 66 69 6c 65 20 74 6f 20 73 75 70 65 72 6c 6f   file to superlo
4230: 63 6b 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ck. */.  rc = sq
4240: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20  lite3_open_v2(. 
4250: 20 20 20 20 20 7a 50 61 74 68 2c 20 26 70 4c 6f       zPath, &pLo
4260: 63 6b 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ck->db, SQLITE_O
4270: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
4280: 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
4290: 7c 66 6c 61 67 73 2c 20 7a 56 66 73 0a 20 20 29  |flags, zVfs.  )
42a0: 3b 0a 0a 20 20 2f 2a 20 49 6e 73 74 61 6c 6c 20  ;..  /* Install 
42b0: 61 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 61  a busy-handler a
42c0: 6e 64 20 65 78 65 63 75 74 65 20 61 20 42 45 47  nd execute a BEG
42d0: 49 4e 20 45 58 43 4c 55 53 49 56 45 2e 20 49 66  IN EXCLUSIVE. If
42e0: 20 74 68 69 73 20 69 73 20 6e 6f 74 0a 20 20 2a   this is not.  *
42f0: 2a 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  * a WAL database
4300: 2c 20 74 68 69 73 20 69 73 20 61 6c 6c 20 77 65  , this is all we
4310: 20 6e 65 65 64 20 74 6f 20 64 6f 2e 20 20 0a 20   need to do.  . 
4320: 20 2a 2a 0a 20 20 2a 2a 20 41 20 77 72 61 70 70   **.  ** A wrapp
4330: 65 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  er function is u
4340: 73 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  sed to invoke th
4350: 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69  e busy-handler i
4360: 6e 73 74 65 61 64 20 6f 66 0a 20 20 2a 2a 20 72  nstead of.  ** r
4370: 65 67 69 73 74 65 72 69 6e 67 20 74 68 65 20 62  egistering the b
4380: 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy-handler func
4390: 74 69 6f 6e 20 73 75 70 70 6c 69 65 64 20 62 79  tion supplied by
43a0: 20 74 68 65 20 75 73 65 72 20 64 69 72 65 63 74   the user direct
43b0: 6c 79 0a 20 20 2a 2a 20 77 69 74 68 20 53 51 4c  ly.  ** with SQL
43c0: 69 74 65 2e 20 54 68 69 73 20 69 73 20 62 65 63  ite. This is bec
43d0: 61 75 73 65 20 74 68 65 20 73 61 6d 65 20 62 75  ause the same bu
43e0: 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy-handler funct
43f0: 69 6f 6e 20 6d 61 79 20 62 65 0a 20 20 2a 2a 20  ion may be.  ** 
4400: 69 6e 76 6f 6b 65 64 20 64 69 72 65 63 74 6c 79  invoked directly
4410: 20 6c 61 74 65 72 20 6f 6e 20 77 68 65 6e 20 61   later on when a
4420: 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 6f 62 74  ttempting to obt
4430: 61 69 6e 20 74 68 65 20 65 78 74 72 61 20 6c 6f  ain the extra lo
4440: 63 6b 73 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  cks.  ** require
4450: 64 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 42  d in WAL mode. B
4460: 79 20 75 73 69 6e 67 20 74 68 65 20 77 72 61 70  y using the wrap
4470: 70 65 72 2c 20 77 65 20 61 72 65 20 61 62 6c 65  per, we are able
4480: 20 74 6f 20 67 75 61 72 61 6e 74 65 65 0a 20 20   to guarantee.  
4490: 2a 2a 20 74 68 61 74 20 74 68 65 20 22 6e 42 75  ** that the "nBu
44a0: 73 79 22 20 69 6e 74 65 67 65 72 20 70 61 72 61  sy" integer para
44b0: 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20  meter passed to 
44c0: 74 68 65 20 75 73 65 72 73 20 62 75 73 79 2d 68  the users busy-h
44d0: 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 72 65 70 72  andler.  ** repr
44e0: 65 73 65 6e 74 73 20 74 68 65 20 74 6f 74 61 6c  esents the total
44f0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 75 73 79 2d   number of busy-
4500: 68 61 6e 64 6c 65 72 20 69 6e 76 6f 63 61 74 69  handler invocati
4510: 6f 6e 73 20 6d 61 64 65 20 77 69 74 68 69 6e 0a  ons made within.
4520: 20 20 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 74    ** this call t
4530: 6f 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75  o sqlite3demo_su
4540: 70 65 72 6c 6f 63 6b 28 29 2c 20 69 6e 63 6c 75  perlock(), inclu
4550: 64 69 6e 67 20 61 6e 79 20 6d 61 64 65 20 64 75  ding any made du
4560: 72 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 22 42  ring the.  ** "B
4570: 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 22 2e  EGIN EXCLUSIVE".
4580: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
4590: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
45a0: 20 62 75 73 79 2e 78 42 75 73 79 20 3d 20 78 42   busy.xBusy = xB
45b0: 75 73 79 3b 0a 20 20 20 20 62 75 73 79 2e 70 42  usy;.    busy.pB
45c0: 75 73 79 41 72 67 20 3d 20 70 42 75 73 79 41 72  usyArg = pBusyAr
45d0: 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  g;.    sqlite3_b
45e0: 75 73 79 5f 68 61 6e 64 6c 65 72 28 70 4c 6f 63  usy_handler(pLoc
45f0: 6b 2d 3e 64 62 2c 20 73 75 70 65 72 6c 6f 63 6b  k->db, superlock
4600: 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 28 76 6f  BusyHandler, (vo
4610: 69 64 20 2a 29 26 62 75 73 79 29 3b 0a 20 20 20  id *)&busy);.   
4620: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
4630: 65 63 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20 22 42  ec(pLock->db, "B
4640: 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 22 2c  EGIN EXCLUSIVE",
4650: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a   0, 0, 0);.  }..
4660: 20 20 2f 2a 20 49 66 20 74 68 65 20 42 45 47 49    /* If the BEGI
4670: 4e 20 45 58 43 4c 55 53 49 56 45 20 77 61 73 20  N EXCLUSIVE was 
4680: 65 78 65 63 75 74 65 64 20 73 75 63 63 65 73 73  executed success
4690: 66 75 6c 6c 79 20 61 6e 64 20 74 68 69 73 20 69  fully and this i
46a0: 73 20 61 20 57 41 4c 0a 20 20 2a 2a 20 64 61 74  s a WAL.  ** dat
46b0: 61 62 61 73 65 2c 20 63 61 6c 6c 20 73 75 70 65  abase, call supe
46c0: 72 6c 6f 63 6b 57 61 6c 4c 6f 63 6b 28 29 20 74  rlockWalLock() t
46d0: 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 65 78 74  o obtain the ext
46e0: 72 61 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65  ra locks require
46f0: 64 0a 20 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e  d.  ** to preven
4700: 74 20 72 65 61 64 65 72 73 2c 20 77 72 69 74 65  t readers, write
4710: 72 73 20 61 6e 64 2f 6f 72 20 63 68 65 63 6b 70  rs and/or checkp
4720: 6f 69 6e 74 65 72 73 20 66 72 6f 6d 20 61 63 63  ointers from acc
4730: 65 73 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  essing the.  ** 
4740: 64 62 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  db while this pr
4750: 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
4760: 20 74 68 65 20 73 75 70 65 72 6c 6f 63 6b 2e 0a   the superlock..
4770: 20 20 2a 2a 0a 20 20 2a 2a 20 42 65 66 6f 72 65    **.  ** Before
4780: 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20   attempting any 
4790: 57 41 4c 20 6c 6f 63 6b 73 2c 20 63 6f 6d 6d 69  WAL locks, commi
47a0: 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
47b0: 6e 20 73 74 61 72 74 65 64 20 61 62 6f 76 65 0a  n started above.
47c0: 20 20 2a 2a 20 74 6f 20 64 72 6f 70 20 74 68 65    ** to drop the
47d0: 20 57 41 4c 20 72 65 61 64 20 61 6e 64 20 77 72   WAL read and wr
47e0: 69 74 65 20 6c 6f 63 6b 73 20 63 75 72 72 65 6e  ite locks curren
47f0: 74 6c 79 20 68 65 6c 64 2e 20 4f 74 68 65 72 77  tly held. Otherw
4800: 69 73 65 2c 20 74 68 65 0a 20 20 2a 2a 20 6e 65  ise, the.  ** ne
4810: 77 20 57 41 4c 20 6c 6f 63 6b 73 20 6d 61 79 20  w WAL locks may 
4820: 63 6f 6e 66 6c 69 63 74 20 77 69 74 68 20 74 68  conflict with th
4830: 65 20 6f 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  e old..  */.  if
4840: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4850: 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  ){.    if( SQLIT
4860: 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 75 70 65  E_OK==(rc = supe
4870: 72 6c 6f 63 6b 49 73 57 61 6c 28 70 4c 6f 63 6b  rlockIsWal(pLock
4880: 29 29 20 26 26 20 70 4c 6f 63 6b 2d 3e 62 57 61  )) && pLock->bWa
4890: 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
48a0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 4c 6f  sqlite3_exec(pLo
48b0: 63 6b 2d 3e 64 62 2c 20 22 43 4f 4d 4d 49 54 22  ck->db, "COMMIT"
48c0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
48d0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
48e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
48f0: 63 20 3d 20 73 75 70 65 72 6c 6f 63 6b 57 61 6c  c = superlockWal
4900: 4c 6f 63 6b 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20  Lock(pLock->db, 
4910: 26 62 75 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a  &busy);.      }.
4920: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
4930: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
4940: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 64 65 6d  {.    sqlite3dem
4950: 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 28 70 4c  o_superunlock(pL
4960: 6f 63 6b 29 3b 0a 20 20 20 20 2a 70 70 4c 6f 63  ock);.    *ppLoc
4970: 6b 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  k = 0;.  }else{.
4980: 20 20 20 20 2a 70 70 4c 6f 63 6b 20 3d 20 70 4c      *ppLock = pL
4990: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ock;.  }..  retu
49a0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 41 20 63  rn rc;.}../* A c
49b0: 6f 72 72 75 70 74 20 44 42 20 77 6f 6e 27 74 20  orrupt DB won't 
49c0: 77 6f 72 6b 20 77 69 74 68 20 74 68 65 20 73 71  work with the sq
49d0: 6c 2d 62 61 73 65 64 20 6c 6f 63 6b 69 6e 67 20  l-based locking 
49e0: 61 74 74 65 6d 70 74 2c 20 67 72 61 62 20 61 6e  attempt, grab an
49f0: 20 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c   .** exclusive l
4a00: 6f 63 6b 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ock and return S
4a10: 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49  QLITE_OK or SQLI
4a20: 54 45 5f 42 55 53 59 20 69 66 20 74 68 65 20 6c  TE_BUSY if the l
4a30: 6f 63 6b 20 66 61 69 6c 73 20 0a 2a 2a 20 72 65  ock fails .** re
4a40: 74 75 72 6e 73 20 74 68 65 20 63 75 72 72 65 6e  turns the curren
4a50: 74 20 6c 6f 63 6b 20 6c 65 76 65 6c 20 68 65 6c  t lock level hel
4a60: 64 20 6f 6e 20 73 71 6c 69 74 65 33 5f 66 69 6c  d on sqlite3_fil
4a70: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
4a80: 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65  sqlite3demo_supe
4a90: 72 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 0a 20  rlock_corrupt(. 
4aa0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
4ab0: 64 2c 0a 20 20 69 6e 74 20 65 54 61 72 67 65 74  d,.  int eTarget
4ac0: 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 69 6e 74 20  FileLock,.  int 
4ad0: 2a 70 46 69 6c 65 4c 6f 63 6b 0a 29 7b 0a 20 20  *pFileLock.){.  
4ae0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
4af0: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
4b00: 0a 20 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  .  int eFileLock
4b10: 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c   = pFile->eFileL
4b20: 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ock;.  int rc = 
4b30: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20  SQLITE_OK;.  .  
4b40: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 65 54  if( eFileLock<eT
4b50: 61 72 67 65 74 46 69 6c 65 4c 6f 63 6b 20 29 7b  argetFileLock ){
4b60: 0a 20 20 20 20 72 63 20 3d 20 70 46 69 6c 65 2d  .    rc = pFile-
4b70: 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28  >pMethod->xLock(
4b80: 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  id, SQLITE_LOCK_
4b90: 53 48 41 52 45 44 29 3b 0a 20 20 7d 0a 20 20 69  SHARED);.  }.  i
4ba0: 66 28 20 21 72 63 20 26 26 20 53 51 4c 49 54 45  f( !rc && SQLITE
4bb0: 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 3c 65 54 61  _LOCK_SHARED<eTa
4bc0: 72 67 65 74 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  rgetFileLock ){.
4bd0: 20 20 20 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e      rc = pFile->
4be0: 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 69  pMethod->xLock(i
4bf0: 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45  d, SQLITE_LOCK_E
4c00: 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 7d 0a 20  XCLUSIVE);.  }. 
4c10: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69   if( rc ){.    i
4c20: 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
4c30: 6f 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63 6b 20  ock > eFileLock 
4c40: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
4c50: 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b  pMethod->xUnlock
4c60: 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 29 3b  (id, eFileLock);
4c70: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
4c80: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 20 28  n rc;.  }.  if (
4c90: 70 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 20  pFileLock) {.   
4ca0: 20 2a 70 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46   *pFileLock = eF
4cb0: 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72  ileLock;.  }.  r
4cc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
4cd0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .}..static int s
4ce0: 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72  qlite3demo_super
4cf0: 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 73  unlock_corrupt(s
4d00: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
4d10: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
4d20: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
4d30: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
4d40: 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  )id;.  int rc = 
4d50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20  SQLITE_OK;.  .  
4d60: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
4d70: 4c 6f 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63 6b  Lock > eFileLock
4d80: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 46 69   ){.    rc = pFi
4d90: 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e  le->pMethod->xUn
4da0: 6c 6f 63 6b 28 69 64 2c 20 53 51 4c 49 54 45 5f  lock(id, SQLITE_
4db0: 4c 4f 43 4b 5f 53 48 41 52 45 44 29 3b 0a 20 20  LOCK_SHARED);.  
4dc0: 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  }.  if( pFile->e
4dd0: 46 69 6c 65 4c 6f 63 6b 20 3e 20 65 46 69 6c 65  FileLock > eFile
4de0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20  Lock ){.    int 
4df0: 75 6e 6c 6f 63 6b 52 43 20 3d 20 70 46 69 6c 65  unlockRC = pFile
4e00: 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
4e10: 63 6b 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f  ck(id, SQLITE_LO
4e20: 43 4b 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 69 66  CK_NONE);.    if
4e30: 20 28 21 72 63 29 20 72 63 20 3d 20 75 6e 6c 6f   (!rc) rc = unlo
4e40: 63 6b 52 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ckRC;.  }.  retu
4e50: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66  rn rc;.}..#endif
4e60: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
4e70: 45 5f 53 55 50 45 52 4c 4f 43 4b 20 2a 2f 0a 0a  E_SUPERLOCK */..
4e80: 0a 2f 2a 0a 2a 2a 20 48 41 56 45 5f 4d 52 45 4d  ./*.** HAVE_MREM
4e90: 41 50 20 64 65 66 61 75 6c 74 73 20 74 6f 20 74  AP defaults to t
4ea0: 72 75 65 20 6f 6e 20 4c 69 6e 75 78 20 61 6e 64  rue on Linux and
4eb0: 20 66 61 6c 73 65 20 65 76 65 72 79 77 68 65 72   false everywher
4ec0: 65 20 65 6c 73 65 2e 0a 2a 2f 0a 23 69 66 20 21  e else..*/.#if !
4ed0: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 4d 52 45  defined(HAVE_MRE
4ee0: 4d 41 50 29 0a 23 20 69 66 20 64 65 66 69 6e 65  MAP).# if define
4ef0: 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20  d(__linux__) && 
4f00: 64 65 66 69 6e 65 64 28 5f 47 4e 55 5f 53 4f 55  defined(_GNU_SOU
4f10: 52 43 45 29 0a 23 20 20 64 65 66 69 6e 65 20 48  RCE).#  define H
4f20: 41 56 45 5f 4d 52 45 4d 41 50 20 31 0a 23 20 65  AVE_MREMAP 1.# e
4f30: 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 48 41  lse.#  define HA
4f40: 56 45 5f 4d 52 45 4d 41 50 20 30 0a 23 20 65 6e  VE_MREMAP 0.# en
4f50: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  dif.#endif../*.*
4f60: 2a 20 45 78 70 6c 69 63 69 74 6c 79 20 63 61 6c  * Explicitly cal
4f70: 6c 20 74 68 65 20 36 34 2d 62 69 74 20 76 65 72  l the 64-bit ver
4f80: 73 69 6f 6e 20 6f 66 20 6c 73 65 65 6b 28 29 20  sion of lseek() 
4f90: 6f 6e 20 41 6e 64 72 6f 69 64 2e 20 4f 74 68 65  on Android. Othe
4fa0: 72 77 69 73 65 2c 20 6c 73 65 65 6b 28 29 0a 2a  rwise, lseek().*
4fb0: 2a 20 69 73 20 74 68 65 20 33 32 2d 62 69 74 20  * is the 32-bit 
4fc0: 76 65 72 73 69 6f 6e 2c 20 65 76 65 6e 20 69 66  version, even if
4fd0: 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49   _FILE_OFFSET_BI
4fe0: 54 53 3d 36 34 20 69 73 20 64 65 66 69 6e 65 64  TS=64 is defined
4ff0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 41 4e  ..*/.#ifdef __AN
5000: 44 52 4f 49 44 5f 5f 0a 23 20 64 65 66 69 6e 65  DROID__.# define
5010: 20 6c 73 65 65 6b 20 6c 73 65 65 6b 36 34 0a 23   lseek lseek64.#
5020: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 66  endif../*.** Dif
5030: 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79 73 74  ferent Unix syst
5040: 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70 65 6e  ems declare open
5050: 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20  () in different 
5060: 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73 65 0a  ways.  Same use.
5070: 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  ** open(const ch
5080: 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e  ar*,int,mode_t).
5090: 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f 70 65    Others use ope
50a0: 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  n(const char*,in
50b0: 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20 64  t,...)..** The d
50c0: 69 66 66 65 72 65 6e 63 65 20 69 73 20 69 6d 70  ifference is imp
50d0: 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73 69 6e  ortant when usin
50e0: 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  g a pointer to t
50f0: 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  he function..**.
5100: 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20 77 61  ** The safest wa
5110: 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74  y to deal with t
5120: 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 6f  he problem is to
5130: 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 69 73   always use this
5140: 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68 69 63   wrapper.** whic
5150: 68 20 61 6c 77 61 79 73 20 68 61 73 20 74 68 65  h always has the
5160: 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69 6e   same well-defin
5170: 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  ed interface..*/
5180: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69  .static int posi
5190: 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  xOpen(const char
51a0: 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61   *zFile, int fla
51b0: 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a 20  gs, int mode){. 
51c0: 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46 69   return open(zFi
51d0: 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65 29  le, flags, mode)
51e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f  ;.}../*.** On so
51f0: 6d 65 20 73 79 73 74 65 6d 73 2c 20 63 61 6c 6c  me systems, call
5200: 73 20 74 6f 20 66 63 68 6f 77 6e 28 29 20 77 69  s to fchown() wi
5210: 6c 6c 20 74 72 69 67 67 65 72 20 61 20 6d 65 73  ll trigger a mes
5220: 73 61 67 65 20 69 6e 20 61 20 73 65 63 75 72 69  sage in a securi
5230: 74 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74 68 65  ty.** log if the
5240: 79 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f 6e 2d  y come from non-
5250: 72 6f 6f 74 20 70 72 6f 63 65 73 73 65 73 2e 20  root processes. 
5260: 20 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c 69 6e   So avoid callin
5270: 67 20 66 63 68 6f 77 6e 28 29 20 69 66 0a 2a 2a  g fchown() if.**
5280: 20 77 65 20 61 72 65 20 6e 6f 74 20 72 75 6e 6e   we are not runn
5290: 69 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a 2f 0a  ing as root..*/.
52a0: 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78  static int posix
52b0: 46 63 68 6f 77 6e 28 69 6e 74 20 66 64 2c 20 75  Fchown(int fd, u
52c0: 69 64 5f 74 20 75 69 64 2c 20 67 69 64 5f 74 20  id_t uid, gid_t 
52d0: 67 69 64 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  gid){.#if OS_VXW
52e0: 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 30 3b  ORKS.  return 0;
52f0: 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
5300: 67 65 74 65 75 69 64 28 29 20 3f 20 30 20 3a 20  geteuid() ? 0 : 
5310: 66 63 68 6f 77 6e 28 66 64 2c 75 69 64 2c 67 69  fchown(fd,uid,gi
5320: 64 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  d);.#endif.}../*
5330: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
5340: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ce */.static int
5350: 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63   openDirectory(c
5360: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 2a  onst char*, int*
5370: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  );.static int un
5380: 69 78 47 65 74 70 61 67 65 73 69 7a 65 28 76 6f  ixGetpagesize(vo
5390: 69 64 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79  id);../*.** Many
53a0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72   system calls ar
53b0: 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f 75  e accessed throu
53c0: 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75  gh pointer-to-fu
53d0: 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a  nctions so that.
53e0: 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f  ** they may be o
53f0: 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e  verridden at run
5400: 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61  time to facilita
5410: 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69  te fault injecti
5420: 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73  on during.** tes
5430: 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78  ting and sandbox
5440: 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ing.  The follow
5450: 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20  ing array holds 
5460: 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f  the names and po
5470: 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c  inters.** to all
5480: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
5490: 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73  stem calls..*/.s
54a0: 74 61 74 69 63 20 73 74 72 75 63 74 20 75 6e 69  tatic struct uni
54b0: 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f  x_syscall {.  co
54c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
54d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
54e0: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  ame of the syste
54f0: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
5500: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
5510: 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72  pCurrent; /* Cur
5520: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68  rent value of th
5530: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
5540: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
5550: 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b  ll_ptr pDefault;
5560: 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75   /* Default valu
5570: 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b  e */.} aSyscall[
5580: 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70 65 6e 22  ] = {.  { "open"
5590: 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ,         (sqlit
55a0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
55b0: 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20 20 7d 2c  osixOpen,  0  },
55c0: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 20  .#define osOpen 
55d0: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
55e0: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 69 6e  nst char*,int,in
55f0: 74 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70  t))aSyscall[0].p
5600: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 63  Current)..  { "c
5610: 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 28 73  lose",        (s
5620: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
5630: 74 72 29 63 6c 6f 73 65 2c 20 20 20 20 20 20 30  tr)close,      0
5640: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 43    },.#define osC
5650: 6c 6f 73 65 20 20 20 20 20 28 28 69 6e 74 28 2a  lose     ((int(*
5660: 29 28 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b  )(int))aSyscall[
5670: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  1].pCurrent)..  
5680: 7b 20 22 61 63 63 65 73 73 22 2c 20 20 20 20 20  { "access",     
5690: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
56a0: 6c 6c 5f 70 74 72 29 61 63 63 65 73 73 2c 20 20  ll_ptr)access,  
56b0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
56c0: 20 6f 73 41 63 63 65 73 73 20 20 20 20 28 28 69   osAccess    ((i
56d0: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
56e0: 2a 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b  *,int))aSyscall[
56f0: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
5700: 7b 20 22 67 65 74 63 77 64 22 2c 20 20 20 20 20  { "getcwd",     
5710: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
5720: 6c 6c 5f 70 74 72 29 67 65 74 63 77 64 2c 20 20  ll_ptr)getcwd,  
5730: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
5740: 20 6f 73 47 65 74 63 77 64 20 20 20 20 28 28 63   osGetcwd    ((c
5750: 68 61 72 2a 28 2a 29 28 63 68 61 72 2a 2c 73 69  har*(*)(char*,si
5760: 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 33  ze_t))aSyscall[3
5770: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5780: 20 22 73 74 61 74 22 2c 20 20 20 20 20 20 20 20   "stat",        
5790: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
57a0: 6c 5f 70 74 72 29 73 74 61 74 2c 20 20 20 20 20  l_ptr)stat,     
57b0: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
57c0: 6f 73 53 74 61 74 20 20 20 20 20 20 28 28 69 6e  osStat      ((in
57d0: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
57e0: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
57f0: 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72  Syscall[4].pCurr
5800: 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ent)../*.** The 
5810: 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65  DJGPP compiler e
5820: 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73  nvironment looks
5830: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69   mostly like Uni
5840: 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63  x, but it.** lac
5850: 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73  ks the fcntl() s
5860: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20  ystem call.  So 
5870: 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29  redefine fcntl()
5880: 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
5890: 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20  .** that always 
58a0: 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73 20  succeeds.  This 
58b0: 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69  means that locki
58c0: 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  ng does not occu
58d0: 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50  r under.** DJGPP
58e0: 2e 20 20 42 75 74 20 69 74 20 69 73 20 44 4f 53  .  But it is DOS
58f0: 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 20   - what did you 
5900: 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65  expect?.*/.#ifde
5910: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 7b 20  f __DJGPP__.  { 
5920: 22 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20  "fstat",        
5930: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5940: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
5950: 20 6f 73 46 73 74 61 74 28 61 2c 62 2c 63 29 20   osFstat(a,b,c) 
5960: 20 20 20 30 0a 23 65 6c 73 65 20 20 20 20 20 0a     0.#else     .
5970: 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20    { "fstat",    
5980: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
5990: 63 61 6c 6c 5f 70 74 72 29 66 73 74 61 74 2c 20  call_ptr)fstat, 
59a0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
59b0: 6e 65 20 6f 73 46 73 74 61 74 20 20 20 20 20 28  ne osFstat     (
59c0: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73 74 72 75  (int(*)(int,stru
59d0: 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61  ct stat*))aSysca
59e0: 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[5].pCurrent).
59f0: 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 66 74 72  #endif..  { "ftr
5a00: 75 6e 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c  uncate",    (sql
5a10: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
5a20: 29 66 74 72 75 6e 63 61 74 65 2c 20 20 30 20 20  )ftruncate,  0  
5a30: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 74 72  },.#define osFtr
5a40: 75 6e 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28  uncate ((int(*)(
5a50: 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63  int,off_t))aSysc
5a60: 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29  all[6].pCurrent)
5a70: 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22 2c 20 20  ..  { "fcntl",  
5a80: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
5a90: 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 6e 74 6c  yscall_ptr)fcntl
5aa0: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
5ab0: 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 20 20 20  fine osFcntl    
5ac0: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69 6e   ((int(*)(int,in
5ad0: 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b  t,...))aSyscall[
5ae0: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  7].pCurrent)..  
5af0: 7b 20 22 72 65 61 64 22 2c 20 20 20 20 20 20 20  { "read",       
5b00: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
5b10: 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20 20 20 20  ll_ptr)read,    
5b20: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
5b30: 20 6f 73 52 65 61 64 20 20 20 20 20 20 28 28 73   osRead      ((s
5b40: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f  size_t(*)(int,vo
5b50: 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73  id*,size_t))aSys
5b60: 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74  call[8].pCurrent
5b70: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  )..#if defined(U
5b80: 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53 51 4c  SE_PREAD) || SQL
5b90: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
5ba0: 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70 72  NG_STYLE.  { "pr
5bb0: 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73 71  ead",        (sq
5bc0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5bd0: 72 29 70 72 65 61 64 2c 20 20 20 20 20 20 30 20  r)pread,      0 
5be0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70   },.#else.  { "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 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
5c20: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
5c30: 69 6e 65 20 6f 73 50 72 65 61 64 20 20 20 20 20  ine osPread     
5c40: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
5c50: 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66  ,void*,size_t,of
5c60: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d  f_t))aSyscall[9]
5c70: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
5c80: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
5c90: 44 36 34 29 0a 20 20 7b 20 22 70 72 65 61 64 36  D64).  { "pread6
5ca0: 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65  4",      (sqlite
5cb0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72  3_syscall_ptr)pr
5cc0: 65 61 64 36 34 2c 20 20 20 20 30 20 20 7d 2c 0a  ead64,    0  },.
5cd0: 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64  #else.  { "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 30  e3_syscall_ptr)0
5d00: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
5d10: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
5d20: 6f 73 50 72 65 61 64 36 34 20 20 20 28 28 73 73  osPread64   ((ss
5d30: 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69  ize_t(*)(int,voi
5d40: 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29  d*,size_t,off_t)
5d50: 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43  )aSyscall[10].pC
5d60: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 77 72  urrent)..  { "wr
5d70: 69 74 65 22 2c 20 20 20 20 20 20 20 20 28 73 71  ite",        (sq
5d80: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5d90: 72 29 77 72 69 74 65 2c 20 20 20 20 20 20 30 20  r)write,      0 
5da0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 57 72   },.#define osWr
5db0: 69 74 65 20 20 20 20 20 28 28 73 73 69 7a 65 5f  ite     ((ssize_
5dc0: 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76  t(*)(int,const v
5dd0: 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  oid*,size_t))aSy
5de0: 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65  scall[11].pCurre
5df0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
5e00: 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53  (USE_PREAD) || S
5e10: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
5e20: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22  KING_STYLE.  { "
5e30: 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 28  pwrite",       (
5e40: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5e50: 70 74 72 29 70 77 72 69 74 65 2c 20 20 20 20 20  ptr)pwrite,     
5e60: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
5e70: 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20  "pwrite",       
5e80: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
5e90: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
5ea0: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
5eb0: 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65 20 20  efine osPwrite  
5ec0: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
5ed0: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73  nt,const void*,s
5ee0: 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20  ize_t,off_t))\. 
5ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f00: 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e     aSyscall[12].
5f10: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
5f20: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
5f30: 36 34 29 0a 20 20 7b 20 22 70 77 72 69 74 65 36  64).  { "pwrite6
5f40: 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33  4",     (sqlite3
5f50: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72  _syscall_ptr)pwr
5f60: 69 74 65 36 34 2c 20 20 20 30 20 20 7d 2c 0a 23  ite64,   0  },.#
5f70: 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65  else.  { "pwrite
5f80: 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65  64",     (sqlite
5f90: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
5fa0: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
5fb0: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
5fc0: 73 50 77 72 69 74 65 36 34 20 20 28 28 73 73 69  sPwrite64  ((ssi
5fd0: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73  ze_t(*)(int,cons
5fe0: 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t void*,size_t,o
5ff0: 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20  ff_t))\.        
6000: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 79 73              aSys
6010: 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e  call[13].pCurren
6020: 74 29 0a 0a 20 20 7b 20 22 66 63 68 6d 6f 64 22  t)..  { "fchmod"
6030: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
6040: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 68  _syscall_ptr)fch
6050: 6d 6f 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23  mod,     0  },.#
6060: 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20  define osFchmod 
6070: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c     ((int(*)(int,
6080: 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  mode_t))aSyscall
6090: 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [14].pCurrent)..
60a0: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
60b0: 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
60c0: 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f  ) && HAVE_POSIX_
60d0: 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66  FALLOCATE.  { "f
60e0: 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73  allocate",    (s
60f0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
6100: 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  tr)posix_falloca
6110: 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  te,  0 },.#else.
6120: 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c    { "fallocate",
6130: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
6140: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
6150: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6160: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
6170: 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74  sFallocate ((int
6180: 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66  (*)(int,off_t,of
6190: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 35  f_t))aSyscall[15
61a0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
61b0: 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20   "unlink",      
61c0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
61d0: 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20  l_ptr)unlink,   
61e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65          0 },.#de
61f0: 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20  fine osUnlink   
6200: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
6210: 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b  char*))aSyscall[
6220: 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  16].pCurrent).. 
6230: 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74 6f 72   { "openDirector
6240: 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f  y",    (sqlite3_
6250: 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e  syscall_ptr)open
6260: 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20 20 20  Directory,      
6270: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f  0 },.#define osO
6280: 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28 28 69  penDirectory ((i
6290: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
62a0: 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c  *,int*))aSyscall
62b0: 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [17].pCurrent)..
62c0: 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20 20 20    { "mkdir",    
62d0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
62e0: 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72 2c 20  call_ptr)mkdir, 
62f0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6300: 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72 20 20  define osMkdir  
6310: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
6320: 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74 29 29  t char*,mode_t))
6330: 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75  aSyscall[18].pCu
6340: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 6d 64  rrent)..  { "rmd
6350: 69 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  ir",        (sql
6360: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
6370: 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20 20 20  )rmdir,         
6380: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
6390: 73 52 6d 64 69 72 20 20 20 20 20 28 28 69 6e 74  sRmdir     ((int
63a0: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  (*)(const char*)
63b0: 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43  )aSyscall[19].pC
63c0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63  urrent)..  { "fc
63d0: 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28 73 71  hown",       (sq
63e0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
63f0: 72 29 70 6f 73 69 78 46 63 68 6f 77 6e 2c 20 20  r)posixFchown,  
6400: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
6410: 6f 73 46 63 68 6f 77 6e 20 20 20 20 28 28 69 6e  osFchown    ((in
6420: 74 28 2a 29 28 69 6e 74 2c 75 69 64 5f 74 2c 67  t(*)(int,uid_t,g
6430: 69 64 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32  id_t))aSyscall[2
6440: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
6450: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
6460: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
6470: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
6480: 49 5a 45 3e 30 0a 20 20 7b 20 22 6d 6d 61 70 22  IZE>0.  { "mmap"
6490: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
64a0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d 6d 61  _syscall_ptr)mma
64b0: 70 2c 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66  p,     0 },.#def
64c0: 69 6e 65 20 6f 73 4d 6d 61 70 20 28 28 76 6f 69  ine osMmap ((voi
64d0: 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65  d*(*)(void*,size
64e0: 5f 74 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74 2c 6f  _t,int,int,int,o
64f0: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32  ff_t))aSyscall[2
6500: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  1].pCurrent)..  
6510: 7b 20 22 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20  { "munmap",     
6520: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
6530: 6c 6c 5f 70 74 72 29 6d 75 6e 6d 61 70 2c 20 20  ll_ptr)munmap,  
6540: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65          0 },.#de
6550: 66 69 6e 65 20 6f 73 4d 75 6e 6d 61 70 20 28 28  fine osMunmap ((
6560: 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73  void*(*)(void*,s
6570: 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ize_t))aSyscall[
6580: 32 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  22].pCurrent)..#
6590: 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20  if HAVE_MREMAP. 
65a0: 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20 20 20   { "mremap",    
65b0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
65c0: 61 6c 6c 5f 70 74 72 29 6d 72 65 6d 61 70 2c 20  all_ptr)mremap, 
65d0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
65e0: 6c 73 65 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22  lse.  { "mremap"
65f0: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
6600: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20  _syscall_ptr)0, 
6610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6620: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
6630: 65 20 6f 73 4d 72 65 6d 61 70 20 28 28 76 6f 69  e osMremap ((voi
6640: 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65  d*(*)(void*,size
6650: 5f 74 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 2e 2e  _t,size_t,int,..
6660: 2e 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e  .))aSyscall[23].
6670: 70 43 75 72 72 65 6e 74 29 0a 20 20 7b 20 22 67  pCurrent).  { "g
6680: 65 74 70 61 67 65 73 69 7a 65 22 2c 20 20 28 73  etpagesize",  (s
6690: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
66a0: 74 72 29 75 6e 69 78 47 65 74 70 61 67 65 73 69  tr)unixGetpagesi
66b0: 7a 65 2c 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65  ze, 0 },.#define
66c0: 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65 20 28   osGetpagesize (
66d0: 28 69 6e 74 28 2a 29 28 76 6f 69 64 29 29 61 53  (int(*)(void))aS
66e0: 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72  yscall[24].pCurr
66f0: 65 6e 74 29 0a 0a 23 65 6e 64 69 66 0a 0a 7d 3b  ent)..#endif..};
6700: 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f   /* End of the o
6710: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
6720: 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a  em calls */../*.
6730: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
6740: 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20  SetSystemCall() 
6750: 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65  method of sqlite
6760: 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66  3_vfs for all of
6770: 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56   the.** "unix" V
6780: 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  FSes.  Return SQ
6790: 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63  LITE_OK opon suc
67a0: 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74 69  cessfully updati
67b0: 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d  ng the.** system
67c0: 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f   call pointer, o
67d0: 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  r SQLITE_NOTFOUN
67e0: 44 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  D if there is no
67f0: 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a   configurable.**
6800: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d   system call nam
6810: 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ed zName..*/.sta
6820: 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 74 53  tic int unixSetS
6830: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
6840: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
6850: 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ed,        /* Th
6860: 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20  e VFS pointer.  
6870: 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f  Not used */.  co
6880: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
6890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
68a0: 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61  ame of system ca
68b0: 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a  ll to override *
68c0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63  /.  sqlite3_sysc
68d0: 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63  all_ptr pNewFunc
68e0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
68f0: 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  new system call 
6900: 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e  value */.){.  un
6910: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20  signed int i;.  
6920: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
6930: 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55  NOTFOUND;..  UNU
6940: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
6950: 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a  otUsed);.  if( z
6960: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Name==0 ){.    /
6970: 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73  * If no zName is
6980: 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20   given, restore 
6990: 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  all system calls
69a0: 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c   to their defaul
69b0: 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67  t.    ** setting
69c0: 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  s and return NUL
69d0: 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  L.    */.    rc 
69e0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
69f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
6a00: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
6a10: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
6a20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
6a30: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  ( aSyscall[i].pD
6a40: 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
6a50: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43    aSyscall[i].pC
6a60: 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c  urrent = aSyscal
6a70: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20  l[i].pDefault;. 
6a80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6a90: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
6aa0: 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69  zName is specifi
6ab0: 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f  ed, operate on o
6ac0: 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74  nly the one syst
6ad0: 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  em call.    ** s
6ae0: 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f  pecified..    */
6af0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6b00: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
6b10: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
6b20: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
6b30: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61    if( strcmp(zNa
6b40: 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  me, aSyscall[i].
6b50: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
6b60: 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c       if( aSyscal
6b70: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30  l[i].pDefault==0
6b80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53   ){.          aS
6b90: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
6ba0: 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  lt = aSyscall[i]
6bb0: 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20  .pCurrent;.     
6bc0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
6bd0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
6be0: 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e       if( pNewFun
6bf0: 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20  c==0 ) pNewFunc 
6c00: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  = aSyscall[i].pD
6c10: 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20  efault;.        
6c20: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
6c30: 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b  rent = pNewFunc;
6c40: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
6c50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6c60: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6c70: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
6c80: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79  he value of a sy
6c90: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75  stem call.  Retu
6ca0: 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65  rn NULL if zName
6cb0: 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63   is not a.** rec
6cc0: 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63  ognized system c
6cd0: 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20  all name.  NULL 
6ce0: 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
6cf0: 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   if the system c
6d00: 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e  all.** is curren
6d10: 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  tly undefined..*
6d20: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
6d30: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e 69  _syscall_ptr uni
6d40: 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a  xGetSystemCall(.
6d50: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
6d60: 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74  NotUsed,.  const
6d70: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a   char *zName.){.
6d80: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
6d90: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
6da0: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
6db0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
6dc0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
6dd0: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
6de0: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
6df0: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
6e00: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
6e10: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61  e)==0 ) return a
6e20: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
6e30: 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ent;.  }.  retur
6e40: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
6e50: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
6e60: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
6e70: 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61  m call after zNa
6e80: 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e  me.  If zName==N
6e90: 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  ULL.** then retu
6ea0: 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
6eb0: 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20  he first system 
6ec0: 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55  call.  Return NU
6ed0: 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69  LL if zName.** i
6ee0: 73 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65  s the last syste
6ef0: 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61  m call or if zNa
6f00: 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61  me is not the na
6f10: 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a  me of a valid.**
6f20: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f   system call..*/
6f30: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
6f40: 61 72 20 2a 75 6e 69 78 4e 65 78 74 53 79 73 74  ar *unixNextSyst
6f50: 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76  emCall(sqlite3_v
6f60: 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  fs *p, const cha
6f70: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
6f80: 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53   i = -1;..  UNUS
6f90: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
6fa0: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a  .  if( zName ){.
6fb0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
6fc0: 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c  rraySize(aSyscal
6fd0: 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  l)-1; i++){.    
6fe0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61    if( strcmp(zNa
6ff0: 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  me, aSyscall[i].
7000: 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  zName)==0 ) brea
7010: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  k;.    }.  }.  f
7020: 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53  or(i++; i<ArrayS
7030: 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69  ize(aSyscall); i
7040: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79  ++){.    if( aSy
7050: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
7060: 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53  t!=0 ) return aS
7070: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b  yscall[i].zName;
7080: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
7090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74  .}../*.** Do not
70a0: 20 61 63 63 65 70 74 20 61 6e 79 20 66 69 6c 65   accept any file
70b0: 20 64 65 73 63 72 69 70 74 6f 72 20 6c 65 73 73   descriptor less
70c0: 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
70d0: 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76  , in order to av
70e0: 6f 69 64 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 64  oid.** opening d
70f0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 69  atabase file usi
7100: 6e 67 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ng file descript
7110: 6f 72 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d  ors that are com
7120: 6d 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 0a  monly used for .
7130: 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75  ** standard inpu
7140: 74 2c 20 6f 75 74 70 75 74 2c 20 61 6e 64 20 65  t, output, and e
7150: 72 72 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  rror..*/.#ifndef
7160: 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f   SQLITE_MINIMUM_
7170: 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52 0a  FILE_DESCRIPTOR.
7180: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
7190: 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53  MINIMUM_FILE_DES
71a0: 43 52 49 50 54 4f 52 20 33 0a 23 65 6e 64 69 66  CRIPTOR 3.#endif
71b0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f  ../*.** Invoke o
71c0: 70 65 6e 28 29 2e 20 20 44 6f 20 73 6f 20 6d 75  pen().  Do so mu
71d0: 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c 20 75 6e  ltiple times, un
71e0: 74 69 6c 20 69 74 20 65 69 74 68 65 72 20 73 75  til it either su
71f0: 63 63 65 65 64 73 20 6f 72 0a 2a 2a 20 66 61 69  cceeds or.** fai
7200: 6c 73 20 66 6f 72 20 73 6f 6d 65 20 72 65 61 73  ls for some reas
7210: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 45 49  on other than EI
7220: 4e 54 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  NTR..**.** If th
7230: 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20  e file creation 
7240: 6d 6f 64 65 20 22 6d 22 20 69 73 20 30 20 74 68  mode "m" is 0 th
7250: 65 6e 20 73 65 74 20 69 74 20 74 6f 20 74 68 65  en set it to the
7260: 20 64 65 66 61 75 6c 74 20 66 6f 72 0a 2a 2a 20   default for.** 
7270: 53 51 4c 69 74 65 2e 20 20 54 68 65 20 64 65 66  SQLite.  The def
7280: 61 75 6c 74 20 69 73 20 53 51 4c 49 54 45 5f 44  ault is SQLITE_D
7290: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
72a0: 49 53 53 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c  ISSIONS (normall
72b0: 79 0a 2a 2a 20 30 36 34 34 29 20 61 73 20 6d 6f  y.** 0644) as mo
72c0: 64 69 66 69 65 64 20 62 79 20 74 68 65 20 73 79  dified by the sy
72d0: 73 74 65 6d 20 75 6d 61 73 6b 2e 20 20 49 66 20  stem umask.  If 
72e0: 6d 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e  m is not 0, then
72f0: 0a 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c  .** make the fil
7300: 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20  e creation mode 
7310: 62 65 20 65 78 61 63 74 6c 79 20 6d 20 69 67 6e  be exactly m ign
7320: 6f 72 69 6e 67 20 74 68 65 20 75 6d 61 73 6b 2e  oring the umask.
7330: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 20 70 61 72  .**.** The m par
7340: 61 6d 65 74 65 72 20 77 69 6c 6c 20 62 65 20 6e  ameter will be n
7350: 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77 68 65  on-zero only whe
7360: 6e 20 63 72 65 61 74 69 6e 67 20 2d 77 61 6c 2c  n creating -wal,
7370: 20 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e   -journal,.** an
7380: 64 20 2d 73 68 6d 20 66 69 6c 65 73 2e 20 20 57  d -shm files.  W
7390: 65 20 77 61 6e 74 20 74 68 6f 73 65 20 66 69 6c  e want those fil
73a0: 65 73 20 74 6f 20 68 61 76 65 20 2a 65 78 61 63  es to have *exac
73b0: 74 6c 79 2a 20 74 68 65 20 73 61 6d 65 0a 2a 2a  tly* the same.**
73c0: 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 61 73 20   permissions as 
73d0: 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64  their original d
73e0: 61 74 61 62 61 73 65 2c 20 75 6e 61 64 75 6c 74  atabase, unadult
73f0: 65 72 61 74 65 64 20 62 79 20 74 68 65 20 75 6d  erated by the um
7400: 61 73 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20  ask..** In that 
7410: 77 61 79 2c 20 69 66 20 61 20 64 61 74 61 62 61  way, if a databa
7420: 73 65 20 66 69 6c 65 20 69 73 20 2d 72 77 2d 72  se file is -rw-r
7430: 77 2d 72 77 20 6f 72 20 2d 72 77 2d 72 77 2d 72  w-rw or -rw-rw-r
7440: 2d 2c 20 61 6e 64 20 61 0a 2a 2a 20 74 72 61 6e  -, and a.** tran
7450: 73 61 63 74 69 6f 6e 20 63 72 61 73 68 65 73 20  saction crashes 
7460: 61 6e 64 20 6c 65 61 76 65 73 20 62 65 68 69 6e  and leaves behin
7470: 64 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c 20  d hot journals, 
7480: 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f 63  then any.** proc
7490: 65 73 73 20 74 68 61 74 20 69 73 20 61 62 6c 65  ess that is able
74a0: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
74b0: 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 61   database will a
74c0: 6c 73 6f 20 62 65 20 61 62 6c 65 20 74 6f 0a 2a  lso be able to.*
74d0: 2a 20 72 65 63 6f 76 65 72 20 74 68 65 20 68 6f  * recover the ho
74e0: 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73  t journals..*/.s
74f0: 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74  tatic int robust
7500: 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  _open(const char
7510: 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f 64 65   *z, int f, mode
7520: 5f 74 20 6d 29 7b 0a 20 20 69 6e 74 20 66 64 3b  _t m){.  int fd;
7530: 0a 20 20 6d 6f 64 65 5f 74 20 6d 32 20 3d 20 6d  .  mode_t m2 = m
7540: 20 3f 20 6d 20 3a 20 53 51 4c 49 54 45 5f 44 45   ? m : SQLITE_DE
7550: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
7560: 53 53 49 4f 4e 53 3b 0a 20 20 77 68 69 6c 65 28  SSIONS;.  while(
7570: 31 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  1){.#if defined(
7580: 4f 5f 43 4c 4f 45 58 45 43 29 0a 20 20 20 20 66  O_CLOEXEC).    f
7590: 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f  d = osOpen(z,f|O
75a0: 5f 43 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23 65  _CLOEXEC,m2);.#e
75b0: 6c 73 65 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f  lse.    fd = osO
75c0: 70 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e  pen(z,f,m2);.#en
75d0: 64 69 66 0a 20 20 20 20 69 66 28 20 66 64 3c 30  dif.    if( fd<0
75e0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72   ){.      if( er
75f0: 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 20 63 6f 6e  rno==EINTR ) con
7600: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 62 72 65  tinue;.      bre
7610: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
7620: 28 20 66 64 3e 3d 53 51 4c 49 54 45 5f 4d 49 4e  ( fd>=SQLITE_MIN
7630: 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49  IMUM_FILE_DESCRI
7640: 50 54 4f 52 20 29 20 62 72 65 61 6b 3b 0a 20 20  PTOR ) break;.  
7650: 20 20 6f 73 43 6c 6f 73 65 28 66 64 29 3b 0a 20    osClose(fd);. 
7660: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
7670: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 0a  QLITE_WARNING, .
7680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7690: 22 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e  "attempt to open
76a0: 20 5c 22 25 73 5c 22 20 61 73 20 66 69 6c 65 20   \"%s\" as file 
76b0: 64 65 73 63 72 69 70 74 6f 72 20 25 64 22 2c 20  descriptor %d", 
76c0: 7a 2c 20 66 64 29 3b 0a 20 20 20 20 66 64 20 3d  z, fd);.    fd =
76d0: 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 6f 73 4f   -1;.    if( osO
76e0: 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c  pen("/dev/null",
76f0: 20 66 2c 20 6d 29 3c 30 20 29 20 62 72 65 61 6b   f, m)<0 ) break
7700: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3e 3d  ;.  }.  if( fd>=
7710: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 21 3d  0 ){.    if( m!=
7720: 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  0 ){.      struc
7730: 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a  t stat statbuf;.
7740: 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61        if( osFsta
7750: 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3d  t(fd, &statbuf)=
7760: 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 73 74  =0 .       && st
7770: 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30  atbuf.st_size==0
7780: 0a 20 20 20 20 20 20 20 26 26 20 28 73 74 61 74  .       && (stat
7790: 62 75 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37  buf.st_mode&0777
77a0: 29 21 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a 20  )!=m .      ){. 
77b0: 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f 64 28         osFchmod(
77c0: 66 64 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  fd, m);.      }.
77d0: 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65      }.#if define
77e0: 64 28 46 44 5f 43 4c 4f 45 58 45 43 29 20 26 26  d(FD_CLOEXEC) &&
77f0: 20 28 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f   (!defined(O_CLO
7800: 45 58 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58  EXEC) || O_CLOEX
7810: 45 43 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63 6e  EC==0).    osFcn
7820: 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20  tl(fd, F_SETFD, 
7830: 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45  osFcntl(fd, F_GE
7840: 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f  TFD, 0) | FD_CLO
7850: 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20  EXEC);.#endif.  
7860: 7d 0a 20 20 72 65 74 75 72 6e 20 66 64 3b 0a 7d  }.  return fd;.}
7870: 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66  ../*.** Helper f
7880: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61  unctions to obta
7890: 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73  in and relinquis
78a0: 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74  h the global mut
78b0: 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61  ex. The.** globa
78c0: 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20  l mutex is used 
78d0: 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 75  to protect the u
78e0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64  nixInodeInfo and
78f0: 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  .** vxworksFileI
7900: 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62  d objects used b
7910: 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c  y this file, all
7920: 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62 65   of which may be
7930: 20 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d   .** shared by m
7940: 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e  ultiple threads.
7950: 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  .**.** Function 
7960: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
7970: 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72  is used to asser
7980: 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f  t() that the glo
7990: 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73  bal mutex .** is
79a0: 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69   held when requi
79b0: 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  red. This functi
79c0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
79d0: 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72  as part of asser
79e0: 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  t() .** statemen
79f0: 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20  ts. e.g..**.**  
7a00: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
7a10: 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28  ).**     assert(
7a20: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
7a30: 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74   );.**   unixEnt
7a40: 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61  erLeave().*/.sta
7a50: 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74  tic void unixEnt
7a60: 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  erMutex(void){. 
7a70: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
7a80: 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65  nter(sqlite3Mute
7a90: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
7aa0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
7ab0: 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  R));.}.static vo
7ac0: 69 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  id unixLeaveMute
7ad0: 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
7ae0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
7af0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
7b00: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
7b10: 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
7b20: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
7b30: 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20  EBUG.static int 
7b40: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f  unixMutexHeld(vo
7b50: 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73  id) {.  return s
7b60: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
7b70: 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  d(sqlite3MutexAl
7b80: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
7b90: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29  _STATIC_MASTER))
7ba0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
7bb0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
7bc0: 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65 64  TEST) && defined
7bd0: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
7be0: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
7bf0: 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e  tion for printin
7c00: 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f  g out trace info
7c10: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62  rmation from deb
7c20: 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69  ugging.** binari
7c30: 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73  es. This returns
7c40: 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72   the string repr
7c50: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
7c60: 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e  e supplied.** in
7c70: 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e  teger lock-type.
7c80: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
7c90: 20 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63   char *azFileLoc
7ca0: 6b 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  k(int eFileLock)
7cb0: 7b 0a 20 20 73 77 69 74 63 68 28 20 65 46 69 6c  {.  switch( eFil
7cc0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73  eLock ){.    cas
7cd0: 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  e NO_LOCK: retur
7ce0: 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61  n "NONE";.    ca
7cf0: 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20  se SHARED_LOCK: 
7d00: 72 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b  return "SHARED";
7d10: 0a 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56  .    case RESERV
7d20: 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  ED_LOCK: return 
7d30: 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20  "RESERVED";.    
7d40: 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  case PENDING_LOC
7d50: 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49  K: return "PENDI
7d60: 4e 47 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58  NG";.    case EX
7d70: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65  CLUSIVE_LOCK: re
7d80: 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22  turn "EXCLUSIVE"
7d90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22  ;.  }.  return "
7da0: 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66  ERROR";.}.#endif
7db0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
7dc0: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  LOCK_TRACE./*.**
7dd0: 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72   Print out infor
7de0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c  mation about all
7df0: 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69   locking operati
7e00: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
7e10: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
7e20: 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74  for troubleshoot
7e30: 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c  ing locks on mul
7e40: 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c  tithreaded.** pl
7e50: 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65  atforms.  Enable
7e60: 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69   by compiling wi
7e70: 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f  th the -DSQLITE_
7e80: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f  LOCK_TRACE.** co
7e90: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f  mmand-line optio
7ea0: 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  n on the compile
7eb0: 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73  r.  This code is
7ec0: 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72   normally.** tur
7ed0: 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  ned off..*/.stat
7ee0: 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65  ic int lockTrace
7ef0: 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c  (int fd, int op,
7f00: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70   struct flock *p
7f10: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61  ){.  char *zOpNa
7f20: 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e  me, *zType;.  in
7f30: 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  t s;.  int saved
7f40: 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d  Errno;.  if( op=
7f50: 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20  =F_GETLK ){.    
7f60: 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b  zOpName = "GETLK
7f70: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  ";.  }else if( o
7f80: 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20  p==F_SETLK ){.  
7f90: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54    zOpName = "SET
7fa0: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  LK";.  }else{.  
7fb0: 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64    s = osFcntl(fd
7fc0: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71  , op, p);.    sq
7fd0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
7fe0: 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20  ("fcntl unknown 
7ff0: 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c  %d %d %d\n", fd,
8000: 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74   op, s);.    ret
8010: 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28  urn s;.  }.  if(
8020: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   p->l_type==F_RD
8030: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
8040: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65   = "RDLCK";.  }e
8050: 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  lse if( p->l_typ
8060: 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20  e==F_WRLCK ){.  
8070: 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b    zType = "WRLCK
8080: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
8090: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43  ->l_type==F_UNLC
80a0: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
80b0: 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "UNLCK";.  }els
80c0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  e{.    assert( 0
80d0: 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
80e0: 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53  ( p->l_whence==S
80f0: 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d  EEK_SET );.  s =
8100: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c   osFcntl(fd, op,
8110: 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e   p);.  savedErrn
8120: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c  o = errno;.  sql
8130: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
8140: 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20  "fcntl %d %d %s 
8150: 25 73 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e  %s %d %d %d %d\n
8160: 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64 69 64  ",.     threadid
8170: 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a  , fd, zOpName, z
8180: 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f  Type, (int)p->l_
8190: 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c  start, (int)p->l
81a0: 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29  _len,.     (int)
81b0: 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20  p->l_pid, s);.  
81c0: 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f  if( s==(-1) && o
81d0: 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70  p==F_SETLK && (p
81e0: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
81f0: 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d  K || p->l_type==
8200: 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20  F_WRLCK) ){.    
8210: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b  struct flock l2;
8220: 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20  .    l2 = *p;.  
8230: 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f    osFcntl(fd, F_
8240: 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20  GETLK, &l2);.   
8250: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
8260: 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
8270: 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22   zType = "RDLCK"
8280: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8290: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  l2.l_type==F_WRL
82a0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
82b0: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20  e = "WRLCK";.   
82c0: 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f   }else if( l2.l_
82d0: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
82e0: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
82f0: 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  UNLCK";.    }els
8300: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
8310: 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0 );.    }.    
8320: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
8330: 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72  tf("fcntl-failur
8340: 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20  e-reason: %s %d 
8350: 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %d\n",.      
8360: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e   zType, (int)l2.
8370: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32  l_start, (int)l2
8380: 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e  .l_len, (int)l2.
8390: 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72  l_pid);.  }.  er
83a0: 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f  rno = savedErrno
83b0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a  ;.  return s;.}.
83c0: 23 75 6e 64 65 66 20 6f 73 46 63 6e 74 6c 0a 23  #undef osFcntl.#
83d0: 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 6c  define osFcntl l
83e0: 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20  ockTrace.#endif 
83f0: 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  /* SQLITE_LOCK_T
8400: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  RACE */../*.** R
8410: 65 74 72 79 20 66 74 72 75 6e 63 61 74 65 28 29  etry ftruncate()
8420: 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c   calls that fail
8430: 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2a   due to EINTR.**
8440: 0a 2a 2a 20 41 6c 6c 20 63 61 6c 6c 73 20 74 6f  .** All calls to
8450: 20 66 74 72 75 6e 63 61 74 65 28 29 20 77 69 74   ftruncate() wit
8460: 68 69 6e 20 74 68 69 73 20 66 69 6c 65 20 73 68  hin this file sh
8470: 6f 75 6c 64 20 62 65 20 6d 61 64 65 20 74 68 72  ould be made thr
8480: 6f 75 67 68 0a 2a 2a 20 74 68 69 73 20 77 72 61  ough.** this wra
8490: 70 70 65 72 2e 20 20 4f 6e 20 74 68 65 20 41 6e  pper.  On the An
84a0: 64 72 6f 69 64 20 70 6c 61 74 66 6f 72 6d 2c 20  droid platform, 
84b0: 62 79 70 61 73 73 69 6e 67 20 74 68 65 20 6c 6f  bypassing the lo
84c0: 67 69 63 20 62 65 6c 6f 77 0a 2a 2a 20 63 6f 75  gic below.** cou
84d0: 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 63 6f 72  ld lead to a cor
84e0: 72 75 70 74 20 64 61 74 61 62 61 73 65 2e 0a 2a  rupt database..*
84f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62  /.static int rob
8500: 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 69 6e  ust_ftruncate(in
8510: 74 20 68 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  t h, sqlite3_int
8520: 36 34 20 73 7a 29 7b 0a 20 20 69 6e 74 20 72 63  64 sz){.  int rc
8530: 3b 0a 23 69 66 64 65 66 20 5f 5f 41 4e 44 52 4f  ;.#ifdef __ANDRO
8540: 49 44 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 41 6e 64  ID__.  /* On And
8550: 72 6f 69 64 2c 20 66 74 72 75 6e 63 61 74 65 28  roid, ftruncate(
8560: 29 20 61 6c 77 61 79 73 20 75 73 65 73 20 33 32  ) always uses 32
8570: 2d 62 69 74 20 6f 66 66 73 65 74 73 2c 20 65 76  -bit offsets, ev
8580: 65 6e 20 69 66 20 0a 20 20 2a 2a 20 5f 46 49 4c  en if .  ** _FIL
8590: 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 3d 36 34  E_OFFSET_BITS=64
85a0: 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69   is defined. Thi
85b0: 73 20 6d 65 61 6e 73 20 69 74 20 69 73 20 75 6e  s means it is un
85c0: 73 61 66 65 20 74 6f 20 61 74 74 65 6d 70 74 20  safe to attempt 
85d0: 74 6f 0a 20 20 2a 2a 20 74 72 75 6e 63 61 74 65  to.  ** truncate
85e0: 20 61 20 66 69 6c 65 20 74 6f 20 61 6e 79 20 73   a file to any s
85f0: 69 7a 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ize larger than 
8600: 32 47 69 42 2e 20 53 69 6c 65 6e 74 6c 79 20 69  2GiB. Silently i
8610: 67 6e 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 73  gnore any.  ** s
8620: 75 63 68 20 61 74 74 65 6d 70 74 73 2e 20 20 2a  uch attempts.  *
8630: 2f 0a 20 20 69 66 28 20 73 7a 3e 28 73 71 6c 69  /.  if( sz>(sqli
8640: 74 65 33 5f 69 6e 74 36 34 29 30 78 37 46 46 46  te3_int64)0x7FFF
8650: 46 46 46 46 20 29 7b 0a 20 20 20 20 72 63 20 3d  FFFF ){.    rc =
8660: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
8670: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 64 6f 7b  lse.#endif.  do{
8680: 20 72 63 20 3d 20 6f 73 46 74 72 75 6e 63 61 74   rc = osFtruncat
8690: 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c 65 28  e(h,sz); }while(
86a0: 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
86b0: 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72  EINTR );.  retur
86c0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
86d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61 6e  his routine tran
86e0: 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64 61 72  slates a standar
86f0: 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f  d POSIX errno co
8700: 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e  de into somethin
8710: 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20 74  g.** useful to t
8720: 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20 74 68  he clients of th
8730: 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63 74 69  e sqlite3 functi
8740: 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c  ons.  Specifical
8750: 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74  ly, it is.** int
8760: 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73 6c 61  ended to transla
8770: 74 65 20 61 20 76 61 72 69 65 74 79 20 6f 66 20  te a variety of 
8780: 22 74 72 79 20 61 67 61 69 6e 22 20 65 72 72 6f  "try again" erro
8790: 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42  rs into SQLITE_B
87a0: 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72  USY.** and a var
87b0: 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73 65 20  iety of "please 
87c0: 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64  close the file d
87d0: 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22 20 65  escriptor NOW" e
87e0: 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53  rrors into .** S
87f0: 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a  QLITE_IOERR.** .
8800: 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69 6e 67  ** Errors during
8810: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
8820: 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c  of locks, or fil
8830: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
8840: 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73   for locks,.** s
8850: 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f  hould handle ENO
8860: 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f  LCK, ENOTSUP, EO
8870: 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72 61 74  PNOTSUPP separat
8880: 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ely..*/.static i
8890: 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72  nt sqliteErrorFr
88a0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74  omPosixError(int
88b0: 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e 74   posixError, int
88c0: 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a   sqliteIOErr) {.
88d0: 20 20 73 77 69 74 63 68 20 28 70 6f 73 69 78 45    switch (posixE
88e0: 72 72 6f 72 29 20 7b 0a 23 69 66 20 30 0a 20 20  rror) {.#if 0.  
88f0: 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  /* At one point 
8900: 74 68 69 73 20 63 6f 64 65 20 77 61 73 20 6e 6f  this code was no
8910: 74 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 2e  t commented out.
8920: 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 69 73   In theory, this
8930: 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 73 68 6f   branch.  ** sho
8940: 75 6c 64 20 6e 65 76 65 72 20 62 65 20 68 69 74  uld never be hit
8950: 2c 20 61 73 20 74 68 69 73 20 66 75 6e 63 74 69  , as this functi
8960: 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  on should only b
8970: 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 0a 20  e called after. 
8980: 20 2a 2a 20 61 20 6c 6f 63 6b 69 6e 67 2d 72 65   ** a locking-re
8990: 6c 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 28  lated function (
89a0: 69 2e 65 2e 20 66 63 6e 74 6c 28 29 29 20 68 61  i.e. fcntl()) ha
89b0: 73 20 72 65 74 75 72 6e 65 64 20 6e 6f 6e 2d 7a  s returned non-z
89c0: 65 72 6f 20 77 69 74 68 0a 20 20 2a 2a 20 74 68  ero with.  ** th
89d0: 65 20 76 61 6c 75 65 20 6f 66 20 65 72 72 6e 6f  e value of errno
89e0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
89f0: 67 75 6d 65 6e 74 2e 20 53 69 6e 63 65 20 61 20  gument. Since a 
8a00: 73 79 73 74 65 6d 20 63 61 6c 6c 20 68 61 73 20  system call has 
8a10: 66 61 69 6c 65 64 2c 0a 20 20 2a 2a 20 65 72 72  failed,.  ** err
8a20: 6e 6f 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 6e  no should be non
8a30: 2d 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  -zero..  **.  **
8a40: 20 44 65 73 70 69 74 65 20 74 68 69 73 2c 20 69   Despite this, i
8a50: 66 20 65 72 72 6e 6f 20 72 65 61 6c 6c 79 20 69  f errno really i
8a60: 73 20 7a 65 72 6f 2c 20 77 65 20 73 74 69 6c 6c  s zero, we still
8a70: 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72   don't want to r
8a80: 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
8a90: 45 5f 4f 4b 2e 20 54 68 65 20 73 79 73 74 65 6d  E_OK. The system
8aa0: 20 63 61 6c 6c 20 66 61 69 6c 65 64 2c 20 61 6e   call failed, an
8ab0: 64 20 2a 73 6f 6d 65 2a 20 53 51 4c 69 74 65 20  d *some* SQLite 
8ac0: 65 72 72 6f 72 20 73 68 6f 75 6c 64 20 62 65 0a  error should be.
8ad0: 20 20 2a 2a 20 70 72 6f 70 61 67 61 74 65 64 20    ** propagated 
8ae0: 62 61 63 6b 20 74 6f 20 74 68 65 20 63 61 6c 6c  back to the call
8af0: 65 72 2e 20 43 6f 6d 6d 65 6e 74 69 6e 67 20 74  er. Commenting t
8b00: 68 69 73 20 62 72 61 6e 63 68 20 6f 75 74 20 6d  his branch out m
8b10: 65 61 6e 73 20 65 72 72 6e 6f 3d 3d 30 0a 20 20  eans errno==0.  
8b20: 2a 2a 20 77 69 6c 6c 20 62 65 20 68 61 6e 64 6c  ** will be handl
8b30: 65 64 20 62 79 20 74 68 65 20 22 64 65 66 61 75  ed by the "defau
8b40: 6c 74 3a 22 20 63 61 73 65 20 62 65 6c 6f 77 2e  lt:" case below.
8b50: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 30 3a 20  .  */.  case 0: 
8b60: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8b70: 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 20  TE_OK;.#endif.. 
8b80: 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20 20   case EAGAIN:.  
8b90: 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a 0a  case ETIMEDOUT:.
8ba0: 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20 20    case EBUSY:.  
8bb0: 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63 61  case EINTR:.  ca
8bc0: 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20  se ENOLCK:  .   
8bd0: 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20 72   /* random NFS r
8be0: 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c 65  etry error, unle
8bf0: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
8c00: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20  ystem support . 
8c10: 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74      * introspect
8c20: 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74  ion, in which it
8c30: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
8c40: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
8c50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8c60: 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20 63  E_BUSY;.    .  c
8c70: 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20 20  ase EACCES: .   
8c80: 20 2f 2a 20 45 41 43 43 45 53 20 69 73 20 6c 69   /* EACCES is li
8c90: 6b 65 20 45 41 47 41 49 4e 20 64 75 72 69 6e 67  ke EAGAIN during
8ca0: 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69   locking operati
8cb0: 6f 6e 73 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79  ons, but not any
8cc0: 20 6f 74 68 65 72 20 74 69 6d 65 2a 2f 0a 20 20   other time*/.  
8cd0: 20 20 69 66 28 20 28 73 71 6c 69 74 65 49 4f 45    if( (sqliteIOE
8ce0: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
8cf0: 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20  RR_LOCK) || .   
8d00: 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72       (sqliteIOEr
8d10: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
8d20: 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20  R_UNLOCK) || .  
8d30: 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45        (sqliteIOE
8d40: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
8d50: 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 20 20  RR_RDLOCK) ||.  
8d60: 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45        (sqliteIOE
8d70: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
8d80: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
8d90: 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 72  LOCK) ){.      r
8da0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
8db0: 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  Y;.    }.    /* 
8dc0: 65 6c 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67  else fall throug
8dd0: 68 20 2a 2f 0a 20 20 63 61 73 65 20 45 50 45 52  h */.  case EPER
8de0: 4d 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53  M: .    return S
8df0: 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20  QLITE_PERM;.    
8e00: 0a 23 69 66 20 45 4f 50 4e 4f 54 53 55 50 50 21  .#if EOPNOTSUPP!
8e10: 3d 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20  =ENOTSUP.  case 
8e20: 45 4f 50 4e 4f 54 53 55 50 50 3a 20 0a 20 20 20  EOPNOTSUPP: .   
8e30: 20 2f 2a 20 73 6f 6d 65 74 68 69 6e 67 20 77 65   /* something we
8e40: 6e 74 20 74 65 72 72 69 62 6c 79 20 61 77 72 79  nt terribly awry
8e50: 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20  , unless during 
8e60: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
8e70: 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72  ort .     * intr
8e80: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
8e90: 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20  ich it actually 
8ea0: 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61  means what it sa
8eb0: 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  ys */.#endif.#if
8ec0: 64 65 66 20 45 4e 4f 54 53 55 50 0a 20 20 63 61  def ENOTSUP.  ca
8ed0: 73 65 20 45 4e 4f 54 53 55 50 3a 20 0a 20 20 20  se ENOTSUP: .   
8ee0: 20 2f 2a 20 69 6e 76 61 6c 69 64 20 66 64 2c 20   /* invalid fd, 
8ef0: 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69  unless during fi
8f00: 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le system suppor
8f10: 74 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c  t introspection,
8f20: 20 69 6e 20 77 68 69 63 68 20 0a 20 20 20 20 20   in which .     
8f30: 2a 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65  * it actually me
8f40: 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73  ans what it says
8f50: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 61 73   */.#endif.  cas
8f60: 65 20 45 49 4f 3a 0a 20 20 63 61 73 65 20 45 42  e EIO:.  case EB
8f70: 41 44 46 3a 0a 20 20 63 61 73 65 20 45 49 4e 56  ADF:.  case EINV
8f80: 41 4c 3a 0a 20 20 63 61 73 65 20 45 4e 4f 54 43  AL:.  case ENOTC
8f90: 4f 4e 4e 3a 0a 20 20 63 61 73 65 20 45 4e 4f 44  ONN:.  case ENOD
8fa0: 45 56 3a 0a 20 20 63 61 73 65 20 45 4e 58 49 4f  EV:.  case ENXIO
8fb0: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 45 4e 54 3a  :.  case ENOENT:
8fc0: 0a 23 69 66 64 65 66 20 45 53 54 41 4c 45 20 20  .#ifdef ESTALE  
8fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fe0: 20 20 20 2f 2a 20 45 53 54 41 4c 45 20 69 73 20     /* ESTALE is 
8ff0: 6e 6f 74 20 64 65 66 69 6e 65 64 20 6f 6e 20 49  not defined on I
9000: 6e 74 65 72 69 78 20 73 79 73 74 65 6d 73 20 2a  nterix systems *
9010: 2f 0a 20 20 63 61 73 65 20 45 53 54 41 4c 45 3a  /.  case ESTALE:
9020: 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45  .#endif.  case E
9030: 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20 74 68  NOSYS:.    /* th
9040: 65 73 65 20 73 68 6f 75 6c 64 20 66 6f 72 63 65  ese should force
9050: 20 74 68 65 20 63 6c 69 65 6e 74 20 74 6f 20 63   the client to c
9060: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61 6e  lose the file an
9070: 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20  d reconnect */. 
9080: 20 20 20 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a     .  default: .
9090: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
90a0: 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a  eIOErr;.  }.}...
90b0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
90c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
90d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
90e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
90f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
9100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9110: 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71 75 65 20  ** Begin Unique 
9120: 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20  File ID Utility 
9130: 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20  Used By VxWorks 
9140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
9150: 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65  **.** On most ve
9160: 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20  rsions of unix, 
9170: 77 65 20 63 61 6e 20 67 65 74 20 61 20 75 6e 69  we can get a uni
9180: 71 75 65 20 49 44 20 66 6f 72 20 61 20 66 69 6c  que ID for a fil
9190: 65 20 62 79 20 63 6f 6e 63 61 74 65 6e 61 74 69  e by concatenati
91a0: 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76 69 63 65  ng.** the device
91b0: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
91c0: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 42  inode number.  B
91d0: 75 74 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  ut this does not
91e0: 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73   work on VxWorks
91f0: 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c  ..** On VxWorks,
9200: 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 69   a unique file i
9210: 64 20 6d 75 73 74 20 62 65 20 62 61 73 65 64 20  d must be based 
9220: 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  on the canonical
9230: 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a   filename..**.**
9240: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   A pointer to an
9250: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
9260: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
9270: 74 75 72 65 20 63 61 6e 20 62 65 20 75 73 65 64  ture can be used
9280: 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20   as a.** unique 
9290: 66 69 6c 65 20 49 44 20 69 6e 20 56 78 57 6f 72  file ID in VxWor
92a0: 6b 73 2e 20 20 45 61 63 68 20 69 6e 73 74 61 6e  ks.  Each instan
92b0: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
92c0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  ture contains.**
92d0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
92e0: 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d  anonical filenam
92f0: 65 2e 20 20 54 68 65 72 65 20 69 73 20 61 6c 73  e.  There is als
9300: 6f 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f  o a reference co
9310: 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74  unt.  .** The st
9320: 72 75 63 74 75 72 65 20 69 73 20 72 65 63 6c 61  ructure is recla
9330: 69 6d 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75  imed when the nu
9340: 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73  mber of pointers
9350: 20 74 6f 20 69 74 20 64 72 6f 70 73 20 74 6f 0a   to it drops to.
9360: 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54  ** zero..**.** T
9370: 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20 76  here are never v
9380: 65 72 79 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f  ery many files o
9390: 70 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65 20  pen at one time 
93a0: 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20  and lookups are 
93b0: 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d  not.** a perform
93c0: 61 6e 63 65 2d 63 72 69 74 69 63 61 6c 20 70 61  ance-critical pa
93d0: 74 68 2c 20 73 6f 20 69 74 20 69 73 20 73 75 66  th, so it is suf
93e0: 66 69 63 69 65 6e 74 20 74 6f 20 70 75 74 20 74  ficient to put t
93f0: 68 65 73 65 0a 2a 2a 20 73 74 72 75 63 74 75 72  hese.** structur
9400: 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c  es on a linked l
9410: 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76  ist..*/.struct v
9420: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20  xworksFileId {. 
9430: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
9440: 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f  ileId *pNext;  /
9450: 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c 69 73 74  * Next in a list
9460: 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a   of them all */.
9470: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
9480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9490: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66  /* Number of ref
94a0: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20  erences to this 
94b0: 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  one */.  int nNa
94c0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
94d0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
94e0: 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63   of the zCanonic
94f0: 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20  alName[] string 
9500: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f  */.  char *zCano
9510: 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20  nicalName;      
9520: 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20     /* Canonical 
9530: 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a  filename */.};..
9540: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f  #if OS_VXWORKS./
9550: 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65  * .** All unique
9560: 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 68   filenames are h
9570: 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20  eld on a linked 
9580: 6c 69 73 74 20 68 65 61 64 65 64 20 62 79 20 74  list headed by t
9590: 68 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a  his.** variable:
95a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
95b0: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
95c0: 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74  *vxworksFileList
95d0: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d   = 0;../*.** Sim
95e0: 70 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d 65  plify a filename
95f0: 20 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69   into its canoni
9600: 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d  cal form.** by m
9610: 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  aking the follow
9620: 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a  ing changes:.**.
9630: 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61  **  * removing a
9640: 6e 79 20 74 72 61 69 6c 69 6e 67 20 61 6e 64 20  ny trailing and 
9650: 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20  duplicate /.**  
9660: 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e  * convert /./ in
9670: 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20  to just /.**  * 
9680: 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77  convert /A/../ w
9690: 68 65 72 65 20 41 20 69 73 20 61 6e 79 20 73 69  here A is any si
96a0: 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a  mple name into j
96b0: 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e  ust /.**.** Chan
96c0: 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 6e 2d  ges are made in-
96d0: 70 6c 61 63 65 2e 20 20 52 65 74 75 72 6e 20 74  place.  Return t
96e0: 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67  he new name leng
96f0: 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72  th..**.** The or
9700: 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  iginal filename 
9710: 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e  is in z[0..n-1].
9720: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
9730: 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63  ber of.** charac
9740: 74 65 72 73 20 69 6e 20 74 68 65 20 73 69 6d 70  ters in the simp
9750: 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a  lified name..*/.
9760: 73 74 61 74 69 63 20 69 6e 74 20 76 78 77 6f 72  static int vxwor
9770: 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63  ksSimplifyName(c
9780: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
9790: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68    int i, j;.  wh
97a0: 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d  ile( n>1 && z[n-
97b0: 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20  1]=='/' ){ n--; 
97c0: 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  }.  for(i=j=0; i
97d0: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <n; i++){.    if
97e0: 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20  ( z[i]=='/' ){. 
97f0: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
9800: 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ='/' ) continue;
9810: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31  .      if( z[i+1
9820: 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20  ]=='.' && i+2<n 
9830: 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29  && z[i+2]=='/' )
9840: 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 31  {.        i += 1
9850: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
9860: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
9870: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e    if( z[i+1]=='.
9880: 27 20 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b  ' && i+3<n && z[
9890: 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69  i+2]=='.' && z[i
98a0: 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  +3]=='/' ){.    
98b0: 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26      while( j>0 &
98c0: 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b  & z[j-1]!='/' ){
98d0: 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20   j--; }.        
98e0: 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20  if( j>0 ){ j--; 
98f0: 7d 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32  }.        i += 2
9900: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
9910: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
9920: 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a  }.    z[j++] = z
9930: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20  [i];.  }.  z[j] 
9940: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b  = 0;.  return j;
9950: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
9960: 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   unique file ID 
9970: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 61 62  for the given ab
9980: 73 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65 2e  solute pathname.
9990: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f    Return.** a po
99a0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 76 78 77  inter to the vxw
99b0: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
99c0: 74 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 65 72  t.  This pointer
99d0: 20 69 73 20 74 68 65 20 75 6e 69 71 75 65 0a 2a   is the unique.*
99e0: 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a  * file ID..**.**
99f0: 20 54 68 65 20 6e 52 65 66 20 66 69 65 6c 64 20   The nRef field 
9a00: 6f 66 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69  of the vxworksFi
9a10: 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 69  leId object is i
9a20: 6e 63 72 65 6d 65 6e 74 65 64 20 62 65 66 6f 72  ncremented befor
9a30: 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20  e.** the object 
9a40: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20  is returned.  A 
9a50: 6e 65 77 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  new vxworksFileI
9a60: 64 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  d object is crea
9a70: 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64  ted.** and added
9a80: 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c   to the global l
9a90: 69 73 74 20 69 66 20 6e 65 63 65 73 73 61 72 79  ist if necessary
9aa0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
9ab0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
9ac0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
9ad0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
9ae0: 74 69 63 20 73 74 72 75 63 74 20 76 78 77 6f 72  tic struct vxwor
9af0: 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b  ksFileId *vxwork
9b00: 73 46 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73  sFindFileId(cons
9b10: 74 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74  t char *zAbsolut
9b20: 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75 63 74  eName){.  struct
9b30: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
9b40: 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 2f 2a  pNew;         /*
9b50: 20 73 65 61 72 63 68 20 6b 65 79 20 61 6e 64 20   search key and 
9b60: 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20  new file ID */. 
9b70: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
9b80: 69 6c 65 49 64 20 2a 70 43 61 6e 64 69 64 61 74  ileId *pCandidat
9b90: 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  e;   /* For loop
9ba0: 69 6e 67 20 6f 76 65 72 20 65 78 69 73 74 69 6e  ing over existin
9bb0: 67 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20  g file IDs */.  
9bc0: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
9bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9be0: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
9bf0: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73   zAbsoluteName s
9c00: 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65  tring */..  asse
9c10: 72 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  rt( zAbsoluteNam
9c20: 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e  e[0]=='/' );.  n
9c30: 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
9c40: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20  AbsoluteName);. 
9c50: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   pNew = sqlite3_
9c60: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
9c70: 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b  pNew) + (n+1) );
9c80: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
9c90: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
9ca0: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
9cb0: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  e = (char*)&pNew
9cc0: 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e  [1];.  memcpy(pN
9cd0: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
9ce0: 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  me, zAbsoluteNam
9cf0: 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76  e, n+1);.  n = v
9d00: 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61  xworksSimplifyNa
9d10: 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  me(pNew->zCanoni
9d20: 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20  calName, n);..  
9d30: 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e  /* Search for an
9d40: 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20   existing entry 
9d50: 74 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74 68  that matching th
9d60: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65  e canonical name
9d70: 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c  ..  ** If found,
9d80: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   increment the r
9d90: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 61  eference count a
9da0: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
9db0: 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ter to.  ** the 
9dc0: 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44  existing file ID
9dd0: 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  ..  */.  unixEnt
9de0: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72  erMutex();.  for
9df0: 28 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77 6f  (pCandidate=vxwo
9e00: 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43 61  rksFileList; pCa
9e10: 6e 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69 64  ndidate; pCandid
9e20: 61 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e  ate=pCandidate->
9e30: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
9e40: 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d  pCandidate->nNam
9e50: 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d 65  e==n .     && me
9e60: 6d 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65 2d  mcmp(pCandidate-
9e70: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
9e80: 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61   pNew->zCanonica
9e90: 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20  lName, n)==0.   
9ea0: 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74   ){.       sqlit
9eb0: 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
9ec0: 20 20 20 20 20 20 70 43 61 6e 64 69 64 61 74 65        pCandidate
9ed0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
9ee0: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
9ef0: 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e  );.       return
9f00: 20 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20 20   pCandidate;.   
9f10: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20   }.  }..  /* No 
9f20: 6d 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64 2e  match was found.
9f30: 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61    We will make a
9f40: 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a   new file ID */.
9f50: 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31    pNew->nRef = 1
9f60: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20  ;.  pNew->nName 
9f70: 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65  = n;.  pNew->pNe
9f80: 78 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65  xt = vxworksFile
9f90: 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46  List;.  vxworksF
9fa0: 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  ileList = pNew;.
9fb0: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
9fc0: 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  ();.  return pNe
9fd0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72  w;.}../*.** Decr
9fe0: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
9ff0: 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76  nce count on a v
a000: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
a010: 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68  ect.  Free.** th
a020: 65 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74 68  e object when th
a030: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
a040: 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a  t reaches zero..
a050: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
a060: 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c  xworksReleaseFil
a070: 65 49 64 28 73 74 72 75 63 74 20 76 78 77 6f 72  eId(struct vxwor
a080: 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a  ksFileId *pId){.
a090: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
a0a0: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  ();.  assert( pI
a0b0: 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  d->nRef>0 );.  p
a0c0: 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  Id->nRef--;.  if
a0d0: 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pId->nRef==0 )
a0e0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 76 78 77  {.    struct vxw
a0f0: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b  orksFileId **pp;
a100: 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78 77  .    for(pp=&vxw
a110: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70  orksFileList; *p
a120: 70 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20 70  p && *pp!=pId; p
a130: 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65  p = &((*pp)->pNe
a140: 78 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65 72  xt)){}.    asser
a150: 74 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20  t( *pp==pId );. 
a160: 20 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e     *pp = pId->pN
a170: 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ext;.    sqlite3
a180: 5f 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a  _free(pId);.  }.
a190: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
a1a0: 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ();.}.#endif /* 
a1b0: 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a  OS_VXWORKS */./*
a1c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
a1d0: 6e 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69 6c  nd of Unique Fil
a1e0: 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65  e ID Utility Use
a1f0: 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a  d By VxWorks ***
a200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
a210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a  ************/...
a260: 2f 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 2a 2a 0a  ***************.
a2b0: 2a 2a 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 20 50 6f 73 69  *********** Posi
a2d0: 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69  x Advisory Locki
a2e0: 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
a2f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
a300: 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76 69  **.** POSIX advi
a310: 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20 62  sory locks are b
a320: 72 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e 2e  roken by design.
a330: 20 20 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e    ANSI STD 1003.
a340: 31 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74  1 (1996).** sect
a350: 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65  ion 6.5.2.2 line
a360: 73 20 34 38 33 20 74 68 72 6f 75 67 68 20 34 39  s 483 through 49
a370: 30 20 73 70 65 63 69 66 79 20 74 68 61 74 20 77  0 specify that w
a380: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a  hen a process.**
a390: 20 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20   sets or clears 
a3a0: 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65  a lock, that ope
a3b0: 72 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73  ration overrides
a3c0: 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73   any prior locks
a3d0: 20 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73   set.** by the s
a3e0: 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74  ame process.  It
a3f0: 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63   does not explic
a400: 69 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74  itly say so, but
a410: 20 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a   this implies.**
a420: 20 74 68 61 74 20 69 74 20 6f 76 65 72 72 69 64   that it overrid
a430: 65 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20  es locks set by 
a440: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
a450: 20 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65   using a differe
a460: 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  nt.** file descr
a470: 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72  iptor.  Consider
a480: 20 74 68 69 73 20 74 65 73 74 20 63 61 73 65 3a   this test case:
a490: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74  .**.**       int
a4a0: 20 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66   fd1 = open("./f
a4b0: 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f  ile1", O_RDWR|O_
a4c0: 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a  CREAT, 0644);.**
a4d0: 20 20 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d         int fd2 =
a4e0: 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c   open("./file2",
a4f0: 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c   O_RDWR|O_CREAT,
a500: 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75   0644);.**.** Su
a510: 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e  ppose ./file1 an
a520: 64 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65  d ./file2 are re
a530: 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69  ally the same fi
a540: 6c 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f  le (because.** o
a550: 6e 65 20 69 73 20 61 20 68 61 72 64 20 6f 72 20  ne is a hard or 
a560: 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f  symbolic link to
a570: 20 74 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e   the other) then
a580: 20 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61   if you set.** a
a590: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
a5a0: 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72   on fd1, then tr
a5b0: 79 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c  y to get an excl
a5c0: 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e  usive lock.** on
a5d0: 20 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20   fd2, it works. 
a5e0: 20 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78   I would have ex
a5f0: 70 65 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e  pected the secon
a600: 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69  d lock to.** fai
a610: 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 61  l since there wa
a620: 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
a630: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65   on the file due
a640: 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20   to fd1..** But 
a650: 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62  not so.  Since b
a660: 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66  oth locks came f
a670: 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f  rom the same pro
a680: 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63  cess, the.** sec
a690: 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74 68  ond overrides th
a6a0: 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68  e first, even th
a6b0: 6f 75 67 68 20 74 68 65 79 20 77 65 72 65 20 6f  ough they were o
a6c0: 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  n different.** f
a6d0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
a6e0: 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72  opened on differ
a6f0: 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a  ent file names..
a700: 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73  **.** This means
a710: 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20   that we cannot 
a720: 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20  use POSIX locks 
a730: 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66  to synchronize f
a740: 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d  ile access.** am
a750: 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74 68  ong competing th
a760: 72 65 61 64 73 20 6f 66 20 74 68 65 20 73 61 6d  reads of the sam
a770: 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53 49  e process.  POSI
a780: 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72  X locks will wor
a790: 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e  k fine.** to syn
a7a0: 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73 20  chronize access 
a7b0: 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20 73  for threads in s
a7c0: 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65  eparate processe
a7d0: 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68  s, but not.** th
a7e0: 72 65 61 64 73 20 77 69 74 68 69 6e 20 74 68 65  reads within the
a7f0: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a   same process..*
a800: 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f  *.** To work aro
a810: 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c  und the problem,
a820: 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20 6d   SQLite has to m
a830: 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73  anage file locks
a840: 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f   internally.** o
a850: 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e  n its own.  When
a860: 65 76 65 72 20 61 20 6e 65 77 20 64 61 74 61 62  ever a new datab
a870: 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 77  ase is opened, w
a880: 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20 74  e have to find t
a890: 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 69  he.** specific i
a8a0: 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74 61  node of the data
a8b0: 62 61 73 65 20 66 69 6c 65 20 28 74 68 65 20 69  base file (the i
a8c0: 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69 6e  node is determin
a8d0: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f  ed by the.** st_
a8e0: 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66  dev and st_ino f
a8f0: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74 61  ields of the sta
a900: 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  t structure that
a910: 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20 69   fstat() fills i
a920: 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20  n).** and check 
a930: 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64  for locks alread
a940: 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74 68  y existing on th
a950: 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20  at inode.  When 
a960: 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65  locks are.** cre
a970: 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c  ated or removed,
a980: 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b   we have to look
a990: 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65   at our own inte
a9a0: 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74  rnal record of t
a9b0: 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73  he.** locks to s
a9c0: 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74 68  ee if another th
a9d0: 72 65 61 64 20 68 61 73 20 70 72 65 76 69 6f 75  read has previou
a9e0: 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f  sly set a lock o
a9f0: 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69  n that same.** i
aa00: 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69  node..**.** (Asi
aa10: 64 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20 69  de: The use of i
aa20: 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73 20  node numbers as 
aa30: 75 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73 20  unique IDs does 
aa40: 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f  not work on VxWo
aa50: 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f  rks..** For VxWo
aa60: 72 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20  rks, we have to 
aa70: 75 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61 74  use the alternat
aa80: 69 76 65 20 75 6e 69 71 75 65 20 49 44 20 73 79  ive unique ID sy
aa90: 73 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  stem based on.**
aaa0: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   canonical filen
aab0: 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e  ame and implemen
aac0: 74 65 64 20 69 6e 20 74 68 65 20 70 72 65 76 69  ted in the previ
aad0: 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a  ous division.).*
aae0: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
aaf0: 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  _file structure 
ab00: 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20  for POSIX is no 
ab10: 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69  longer just an i
ab20: 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64  nteger file.** d
ab30: 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69  escriptor.  It i
ab40: 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72  s now a structur
ab50: 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  e that holds the
ab60: 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a   integer file.**
ab70: 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20   descriptor and 
ab80: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
ab90: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
aba0: 73 63 72 69 62 65 73 20 74 68 65 20 69 6e 74 65  scribes the inte
abb0: 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e  rnal.** locks on
abc0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
abd0: 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65  ng inode.  There
abe0: 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20   is one locking 
abf0: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72  structure.** per
ac00: 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68   inode, so if th
ac10: 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20  e same inode is 
ac20: 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f  opened twice, bo
ac30: 74 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  th unixFile stru
ac40: 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20  ctures.** point 
ac50: 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b  to the same lock
ac60: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20  ing structure.  
ac70: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  The locking stru
ac80: 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61  cture keeps.** a
ac90: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
aca0: 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f   (so we will kno
acb0: 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65  w when to delete
acc0: 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22   it) and a "cnt"
acd0: 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74  .** field that t
ace0: 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65  ells us its inte
acf0: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73  rnal lock status
ad00: 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20  .  cnt==0 means 
ad10: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75  the.** file is u
ad20: 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d  nlocked.  cnt==-
ad30: 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65  1 means the file
ad40: 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76   has an exclusiv
ad50: 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30  e lock..** cnt>0
ad60: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65   means there are
ad70: 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   cnt shared lock
ad80: 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a  s on the file..*
ad90: 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74  *.** Any attempt
ada0: 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f   to lock or unlo
adb0: 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20  ck a file first 
adc0: 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69  checks the locki
add0: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  ng.** structure.
ade0: 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79    The fcntl() sy
adf0: 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c  stem call is onl
ae00: 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74  y invoked to set
ae10: 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63   a .** POSIX loc
ae20: 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61  k if the interna
ae30: 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65  l lock structure
ae40: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74   transitions bet
ae50: 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64  ween.** a locked
ae60: 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64   and an unlocked
ae70: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75   state..**.** Bu
ae80: 74 20 77 61 69 74 3a 20 20 74 68 65 72 65 20 61  t wait:  there a
ae90: 72 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f 62  re yet more prob
aea0: 6c 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58 20  lems with POSIX 
aeb0: 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a  advisory locks..
aec0: 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f  **.** If you clo
aed0: 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  se a file descri
aee0: 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73  ptor that points
aef0: 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20   to a file that 
af00: 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c  has locks,.** al
af10: 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20  l locks on that 
af20: 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77  file that are ow
af30: 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65  ned by the curre
af40: 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a  nt process are.*
af50: 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20  * released.  To 
af60: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
af70: 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75   problem, each u
af80: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
af90: 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73  ect.** maintains
afa0: 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20   a count of the 
afb0: 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e  number of pendin
afc0: 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69  g locks on tha i
afd0: 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e  node..** When an
afe0: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
aff0: 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69   to close an uni
b000: 78 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20  xFile, if there 
b010: 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69  are.** other uni
b020: 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68  xFile open on th
b030: 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61  e same inode tha
b040: 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f  t are holding lo
b050: 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a  cks, the call.**
b060: 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20   to close() the 
b070: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
b080: 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
b090: 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63  l all of the loc
b0a0: 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65  ks clear..** The
b0b0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73   unixInodeInfo s
b0c0: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 61  tructure keeps a
b0d0: 20 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65   list of file de
b0e0: 73 63 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e  scriptors that n
b0f0: 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f  eed to.** be clo
b100: 73 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73  sed and that lis
b110: 74 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64  t is walked (and
b120: 20 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74   cleared) when t
b130: 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20  he last lock.** 
b140: 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65  clears..**.** Ye
b150: 74 20 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65  t another proble
b160: 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65 61 64 73  m:  LinuxThreads
b170: 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c   do not play wel
b180: 6c 20 77 69 74 68 20 70 6f 73 69 78 20 6c 6f 63  l with posix loc
b190: 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f  ks..**.** Many o
b1a0: 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lder versions of
b1b0: 20 6c 69 6e 75 78 20 75 73 65 20 74 68 65 20 4c   linux use the L
b1c0: 69 6e 75 78 54 68 72 65 61 64 73 20 6c 69 62 72  inuxThreads libr
b1d0: 61 72 79 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  ary which is.** 
b1e0: 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69  not posix compli
b1f0: 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75  ant.  Under Linu
b200: 78 54 68 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b  xThreads, a lock
b210: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65   created by thre
b220: 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62  ad.** A cannot b
b230: 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f 76  e modified or ov
b240: 65 72 72 69 64 64 65 6e 20 62 79 20 61 20 64 69  erridden by a di
b250: 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 20 42  fferent thread B
b260: 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64  ..** Only thread
b270: 20 41 20 63 61 6e 20 6d 6f 64 69 66 79 20 74 68   A can modify th
b280: 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67  e lock.  Locking
b290: 20 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72   behavior is cor
b2a0: 72 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 20 61  rect.** if the a
b2b0: 70 70 6c 69 61 74 69 6f 6e 20 75 73 65 73 20 74  ppliation uses t
b2c0: 68 65 20 6e 65 77 65 72 20 4e 61 74 69 76 65 20  he newer Native 
b2d0: 50 6f 73 69 78 20 54 68 72 65 61 64 20 4c 69 62  Posix Thread Lib
b2e0: 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f  rary (NPTL).** o
b2f0: 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74 68 20 4e  n linux - with N
b300: 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74  PTL a lock creat
b310: 65 64 20 62 79 20 74 68 72 65 61 64 20 41 20 63  ed by thread A c
b320: 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b  an override lock
b330: 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64 20 42  s.** in thread B
b340: 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20  .  But there is 
b350: 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61  no way to know a
b360: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77  t compile-time w
b370: 68 69 63 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e  hich.** threadin
b380: 67 20 6c 69 62 72 61 72 79 20 69 73 20 62 65 69  g library is bei
b390: 6e 67 20 75 73 65 64 2e 20 20 53 6f 20 74 68 65  ng used.  So the
b3a0: 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20  re is no way to 
b3b0: 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69  know at.** compi
b3c0: 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20  le-time whether 
b3d0: 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 20 41 20  or not thread A 
b3e0: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63  can override loc
b3f0: 6b 73 20 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a  ks on thread B..
b400: 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f  ** One has to do
b410: 20 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65 63   a run-time chec
b420: 6b 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68  k to discover th
b430: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68  e behavior of th
b440: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72 6f  e.** current pro
b450: 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  cess..**.** SQLi
b460: 74 65 20 75 73 65 64 20 74 6f 20 73 75 70 70 6f  te used to suppo
b470: 72 74 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2e  rt LinuxThreads.
b480: 20 20 42 75 74 20 73 75 70 70 6f 72 74 20 66 6f    But support fo
b490: 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73 0a 2a  r LinuxThreads.*
b4a0: 2a 20 77 61 73 20 64 72 6f 70 70 65 64 20 62 65  * was dropped be
b4b0: 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 76 65 72  ginning with ver
b4c0: 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c  sion 3.7.0.  SQL
b4d0: 69 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77  ite will still w
b4e0: 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75  ork with.** Linu
b4f0: 78 54 68 72 65 61 64 73 20 70 72 6f 76 69 64 65  xThreads provide
b500: 64 20 74 68 61 74 20 28 31 29 20 74 68 65 72 65  d that (1) there
b510: 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e   is no more than
b520: 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   one connection 
b530: 0a 2a 2a 20 70 65 72 20 64 61 74 61 62 61 73 65  .** per database
b540: 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d   file in the sam
b550: 65 20 70 72 6f 63 65 73 73 20 61 6e 64 20 28 32  e process and (2
b560: 29 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  ) database conne
b570: 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74  ctions.** do not
b580: 20 6d 6f 76 65 20 61 63 72 6f 73 73 20 74 68 72   move across thr
b590: 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  eads..*/../*.** 
b5a0: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
b5b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
b5c0: 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73  ucture serves as
b5d0: 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a   the key used.**
b5e0: 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72   to locate a par
b5f0: 74 69 63 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64  ticular unixInod
b600: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f  eInfo object..*/
b610: 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65  .struct unixFile
b620: 49 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76  Id {.  dev_t dev
b630: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b640: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d     /* Device num
b650: 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58  ber */.#if OS_VX
b660: 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76  WORKS.  struct v
b670: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49  xworksFileId *pI
b680: 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69  d;  /* Unique fi
b690: 6c 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72 6b  le ID for vxwork
b6a0: 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e  s. */.#else.  in
b6b0: 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 20  o_t ino;        
b6c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f            /* Ino
b6d0: 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e  de number */.#en
b6e0: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  dif.};../*.** An
b6f0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
b700: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
b710: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
b720: 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a  d for each open.
b730: 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f  ** inode.  Or, o
b740: 6e 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20  n LinuxThreads, 
b750: 74 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 66 20  there is one of 
b760: 74 68 65 73 65 20 73 74 72 75 63 74 75 72 65 73  these structures
b770: 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f   for.** each ino
b780: 64 65 20 6f 70 65 6e 65 64 20 62 79 20 65 61 63  de opened by eac
b790: 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  h thread..**.** 
b7a0: 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63  A single inode c
b7b0: 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65  an have multiple
b7c0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
b7d0: 73 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78 46  s, so each unixF
b7e0: 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ile.** structure
b7f0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
b800: 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e  ter to an instan
b810: 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63  ce of this objec
b820: 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62  t and this.** ob
b830: 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f 75  ject keeps a cou
b840: 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  nt of the number
b850: 20 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f 69   of unixFile poi
b860: 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a  nting to it..*/.
b870: 73 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65  struct unixInode
b880: 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74 20  Info {.  struct 
b890: 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49  unixFileId fileI
b8a0: 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  d;       /* The 
b8b0: 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20  lookup key */.  
b8c0: 69 6e 74 20 6e 53 68 61 72 65 64 3b 20 20 20 20  int nShared;    
b8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41  /* Number of SHA
b8f0: 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  RED locks held *
b900: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
b910: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
b920: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48      /* One of SH
b930: 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
b940: 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f  VED_LOCK etc. */
b950: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
b960: 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b 20 20   bProcessLock;  
b970: 20 20 20 2f 2a 20 41 6e 20 65 78 63 6c 75 73 69     /* An exclusi
b980: 76 65 20 70 72 6f 63 65 73 73 20 6c 6f 63 6b 20  ve process lock 
b990: 69 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74  is held */.  int
b9a0: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b9c0: 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65  Number of pointe
b9d0: 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63  rs to this struc
b9e0: 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68  ture */.  unixSh
b9f0: 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
ba00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
ba10: 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red memory assoc
ba20: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
ba30: 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  inode */.  int n
ba40: 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
ba50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
ba60: 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64  mber of outstand
ba70: 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 2a  ing file locks *
ba80: 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  /.  UnixUnusedFd
ba90: 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20   *pUnused;      
baa0: 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66 69      /* Unused fi
bab0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74  le descriptors t
bac0: 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e 69  o close */.  uni
bad0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78  xInodeInfo *pNex
bae0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
baf0: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78  List of all unix
bb00: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
bb10: 73 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  s */.  unixInode
bb20: 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20 20 20  Info *pPrev;    
bb30: 20 20 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e         /*    ...
bb40: 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20  . doubly linked 
bb50: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
bb60: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
bb70: 4c 45 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  LE.  unsigned lo
bb80: 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 42 79  ng long sharedBy
bb90: 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50 20  te;  /* for AFP 
bba0: 73 69 6d 75 6c 61 74 65 64 20 73 68 61 72 65 64  simulated shared
bbb0: 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a   lock */.#endif.
bbc0: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
bbd0: 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20   sem_t *pSem;   
bbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbf0: 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58 20   /* Named POSIX 
bc00: 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63  semaphore */.  c
bc10: 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58  har aSemName[MAX
bc20: 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f  _PATHNAME+2];  /
bc30: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61 74 20 73  * Name of that s
bc40: 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64  emaphore */.#end
bc50: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c  if.};../*.** A l
bc60: 69 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78  ists of all unix
bc70: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
bc80: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69  s..*/.static uni
bc90: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64  xInodeInfo *inod
bca0: 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  eList = 0;../*.*
bcb0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
bcc0: 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  on - unixLogErro
bcd0: 72 5f 78 28 29 2c 20 69 73 20 6f 6e 6c 79 20 65  r_x(), is only e
bce0: 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74  ver called via t
bcf0: 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69 78  he macro.** unix
bd00: 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a  LogError()..**.*
bd10: 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  * It is invoked 
bd20: 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f  after an error o
bd30: 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66  ccurs in an OS f
bd40: 75 6e 63 74 69 6f 6e 20 61 6e 64 20 65 72 72 6e  unction and errn
bd50: 6f 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 73 65  o has been.** se
bd60: 74 2e 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73  t. It logs a mes
bd70: 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74  sage using sqlit
bd80: 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e  e3_log() contain
bd90: 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
bda0: 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6e  value of.** errn
bdb0: 6f 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62  o and, if possib
bdc0: 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65  le, the human-re
bdd0: 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e  adable equivalen
bde0: 74 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28  t from strerror(
bdf0: 29 20 6f 72 0a 2a 2a 20 73 74 72 65 72 72 6f 72  ) or.** strerror
be00: 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  _r()..**.** The 
be10: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  first argument p
be20: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63  assed to the mac
be30: 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ro should be the
be40: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74   error code that
be50: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75  .** will be retu
be60: 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28  rned to SQLite (
be70: 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52  e.g. SQLITE_IOER
be80: 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45  R_DELETE, SQLITE
be90: 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20  _CANTOPEN). .** 
bea0: 54 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65  The two subseque
beb0: 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f  nt arguments sho
bec0: 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20  uld be the name 
bed0: 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69  of the OS functi
bee0: 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65  on that.** faile
bef0: 64 20 28 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22  d (e.g. "unlink"
bf00: 2c 20 22 6f 70 65 6e 22 29 20 61 6e 64 20 74 68  , "open") and th
bf10: 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c  e associated fil
bf20: 65 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 0a 2a  e-system path,.*
bf30: 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65  * if any..*/.#de
bf40: 66 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72 6f  fine unixLogErro
bf50: 72 28 61 2c 62 2c 63 29 20 20 20 20 20 75 6e 69  r(a,b,c)     uni
bf60: 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28  xLogErrorAtLine(
bf70: 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a  a,b,c,__LINE__).
bf80: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c  static int unixL
bf90: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20  ogErrorAtLine(. 
bfa0: 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20   int errcode,   
bfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfc0: 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72   /* SQLite error
bfd0: 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   code */.  const
bfe0: 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20   char *zFunc,   
bff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
c000: 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f  me of OS functio
c010: 6e 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f  n that failed */
c020: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
c030: 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
c040: 20 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20     /* File path 
c050: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
c060: 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  error */.  int i
c070: 4c 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20  Line            
c080: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
c090: 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72  urce line number
c0a0: 20 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63   where error occ
c0b0: 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68  urred */.){.  ch
c0c0: 61 72 20 2a 7a 45 72 72 3b 20 20 20 20 20 20 20  ar *zErr;       
c0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c0e0: 20 4d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 74   Message from st
c0f0: 72 65 72 72 6f 72 28 29 20 6f 72 20 65 71 75 69  rerror() or equi
c100: 76 61 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  valent */.  int 
c110: 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20  iErrno = errno; 
c120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
c130: 61 76 65 64 20 73 79 73 63 61 6c 6c 20 65 72 72  aved syscall err
c140: 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20  or number */..  
c150: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  /* If this is no
c160: 74 20 61 20 74 68 72 65 61 64 73 61 66 65 20 62  t a threadsafe b
c170: 75 69 6c 64 20 28 53 51 4c 49 54 45 5f 54 48 52  uild (SQLITE_THR
c180: 45 41 44 53 41 46 45 3d 3d 30 29 2c 20 74 68 65  EADSAFE==0), the
c190: 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68 65 20 73  n use.  ** the s
c1a0: 74 72 65 72 72 6f 72 28 29 20 66 75 6e 63 74 69  trerror() functi
c1b0: 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  on to obtain the
c1c0: 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
c1d0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20  error message.  
c1e0: 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  ** equivalent to
c1f0: 20 65 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73   errno. Otherwis
c200: 65 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 5f  e, use strerror_
c210: 72 28 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20 53  r()..  */ .#if S
c220: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
c230: 20 26 26 20 64 65 66 69 6e 65 64 28 48 41 56 45   && defined(HAVE
c240: 5f 53 54 52 45 52 52 4f 52 5f 52 29 0a 20 20 63  _STRERROR_R).  c
c250: 68 61 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20 20  har aErr[80];.  
c260: 6d 65 6d 73 65 74 28 61 45 72 72 2c 20 30 2c 20  memset(aErr, 0, 
c270: 73 69 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a 20  sizeof(aErr));. 
c280: 20 7a 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a 20   zErr = aErr;.. 
c290: 20 2f 2a 20 49 66 20 53 54 52 45 52 52 4f 52 5f   /* If STRERROR_
c2a0: 52 5f 43 48 41 52 5f 50 20 28 73 65 74 20 62 79  R_CHAR_P (set by
c2b0: 20 61 75 74 6f 63 6f 6e 66 20 73 63 72 69 70 74   autoconf script
c2c0: 73 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55 20  s) or __USE_GNU 
c2d0: 69 73 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a 2a  is defined,.  **
c2e0: 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
c2f0: 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73   system provides
c300: 20 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e   the GNU version
c310: 20 6f 66 20 73 74 72 65 72 72 6f 72 5f 72 28 29   of strerror_r()
c320: 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 74 75 72   that.  ** retur
c330: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
c340: 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
c350: 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d 65  ing the error me
c360: 73 73 61 67 65 2e 20 54 68 61 74 20 70 6f 69 6e  ssage. That poin
c370: 74 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20 70 6f  ter .  ** may po
c380: 69 6e 74 20 74 6f 20 61 45 72 72 5b 5d 2c 20 6f  int to aErr[], o
c390: 72 20 69 74 20 6d 61 79 20 70 6f 69 6e 74 20 74  r it may point t
c3a0: 6f 20 73 6f 6d 65 20 73 74 61 74 69 63 20 73 74  o some static st
c3b0: 6f 72 61 67 65 20 73 6f 6d 65 77 68 65 72 65 2e  orage somewhere.
c3c0: 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65   .  ** Otherwise
c3d0: 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
c3e0: 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65  e system provide
c3f0: 73 20 74 68 65 20 50 4f 53 49 58 20 76 65 72 73  s the POSIX vers
c400: 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 73 74 72  ion of .  ** str
c410: 65 72 72 6f 72 5f 72 28 29 2c 20 77 68 69 63 68  error_r(), which
c420: 20 61 6c 77 61 79 73 20 77 72 69 74 65 73 20 61   always writes a
c430: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
c440: 69 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a 20 20 2a  into aErr[]..  *
c450: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 6f  *.  ** If the co
c460: 64 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 61  de incorrectly a
c470: 73 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69  ssumes that it i
c480: 73 20 74 68 65 20 50 4f 53 49 58 20 76 65 72 73  s the POSIX vers
c490: 69 6f 6e 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  ion that is.  **
c4a0: 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 65 20   available, the 
c4b0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69  error message wi
c4c0: 6c 6c 20 6f 66 74 65 6e 20 62 65 20 61 6e 20 65  ll often be an e
c4d0: 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 4e 6f 74  mpty string. Not
c4e0: 20 61 0a 20 20 2a 2a 20 68 75 67 65 20 70 72 6f   a.  ** huge pro
c4f0: 62 6c 65 6d 2e 20 49 6e 63 6f 72 72 65 63 74 6c  blem. Incorrectl
c500: 79 20 63 6f 6e 63 6c 75 64 69 6e 67 20 74 68 61  y concluding tha
c510: 74 20 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f  t the GNU versio
c520: 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 0a  n is available .
c530: 20 20 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20    ** could lead 
c540: 74 6f 20 61 20 73 65 67 66 61 75 6c 74 20 74 68  to a segfault th
c550: 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23 69 66 20 64  ough..  */.#if d
c560: 65 66 69 6e 65 64 28 53 54 52 45 52 52 4f 52 5f  efined(STRERROR_
c570: 52 5f 43 48 41 52 5f 50 29 20 7c 7c 20 64 65 66  R_CHAR_P) || def
c580: 69 6e 65 64 28 5f 5f 55 53 45 5f 47 4e 55 29 0a  ined(__USE_GNU).
c590: 20 20 7a 45 72 72 20 3d 20 0a 23 20 65 6e 64 69    zErr = .# endi
c5a0: 66 0a 20 20 73 74 72 65 72 72 6f 72 5f 72 28 69  f.  strerror_r(i
c5b0: 45 72 72 6e 6f 2c 20 61 45 72 72 2c 20 73 69 7a  Errno, aErr, siz
c5c0: 65 6f 66 28 61 45 72 72 29 2d 31 29 3b 0a 0a 23  eof(aErr)-1);..#
c5d0: 65 6c 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  elif SQLITE_THRE
c5e0: 41 44 53 41 46 45 0a 20 20 2f 2a 20 54 68 69 73  ADSAFE.  /* This
c5f0: 20 69 73 20 61 20 74 68 72 65 61 64 73 61 66 65   is a threadsafe
c600: 20 62 75 69 6c 64 2c 20 62 75 74 20 73 74 72 65   build, but stre
c610: 72 72 6f 72 5f 72 28 29 20 69 73 20 6e 6f 74 20  rror_r() is not 
c620: 61 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20  available. */.  
c630: 7a 45 72 72 20 3d 20 22 22 3b 0a 23 65 6c 73 65  zErr = "";.#else
c640: 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65 61 64  .  /* Non-thread
c650: 73 61 66 65 20 62 75 69 6c 64 2c 20 75 73 65 20  safe build, use 
c660: 73 74 72 65 72 72 6f 72 28 29 2e 20 2a 2f 0a 20  strerror(). */. 
c670: 20 7a 45 72 72 20 3d 20 73 74 72 65 72 72 6f 72   zErr = strerror
c680: 28 69 45 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66  (iErrno);.#endif
c690: 0a 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30  ..  if( zPath==0
c6a0: 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20   ) zPath = "";. 
c6b0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72   sqlite3_log(err
c6c0: 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f  code,.      "os_
c6d0: 75 6e 69 78 2e 63 3a 25 64 3a 20 28 25 64 29 20  unix.c:%d: (%d) 
c6e0: 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20  %s(%s) - %s",.  
c6f0: 20 20 20 20 69 4c 69 6e 65 2c 20 69 45 72 72 6e      iLine, iErrn
c700: 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c  o, zFunc, zPath,
c710: 20 7a 45 72 72 0a 20 20 29 3b 0a 0a 20 20 72 65   zErr.  );..  re
c720: 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a  turn errcode;.}.
c730: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
c740: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a  ile descriptor..
c750: 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20  **.** We assume 
c760: 74 68 61 74 20 63 6c 6f 73 65 28 29 20 61 6c 6d  that close() alm
c770: 6f 73 74 20 61 6c 77 61 79 73 20 77 6f 72 6b 73  ost always works
c780: 2c 20 73 69 6e 63 65 20 69 74 20 69 73 20 6f 6e  , since it is on
c790: 6c 79 20 69 6e 20 61 0a 2a 2a 20 76 65 72 79 20  ly in a.** very 
c7a0: 73 69 63 6b 20 61 70 70 6c 69 63 61 74 69 6f 6e  sick application
c7b0: 20 6f 72 20 6f 6e 20 61 20 76 65 72 79 20 73 69   or on a very si
c7c0: 63 6b 20 70 6c 61 74 66 6f 72 6d 20 74 68 61 74  ck platform that
c7d0: 20 69 74 20 6d 69 67 68 74 20 66 61 69 6c 2e 0a   it might fail..
c7e0: 2a 2a 20 49 66 20 69 74 20 64 6f 65 73 20 66 61  ** If it does fa
c7f0: 69 6c 2c 20 73 69 6d 70 6c 79 20 6c 65 61 6b 20  il, simply leak 
c800: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
c810: 74 6f 72 2c 20 62 75 74 20 64 6f 20 6c 6f 67 20  tor, but do log 
c820: 74 68 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a  the.** error..**
c830: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74  .** Note that it
c840: 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20   is not safe to 
c850: 72 65 74 72 79 20 63 6c 6f 73 65 28 29 20 61 66  retry close() af
c860: 74 65 72 20 45 49 4e 54 52 20 73 69 6e 63 65 20  ter EINTR since 
c870: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  the.** file desc
c880: 72 69 70 74 6f 72 20 6d 69 67 68 74 20 68 61 76  riptor might hav
c890: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72  e already been r
c8a0: 65 75 73 65 64 20 62 79 20 61 6e 6f 74 68 65 72  eused by another
c8b0: 20 74 68 72 65 61 64 2e 0a 2a 2a 20 53 6f 20 77   thread..** So w
c8c0: 65 20 64 6f 6e 27 74 20 65 76 65 6e 20 74 72 79  e don't even try
c8d0: 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d   to recover from
c8e0: 20 61 6e 20 45 49 4e 54 52 2e 20 20 4a 75 73 74   an EINTR.  Just
c8f0: 20 6c 6f 67 20 74 68 65 20 65 72 72 6f 72 0a 2a   log the error.*
c900: 2a 20 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a  * and move on..*
c910: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f  /.static void ro
c920: 62 75 73 74 5f 63 6c 6f 73 65 28 75 6e 69 78 46  bust_close(unixF
c930: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20  ile *pFile, int 
c940: 68 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  h, int lineno){.
c950: 20 20 69 66 28 20 6f 73 43 6c 6f 73 65 28 68 29    if( osClose(h)
c960: 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45   ){.    unixLogE
c970: 72 72 6f 72 41 74 4c 69 6e 65 28 53 51 4c 49 54  rrorAtLine(SQLIT
c980: 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 22  E_IOERR_CLOSE, "
c990: 63 6c 6f 73 65 22 2c 0a 20 20 20 20 20 20 20 20  close",.        
c9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
c9b0: 46 69 6c 65 20 3f 20 70 46 69 6c 65 2d 3e 7a 50  File ? pFile->zP
c9c0: 61 74 68 20 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29  ath : 0, lineno)
c9d0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
c9e0: 65 74 20 74 68 65 20 70 46 69 6c 65 2d 3e 6c 61  et the pFile->la
c9f0: 73 74 45 72 72 6e 6f 2e 20 20 44 6f 20 74 68 69  stErrno.  Do thi
ca00: 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74 69 6e  s in a subroutin
ca10: 65 20 61 73 20 74 68 61 74 20 70 72 6f 76 69 64  e as that provid
ca20: 65 73 0a 2a 2a 20 61 20 63 6f 6e 76 65 6e 69 65  es.** a convenie
ca30: 6e 74 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20  nt place to set 
ca40: 61 20 62 72 65 61 6b 70 6f 69 6e 74 2e 0a 2a 2f  a breakpoint..*/
ca50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 6f  .static void sto
ca60: 72 65 4c 61 73 74 45 72 72 6e 6f 28 75 6e 69 78  reLastErrno(unix
ca70: 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  File *pFile, int
ca80: 20 65 72 72 6f 72 29 7b 0a 20 20 70 46 69 6c 65   error){.  pFile
ca90: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
caa0: 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ror;.}../*.** Cl
cab0: 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20 64 65 73  ose all file des
cac0: 63 72 69 70 74 6f 72 73 20 61 63 63 75 6d 75 61  criptors accumua
cad0: 74 65 64 20 69 6e 20 74 68 65 20 75 6e 69 78 49  ted in the unixI
cae0: 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e 75 73 65  nodeInfo->pUnuse
caf0: 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74 61 74  d list..*/ .stat
cb00: 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 50 65 6e  ic void closePen
cb10: 64 69 6e 67 46 64 73 28 75 6e 69 78 46 69 6c 65  dingFds(unixFile
cb20: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78   *pFile){.  unix
cb30: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
cb40: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
cb50: 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  e;.  UnixUnusedF
cb60: 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75 73  d *p;.  UnixUnus
cb70: 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20 66  edFd *pNext;.  f
cb80: 6f 72 28 70 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e  or(p=pInode->pUn
cb90: 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78 74  used; p; p=pNext
cba0: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
cbb0: 2d 3e 70 4e 65 78 74 3b 0a 23 69 66 20 4f 53 43  ->pNext;.#if OSC
cbc0: 4c 4f 53 45 5f 43 48 45 43 4b 5f 43 4c 4f 53 45  LOSE_CHECK_CLOSE
cbd0: 5f 49 4f 45 52 52 0a 20 20 20 20 69 66 28 20 63  _IOERR.    if( c
cbe0: 6c 6f 73 65 28 70 2d 3e 66 64 29 20 29 7b 0a 20  lose(p->fd) ){. 
cbf0: 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
cc00: 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
cc10: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
cc20: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
cc30: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74  ;.      p->pNext
cc40: 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20 20 20   = pError;.     
cc50: 20 70 45 72 72 6f 72 20 3d 20 70 3b 0a 20 20 20   pError = p;.   
cc60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
cc70: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
cc80: 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 72     }.#else.    r
cc90: 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c  obust_close(pFil
cca0: 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c 49 4e 45  e, p->fd, __LINE
ccb0: 5f 5f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  __);.    sqlite3
ccc0: 5f 66 72 65 65 28 70 29 3b 0a 23 65 6e 64 69 66  _free(p);.#endif
ccd0: 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70  .  }.  pInode->p
cce0: 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f  Unused = 0;.}../
ccf0: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75  *.** Release a u
cd00: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72  nixInodeInfo str
cd10: 75 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c  ucture previousl
cd20: 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66  y allocated by f
cd30: 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a  indInodeInfo()..
cd40: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  **.** The mutex 
cd50: 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68  entered using th
cd60: 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  e unixEnterMutex
cd70: 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  () function must
cd80: 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e   be held.** when
cd90: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
cda0: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
cdb0: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
cdc0: 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46 69  InodeInfo(unixFi
cdd0: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e  le *pFile){.  un
cde0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
cdf0: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
ce00: 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75  ode;.  assert( u
ce10: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
ce20: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
ce30: 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20 20 70 49  Inode) ){.    pI
ce40: 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  node->nRef--;.  
ce50: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52    if( pInode->nR
ce60: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ef==0 ){.      a
ce70: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
ce80: 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20  ShmNode==0 );.  
ce90: 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67      closePending
cea0: 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  Fds(pFile);.    
ceb0: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50    if( pInode->pP
cec0: 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rev ){.        a
ced0: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
cee0: 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e  Prev->pNext==pIn
cef0: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ode );.        p
cf00: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e  Inode->pPrev->pN
cf10: 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e  ext = pInode->pN
cf20: 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ext;.      }else
cf30: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
cf40: 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e  ( inodeList==pIn
cf50: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ode );.        i
cf60: 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64  nodeList = pInod
cf70: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  e->pNext;.      
cf80: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  }.      if( pIno
cf90: 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  de->pNext ){.   
cfa0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
cfb0: 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ode->pNext->pPre
cfc0: 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  v==pInode );.   
cfd0: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65       pInode->pNe
cfe0: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f  xt->pPrev = pIno
cff0: 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20  de->pPrev;.     
d000: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
d010: 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20  _free(pInode);. 
d020: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
d030: 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64  * Given a file d
d040: 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74  escriptor, locat
d050: 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  e the unixInodeI
d060: 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a  nfo object that.
d070: 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 68 61  ** describes tha
d080: 74 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  t file descripto
d090: 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  r.  Create a new
d0a0: 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
d0b0: 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72  y.  The.** retur
d0c0: 6e 20 76 61 6c 75 65 20 6d 69 67 68 74 20 62 65  n value might be
d0d0: 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69   uninitialized i
d0e0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
d0f0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  s..**.** The mut
d100: 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67  ex entered using
d110: 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
d120: 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  tex() function m
d130: 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
d140: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
d150: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
d160: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 70 70  ** Return an app
d170: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
d180: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
d190: 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  nt findInodeInfo
d1a0: 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  (.  unixFile *pF
d1b0: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
d1c0: 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20     /* Unix file 
d1d0: 77 69 74 68 20 66 69 6c 65 20 64 65 73 63 20 75  with file desc u
d1e0: 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a  sed in the key *
d1f0: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
d200: 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20 20  o **ppInode     
d210: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
d220: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
d230: 62 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b  bject here */.){
d240: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d260: 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c    /* System call
d270: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
d280: 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
d290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2a0: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
d2b0: 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c  criptor for pFil
d2c0: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  e */.  struct un
d2d0: 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b  ixFileId fileId;
d2e0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20        /* Lookup 
d2f0: 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78  key for the unix
d300: 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73  InodeInfo */.  s
d310: 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62  truct stat statb
d320: 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  uf;           /*
d330: 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20   Low-level file 
d340: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
d350: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
d360: 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20 20  pInode = 0;     
d370: 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69  /* Candidate uni
d380: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
d390: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
d3a0: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
d3b0: 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77  );..  /* Get low
d3c0: 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69  -level informati
d3d0: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c  on about the fil
d3e0: 65 20 74 68 61 74 20 77 65 20 63 61 6e 20 75 73  e that we can us
d3f0: 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74  ed to.  ** creat
d400: 65 20 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20  e a unique name 
d410: 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 20 20  for the file..  
d420: 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d  */.  fd = pFile-
d430: 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74  >h;.  rc = osFst
d440: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
d450: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
d460: 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
d470: 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
d480: 29 3b 0a 23 69 66 64 65 66 20 45 4f 56 45 52 46  );.#ifdef EOVERF
d490: 4c 4f 57 0a 20 20 20 20 69 66 28 20 70 46 69 6c  LOW.    if( pFil
d4a0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f  e->lastErrno==EO
d4b0: 56 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e  VERFLOW ) return
d4c0: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23   SQLITE_NOLFS;.#
d4d0: 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
d4e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
d4f0: 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50   }..#ifdef __APP
d500: 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20  LE__.  /* On OS 
d510: 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69  X on an msdos fi
d520: 6c 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e  lesystem, the in
d530: 6f 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65  ode number is re
d540: 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f  ported.  ** inco
d550: 72 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f  rrectly for zero
d560: 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65  -size files.  Se
d570: 65 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20  e ticket #3260. 
d580: 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72   To work.  ** ar
d590: 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65  ound this proble
d5a0: 6d 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69  m (we consider i
d5b0: 74 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c  t a bug in OS X,
d5c0: 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a   not SQLite).  *
d5d0: 2a 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72  * we always incr
d5e0: 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 73 69  ease the file si
d5f0: 7a 65 20 74 6f 20 31 20 62 79 20 77 72 69 74 69  ze to 1 by writi
d600: 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  ng a single byte
d610: 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61  .  ** prior to a
d620: 63 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f  ccessing the ino
d630: 64 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20  de number.  The 
d640: 6f 6e 65 20 62 79 74 65 20 77 72 69 74 74 65 6e  one byte written
d650: 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49   is.  ** an ASCI
d660: 49 20 27 53 27 20 63 68 61 72 61 63 74 65 72 20  I 'S' character 
d670: 77 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65  which also happe
d680: 6e 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72  ns to be the fir
d690: 73 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20  st byte.  ** in 
d6a0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 65 76  the header of ev
d6b0: 65 72 79 20 53 51 4c 69 74 65 20 64 61 74 61 62  ery SQLite datab
d6c0: 61 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61  ase.  In this wa
d6d0: 79 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a  y, if there.  **
d6e0: 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69   is a race condi
d6f0: 74 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  tion such that a
d700: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61  nother thread ha
d710: 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61  s already popula
d720: 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72  ted.  ** the fir
d730: 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
d740: 61 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61  atabase, no dama
d750: 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f  ge is done..  */
d760: 0a 20 20 69 66 28 20 73 74 61 74 62 75 66 2e 73  .  if( statbuf.s
d770: 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46  t_size==0 && (pF
d780: 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53  ile->fsFlags & S
d790: 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53  QLITE_FSFLAGS_IS
d7a0: 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20  _MSDOS)!=0 ){.  
d7b0: 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69    do{ rc = osWri
d7c0: 74 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 20  te(fd, "S", 1); 
d7d0: 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
d7e0: 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
d7f0: 20 20 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b      if( rc!=1 ){
d800: 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
d810: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
d820: 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  no);.      retur
d830: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
d840: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f      }.    rc = o
d850: 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74  sFstat(fd, &stat
d860: 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63  buf);.    if( rc
d870: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 6f  !=0 ){.      sto
d880: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
d890: 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
d8a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
d8b0: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OERR;.    }.  }.
d8c0: 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74  #endif..  memset
d8d0: 28 26 66 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a  (&fileId, 0, siz
d8e0: 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20  eof(fileId));.  
d8f0: 66 69 6c 65 49 64 2e 64 65 76 20 3d 20 73 74 61  fileId.dev = sta
d900: 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66  tbuf.st_dev;.#if
d910: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69   OS_VXWORKS.  fi
d920: 6c 65 49 64 2e 70 49 64 20 3d 20 70 46 69 6c 65  leId.pId = pFile
d930: 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66  ->pId;.#else.  f
d940: 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73 74 61 74  ileId.ino = stat
d950: 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64  buf.st_ino;.#end
d960: 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e  if.  pInode = in
d970: 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65  odeList;.  while
d980: 28 20 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63  ( pInode && memc
d990: 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70 49 6e  mp(&fileId, &pIn
d9a0: 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a  ode->fileId, siz
d9b0: 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a  eof(fileId)) ){.
d9c0: 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e      pInode = pIn
d9d0: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ode->pNext;.  }.
d9e0: 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20    if( pInode==0 
d9f0: 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20  ){.    pInode = 
da00: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
da10: 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 20  sizeof(*pInode) 
da20: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  );.    if( pInod
da30: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  e==0 ){.      re
da40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
da50: 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  M;.    }.    mem
da60: 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c 20 73  set(pInode, 0, s
da70: 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 29 3b  izeof(*pInode));
da80: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 49 6e  .    memcpy(&pIn
da90: 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26 66 69  ode->fileId, &fi
daa0: 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c  leId, sizeof(fil
dab0: 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e 6f 64  eId));.    pInod
dac0: 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  e->nRef = 1;.   
dad0: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d   pInode->pNext =
dae0: 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20   inodeList;.    
daf0: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d 20  pInode->pPrev = 
db00: 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f 64 65  0;.    if( inode
db10: 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69 73 74  List ) inodeList
db20: 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65  ->pPrev = pInode
db30: 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20  ;.    inodeList 
db40: 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73  = pInode;.  }els
db50: 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  e{.    pInode->n
db60: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70  Ref++;.  }.  *pp
db70: 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b 0a  Inode = pInode;.
db80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
db90: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
dba0: 75 72 6e 20 54 52 55 45 20 69 66 20 70 46 69 6c  urn TRUE if pFil
dbb0: 65 20 68 61 73 20 62 65 65 6e 20 72 65 6e 61 6d  e has been renam
dbc0: 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 20 73  ed or unlinked s
dbd0: 69 6e 63 65 20 69 74 20 77 61 73 20 66 69 72 73  ince it was firs
dbe0: 74 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 74 61  t opened..*/.sta
dbf0: 74 69 63 20 69 6e 74 20 66 69 6c 65 48 61 73 4d  tic int fileHasM
dc00: 6f 76 65 64 28 75 6e 69 78 46 69 6c 65 20 2a 70  oved(unixFile *p
dc10: 46 69 6c 65 29 7b 0a 23 69 66 20 4f 53 5f 56 58  File){.#if OS_VX
dc20: 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 70  WORKS.  return p
dc30: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20  File->pInode!=0 
dc40: 26 26 20 70 46 69 6c 65 2d 3e 70 49 64 21 3d 70  && pFile->pId!=p
dc50: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 66 69  File->pInode->fi
dc60: 6c 65 49 64 2e 70 49 64 3b 0a 23 65 6c 73 65 0a  leId.pId;.#else.
dc70: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
dc80: 66 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c  f;.  return pFil
dc90: 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20 26 26 0a  e->pInode!=0 &&.
dca0: 20 20 20 20 20 20 28 6f 73 53 74 61 74 28 70 46        (osStat(pF
dcb0: 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 62 75 66  ile->zPath, &buf
dcc0: 29 21 3d 30 20 7c 7c 20 62 75 66 2e 73 74 5f 69  )!=0 || buf.st_i
dcd0: 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  no!=pFile->pInod
dce0: 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 29 3b 0a  e->fileId.ino);.
dcf0: 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
dd00: 20 43 68 65 63 6b 20 61 20 75 6e 69 78 46 69 6c   Check a unixFil
dd10: 65 20 74 68 61 74 20 69 73 20 61 20 64 61 74 61  e that is a data
dd20: 62 61 73 65 2e 20 20 56 65 72 69 66 79 20 74 68  base.  Verify th
dd30: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
dd40: 2a 2a 20 28 31 29 20 54 68 65 72 65 20 69 73 20  ** (1) There is 
dd50: 65 78 61 63 74 6c 79 20 6f 6e 65 20 68 61 72 64  exactly one hard
dd60: 20 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 66 69 6c   link on the fil
dd70: 65 0a 2a 2a 20 28 32 29 20 54 68 65 20 66 69 6c  e.** (2) The fil
dd80: 65 20 69 73 20 6e 6f 74 20 61 20 73 79 6d 62 6f  e is not a symbo
dd90: 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20 28 33 29 20  lic link.** (3) 
dda0: 54 68 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74  The file has not
ddb0: 20 62 65 65 6e 20 72 65 6e 61 6d 65 64 20 6f 72   been renamed or
ddc0: 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 0a 2a 2a 20   unlinked.**.** 
ddd0: 49 73 73 75 65 20 73 71 6c 69 74 65 33 5f 6c 6f  Issue sqlite3_lo
dde0: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
ddf0: 2c 2e 2e 2e 29 20 6d 65 73 73 61 67 65 73 20 69  ,...) messages i
de00: 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 6e 6f  f anything is no
de10: 74 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  t right..*/.stat
de20: 69 63 20 76 6f 69 64 20 76 65 72 69 66 79 44 62  ic void verifyDb
de30: 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  File(unixFile *p
de40: 46 69 6c 65 29 7b 0a 20 20 73 74 72 75 63 74 20  File){.  struct 
de50: 73 74 61 74 20 62 75 66 3b 0a 20 20 69 6e 74 20  stat buf;.  int 
de60: 72 63 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  rc;.  if( pFile-
de70: 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
de80: 58 46 49 4c 45 5f 57 41 52 4e 45 44 20 29 7b 0a  XFILE_WARNED ){.
de90: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 6d 6f      /* One or mo
dea0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
deb0: 69 6e 67 20 77 61 72 6e 69 6e 67 73 20 68 61 76  ing warnings hav
dec0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  e already been i
ded0: 73 73 75 65 64 2e 20 20 44 6f 20 6e 6f 74 0a 20  ssued.  Do not. 
dee0: 20 20 20 2a 2a 20 72 65 70 65 61 74 20 74 68 65     ** repeat the
def0: 6d 20 73 6f 20 61 73 20 6e 6f 74 20 74 6f 20 63  m so as not to c
df00: 6c 75 74 74 65 72 20 74 68 65 20 65 72 72 6f 72  lutter the error
df10: 20 6c 6f 67 20 2a 2f 0a 20 20 20 20 72 65 74 75   log */.    retu
df20: 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6f  rn;.  }.  rc = o
df30: 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c  sFstat(pFile->h,
df40: 20 26 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63   &buf);.  if( rc
df50: 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
df60: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
df70: 52 4e 49 4e 47 2c 20 22 63 61 6e 6e 6f 74 20 66  RNING, "cannot f
df80: 73 74 61 74 20 64 62 20 66 69 6c 65 20 25 73 22  stat db file %s"
df90: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
dfa0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
dfb0: 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
dfc0: 45 5f 57 41 52 4e 45 44 3b 0a 20 20 20 20 72 65  E_WARNED;.    re
dfd0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
dfe0: 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3d 3d 30 20  buf.st_nlink==0 
dff0: 26 26 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46  && (pFile->ctrlF
e000: 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
e010: 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20  DELETE)==0 ){.  
e020: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
e030: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66  LITE_WARNING, "f
e040: 69 6c 65 20 75 6e 6c 69 6e 6b 65 64 20 77 68 69  ile unlinked whi
e050: 6c 65 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46  le open: %s", pF
e060: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
e070: 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
e080: 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 57 41  s |= UNIXFILE_WA
e090: 52 4e 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  RNED;.    return
e0a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62 75 66 2e  ;.  }.  if( buf.
e0b0: 73 74 5f 6e 6c 69 6e 6b 3e 31 20 29 7b 0a 20 20  st_nlink>1 ){.  
e0c0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
e0d0: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 6d  LITE_WARNING, "m
e0e0: 75 6c 74 69 70 6c 65 20 6c 69 6e 6b 73 20 74 6f  ultiple links to
e0f0: 20 66 69 6c 65 3a 20 25 73 22 2c 20 70 46 69 6c   file: %s", pFil
e100: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70  e->zPath);.    p
e110: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
e120: 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e  |= UNIXFILE_WARN
e130: 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ED;.    return;.
e140: 20 20 7d 0a 20 20 69 66 28 20 66 69 6c 65 48 61    }.  if( fileHa
e150: 73 4d 6f 76 65 64 28 70 46 69 6c 65 29 20 29 7b  sMoved(pFile) ){
e160: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
e170: 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c  (SQLITE_WARNING,
e180: 20 22 66 69 6c 65 20 72 65 6e 61 6d 65 64 20 77   "file renamed w
e190: 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73 22 2c 20  hile open: %s", 
e1a0: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
e1b0: 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
e1c0: 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
e1d0: 57 41 52 4e 45 44 3b 0a 20 20 20 20 72 65 74 75  WARNED;.    retu
e1e0: 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  rn;.  }.}.../*.*
e1f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
e200: 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
e210: 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
e220: 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
e230: 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
e240: 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
e250: 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
e260: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
e270: 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
e280: 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
e290: 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
e2a0: 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
e2b0: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
e2c0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
e2d0: 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
e2e0: 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
e2f0: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
e300: 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
e310: 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
e320: 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65   int unixCheckRe
e330: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
e340: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
e350: 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
e360: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e370: 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
e380: 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
e390: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
e3a0: 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
e3b0: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
e3c0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
e3d0: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
e3e0: 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  CK; );..  assert
e3f0: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 75 6e 69  ( pFile );.  uni
e400: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f  xEnterMutex(); /
e410: 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d  * Because pFile-
e420: 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
e430: 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
e440: 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
e450: 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
e460: 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
e470: 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
e480: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49  .  if( pFile->pI
e490: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
e4a0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
e4b0: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
e4c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72  .  }..  /* Other
e4d0: 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
e4e0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
e4f0: 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69  olds it..  */.#i
e500: 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a  fndef __DJGPP__.
e510: 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
e520: 26 26 20 21 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  && !pFile->pInod
e530: 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20  e->bProcessLock 
e540: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c  ){.    struct fl
e550: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f  ock lock;.    lo
e560: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
e570: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b  EK_SET;.    lock
e580: 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52  .l_start = RESER
e590: 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  VED_BYTE;.    lo
e5a0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  ck.l_len = 1;.  
e5b0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
e5c0: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66 28  F_WRLCK;.    if(
e5d0: 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   osFcntl(pFile->
e5e0: 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
e5f0: 6b 29 20 29 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b  k) ){.#if OSLOCK
e600: 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49  ING_CHECK_BUSY_I
e610: 4f 45 52 52 0a 20 20 20 20 20 20 69 6e 74 20 74  OERR.      int t
e620: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
e630: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e640: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
e650: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
e660: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
e670: 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20  SERVEDLOCK);.   
e680: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
e690: 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
e6a0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63  ;.#else.      rc
e6b0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
e6c0: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
e6d0: 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  K;.      storeLa
e6e0: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65  stErrno(pFile, e
e6f0: 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rrno);.#endif.  
e700: 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f 63    } else if( loc
e710: 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43  k.l_type!=F_UNLC
e720: 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65 72  K ){.      reser
e730: 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ved = 1;.    }. 
e740: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 75   }.#endif.  .  u
e750: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
e760: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
e770: 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
e780: 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  %d (unix)\n", pF
e790: 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
e7a0: 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73  rved));..  *pRes
e7b0: 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
e7c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
e7d0: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
e7e0: 20 73 65 74 20 61 20 73 79 73 74 65 6d 2d 6c 6f   set a system-lo
e7f0: 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 70  ck on the file p
e800: 46 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20  File.  The lock 
e810: 69 73 20 0a 2a 2a 20 64 65 73 63 72 69 62 65 64  is .** described
e820: 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   by pLock..**.**
e830: 20 49 66 20 74 68 65 20 70 46 69 6c 65 20 77 61   If the pFile wa
e840: 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77 72  s opened read/wr
e850: 69 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65 78  ite from unix-ex
e860: 63 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e 6c  cl, then the onl
e870: 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20 6f  y lock.** ever o
e880: 62 74 61 69 6e 65 64 20 69 73 20 61 6e 20 65 78  btained is an ex
e890: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61 6e  clusive lock, an
e8a0: 64 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65 64  d it is obtained
e8b0: 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a 2a   exactly once.**
e8c0: 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
e8d0: 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74 74 65  any lock is atte
e8e0: 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73 75 62 73  mpted.  All subs
e8f0: 65 71 75 65 6e 74 20 73 79 73 74 65 6d 20 6c 6f  equent system lo
e900: 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69  cking.** operati
e910: 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f 70  ons become no-op
e920: 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65 72  s.  Locking oper
e930: 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61 70  ations still hap
e940: 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c 0a  pen internally,.
e950: 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ** in order to c
e960: 6f 6f 72 64 69 6e 61 74 65 20 61 63 63 65 73 73  oordinate access
e970: 20 62 65 74 77 65 65 6e 20 73 65 70 61 72 61 74   between separat
e980: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
e990: 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69 6e  ctions.** within
e9a0: 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20 62   this process, b
e9b0: 75 74 20 61 6c 6c 20 6f 66 20 74 68 61 74 20 69  ut all of that i
e9c0: 73 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65 6d  s handled in mem
e9d0: 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20 6f  ory and the.** o
e9e0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
e9f0: 64 6f 65 73 20 6e 6f 74 20 70 61 72 74 69 63 69  does not partici
ea00: 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  pate..**.** This
ea10: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 70   function is a p
ea20: 61 73 73 2d 74 68 72 6f 75 67 68 20 74 6f 20 66  ass-through to f
ea30: 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69 66  cntl(F_SETLK) if
ea40: 20 70 46 69 6c 65 20 69 73 20 75 73 69 6e 67 0a   pFile is using.
ea50: 2a 2a 20 61 6e 79 20 56 46 53 20 6f 74 68 65 72  ** any VFS other
ea60: 20 74 68 61 6e 20 22 75 6e 69 78 2d 65 78 63 6c   than "unix-excl
ea70: 22 20 6f 72 20 69 66 20 70 46 69 6c 65 20 69 73  " or if pFile is
ea80: 20 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69 78   opened on "unix
ea90: 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69 73  -excl".** and is
eaa0: 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a   read-only..**.*
eab0: 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  * Zero is return
eac0: 65 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20 63  ed if the call c
ead0: 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73 73  ompletes success
eae0: 66 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66 20  fully, or -1 if 
eaf0: 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63 6e  a call.** to fcn
eb00: 74 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e 20 74  tl() fails. In t
eb10: 68 69 73 20 63 61 73 65 2c 20 65 72 72 6e 6f 20  his case, errno 
eb20: 69 73 20 73 65 74 20 61 70 70 72 6f 70 72 69 61  is set appropria
eb30: 74 65 6c 79 20 28 62 79 20 66 63 6e 74 6c 28 29  tely (by fcntl()
eb40: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
eb50: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75 6e   unixFileLock(un
eb60: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73  ixFile *pFile, s
eb70: 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f  truct flock *pLo
eb80: 63 6b 2c 20 69 6e 74 20 6e 52 65 74 72 79 29 7b  ck, int nRetry){
eb90: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69  .  int rc;.  uni
eba0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
ebb0: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
ebc0: 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e  de;.  assert( un
ebd0: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
ebe0: 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64  .  assert( pInod
ebf0: 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28  e!=0 );.  if( ((
ec00: 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
ec10: 20 26 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c   & UNIXFILE_EXCL
ec20: 29 21 3d 30 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  )!=0 || pInode->
ec30: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 29 0a 20 20  bProcessLock).  
ec40: 20 26 26 20 28 28 70 46 69 6c 65 2d 3e 63 74 72   && ((pFile->ctr
ec50: 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
ec60: 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 29 0a 20 20  E_RDONLY)==0).  
ec70: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  ){.    if( pInod
ec80: 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
ec90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  =0 ){.      stru
eca0: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
ecb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
ecc0: 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b  ode->nLock==0 );
ecd0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  .      lock.l_wh
ece0: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
ecf0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
ed00: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
ed10: 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ST;.      lock.l
ed20: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
ed30: 5a 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ZE;.      lock.l
ed40: 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b  _type = F_WRLCK;
ed50: 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73 46 63  .      rc = osFc
ed60: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
ed70: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20  SETLK, &lock);. 
ed80: 20 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 20       if( rc<0 ) 
ed90: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
eda0: 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73   pInode->bProces
edb0: 73 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20  sLock = 1;.     
edc0: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
edd0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ede0: 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d     rc = 0;.    }
edf0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
ee00: 74 20 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20  t i = 0;        
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20                . 
ee20: 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63     do {.      rc
ee30: 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65   = osFcntl(pFile
ee40: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 70 4c  ->h, F_SETLK, pL
ee50: 6f 63 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ock);.      if( 
ee60: 72 63 20 26 26 20 6e 52 65 74 72 79 20 29 7b 0a  rc && nRetry ){.
ee70: 20 20 20 20 20 20 20 20 20 75 73 6c 65 65 70 28           usleep(
ee80: 31 30 30 20 2a 20 28 2b 2b 69 29 29 3b 0a 20 20  100 * (++i));.  
ee90: 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65      }.    }while
eea0: 28 20 21 72 63 20 26 26 20 6e 52 65 74 72 79 2d  ( !rc && nRetry-
eeb0: 2d 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  - );.  }.  retur
eec0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
eed0: 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
eee0: 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
eef0: 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
ef00: 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
ef10: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
ef20: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
ef30: 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
ef40: 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
ef50: 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
ef60: 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
ef70: 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
ef80: 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
ef90: 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
efa0: 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
efb0: 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
efc0: 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
efd0: 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
efe0: 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
eff0: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
f000: 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
f010: 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
f020: 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
f030: 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
f040: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
f050: 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
f060: 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
f070: 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
f080: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
f090: 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
f0a0: 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
f0b0: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
f0c0: 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
f0d0: 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
f0e0: 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
f0f0: 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
f100: 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
f110: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
f120: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
f130: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
f140: 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
f150: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
f160: 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
f170: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
f180: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
f190: 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
f1a0: 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
f1b0: 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
f1c0: 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
f1d0: 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
f1e0: 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
f1f0: 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b  tic int unixLock
f200: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
f210: 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
f220: 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ){.  /* The foll
f230: 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65 73 20  owing describes 
f240: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
f250: 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75  on of the variou
f260: 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a  s locks and.  **
f270: 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e   lock transition
f280: 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  s in terms of th
f290: 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  e POSIX advisory
f2a0: 20 73 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c   shared and excl
f2b0: 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20  usive.  ** lock 
f2c0: 70 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c  primitives (call
f2d0: 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e  ed read-locks an
f2e0: 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65  d write-locks be
f2f0: 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20  low, to avoid.  
f300: 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74  ** confusion wit
f310: 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61  h SQLite lock na
f320: 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69  mes). The algori
f330: 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63  thms are complic
f340: 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74  ated.  ** slight
f350: 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  ly in order to b
f360: 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  e compatible wit
f370: 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  h windows system
f380: 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79  s simultaneously
f390: 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20  .  ** accessing 
f3a0: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
f3b0: 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20  e file, in case 
f3c0: 74 68 61 74 20 69 73 20 65 76 65 72 20 72 65 71  that is ever req
f3d0: 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  uired..  **.  **
f3e0: 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64   Symbols defined
f3f0: 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69   in os.h indenti
f400: 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  fy the 'pending 
f410: 62 79 74 65 27 20 61 6e 64 20 74 68 65 20 27 72  byte' and the 'r
f420: 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74  eserved.  ** byt
f430: 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20  e', each single 
f440: 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e  bytes at well kn
f450: 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64  own offsets, and
f460: 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74   the 'shared byt
f470: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61  e.  ** range', a
f480: 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79   range of 510 by
f490: 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e  tes at a well kn
f4a0: 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a  own offset..  **
f4b0: 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20  .  ** To obtain 
f4c0: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61  a SHARED lock, a
f4d0: 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62   read-lock is ob
f4e0: 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70  tained on the 'p
f4f0: 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65  ending.  ** byte
f500: 27 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73  '.  If this is s
f510: 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72 61 6e  uccessful, a ran
f520: 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 74 68  dom byte from th
f530: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
f540: 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 72 65   ** range' is re
f550: 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68  ad-locked and th
f560: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70  e lock on the 'p
f570: 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65 6c  ending byte' rel
f580: 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  eased..  **.  **
f590: 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f   A process may o
f5a0: 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53  nly obtain a RES
f5b0: 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72  ERVED lock after
f5c0: 20 69 74 20 68 61 73 20 61 20 53 48 41 52 45 44   it has a SHARED
f5d0: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45   lock..  ** A RE
f5e0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69  SERVED lock is i
f5f0: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72  mplemented by gr
f600: 61 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  abbing a write-l
f610: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
f620: 27 72 65 73 65 72 76 65 64 20 62 79 74 65 27 2e  'reserved byte'.
f630: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72   .  **.  ** A pr
f640: 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f  ocess may only o
f650: 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20  btain a PENDING 
f660: 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61  lock after it ha
f670: 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a  s obtained a.  *
f680: 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41  * SHARED lock. A
f690: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
f6a0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
f6b0: 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74  obtaining a writ
f6c0: 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74  e-lock.  ** on t
f6d0: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
f6e0: 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  '. This ensures 
f6f0: 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52  that no new SHAR
f700: 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a  ED locks can be.
f710: 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62    ** obtained, b
f720: 75 74 20 65 78 69 73 74 69 6e 67 20 53 48 41 52  ut existing SHAR
f730: 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c  ED locks are all
f740: 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e  owed to persist.
f750: 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20   A process.  ** 
f760: 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
f770: 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   obtain a RESERV
f780: 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77  ED lock on the w
f790: 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20  ay to a PENDING 
f7a0: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20  lock..  ** This 
f7b0: 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64  property is used
f7c0: 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68   by the algorith
f7d0: 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  m for rolling ba
f7e0: 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ck a journal fil
f7f0: 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63  e.  ** after a c
f800: 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rash..  **.  ** 
f810: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  An EXCLUSIVE loc
f820: 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65  k, obtained afte
f830: 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  r a PENDING lock
f840: 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a   is held, is.  *
f850: 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  * implemented by
f860: 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69   obtaining a wri
f870: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65  te-lock on the e
f880: 6e 74 69 72 65 20 27 73 68 61 72 65 64 20 62 79  ntire 'shared by
f890: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20  te.  ** range'. 
f8a0: 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20  Since all other 
f8b0: 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61 20  locks require a 
f8c0: 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65  read-lock on one
f8d0: 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20 20   of the bytes.  
f8e0: 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 72  ** within this r
f8f0: 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72  ange, this ensur
f900: 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  es that no other
f910: 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20   locks are held 
f920: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
f930: 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  base. .  **.  **
f940: 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20 73 69   The reason a si
f950: 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f 74  ngle byte cannot
f960: 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64   be used instead
f970: 20 6f 66 20 74 68 65 20 27 73 68 61 72 65 64 20   of the 'shared 
f980: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
f990: 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20 76 65   is that some ve
f9a0: 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77  rsions of window
f9b0: 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  s do not support
f9c0: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a   read-locks. By.
f9d0: 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72    ** locking a r
f9e0: 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20  andom byte from 
f9f0: 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72  a range, concurr
fa00: 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  ent SHARED locks
fa10: 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a 2a 20   may exist.  ** 
fa20: 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b  even if the lock
fa30: 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20 75 73  ing primitive us
fa40: 65 64 20 69 73 20 61 6c 77 61 79 73 20 61 20 77  ed is always a w
fa50: 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a  rite-lock..  */.
fa60: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
fa70: 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
fa80: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
fa90: 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
faa0: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
fab0: 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
fac0: 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72   lock;.  int tEr
fad0: 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  rno = 0;..  asse
fae0: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
faf0: 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
fb00: 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73   %d %s was %s(%s
fb10: 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69  ,%d) pid=%d (uni
fb20: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
fb30: 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63  .      azFileLoc
fb40: 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a  k(eFileLock), az
fb50: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e  FileLock(pFile->
fb60: 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20  eFileLock),.    
fb70: 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69    azFileLock(pFi
fb80: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
fb90: 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e 70  eLock), pFile->p
fba0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a  Inode->nShared,.
fbb0: 20 20 20 20 20 20 6f 73 47 65 74 70 69 64 28 30        osGetpid(0
fbc0: 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  )));..  /* If th
fbd0: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
fbe0: 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
fbf0: 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
fc00: 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
fc10: 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20  ** unixFile, do 
fc20: 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
fc30: 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a  se the end_lock:
fc40: 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
fc50: 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74   ** unixEnterMut
fc60: 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
fc70: 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
fc80: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
fc90: 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c  FileLock>=eFileL
fca0: 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ock ){.    OSTRA
fcb0: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
fcc0: 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68  %s ok (already h
fcd0: 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20  eld) (unix)\n", 
fce0: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
fcf0: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
fd00: 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20  (eFileLock)));. 
fd10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fd20: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
fd30: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
fd40: 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
fd50: 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20   correct..  **  
fd60: 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76  (1) We never mov
fd70: 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20  e from unlocked 
fd80: 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68  to anything high
fd90: 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c  er than shared l
fda0: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53  ock..  **  (2) S
fdb0: 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c  QLite never expl
fdc0: 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20  icitly requests 
fdd0: 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20  a pendig lock.. 
fde0: 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65   **  (3) A share
fdf0: 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73  d lock is always
fe00: 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73   held when a res
fe10: 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71  erve lock is req
fe20: 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  uested..  */.  a
fe30: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
fe40: 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b  ileLock!=NO_LOCK
fe50: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   || eFileLock==S
fe60: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
fe70: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
fe80: 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k!=PENDING_LOCK 
fe90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
fea0: 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44  leLock!=RESERVED
feb0: 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
fec0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
fed0: 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  D_LOCK );..  /* 
fee0: 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65  This mutex is ne
fef0: 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69  eded because pFi
ff00: 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
ff10: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
ff20: 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ads.  */.  unixE
ff30: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
ff40: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
ff50: 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  Inode;..  /* If 
ff60: 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
ff70: 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61  g this PID has a
ff80: 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66   lock via a diff
ff90: 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a  erent unixFile*.
ffa0: 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74    ** handle that
ffb0: 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72   precludes the r
ffc0: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72  equested lock, r
ffd0: 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f  eturn BUSY..  */
ffe0: 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65  .  if( (pFile->e
fff0: 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65  FileLock!=pInode
10000 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a  ->eFileLock && .
10010 20 20 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64            (pInod
10020 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
10030 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46  NDING_LOCK || eF
10040 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
10050 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  OCK)).  ){.    r
10060 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
10070 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
10080 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ck;.  }..  /* If
10090 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
100a0 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64  s requested, and
100b0 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
100c0 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65  ng this PID alre
100d0 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53  ady.  ** has a S
100e0 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45  HARED or RESERVE
100f0 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63  D lock, then inc
10100 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  rement reference
10110 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a   counts and.  **
10120 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10130 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  K..  */.  if( eF
10140 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
10150 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28  LOCK && .      (
10160 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
10170 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
10180 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  | pInode->eFileL
10190 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
101a0 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  CK) ){.    asser
101b0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  t( eFileLock==SH
101c0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
101d0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
101e0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
101f0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
10200 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b  de->nShared>0 );
10210 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
10220 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
10230 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
10240 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20  >nShared++;.    
10250 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
10260 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
10270 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41  ck;.  }...  /* A
10280 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
10290 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61   needed before a
102a0 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
102b0 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72  D lock and befor
102c0 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67  e.  ** acquiring
102d0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
102e0 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41  ck.  For the SHA
102f0 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45  RED lock, the PE
10300 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20  NDING will.  ** 
10310 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  be released..  *
10320 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  /.  lock.l_len =
10330 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68   1L;.  lock.l_wh
10340 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
10350 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
10360 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20  ==SHARED_LOCK . 
10370 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f       || (eFileLo
10380 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
10390 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
103a0 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c  leLock<PENDING_L
103b0 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f  OCK).  ){.    lo
103c0 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46 69  ck.l_type = (eFi
103d0 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
103e0 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52  OCK?F_RDLCK:F_WR
103f0 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  LCK);.    lock.l
10400 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
10410 5f 42 59 54 45 3b 0a 20 20 20 20 69 66 28 20 75  _BYTE;.    if( u
10420 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
10430 65 2c 20 26 6c 6f 63 6b 2c 20 30 29 20 29 7b 0a  e, &lock, 0) ){.
10440 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
10450 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
10460 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
10470 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
10480 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
10490 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
104a0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
104b0 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  c) ){.        st
104c0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
104d0 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
104e0 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
104f0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  end_lock;.    }.
10500 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f    }...  /* If co
10510 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68  ntrol gets to th
10520 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61  is point, then a
10530 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64  ctually go ahead
10540 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f   and make.  ** o
10550 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
10560 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70  calls for the sp
10570 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20  ecified lock..  
10580 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
10590 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
105a0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
105b0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d  Inode->nShared==
105c0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
105d0 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
105e0 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ck==0 );.    ass
105f0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
10600 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f  OK );..    /* No
10610 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c  w get the read-l
10620 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e  ock */.    lock.
10630 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
10640 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b  _FIRST;.    lock
10650 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
10660 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20 75 6e  SIZE;.    if( un
10670 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
10680 2c 20 26 6c 6f 63 6b 2c 20 30 29 20 29 7b 0a 20  , &lock, 0) ){. 
10690 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
106a0 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
106b0 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
106c0 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
106d0 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
106e0 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OCK);.    }..   
106f0 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d   /* Drop the tem
10700 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c  porary PENDING l
10710 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e  ock */.    lock.
10720 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
10730 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  G_BYTE;.    lock
10740 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20  .l_len = 1L;.   
10750 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
10760 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20  _UNLCK;.    if( 
10770 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
10780 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 20 26  le, &lock, 10) &
10790 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
107a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
107b0 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69   could happen wi
107c0 74 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75  th a network mou
107d0 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74 45 72 72  nt */.      tErr
107e0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 20  no = errno;.#if 
107f0 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f  OSLOCKING_CHECK_
10800 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20  BUSY_IOERR.     
10810 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
10820 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
10830 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
10840 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 23  OERR_UNLOCK); .#
10850 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20  else.      rc = 
10860 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
10870 4f 43 4b 3b 20 0a 23 65 6e 64 69 66 0a 20 20 20  OCK; .#endif.   
10880 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 20 29   }..    if( rc )
10890 7b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c  {.      if( IS_L
108a0 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
108b0 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
108c0 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
108d0 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  Errno);.      }.
108e0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c        goto end_l
108f0 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ock;.    }else{.
10900 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
10910 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
10920 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  LOCK;.      pIno
10930 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
10940 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
10950 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
10960 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
10970 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
10980 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e  OCK && pInode->n
10990 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20  Shared>1 ){.    
109a0 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
109b0 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
109c0 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
109d0 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
109e0 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72  s.    ** same pr
109f0 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
10a00 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
10a10 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20  lock. */.    rc 
10a20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
10a30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
10a40 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66  he request was f
10a50 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  or a RESERVED or
10a60 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
10a70 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61    It is.    ** a
10a80 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72  ssumed that ther
10a90 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72  e is a SHARED or
10aa0 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
10ab0 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
10ac0 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
10ad0 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
10ae0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
10af0 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   );.    lock.l_t
10b00 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a  ype = F_WRLCK;..
10b10 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c      assert( eFil
10b20 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
10b30 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
10b40 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
10b50 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 65 46 69  K );.    if( eFi
10b60 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
10b70 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c  _LOCK ){.      l
10b80 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
10b90 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
10ba0 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
10bb0 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1L;.    }else{. 
10bc0 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
10bd0 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
10be0 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ;.      lock.l_l
10bf0 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
10c00 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
10c10 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
10c20 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 30 29 20 29  ile, &lock, 0) )
10c30 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  {.      tErrno =
10c40 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
10c50 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
10c60 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
10c70 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
10c80 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
10c90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55  f( rc!=SQLITE_BU
10ca0 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  SY ){.        st
10cb0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
10cc0 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
10cd0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
10ce0 20 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   ..#ifdef SQLITE
10cf0 5f 44 45 42 55 47 0a 20 20 2f 2a 20 53 65 74 20  _DEBUG.  /* Set 
10d00 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  up the transacti
10d10 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e 67  on-counter chang
10d20 65 20 63 68 65 63 6b 69 6e 67 20 66 6c 61 67 73  e checking flags
10d30 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73   when.  ** trans
10d40 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20  itioning from a 
10d50 53 48 41 52 45 44 20 74 6f 20 61 20 52 45 53 45  SHARED to a RESE
10d60 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20  RVED lock.  The 
10d70 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d  change.  ** from
10d80 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52   SHARED to RESER
10d90 56 45 44 20 6d 61 72 6b 73 20 74 68 65 20 62 65  VED marks the be
10da0 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72  ginning of a nor
10db0 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f  mal.  ** write o
10dc0 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20  peration (not a 
10dd0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot journal roll
10de0 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  back)..  */.  if
10df0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  ( rc==SQLITE_OK.
10e00 20 20 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69     && pFile->eFi
10e10 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
10e20 4f 43 4b 0a 20 20 20 26 26 20 65 46 69 6c 65 4c  OCK.   && eFileL
10e30 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
10e40 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46 69 6c  CK.  ){.    pFil
10e50 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  e->transCntrChng
10e60 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d   = 0;.    pFile-
10e70 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20  >dbUpdate = 0;. 
10e80 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d     pFile->inNorm
10e90 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d  alWrite = 1;.  }
10ea0 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20  .#endif...  if( 
10eb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10ec0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
10ed0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
10ee0 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  k;.    pInode->e
10ef0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
10f00 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Lock;.  }else if
10f10 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
10f20 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
10f30 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
10f40 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ock = PENDING_LO
10f50 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
10f60 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44  eFileLock = PEND
10f70 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65  ING_LOCK;.  }..e
10f80 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c  nd_lock:.  unixL
10f90 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
10fa0 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
10fb0 20 25 64 20 25 73 20 25 73 20 28 75 6e 69 78 29   %d %s %s (unix)
10fc0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61  \n", pFile->h, a
10fd0 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
10fe0 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 72 63 3d  ock), .      rc=
10ff0 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
11000 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
11010 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11020 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 66 69  /*.** Add the fi
11030 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 75 73  le descriptor us
11040 65 64 20 62 79 20 66 69 6c 65 20 68 61 6e 64 6c  ed by file handl
11050 65 20 70 46 69 6c 65 20 74 6f 20 74 68 65 20 63  e pFile to the c
11060 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
11070 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f  pUnused list..*/
11080 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
11090 50 65 6e 64 69 6e 67 46 64 28 75 6e 69 78 46 69  PendingFd(unixFi
110a0 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e  le *pFile){.  un
110b0 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
110c0 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
110d0 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65  ode;.  UnixUnuse
110e0 64 46 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e  dFd *p = pFile->
110f0 70 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70 4e  pUnused;.  p->pN
11100 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55  ext = pInode->pU
11110 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d  nused;.  pInode-
11120 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20  >pUnused = p;.  
11130 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  pFile->h = -1;. 
11140 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 20   pFile->pUnused 
11150 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  = 0;.}../*.** Lo
11160 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
11170 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
11180 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
11190 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
111a0 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
111b0 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
111c0 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
111d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
111e0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
111f0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
11200 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
11210 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
11220 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
11230 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
11240 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
11250 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68 61  op..** .** If ha
11260 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69 73  ndleNFSUnlock is
11270 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20 64   true, then on d
11280 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e 20 45 58  owngrading an EX
11290 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f 20  CLUSIVE_LOCK to 
112a0 53 48 41 52 45 44 0a 2a 2a 20 74 68 65 20 62 79  SHARED.** the by
112b0 74 65 20 72 61 6e 67 65 20 69 73 20 64 69 76 69  te range is divi
112c0 64 65 64 20 69 6e 74 6f 20 32 20 70 61 72 74 73  ded into 2 parts
112d0 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 70   and the first p
112e0 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20  art is unlocked 
112f0 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20 61  then.** set to a
11300 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65 6e   read lock, then
11310 20 74 68 65 20 6f 74 68 65 72 20 70 61 72 74 20   the other part 
11320 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b  is simply unlock
11330 65 64 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20  ed.  This works 
11340 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62 75 67  .** around a bug
11350 20 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63 6b   in BSD NFS lock
11360 64 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e 20  d (also seen on 
11370 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29 20 74 68  MacOSX 10.3+) th
11380 61 74 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a 20  at fails to .** 
11390 72 65 6d 6f 76 65 20 74 68 65 20 77 72 69 74 65  remove the write
113a0 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69 6f   lock on a regio
113b0 6e 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f  n when a read lo
113c0 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73 74  ck is set..*/.st
113d0 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 55 6e  atic int posixUn
113e0 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
113f0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
11400 4c 6f 63 6b 2c 20 69 6e 74 20 68 61 6e 64 6c 65  Lock, int handle
11410 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e  NFSUnlock){.  un
11420 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
11430 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
11440 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
11450 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74  pInode;.  struct
11460 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69   flock lock;.  i
11470 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
11480 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  K;..  assert( pF
11490 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
114a0 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  (("UNLOCK  %d %d
114b0 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70   was %d(%d,%d) p
114c0 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c  id=%d (unix)\n",
114d0 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
114e0 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46 69 6c  Lock,.      pFil
114f0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46  e->eFileLock, pF
11500 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
11510 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
11520 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a  Inode->nShared,.
11530 20 20 20 20 20 20 6f 73 47 65 74 70 69 64 28 30        osGetpid(0
11540 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )));..  assert( 
11550 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
11560 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  D_LOCK );.  if( 
11570 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
11580 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  <=eFileLock ){. 
11590 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
115a0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45  _OK;.  }.  unixE
115b0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
115c0 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
115d0 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
115e0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
115f0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
11600 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
11610 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
11620 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
11630 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c  >eFileLock==pFil
11640 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
11650 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
11660 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e  EBUG.    /* When
11670 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b   reducing a lock
11680 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72   such that other
11690 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73   processes can s
116a0 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64  tart.    ** read
116b0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
116c0 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b   file again, mak
116d0 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a  e sure that the.
116e0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
116f0 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75  on counter was u
11700 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61  pdated if any pa
11710 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
11720 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  se.    ** file c
11730 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20  hanged.  If the 
11740 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
11750 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74  ter is not updat
11760 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  ed,.    ** other
11770 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20   connections to 
11780 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69  the same file mi
11790 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20  ght not realize 
117a0 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
117b0 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64  file has changed
117c0 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74   and hence might
117d0 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75   not know to flu
117e0 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20  sh their.    ** 
117f0 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20  cache.  The use 
11800 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65  of a stale cache
11810 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
11820 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
11830 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 46 69  ..    */.    pFi
11840 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
11850 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  e = 0;.#endif.. 
11860 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e     /* downgradin
11870 67 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f  g to a shared lo
11880 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76  ck on NFS involv
11890 65 73 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  es clearing the 
118a0 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a  write lock.    *
118b0 2a 20 62 65 66 6f 72 65 20 65 73 74 61 62 6c 69  * before establi
118c0 73 68 69 6e 67 20 74 68 65 20 72 65 61 64 6c 6f  shing the readlo
118d0 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20  ck - to avoid a 
118e0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77  race condition w
118f0 65 20 64 6f 77 6e 67 72 61 64 65 0a 20 20 20 20  e downgrade.    
11900 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32  ** the lock in 2
11910 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74   blocks, so that
11920 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e   part of the ran
11930 67 65 20 77 69 6c 6c 20 62 65 20 63 6f 76 65 72  ge will be cover
11940 65 64 20 62 79 20 61 20 0a 20 20 20 20 2a 2a 20  ed by a .    ** 
11950 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c  write lock until
11960 20 74 68 65 20 72 65 73 74 20 69 73 20 63 6f 76   the rest is cov
11970 65 72 65 64 20 62 79 20 61 20 72 65 61 64 20 6c  ered by a read l
11980 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20  ock:.    **  1: 
11990 20 20 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a    [WWWWW].    **
119a0 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20    2:   [....W]. 
119b0 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52     **  3:   [RRR
119c0 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20  RW].    **  4:  
119d0 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a   [RRRR.].    */.
119e0 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63      if( eFileLoc
119f0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
11a00 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f  {.#if !defined(_
11a10 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53 51  _APPLE__) || !SQ
11a20 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
11a30 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20  ING_STYLE.      
11a40 28 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53 55  (void)handleNFSU
11a50 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73  nlock;.      ass
11a60 65 72 74 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e  ert( handleNFSUn
11a70 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  lock==0 );.#endi
11a80 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  f.#if defined(__
11a90 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
11aa0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
11ab0 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69 66  G_STYLE.      if
11ac0 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  ( handleNFSUnloc
11ad0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  k ){.        int
11ae0 20 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20   tErrno;        
11af0 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
11b00 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65 6d  code from system
11b10 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a   call errors */.
11b20 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 64 69          off_t di
11b30 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44 5f 53  vSize = SHARED_S
11b40 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  IZE - 1;.       
11b50 20 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   .        lock.l
11b60 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
11b70 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
11b80 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
11b90 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
11ba0 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
11bb0 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20  _FIRST;.        
11bc0 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76  lock.l_len = div
11bd0 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
11be0 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
11bf0 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29  File, &lock, 10)
11c00 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
11c10 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
11c20 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e  no;.#if OSLOCKIN
11c30 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45  G_CHECK_BUSY_IOE
11c40 52 52 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  RR.          rc 
11c50 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
11c60 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
11c70 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
11c80 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65 0a  _UNLOCK);.#else.
11c90 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
11ca0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
11cb0 43 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  CK;.#endif.     
11cc0 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
11cd0 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
11ce0 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c            storeL
11cf0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
11d00 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20  tErrno);.       
11d10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67     }.          g
11d20 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
11d30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11d40 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
11d50 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_RDLCK;.       
11d60 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
11d70 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
11d80 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
11d90 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
11da0 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
11db0 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20  en = divSize;.  
11dc0 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69        if( unixFi
11dd0 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
11de0 6f 63 6b 2c 20 31 30 29 3d 3d 28 2d 31 29 20 29  ock, 10)==(-1) )
11df0 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72  {.          tErr
11e00 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 20  no = errno;.#if 
11e10 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f  OSLOCKING_CHECK_
11e20 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20  BUSY_IOERR.     
11e30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11e40 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
11e50 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
11e60 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29  TE_IOERR_RDLOCK)
11e70 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20  ;.#else.        
11e80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
11e90 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64  ERR_UNLOCK;.#end
11ea0 69 66 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  if.          if(
11eb0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
11ec0 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
11ed0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
11ee0 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
11ef0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
11f00 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
11f10 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
11f20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  }.        lock.l
11f30 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
11f40 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
11f50 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
11f60 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
11f70 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
11f80 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65 3b 0a  _FIRST+divSize;.
11f90 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
11fa0 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
11fb0 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20  -divSize;.      
11fc0 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
11fd0 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c  ck(pFile, &lock,
11fe0 20 31 30 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20   10)==(-1) ){.  
11ff0 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d          tErrno =
12000 20 65 72 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f   errno;.#if OSLO
12010 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59  CKING_CHECK_BUSY
12020 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20  _IOERR.         
12030 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
12040 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
12050 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
12060 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65  OERR_UNLOCK);.#e
12070 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 72 63  lse.          rc
12080 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
12090 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a 20  UNLOCK;.#endif. 
120a0 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f           if( IS_
120b0 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
120c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  {.            st
120d0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
120e0 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
120f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12100 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
12110 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
12120 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
12130 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
12140 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
12150 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
12160 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20 20 20 7b  STYLE */.      {
12170 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
12180 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
12190 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77          lock.l_w
121a0 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
121b0 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
121c0 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
121d0 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c  FIRST;.        l
121e0 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
121f0 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  ED_SIZE;.       
12200 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
12210 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20  k(pFile, &lock, 
12220 31 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  10) ){.         
12230 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
12240 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49  rno;.#if OSLOCKI
12250 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f  NG_CHECK_BUSY_IO
12260 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 72 63  ERR.          rc
12270 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
12280 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
12290 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
122a0 52 5f 52 44 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65  R_RDLOCK);.#else
122b0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  .          /* In
122c0 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63 61 6c   theory, the cal
122d0 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c 6f 63  l to unixFileLoc
122e0 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  k() cannot fail 
122f0 62 65 63 61 75 73 65 20 61 6e 6f 74 68 65 72 0a  because another.
12300 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
12310 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
12320 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
12330 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f 65 73  lock. If it does
12340 2c 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  , this .        
12350 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 74    ** indicates t
12360 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 70 72  hat the other pr
12370 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c  ocess is not fol
12380 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69  lowing the locki
12390 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
123a0 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74 68 69  protocol. If thi
123b0 73 20 68 61 70 70 65 6e 73 2c 20 72 65 74 75 72  s happens, retur
123c0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  n SQLITE_IOERR_R
123d0 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69 6e 67  DLOCK. Returning
123e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51  .          ** SQ
123f0 4c 49 54 45 5f 42 55 53 59 20 77 6f 75 6c 64 20  LITE_BUSY would 
12400 63 6f 6e 66 75 73 65 20 74 68 65 20 75 70 70 65  confuse the uppe
12410 72 20 6c 61 79 65 72 20 28 69 6e 20 70 72 61 63  r layer (in prac
12420 74 69 63 65 20 69 74 20 63 61 75 73 65 73 20 0a  tice it causes .
12430 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20            ** an 
12440 61 73 73 65 72 74 20 74 6f 20 66 61 69 6c 29 2e  assert to fail).
12450 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 72   */ .          r
12460 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
12470 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _RDLOCK;.       
12480 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
12490 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
124a0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
124b0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
124c0 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
124d0 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
124e0 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
124f0 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  rrno);.         
12500 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74   }.          got
12510 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
12520 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12530 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c      }.    lock.l
12540 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
12550 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  .    lock.l_when
12560 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
12570 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
12580 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
12590 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
125a0 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45   2L;  assert( PE
125b0 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45  NDING_BYTE+1==RE
125c0 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20  SERVED_BYTE );. 
125d0 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
125e0 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
125f0 2c 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 10)==0 ){.    
12600 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
12610 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
12620 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69  K;.    }else{.#i
12630 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43  f OSLOCKING_CHEC
12640 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20  K_BUSY_IOERR.   
12650 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
12660 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
12670 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
12680 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
12690 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
126a0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
126b0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
126c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  ) ){.        sto
126d0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
126e0 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
126f0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20    }.#else.      
12700 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
12710 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
12720 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
12730 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 23 65  File, errno);.#e
12740 6e 64 69 66 0a 20 20 20 20 20 20 67 6f 74 6f 20  ndif.      goto 
12750 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
12760 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 46 69 6c  }.  }.  if( eFil
12770 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29  eLock==NO_LOCK )
12780 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  {.    /* Decreme
12790 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  nt the shared lo
127a0 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c  ck counter.  Rel
127b0 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73  ease the lock us
127c0 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53  ing an.    ** OS
127d0 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20   call only when 
127e0 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74  all threads in t
127f0 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73  his same process
12800 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20   have released. 
12810 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a     ** the lock..
12820 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64      */.    pInod
12830 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20  e->nShared--;.  
12840 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53    if( pInode->nS
12850 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  hared==0 ){.    
12860 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
12870 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c  F_UNLCK;.      l
12880 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
12890 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c  EEK_SET;.      l
128a0 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f  ock.l_start = lo
128b0 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20  ck.l_len = 0L;. 
128c0 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
128d0 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
128e0 63 6b 2c 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20  ck, 10)==0 ){.  
128f0 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
12900 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
12910 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
12920 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48  #if OSLOCKING_CH
12930 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20  ECK_BUSY_IOERR. 
12940 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
12950 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
12960 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
12970 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
12980 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
12990 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
129a0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
129b0 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
129c0 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
129d0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
129e0 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rno);.        }.
129f0 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 72 63  #else.        rc
12a00 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
12a10 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  UNLOCK;.        
12a20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
12a30 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 23 65  File, errno);.#e
12a40 6e 64 69 66 0a 20 20 20 20 20 20 20 20 70 49 6e  ndif.        pIn
12a50 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
12a60 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
12a70 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
12a80 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
12a90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
12aa0 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
12ab0 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b 73  e count of locks
12ac0 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 73 61   against this sa
12ad0 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20 74  me file.  When t
12ae0 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20  he.    ** count 
12af0 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63 6c  reaches zero, cl
12b00 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66 69  ose any other fi
12b10 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 77  le descriptors w
12b20 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20 2a  hose close.    *
12b30 2a 20 77 61 73 20 64 65 66 65 72 72 65 64 20 62  * was deferred b
12b40 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74 61  ecause of outsta
12b50 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20 20  nding locks..   
12b60 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e   */.    pInode->
12b70 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73 73  nLock--;.    ass
12b80 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ert( pInode->nLo
12b90 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ck>=0 );.    if(
12ba0 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d   pInode->nLock==
12bb0 30 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65  0 ){.      close
12bc0 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65  PendingFds(pFile
12bd0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 65 6e  );.    }.  }..en
12be0 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78  d_unlock:.  unix
12bf0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
12c00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
12c10 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  K ) pFile->eFile
12c20 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
12c30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
12c40 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
12c50 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
12c60 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
12c70 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
12c80 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
12c90 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
12ca0 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
12cb0 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
12cc0 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
12cd0 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
12ce0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
12cf0 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
12d00 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
12d10 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
12d20 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
12d30 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
12d40 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
12d50 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
12d60 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
12d70 6c 65 4c 6f 63 6b 29 7b 0a 23 69 66 20 53 51 4c  leLock){.#if SQL
12d80 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
12d90 45 3e 30 0a 20 20 61 73 73 65 72 74 28 20 65 46  E>0.  assert( eF
12da0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
12db0 4c 4f 43 4b 20 7c 7c 20 28 28 75 6e 69 78 46 69  LOCK || ((unixFi
12dc0 6c 65 20 2a 29 69 64 29 2d 3e 6e 46 65 74 63 68  le *)id)->nFetch
12dd0 4f 75 74 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66  Out==0 );.#endif
12de0 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55  .  return posixU
12df0 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c  nlock(id, eFileL
12e00 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 20  ock, 0);.}..#if 
12e10 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
12e20 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69 6e  SIZE>0.static in
12e30 74 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 75 6e  t unixMapfile(un
12e40 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 69 36 34  ixFile *pFd, i64
12e50 20 6e 42 79 74 65 29 3b 0a 73 74 61 74 69 63 20   nByte);.static 
12e60 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61 70 66 69  void unixUnmapfi
12e70 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  le(unixFile *pFd
12e80 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  );.#endif../*.**
12e90 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70   This function p
12ea0 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72 74  erforms the part
12eb0 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65 20  s of the "close 
12ec0 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e 20  file" operation 
12ed0 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c  .** common to al
12ee0 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65  l locking scheme
12ef0 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68 65  s. It closes the
12f00 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 66   directory and f
12f10 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c 20  ile.** handles, 
12f20 69 66 20 74 68 65 79 20 61 72 65 20 76 61 6c 69  if they are vali
12f30 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c 20  d, and sets all 
12f40 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75 6e  fields of the un
12f50 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  ixFile.** struct
12f60 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20  ure to 0..**.** 
12f70 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63 65  It is *not* nece
12f80 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  ssary to hold th
12f90 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68 69  e mutex when thi
12fa0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
12fb0 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20  led,.** even on 
12fc0 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74 65  VxWorks.  A mute
12fd0 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69 72  x will be acquir
12fe0 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62 79  ed on VxWorks by
12ff0 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73 52   the.** vxworksR
13000 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20 72  eleaseFileId() r
13010 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  outine..*/.stati
13020 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78 46  c int closeUnixF
13030 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ile(sqlite3_file
13040 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c   *id){.  unixFil
13050 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
13060 46 69 6c 65 2a 29 69 64 3b 0a 23 69 66 20 53 51  File*)id;.#if SQ
13070 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
13080 5a 45 3e 30 0a 20 20 75 6e 69 78 55 6e 6d 61 70  ZE>0.  unixUnmap
13090 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 23 65 6e  file(pFile);.#en
130a0 64 69 66 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  dif.  if( pFile-
130b0 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 72 6f 62  >h>=0 ){.    rob
130c0 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
130d0 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e   pFile->h, __LIN
130e0 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  E__);.    pFile-
130f0 3e 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 69 66  >h = -1;.  }.#if
13100 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66   OS_VXWORKS.  if
13110 28 20 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a  ( pFile->pId ){.
13120 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63      if( pFile->c
13130 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
13140 49 4c 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  ILE_DELETE ){.  
13150 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 46 69      osUnlink(pFi
13160 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69  le->pId->zCanoni
13170 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  calName);.    }.
13180 20 20 20 20 76 78 77 6f 72 6b 73 52 65 6c 65 61      vxworksRelea
13190 73 65 46 69 6c 65 49 64 28 70 46 69 6c 65 2d 3e  seFileId(pFile->
131a0 70 49 64 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  pId);.    pFile-
131b0 3e 70 49 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  >pId = 0;.  }.#e
131c0 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
131d0 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54 45 52 5f  TE_UNLINK_AFTER_
131e0 43 4c 4f 53 45 0a 20 20 69 66 28 20 70 46 69 6c  CLOSE.  if( pFil
131f0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
13200 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 29  NIXFILE_DELETE )
13210 7b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70  {.    osUnlink(p
13220 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
13230 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 2a    sqlite3_free(*
13240 28 63 68 61 72 2a 2a 29 26 70 46 69 6c 65 2d 3e  (char**)&pFile->
13250 7a 50 61 74 68 29 3b 0a 20 20 20 20 70 46 69 6c  zPath);.    pFil
13260 65 2d 3e 7a 50 61 74 68 20 3d 20 30 3b 0a 20 20  e->zPath = 0;.  
13270 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41  }.#endif.  OSTRA
13280 43 45 28 28 22 43 4c 4f 53 45 20 20 20 25 2d 33  CE(("CLOSE   %-3
13290 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  d\n", pFile->h))
132a0 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  ;.  OpenCounter(
132b0 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  -1);.  sqlite3_f
132c0 72 65 65 28 70 46 69 6c 65 2d 3e 70 55 6e 75 73  ree(pFile->pUnus
132d0 65 64 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46  ed);.  memset(pF
132e0 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  ile, 0, sizeof(u
132f0 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 72 65 74  nixFile));.  ret
13300 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13310 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
13320 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
13330 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73 71  int unixClose(sq
13340 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
13350 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13360 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
13370 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
13380 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 76 65 72  File *)id;.  ver
13390 69 66 79 44 62 46 69 6c 65 28 70 46 69 6c 65 29  ifyDbFile(pFile)
133a0 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69  ;.  unixUnlock(i
133b0 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75  d, NO_LOCK);.  u
133c0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
133d0 0a 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 2e  ..  /* unixFile.
133e0 70 49 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73  pInode is always
133f0 20 76 61 6c 69 64 20 68 65 72 65 2e 20 4f 74 68   valid here. Oth
13400 65 72 77 69 73 65 2c 20 61 20 64 69 66 66 65 72  erwise, a differ
13410 65 6e 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20 72  ent close.  ** r
13420 6f 75 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c  outine (e.g. nol
13430 6f 63 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75 6c  ockClose()) woul
13440 64 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74  d be called inst
13450 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ead..  */.  asse
13460 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  rt( pFile->pInod
13470 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46  e->nLock>0 || pF
13480 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  ile->pInode->bPr
13490 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  ocessLock==0 );.
134a0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 46 69    if( ALWAYS(pFi
134b0 6c 65 2d 3e 70 49 6e 6f 64 65 29 20 26 26 20 70  le->pInode) && p
134c0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c  File->pInode->nL
134d0 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ock ){.    /* If
134e0 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
134f0 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f  anding locks, do
13500 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c   not actually cl
13510 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73  ose the file jus
13520 74 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63  t.    ** yet bec
13530 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20  ause that would 
13540 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b  clear those lock
13550 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64  s.  Instead, add
13560 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
13570 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70   descriptor to p
13580 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 6c  Inode->pUnused l
13590 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65  ist.  It will be
135a0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
135b0 6c 6f 73 65 64 20 0a 20 20 20 20 2a 2a 20 77 68  losed .    ** wh
135c0 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b  en the last lock
135d0 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20   is cleared..   
135e0 20 2a 2f 0a 20 20 20 20 73 65 74 50 65 6e 64 69   */.    setPendi
135f0 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 7d  ngFd(pFile);.  }
13600 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49  .  releaseInodeI
13610 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72 63  nfo(pFile);.  rc
13620 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65   = closeUnixFile
13630 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76  (id);.  unixLeav
13640 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
13650 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  rn rc;.}../*****
13660 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
13670 20 74 68 65 20 70 6f 73 69 78 20 61 64 76 69 73   the posix advis
13680 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ory lock impleme
13690 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
136a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
136b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
136c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
136d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
136e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
136f0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 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 2a 2a 2a 2a 2a 2a 2a  ****************
13740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 20 4e 6f 2d 6f 70 20  ********* No-op 
13770 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
13780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
137a0 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20   Of the various 
137b0 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  locking implemen
137c0 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c  tations availabl
137d0 65 2c 20 74 68 69 73 20 69 73 20 62 79 20 66 61  e, this is by fa
137e0 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73  r the.** simples
137f0 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69  t:  locking is i
13800 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74 65  gnored.  No atte
13810 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6c  mpt is made to l
13820 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
13830 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72 65 61  .** file for rea
13840 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e  ding or writing.
13850 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b  .**.** This lock
13860 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70 70 72  ing mode is appr
13870 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73 65 20  opriate for use 
13880 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74  on read-only dat
13890 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64  abases.** (ex: d
138a0 61 74 61 62 61 73 65 73 20 74 68 61 74 20 61 72  atabases that ar
138b0 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20 43 44  e burned into CD
138c0 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c  -ROM, for exampl
138d0 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61  e.)  It can.** a
138e0 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66 20 74  lso be used if t
138f0 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 65  he application e
13900 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74 65  mploys some exte
13910 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74  rnal mechanism t
13920 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73 69 6d  o.** prevent sim
13930 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65 73 73  ultaneous access
13940 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64 61 74   of the same dat
13950 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f 72 20  abase by two or 
13960 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61 73 65  more.** database
13970 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42   connections.  B
13980 75 74 20 74 68 65 72 65 20 69 73 20 61 20 73 65  ut there is a se
13990 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20 64 61  rious risk of da
139a0 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70  tabase.** corrup
139b0 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f 63  tion if this loc
139c0 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65  king mode is use
139d0 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e 73 20  d in situations 
139e0 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a  where multiple.*
139f0 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
13a00 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63 65 73  ctions are acces
13a10 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61  sing the same da
13a20 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74  tabase file at t
13a30 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20  he same.** time 
13a40 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  and one or more 
13a50 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74  of those connect
13a60 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69 6e 67  ions are writing
13a70 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  ..*/..static int
13a80 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65   nolockCheckRese
13a90 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
13aa0 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20  _file *NotUsed, 
13ab0 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
13ac0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
13ad0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70  R(NotUsed);.  *p
13ae0 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65  ResOut = 0;.  re
13af0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13b00 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  }.static int nol
13b10 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
13b20 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69  file *NotUsed, i
13b30 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  nt NotUsed2){.  
13b40 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
13b50 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
13b60 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ed2);.  return S
13b70 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74  QLITE_OK;.}.stat
13b80 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c  ic int nolockUnl
13b90 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
13ba0 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e   *NotUsed, int N
13bb0 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
13bc0 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
13bd0 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
13be0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
13bf0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
13c00 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a  lose the file..*
13c10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  /.static int nol
13c20 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  ockClose(sqlite3
13c30 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
13c40 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
13c50 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
13c60 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
13c70 20 2a 29 69 64 3b 0a 20 20 75 6e 69 78 45 6e 74   *)id;.  unixEnt
13c80 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 0a 20 20  erMutex();.  .  
13c90 2f 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f  /* unixFile.pIno
13ca0 64 65 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c  de is always val
13cb0 69 64 20 68 65 72 65 2e 20 4f 74 68 65 72 77 69  id here. Otherwi
13cc0 73 65 2c 20 61 20 64 69 66 66 65 72 65 6e 74 20  se, a different 
13cd0 63 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69  close.  ** routi
13ce0 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43  ne (e.g. nolockC
13cf0 6c 6f 73 65 28 29 29 20 77 6f 75 6c 64 20 62 65  lose()) would be
13d00 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e   called instead.
13d10 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
13d20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
13d30 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d  Lock>0 || pFile-
13d40 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
13d50 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 69 66  sLock==0 );.  if
13d60 28 20 41 4c 57 41 59 53 28 70 46 69 6c 65 2d 3e  ( ALWAYS(pFile->
13d70 70 49 6e 6f 64 65 29 20 26 26 20 70 46 69 6c 65  pInode) && pFile
13d80 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20  ->pInode->nLock 
13d90 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
13da0 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
13db0 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74  ng locks, do not
13dc0 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20   actually close 
13dd0 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20  the file just.  
13de0 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65    ** yet because
13df0 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61   that would clea
13e00 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20  r those locks.  
13e10 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65  Instead, add the
13e20 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73   file.    ** des
13e30 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64  criptor to pInod
13e40 65 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e  e->pUnused list.
13e50 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74    It will be aut
13e60 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65  omatically close
13e70 64 20 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 74  d .    ** when t
13e80 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20  he last lock is 
13e90 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  cleared..    */.
13ea0 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64      setPendingFd
13eb0 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72  (pFile);.  }.  r
13ec0 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28  eleaseInodeInfo(
13ed0 70 46 69 6c 65 29 3b 0a 20 20 72 63 20 3d 20 63  pFile);.  rc = c
13ee0 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
13ef0 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
13f00 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ex();.  return r
13f10 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  c;.}../*********
13f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
13f30 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b  f the no-op lock
13f40 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
13f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f60 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
13f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13fb0 2a 2a 2a 2a 2f 0a 0a 2f 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14000 2a 2a 2a 2a 2a 2a 0a 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 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20   Begin dot-file 
14030 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
14040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14050 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  ******.**.** The
14060 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
14070 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
14080 75 73 65 73 20 74 68 65 20 65 78 69 73 74 65 6e  uses the existen
14090 63 65 20 6f 66 20 73 65 70 61 72 61 74 65 20 6c  ce of separate l
140a0 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 28 72 65  ock.** files (re
140b0 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79  ally a directory
140c0 29 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63  ) to control acc
140d0 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ess to the datab
140e0 61 73 65 2e 20 20 54 68 69 73 20 77 6f 72 6b 73  ase.  This works
140f0 0a 2a 2a 20 6f 6e 20 6a 75 73 74 20 61 62 6f 75  .** on just abou
14100 74 20 65 76 65 72 79 20 66 69 6c 65 73 79 73 74  t every filesyst
14110 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20 20  em imaginable.  
14120 42 75 74 20 74 68 65 72 65 20 61 72 65 20 73 65  But there are se
14130 72 69 6f 75 73 20 64 6f 77 6e 73 69 64 65 73 3a  rious downsides:
14140 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54  .**.**    (1)  T
14150 68 65 72 65 20 69 73 20 7a 65 72 6f 20 63 6f 6e  here is zero con
14160 63 75 72 72 65 6e 63 79 2e 20 20 41 20 73 69 6e  currency.  A sin
14170 67 6c 65 20 72 65 61 64 65 72 20 62 6c 6f 63 6b  gle reader block
14180 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 20  s all other.**  
14190 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f         connectio
141a0 6e 73 20 66 72 6f 6d 20 72 65 61 64 69 6e 67 20  ns from reading 
141b0 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  or writing the d
141c0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20  atabase..**.**  
141d0 20 20 28 32 29 20 20 41 6e 20 61 70 70 6c 69 63    (2)  An applic
141e0 61 74 69 6f 6e 20 63 72 61 73 68 20 6f 72 20 70  ation crash or p
141f0 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c 65  ower loss can le
14200 61 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 66  ave stale lock f
14210 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  iles.**         
14220 73 69 74 74 69 6e 67 20 61 72 6f 75 6e 64 20 74  sitting around t
14230 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63  hat need to be c
14240 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79 2e  leared manually.
14250 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65 6c  .**.** Neverthel
14260 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20 69  ess, a dotlock i
14270 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  s an appropriate
14280 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66 6f   locking mode fo
14290 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f  r use if no.** o
142a0 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74 72  ther locking str
142b0 61 74 65 67 79 20 69 73 20 61 76 61 69 6c 61 62  ategy is availab
142c0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c  le..**.** Dotfil
142d0 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 20  e locking works 
142e0 62 79 20 63 72 65 61 74 69 6e 67 20 61 20 73 75  by creating a su
142f0 62 64 69 72 65 63 74 6f 72 79 20 69 6e 20 74 68  bdirectory in th
14300 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
14310 20 61 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   as.** the datab
14320 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68 65  ase and with the
14330 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20 77   same name but w
14340 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78  ith a ".lock" ex
14350 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a  tension added..*
14360 2a 20 54 68 65 20 65 78 69 73 74 65 6e 63 65 20  * The existence 
14370 6f 66 20 61 20 6c 6f 63 6b 20 64 69 72 65 63 74  of a lock direct
14380 6f 72 79 20 69 6d 70 6c 69 65 73 20 61 6e 20 45  ory implies an E
14390 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
143a0 41 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 6c 6f 63  All other.** loc
143b0 6b 20 74 79 70 65 73 20 28 53 48 41 52 45 44 2c  k types (SHARED,
143c0 20 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44 49   RESERVED, PENDI
143d0 4e 47 29 20 61 72 65 20 6d 61 70 70 65 64 20 69  NG) are mapped i
143e0 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a  nto EXCLUSIVE..*
143f0 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 6c  /../*.** The fil
14400 65 20 73 75 66 66 69 78 20 61 64 64 65 64 20 74  e suffix added t
14410 6f 20 74 68 65 20 64 61 74 61 20 62 61 73 65 20  o the data base 
14420 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64 65  filename in orde
14430 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a  r to create the.
14440 2a 2a 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72  ** lock director
14450 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4f  y..*/.#define DO
14460 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e 6c  TLOCK_SUFFIX ".l
14470 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ock"../*.** This
14480 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
14490 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
144a0 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
144b0 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
144c0 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
144d0 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
144e0 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
144f0 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
14500 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
14510 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
14520 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
14530 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
14540 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
14550 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
14560 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
14570 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
14580 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
14590 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
145a0 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69 6c  .**.** In dotfil
145b0 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68 65  e locking, eithe
145c0 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73 20  r a lock exists 
145d0 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 20  or it does not. 
145e0 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20 76   So in this.** v
145f0 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65 63  ariation of Chec
14600 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 2c  kReservedLock(),
14610 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
14620 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79 20   to true if any 
14630 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64 20  lock.** is held 
14640 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  on the file and 
14650 66 61 6c 73 65 20 69 66 20 74 68 65 20 66 69 6c  false if the fil
14660 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a  e is unlocked..*
14670 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
14680 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
14690 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
146a0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
146b0 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63  sOut) {.  int rc
146c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
146d0 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
146e0 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
146f0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
14700 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
14710 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
14720 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
14730 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
14740 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
14750 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43  pFile );..  /* C
14760 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
14770 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
14780 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
14790 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
147a0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
147b0 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
147c0 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73 20 63  /* Either this c
147d0 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f 6d  onnection or som
147e0 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  e other connecti
147f0 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70  on in the same p
14800 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 68 6f  rocess.    ** ho
14810 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  lds a lock on th
14820 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 65 64  e file.  No need
14830 20 74 6f 20 63 68 65 63 6b 20 66 75 72 74 68 65   to check furthe
14840 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65 72 76  r. */.    reserv
14850 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ed = 1;.  }else{
14860 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b  .    /* The lock
14870 20 69 73 20 68 65 6c 64 20 69 66 20 61 6e 64 20   is held if and 
14880 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b  only if the lock
14890 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20  file exists */. 
148a0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
148b0 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f 6e 73  LockFile = (cons
148c0 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c  t char*)pFile->l
148d0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
148e0 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 6f 73     reserved = os
148f0 41 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69 6c 65  Access(zLockFile
14900 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20 4f  , 0)==0;.  }.  O
14910 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
14920 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
14930 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69  dotlock)\n", pFi
14940 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
14950 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73 4f 75  ved));.  *pResOu
14960 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
14970 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
14980 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
14990 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
149a0 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
149b0 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
149c0 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
149d0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
149e0 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
149f0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
14a00 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
14a10 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
14a20 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
14a30 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
14a40 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
14a50 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
14a60 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
14a70 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
14a80 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
14a90 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
14aa0 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
14ab0 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
14ac0 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
14ad0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
14ae0 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
14af0 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
14b00 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
14b10 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
14b20 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
14b30 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
14b40 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
14b50 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
14b60 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
14b70 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
14b80 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
14b90 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
14ba0 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
14bb0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
14bc0 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
14bd0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
14be0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
14bf0 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
14c00 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
14c10 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
14c20 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
14c30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
14c40 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
14c50 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
14c60 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
14c70 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
14c80 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
14c90 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
14ca0 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66 69 6c  *.** With dotfil
14cb0 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72 65  e locking, we re
14cc0 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72  ally only suppor
14cd0 74 20 73 74 61 74 65 20 28 34 29 3a 20 45 58 43  t state (4): EXC
14ce0 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20 77  LUSIVE..** But w
14cf0 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74 68 65  e track the othe
14d00 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73  r locking levels
14d10 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a   internally..*/.
14d20 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
14d30 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ckLock(sqlite3_f
14d40 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
14d50 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
14d60 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
14d70 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63  nixFile*)id;.  c
14d80 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
14d90 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
14da0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
14db0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14dc0 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20  E_OK;...  /* If 
14dd0 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b  we have any lock
14de0 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20  , then the lock 
14df0 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  file already exi
14e00 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76  sts.  All we hav
14e10 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20  e.  ** to do is 
14e20 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72  adjust our inter
14e30 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
14e40 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20  e lock level..  
14e50 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
14e60 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
14e70 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
14e80 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
14e90 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20  ileLock;.    /* 
14ea0 41 6c 77 61 79 73 20 75 70 64 61 74 65 20 74 68  Always update th
14eb0 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74  e timestamp on t
14ec0 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 23  he old file */.#
14ed0 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45  ifdef HAVE_UTIME
14ee0 0a 20 20 20 20 75 74 69 6d 65 28 7a 4c 6f 63 6b  .    utime(zLock
14ef0 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c  File, NULL);.#el
14f00 73 65 0a 20 20 20 20 75 74 69 6d 65 73 28 7a 4c  se.    utimes(zL
14f10 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a  ockFile, NULL);.
14f20 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
14f30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
14f40 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e  .  .  /* grab an
14f50 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
14f60 2a 2f 0a 20 20 72 63 20 3d 20 6f 73 4d 6b 64 69  */.  rc = osMkdi
14f70 72 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 37 37  r(zLockFile, 077
14f80 37 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 29  7);.  if( rc<0 )
14f90 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20  {.    /* failed 
14fa0 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74  to open/create t
14fb0 68 65 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72  he lock director
14fc0 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45 72  y */.    int tEr
14fd0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
14fe0 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d 20 74   if( EEXIST == t
14ff0 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72  Errno ){.      r
15000 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
15010 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
15020 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
15030 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
15040 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
15050 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
15060 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
15070 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
15080 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
15090 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
150a0 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  no);.      }.   
150b0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
150c0 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f 2a 20 67  ;.  } .  .  /* g
150d0 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
150e0 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
150f0 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46  k */.  pFile->eF
15100 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
15110 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ock;.  return rc
15120 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
15130 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
15140 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
15150 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
15160 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
15170 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
15180 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
15190 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
151a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
151b0 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
151c0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
151d0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
151e0 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
151f0 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
15200 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
15210 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
15220 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  .**.** When the 
15230 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65  locking level re
15240 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64  aches NO_LOCK, d
15250 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66  elete the lock f
15260 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
15270 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b  nt dotlockUnlock
15280 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
15290 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
152a0 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
152b0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
152c0 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a  e*)id;.  char *z
152d0 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
152e0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
152f0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20  gContext;.  int 
15300 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  rc;..  assert( p
15310 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
15320 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
15330 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20  d was %d pid=%d 
15340 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  (dotlock)\n", pF
15350 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
15360 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  k,.           pF
15370 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
15380 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20  osGetpid(0)));. 
15390 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
153a0 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
153b0 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
153c0 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
153d0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
153e0 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63  leLock==eFileLoc
153f0 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
15400 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
15410 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64    /* To downgrad
15420 65 20 74 6f 20 73 68 61 72 65 64 2c 20 73 69 6d  e to shared, sim
15430 70 6c 79 20 75 70 64 61 74 65 20 6f 75 72 20 69  ply update our i
15440 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f  nternal notion o
15450 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20  f the.  ** lock 
15460 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20  state.  No need 
15470 74 6f 20 6d 65 73 73 20 77 69 74 68 20 74 68 65  to mess with the
15480 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20   file on disk.. 
15490 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
154a0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
154b0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
154c0 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
154d0 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75  D_LOCK;.    retu
154e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
154f0 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75 6c  }.  .  /* To ful
15500 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ly unlock the da
15510 74 61 62 61 73 65 2c 20 64 65 6c 65 74 65 20 74  tabase, delete t
15520 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a  he lock file */.
15530 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
15540 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a  ock==NO_LOCK );.
15550 20 20 72 63 20 3d 20 6f 73 52 6d 64 69 72 28 7a    rc = osRmdir(z
15560 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66 28  LockFile);.  if(
15570 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
15580 45 4e 4f 54 44 49 52 20 29 20 72 63 20 3d 20 6f  ENOTDIR ) rc = o
15590 73 55 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c  sUnlink(zLockFil
155a0 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 29  e);.  if( rc<0 )
155b0 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  {.    int tErrno
155c0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63   = errno;.    rc
155d0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 45 4e   = 0;.    if( EN
155e0 4f 45 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20 29  OENT != tErrno )
155f0 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f  {.#if OSLOCKING_
15600 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52  CHECK_BUSY_IOERR
15610 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
15620 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
15630 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
15640 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
15650 4b 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  K);.#else.      
15660 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
15670 52 5f 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66  R_UNLOCK;.#endif
15680 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49  .    }.    if( I
15690 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
156a0 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
156b0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
156c0 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20  tErrno);.    }. 
156d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20     return rc; . 
156e0 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c   }.  pFile->eFil
156f0 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
15700 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15710 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
15720 6f 73 65 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b  ose a file.  Mak
15730 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 20  e sure the lock 
15740 68 61 73 20 62 65 65 6e 20 72 65 6c 65 61 73 65  has been release
15750 64 20 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67  d before closing
15760 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15770 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c  dotlockClose(sql
15780 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
15790 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
157a0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20  TE_OK;.  if( id 
157b0 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
157c0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
157d0 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c  le*)id;.    dotl
157e0 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  ockUnlock(id, NO
157f0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69  _LOCK);.    sqli
15800 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
15810 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
15820 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55  .    rc = closeU
15830 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d  nixFile(id);.  }
15840 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15850 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
15860 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 64  *** End of the d
15870 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70  ot-file lock imp
15880 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
15890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
158a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
158b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
158c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
158d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
158e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
158f0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
15900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15940 0a 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 20 42 65 67 69  *********** Begi
15960 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20  n flock Locking 
15970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15990 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66  .**.** Use the f
159a0 6c 6f 63 6b 28 29 20 73 79 73 74 65 6d 20 63 61  lock() system ca
159b0 6c 6c 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f  ll to do file lo
159c0 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f  cking..**.** flo
159d0 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20  ck() locking is 
159e0 6c 69 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f  like dot-file lo
159f0 63 6b 69 6e 67 20 69 6e 20 74 68 61 74 20 74 68  cking in that th
15a00 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e  e various.** fin
15a10 65 2d 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20  e-grain locking 
15a20 6c 65 76 65 6c 73 20 73 75 70 70 6f 72 74 65 64  levels supported
15a30 20 62 79 20 53 51 4c 69 74 65 20 61 72 65 20 63   by SQLite are c
15a40 6f 6c 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a  ollapsed into.**
15a50 20 61 20 73 69 6e 67 6c 65 20 65 78 63 6c 75 73   a single exclus
15a60 69 76 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74  ive lock.  In ot
15a70 68 65 72 20 77 6f 72 64 73 2c 20 53 48 41 52 45  her words, SHARE
15a80 44 2c 20 52 45 53 45 52 56 45 44 2c 20 61 6e 64  D, RESERVED, and
15a90 0a 2a 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  .** PENDING lock
15aa0 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 74  s are the same t
15ab0 68 69 6e 67 20 61 73 20 61 6e 20 45 58 43 4c 55  hing as an EXCLU
15ac0 53 49 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69  SIVE lock.  SQLi
15ad0 74 65 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b  te.** still work
15ae0 73 20 77 68 65 6e 20 79 6f 75 20 64 6f 20 74 68  s when you do th
15af0 69 73 2c 20 62 75 74 20 63 6f 6e 63 75 72 72 65  is, but concurre
15b00 6e 63 79 20 69 73 20 72 65 64 75 63 65 64 20 73  ncy is reduced s
15b10 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73  ince.** only a s
15b20 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61  ingle process ca
15b30 6e 20 62 65 20 72 65 61 64 69 6e 67 20 74 68 65  n be reading the
15b40 20 64 61 74 61 62 61 73 65 20 61 74 20 61 20 74   database at a t
15b50 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20  ime..**.** Omit 
15b60 74 68 69 73 20 73 65 63 74 69 6f 6e 20 69 66 20  this section if 
15b70 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
15b80 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73 20 74  CKING_STYLE is t
15b90 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23 69 66  urned off.*/.#if
15ba0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
15bb0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a  OCKING_STYLE../*
15bc0 0a 2a 2a 20 52 65 74 72 79 20 66 6c 6f 63 6b 28  .** Retry flock(
15bd0 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69  ) calls that fai
15be0 6c 20 77 69 74 68 20 45 49 4e 54 52 0a 2a 2f 0a  l with EINTR.*/.
15bf0 23 69 66 64 65 66 20 45 49 4e 54 52 0a 73 74 61  #ifdef EINTR.sta
15c00 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66  tic int robust_f
15c10 6c 6f 63 6b 28 69 6e 74 20 66 64 2c 20 69 6e 74  lock(int fd, int
15c20 20 6f 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   op){.  int rc;.
15c30 20 20 64 6f 7b 20 72 63 20 3d 20 66 6c 6f 63 6b    do{ rc = flock
15c40 28 66 64 2c 6f 70 29 3b 20 7d 77 68 69 6c 65 28  (fd,op); }while(
15c50 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
15c60 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72  EINTR );.  retur
15c70 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  n rc;.}.#else.# 
15c80 64 65 66 69 6e 65 20 72 6f 62 75 73 74 5f 66 6c  define robust_fl
15c90 6f 63 6b 28 61 2c 62 29 20 66 6c 6f 63 6b 28 61  ock(a,b) flock(a
15ca0 2c 62 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ,b).#endif.     
15cb0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
15cc0 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
15cd0 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
15ce0 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
15cf0 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
15d00 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
15d10 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
15d20 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
15d30 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
15d40 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
15d50 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
15d60 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
15d70 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
15d80 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
15d90 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
15da0 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
15db0 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
15dc0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
15dd0 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
15de0 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
15df0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
15e00 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
15e10 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
15e20 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
15e30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
15e40 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
15e50 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
15e60 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
15e70 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45    .  SimulateIOE
15e80 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
15e90 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
15ea0 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
15eb0 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
15ec0 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68  le );.  .  /* Ch
15ed0 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
15ee0 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
15ef0 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
15f00 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
15f10 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
15f20 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
15f30 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
15f40 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69  .  .  /* Otherwi
15f50 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
15f60 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
15f70 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ds it. */.  if( 
15f80 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  !reserved ){.   
15f90 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 67   /* attempt to g
15fa0 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20  et the lock */. 
15fb0 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 72 6f 62     int lrc = rob
15fc0 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
15fd0 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f  >h, LOCK_EX | LO
15fe0 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66 28 20  CK_NB);.    if( 
15ff0 21 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  !lrc ){.      /*
16000 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75   got the lock, u
16010 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20  nlock it */.    
16020 20 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66    lrc = robust_f
16030 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
16040 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69  OCK_UN);.      i
16050 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20 20 20  f ( lrc ) {.    
16060 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
16070 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
16080 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64  /* unlock failed
16090 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 2a   with an error *
160a0 2f 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f  /.#if OSLOCKING_
160b0 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52  CHECK_BUSY_IOERR
160c0 0a 20 20 20 20 20 20 20 20 6c 72 63 20 3d 20 73  .        lrc = s
160d0 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
160e0 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
160f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
16100 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65 20 0a 20 20  LOCK);.#else .  
16110 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51 4c 49        lrc = SQLI
16120 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
16130 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20   .#endif.       
16140 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
16150 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20  OR(lrc) ){.     
16160 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
16170 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
16180 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  o);.          rc
16190 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20 20   = lrc;.        
161a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  }.      }.    } 
161b0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74  else {.      int
161c0 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
161d0 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20  .      reserved 
161e0 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f  = 1;.      /* so
161f0 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74  meone else might
16200 20 68 61 76 65 20 69 74 20 72 65 73 65 72 76 65   have it reserve
16210 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  d */.      lrc =
16220 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
16230 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
16240 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
16250 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66  LOCK); .      if
16260 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
16270 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  lrc) ){.        
16280 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
16290 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
162a0 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b         rc = lrc;
162b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
162c0 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54   }.  OSTRACE(("T
162d0 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
162e0 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c  d %d (flock)\n",
162f0 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
16300 65 73 65 72 76 65 64 29 29 3b 0a 0a 23 69 66 64  eserved));..#ifd
16310 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ef SQLITE_IGNORE
16320 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
16330 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20 53  RS.  if( (rc & S
16340 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20  QLITE_IOERR) == 
16350 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
16360 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16370 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64  OK;.    reserved
16380 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  =1;.  }.#endif /
16390 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
163a0 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
163b0 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20  S */.  *pResOut 
163c0 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
163d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
163e0 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
163f0 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
16400 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
16410 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d  eter eFileLock -
16420 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
16430 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
16440 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
16450 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
16460 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
16470 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
16480 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
16490 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
164a0 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
164b0 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
164c0 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
164d0 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
164e0 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
164f0 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
16500 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
16510 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
16520 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
16530 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
16540 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
16550 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
16560 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
16570 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
16580 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
16590 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
165a0 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
165b0 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
165c0 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
165d0 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
165e0 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
165f0 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
16600 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
16610 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
16620 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
16630 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
16640 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
16650 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
16660 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
16670 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
16680 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
16690 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c  *.** flock() onl
166a0 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74  y really support
166b0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
166c0 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65  .  We track inte
166d0 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b  rmediate.** lock
166e0 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73   states in the s
166f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75  qlite3_file stru
16700 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c  cture, but all l
16710 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a  ocks SHARED or.*
16720 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c  * above are real
16730 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ly EXCLUSIVE loc
16740 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61  ks and exclude a
16750 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ll other process
16760 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73  es from.** acces
16770 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  s the file..**.*
16780 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
16790 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
167a0 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
167b0 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
167c0 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
167d0 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
167e0 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
167f0 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63  tic int flockLoc
16800 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
16810 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
16820 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  k) {.  int rc = 
16830 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
16840 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
16850 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
16860 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
16870 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c  ;..  /* if we al
16880 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63  ready have a loc
16890 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69  k, it is exclusi
168a0 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20  ve.  .  ** Just 
168b0 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64  adjust level and
168c0 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68   punt on outta h
168d0 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46  ere. */.  if (pF
168e0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e  ile->eFileLock >
168f0 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20   NO_LOCK) {.    
16900 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16910 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
16920 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16930 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
16940 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76  grab an exclusiv
16950 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69  e lock */.  .  i
16960 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  f (robust_flock(
16970 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45  pFile->h, LOCK_E
16980 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a  X | LOCK_NB)) {.
16990 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
169a0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64   errno;.    /* d
169b0 69 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20  idn't get, must 
169c0 62 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72  be busy */.    r
169d0 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
169e0 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
169f0 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
16a00 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  RR_LOCK);.    if
16a10 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
16a20 72 63 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f  rc) ){.      sto
16a30 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
16a40 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
16a50 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  }.  } else {.   
16a60 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20   /* got it, set 
16a70 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74  the type and ret
16a80 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46  urn ok */.    pF
16a90 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
16aa0 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a   eFileLock;.  }.
16ab0 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
16ac0 20 20 20 20 25 64 20 25 73 20 25 73 20 28 66 6c      %d %s %s (fl
16ad0 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
16ae0 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46  h, azFileLock(eF
16af0 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20  ileLock), .     
16b00 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
16b10 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
16b20 69 6c 65 64 22 29 29 3b 0a 23 69 66 64 65 66 20  iled"));.#ifdef 
16b30 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
16b40 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  OCK_LOCK_ERRORS.
16b50 20 20 69 66 28 20 28 72 63 20 26 20 53 51 4c 49    if( (rc & SQLI
16b60 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c  TE_IOERR) == SQL
16b70 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
16b80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
16b90 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  Y;.  }.#endif /*
16ba0 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
16bb0 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
16bc0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
16bd0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  .}.../*.** Lower
16be0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
16bf0 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
16c00 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
16c10 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
16c20 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
16c30 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
16c40 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
16c50 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
16c60 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
16c70 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
16c80 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
16c90 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
16ca0 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
16cb0 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
16cc0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
16cd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
16ce0 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  lockUnlock(sqlit
16cf0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
16d00 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
16d10 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
16d20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
16d30 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
16d40 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
16d50 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  (("UNLOCK  %d %d
16d60 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28   was %d pid=%d (
16d70 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  flock)\n", pFile
16d80 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
16d90 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
16da0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47  ->eFileLock, osG
16db0 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20 61 73  etpid(0)));.  as
16dc0 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
16dd0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
16de0 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66    .  /* no-op if
16df0 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69   possible */.  i
16e00 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
16e10 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock==eFileLock )
16e20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
16e30 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
16e40 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a   /* shared can j
16e50 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75  ust be set becau
16e60 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76  se we always hav
16e70 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a  e an exclusive *
16e80 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63  /.  if (eFileLoc
16e90 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20  k==SHARED_LOCK) 
16ea0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
16eb0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
16ec0 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ck;.    return S
16ed0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
16ee0 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79  .  /* no, really
16ef0 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69  , unlock. */.  i
16f00 66 28 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  f( robust_flock(
16f10 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55  pFile->h, LOCK_U
16f20 4e 29 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  N) ){.#ifdef SQL
16f30 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
16f40 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20  _LOCK_ERRORS.   
16f50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16f60 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  K;.#endif /* SQL
16f70 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
16f80 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
16f90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16fa0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
16fb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
16fc0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
16fd0 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74  NO_LOCK;.    ret
16fe0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
16ff0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
17000 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  e a file..*/.sta
17010 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f  tic int flockClo
17020 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
17030 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  *id) {.  int rc 
17040 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
17050 66 28 20 69 64 20 29 7b 0a 20 20 20 20 66 6c 6f  f( id ){.    flo
17060 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ckUnlock(id, NO_
17070 4c 4f 43 4b 29 3b 0a 20 20 20 20 72 63 20 3d 20  LOCK);.    rc = 
17080 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
17090 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
170a0 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  rc;.}..#endif /*
170b0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
170c0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
170d0 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f  !OS_VXWORK */../
170e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
170f0 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66  *** End of the f
17100 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  lock lock implem
17110 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
17120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
17130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
17180 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
17190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
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 2a 20 42 65 67 69 6e 20 4e  ******** Begin N
171f0 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65 20 4c  amed Semaphore L
17200 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
17210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
17220 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61  **.** Named sema
17230 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73  phore locking is
17240 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20   only supported 
17250 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a  on VxWorks..**.*
17260 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  * Semaphore lock
17270 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d  ing is like dot-
17280 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69  lock and flock i
17290 6e 20 74 68 61 74 20 69 74 20 72 65 61 6c 6c 79  n that it really
172a0 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74   only.** support
172b0 73 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  s EXCLUSIVE lock
172c0 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e  ing.  Only a sin
172d0 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20  gle process can 
172e0 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a  read or write.**
172f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17300 6c 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54  le at a time.  T
17310 68 69 73 20 72 65 64 75 63 65 73 20 70 6f 74 65  his reduces pote
17320 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63  ntial concurrenc
17330 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20  y, but.** makes 
17340 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  the lock impleme
17350 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20 65 61 73  ntation much eas
17360 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56  ier..*/.#if OS_V
17370 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68  XWORKS../*.** Th
17380 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
17390 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
173a0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
173b0 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
173c0 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
173d0 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
173e0 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
173f0 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
17400 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
17410 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
17420 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
17430 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
17440 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
17450 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
17460 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
17470 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
17480 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
17490 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
174a0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
174b0 20 73 65 6d 58 43 68 65 63 6b 52 65 73 65 72 76   semXCheckReserv
174c0 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
174d0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
174e0 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72  esOut) {.  int r
174f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
17500 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
17510 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
17520 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
17530 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
17540 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
17550 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
17560 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
17570 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
17580 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20   pFile );..  /* 
17590 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
175a0 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
175b0 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
175c0 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
175d0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
175e0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
175f0 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
17600 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
17610 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
17620 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
17630 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66  olds it. */.  if
17640 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
17650 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d     sem_t *pSem =
17660 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
17670 70 53 65 6d 3b 0a 0a 20 20 20 20 69 66 28 20 73  pSem;..    if( s
17680 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29  em_trywait(pSem)
17690 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  ==-1 ){.      in
176a0 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
176b0 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41 47 41  ;.      if( EAGA
176c0 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  IN != tErrno ){.
176d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
176e0 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
176f0 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
17700 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
17710 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a  KRESERVEDLOCK);.
17720 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
17730 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
17740 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 20 65  rrno);.      } e
17750 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  lse {.        /*
17760 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61   someone else ha
17770 73 20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20  s the lock when 
17780 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43  we are in NO_LOC
17790 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73  K */.        res
177a0 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e  erved = (pFile->
177b0 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52  eFileLock < SHAR
177c0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
177d0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
177e0 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68     /* we could h
177f0 61 76 65 20 69 74 20 69 66 20 77 65 20 77 61 6e  ave it if we wan
17800 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65  t it */.      se
17810 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20  m_post(pSem);.  
17820 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
17830 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
17840 20 25 64 20 25 64 20 25 64 20 28 73 65 6d 29 5c   %d %d %d (sem)\
17850 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
17860 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20  , reserved));.. 
17870 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
17880 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
17890 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
178a0 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
178b0 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
178c0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
178d0 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
178e0 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
178f0 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
17900 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
17910 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
17920 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
17930 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
17940 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
17950 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
17960 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
17970 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
17980 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
17990 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
179a0 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
179b0 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
179c0 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
179d0 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
179e0 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
179f0 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
17a00 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
17a10 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
17a20 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
17a30 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
17a40 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
17a50 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
17a60 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
17a70 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
17a80 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
17a90 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
17aa0 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
17ab0 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
17ac0 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
17ad0 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
17ae0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
17af0 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
17b00 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
17b10 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
17b20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
17b30 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
17b40 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53  XCLUSIVE.**.** S
17b50 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f  emaphore locks o
17b60 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f  nly really suppo
17b70 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  rt EXCLUSIVE loc
17b80 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e  ks.  We track in
17b90 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f  termediate.** lo
17ba0 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65  ck states in the
17bb0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
17bc0 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c  ructure, but all
17bd0 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72   locks SHARED or
17be0 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65  .** above are re
17bf0 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c  ally EXCLUSIVE l
17c00 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65  ocks and exclude
17c10 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65   all other proce
17c20 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63  sses from.** acc
17c30 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a  ess the file..**
17c40 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
17c50 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
17c60 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
17c70 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
17c80 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
17c90 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
17ca0 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
17cb0 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58 4c 6f  tatic int semXLo
17cc0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
17cd0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
17ce0 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
17cf0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
17d00 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74  ile*)id;.  sem_t
17d10 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
17d20 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20  pInode->pSem;.  
17d30 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
17d40 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20  OK;..  /* if we 
17d50 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c  already have a l
17d60 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75  ock, it is exclu
17d70 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73  sive.  .  ** Jus
17d80 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61  t adjust level a
17d90 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61  nd punt on outta
17da0 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28   here. */.  if (
17db0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17dc0 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20   > NO_LOCK) {.  
17dd0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
17de0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
17df0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17e00 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d  OK;.    goto sem
17e10 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  _end_lock;.  }. 
17e20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61   .  /* lock sema
17e30 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 62 61  phore now but ba
17e40 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c 72 65  il out when alre
17e50 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20  ady locked. */. 
17e60 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74   if( sem_trywait
17e70 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20  (pSem)==-1 ){.  
17e80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
17e90 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d  SY;.    goto sem
17ea0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a  _end_lock;.  }..
17eb0 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
17ec0 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
17ed0 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69  turn ok */.  pFi
17ee0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
17ef0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d  eFileLock;.. sem
17f00 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74  _end_lock:.  ret
17f10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17f20 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
17f30 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
17f40 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
17f50 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
17f60 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
17f70 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
17f80 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
17f90 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
17fa0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
17fb0 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
17fc0 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
17fd0 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
17fe0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
17ff0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
18000 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
18010 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
18020 20 69 6e 74 20 73 65 6d 58 55 6e 6c 6f 63 6b 28   int semXUnlock(
18030 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
18040 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
18050 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
18060 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
18070 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70  *)id;.  sem_t *p
18080 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  Sem = pFile->pIn
18090 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73  ode->pSem;..  as
180a0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
180b0 20 61 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b   assert( pSem );
180c0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
180d0 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
180e0 64 20 70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e  d pid=%d (sem)\n
180f0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
18100 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  leLock,.        
18110 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
18120 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 30 29  ock, osGetpid(0)
18130 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46  ));.  assert( eF
18140 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
18150 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
18160 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
18170 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
18180 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69  ->eFileLock==eFi
18190 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
181a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
181b0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72    }.  .  /* shar
181c0 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73  ed can just be s
181d0 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c  et because we al
181e0 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63  ways have an exc
181f0 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28  lusive */.  if (
18200 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
18210 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  D_LOCK) {.    pF
18220 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
18230 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
18240 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18250 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f  ;.  }.  .  /* no
18260 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e  , really unlock.
18270 20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f 70   */.  if ( sem_p
18280 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20  ost(pSem)==-1 ) 
18290 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45  {.    int rc, tE
182a0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
182b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
182c0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
182d0 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
182e0 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20  IOERR_UNLOCK);. 
182f0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
18300 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
18310 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
18320 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
18330 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
18340 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69  n rc; .  }.  pFi
18350 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
18360 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72  NO_LOCK;.  retur
18370 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
18380 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66  /*. ** Close a f
18390 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ile.. */.static 
183a0 69 6e 74 20 73 65 6d 58 43 6c 6f 73 65 28 73 71  int semXClose(sq
183b0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
183c0 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  {.  if( id ){.  
183d0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
183e0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
183f0 64 3b 0a 20 20 20 20 73 65 6d 58 55 6e 6c 6f 63  d;.    semXUnloc
18400 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
18410 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
18420 65 20 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74  e );.    unixEnt
18430 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  erMutex();.    r
18440 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28  eleaseInodeInfo(
18450 70 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78  pFile);.    unix
18460 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
18470 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28    closeUnixFile(
18480 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  id);.  }.  retur
18490 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
184a0 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
184b0 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61  ORKS */./*.** Na
184c0 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
184d0 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76  cking is only av
184e0 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72  ailable on VxWor
184f0 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks..**.*********
18500 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
18510 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  e named semaphor
18520 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  e lock implement
18530 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
18540 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
18550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18590 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  *****/.../******
185a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
185b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
185c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
185d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
185e0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
185f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18600 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c  **** Begin AFP L
18610 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
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 0a 2a 2a 0a 2a 2a 20 41  ********.**.** A
18640 46 50 20 69 73 20 74 68 65 20 41 70 70 6c 65 20  FP is the Apple 
18650 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e  Filing Protocol.
18660 20 20 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f    AFP is a netwo
18670 72 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f  rk filesystem fo
18680 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20  und.** on Apple 
18690 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74  Macintosh comput
186a0 65 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61  ers - both OS9 a
186b0 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68  nd OSX..**.** Th
186c0 69 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d  ird-party implem
186d0 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50  entations of AFP
186e0 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20   are available. 
186f0 20 42 75 74 20 74 68 69 73 20 63 6f 64 65 20 68   But this code h
18700 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b  ere.** only work
18710 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69  s on OSX..*/..#i
18720 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
18730 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
18740 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
18750 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66  YLE./*.** The af
18760 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
18770 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
18780 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20  ns all afp lock 
18790 73 70 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a  specific state.*
187a0 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
187b0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
187c0 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  xt afpLockingCon
187d0 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70  text;.struct afp
187e0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b  LockingContext {
187f0 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b  .  int reserved;
18800 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64  .  const char *d
18810 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20  bPath;          
18820 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
18830 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d  e open file */.}
18840 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52 61  ;..struct ByteRa
18850 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75  ngeLockPB2.{.  u
18860 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
18870 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  g offset;       
18880 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69   /* offset to fi
18890 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b  rst byte to lock
188a0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
188b0 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b  ong long length;
188c0 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f          /* nbr o
188d0 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
188e0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
188f0 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65  ng long retRange
18900 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66  Start; /* nbr of
18910 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64   1st byte locked
18920 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a   if successful *
18930 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
18940 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20  r unLockFlag;   
18950 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c        /* 1 = unl
18960 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f  ock, 0 = lock */
18970 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
18980 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20   startEndFlag;  
18990 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f       /* 1=rel to
189a0 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d   end of fork, 0=
189b0 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a  rel to start */.
189c0 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
189d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189e0 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63      /* file desc
189f0 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c   to assoc this l
18a00 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a  ock with */.};..
18a10 23 64 65 66 69 6e 65 20 61 66 70 66 73 42 79 74  #define afpfsByt
18a20 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c  eRangeLock2FSCTL
18a30 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a          _IOWR('z
18a40 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79  ', 23, struct By
18a50 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a  teRangeLockPB2).
18a60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
18a70 20 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74   utility for set
18a80 74 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67  ting or clearing
18a90 20 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63   a bit-range loc
18aa0 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66  k on an.** AFP f
18ab0 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a  ilesystem..** .*
18ac0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
18ad0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53  OK on success, S
18ae0 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61  QLITE_BUSY on fa
18af0 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
18b00 20 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28   int afpSetLock(
18b10 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
18b20 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
18b30 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
18b40 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b   file to be lock
18b50 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a  ed or unlocked *
18b60 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  /.  unixFile *pF
18b70 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
18b80 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
18b90 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61  descriptor on pa
18ba0 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  th */.  unsigned
18bb0 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65   long long offse
18bc0 74 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  t,     /* First 
18bd0 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  byte to be locke
18be0 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  d */.  unsigned 
18bf0 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68  long long length
18c00 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
18c10 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
18c20 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63   */.  int setLoc
18c30 6b 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  kFlag           
18c40 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
18c50 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65  set lock.  False
18c60 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a   to clear lock *
18c70 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79  /.){.  struct By
18c80 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70  teRangeLockPB2 p
18c90 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20  b;.  int err;.  
18ca0 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67  .  pb.unLockFlag
18cb0 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f   = setLockFlag ?
18cc0 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61   0 : 1;.  pb.sta
18cd0 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20  rtEndFlag = 0;. 
18ce0 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66   pb.offset = off
18cf0 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68  set;.  pb.length
18d00 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62   = length; .  pb
18d10 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a  .fd = pFile->h;.
18d20 20 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41    .  OSTRACE(("A
18d30 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66  FPSETLOCK [%s] f
18d40 6f 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65  or %d%s in range
18d50 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a   %llx:%llx\n", .
18d60 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67      (setLockFlag
18d70 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46  ?"ON":"OFF"), pF
18d80 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d  ile->h, (pb.fd==
18d90 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22  -1?"[testval-1]"
18da0 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74  :""),.    offset
18db0 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72  , length));.  er
18dc0 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20  r = fsctl(path, 
18dd0 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f  afpfsByteRangeLo
18de0 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30  ck2FSCTL, &pb, 0
18df0 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d  );.  if ( err==-
18e00 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63  1 ) {.    int rc
18e10 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  ;.    int tErrno
18e20 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53   = errno;.    OS
18e30 54 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f  TRACE(("AFPSETLO
18e40 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63  CK failed to fsc
18e50 74 6c 28 29 20 27 25 73 27 20 25 64 20 25 73 5c  tl() '%s' %d %s\
18e60 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
18e70 20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73   path, tErrno, s
18e80 74 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29  trerror(tErrno))
18e90 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
18ea0 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b  _IGNORE_AFP_LOCK
18eb0 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d  _ERRORS.    rc =
18ec0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65   SQLITE_BUSY;.#e
18ed0 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  lse.    rc = sql
18ee0 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
18ef0 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20  xError(tErrno,. 
18f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f10 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f     setLockFlag ?
18f20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
18f30 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52  CK : SQLITE_IOER
18f40 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69  R_UNLOCK);.#endi
18f50 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
18f60 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f  RE_AFP_LOCK_ERRO
18f70 52 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53  RS */.    if( IS
18f80 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
18f90 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  ){.      storeLa
18fa0 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
18fb0 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  Errno);.    }.  
18fc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
18fd0 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75   else {.    retu
18fe0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
18ff0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
19000 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
19010 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
19020 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
19030 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
19040 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
19050 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
19060 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
19070 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
19080 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
19090 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
190a0 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
190b0 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
190c0 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
190d0 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
190e0 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
190f0 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
19100 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
19110 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
19120 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
19130 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  pCheckReservedLo
19140 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
19150 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
19160 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
19170 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
19180 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
19190 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
191a0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
191b0 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
191c0 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20  text *context;. 
191d0 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72   .  SimulateIOEr
191e0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
191f0 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
19200 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
19210 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
19220 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d  e );.  context =
19230 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
19240 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
19250 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
19260 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73  if( context->res
19270 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52  erved ){.    *pR
19280 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72  esOut = 1;.    r
19290 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
192a0 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72  .  }.  unixEnter
192b0 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61  Mutex(); /* Beca
192c0 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
192d0 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
192e0 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20  ss threads */.  
192f0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
19300 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
19310 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
19320 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
19330 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  f( pFile->pInode
19340 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
19350 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
19360 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
19370 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69  .  .  /* Otherwi
19380 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
19390 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
193a0 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69  ds it..   */.  i
193b0 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
193c0 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20      /* lock the 
193d0 52 45 53 45 52 56 45 44 20 62 79 74 65 20 2a 2f  RESERVED byte */
193e0 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 61  .    int lrc = a
193f0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
19400 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
19410 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
19420 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 28   1,1);  .    if(
19430 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20   SQLITE_OK==lrc 
19440 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77  ){.      /* if w
19450 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 74  e succeeded in t
19460 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72 76  aking the reserv
19470 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20  ed lock, unlock 
19480 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20  it to restore.  
19490 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69      ** the origi
194a0 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20  nal state */.   
194b0 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c     lrc = afpSetL
194c0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
194d0 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
194e0 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29  RVED_BYTE, 1, 0)
194f0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
19500 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61       /* if we fa
19510 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65 20  iled to get the 
19520 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e  lock then someon
19530 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65  e else must have
19540 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73   it */.      res
19550 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  erved = 1;.    }
19560 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
19570 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20  _ERROR(lrc) ){. 
19580 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20       rc=lrc;.   
19590 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78   }.  }.  .  unix
195a0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
195b0 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
195c0 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
195d0 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
195e0 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
195f0 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75  ));.  .  *pResOu
19600 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
19610 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19620 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
19630 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
19640 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
19650 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
19660 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
19670 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
19680 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
19690 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
196a0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
196b0 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
196c0 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
196d0 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
196e0 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
196f0 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
19700 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
19710 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
19720 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
19730 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
19740 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
19750 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
19760 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
19770 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
19780 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
19790 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
197a0 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
197b0 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
197c0 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
197d0 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
197e0 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
197f0 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
19800 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
19810 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
19820 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
19830 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
19840 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
19850 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
19860 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
19870 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
19880 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
19890 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
198a0 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
198b0 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
198c0 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
198d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
198e0 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
198f0 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
19900 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
19910 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
19920 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
19930 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
19940 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
19950 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
19960 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
19970 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
19980 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
19990 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
199a0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
199b0 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
199c0 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
199d0 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f  >pInode;.  afpLo
199e0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
199f0 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
19a00 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
19a10 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
19a20 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ext;.  .  assert
19a30 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
19a40 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
19a50 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25  d %s was %s(%s,%
19a60 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c  d) pid=%d (afp)\
19a70 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
19a80 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
19a90 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
19aa0 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  azFileLock(pFile
19ab0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20  ->eFileLock),.  
19ac0 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
19ad0 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  ock(pInode->eFil
19ae0 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e  eLock), pInode->
19af0 6e 53 68 61 72 65 64 20 2c 20 6f 73 47 65 74 70  nShared , osGetp
19b00 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f 2a 20 49  id(0)));..  /* I
19b10 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
19b20 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69  dy a lock of thi
19b30 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72  s type or more r
19b40 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68  estrictive on th
19b50 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c  e.  ** unixFile,
19b60 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
19b70 27 74 20 75 73 65 20 74 68 65 20 61 66 70 5f 65  't use the afp_e
19b80 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61  nd_lock: exit pa
19b90 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78  th, as.  ** unix
19ba0 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73  EnterMutex() has
19bb0 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  n't been called 
19bc0 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  yet..  */.  if( 
19bd0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
19be0 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  >=eFileLock ){. 
19bf0 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
19c00 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61  K    %d %s ok (a
19c10 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 61 66  lready held) (af
19c20 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
19c30 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
19c40 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
19c50 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
19c60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
19c70 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
19c80 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
19c90 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20  nce is correct. 
19ca0 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65   **  (1) We neve
19cb0 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f  r move from unlo
19cc0 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67  cked to anything
19cd0 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61   higher than sha
19ce0 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  red lock..  **  
19cf0 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72  (2) SQLite never
19d00 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75   explicitly requ
19d10 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f  ests a pendig lo
19d20 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20  ck..  **  (3) A 
19d30 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61  shared lock is a
19d40 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20  lways held when 
19d50 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69  a reserve lock i
19d60 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
19d70 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
19d80 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f  e->eFileLock!=NO
19d90 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
19da0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
19db0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
19dc0 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f  leLock!=PENDING_
19dd0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
19de0 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53  ( eFileLock!=RES
19df0 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46  ERVED_LOCK || pF
19e00 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
19e10 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
19e20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65   .  /* This mute
19e30 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61  x is needed beca
19e40 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
19e50 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
19e60 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a  ss threads.  */.
19e70 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
19e80 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
19e90 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20  File->pInode;.. 
19ea0 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65   /* If some thre
19eb0 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
19ec0 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61  D has a lock via
19ed0 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69   a different uni
19ee0 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64  xFile*.  ** hand
19ef0 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65  le that preclude
19f00 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
19f10 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53  lock, return BUS
19f20 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  Y..  */.  if( (p
19f30 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
19f40 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  =pInode->eFileLo
19f50 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 28 70  ck && .       (p
19f60 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
19f70 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c  >=PENDING_LOCK |
19f80 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  | eFileLock>SHAR
19f90 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29  ED_LOCK)).     )
19fa0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
19fb0 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
19fc0 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
19fd0 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 20   }.  .  /* If a 
19fe0 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72  SHARED lock is r
19ff0 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f  equested, and so
1a000 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
1a010 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79  this PID already
1a020 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52  .  ** has a SHAR
1a030 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c  ED or RESERVED l
1a040 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d  ock, then increm
1a050 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f  ent reference co
1a060 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65  unts and.  ** re
1a070 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
1a080 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
1a090 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
1a0a0 4b 20 26 26 20 0a 20 20 20 20 20 28 70 49 6e 6f  K && .     (pIno
1a0b0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  de->eFileLock==S
1a0c0 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
1a0d0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
1a0e0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20  =RESERVED_LOCK) 
1a0f0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ){.    assert( e
1a100 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
1a110 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  _LOCK );.    ass
1a120 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
1a130 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
1a140 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
1a150 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20  nShared>0 );.   
1a160 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
1a170 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
1a180 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
1a190 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f  ared++;.    pIno
1a1a0 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
1a1b0 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
1a1c0 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f  ck;.  }.    .  /
1a1d0 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  * A PENDING lock
1a1e0 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72   is needed befor
1a1f0 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
1a200 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65  ARED lock and be
1a210 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72  fore.  ** acquir
1a220 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
1a230 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20   lock.  For the 
1a240 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
1a250 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20   PENDING will.  
1a260 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a  ** be released..
1a270 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
1a280 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
1a290 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69  K .      || (eFi
1a2a0 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
1a2b0 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  E_LOCK && pFile-
1a2c0 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49  >eFileLock<PENDI
1a2d0 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20  NG_LOCK).  ){.  
1a2e0 20 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20    int failed;.  
1a2f0 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65    failed = afpSe
1a300 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
1a310 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
1a320 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31  NDING_BYTE, 1, 1
1a330 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65  );.    if (faile
1a340 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d) {.      rc = 
1a350 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f  failed;.      go
1a360 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
1a370 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
1a380 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65  /* If control ge
1a390 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ts to this point
1a3a0 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20  , then actually 
1a3b0 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b  go ahead and mak
1a3c0 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67  e.  ** operating
1a3d0 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f   system calls fo
1a3e0 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
1a3f0 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lock..  */.  if(
1a400 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
1a410 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69  ED_LOCK ){.    i
1a420 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c  nt lrc1, lrc2, l
1a430 72 63 31 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  rc1Errno = 0;.  
1a440 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b    long lk, mask;
1a450 0a 20 20 20 20 0a 20 20 20 20 61 73 73 65 72 74  .    .    assert
1a460 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
1a470 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
1a480 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
1a490 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
1a4a0 20 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20      .    mask = 
1a4b0 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38  (sizeof(long)==8
1a4c0 29 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  ) ? LARGEST_INT6
1a4d0 34 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a  4 : 0x7fffffff;.
1a4e0 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
1a4f0 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41  he read-lock SHA
1a500 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20  RED_LOCK */.    
1a510 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65  /* note that the
1a520 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20   quality of the 
1a530 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e  randomness doesn
1a540 27 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d  't matter that m
1a550 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20  uch */.    lk = 
1a560 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70  random(); .    p
1a570 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
1a580 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25  e = (lk & mask)%
1a590 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31  (SHARED_SIZE - 1
1a5a0 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66  );.    lrc1 = af
1a5b0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
1a5c0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
1a5d0 20 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52   .          SHAR
1a5e0 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d  ED_FIRST+pInode-
1a5f0 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
1a600 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  1);.    if( IS_L
1a610 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20  OCK_ERROR(lrc1) 
1a620 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72  ){.      lrc1Err
1a630 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74  no = pFile->last
1a640 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
1a650 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d   /* Drop the tem
1a660 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c  porary PENDING l
1a670 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20  ock */.    lrc2 
1a680 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
1a690 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
1a6a0 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
1a6b0 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20  E, 1, 0);.    . 
1a6c0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
1a6d0 52 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20  RROR(lrc1) ) {. 
1a6e0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
1a6f0 72 6e 6f 28 70 46 69 6c 65 2c 20 6c 72 63 31 45  rno(pFile, lrc1E
1a700 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20  rrno);.      rc 
1a710 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20 20 67 6f  = lrc1;.      go
1a720 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
1a730 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20  .    } else if( 
1a740 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
1a750 63 32 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  c2) ){.      rc 
1a760 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20 20 67 6f  = lrc2;.      go
1a770 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
1a780 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20  .    } else if( 
1a790 6c 72 63 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f  lrc1 != SQLITE_O
1a7a0 4b 20 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  K ) {.      rc =
1a7b0 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73   lrc1;.    } els
1a7c0 65 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  e {.      pFile-
1a7d0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
1a7e0 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  RED_LOCK;.      
1a7f0 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
1a800 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
1a810 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  Shared = 1;.    
1a820 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  }.  }else if( eF
1a830 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
1a840 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64  VE_LOCK && pInod
1a850 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a  e->nShared>1 ){.
1a860 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72      /* We are tr
1a870 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c  ying for an excl
1a880 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61  usive lock but a
1a890 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e  nother thread in
1a8a0 20 74 68 69 73 0a 20 20 20 20 20 2a 2a 20 73 61   this.     ** sa
1a8b0 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  me process is st
1a8c0 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68  ill holding a sh
1a8d0 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ared lock. */.  
1a8e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
1a8f0 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  SY;.  }else{.   
1a900 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20   /* The request 
1a910 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56  was for a RESERV
1a920 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
1a930 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20  lock.  It is.   
1a940 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74   ** assumed that
1a950 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52   there is a SHAR
1a960 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
1a970 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20  ck on the file. 
1a980 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20     ** already.. 
1a990 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61     */.    int fa
1a9a0 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 61 73  iled = 0;.    as
1a9b0 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e  sert( 0!=pFile->
1a9c0 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  eFileLock );.   
1a9d0 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 20 3e   if (eFileLock >
1a9e0 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  = RESERVED_LOCK 
1a9f0 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
1aa00 6f 63 6b 20 3c 20 52 45 53 45 52 56 45 44 5f 4c  ock < RESERVED_L
1aa10 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f  OCK) {.        /
1aa20 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45  * Acquire a RESE
1aa30 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  RVED lock */.   
1aa40 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66       failed = af
1aa50 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
1aa60 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
1aa70 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
1aa80 31 2c 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  1,1);.      if( 
1aa90 21 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  !failed ){.     
1aaa0 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65     context->rese
1aab0 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rved = 1;.      
1aac0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  }.    }.    if (
1aad0 21 66 61 69 6c 65 64 20 26 26 20 65 46 69 6c 65  !failed && eFile
1aae0 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53 49 56  Lock == EXCLUSIV
1aaf0 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  E_LOCK) {.      
1ab00 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58  /* Acquire an EX
1ab10 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a  CLUSIVE lock */.
1ab20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f          .      /
1ab30 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61  * Remove the sha
1ab40 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20  red lock before 
1ab50 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67 65  trying the range
1ab60 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f  .  we'll need to
1ab70 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73 74   .      ** reest
1ab80 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
1ab90 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61 6e  d lock if we can
1aba0 27 74 20 67 65 74 20 74 68 65 20 20 61 66 70 55  't get the  afpU
1abb0 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20  nlock.      */. 
1abc0 20 20 20 20 20 69 66 28 20 21 28 66 61 69 6c 65       if( !(faile
1abd0 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
1abe0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
1abf0 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
1ac00 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20 20  RST +.          
1ac10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1ac20 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
1ac30 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20 20 20  e, 1, 0)) ){.   
1ac40 20 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 32       int failed2
1ac50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1ac60 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74        /* now att
1ac70 65 6d 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65  emmpt to get the
1ac80 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
1ac90 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20  range */.       
1aca0 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74   failed = afpSet
1acb0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
1acc0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41  Path, pFile, SHA
1acd0 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20  RED_FIRST, .    
1ace0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acf0 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
1ad00 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20  D_SIZE, 1);.    
1ad10 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 26      if( failed &
1ad20 26 20 28 66 61 69 6c 65 64 32 20 3d 20 61 66 70  & (failed2 = afp
1ad30 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
1ad40 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
1ad50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ad60 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46          SHARED_F
1ad70 49 52 53 54 20 2b 20 70 49 6e 6f 64 65 2d 3e 73  IRST + pInode->s
1ad80 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29  haredByte, 1, 1)
1ad90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
1ada0 2a 20 43 61 6e 27 74 20 72 65 65 73 74 61 62 6c  * Can't reestabl
1adb0 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c  ish the shared l
1adc0 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20 63 61 6e  ock.  Sqlite can
1add0 27 74 20 64 65 61 6c 2c 20 74 68 69 73 20 69 73  't deal, this is
1ade0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20  .          ** a 
1adf0 63 72 69 74 69 63 61 6c 20 49 2f 4f 20 65 72 72  critical I/O err
1ae00 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  or.          */.
1ae10 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 28            rc = (
1ae20 28 66 61 69 6c 65 64 20 26 20 53 51 4c 49 54 45  (failed & SQLITE
1ae30 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54  _IOERR) == SQLIT
1ae40 45 5f 49 4f 45 52 52 29 20 3f 20 66 61 69 6c 65  E_IOERR) ? faile
1ae50 64 32 20 3a 20 0a 20 20 20 20 20 20 20 20 20 20  d2 : .          
1ae60 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52       SQLITE_IOER
1ae70 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  R_LOCK;.        
1ae80 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
1ae90 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a  ock;.        } .
1aea0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1aeb0 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
1aec0 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ; .      }.    }
1aed0 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20  .    if( failed 
1aee0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61  ){.      rc = fa
1aef0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iled;.    }.  }.
1af00 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c    .  if( rc==SQL
1af10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46  ITE_OK ){.    pF
1af20 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
1af30 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
1af40 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
1af50 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
1af60 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65   }else if( eFile
1af70 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
1af80 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
1af90 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
1afa0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20  ENDING_LOCK;.   
1afb0 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
1afc0 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ck = PENDING_LOC
1afd0 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65 6e  K;.  }.  .afp_en
1afe0 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65  d_lock:.  unixLe
1aff0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
1b000 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
1b010 25 64 20 25 73 20 25 73 20 28 61 66 70 29 5c 6e  %d %s %s (afp)\n
1b020 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46  ", pFile->h, azF
1b030 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
1b040 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 72 63  k), .         rc
1b050 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
1b060 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
1b070 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b080 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
1b090 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
1b0a0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
1b0b0 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
1b0c0 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
1b0d0 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
1b0e0 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
1b0f0 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
1b100 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
1b110 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
1b120 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
1b130 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
1b140 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
1b150 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
1b160 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
1b170 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1b180 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e  static int afpUn
1b190 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
1b1a0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
1b1b0 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63  Lock) {.  int rc
1b1c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1b1d0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
1b1e0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
1b1f0 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
1b200 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c   *pInode;.  afpL
1b210 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63  ockingContext *c
1b220 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63  ontext = (afpLoc
1b230 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70  kingContext *) p
1b240 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
1b250 74 65 78 74 3b 0a 20 20 69 6e 74 20 73 6b 69 70  text;.  int skip
1b260 53 68 61 72 65 64 20 3d 20 30 3b 0a 23 69 66 64  Shared = 0;.#ifd
1b270 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1b280 20 69 6e 74 20 68 20 3d 20 70 46 69 6c 65 2d 3e   int h = pFile->
1b290 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  h;.#endif..  ass
1b2a0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
1b2b0 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
1b2c0 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25    %d %d was %d(%
1b2d0 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66  d,%d) pid=%d (af
1b2e0 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
1b2f0 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20   eFileLock,.    
1b300 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
1b310 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e  ileLock, pFile->
1b320 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
1b330 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
1b340 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20  ->nShared,.     
1b350 20 20 20 20 20 20 6f 73 47 65 74 70 69 64 28 30        osGetpid(0
1b360 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )));..  assert( 
1b370 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
1b380 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  D_LOCK );.  if( 
1b390 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
1b3a0 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  <=eFileLock ){. 
1b3b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b3c0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45  _OK;.  }.  unixE
1b3d0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
1b3e0 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
1b3f0 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
1b400 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
1b410 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
1b420 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
1b430 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
1b440 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
1b450 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c  >eFileLock==pFil
1b460 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
1b470 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1b480 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
1b490 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1b4a0 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20  r( h=(-1) ).    
1b4b0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1b4c0 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23  enign(0);.    .#
1b4d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1b4e0 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72  UG.    /* When r
1b4f0 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73  educing a lock s
1b500 75 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70  uch that other p
1b510 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61  rocesses can sta
1b520 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  rt.    ** readin
1b530 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
1b540 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20  ile again, make 
1b550 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20  sure that the.  
1b560 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1b570 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64   counter was upd
1b580 61 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74  ated if any part
1b590 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1b5a0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61  .    ** file cha
1b5b0 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72  nged.  If the tr
1b5c0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
1b5d0 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64  r is not updated
1b5e0 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63  ,.    ** other c
1b5f0 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68  onnections to th
1b600 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68  e same file migh
1b610 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68  t not realize th
1b620 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  at.    ** the fi
1b630 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61  le has changed a
1b640 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e  nd hence might n
1b650 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68  ot know to flush
1b660 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61   their.    ** ca
1b670 63 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66  che.  The use of
1b680 20 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63   a stale cache c
1b690 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
1b6a0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
1b6b0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1b6c0 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  t( pFile->inNorm
1b6d0 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20  alWrite==0.     
1b6e0 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e        || pFile->
1b6f0 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20  dbUpdate==0.    
1b700 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d         || pFile-
1b710 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d  >transCntrChng==
1b720 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  1 );.    pFile->
1b730 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
1b740 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20  0;.#endif.    . 
1b750 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46     if( pFile->eF
1b760 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
1b770 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  VE_LOCK ){.     
1b780 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
1b790 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
1b7a0 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
1b7b0 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49  FIRST, SHARED_SI
1b7c0 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ZE, 0);.      if
1b7d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b7e0 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  && (eFileLock==S
1b7f0 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
1b800 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29  node->nShared>1)
1b810 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f   ){.        /* o
1b820 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68  nly re-establish
1b830 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
1b840 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
1b850 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 68 61  .        int sha
1b860 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48  redLockByte = SH
1b870 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64  ARED_FIRST+pInod
1b880 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20  e->sharedByte;. 
1b890 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53         rc = afpS
1b8a0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
1b8b0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73  dbPath, pFile, s
1b8c0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
1b8d0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c  , 1);.      } el
1b8e0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69  se {.        ski
1b8f0 70 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20  pShared = 1;.   
1b900 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1b910 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b920 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
1b930 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock>=PENDING_LO
1b940 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
1b950 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
1b960 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
1b970 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
1b980 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a  , 1, 0);.    } .
1b990 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b9a0 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
1b9b0 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52  eFileLock>=RESER
1b9c0 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74  VED_LOCK && cont
1b9d0 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b  ext->reserved ){
1b9e0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53  .      rc = afpS
1b9f0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
1ba00 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
1ba10 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
1ba20 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21   0);.      if( !
1ba30 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63  rc ){ .        c
1ba40 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
1ba50 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20   = 0; .      }. 
1ba60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
1ba70 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65  =SQLITE_OK && (e
1ba80 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
1ba90 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
1baa0 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20  >nShared>1)){.  
1bab0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
1bac0 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
1bad0 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  OCK;.    }.  }. 
1bae0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1baf0 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d  OK && eFileLock=
1bb00 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20  =NO_LOCK ){..   
1bb10 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
1bb20 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f  e shared lock co
1bb30 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20  unter.  Release 
1bb40 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61  the lock using a
1bb50 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c  n.    ** OS call
1bb60 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74   only when all t
1bb70 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73  hreads in this s
1bb80 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65  ame process have
1bb90 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a   released.    **
1bba0 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a   the lock..    *
1bbb0 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c  /.    unsigned l
1bbc0 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c  ong long sharedL
1bbd0 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44  ockByte = SHARED
1bbe0 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73  _FIRST+pInode->s
1bbf0 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70  haredByte;.    p
1bc00 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d  Inode->nShared--
1bc10 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
1bc20 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a  ->nShared==0 ){.
1bc30 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1bc40 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
1bc50 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1bc60 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a  Error( h=(-1) ).
1bc70 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1bc80 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
1bc90 20 20 20 20 20 20 69 66 28 20 21 73 6b 69 70 53        if( !skipS
1bca0 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  hared ){.       
1bcb0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
1bcc0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
1bcd0 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
1bce0 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a  ockByte, 1, 0);.
1bcf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1bd00 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20  ( !rc ){.       
1bd10 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
1bd20 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
1bd30 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
1bd40 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
1bd50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1bd60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1bd70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1bd80 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a  Inode->nLock--;.
1bd90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1bda0 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29  node->nLock>=0 )
1bdb0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  ;.      if( pIno
1bdc0 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  de->nLock==0 ){.
1bdd0 20 20 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e          closePen
1bde0 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a  dingFds(pFile);.
1bdf0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1be00 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65  }.  .  unixLeave
1be10 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
1be20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
1be30 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
1be40 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72  = eFileLock;.  r
1be50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1be60 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20  ** Close a file 
1be70 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70  & cleanup AFP sp
1be80 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63  ecific locking c
1be90 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69  ontext .*/.stati
1bea0 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73  c int afpClose(s
1beb0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
1bec0 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
1bed0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69  LITE_OK;.  if( i
1bee0 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
1bef0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1bf00 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61 66  File*)id;.    af
1bf10 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  pUnlock(id, NO_L
1bf20 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e  OCK);.    unixEn
1bf30 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
1bf40 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
1bf50 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  e && pFile->pIno
1bf60 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20  de->nLock ){.   
1bf70 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
1bf80 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
1bf90 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
1bfa0 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
1bfb0 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20  file just.      
1bfc0 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
1bfd0 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
1bfe0 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
1bff0 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
1c000 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73  ile.      ** des
1c010 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64  criptor to pInod
1c020 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74  e->aPending.  It
1c030 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
1c040 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68  ically closed wh
1c050 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  en.      ** the 
1c060 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65  last lock is cle
1c070 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ared..      */. 
1c080 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46       setPendingF
1c090 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  d(pFile);.    }.
1c0a0 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65      releaseInode
1c0b0 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20  Info(pFile);.   
1c0c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
1c0d0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
1c0e0 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  ext);.    rc = c
1c0f0 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
1c100 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  ;.    unixLeaveM
1c110 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65  utex();.  }.  re
1c120 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64  turn rc;.}..#end
1c130 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
1c140 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
1c150 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1c160 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a  G_STYLE */./*.**
1c170 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20   The code above 
1c180 69 73 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20  is the AFP lock 
1c190 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
1c1a0 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65   The code is spe
1c1b0 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f  cific.** to MacO
1c1c0 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  SX and does not 
1c1d0 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e  work on other un
1c1e0 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e  ix platforms.  N
1c1f0 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a  o alternative.**
1c200 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   is available.  
1c210 49 66 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d  If you don't com
1c220 70 69 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c 20  pile for a mac, 
1c230 74 68 65 6e 20 74 68 65 20 22 75 6e 69 78 2d 61  then the "unix-a
1c240 66 70 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f  fp".** VFS is no
1c250 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  t available..**.
1c260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c270 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
1c280 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   AFP lock implem
1c290 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
1c2a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
1c2b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c2c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c2d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c2e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c2f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
1c300 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
1c310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c350 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1c360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
1c370 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a  in NFS Locking *
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 2f  ***************/
1c3a0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
1c3b0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
1c3c0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1c3d0 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c  G_STYLE./*. ** L
1c3e0 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
1c3f0 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
1c400 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
1c410 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
1c420 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73  FileLock. ** mus
1c430 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
1c440 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
1c450 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74  CK.. **. ** If t
1c460 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
1c470 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
1c480 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
1c490 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20  dy at or below. 
1c4a0 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
1c4b0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
1c4c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1c4d0 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61  a no-op.. */.sta
1c4e0 74 69 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63  tic int nfsUnloc
1c4f0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
1c500 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
1c510 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73  k){.  return pos
1c520 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69  ixUnlock(id, eFi
1c530 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23  leLock, 1);.}..#
1c540 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
1c550 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
1c560 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1c570 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a  KING_STYLE */./*
1c580 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f  .** The code abo
1c590 76 65 20 69 73 20 74 68 65 20 4e 46 53 20 6c 6f  ve is the NFS lo
1c5a0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
1c5b0 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20  n.  The code is 
1c5c0 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d  specific.** to M
1c5d0 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e  acOSX and does n
1c5e0 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72  ot work on other
1c5f0 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e   unix platforms.
1c600 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65    No alternative
1c610 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
1c620 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .  .**.*********
1c630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
1c640 20 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b   of the NFS lock
1c650 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1c660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c670 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
1c680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c6a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c6b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c6c0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
1c6d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c6e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c6f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c710 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
1c720 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63  ******** Non-loc
1c730 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 69 6c  king sqlite3_fil
1c740 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  e methods ******
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 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
1c770 65 20 6e 65 78 74 20 64 69 76 69 73 69 6f 6e 20  e next division 
1c780 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65  contains impleme
1c790 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c  ntations for all
1c7a0 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20   methods of the 
1c7b0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  .** sqlite3_file
1c7c0 20 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68   object other th
1c7d0 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  an the locking m
1c7e0 65 74 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63  ethods.  The loc
1c7f0 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20  king.** methods 
1c800 77 65 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20  were defined in 
1c810 64 69 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20  divisions above 
1c820 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  (one locking met
1c830 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76 69 73  hod per.** divis
1c840 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65 74  ion).  Those met
1c850 68 6f 64 73 20 74 68 61 74 20 61 72 65 20 63 6f  hods that are co
1c860 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b  mmon to all lock
1c870 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65  ing modes.** are
1c880 20 67 61 74 68 65 72 20 74 6f 67 65 74 68 65 72   gather together
1c890 20 69 6e 74 6f 20 74 68 69 73 20 64 69 76 69 73   into this divis
1c8a0 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  ion..*/../*.** S
1c8b0 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65  eek to the offse
1c8c0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
1c8d0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
1c8e0 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a   then read cnt .
1c8f0 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  ** bytes into pB
1c900 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  uf. Return the n
1c910 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
1c920 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a  ctually read..**
1c930 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20  .** NB:  If you 
1c940 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44  define USE_PREAD
1c950 20 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c   or USE_PREAD64,
1c960 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61   then it might a
1c970 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73  lso.** be necess
1c980 61 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58  ary to define _X
1c990 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62  OPEN_SOURCE to b
1c9a0 65 20 35 30 30 2e 20 20 54 68 69 73 20 76 61 72  e 500.  This var
1c9b0 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20  ies from.** one 
1c9c0 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65  system to anothe
1c9d0 72 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65  r.  Since SQLite
1c9e0 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65   does not define
1c9f0 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 69 6e   USE_PREAD.** in
1ca00 20 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65 66   any form by def
1ca10 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f  ault, we will no
1ca20 74 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65 66  t attempt to def
1ca30 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43  ine _XOPEN_SOURC
1ca40 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65 74  E..** See ticket
1ca50 73 20 23 32 37 34 31 20 61 6e 64 20 23 32 36 38  s #2741 and #268
1ca60 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69  1..**.** To avoi
1ca70 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65  d stomping the e
1ca80 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20  rrno value on a 
1ca90 66 61 69 6c 65 64 20 72 65 61 64 20 74 68 65 20  failed read the 
1caa0 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a  lastErrno value.
1cab0 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65  ** is set before
1cac0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
1cad0 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e  tatic int seekAn
1cae0 64 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20 2a  dRead(unixFile *
1caf0 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  id, sqlite3_int6
1cb00 34 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20 2a  4 offset, void *
1cb10 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  pBuf, int cnt){.
1cb20 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 6e 74    int got;.  int
1cb30 20 70 72 69 6f 72 20 3d 20 30 3b 0a 23 69 66 20   prior = 0;.#if 
1cb40 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  (!defined(USE_PR
1cb50 45 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64  EAD) && !defined
1cb60 28 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20  (USE_PREAD64)). 
1cb70 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a   i64 newOffset;.
1cb80 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53  #endif.  TIMER_S
1cb90 54 41 52 54 3b 0a 20 20 61 73 73 65 72 74 28 20  TART;.  assert( 
1cba0 63 6e 74 3d 3d 28 63 6e 74 26 30 78 31 66 66 66  cnt==(cnt&0x1fff
1cbb0 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  f) );.  assert( 
1cbc0 69 64 2d 3e 68 3e 32 20 29 3b 0a 20 20 63 6e 74  id->h>2 );.  cnt
1cbd0 20 26 3d 20 30 78 31 66 66 66 66 3b 0a 20 20 64   &= 0x1ffff;.  d
1cbe0 6f 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  o{.#if defined(U
1cbf0 53 45 5f 50 52 45 41 44 29 0a 20 20 20 20 67 6f  SE_PREAD).    go
1cc00 74 20 3d 20 6f 73 50 72 65 61 64 28 69 64 2d 3e  t = osPread(id->
1cc10 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66  h, pBuf, cnt, of
1cc20 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c  fset);.    Simul
1cc30 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20  ateIOError( got 
1cc40 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64 65  = -1 );.#elif de
1cc50 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
1cc60 34 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 50  4).    got = osP
1cc70 72 65 61 64 36 34 28 69 64 2d 3e 68 2c 20 70 42  read64(id->h, pB
1cc80 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
1cc90 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
1cca0 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20  Error( got = -1 
1ccb0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 65 77  );.#else.    new
1ccc0 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69  Offset = lseek(i
1ccd0 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45  d->h, offset, SE
1cce0 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53 69 6d  EK_SET);.    Sim
1ccf0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e 65  ulateIOError( ne
1cd00 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20 20  wOffset-- );.   
1cd10 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d   if( newOffset!=
1cd20 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  offset ){.      
1cd30 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d  if( newOffset ==
1cd40 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73   -1 ){.        s
1cd50 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75  toreLastErrno((u
1cd60 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72 72  nixFile*)id, err
1cd70 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  no);.      }else
1cd80 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c  {.        storeL
1cd90 61 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69  astErrno((unixFi
1cda0 6c 65 2a 29 69 64 2c 20 30 29 3b 0a 20 20 20 20  le*)id, 0);.    
1cdb0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1cdc0 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67   -1;.    }.    g
1cdd0 6f 74 20 3d 20 6f 73 52 65 61 64 28 69 64 2d 3e  ot = osRead(id->
1cde0 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23  h, pBuf, cnt);.#
1cdf0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 67 6f  endif.    if( go
1ce00 74 3d 3d 63 6e 74 20 29 20 62 72 65 61 6b 3b 0a  t==cnt ) break;.
1ce10 20 20 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b      if( got<0 ){
1ce20 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f  .      if( errno
1ce30 3d 3d 45 49 4e 54 52 20 29 7b 20 67 6f 74 20 3d  ==EINTR ){ got =
1ce40 20 31 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 0a   1; continue; }.
1ce50 20 20 20 20 20 20 70 72 69 6f 72 20 3d 20 30 3b        prior = 0;
1ce60 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
1ce70 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a  Errno((unixFile*
1ce80 29 69 64 2c 20 20 65 72 72 6e 6f 29 3b 0a 20 20  )id,  errno);.  
1ce90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1cea0 65 6c 73 65 20 69 66 28 20 67 6f 74 3e 30 20 29  else if( got>0 )
1ceb0 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d 3d 20 67  {.      cnt -= g
1cec0 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  ot;.      offset
1ced0 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70   += got;.      p
1cee0 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a 20 20 20  rior += got;.   
1cef0 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a     pBuf = (void*
1cf00 29 28 67 6f 74 20 2b 20 28 63 68 61 72 2a 29 70  )(got + (char*)p
1cf10 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  Buf);.    }.  }w
1cf20 68 69 6c 65 28 20 67 6f 74 3e 30 20 29 3b 0a 20  hile( got>0 );. 
1cf30 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53   TIMER_END;.  OS
1cf40 54 52 41 43 45 28 28 22 52 45 41 44 20 20 20 20  TRACE(("READ    
1cf50 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25  %-3d %5d %7lld %
1cf60 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  llu\n",.        
1cf70 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f 74 2b 70      id->h, got+p
1cf80 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d 70 72 69  rior, offset-pri
1cf90 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  or, TIMER_ELAPSE
1cfa0 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f  D));.  return go
1cfb0 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  t+prior;.}../*.*
1cfc0 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d  * Read data from
1cfd0 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62   a file into a b
1cfe0 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53  uffer.  Return S
1cff0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a  QLITE_OK if all.
1d000 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 65  ** bytes were re
1d010 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ad successfully 
1d020 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  and SQLITE_IOERR
1d030 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
1d040 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  s.** wrong..*/.s
1d050 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52 65  tatic int unixRe
1d060 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ad(.  sqlite3_fi
1d070 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20  le *id, .  void 
1d080 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d  *pBuf, .  int am
1d090 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  t,.  sqlite3_int
1d0a0 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 75  64 offset.){.  u
1d0b0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1d0c0 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b   (unixFile *)id;
1d0d0 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73  .  int got;.  as
1d0e0 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73  sert( id );.  as
1d0f0 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20  sert( offset>=0 
1d100 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74  );.  assert( amt
1d110 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  >0 );..  /* If t
1d120 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61 73  his is a databas
1d130 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f  e file (not a jo
1d140 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f  urnal, master-jo
1d150 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20  urnal or temp.  
1d160 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79  ** file), the by
1d170 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  tes in the locki
1d180 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20  ng range should 
1d190 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72  never be read or
1d1a0 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66   written. */.#if
1d1b0 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69   0.  assert( pFi
1d1c0 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20  le->pUnused==0. 
1d1d0 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e        || offset>
1d1e0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31  =PENDING_BYTE+51
1d1f0 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73  2.       || offs
1d200 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f  et+amt<=PENDING_
1d210 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69  BYTE .  );.#endi
1d220 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  f..#if SQLITE_MA
1d230 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1d240 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73 20  /* Deal with as 
1d250 6d 75 63 68 20 6f 66 20 74 68 69 73 20 72 65 61  much of this rea
1d260 64 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73  d request as pos
1d270 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65  sible by transfe
1d280 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66  ring.  ** data f
1d290 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d  rom the memory m
1d2a0 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d  apping using mem
1d2b0 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28  cpy().  */.  if(
1d2c0 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d   offset<pFile->m
1d2d0 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69  mapSize ){.    i
1d2e0 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d  f( offset+amt <=
1d2f0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1d300 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
1d310 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28  (pBuf, &((u8 *)(
1d320 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1d330 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74  n))[offset], amt
1d340 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1d350 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1d360 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
1d370 6e 43 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d  nCopy = pFile->m
1d380 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  mapSize - offset
1d390 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
1d3a0 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46  Buf, &((u8 *)(pF
1d3b0 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
1d3c0 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79  )[offset], nCopy
1d3d0 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20  );.      pBuf = 
1d3e0 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43  &((u8 *)pBuf)[nC
1d3f0 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20  opy];.      amt 
1d400 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20  -= nCopy;.      
1d410 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b  offset += nCopy;
1d420 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1d430 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41  f..  got = seekA
1d440 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66  ndRead(pFile, of
1d450 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29  fset, pBuf, amt)
1d460 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74  ;.  if( got==amt
1d470 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1d480 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
1d490 65 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20  e if( got<0 ){. 
1d4a0 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20     /* lastErrno 
1d4b0 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65  set by seekAndRe
1d4c0 61 64 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ad */.    return
1d4d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
1d4e0 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  AD;.  }else{.   
1d4f0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
1d500 70 46 69 6c 65 2c 20 30 29 3b 20 20 20 2f 2a 20  pFile, 0);   /* 
1d510 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72  not a system err
1d520 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72  or */.    /* Unr
1d530 65 61 64 20 70 61 72 74 73 20 6f 66 20 74 68 65  ead parts of the
1d540 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20   buffer must be 
1d550 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20  zero-filled */. 
1d560 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61     memset(&((cha
1d570 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30  r*)pBuf)[got], 0
1d580 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20  , amt-got);.    
1d590 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1d5a0 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a  ERR_SHORT_READ;.
1d5b0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74    }.}../*.** Att
1d5c0 65 6d 70 74 20 74 6f 20 73 65 65 6b 20 74 68 65  empt to seek the
1d5d0 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
1d5e0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
1d5f0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
1d600 0a 2a 2a 20 61 62 73 6f 6c 75 74 65 20 6f 66 66  .** absolute off
1d610 73 65 74 20 69 4f 66 66 2c 20 74 68 65 6e 20 61  set iOff, then a
1d620 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
1d630 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 64 61  nBuf bytes of da
1d640 74 61 20 66 72 6f 6d 0a 2a 2a 20 70 42 75 66 20  ta from.** pBuf 
1d650 74 6f 20 69 74 2e 20 49 66 20 61 6e 20 65 72 72  to it. If an err
1d660 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
1d670 6e 20 2d 31 20 61 6e 64 20 73 65 74 20 2a 70 69  n -1 and set *pi
1d680 45 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65  Errno. Otherwise
1d690 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65  , .** return the
1d6a0 20 61 63 74 75 61 6c 20 6e 75 6d 62 65 72 20 6f   actual number o
1d6b0 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20  f bytes written 
1d6c0 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 6c 65  (which may be le
1d6d0 73 73 20 74 68 61 6e 0a 2a 2a 20 6e 42 75 66 29  ss than.** nBuf)
1d6e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d6f0 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64 28 0a  seekAndWriteFd(.
1d700 20 20 69 6e 74 20 66 64 2c 20 20 20 20 20 20 20    int fd,       
1d710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d720 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
1d730 70 74 6f 72 20 74 6f 20 77 72 69 74 65 20 74 6f  ptor to write to
1d740 20 2a 2f 0a 20 20 69 36 34 20 69 4f 66 66 2c 20   */.  i64 iOff, 
1d750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d760 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6f 66        /* File of
1d770 66 73 65 74 20 74 6f 20 62 65 67 69 6e 20 77 72  fset to begin wr
1d780 69 74 69 6e 67 20 61 74 20 2a 2f 0a 20 20 63 6f  iting at */.  co
1d790 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
1d7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d7b0 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
1d7c0 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 74  this buffer to t
1d7d0 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  he file */.  int
1d7e0 20 6e 42 75 66 2c 20 20 20 20 20 20 20 20 20 20   nBuf,          
1d7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d800 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70  Size of buffer p
1d810 42 75 66 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  Buf in bytes */.
1d820 20 20 69 6e 74 20 2a 70 69 45 72 72 6e 6f 20 20    int *piErrno  
1d830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d840 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20    /* OUT: Error 
1d850 6e 75 6d 62 65 72 20 69 66 20 65 72 72 6f 72 20  number if error 
1d860 6f 63 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69  occurs */.){.  i
1d870 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20  nt rc = 0;      
1d880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d890 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
1d8a0 20 62 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 20   by system call 
1d8b0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 42  */..  assert( nB
1d8c0 75 66 3d 3d 28 6e 42 75 66 26 30 78 31 66 66 66  uf==(nBuf&0x1fff
1d8d0 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  f) );.  assert( 
1d8e0 66 64 3e 32 20 29 3b 0a 20 20 6e 42 75 66 20 26  fd>2 );.  nBuf &
1d8f0 3d 20 30 78 31 66 66 66 66 3b 0a 20 20 54 49 4d  = 0x1ffff;.  TIM
1d900 45 52 5f 53 54 41 52 54 3b 0a 0a 23 69 66 20 64  ER_START;..#if d
1d910 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
1d920 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20 28 69 6e  ).  do{ rc = (in
1d930 74 29 6f 73 50 77 72 69 74 65 28 66 64 2c 20 70  t)osPwrite(fd, p
1d940 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29  Buf, nBuf, iOff)
1d950 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26  ; }while( rc<0 &
1d960 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
1d970 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
1d980 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 64  USE_PREAD64).  d
1d990 6f 7b 20 72 63 20 3d 20 28 69 6e 74 29 6f 73 50  o{ rc = (int)osP
1d9a0 77 72 69 74 65 36 34 28 66 64 2c 20 70 42 75 66  write64(fd, pBuf
1d9b0 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b 7d 77  , nBuf, iOff);}w
1d9c0 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
1d9d0 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c  rno==EINTR);.#el
1d9e0 73 65 0a 20 20 64 6f 7b 0a 20 20 20 20 69 36 34  se.  do{.    i64
1d9f0 20 69 53 65 65 6b 20 3d 20 6c 73 65 65 6b 28 66   iSeek = lseek(f
1da00 64 2c 20 69 4f 66 66 2c 20 53 45 45 4b 5f 53 45  d, iOff, SEEK_SE
1da10 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  T);.    Simulate
1da20 49 4f 45 72 72 6f 72 28 20 69 53 65 65 6b 2d 2d  IOError( iSeek--
1da30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 53 65   );..    if( iSe
1da40 65 6b 21 3d 69 4f 66 66 20 29 7b 0a 20 20 20 20  ek!=iOff ){.    
1da50 20 20 69 66 28 20 70 69 45 72 72 6e 6f 20 29 20    if( piErrno ) 
1da60 2a 70 69 45 72 72 6e 6f 20 3d 20 28 69 53 65 65  *piErrno = (iSee
1da70 6b 3d 3d 2d 31 20 3f 20 65 72 72 6e 6f 20 3a 20  k==-1 ? errno : 
1da80 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
1da90 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   -1;.    }.    r
1daa0 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c 20  c = osWrite(fd, 
1dab0 70 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20 7d  pBuf, nBuf);.  }
1dac0 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
1dad0 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23  rrno==EINTR );.#
1dae0 65 6e 64 69 66 0a 0a 20 20 54 49 4d 45 52 5f 45  endif..  TIMER_E
1daf0 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ND;.  OSTRACE(("
1db00 57 52 49 54 45 20 20 20 25 2d 33 64 20 25 35 64  WRITE   %-3d %5d
1db10 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20   %7lld %llu\n", 
1db20 66 64 2c 20 72 63 2c 20 69 4f 66 66 2c 20 54 49  fd, rc, iOff, TI
1db30 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 0a  MER_ELAPSED));..
1db40 20 20 69 66 28 20 72 63 3c 30 20 26 26 20 70 69    if( rc<0 && pi
1db50 45 72 72 6e 6f 20 29 20 2a 70 69 45 72 72 6e 6f  Errno ) *piErrno
1db60 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 72 65 74 75   = errno;.  retu
1db70 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1db80 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66   Seek to the off
1db90 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65  set in id->offse
1dba0 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20  t then read cnt 
1dbb0 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e  bytes into pBuf.
1dbc0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
1dbd0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
1dbe0 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20 20 55  ctually read.  U
1dbf0 70 64 61 74 65 20 74 68 65 20 6f 66 66 73 65 74  pdate the offset
1dc00 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64  ..**.** To avoid
1dc10 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72   stomping the er
1dc20 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66  rno value on a f
1dc30 61 69 6c 65 64 20 77 72 69 74 65 20 74 68 65 20  ailed write the 
1dc40 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a  lastErrno value.
1dc50 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65  ** is set before
1dc60 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
1dc70 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e  tatic int seekAn
1dc80 64 57 72 69 74 65 28 75 6e 69 78 46 69 6c 65 20  dWrite(unixFile 
1dc90 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *id, i64 offset,
1dca0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
1dcb0 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 72  f, int cnt){.  r
1dcc0 65 74 75 72 6e 20 73 65 65 6b 41 6e 64 57 72 69  eturn seekAndWri
1dcd0 74 65 46 64 28 69 64 2d 3e 68 2c 20 6f 66 66 73  teFd(id->h, offs
1dce0 65 74 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 26  et, pBuf, cnt, &
1dcf0 69 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 29 3b 0a  id->lastErrno);.
1dd00 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
1dd10 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
1dd20 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20  er into a file. 
1dd30 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1dd40 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20  K on success.** 
1dd50 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
1dd60 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c  ror code on fail
1dd70 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
1dd80 6e 74 20 75 6e 69 78 57 72 69 74 65 28 0a 20 20  nt unixWrite(.  
1dd90 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1dda0 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  , .  const void 
1ddb0 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d  *pBuf, .  int am
1ddc0 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  t,.  sqlite3_int
1ddd0 36 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20  64 offset .){.  
1dde0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
1ddf0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
1de00 0a 20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30  .  int wrote = 0
1de10 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29  ;.  assert( id )
1de20 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e  ;.  assert( amt>
1de30 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  0 );..  /* If th
1de40 69 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65  is is a database
1de50 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75   file (not a jou
1de60 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75  rnal, master-jou
1de70 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a  rnal or temp.  *
1de80 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74  * file), the byt
1de90 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  es in the lockin
1dea0 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e  g range should n
1deb0 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20  ever be read or 
1dec0 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20  written. */.#if 
1ded0 30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  0.  assert( pFil
1dee0 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20  e->pUnused==0.  
1def0 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d       || offset>=
1df00 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32  PENDING_BYTE+512
1df10 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
1df20 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42  t+amt<=PENDING_B
1df30 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66  YTE .  );.#endif
1df40 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1df50 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65  DEBUG.  /* If we
1df60 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72   are doing a nor
1df70 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64  mal write to a d
1df80 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
1df90 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a   opposed to.  **
1dfa0 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75   doing a hot-jou
1dfb0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  rnal rollback or
1dfc0 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65   a write to some
1dfd0 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e   file other than
1dfe0 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64   a.  ** normal d
1dff0 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 74 68  atabase file) th
1e000 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20 66 61  en record the fa
1e010 63 74 20 74 68 61 74 20 74 68 65 20 64 61 74 61  ct that the data
1e020 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68  base.  ** has ch
1e030 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74  anged.  If the t
1e040 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1e050 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20  er is modified, 
1e060 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a  record that.  **
1e070 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a   fact too..  */.
1e080 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e    if( pFile->inN
1e090 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20  ormalWrite ){.  
1e0a0 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74    pFile->dbUpdat
1e0b0 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64  e = 1;  /* The d
1e0c0 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
1e0d0 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20   modified */.   
1e0e0 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20   if( offset<=24 
1e0f0 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32  && offset+amt>=2
1e100 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  7 ){.      int r
1e110 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c  c;.      char ol
1e120 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20  dCntr[4];.      
1e130 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1e140 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
1e150 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  rc = seekAndRead
1e160 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43  (pFile, 24, oldC
1e170 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53  ntr, 4);.      S
1e180 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1e190 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69  nign(0);.      i
1e1a0 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63  f( rc!=4 || memc
1e1b0 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63  mp(oldCntr, &((c
1e1c0 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66  har*)pBuf)[24-of
1e1d0 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a  fset], 4)!=0 ){.
1e1e0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74          pFile->t
1e1f0 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31  ransCntrChng = 1
1e200 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61  ;  /* The transa
1e210 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61  ction counter ha
1e220 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20  s changed */.   
1e230 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
1e240 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
1e250 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
1e260 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68  0.  /* Deal with
1e270 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73   as much of this
1e280 20 77 72 69 74 65 20 72 65 71 75 65 73 74 20 61   write request a
1e290 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72  s possible by tr
1e2a0 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64  ansfering.  ** d
1e2b0 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d  ata from the mem
1e2c0 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e  ory mapping usin
1e2d0 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a  g memcpy().  */.
1e2e0 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69    if( offset<pFi
1e2f0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
1e300 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61      if( offset+a
1e310 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  mt <= pFile->mma
1e320 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d  pSize ){.      m
1e330 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70  emcpy(&((u8 *)(p
1e340 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1e350 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ))[offset], pBuf
1e360 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65  , amt);.      re
1e370 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e380 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e390 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69   int nCopy = pFi
1e3a0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f  le->mmapSize - o
1e3b0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d  ffset;.      mem
1e3c0 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69  cpy(&((u8 *)(pFi
1e3d0 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
1e3e0 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
1e3f0 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42  nCopy);.      pB
1e400 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75  uf = &((u8 *)pBu
1e410 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20  f)[nCopy];.     
1e420 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20   amt -= nCopy;. 
1e430 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e       offset += n
1e440 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Copy;.    }.  }.
1e450 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65 28  #endif..  while(
1e460 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65   amt>0 && (wrote
1e470 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28   = seekAndWrite(
1e480 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70  pFile, offset, p
1e490 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a  Buf, amt))>0 ){.
1e4a0 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65      amt -= wrote
1e4b0 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20  ;.    offset += 
1e4c0 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20  wrote;.    pBuf 
1e4d0 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  = &((char*)pBuf)
1e4e0 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53  [wrote];.  }.  S
1e4f0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28  imulateIOError((
1e500 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74   wrote=(-1), amt
1e510 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74  =1 ));.  Simulat
1e520 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28  eDiskfullError((
1e530 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20   wrote=0, amt=1 
1e540 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e 30  ));..  if( amt>0
1e550 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72 6f 74   ){.    if( wrot
1e560 65 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e 6c 61  e<0 && pFile->la
1e570 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53 50 43 20  stErrno!=ENOSPC 
1e580 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73 74  ){.      /* last
1e590 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
1e5a0 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20  kAndWrite */.   
1e5b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e5c0 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20  _IOERR_WRITE;.  
1e5d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1e5e0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
1e5f0 69 6c 65 2c 20 30 29 3b 20 2f 2a 20 6e 6f 74 20  ile, 0); /* not 
1e600 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a  a system error *
1e610 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
1e620 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
1e630 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
1e640 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
1e650 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
1e660 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
1e670 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73   number of fulls
1e680 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20  yncs and normal 
1e690 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20  syncs.  This is 
1e6a0 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20  used to test.** 
1e6b0 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66  that syncs and f
1e6c0 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63  ullsyncs are occ
1e6d0 75 72 72 69 6e 67 20 61 74 20 74 68 65 20 72 69  urring at the ri
1e6e0 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e  ght times..*/.in
1e6f0 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63  t sqlite3_sync_c
1e700 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71  ount = 0;.int sq
1e710 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
1e720 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
1e730 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f  ../*.** We do no
1e740 74 20 74 72 75 73 74 20 73 79 73 74 65 6d 73 20  t trust systems 
1e750 74 6f 20 70 72 6f 76 69 64 65 20 61 20 77 6f 72  to provide a wor
1e760 6b 69 6e 67 20 66 64 61 74 61 73 79 6e 63 28 29  king fdatasync()
1e770 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f  .  Some do..** O
1e780 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f  thers do no.  To
1e790 20 62 65 20 73 61 66 65 2c 20 77 65 20 77 69 6c   be safe, we wil
1e7a0 6c 20 73 74 69 63 6b 20 77 69 74 68 20 74 68 65  l stick with the
1e7b0 20 28 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65   (slightly slowe
1e7c0 72 29 0a 2a 2a 20 66 73 79 6e 63 28 29 2e 20 49  r).** fsync(). I
1e7d0 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20  f you know that 
1e7e0 79 6f 75 72 20 73 79 73 74 65 6d 20 64 6f 65 73  your system does
1e7f0 20 73 75 70 70 6f 72 74 20 66 64 61 74 61 73 79   support fdatasy
1e800 6e 63 28 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a  nc() correctly,.
1e810 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79 20 63  ** then simply c
1e820 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44 66 64  ompile with -Dfd
1e830 61 74 61 73 79 6e 63 3d 66 64 61 74 61 73 79 6e  atasync=fdatasyn
1e840 63 20 6f 72 20 2d 44 48 41 56 45 5f 46 44 41 54  c or -DHAVE_FDAT
1e850 41 53 59 4e 43 0a 2a 2f 0a 23 69 66 20 21 64 65  ASYNC.*/.#if !de
1e860 66 69 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29  fined(fdatasync)
1e870 20 26 26 20 21 48 41 56 45 5f 46 44 41 54 41 53   && !HAVE_FDATAS
1e880 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 66 64 61  YNC.# define fda
1e890 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e  tasync fsync.#en
1e8a0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e  dif../*.** Defin
1e8b0 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
1e8c0 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e   to 0 or 1 depen
1e8d0 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
1e8e0 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f  or not.** the F_
1e8f0 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20  FULLFSYNC macro 
1e900 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46  is defined.  F_F
1e910 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72  ULLFSYNC is curr
1e920 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76  ently.** only av
1e930 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f  ailable on Mac O
1e940 53 20 58 2e 20 20 42 75 74 20 74 68 61 74 20 63  S X.  But that c
1e950 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a  ould change..*/.
1e960 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59  #ifdef F_FULLFSY
1e970 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45  NC.# define HAVE
1e980 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c  _FULLFSYNC 1.#el
1e990 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45  se.# define HAVE
1e9a0 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e  _FULLFSYNC 0.#en
1e9b0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1e9c0 54 45 5f 55 53 45 5f 52 45 51 55 45 53 54 5f 46  TE_USE_REQUEST_F
1e9d0 55 4c 4c 46 53 59 4e 43 0a 23 69 6d 70 6f 72 74  ULLFSYNC.#import
1e9e0 20 3c 6e 6f 74 69 66 79 2e 68 3e 0a 23 69 6d 70   <notify.h>.#imp
1e9f0 6f 72 74 20 3c 6c 69 62 6b 65 72 6e 2f 4f 53 41  ort <libkern/OSA
1ea00 74 6f 6d 69 63 2e 68 3e 0a 73 74 61 74 69 63 20  tomic.h>.static 
1ea10 4f 53 53 70 69 6e 4c 6f 63 6b 20 6e 6f 74 69 66  OSSpinLock notif
1ea20 79 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 23 64 65 66  y_lock = 0;.#def
1ea30 69 6e 65 20 52 45 51 55 45 53 54 5f 46 55 4c 4c  ine REQUEST_FULL
1ea40 53 59 4e 43 5f 4e 4f 54 49 46 49 43 41 54 49 4f  SYNC_NOTIFICATIO
1ea50 4e 20 20 20 20 22 63 6f 6d 2e 61 70 70 6c 65 2e  N    "com.apple.
1ea60 72 65 71 73 79 6e 63 22 0a 23 65 6e 64 69 66 0a  reqsync".#endif.
1ea70 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63  ./*.** The fsync
1ea80 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 64  () system call d
1ea90 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20  oes not work as 
1eaa0 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d 61  advertised on ma
1eab0 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74 65  ny.** unix syste
1eac0 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ms.  The followi
1ead0 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  ng procedure is 
1eae0 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61  an attempt to ma
1eaf0 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65  ke.** it work be
1eb00 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tter..**.** The 
1eb10 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d  SQLITE_NO_SYNC m
1eb20 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61 6c  acro disables al
1eb30 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68 69  l fsync()s.  Thi
1eb40 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66  s is useful.** f
1eb50 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e 20  or testing when 
1eb60 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 74  we want to run t
1eb70 68 72 6f 75 67 68 20 74 68 65 20 74 65 73 74 20  hrough the test 
1eb80 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a  suite quickly..*
1eb90 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e 67  * You are strong
1eba0 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a  ly advised *not*
1ebb0 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68 20   to deploy with 
1ebc0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a  SQLITE_NO_SYNC.*
1ebd0 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76  * enabled, howev
1ebe0 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20 53  er, since with S
1ebf0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e  QLITE_NO_SYNC en
1ec00 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72 61  abled, an OS cra
1ec10 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  sh.** or power f
1ec20 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65  ailure will like
1ec30 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64  ly corrupt the d
1ec40 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1ec50 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74 73 20  .** SQLite sets 
1ec60 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61  the dataOnly fla
1ec70 67 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f 66  g if the size of
1ec80 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 63   the file is unc
1ec90 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69  hanged..** The i
1eca0 64 65 61 20 62 65 68 69 6e 64 20 64 61 74 61 4f  dea behind dataO
1ecb0 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74 20 73  nly is that it s
1ecc0 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65  hould only write
1ecd0 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e   the file conten
1ece0 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f  t.** to disk, no
1ecf0 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 57 65  t the inode.  We
1ed00 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61 4f 6e   only set dataOn
1ed10 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65 20 73  ly if the file s
1ed20 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61  ize is .** uncha
1ed30 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65 20 66  nged since the f
1ed40 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61 72 74  ile size is part
1ed50 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e 20 20   of the inode.  
1ed60 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64  However, .** Ted
1ed70 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73 20 74   Ts'o tells us t
1ed80 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29 20  hat fdatasync() 
1ed90 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65 20  will also write 
1eda0 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74 68 65  the inode if the
1edb0 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 68 61  .** file size ha
1edc0 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68 65 20  s changed.  The 
1edd0 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66 65 72  only real differ
1ede0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66 64 61  ence between fda
1edf0 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20  tasync().** and 
1ee00 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74 65 6c  fsync(), Ted tel
1ee10 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74 20 66  ls us, is that f
1ee20 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20  datasync() will 
1ee30 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a  not flush the.**
1ee40 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20 6d 74   inode if the mt
1ee50 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20  ime or owner or 
1ee60 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74 74 72  other inode attr
1ee70 69 62 75 74 65 73 20 68 61 76 65 20 63 68 61 6e  ibutes have chan
1ee80 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20  ged..** We only 
1ee90 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 66  care about the f
1eea0 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68  ile size, not th
1eeb0 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61 74 74  e other file att
1eec0 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61  ributes, so.** a
1eed0 73 20 66 61 72 20 61 73 20 53 51 4c 69 74 65 20  s far as SQLite 
1eee0 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e  is concerned, an
1eef0 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 73 20   fdatasync() is 
1ef00 61 6c 77 61 79 73 20 61 64 65 71 75 61 74 65 2e  always adequate.
1ef10 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61 79  .** So, we alway
1ef20 73 20 75 73 65 20 66 64 61 74 61 73 79 6e 63 28  s use fdatasync(
1ef30 29 20 69 66 20 69 74 20 69 73 20 61 76 61 69 6c  ) if it is avail
1ef40 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65 73 73  able, regardless
1ef50 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   of.** the value
1ef60 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e 6c 79   of the dataOnly
1ef70 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63   flag..*/.static
1ef80 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28   int full_fsync(
1ef90 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c  int fd, int full
1efa0 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e  Sync, int dataOn
1efb0 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ly){.  int rc;..
1efc0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1efd0 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66 2f 65  ng "ifdef/elif/e
1efe0 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20  lse/" block has 
1eff0 74 68 65 20 73 61 6d 65 20 73 74 72 75 63 74 75  the same structu
1f000 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f  re as.  ** the o
1f010 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69 73 20  ne below. It is 
1f020 72 65 70 6c 69 63 61 74 65 64 20 68 65 72 65 20  replicated here 
1f030 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64 20  solely to avoid 
1f040 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a  cluttering .  **
1f050 20 75 70 20 74 68 65 20 72 65 61 6c 20 63 6f 64   up the real cod
1f060 65 20 77 69 74 68 20 74 68 65 20 55 4e 55 53 45  e with the UNUSE
1f070 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20 6d 61  D_PARAMETER() ma
1f080 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  cros..  */.#ifde
1f090 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
1f0a0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1f0b0 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45  TER(fd);.  UNUSE
1f0c0 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c  D_PARAMETER(full
1f0d0 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Sync);.  UNUSED_
1f0e0 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
1f0f0 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f  ly);.#elif HAVE_
1f100 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53  FULLFSYNC.  UNUS
1f110 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
1f120 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20  aOnly);.#else.  
1f130 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1f140 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e  (fullSync);.  UN
1f150 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
1f160 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66  ataOnly);.#endif
1f170 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68  ..  /* Record th
1f180 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  e number of time
1f190 73 20 74 68 61 74 20 77 65 20 64 6f 20 61 20 6e  s that we do a n
1f1a0 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 61 6e  ormal fsync() an
1f1b0 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43  d .  ** FULLSYNC
1f1c0 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
1f1d0 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20 74  during testing t
1f1e0 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
1f1f0 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a  is procedure.  *
1f200 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 69  * gets called wi
1f210 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 61  th the correct a
1f220 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23  rguments..  */.#
1f230 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1f240 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63  T.  if( fullSync
1f250 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73   ) sqlite3_fulls
1f260 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73  ync_count++;.  s
1f270 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
1f280 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  t++;.#endif..  /
1f290 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64  * If we compiled
1f2a0 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
1f2b0 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74  _NO_SYNC flag, t
1f2c0 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61  hen syncing is a
1f2d0 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f  .  ** no-op.  */
1f2e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e  .#ifdef SQLITE_N
1f2f0 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20 53 51  O_SYNC.  rc = SQ
1f300 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48  LITE_OK;.#elif H
1f310 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20  AVE_FULLFSYNC.  
1f320 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  if( fullSync ){.
1f330 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53  #ifdef SQLITE_US
1f340 45 5f 52 45 51 55 45 53 54 5f 46 55 4c 4c 46 53  E_REQUEST_FULLFS
1f350 59 4e 43 0a 20 20 20 20 72 63 20 3d 20 6f 73 46  YNC.    rc = osF
1f360 73 79 6e 63 28 66 64 29 3b 0a 20 20 20 20 69 66  sync(fd);.    if
1f370 20 28 21 72 63 29 20 7b 0a 20 20 20 20 20 20 4f   (!rc) {.      O
1f380 53 53 70 69 6e 4c 6f 63 6b 4c 6f 63 6b 28 26 6e  SSpinLockLock(&n
1f390 6f 74 69 66 79 5f 6c 6f 63 6b 29 3b 0a 20 20 20  otify_lock);.   
1f3a0 20 20 20 72 63 20 3d 20 6e 6f 74 69 66 79 5f 70     rc = notify_p
1f3b0 6f 73 74 28 52 45 51 55 45 53 54 5f 46 55 4c 4c  ost(REQUEST_FULL
1f3c0 53 59 4e 43 5f 4e 4f 54 49 46 49 43 41 54 49 4f  SYNC_NOTIFICATIO
1f3d0 4e 29 3b 0a 20 20 20 20 20 20 4f 53 53 70 69 6e  N);.      OSSpin
1f3e0 4c 6f 63 6b 55 6e 6c 6f 63 6b 28 26 6e 6f 74 69  LockUnlock(&noti
1f3f0 66 79 5f 6c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a  fy_lock);.    }.
1f400 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 6f  #else.    rc = o
1f410 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c  sFcntl(fd, F_FUL
1f420 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 23 65 6e 64  LFSYNC, 0);.#end
1f430 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
1f440 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a  rc = 1;.  }.  /*
1f450 20 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e   If the FULLFSYN
1f460 43 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62  C failed, fall b
1f470 61 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e  ack to attemptin
1f480 67 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20  g an fsync()..  
1f490 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20  ** It shouldn't 
1f4a0 62 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  be possible for 
1f4b0 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69  fullfsync to fai
1f4c0 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a  l on the local .
1f4d0 20 20 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d    ** file system
1f4e0 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61   (on OSX), so fa
1f4f0 69 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73 20  ilure indicates 
1f500 74 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20  that FULLFSYNC. 
1f510 20 2a 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72   ** isn't suppor
1f520 74 65 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ted for this fil
1f530 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74  e system. So, at
1f540 74 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a  tempt an fsync .
1f550 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f    ** and (for no
1f560 77 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76  w) ignore the ov
1f570 65 72 68 65 61 64 20 6f 66 20 61 20 73 75 70 65  erhead of a supe
1f580 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61  rfluous fcntl ca
1f590 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64 20  ll.  .  ** It'd 
1f5a0 62 65 20 62 65 74 74 65 72 20 74 6f 20 64 65 74  be better to det
1f5b0 65 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75  ect fullfsync su
1f5c0 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61  pport once and a
1f5d0 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68 65 20 66  void .  ** the f
1f5e0 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20  cntl call every 
1f5f0 74 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c  time sync is cal
1f600 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  led..  */.  if( 
1f610 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28  rc ) rc = fsync(
1f620 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69  fd);..#elif defi
1f630 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1f640 20 2f 2a 20 66 64 61 74 61 73 79 6e 63 28 29 20   /* fdatasync() 
1f650 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e 27 74 20  on HFS+ doesn't 
1f660 79 65 74 20 66 6c 75 73 68 20 74 68 65 20 66 69  yet flush the fi
1f670 6c 65 20 73 69 7a 65 20 69 66 20 69 74 20 63 68  le size if it ch
1f680 61 6e 67 65 64 20 63 6f 72 72 65 63 74 6c 79 0a  anged correctly.
1f690 20 20 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c    ** so currentl
1f6a0 79 20 77 65 20 64 65 66 61 75 6c 74 20 74 6f 20  y we default to 
1f6b0 74 68 65 20 6d 61 63 72 6f 20 74 68 61 74 20 72  the macro that r
1f6c0 65 64 65 66 69 6e 65 73 20 66 64 61 74 61 73 79  edefines fdatasy
1f6d0 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f  nc to fsync.  */
1f6e0 0a 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64  .  rc = fsync(fd
1f6f0 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72 63 20 3d  );.#else .  rc =
1f700 20 66 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a   fdatasync(fd);.
1f710 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
1f720 20 69 66 28 20 72 63 3d 3d 2d 31 20 26 26 20 65   if( rc==-1 && e
1f730 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b  rrno==ENOTSUP ){
1f740 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28  .    rc = fsync(
1f750 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  fd);.  }.#endif 
1f760 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
1f770 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66  .#endif /* ifdef
1f780 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
1f790 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53  elif HAVE_FULLFS
1f7a0 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53  YNC */..  if( OS
1f7b0 5f 56 58 57 4f 52 4b 53 20 26 26 20 72 63 21 3d  _VXWORKS && rc!=
1f7c0 20 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20   -1 ){.    rc = 
1f7d0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1f7e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  rc;.}../*.** Ope
1f7f0 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  n a file descrip
1f800 74 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65 63  tor to the direc
1f810 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
1f820 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a  file zFilename..
1f830 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
1f840 2c 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f  , *pFd is set to
1f850 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65   the opened file
1f860 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a   descriptor and.
1f870 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1f880 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
1f890 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69  error occurs, ei
1f8a0 74 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ther SQLITE_NOME
1f8b0 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43  M.** or SQLITE_C
1f8c0 41 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72  ANTOPEN is retur
1f8d0 6e 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20  ned and *pFd is 
1f8e0 73 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69  set to an undefi
1f8f0 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a  ned.** value..**
1f900 0a 2a 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72  .** The director
1f910 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
1f920 72 20 69 73 20 75 73 65 64 20 66 6f 72 20 6f 6e  r is used for on
1f930 6c 79 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74  ly one thing - t
1f940 6f 0a 2a 2a 20 66 73 79 6e 63 28 29 20 61 20 64  o.** fsync() a d
1f950 69 72 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65  irectory to make
1f960 20 73 75 72 65 20 66 69 6c 65 20 63 72 65 61 74   sure file creat
1f970 69 6f 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e  ion and deletion
1f980 20 65 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66   events.** are f
1f990 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20  lushed to disk. 
1f9a0 20 53 75 63 68 20 66 73 79 6e 63 73 20 61 72 65   Such fsyncs are
1f9b0 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e   not needed on n
1f9c0 65 77 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69  ewer.** journali
1f9d0 6e 67 20 66 69 6c 65 73 79 73 74 65 6d 73 2c 20  ng filesystems, 
1f9e0 62 75 74 20 61 72 65 20 72 65 71 75 69 72 65 64  but are required
1f9f0 20 6f 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73 79   on older filesy
1fa00 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  stems..**.** Thi
1fa10 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
1fa20 20 6f 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e   overridden usin
1fa30 67 20 74 68 65 20 78 53 65 74 53 79 73 43 61 6c  g the xSetSysCal
1fa40 6c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20  l interface..** 
1fa50 54 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 6f  The ability to o
1fa60 76 65 72 72 69 64 65 20 74 68 69 73 20 72 6f 75  verride this rou
1fa70 74 69 6e 65 20 77 61 73 20 61 64 64 65 64 20 69  tine was added i
1fa80 6e 20 73 75 70 70 6f 72 74 20 6f 66 20 74 68 65  n support of the
1fa90 0a 2a 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e  .** chromium san
1faa0 64 62 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61  dbox.  Opening a
1fab0 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 61 20   directory is a 
1fac0 73 65 63 75 72 69 74 79 20 72 69 73 6b 20 28 77  security risk (w
1fad0 65 20 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73  e are.** told) s
1fae0 6f 20 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65 72  o making it over
1faf0 72 69 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20  rideable allows 
1fb00 74 68 65 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e  the chromium san
1fb10 64 62 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61  dbox to.** repla
1fb20 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ce this routine 
1fb30 77 69 74 68 20 61 20 68 61 72 6d 6c 65 73 73 20  with a harmless 
1fb40 6e 6f 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20  no-op.  To make 
1fb50 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
1fb60 61 20 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65  a no-op, replace
1fb70 20 69 74 20 77 69 74 68 20 61 20 73 74 75 62 20   it with a stub 
1fb80 74 68 61 74 20 72 65 74 75 72 6e 73 20 53 51 4c  that returns SQL
1fb90 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65  ITE_OK but leave
1fba0 73 0a 2a 2a 20 2a 70 46 64 20 73 65 74 20 74 6f  s.** *pFd set to
1fbb0 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
1fbc0 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  er..**.** If SQL
1fbd0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1fbe0 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69  ed, the caller i
1fbf0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1fc00 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65  r closing.** the
1fc10 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1fc20 20 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73   *pFd using clos
1fc30 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
1fc40 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  nt openDirectory
1fc50 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
1fc60 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64  lename, int *pFd
1fc70 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69  ){.  int ii;.  i
1fc80 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68  nt fd = -1;.  ch
1fc90 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f  ar zDirname[MAX_
1fca0 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20  PATHNAME+1];..  
1fcb0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1fcc0 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a  (MAX_PATHNAME, z
1fcd0 44 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a  Dirname, "%s", z
1fce0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72  Filename);.  for
1fcf0 28 69 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28  (ii=(int)strlen(
1fd00 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20  zDirname); ii>1 
1fd10 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21  && zDirname[ii]!
1fd20 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69  ='/'; ii--);.  i
1fd30 66 28 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a  f( ii>0 ){.    z
1fd40 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c  Dirname[ii] = '\
1fd50 30 27 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62  0';.    fd = rob
1fd60 75 73 74 5f 6f 70 65 6e 28 7a 44 69 72 6e 61 6d  ust_open(zDirnam
1fd70 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49  e, O_RDONLY|O_BI
1fd80 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66  NARY, 0);.    if
1fd90 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ( fd>=0 ){.     
1fda0 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44   OSTRACE(("OPEND
1fdb0 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66  IR %-3d %s\n", f
1fdc0 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20  d, zDirname));. 
1fdd0 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20     }.  }.  *pFd 
1fde0 3d 20 66 64 3b 0a 20 20 72 65 74 75 72 6e 20 28  = fd;.  return (
1fdf0 66 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a  fd>=0?SQLITE_OK:
1fe00 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
1fe10 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
1fe20 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 44 69 72 6e  T, "open", zDirn
1fe30 61 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ame));.}../*.** 
1fe40 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72  Make sure all wr
1fe50 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63  ites to a partic
1fe60 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f  ular file are co
1fe70 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
1fe80 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e  .**.** If dataOn
1fe90 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20  ly==0 then both 
1fea0 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  the file itself 
1feb0 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61  and its metadata
1fec0 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20   (file.** size, 
1fed0 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63  access time, etc
1fee0 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49  ) are synced.  I
1fef0 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68  f dataOnly!=0 th
1ff00 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66  en only the.** f
1ff10 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63  ile data is sync
1ff20 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20  ed..**.** Under 
1ff30 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20  Unix, also make 
1ff40 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69  sure that the di
1ff50 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f  rectory entry fo
1ff60 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61  r the file.** ha
1ff70 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62  s been created b
1ff80 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20  y fsync-ing the 
1ff90 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
1ffa0 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65  ontains the file
1ffb0 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f  ..** If we do no
1ffc0 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65  t do this and we
1ffd0 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77   encounter a pow
1ffe0 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
1fff0 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74  directory.** ent
20000 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  ry for the journ
20010 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69  al might not exi
20020 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f  st after we rebo
20030 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a  ot.  The next.**
20040 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73   SQLite to acces
20050 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20  s the file will 
20060 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68  not know that th
20070 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  e journal exists
20080 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65   (because.** the
20090 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
200a0 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
200b0 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74   was never creat
200c0 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ed) and the tran
200d0 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20  saction.** will 
200e0 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20  not roll back - 
200f0 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67  possibly leading
20100 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
20110 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
20120 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28  ic int unixSync(
20130 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
20140 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
20150 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69  int rc;.  unixFi
20160 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
20170 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e  xFile*)id;..  in
20180 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28  t isDataOnly = (
20190 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e  flags&SQLITE_SYN
201a0 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69  C_DATAONLY);.  i
201b0 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20  nt isFullsync = 
201c0 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
201d0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
201e0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
201f0 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53   one of SQLITE_S
20200 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55  YNC_NORMAL or FU
20210 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f  LL was passed */
20220 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73  .  assert((flags
20230 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
20240 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  YNC_NORMAL.     
20250 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29   || (flags&0x0F)
20260 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
20270 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e  LL.  );..  /* Un
20280 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73  ix cannot, but s
20290 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20  ome systems may 
202a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
202b0 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68  LL from here. Th
202c0 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20  is.  ** line is 
202d0 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69  to test that doi
202e0 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63  ng so does not c
202f0 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d  ause any problem
20300 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  s..  */.  Simula
20310 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
20320 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
20330 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ULL );..  assert
20340 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
20350 52 41 43 45 28 28 22 53 59 4e 43 20 20 20 20 25  RACE(("SYNC    %
20360 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
20370 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f  ));.  rc = full_
20380 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20  fsync(pFile->h, 
20390 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61  isFullsync, isDa
203a0 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c  taOnly);.  Simul
203b0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
203c0 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   );.  if( rc ){.
203d0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
203e0 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
203f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69  ;.    return uni
20400 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
20410 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22 66  _IOERR_FSYNC, "f
20420 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46 69 6c  ull_fsync", pFil
20430 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a  e->zPath);.  }..
20440 20 20 2f 2a 20 41 6c 73 6f 20 66 73 79 6e 63 20    /* Also fsync 
20450 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f  the directory co
20460 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69 6c  ntaining the fil
20470 65 20 69 66 20 74 68 65 20 44 49 52 53 59 4e 43  e if the DIRSYNC
20480 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73 65   flag.  ** is se
20490 74 2e 20 20 54 68 69 73 20 69 73 20 61 20 6f 6e  t.  This is a on
204a0 65 2d 74 69 6d 65 20 6f 63 63 75 72 72 65 6e 63  e-time occurrenc
204b0 65 2e 20 20 4d 61 6e 79 20 73 79 73 74 65 6d 73  e.  Many systems
204c0 20 28 65 78 61 6d 70 6c 65 73 3a 20 41 49 58 29   (examples: AIX)
204d0 0a 20 20 2a 2a 20 61 72 65 20 75 6e 61 62 6c 65  .  ** are unable
204e0 20 74 6f 20 66 73 79 6e 63 20 61 20 64 69 72 65   to fsync a dire
204f0 63 74 6f 72 79 2c 20 73 6f 20 69 67 6e 6f 72 65  ctory, so ignore
20500 20 65 72 72 6f 72 73 20 6f 6e 20 74 68 65 20 66   errors on the f
20510 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sync..  */.  if(
20520 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
20530 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 49 52  s & UNIXFILE_DIR
20540 53 59 4e 43 20 29 7b 0a 20 20 20 20 69 6e 74 20  SYNC ){.    int 
20550 64 69 72 66 64 3b 0a 20 20 20 20 4f 53 54 52 41  dirfd;.    OSTRA
20560 43 45 28 28 22 44 49 52 53 59 4e 43 20 25 73 20  CE(("DIRSYNC %s 
20570 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d  (have_fullfsync=
20580 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c  %d fullsync=%d)\
20590 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  n", pFile->zPath
205a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 48 41  ,.            HA
205b0 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73  VE_FULLFSYNC, is
205c0 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 20 20 20 20  Fullsync));.    
205d0 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63  rc = osOpenDirec
205e0 74 6f 72 79 28 70 46 69 6c 65 2d 3e 7a 50 61 74  tory(pFile->zPat
205f0 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20 20  h, &dirfd);.    
20600 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20610 4b 20 26 26 20 64 69 72 66 64 3e 3d 30 20 29 7b  K && dirfd>=0 ){
20620 0a 20 20 20 20 20 20 66 75 6c 6c 5f 66 73 79 6e  .      full_fsyn
20630 63 28 64 69 72 66 64 2c 20 30 2c 20 30 29 3b 0a  c(dirfd, 0, 0);.
20640 23 69 66 20 4f 53 43 4c 4f 53 45 5f 43 48 45 43  #if OSCLOSE_CHEC
20650 4b 5f 43 4c 4f 53 45 5f 49 4f 45 52 52 0a 20 20  K_CLOSE_IOERR.  
20660 20 20 20 20 69 66 28 20 63 6c 6f 73 65 28 70 46      if( close(pF
20670 69 6c 65 2d 3e 64 69 72 66 64 29 20 29 7b 0a 20  ile->dirfd) ){. 
20680 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
20690 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
206a0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  no);.        rc 
206b0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
206c0 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20  IR_CLOSE;.      
206d0 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 6f  }.#else.      ro
206e0 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
206f0 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f  , dirfd, __LINE_
20700 5f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  _);.#endif.    }
20710 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
20720 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a  ITE_CANTOPEN ){.
20730 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
20740 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
20750 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
20760 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 44 49   &= ~UNIXFILE_DI
20770 52 53 59 4e 43 3b 0a 0a 20 20 7d 0a 20 20 72 65  RSYNC;..  }.  re
20780 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
20790 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
207a0 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
207b0 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
207c0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72  tatic int unixTr
207d0 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
207e0 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79  ile *id, i64 nBy
207f0 74 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  te){.  unixFile 
20800 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
20810 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72  le *)id;.  int r
20820 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  c;.  assert( pFi
20830 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  le );.  Simulate
20840 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
20850 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
20860 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  NCATE );..  /* I
20870 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63  f the user has c
20880 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e  onfigured a chun
20890 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  k-size for this 
208a0 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74  file, truncate t
208b0 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20  he.  ** file so 
208c0 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73  that it consists
208d0 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e   of an integer n
208e0 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20  umber of chunks 
208f0 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61  (i.e. the.  ** a
20900 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20  ctual file size 
20910 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74  after the operat
20920 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65  ion may be large
20930 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
20940 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e  sted.  ** size).
20950 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
20960 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a  e->szChunk>0 ){.
20970 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42      nByte = ((nB
20980 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43  yte + pFile->szC
20990 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d  hunk - 1)/pFile-
209a0 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c  >szChunk) * pFil
209b0 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a  e->szChunk;.  }.
209c0 0a 20 20 72 63 20 3d 20 72 6f 62 75 73 74 5f 66  .  rc = robust_f
209d0 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e  truncate(pFile->
209e0 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  h, nByte);.  if(
209f0 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f 72 65   rc ){.    store
20a00 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
20a10 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74   errno);.    ret
20a20 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
20a30 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
20a40 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61  UNCATE, "ftrunca
20a50 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  te", pFile->zPat
20a60 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66  h);.  }else{.#if
20a70 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
20a80 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
20a90 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c  e doing a normal
20aa0 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61   write to a data
20ab0 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70  base file (as op
20ac0 70 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  posed to.    ** 
20ad0 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  doing a hot-jour
20ae0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  nal rollback or 
20af0 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20  a write to some 
20b00 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  file other than 
20b10 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  a.    ** normal 
20b20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 61  database file) a
20b30 6e 64 20 77 65 20 74 72 75 6e 63 61 74 65 20 74  nd we truncate t
20b40 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  he file to zero 
20b50 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74  length,.    ** t
20b60 68 61 74 20 65 66 66 65 63 74 69 76 65 6c 79 20  hat effectively 
20b70 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
20b80 67 65 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69  ge counter.  Thi
20b90 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 0a 20  s might happen. 
20ba0 20 20 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f     ** when resto
20bb0 72 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  ring a database 
20bc0 75 73 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70  using the backup
20bd0 20 41 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f   API from a zero
20be0 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73  -length.    ** s
20bf0 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ource..    */.  
20c00 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e    if( pFile->inN
20c10 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20 6e 42  ormalWrite && nB
20c20 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  yte==0 ){.      
20c30 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
20c40 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Chng = 1;.    }.
20c50 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
20c60 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
20c70 3e 30 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  >0.    /* If the
20c80 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 74   file was just t
20c90 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69  runcated to a si
20ca0 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ze smaller than 
20cb0 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  the currently.  
20cc0 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69    ** mapped regi
20cd0 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65 20 65  on, reduce the e
20ce0 66 66 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67  ffective mapping
20cf0 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53   size as well. S
20d00 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 20 20 2a  QLite will.    *
20d10 2a 20 75 73 65 20 72 65 61 64 28 29 20 61 6e 64  * use read() and
20d20 20 77 72 69 74 65 28 29 20 74 6f 20 61 63 63 65   write() to acce
20d30 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74  ss data beyond t
20d40 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e  his point from n
20d50 6f 77 20 6f 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a  ow on.  .    */.
20d60 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c 70 46      if( nByte<pF
20d70 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
20d80 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d  .      pFile->mm
20d90 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a  apSize = nByte;.
20da0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
20db0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20dc0 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
20dd0 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63   Determine the c
20de0 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61  urrent size of a
20df0 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a   file in bytes.*
20e00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
20e10 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  xFileSize(sqlite
20e20 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  3_file *id, i64 
20e30 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72  *pSize){.  int r
20e40 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  c;.  struct stat
20e50 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20   buf;.  assert( 
20e60 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46  id );.  rc = osF
20e70 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a  stat(((unixFile*
20e80 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a  )id)->h, &buf);.
20e90 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
20ea0 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28  r( rc=1 );.  if(
20eb0 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 74   rc!=0 ){.    st
20ec0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e  oreLastErrno((un
20ed0 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e  ixFile*)id, errn
20ee0 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  o);.    return S
20ef0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
20f00 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20  T;.  }.  *pSize 
20f10 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a  = buf.st_size;..
20f20 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e    /* When openin
20f30 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61  g a zero-size da
20f40 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64  tabase, the find
20f50 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f 63  InodeInfo() proc
20f60 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65  edure.  ** write
20f70 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  s a single byte 
20f80 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69  into that file i
20f90 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20  n order to work 
20fa0 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a  around a bug.  *
20fb0 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73  * in the OS-X ms
20fc0 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20  dos filesystem. 
20fd0 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   In order to avo
20fe0 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  id problems with
20ff0 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65   upper.  ** laye
21000 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72  rs, we need to r
21010 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20  eport this file 
21020 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65  size as zero eve
21030 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20  n though it is. 
21040 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20   ** really 1.   
21050 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20  Ticket #3260..  
21060 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d  */.  if( *pSize=
21070 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b  =1 ) *pSize = 0;
21080 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ...  return SQLI
21090 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
210a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
210b0 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
210c0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
210d0 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f  /*.** Handler fo
210e0 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  r proxy-locking 
210f0 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72  file-control ver
21100 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c  bs.  Defined bel
21110 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f  ow in the.** pro
21120 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69  xying locking di
21130 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  vision..*/.stati
21140 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43  c int proxyFileC
21150 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
21160 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b  ile*,int,void*);
21170 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20  .#endif../* .** 
21180 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
21190 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c   called to handl
211a0 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  e the SQLITE_FCN
211b0 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a  TL_SIZE_HINT .**
211c0 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70   file-control op
211d0 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61 72 67  eration.  Enlarg
211e0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
211f0 6f 20 6e 42 79 74 65 73 20 69 6e 20 73 69 7a 65  o nBytes in size
21200 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75 70 20  .** (rounded up 
21210 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68 75 6e  to the next chun
21220 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20 74 68 65  k-size).  If the
21230 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
21240 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73 20 6f  eady.** nBytes o
21250 72 20 6c 61 72 67 65 72 2c 20 74 68 69 73 20 72  r larger, this r
21260 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
21270 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
21280 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75   fcntlSizeHint(u
21290 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
212a0 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66  i64 nByte){.  if
212b0 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
212c0 3e 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 53  >0 ){.    i64 nS
212d0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
212e0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69          /* Requi
212f0 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
21300 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
21310 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20   buf;           
21320 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f     /* Used to ho
21330 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73  ld return values
21340 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f 0a 20   of fstat() */. 
21350 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74    .    if( osFst
21360 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75  at(pFile->h, &bu
21370 66 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  f) ){.      stor
21380 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
21390 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
213a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
213b0 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d  ERR_FSTAT;.    }
213c0 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 28  ..    nSize = ((
213d0 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e 73 7a 43  nByte+pFile->szC
213e0 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69 6c 65 2d  hunk-1) / pFile-
213f0 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c  >szChunk) * pFil
21400 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20  e->szChunk;.    
21410 69 66 28 20 6e 53 69 7a 65 3e 28 69 36 34 29 62  if( nSize>(i64)b
21420 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b 0a 0a 23  uf.st_size ){..#
21430 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
21440 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29  POSIX_FALLOCATE)
21450 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46   && HAVE_POSIX_F
21460 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20 20 20 2f  ALLOCATE.      /
21470 2a 20 54 68 65 20 63 6f 64 65 20 62 65 6c 6f 77  * The code below
21480 20 69 73 20 68 61 6e 64 6c 69 6e 67 20 74 68 65   is handling the
21490 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
214a0 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 29 20 0a   osFallocate() .
214b0 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74        ** correct
214c0 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  ly. posix_falloc
214d0 61 74 65 28 29 20 69 73 20 64 65 66 69 6e 65 64  ate() is defined
214e0 20 74 6f 20 22 72 65 74 75 72 6e 73 20 7a 65 72   to "returns zer
214f0 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 0a 20  o on success, . 
21500 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e 20 65 72       ** or an er
21510 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e 20 20 66  ror number on  f
21520 61 69 6c 75 72 65 22 2e 20 53 65 65 20 74 68 65  ailure". See the
21530 20 6d 61 6e 70 61 67 65 20 66 6f 72 20 64 65 74   manpage for det
21540 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ails. */.      i
21550 6e 74 20 65 72 72 3b 0a 20 20 20 20 20 20 64 6f  nt err;.      do
21560 7b 0a 20 20 20 20 20 20 20 20 65 72 72 20 3d 20  {.        err = 
21570 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70 46 69 6c  osFallocate(pFil
21580 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 73 69 7a  e->h, buf.st_siz
21590 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e 73 74 5f  e, nSize-buf.st_
215a0 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 77 68  size);.      }wh
215b0 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e 54 52 20  ile( err==EINTR 
215c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72  );.      if( err
215d0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
215e0 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23 65  _IOERR_WRITE;.#e
215f0 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  lse.      /* If 
21600 74 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20  the OS does not 
21610 68 61 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f  have posix_fallo
21620 63 61 74 65 28 29 2c 20 66 61 6b 65 20 69 74 2e  cate(), fake it.
21630 20 57 72 69 74 65 20 61 20 0a 20 20 20 20 20 20   Write a .      
21640 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74  ** single byte t
21650 6f 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  o the last byte 
21660 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b 20 74 68  in each block th
21670 61 74 20 66 61 6c 6c 73 20 65 6e 74 69 72 65 6c  at falls entirel
21680 79 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 69  y.      ** withi
21690 6e 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72  n the extended r
216a0 65 67 69 6f 6e 2e 20 54 68 65 6e 2c 20 69 66 20  egion. Then, if 
216b0 72 65 71 75 69 72 65 64 2c 20 61 20 73 69 6e 67  required, a sing
216c0 6c 65 20 62 79 74 65 0a 20 20 20 20 20 20 2a 2a  le byte.      **
216d0 20 61 74 20 6f 66 66 73 65 74 20 28 6e 53 69 7a   at offset (nSiz
216e0 65 2d 31 29 2c 20 74 6f 20 73 65 74 20 74 68 65  e-1), to set the
216f0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
21700 65 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 20  e correctly..   
21710 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61 20     ** This is a 
21720 73 69 6d 69 6c 61 72 20 74 65 63 68 6e 69 71 75  similar techniqu
21730 65 20 74 6f 20 74 68 61 74 20 75 73 65 64 20 62  e to that used b
21740 79 20 67 6c 69 62 63 20 6f 6e 20 73 79 73 74 65  y glibc on syste
21750 6d 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ms.      ** that
21760 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 72   do not have a r
21770 65 61 6c 20 66 61 6c 6c 6f 63 61 74 65 28 29 20  eal fallocate() 
21780 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  call..      */. 
21790 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20       int nBlk = 
217a0 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20  buf.st_blksize; 
217b0 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74 65 6d 20   /* File-system 
217c0 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20  block size */.  
217d0 20 20 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d      int nWrite =
217e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
217f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
21800 65 73 20 77 72 69 74 74 65 6e 20 62 79 20 73 65  es written by se
21810 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20  ekAndWrite */.  
21820 20 20 20 20 69 36 34 20 69 57 72 69 74 65 3b 20      i64 iWrite; 
21830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21840 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65 74 20 74  /* Next offset t
21850 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20  o write to */.. 
21860 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f       if( robust_
21870 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d  ftruncate(pFile-
21880 3e 68 2c 20 6e 53 69 7a 65 29 20 29 7b 0a 20 20  >h, nSize) ){.  
21890 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
218a0 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
218b0 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  o);.        retu
218c0 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
218d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
218e0 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74  NCATE, "ftruncat
218f0 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
21900 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
21910 20 69 57 72 69 74 65 20 3d 20 28 28 62 75 66 2e   iWrite = ((buf.
21920 73 74 5f 73 69 7a 65 20 2b 20 32 2a 6e 42 6c 6b  st_size + 2*nBlk
21930 20 2d 20 31 29 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b   - 1)/nBlk)*nBlk
21940 2d 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  -1;.      assert
21950 28 20 69 57 72 69 74 65 3e 3d 62 75 66 2e 73 74  ( iWrite>=buf.st
21960 5f 73 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  _size );.      a
21970 73 73 65 72 74 28 20 28 69 57 72 69 74 65 2f 6e  ssert( (iWrite/n
21980 42 6c 6b 29 3d 3d 28 28 62 75 66 2e 73 74 5f 73  Blk)==((buf.st_s
21990 69 7a 65 2b 6e 42 6c 6b 2d 31 29 2f 6e 42 6c 6b  ize+nBlk-1)/nBlk
219a0 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
219b0 74 28 20 28 28 69 57 72 69 74 65 2b 31 29 25 6e  t( ((iWrite+1)%n
219c0 42 6c 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Blk)==0 );.     
219d0 20 66 6f 72 28 2f 2a 6e 6f 2d 6f 70 2a 2f 3b 20   for(/*no-op*/; 
219e0 69 57 72 69 74 65 3c 6e 53 69 7a 65 3b 20 69 57  iWrite<nSize; iW
219f0 72 69 74 65 2b 3d 6e 42 6c 6b 20 29 7b 0a 20 20  rite+=nBlk ){.  
21a00 20 20 20 20 20 20 6e 57 72 69 74 65 20 3d 20 73        nWrite = s
21a10 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c  eekAndWrite(pFil
21a20 65 2c 20 69 57 72 69 74 65 2c 20 22 22 2c 20 31  e, iWrite, "", 1
21a30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
21a40 57 72 69 74 65 21 3d 31 20 29 20 72 65 74 75 72  Write!=1 ) retur
21a50 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
21a60 52 49 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RITE;.      }.  
21a70 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 3d 3d      if( nWrite==
21a80 30 20 7c 7c 20 28 6e 53 69 7a 65 25 6e 42 6c 6b  0 || (nSize%nBlk
21a90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 57 72  ) ){.        nWr
21aa0 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69  ite = seekAndWri
21ab0 74 65 28 70 46 69 6c 65 2c 20 6e 53 69 7a 65 2d  te(pFile, nSize-
21ac0 31 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20 20 20  1, "", 1);.     
21ad0 20 20 20 69 66 28 20 6e 57 72 69 74 65 21 3d 31     if( nWrite!=1
21ae0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
21af0 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20  _IOERR_WRITE;.  
21b00 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
21b10 20 7d 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49   }.  }..#if SQLI
21b20 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
21b30 3e 30 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  >0.  if( pFile->
21b40 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 26 26  mmapSizeMax>0 &&
21b50 20 6e 42 79 74 65 3e 70 46 69 6c 65 2d 3e 6d 6d   nByte>pFile->mm
21b60 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 6e  apSize ){.    in
21b70 74 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70 46  t rc;.    if( pF
21b80 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3c 3d 30 20  ile->szChunk<=0 
21b90 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 6f 62  ){.      if( rob
21ba0 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46  ust_ftruncate(pF
21bb0 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29  ile->h, nByte) )
21bc0 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c  {.        storeL
21bd0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
21be0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  errno);.        
21bf0 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
21c00 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
21c10 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75  _TRUNCATE, "ftru
21c20 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  ncate", pFile->z
21c30 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Path);.      }. 
21c40 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 75     }..    rc = u
21c50 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69 6c 65  nixMapfile(pFile
21c60 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 72 65  , nByte);.    re
21c70 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
21c80 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  dif..  return SQ
21c90 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66  LITE_OK;.}...#if
21ca0 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f   (SQLITE_ENABLE_
21cb0 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26 20  APPLE_SPI>0) && 
21cc0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
21cd0 5f 29 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  _).#include "sql
21ce0 69 74 65 33 5f 70 72 69 76 61 74 65 2e 68 22 0a  ite3_private.h".
21cf0 23 69 6e 63 6c 75 64 65 20 3c 63 6f 70 79 66 69  #include <copyfi
21d00 6c 65 2e 68 3e 0a 73 74 61 74 69 63 20 69 6e 74  le.h>.static int
21d10 20 70 72 6f 78 79 47 65 74 44 62 50 61 74 68 46   proxyGetDbPathF
21d20 6f 72 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46  orUnixFile(unixF
21d30 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 68 61 72  ile *pFile, char
21d40 20 2a 64 62 50 61 74 68 29 3b 0a 23 65 6e 64 69   *dbPath);.#endi
21d50 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  f..#if SQLITE_EN
21d60 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
21d70 4c 45 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  LE.static int is
21d80 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65  ProxyLockingMode
21d90 28 75 6e 69 78 46 69 6c 65 20 2a 29 3b 0a 23 65  (unixFile *);.#e
21da0 6e 64 69 66 0a 0a 23 69 66 20 28 53 51 4c 49 54  ndif..#if (SQLIT
21db0 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53  E_ENABLE_APPLE_S
21dc0 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65 64  PI>0) && defined
21dd0 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 73 74 61 74  (__APPLE__).stat
21de0 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63  ic int unixTrunc
21df0 61 74 65 44 61 74 61 62 61 73 65 28 75 6e 69 78  ateDatabase(unix
21e00 46 69 6c 65 20 2a 2c 20 69 6e 74 29 3b 0a 0a 73  File *, int);..s
21e10 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 49 6e  tatic int unixIn
21e20 76 61 6c 69 64 61 74 65 53 75 70 70 6f 72 74 46  validateSupportF
21e30 69 6c 65 73 28 75 6e 69 78 46 69 6c 65 20 2a 2c  iles(unixFile *,
21e40 20 69 6e 74 29 3b 0a 0a 73 74 61 74 69 63 20 69   int);..static i
21e50 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c  nt findCreateFil
21e60 65 4d 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72  eMode(const char
21e70 20 2a 2c 20 69 6e 74 2c 20 6d 6f 64 65 5f 74 2a   *, int, mode_t*
21e80 2c 20 75 69 64 5f 74 20 2a 2c 67 69 64 5f 74 20  , uid_t *,gid_t 
21e90 2a 29 3b 0a 0a 2f 2a 20 6f 70 65 6e 73 20 61 20  *);../* opens a 
21ea0 72 65 61 64 2f 77 72 69 74 65 20 63 6f 6e 6e 65  read/write conne
21eb0 63 74 69 6f 6e 20 74 6f 20 61 20 66 69 6c 65 20  ction to a file 
21ec0 7a 4e 61 6d 65 20 69 6e 68 65 72 69 74 69 6e 67  zName inheriting
21ed0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
21ee0 0a 2a 2a 20 75 73 65 72 2f 70 65 72 6d 73 20 66  .** user/perms f
21ef0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
21f00 20 66 69 6c 65 20 69 66 20 72 75 6e 6e 69 6e 67   file if running
21f10 20 61 73 20 72 6f 6f 74 2e 20 20 52 65 74 75 72   as root.  Retur
21f20 6e 73 20 74 68 65 20 66 69 6c 65 20 0a 2a 2a 20  ns the file .** 
21f30 64 65 73 63 72 69 70 74 6f 72 20 62 79 20 72 65  descriptor by re
21f40 66 65 72 65 6e 63 65 0a 2a 2f 0a 73 74 61 74 69  ference.*/.stati
21f50 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 43 68  c int unixOpenCh
21f60 69 6c 64 46 69 6c 65 28 0a 20 20 63 6f 6e 73 74  ildFile(.  const
21f70 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20   char *zName,.  
21f80 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 2c 0a 20  int openFlags,. 
21f90 20 69 6e 74 20 64 62 4f 70 65 6e 46 6c 61 67 73   int dbOpenFlags
21fa0 2c 0a 20 20 69 6e 74 20 70 72 6f 74 46 6c 61 67  ,.  int protFlag
21fb0 73 2c 0a 20 20 69 6e 74 20 2a 70 46 64 0a 29 7b  s,.  int *pFd.){
21fc0 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a  .  int fd = -1;.
21fd0 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64    mode_t openMod
21fe0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
21ff0 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74  /* Permissions t
22000 6f 20 63 72 65 61 74 65 20 66 69 6c 65 20 77 69  o create file wi
22010 74 68 20 2a 2f 0a 20 20 75 69 64 5f 74 20 75 69  th */.  uid_t ui
22020 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
22030 20 20 20 20 20 20 2f 2a 20 55 73 65 72 69 64 20        /* Userid 
22040 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a  for the file */.
22050 20 20 67 69 64 5f 74 20 67 69 64 3b 20 20 20 20    gid_t gid;    
22060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22070 2f 2a 20 47 72 6f 75 70 69 64 20 66 6f 72 20 74  /* Groupid for t
22080 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  he file */.  int
22090 20 72 63 3b 0a 20 20 0a 20 20 61 73 73 65 72 74   rc;.  .  assert
220a0 28 70 46 64 21 3d 4e 55 4c 4c 29 3b 0a 20 20 72  (pFd!=NULL);.  r
220b0 63 20 3d 20 66 69 6e 64 43 72 65 61 74 65 46 69  c = findCreateFi
220c0 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20 64 62  leMode(zName, db
220d0 4f 70 65 6e 46 6c 61 67 73 2c 20 26 6f 70 65 6e  OpenFlags, &open
220e0 4d 6f 64 65 2c 20 26 75 69 64 2c 20 26 67 69 64  Mode, &uid, &gid
220f0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
22100 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
22110 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 66  turn rc;.  }.  f
22120 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
22130 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  zName, openFlags
22140 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 4f  , openMode);.  O
22150 53 54 52 41 43 45 28 28 22 4f 50 45 4e 58 20 20  STRACE(("OPENX  
22160 20 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c   %-3d %s 0%o\n",
22170 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e   fd, zName, open
22180 46 6c 61 67 73 29 29 3b 0a 20 20 69 66 28 20 66  Flags));.  if( f
22190 64 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  d<0 ){.    rc = 
221a0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
221b0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
221c0 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65  T, "open", zName
221d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
221e0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 69 66 20 77 65  ;.  }.  /* if we
221f0 27 72 65 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  're opening the 
22200 77 61 6c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 61  wal or journal a
22210 6e 64 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f  nd running as ro
22220 6f 74 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68 65  ot, set.  ** the
22230 20 6a 6f 75 72 6e 61 6c 20 75 69 64 2f 67 69 64   journal uid/gid
22240 20 2a 2f 0a 20 20 69 66 28 20 64 62 4f 70 65 6e   */.  if( dbOpen
22250 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  Flags & (SQLITE_
22260 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f  OPEN_WAL|SQLITE_
22270 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
22280 4c 29 20 29 7b 0a 20 20 20 20 75 69 64 5f 74 20  L) ){.    uid_t 
22290 65 75 69 64 20 3d 20 67 65 74 65 75 69 64 28 29  euid = geteuid()
222a0 3b 0a 20 20 20 20 69 66 28 20 65 75 69 64 3d 3d  ;.    if( euid==
222b0 30 20 26 26 20 28 65 75 69 64 21 3d 75 69 64 20  0 && (euid!=uid 
222c0 7c 7c 20 67 65 74 65 67 69 64 28 29 21 3d 67 69  || getegid()!=gi
222d0 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  d) ){.      if( 
222e0 66 63 68 6f 77 6e 28 66 64 2c 20 75 69 64 2c 20  fchown(fd, uid, 
222f0 67 69 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  gid) ){.        
22300 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
22310 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OPEN_BKPT;.     
22320 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
22330 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22340 20 29 7b 0a 20 20 20 20 2a 70 46 64 20 3d 20 66   ){.    *pFd = f
22350 64 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  d;.  } else {.  
22360 20 20 2a 70 46 64 20 3d 20 2d 31 3b 0a 20 20 20    *pFd = -1;.   
22370 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 7d 0a   close(fd);.  }.
22380 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22390 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52  static int unixR
223a0 65 70 6c 61 63 65 44 61 74 61 62 61 73 65 28 75  eplaceDatabase(u
223b0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
223c0 73 71 6c 69 74 65 33 20 2a 73 72 63 64 62 29 20  sqlite3 *srcdb) 
223d0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  {.  sqlite3_file
223e0 20 2a 69 64 20 3d 20 28 73 71 6c 69 74 65 33 5f   *id = (sqlite3_
223f0 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  file *)pFile;.  
22400 42 74 72 65 65 20 2a 70 53 72 63 42 74 72 65 65  Btree *pSrcBtree
22410 20 3d 20 4e 55 4c 4c 3b 0a 20 20 73 71 6c 69 74   = NULL;.  sqlit
22420 65 33 5f 66 69 6c 65 20 2a 73 72 63 5f 66 69 6c  e3_file *src_fil
22430 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 75 6e 69 78  e = NULL;.  unix
22440 46 69 6c 65 20 2a 70 53 72 63 46 69 6c 65 20 3d  File *pSrcFile =
22450 20 4e 55 4c 4c 3b 0a 20 20 63 68 61 72 20 73 72   NULL;.  char sr
22460 63 57 61 6c 50 61 74 68 5b 4d 41 58 50 41 54 48  cWalPath[MAXPATH
22470 4c 45 4e 2b 35 5d 3b 0a 20 20 69 6e 74 20 73 72  LEN+5];.  int sr
22480 63 57 61 6c 46 44 20 3d 20 2d 31 3b 0a 20 20 69  cWalFD = -1;.  i
22490 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
224a0 4b 3b 0a 20 20 76 6f 69 64 20 2a 70 4c 6f 63 6b  K;.  void *pLock
224b0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20 66   = NULL;.  int f
224c0 6c 61 67 73 20 3d 20 30 3b 0a 20 20 73 71 6c 69  lags = 0;.  sqli
224d0 74 65 33 20 2a 73 72 63 64 62 32 20 3d 20 4e 55  te3 *srcdb2 = NU
224e0 4c 4c 3b 0a 20 20 63 6f 70 79 66 69 6c 65 5f 73  LL;.  copyfile_s
224f0 74 61 74 65 5f 74 20 73 3b 0a 20 20 69 6e 74 20  tate_t s;.  int 
22500 63 6f 72 72 75 70 74 53 72 63 46 69 6c 65 4c 6f  corruptSrcFileLo
22510 63 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63 6f  ck = 0;.  int co
22520 72 72 75 70 74 44 73 74 46 69 6c 65 4c 6f 63 6b  rruptDstFileLock
22530 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 53 72   = 0;.  int isSr
22540 63 43 6f 72 72 75 70 74 20 3d 20 30 3b 0a 20 20  cCorrupt = 0;.  
22550 69 6e 74 20 69 73 44 73 74 43 6f 72 72 75 70 74  int isDstCorrupt
22560 20 3d 20 30 3b 0a 20 20 0a 20 20 69 66 28 20 21   = 0;.  .  if( !
22570 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
22580 63 6b 4f 6b 28 73 72 63 64 62 29 20 29 7b 0a 20  ckOk(srcdb) ){. 
22590 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
225a0 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 20  _MISUSE;.  }.   
225b0 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41   .#if SQLITE_ENA
225c0 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54  BLE_DATA_PROTECT
225d0 49 4f 4e 0a 20 20 66 6c 61 67 73 20 7c 3d 20 70  ION.  flags |= p
225e0 46 69 6c 65 2d 3e 70 72 6f 74 46 6c 61 67 73 3b  File->protFlags;
225f0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
22600 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
22610 47 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 69 73  G_STYLE.  if( is
22620 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65  ProxyLockingMode
22630 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 66  (pFile) ){.    f
22640 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
22650 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 3b 0a 20  PEN_AUTOPROXY;. 
22660 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72   }.#endif.  .  r
22670 63 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f  c = sqlite3demo_
22680 73 75 70 65 72 6c 6f 63 6b 28 70 46 69 6c 65 2d  superlock(pFile-
22690 3e 7a 50 61 74 68 2c 20 30 2c 20 66 6c 61 67 73  >zPath, 0, flags
226a0 2c 20 30 2c 20 30 2c 20 26 70 4c 6f 63 6b 29 3b  , 0, 0, &pLock);
226b0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
226c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
226d0 43 4f 52 52 55 50 54 20 7c 7c 20 72 63 3d 3d 53  CORRUPT || rc==S
226e0 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 29 7b 0a  QLITE_NOTADB ){.
226f0 20 20 20 20 20 20 69 73 44 73 74 43 6f 72 72 75        isDstCorru
22700 70 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63  pt = 1;.      rc
22710 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73   = sqlite3demo_s
22720 75 70 65 72 6c 6f 63 6b 5f 63 6f 72 72 75 70 74  uperlock_corrupt
22730 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  (id, SQLITE_LOCK
22740 5f 45 58 43 4c 55 53 49 56 45 2c 0a 20 20 20 20  _EXCLUSIVE,.    
22750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22770 20 20 20 20 20 26 63 6f 72 72 75 70 74 44 73 74       &corruptDst
22780 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d  FileLock);.    }
22790 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
227a0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
227b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 67      }.  }.  /* g
227c0 65 74 20 74 68 65 20 73 72 63 20 66 69 6c 65 20  et the src file 
227d0 64 65 73 63 72 69 70 74 6f 72 20 61 64 68 65 72  descriptor adher
227e0 69 6e 67 20 74 6f 20 74 68 65 20 64 62 20 73 74  ing to the db st
227f0 72 75 63 74 20 61 63 63 65 73 73 20 72 75 6c 65  ruct access rule
22800 73 20 0a 20 20 20 2a 2a 20 74 68 69 73 20 63 6f  s .   ** this co
22810 64 65 20 69 73 20 6d 6f 64 65 6c 65 64 20 61 66  de is modeled af
22820 74 65 72 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ter sqlite3_file
22830 5f 63 6f 6e 74 72 6f 6c 28 29 20 69 6e 20 6d 61  _control() in ma
22840 69 6e 2e 63 0a 20 20 20 2a 2f 20 0a 20 20 73 71  in.c.   */ .  sq
22850 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
22860 72 28 73 72 63 64 62 2d 3e 6d 75 74 65 78 29 3b  r(srcdb->mutex);
22870 0a 20 20 69 66 28 20 73 72 63 64 62 2d 3e 6e 44  .  if( srcdb->nD
22880 62 3e 30 20 29 7b 0a 20 20 20 20 70 53 72 63 42  b>0 ){.    pSrcB
22890 74 72 65 65 20 3d 20 73 72 63 64 62 2d 3e 61 44  tree = srcdb->aD
228a0 62 5b 30 5d 2e 70 42 74 3b 0a 20 20 7d 0a 20 20  b[0].pBt;.  }.  
228b0 69 66 28 20 70 53 72 63 42 74 72 65 65 20 29 7b  if( pSrcBtree ){
228c0 0a 20 20 20 20 50 61 67 65 72 20 2a 70 53 72 63  .    Pager *pSrc
228d0 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74  Pager;.    sqlit
228e0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 53 72  e3BtreeEnter(pSr
228f0 63 42 74 72 65 65 29 3b 0a 20 20 20 20 70 53 72  cBtree);.    pSr
22900 63 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33  cPager = sqlite3
22910 42 74 72 65 65 50 61 67 65 72 28 70 53 72 63 42  BtreePager(pSrcB
22920 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65 72  tree);.    asser
22930 74 28 20 70 53 72 63 50 61 67 65 72 21 3d 30 20  t( pSrcPager!=0 
22940 29 3b 0a 20 20 20 20 73 72 63 5f 66 69 6c 65 20  );.    src_file 
22950 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
22960 6c 65 28 70 53 72 63 50 61 67 65 72 29 3b 0a 20  le(pSrcPager);. 
22970 20 20 20 61 73 73 65 72 74 28 20 73 72 63 5f 66     assert( src_f
22980 69 6c 65 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  ile!=0 );.    if
22990 28 20 73 72 63 5f 66 69 6c 65 2d 3e 70 4d 65 74  ( src_file->pMet
229a0 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 69 6e  hods ){.      in
229b0 74 20 73 72 63 46 6c 61 67 73 20 3d 20 30 3b 0a  t srcFlags = 0;.
229c0 20 20 20 20 20 20 70 53 72 63 46 69 6c 65 20 3d        pSrcFile =
229d0 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 73 72 63   (unixFile *)src
229e0 5f 66 69 6c 65 3b 0a 23 69 66 20 53 51 4c 49 54  _file;.#if SQLIT
229f0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
22a00 5f 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65  _STYLE || define
22a10 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20  d(__APPLE__).   
22a20 20 20 20 69 66 20 28 28 70 53 72 63 46 69 6c 65     if ((pSrcFile
22a30 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f 5f  ->openFlags & O_
22a40 52 44 57 52 29 20 3d 3d 20 4f 5f 52 44 57 52 29  RDWR) == O_RDWR)
22a50 20 7b 0a 20 20 20 20 20 20 20 20 73 72 63 46 6c   {.        srcFl
22a60 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
22a70 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20  N_READWRITE;.   
22a80 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
22a90 20 20 20 20 73 72 63 46 6c 61 67 73 20 3d 20 53      srcFlags = S
22aa0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
22ab0 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c  NLY;.      }.#el
22ac0 73 65 0a 20 20 20 20 20 20 73 72 63 46 6c 61 67  se.      srcFlag
22ad0 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
22ae0 52 45 41 44 57 52 49 54 45 3b 0a 23 65 6e 64 69  READWRITE;.#endi
22af0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
22b00 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54  BLE_DATA_PROTECT
22b10 49 4f 4e 0a 20 20 20 20 20 20 73 72 63 46 6c 61  ION.      srcFla
22b20 67 73 20 7c 3d 20 70 53 72 63 46 69 6c 65 2d 3e  gs |= pSrcFile->
22b30 70 72 6f 74 46 6c 61 67 73 3b 0a 23 65 6e 64 69  protFlags;.#endi
22b40 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
22b50 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
22b60 45 0a 20 20 20 20 20 20 69 66 28 20 69 73 50 72  E.      if( isPr
22b70 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70  oxyLockingMode(p
22b80 53 72 63 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  SrcFile) ){.    
22b90 20 20 20 20 73 72 63 46 6c 61 67 73 20 7c 3d 20      srcFlags |= 
22ba0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f  SQLITE_OPEN_AUTO
22bb0 50 52 4f 58 59 3b 0a 20 20 20 20 20 20 7d 0a 23  PROXY;.      }.#
22bc0 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
22bd0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
22be0 28 70 53 72 63 46 69 6c 65 2d 3e 7a 50 61 74 68  (pSrcFile->zPath
22bf0 2c 20 26 73 72 63 64 62 32 2c 20 73 72 63 46 6c  , &srcdb2, srcFl
22c00 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ags, 0);.      i
22c10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22c20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73   ){.        /* s
22c30 74 61 72 74 20 61 20 64 65 66 65 72 72 65 64 20  tart a deferred 
22c40 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
22c50 72 65 61 64 20 74 6f 20 65 73 74 61 62 6c 69 73  read to establis
22c60 68 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f  h a read lock */
22c70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
22c80 6c 69 74 65 33 5f 65 78 65 63 28 73 72 63 64 62  lite3_exec(srcdb
22c90 32 2c 20 22 42 45 47 49 4e 20 44 45 46 45 52 52  2, "BEGIN DEFERR
22ca0 45 44 3b 20 50 52 41 47 4d 41 20 73 63 68 65 6d  ED; PRAGMA schem
22cb0 61 5f 76 65 72 73 69 6f 6e 22 2c 0a 20 20 20 20  a_version",.    
22cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cd0 20 20 20 20 20 20 30 2c 20 30 2c 20 30 29 3b 0a        0, 0, 0);.
22ce0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
22cf0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c  SQLITE_CORRUPT |
22d00 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54  | rc==SQLITE_NOT
22d10 41 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ADB ){.         
22d20 20 69 73 53 72 63 43 6f 72 72 75 70 74 20 3d 20   isSrcCorrupt = 
22d30 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  1;.          rc 
22d40 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75  = sqlite3demo_su
22d50 70 65 72 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28  perlock_corrupt(
22d60 73 72 63 5f 66 69 6c 65 2c 20 53 51 4c 49 54 45  src_file, SQLITE
22d70 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 2c 0a 20 20  _LOCK_SHARED,.  
22d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22da0 20 20 20 20 20 20 20 20 20 20 20 26 63 6f 72 72             &corr
22db0 75 70 74 53 72 63 46 69 6c 65 4c 6f 63 6b 29 3b  uptSrcFileLock);
22dc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22dd0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
22de0 66 28 20 21 73 72 63 64 62 32 20 7c 7c 20 70 53  f( !srcdb2 || pS
22df0 72 63 46 69 6c 65 3d 3d 4e 55 4c 4c 20 7c 7c 20  rcFile==NULL || 
22e00 70 53 72 63 46 69 6c 65 2d 3e 68 3c 30 29 7b 0a  pSrcFile->h<0){.
22e10 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22e20 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d 0a 20 20  INTERNAL;.  }.  
22e30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
22e40 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
22e50 64 5f 72 65 70 6c 61 63 65 5f 64 61 74 61 62 61  d_replace_databa
22e60 73 65 3b 0a 20 20 7d 0a 20 20 2f 2a 20 62 6f 74  se;.  }.  /* bot
22e70 68 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  h databases are 
22e80 6c 6f 63 6b 65 64 20 61 70 70 72 6f 70 72 69 61  locked appropria
22e90 74 65 6c 79 2c 20 63 6f 70 79 20 74 68 65 20 73  tely, copy the s
22ea0 72 63 20 77 61 6c 20 6a 6f 75 72 6e 61 6c 20 69  rc wal journal i
22eb0 66 20 0a 20 20 20 2a 2a 20 6f 6e 65 20 65 78 69  f .   ** one exi
22ec0 73 74 73 20 61 6e 64 20 74 68 65 6e 20 74 68 65  sts and then the
22ed0 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
22ee0 20 66 69 6c 65 0a 20 20 20 2a 2f 0a 20 20 73 74   file.   */.  st
22ef0 72 6c 63 70 79 28 73 72 63 57 61 6c 50 61 74 68  rlcpy(srcWalPath
22f00 2c 20 70 53 72 63 46 69 6c 65 2d 3e 7a 50 61 74  , pSrcFile->zPat
22f10 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 2b 35 29  h, MAXPATHLEN+5)
22f20 3b 0a 20 20 73 74 72 6c 63 61 74 28 73 72 63 57  ;.  strlcat(srcW
22f30 61 6c 50 61 74 68 2c 20 22 2d 77 61 6c 22 2c 20  alPath, "-wal", 
22f40 4d 41 58 50 41 54 48 4c 45 4e 2b 35 29 3b 0a 20  MAXPATHLEN+5);. 
22f50 20 73 72 63 57 61 6c 46 44 20 3d 20 6f 70 65 6e   srcWalFD = open
22f60 28 73 72 63 57 61 6c 50 61 74 68 2c 20 4f 5f 52  (srcWalPath, O_R
22f70 44 4f 4e 4c 59 29 3b 0a 20 20 69 66 28 20 21 28  DONLY);.  if( !(
22f80 73 72 63 57 61 6c 46 44 3c 30 29 20 29 7b 0a 20  srcWalFD<0) ){. 
22f90 20 20 20 63 68 61 72 20 64 73 74 57 61 6c 50 61     char dstWalPa
22fa0 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 35 5d  th[MAXPATHLEN+5]
22fb0 3b 0a 20 20 20 20 69 6e 74 20 64 73 74 57 61 6c  ;.    int dstWal
22fc0 46 44 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74  FD = -1;.    int
22fd0 20 70 72 6f 74 46 6c 61 67 73 20 3d 20 30 3b 0a   protFlags = 0;.
22fe0 20 20 20 20 73 74 72 6c 63 70 79 28 64 73 74 57      strlcpy(dstW
22ff0 61 6c 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 7a  alPath, pFile->z
23000 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  Path, MAXPATHLEN
23010 2b 35 29 3b 0a 20 20 20 20 73 74 72 6c 63 61 74  +5);.    strlcat
23020 28 64 73 74 57 61 6c 50 61 74 68 2c 20 22 2d 77  (dstWalPath, "-w
23030 61 6c 22 2c 20 4d 41 58 50 41 54 48 4c 45 4e 2b  al", MAXPATHLEN+
23040 35 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 75 6e  5);..    rc = un
23050 69 78 4f 70 65 6e 43 68 69 6c 64 46 69 6c 65 28  ixOpenChildFile(
23060 64 73 74 57 61 6c 50 61 74 68 2c 20 4f 5f 52 44  dstWalPath, O_RD
23070 57 52 7c 4f 5f 43 52 45 41 54 2c 20 53 51 4c 49  WR|O_CREAT, SQLI
23080 54 45 5f 4f 50 45 4e 5f 57 41 4c 2c 0a 20 20 20  TE_OPEN_WAL,.   
23090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230a0 20 20 20 20 20 20 20 20 70 72 6f 74 46 6c 61 67          protFlag
230b0 73 2c 20 26 64 73 74 57 61 6c 46 44 29 3b 0a 20  s, &dstWalFD);. 
230c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
230d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 20  E_OK ){.      s 
230e0 3d 20 63 6f 70 79 66 69 6c 65 5f 73 74 61 74 65  = copyfile_state
230f0 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  _alloc();.      
23100 6c 73 65 65 6b 28 73 72 63 57 61 6c 46 44 2c 20  lseek(srcWalFD, 
23110 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  0, SEEK_SET);.  
23120 20 20 20 20 6c 73 65 65 6b 28 64 73 74 57 61 6c      lseek(dstWal
23130 46 44 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54 29  FD, 0, SEEK_SET)
23140 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63 6f 70  ;.      if( fcop
23150 79 66 69 6c 65 28 73 72 63 57 61 6c 46 44 2c 20  yfile(srcWalFD, 
23160 64 73 74 57 61 6c 46 44 2c 20 73 2c 20 43 4f 50  dstWalFD, s, COP
23170 59 46 49 4c 45 5f 44 41 54 41 29 20 29 7b 0a 20  YFILE_DATA) ){. 
23180 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 3d 65         int err=e
23190 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 73 77  rrno;.        sw
231a0 69 74 63 68 28 65 72 72 29 20 7b 0a 20 20 20 20  itch(err) {.    
231b0 20 20 20 20 20 20 63 61 73 65 20 45 4e 4f 4d 45        case ENOME
231c0 4d 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  M:.            r
231d0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
231e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
231f0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 64  eak;.          d
23200 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
23210 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
23220 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 29 3b 0a  no(pFile, err);.
23230 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
23240 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
23250 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23260 0a 20 20 20 20 20 20 63 6f 70 79 66 69 6c 65 5f  .      copyfile_
23270 73 74 61 74 65 5f 66 72 65 65 28 73 29 3b 0a 20  state_free(s);. 
23280 20 20 20 20 20 63 6c 6f 73 65 28 64 73 74 57 61       close(dstWa
23290 6c 46 44 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lFD);.    }.    
232a0 63 6c 6f 73 65 28 73 72 63 57 61 6c 46 44 29 3b  close(srcWalFD);
232b0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
232c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
232d0 2f 2a 20 62 65 66 6f 72 65 20 77 65 20 63 6f 70  /* before we cop
232e0 79 2c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  y, ensure that t
232f0 68 65 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63  he file change c
23300 6f 75 6e 74 65 72 20 77 69 6c 6c 20 62 65 20 6d  ounter will be m
23310 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 75  odified */.    u
23320 69 6e 74 33 32 5f 74 20 73 72 63 43 68 61 6e 67  int32_t srcChang
23330 65 20 3d 20 30 3b 0a 20 20 20 20 75 69 6e 74 33  e = 0;.    uint3
23340 32 5f 74 20 64 73 74 43 68 61 6e 67 65 20 3d 20  2_t dstChange = 
23350 30 3b 0a 20 20 20 20 70 72 65 61 64 28 70 53 72  0;.    pread(pSr
23360 63 46 69 6c 65 2d 3e 68 2c 20 26 73 72 63 43 68  cFile->h, &srcCh
23370 61 6e 67 65 2c 20 34 2c 20 32 34 29 3b 0a 20 20  ange, 4, 24);.  
23380 20 20 70 72 65 61 64 28 70 46 69 6c 65 2d 3e 68    pread(pFile->h
23390 2c 20 26 64 73 74 43 68 61 6e 67 65 2c 20 34 2c  , &dstChange, 4,
233a0 20 32 34 29 3b 0a 20 20 20 20 0a 20 20 20 20 2f   24);.    .    /
233b0 2a 20 63 6f 70 79 20 74 68 65 20 61 63 74 75 61  * copy the actua
233c0 6c 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  l database */.  
233d0 20 20 73 20 3d 20 63 6f 70 79 66 69 6c 65 5f 73    s = copyfile_s
233e0 74 61 74 65 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20  tate_alloc();.  
233f0 20 20 6c 73 65 65 6b 28 70 53 72 63 46 69 6c 65    lseek(pSrcFile
23400 2d 3e 68 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54  ->h, 0, SEEK_SET
23410 29 3b 0a 20 20 20 20 6c 73 65 65 6b 28 70 46 69  );.    lseek(pFi
23420 6c 65 2d 3e 68 2c 20 30 2c 20 53 45 45 4b 5f 53  le->h, 0, SEEK_S
23430 45 54 29 3b 0a 20 20 20 20 69 66 28 20 66 63 6f  ET);.    if( fco
23440 70 79 66 69 6c 65 28 70 53 72 63 46 69 6c 65 2d  pyfile(pSrcFile-
23450 3e 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 2c  >h, pFile->h, s,
23460 20 43 4f 50 59 46 49 4c 45 5f 44 41 54 41 29 20   COPYFILE_DATA) 
23470 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72  ){.      int err
23480 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 73 77  =errno;.      sw
23490 69 74 63 68 28 65 72 72 29 20 7b 0a 20 20 20 20  itch(err) {.    
234a0 20 20 20 20 63 61 73 65 20 45 4e 4f 4d 45 4d 3a      case ENOMEM:
234b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
234c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
234d0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
234e0 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a         default:.
234f0 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c            storeL
23500 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
23510 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  err);.          
23520 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
23530 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  R;.      }.    }
23540 0a 20 20 20 20 63 6f 70 79 66 69 6c 65 5f 73 74  .    copyfile_st
23550 61 74 65 5f 66 72 65 65 28 73 29 3b 0a 20 20 20  ate_free(s);.   
23560 20 0a 20 20 20 20 69 66 20 28 73 72 63 43 68 61   .    if (srcCha
23570 6e 67 65 20 3d 3d 20 64 73 74 43 68 61 6e 67 65  nge == dstChange
23580 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6d 6f 64  ) {.      /* mod
23590 69 66 79 20 74 68 65 20 63 68 61 6e 67 65 20 63  ify the change c
235a0 6f 75 6e 74 65 72 20 74 6f 20 66 6f 72 63 65 20  ounter to force 
235b0 70 61 67 65 20 7a 65 72 6f 20 74 6f 20 62 65 20  page zero to be 
235c0 72 65 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 20 20  reloaded */.    
235d0 20 20 64 73 74 43 68 61 6e 67 65 20 2b 2b 3b 0a    dstChange ++;.
235e0 20 20 20 20 20 20 70 77 72 69 74 65 28 70 46 69        pwrite(pFi
235f0 6c 65 2d 3e 68 2c 20 26 64 73 74 43 68 61 6e 67  le->h, &dstChang
23600 65 2c 20 34 2c 20 32 34 29 3b 0a 20 20 20 20 7d  e, 4, 24);.    }
23610 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 53 72 63  .  }.  if( isSrc
23620 43 6f 72 72 75 70 74 20 29 7b 0a 20 20 20 20 73  Corrupt ){.    s
23630 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72  qlite3demo_super
23640 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 73  unlock_corrupt(s
23650 72 63 5f 66 69 6c 65 2c 20 63 6f 72 72 75 70 74  rc_file, corrupt
23660 53 72 63 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20  SrcFileLock);.  
23670 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 64 6f  }else{.    /* do
23680 6e 65 20 77 69 74 68 20 74 68 65 20 73 6f 75 72  ne with the sour
23690 63 65 20 64 62 20 73 6f 20 65 6e 64 20 74 68 65  ce db so end the
236a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   transaction */.
236b0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
236c0 28 73 72 63 64 62 32 2c 20 22 43 4f 4d 4d 49 54  (srcdb2, "COMMIT
236d0 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  ", 0, 0, 0);.  }
236e0 0a 20 20 2f 2a 20 7a 65 72 6f 20 6f 75 74 20 61  .  /* zero out a
236f0 6e 79 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 63  ny old journal c
23700 6c 75 74 74 65 72 20 2a 2f 0a 20 20 69 66 28 20  lutter */.  if( 
23710 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23720 0a 20 20 20 20 69 6e 74 20 73 6b 69 70 57 41 4c  .    int skipWAL
23730 20 3d 20 28 73 72 63 57 61 6c 46 44 3c 30 29 3f   = (srcWalFD<0)?
23740 30 3a 31 3b 0a 20 20 20 20 75 6e 69 78 49 6e 76  0:1;.    unixInv
23750 61 6c 69 64 61 74 65 53 75 70 70 6f 72 74 46 69  alidateSupportFi
23760 6c 65 73 28 70 46 69 6c 65 2c 20 73 6b 69 70 57  les(pFile, skipW
23770 41 4c 29 3b 0a 20 20 7d 0a 20 20 0a 65 6e 64 5f  AL);.  }.  .end_
23780 72 65 70 6c 61 63 65 5f 64 61 74 61 62 61 73 65  replace_database
23790 3a 0a 20 20 69 66 28 20 70 53 72 63 42 74 72 65  :.  if( pSrcBtre
237a0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
237b0 5f 63 6c 6f 73 65 28 73 72 63 64 62 32 29 3b 0a  _close(srcdb2);.
237c0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
237d0 4c 65 61 76 65 28 70 53 72 63 42 74 72 65 65 29  Leave(pSrcBtree)
237e0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
237f0 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 72 63 64  mutex_leave(srcd
23800 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
23810 20 69 73 44 73 74 43 6f 72 72 75 70 74 20 29 7b   isDstCorrupt ){
23820 0a 20 20 20 20 73 71 6c 69 74 65 33 64 65 6d 6f  .    sqlite3demo
23830 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 5f 63 6f 72  _superunlock_cor
23840 72 75 70 74 28 69 64 2c 20 63 6f 72 72 75 70 74  rupt(id, corrupt
23850 44 73 74 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20  DstFileLock);.  
23860 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
23870 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f  e3demo_superunlo
23880 63 6b 28 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20  ck(pLock);.  }. 
23890 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 64   return rc;.}.#d
238a0 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 49 4c  efine SQLITE_FIL
238b0 45 5f 48 45 41 44 45 52 5f 4c 45 4e 20 31 36 0a  E_HEADER_LEN 16.
238c0 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20 63  /* Check for a c
238d0 6f 6e 66 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e  onflicting lock.
238e0 20 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e    If one is foun
238f0 64 2c 20 70 72 69 6e 74 20 61 6e 20 74 68 69 73  d, print an this
23900 0a 20 2a 2a 20 6f 6e 20 73 74 61 6e 64 61 72 64  . ** on standard
23910 20 6f 75 74 70 75 74 20 75 73 69 6e 67 20 74 68   output using th
23920 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20  e format string 
23930 67 69 76 65 6e 20 61 6e 64 20 72 65 74 75 72 6e  given and return
23940 20 31 2e 0a 20 2a 2a 20 49 66 20 74 68 65 72 65   1.. ** If there
23950 20 61 72 65 20 6e 6f 20 63 6f 6e 66 6c 69 63 74   are no conflict
23960 69 6e 67 20 6c 6f 63 6b 73 2c 20 72 65 74 75 72  ing locks, retur
23970 6e 20 30 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  n 0.. */.static 
23980 69 6e 74 20 75 6e 69 78 49 73 4c 6f 63 6b 65 64  int unixIsLocked
23990 28 0a 20 20 70 69 64 5f 74 20 70 69 64 2c 20 20  (.  pid_t pid,  
239a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 49 44            /* PID
239b0 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6c 6f 63   to test for loc
239c0 6b 20 6f 77 6e 65 72 20 2a 2f 0a 20 20 69 6e 74  k owner */.  int
239d0 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   h,             
239e0 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
239f0 69 70 74 6f 72 20 74 6f 20 63 68 65 63 6b 20 2a  iptor to check *
23a00 2f 0a 20 20 69 6e 74 20 74 79 70 65 2c 20 20 20  /.  int type,   
23a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f 52            /* F_R
23a20 44 4c 43 4b 20 6f 72 20 46 5f 57 52 4c 43 4b 20  DLCK or F_WRLCK 
23a30 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  */.  unsigned in
23a40 74 20 69 4f 66 73 74 2c 20 20 20 2f 2a 20 46 69  t iOfst,   /* Fi
23a50 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
23a60 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
23a70 65 64 20 69 6e 74 20 69 43 6e 74 2c 20 20 20 20  ed int iCnt,    
23a80 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
23a90 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 20 72  es in the lock r
23aa0 61 6e 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ange */.  const 
23ab0 63 68 61 72 20 2a 7a 54 79 70 65 20 20 20 20 20  char *zType     
23ac0 2f 2a 20 54 79 70 65 20 6f 66 20 6c 6f 63 6b 20  /* Type of lock 
23ad0 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66  */.){.  struct f
23ae0 6c 6f 63 6b 20 6c 6b 3b 0a 20 20 69 6e 74 20 65  lock lk;.  int e
23af0 72 72 3b 0a 20 20 0a 20 20 6d 65 6d 73 65 74 28  rr;.  .  memset(
23b00 26 6c 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6c  &lk, 0, sizeof(l
23b10 6b 29 29 3b 0a 20 20 6c 6b 2e 6c 5f 74 79 70 65  k));.  lk.l_type
23b20 20 3d 20 74 79 70 65 3b 0a 20 20 6c 6b 2e 6c 5f   = type;.  lk.l_
23b30 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
23b40 54 3b 0a 20 20 6c 6b 2e 6c 5f 73 74 61 72 74 20  T;.  lk.l_start 
23b50 3d 20 69 4f 66 73 74 3b 0a 20 20 6c 6b 2e 6c 5f  = iOfst;.  lk.l_
23b60 6c 65 6e 20 3d 20 69 43 6e 74 3b 0a 20 20 0a 20  len = iCnt;.  . 
23b70 20 69 66 28 20 70 69 64 21 3d 53 51 4c 49 54 45   if( pid!=SQLITE
23b80 5f 4c 4f 43 4b 53 54 41 54 45 5f 41 4e 59 50 49  _LOCKSTATE_ANYPI
23b90 44 20 29 7b 0a 23 69 66 6e 64 65 66 20 46 5f 47  D ){.#ifndef F_G
23ba0 45 54 4c 4b 50 49 44 0a 23 20 77 61 72 6e 69 6e  ETLKPID.# warnin
23bb0 67 20 46 5f 47 45 54 4c 4b 50 49 44 20 75 6e 64  g F_GETLKPID und
23bc0 65 66 69 6e 65 64 2c 20 5f 73 71 6c 69 74 65 33  efined, _sqlite3
23bd0 5f 6c 6f 63 6b 73 74 61 74 65 20 66 61 6c 6c 69  _lockstate falli
23be0 6e 67 20 62 61 63 6b 20 74 6f 20 46 5f 47 45 54  ng back to F_GET
23bf0 4c 4b 0a 20 20 20 20 65 72 72 20 3d 20 66 63 6e  LK.    err = fcn
23c00 74 6c 28 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  tl(h, F_GETLK, &
23c10 6c 6b 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6c  lk);.#else.    l
23c20 6b 2e 6c 5f 70 69 64 20 3d 20 70 69 64 3b 0a 20  k.l_pid = pid;. 
23c30 20 20 20 65 72 72 20 3d 20 66 63 6e 74 6c 28 68     err = fcntl(h
23c40 2c 20 46 5f 47 45 54 4c 4b 50 49 44 2c 20 26 6c  , F_GETLKPID, &l
23c50 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  k);.#endif.  }el
23c60 73 65 7b 0a 20 20 20 20 65 72 72 20 3d 20 66 63  se{.    err = fc
23c70 6e 74 6c 28 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  ntl(h, F_GETLK, 
23c80 26 6c 6b 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69  &lk);.  }.  .  i
23c90 66 28 20 65 72 72 3d 3d 28 2d 31 29 20 29 7b 0a  f( err==(-1) ){.
23ca0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
23cb0 72 72 2c 20 22 66 63 6e 74 6c 28 25 64 29 20 66  rr, "fcntl(%d) f
23cc0 61 69 6c 65 64 3a 20 65 72 72 6e 6f 3d 25 64 5c  ailed: errno=%d\
23cd0 6e 22 2c 20 68 2c 20 65 72 72 6e 6f 29 3b 0a 20  n", h, errno);. 
23ce0 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
23cf0 7d 0a 20 20 0a 20 20 69 66 28 20 6c 6b 2e 6c 5f  }.  .  if( lk.l_
23d00 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 26 26  type!=F_UNLCK &&
23d10 20 28 70 69 64 3d 3d 53 51 4c 49 54 45 5f 4c 4f   (pid==SQLITE_LO
23d20 43 4b 53 54 41 54 45 5f 41 4e 59 50 49 44 20 7c  CKSTATE_ANYPID |
23d30 7c 20 6c 6b 2e 6c 5f 70 69 64 3d 3d 70 69 64 29  | lk.l_pid==pid)
23d40 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
23d50 45 5f 44 45 42 55 47 0a 20 20 20 20 66 70 72 69  E_DEBUG.    fpri
23d60 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 20  ntf(stderr, "%s 
23d70 6c 6f 63 6b 20 68 65 6c 64 20 62 79 20 25 64 5c  lock held by %d\
23d80 6e 22 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29  n", zType, (int)
23d90 6c 6b 2e 6c 5f 70 69 64 29 3b 0a 23 65 6e 64 69  lk.l_pid);.#endi
23da0 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  f.    return 1;.
23db0 20 20 7d 20 0a 20 20 72 65 74 75 72 6e 20 30 3b    } .  return 0;
23dc0 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .}..static int u
23dd0 6e 69 78 4c 6f 63 6b 73 74 61 74 65 50 69 64 28  nixLockstatePid(
23de0 75 6e 69 78 46 69 6c 65 20 2a 2c 20 70 69 64 5f  unixFile *, pid_
23df0 74 2c 20 69 6e 74 20 2a 29 3b 0a 0a 23 65 6e 64  t, int *);..#end
23e00 69 66 20 2f 2a 20 28 53 51 4c 49 54 45 5f 45 4e  if /* (SQLITE_EN
23e10 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30  ABLE_APPLE_SPI>0
23e20 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  ) && defined(__A
23e30 50 50 4c 45 5f 5f 29 20 2a 2f 0a 0a 0a 2f 2a 0a  PPLE__) */.../*.
23e40 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 69  ** If *pArg is i
23e50 6e 69 74 69 61 6c 6c 79 20 6e 65 67 61 74 69 76  nitially negativ
23e60 65 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61  e then this is a
23e70 20 71 75 65 72 79 2e 20 20 53 65 74 20 2a 70 41   query.  Set *pA
23e80 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20  rg to.** 1 or 0 
23e90 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
23ea0 74 68 65 72 20 6f 72 20 6e 6f 74 20 62 69 74 20  ther or not bit 
23eb0 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63  mask of pFile->c
23ec0 74 72 6c 46 6c 61 67 73 20 69 73 20 73 65 74 2e  trlFlags is set.
23ed0 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20  .**.** If *pArg 
23ee0 69 73 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20  is 0 or 1, then 
23ef0 63 6c 65 61 72 20 6f 72 20 73 65 74 20 74 68 65  clear or set the
23f00 20 6d 61 73 6b 20 62 69 74 20 6f 66 20 70 46 69   mask bit of pFi
23f10 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a  le->ctrlFlags..*
23f20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
23f30 69 78 4d 6f 64 65 42 69 74 28 75 6e 69 78 46 69  ixModeBit(unixFi
23f40 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67  le *pFile, unsig
23f50 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20 69  ned char mask, i
23f60 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69 66 28  nt *pArg){.  if(
23f70 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20 20 20   *pArg<0 ){.    
23f80 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e  *pArg = (pFile->
23f90 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b  ctrlFlags & mask
23fa0 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66  )!=0;.  }else if
23fb0 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a  ( (*pArg)==0 ){.
23fc0 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
23fd0 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  lags &= ~mask;. 
23fe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
23ff0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  e->ctrlFlags |= 
24000 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  mask;.  }.}../* 
24010 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
24020 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ion */.static in
24030 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d  t unixGetTempnam
24040 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  e(int nBuf, char
24050 20 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20   *zBuf);../*.** 
24060 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20  Information and 
24070 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70  control of an op
24080 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a  en file handle..
24090 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
240a0 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  ixFileControl(sq
240b0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
240c0 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41  int op, void *pA
240d0 72 67 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  rg){.  unixFile 
240e0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
240f0 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69 74 63 68  le*)id;.  switch
24100 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
24110 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 41   SQLITE_FCNTL_WA
24120 4c 5f 42 4c 4f 43 4b 3a 20 7b 0a 20 20 20 20 20  L_BLOCK: {.     
24130 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
24140 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 42 4c  s |= UNIXFILE_BL
24150 4f 43 4b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  OCK;.      retur
24160 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
24170 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
24180 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41  TE_FCNTL_LOCKSTA
24190 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e  TE: {.      *(in
241a0 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d  t*)pArg = pFile-
241b0 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20  >eFileLock;.    
241c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
241d0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
241e0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
241f0 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20  LAST_ERRNO: {.  
24200 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
24210 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  = pFile->lastErr
24220 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  no;.      return
24230 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
24240 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
24250 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  E_FCNTL_CHUNK_SI
24260 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ZE: {.      pFil
24270 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69  e->szChunk = *(i
24280 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  nt *)pArg;.     
24290 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
242a0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
242b0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
242c0 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20  IZE_HINT: {.    
242d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
242e0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
242f0 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
24300 72 63 20 3d 20 66 63 6e 74 6c 53 69 7a 65 48 69  rc = fcntlSizeHi
24310 6e 74 28 70 46 69 6c 65 2c 20 2a 28 69 36 34 20  nt(pFile, *(i64 
24320 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 53  *)pArg);.      S
24330 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
24340 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 72  nign(0);.      r
24350 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
24360 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
24370 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41  FCNTL_PERSIST_WA
24380 4c 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d  L: {.      unixM
24390 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55 4e  odeBit(pFile, UN
243a0 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57  IXFILE_PERSIST_W
243b0 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b  AL, (int*)pArg);
243c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
243d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
243e0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
243f0 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f  CNTL_POWERSAFE_O
24400 56 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20 20  VERWRITE: {.    
24410 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46    unixModeBit(pF
24420 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 53  ile, UNIXFILE_PS
24430 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b  OW, (int*)pArg);
24440 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
24450 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
24460 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
24470 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a  CNTL_VFSNAME: {.
24480 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70        *(char**)p
24490 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Arg = sqlite3_mp
244a0 72 69 6e 74 66 28 22 25 73 22 2c 20 70 46 69 6c  rintf("%s", pFil
244b0 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b  e->pVfs->zName);
244c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
244d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
244e0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
244f0 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d  CNTL_TEMPFILENAM
24500 45 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20  E: {.      char 
24510 2a 7a 54 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  *zTFile = sqlite
24520 33 5f 6d 61 6c 6c 6f 63 28 20 70 46 69 6c 65 2d  3_malloc( pFile-
24530 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
24540 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  e );.      if( z
24550 54 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  TFile ){.       
24560 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65   unixGetTempname
24570 28 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78  (pFile->pVfs->mx
24580 50 61 74 68 6e 61 6d 65 2c 20 7a 54 46 69 6c 65  Pathname, zTFile
24590 29 3b 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61  );.        *(cha
245a0 72 2a 2a 29 70 41 72 67 20 3d 20 7a 54 46 69 6c  r**)pArg = zTFil
245b0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
245c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
245d0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
245e0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48  e SQLITE_FCNTL_H
245f0 41 53 5f 4d 4f 56 45 44 3a 20 7b 0a 20 20 20 20  AS_MOVED: {.    
24600 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
24610 66 69 6c 65 48 61 73 4d 6f 76 65 64 28 70 46 69  fileHasMoved(pFi
24620 6c 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  le);.      retur
24630 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
24640 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41   }.#if SQLITE_MA
24650 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
24660 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
24670 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b  NTL_MMAP_SIZE: {
24680 0a 20 20 20 20 20 20 69 36 34 20 6e 65 77 4c 69  .      i64 newLi
24690 6d 69 74 20 3d 20 2a 28 69 36 34 2a 29 70 41 72  mit = *(i64*)pAr
246a0 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  g;.      int rc 
246b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
246c0 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e     if( newLimit>
246d0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
246e0 66 69 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20  fig.mxMmap ){.  
246f0 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d        newLimit =
24700 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
24710 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20  nfig.mxMmap;.   
24720 20 20 20 7d 0a 20 20 20 20 20 20 2a 28 69 36 34     }.      *(i64
24730 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
24740 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20  mmapSizeMax;.   
24750 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e     if( newLimit>
24760 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d  =0 && newLimit!=
24770 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
24780 61 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65  ax && pFile->nFe
24790 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  tchOut==0 ){.   
247a0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70       pFile->mmap
247b0 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d  SizeMax = newLim
247c0 69 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  it;.        if( 
247d0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e  pFile->mmapSize>
247e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
247f0 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 69  nixUnmapfile(pFi
24800 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  le);.          r
24810 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28  c = unixMapfile(
24820 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20  pFile, -1);.    
24830 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
24840 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
24850 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64     }.#endif.#ifd
24860 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
24870 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
24880 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74 68   calls this meth
24890 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 61  od to signal tha
248a0 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a 20 20  t it has done.  
248b0 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20    ** a rollback 
248c0 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61 74  and that the dat
248d0 61 62 61 73 65 20 69 73 20 74 68 65 72 65 66 6f  abase is therefo
248e0 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  re unchanged and
248f0 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e 63 65  .    ** it hence
24900 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68   it is OK for th
24910 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 68  e transaction ch
24920 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20  ange counter to 
24930 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e  be.    ** unchan
24940 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ged..    */.    
24950 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
24960 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20  L_DB_UNCHANGED: 
24970 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69  {.      ((unixFi
24980 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61 74  le*)id)->dbUpdat
24990 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  e = 0;.      ret
249a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
249b0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
249c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
249d0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
249e0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
249f0 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ).    case SQLIT
24a00 45 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b  E_FCNTL_SET_LOCK
24a10 50 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20 63  PROXYFILE:.    c
24a20 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
24a30 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
24a40 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  LE: {.      retu
24a50 72 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74  rn proxyFileCont
24a60 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b  rol(id,op,pArg);
24a70 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
24a80 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
24a90 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
24aa0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
24ab0 5f 29 20 2a 2f 0a 23 69 66 20 28 53 51 4c 49 54  _) */.#if (SQLIT
24ac0 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53  E_ENABLE_APPLE_S
24ad0 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65 64  PI>0) && defined
24ae0 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20  (__APPLE__).    
24af0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
24b00 4c 5f 54 52 55 4e 43 41 54 45 5f 44 41 54 41 42  L_TRUNCATE_DATAB
24b10 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  ASE: {.      ret
24b20 75 72 6e 20 75 6e 69 78 54 72 75 6e 63 61 74 65  urn unixTruncate
24b30 44 61 74 61 62 61 73 65 28 70 46 69 6c 65 2c 20  Database(pFile, 
24b40 28 70 41 72 67 20 3f 20 28 2a 28 69 6e 74 20 2a  (pArg ? (*(int *
24b50 29 70 41 72 67 29 20 3a 20 30 29 29 3b 0a 20 20  )pArg) : 0));.  
24b60 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
24b70 49 54 45 5f 46 43 4e 54 4c 5f 52 45 50 4c 41 43  ITE_FCNTL_REPLAC
24b80 45 5f 44 41 54 41 42 41 53 45 3a 20 7b 0a 20 20  E_DATABASE: {.  
24b90 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 52      return unixR
24ba0 65 70 6c 61 63 65 44 61 74 61 62 61 73 65 28 70  eplaceDatabase(p
24bb0 46 69 6c 65 2c 20 28 73 71 6c 69 74 65 33 20 2a  File, (sqlite3 *
24bc0 29 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20  )pArg);.    }.  
24bd0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
24be0 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 5f 50 49  NTL_LOCKSTATE_PI
24bf0 44 3a 20 7b 0a 20 20 20 20 20 20 4c 6f 63 6b 73  D: {.      Locks
24c00 74 61 74 65 50 49 44 20 2a 70 4c 6f 63 6b 73 74  tatePID *pLockst
24c10 61 74 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  ate;.      int r
24c20 63 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  c;.      .      
24c30 69 66 28 20 70 41 72 67 3d 3d 4e 55 4c 4c 20 29  if( pArg==NULL )
24c40 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
24c50 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
24c60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c        }.      pL
24c70 6f 63 6b 73 74 61 74 65 20 3d 20 28 4c 6f 63 6b  ockstate = (Lock
24c80 73 74 61 74 65 50 49 44 20 2a 29 70 41 72 67 3b  statePID *)pArg;
24c90 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78  .      rc = unix
24ca0 4c 6f 63 6b 73 74 61 74 65 50 69 64 28 70 46 69  LockstatePid(pFi
24cb0 6c 65 2c 20 70 4c 6f 63 6b 73 74 61 74 65 2d 3e  le, pLockstate->
24cc0 70 69 64 2c 20 26 28 70 4c 6f 63 6b 73 74 61 74  pid, &(pLockstat
24cd0 65 2d 3e 73 74 61 74 65 29 29 3b 0a 20 20 20 20  e->state));.    
24ce0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
24cf0 20 7d 0a 20 20 20 20 20 20 0a 23 65 6e 64 69 66   }.      .#endif
24d00 20 2f 2a 20 28 53 51 4c 49 54 45 5f 45 4e 41 42   /* (SQLITE_ENAB
24d10 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20  LE_APPLE_SPI>0) 
24d20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
24d30 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20 72  LE__) */.  }.  r
24d40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
24d50 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  FOUND;.}../*.** 
24d60 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f  Return the secto
24d70 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  r size in bytes 
24d80 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
24d90 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66  g block device f
24da0 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66  or.** the specif
24db0 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69  ied file. This i
24dc0 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20  s almost always 
24dd0 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d  512 bytes, but m
24de0 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20  ay be.** larger 
24df0 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73  for some devices
24e00 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63  ..**.** SQLite c
24e10 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73  ode assumes this
24e20 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74   function cannot
24e30 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61   fail. It also a
24e40 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69  ssumes that.** i
24e50 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20  f two files are 
24e60 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73  created in the s
24e70 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ame file-system 
24e80 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a  directory (i.e..
24e90 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e  ** a database an
24ea0 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69  d its journal fi
24eb0 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63  le) that the sec
24ec0 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
24ed0 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72   the.** same for
24ee0 20 62 6f 74 68 2e 0a 2a 2f 0a 23 69 66 6e 64 65   both..*/.#ifnde
24ef0 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 20 0a 73 74  f __QNXNTO__ .st
24f00 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63  atic int unixSec
24f10 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
24f20 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a  file *NotUsed){.
24f30 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
24f40 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
24f50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46  eturn SQLITE_DEF
24f60 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
24f70 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
24f80 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
24f90 76 65 72 73 69 6f 6e 20 6f 66 20 75 6e 69 78 53  version of unixS
24fa0 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6f  ectorSize() is o
24fb0 70 74 69 6d 69 7a 65 64 20 66 6f 72 20 51 4e 58  ptimized for QNX
24fc0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 51 4e  ..*/.#ifdef __QN
24fd0 58 4e 54 4f 5f 5f 0a 23 69 6e 63 6c 75 64 65 20  XNTO__.#include 
24fe0 3c 73 79 73 2f 64 63 6d 64 5f 62 6c 6b 2e 68 3e  <sys/dcmd_blk.h>
24ff0 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73  .#include <sys/s
25000 74 61 74 76 66 73 2e 68 3e 0a 73 74 61 74 69 63  tatvfs.h>.static
25010 20 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53   int unixSectorS
25020 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
25030 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c   *id){.  unixFil
25040 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
25050 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28 20  File*)id;.  if( 
25060 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
25070 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 74  e == 0 ){.    st
25080 72 75 63 74 20 73 74 61 74 76 66 73 20 66 73 49  ruct statvfs fsI
25090 6e 66 6f 3b 0a 20 20 20 20 20 20 20 0a 20 20 20  nfo;.       .   
250a0 20 2f 2a 20 53 65 74 20 64 65 66 61 75 6c 74 73   /* Set defaults
250b0 20 66 6f 72 20 6e 6f 6e 2d 73 75 70 70 6f 72 74   for non-support
250c0 65 64 20 66 69 6c 65 73 79 73 74 65 6d 73 20 2a  ed filesystems *
250d0 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63  /.    pFile->sec
250e0 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45  torSize = SQLITE
250f0 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f  _DEFAULT_SECTOR_
25100 53 49 5a 45 3b 0a 20 20 20 20 70 46 69 6c 65 2d  SIZE;.    pFile-
25110 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
25120 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20 20 20  istics = 0;.    
25130 69 66 28 20 66 73 74 61 74 76 66 73 28 70 46 69  if( fstatvfs(pFi
25140 6c 65 2d 3e 68 2c 20 26 66 73 49 6e 66 6f 29 20  le->h, &fsInfo) 
25150 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20 20 20  == -1 ) {.      
25160 72 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 73 65  return pFile->se
25170 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 7d 0a  ctorSize;.    }.
25180 0a 20 20 20 20 69 66 28 20 21 73 74 72 63 6d 70  .    if( !strcmp
25190 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79  (fsInfo.f_basety
251a0 70 65 2c 20 22 74 6d 70 22 29 20 29 20 7b 0a 20  pe, "tmp") ) {. 
251b0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74       pFile->sect
251c0 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e  orSize = fsInfo.
251d0 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70  f_bsize;.      p
251e0 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
251f0 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20  acteristics =.  
25200 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
25210 41 50 5f 41 54 4f 4d 49 43 34 4b 20 7c 20 20 20  AP_ATOMIC4K |   
25220 20 20 20 20 2f 2a 20 41 6c 6c 20 72 61 6d 20 66      /* All ram f
25230 69 6c 65 73 79 73 74 65 6d 20 77 72 69 74 65 73  ilesystem writes
25240 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20   are atomic */. 
25250 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
25260 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20  CAP_SAFE_APPEND 
25270 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20  |    /* growing 
25280 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
25290 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20  t occur until.  
252a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252c0 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65      ** the write
252d0 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20   succeeds */.   
252e0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
252f0 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20  P_SEQUENTIAL |  
25300 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69     /* The ram fi
25310 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20  lesystem has no 
25320 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20  write behind.   
25330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25350 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f     ** so it is o
25360 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  rdered */.      
25370 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69    0;.    }else i
25380 66 28 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f  f( strstr(fsInfo
25390 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 65 74  .f_basetype, "et
253a0 66 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46  fs") ){.      pF
253b0 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
253c0 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65  = fsInfo.f_bsize
253d0 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  ;.      pFile->d
253e0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
253f0 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f  tics =.        /
25400 2a 20 65 74 66 73 20 63 6c 75 73 74 65 72 20 73  * etfs cluster s
25410 69 7a 65 20 77 72 69 74 65 73 20 61 72 65 20 61  ize writes are a
25420 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20  tomic */.       
25430 20 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53   (pFile->sectorS
25440 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49  ize / 512 * SQLI
25450 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
25460 31 32 29 20 7c 0a 20 20 20 20 20 20 20 20 53 51  12) |.        SQ
25470 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
25480 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67  APPEND |    /* g
25490 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20  rowing the file 
254a0 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
254b0 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20  ntil.           
254c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254d0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
254e0 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73  e write succeeds
254f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
25500 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
25510 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65  IAL |     /* The
25520 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
25530 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68  has no write beh
25540 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ind.            
25550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25560 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
25570 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f  it is ordered */
25580 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
25590 7d 65 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d  }else if( !strcm
255a0 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74  p(fsInfo.f_baset
255b0 79 70 65 2c 20 22 71 6e 78 36 22 29 20 29 7b 0a  ype, "qnx6") ){.
255c0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
255d0 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
255e0 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
255f0 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
25600 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
25610 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
25620 43 41 50 5f 41 54 4f 4d 49 43 20 7c 20 20 20 20  CAP_ATOMIC |    
25630 20 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65       /* All file
25640 73 79 73 74 65 6d 20 77 72 69 74 65 73 20 61 72  system writes ar
25650 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20  e atomic */.    
25660 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
25670 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20  _SAFE_APPEND |  
25680 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65    /* growing the
25690 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f   file does not o
256a0 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20  ccur until.     
256b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256d0 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75   ** the write su
256e0 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20  cceeds */.      
256f0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
25700 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20  EQUENTIAL |     
25710 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73  /* The ram files
25720 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69  ystem has no wri
25730 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20  te behind.      
25740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25760 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65  ** so it is orde
25770 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30  red */.        0
25780 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
25790 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66  !strcmp(fsInfo.f
257a0 5f 62 61 73 65 74 79 70 65 2c 20 22 71 6e 78 34  _basetype, "qnx4
257b0 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ") ){.      pFil
257c0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  e->sectorSize = 
257d0 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a  fsInfo.f_bsize;.
257e0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76        pFile->dev
257f0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
25800 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20  cs =.        /* 
25810 66 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61  full bitset of a
25820 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20  tomics from max 
25830 73 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20  sector size and 
25840 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20  smaller */.     
25850 20 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74     ((pFile->sect
25860 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53  orSize / 512 * S
25870 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
25880 49 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32  IC512) << 1) - 2
25890 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54   |.        SQLIT
258a0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
258b0 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20  AL |     /* The 
258c0 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68  ram filesystem h
258d0 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69  as no write behi
258e0 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  nd.             
258f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25900 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69           ** so i
25910 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a  t is ordered */.
25920 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d          0;.    }
25930 65 6c 73 65 20 69 66 28 20 73 74 72 73 74 72 28  else if( strstr(
25940 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70  fsInfo.f_basetyp
25950 65 2c 20 22 64 6f 73 22 29 20 29 7b 0a 20 20 20  e, "dos") ){.   
25960 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72     pFile->sector
25970 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f  Size = fsInfo.f_
25980 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69  bsize;.      pFi
25990 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
259a0 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20  teristics =.    
259b0 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73      /* full bits
259c0 65 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66 72  et of atomics fr
259d0 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73 69  om max sector si
259e0 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a  ze and smaller *
259f0 2f 0a 20 20 20 20 20 20 20 20 28 28 70 46 69 6c  /.        ((pFil
25a00 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20  e->sectorSize / 
25a10 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43  512 * SQLITE_IOC
25a20 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c  AP_ATOMIC512) <<
25a30 20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20 20   1) - 2 |.      
25a40 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
25a50 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20  EQUENTIAL |     
25a60 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73  /* The ram files
25a70 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69  ystem has no wri
25a80 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20  te behind.      
25a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ab0 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65  ** so it is orde
25ac0 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30  red */.        0
25ad0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25ae0 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
25af0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
25b00 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  =.        SQLITE
25b10 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
25b20 20 7c 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63 6b   |      /* block
25b30 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a  s are atomic */.
25b40 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
25b50 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
25b60 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67   |    /* growing
25b70 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
25b80 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20  ot occur until. 
25b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25bb0 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74       ** the writ
25bc0 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20  e succeeds */.  
25bd0 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 0a 20        0;.    }. 
25be0 20 7d 0a 20 20 2f 2a 20 4c 61 73 74 20 63 68 61   }.  /* Last cha
25bf0 6e 63 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  nce verification
25c00 2e 20 20 49 66 20 74 68 65 20 73 65 63 74 6f 72  .  If the sector
25c10 20 73 69 7a 65 20 69 73 6e 27 74 20 61 20 6d 75   size isn't a mu
25c20 6c 74 69 70 6c 65 20 6f 66 20 35 31 32 0a 20 20  ltiple of 512.  
25c30 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 6e 27 74  ** then it isn't
25c40 20 76 61 6c 69 64 2e 2a 2f 0a 20 20 69 66 28 20   valid.*/.  if( 
25c50 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
25c60 65 20 25 20 35 31 32 20 21 3d 20 30 20 29 7b 0a  e % 512 != 0 ){.
25c70 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
25c80 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
25c90 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d   = 0;.    pFile-
25ca0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51  >sectorSize = SQ
25cb0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43  LITE_DEFAULT_SEC
25cc0 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20  TOR_SIZE;.  }.  
25cd0 72 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 73 65  return pFile->se
25ce0 63 74 6f 72 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64  ctorSize;.}.#end
25cf0 69 66 20 2f 2a 20 5f 5f 51 4e 58 4e 54 4f 5f 5f  if /* __QNXNTO__
25d00 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
25d10 6e 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61  n the device cha
25d20 72 61 63 74 65 72 69 73 74 69 63 73 20 66 6f 72  racteristics for
25d30 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
25d40 20 54 68 69 73 20 56 46 53 20 69 73 20 73 65 74   This VFS is set
25d50 20 75 70 20 74 6f 20 72 65 74 75 72 6e 20 53 51   up to return SQ
25d60 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
25d70 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 62  SAFE_OVERWRITE b
25d80 79 20 64 65 66 61 75 6c 74 2e 0a 2a 2a 20 48 6f  y default..** Ho
25d90 77 65 76 65 72 2c 20 74 68 61 74 20 63 68 6f 69  wever, that choi
25da0 63 65 20 69 73 20 63 6f 6e 74 72 6f 76 65 72 73  ce is controvers
25db0 69 61 6c 20 73 69 6e 63 65 20 74 65 63 68 6e 69  ial since techni
25dc0 63 61 6c 6c 79 20 74 68 65 20 75 6e 64 65 72 6c  cally the underl
25dd0 79 69 6e 67 0a 2a 2a 20 66 69 6c 65 20 73 79 73  ying.** file sys
25de0 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 61 6c 77  tem does not alw
25df0 61 79 73 20 70 72 6f 76 69 64 65 20 70 6f 77 65  ays provide powe
25e00 72 73 61 66 65 20 6f 76 65 72 77 72 69 74 65 73  rsafe overwrites
25e10 2e 20 20 28 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  .  (In other.** 
25e20 77 6f 72 64 73 2c 20 61 66 74 65 72 20 61 20 70  words, after a p
25e30 6f 77 65 72 2d 6c 6f 73 73 20 65 76 65 6e 74 2c  ower-loss event,
25e40 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 66 69   parts of the fi
25e50 6c 65 20 74 68 61 74 20 77 65 72 65 20 6e 65 76  le that were nev
25e60 65 72 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6d 69  er.** written mi
25e70 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67  ght end up being
25e80 20 61 6c 74 65 72 65 64 2e 29 20 20 48 6f 77 65   altered.)  Howe
25e90 76 65 72 2c 20 6e 6f 6e 2d 50 53 4f 57 20 62 65  ver, non-PSOW be
25ea0 68 61 76 69 6f 72 20 69 73 20 76 65 72 79 2c 0a  havior is very,.
25eb0 2a 2a 20 76 65 72 79 20 72 61 72 65 2e 20 20 41  ** very rare.  A
25ec0 6e 64 20 61 73 73 65 72 74 69 6e 67 20 50 53 4f  nd asserting PSO
25ed0 57 20 6d 61 6b 65 73 20 61 20 6c 61 72 67 65 20  W makes a large 
25ee0 72 65 64 75 63 74 69 6f 6e 20 69 6e 20 74 68 65  reduction in the
25ef0 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 72 65   amount.** of re
25f00 71 75 69 72 65 64 20 49 2f 4f 20 66 6f 72 20 6a  quired I/O for j
25f10 6f 75 72 6e 61 6c 69 6e 67 2c 20 73 69 6e 63 65  ournaling, since
25f20 20 61 20 6c 6f 74 20 6f 66 20 70 61 64 64 69 6e   a lot of paddin
25f30 67 20 69 73 20 65 6c 69 6d 69 6e 61 74 65 64 2e  g is eliminated.
25f40 0a 2a 2a 20 20 48 65 6e 63 65 2c 20 77 68 69 6c  .**  Hence, whil
25f50 65 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  e POWERSAFE_OVER
25f60 57 52 49 54 45 20 69 73 20 6f 6e 20 62 79 20 64  WRITE is on by d
25f70 65 66 61 75 6c 74 2c 20 74 68 65 72 65 20 69 73  efault, there is
25f80 20 61 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 0a   a file-control.
25f90 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ** available to 
25fa0 74 75 72 6e 20 69 74 20 6f 66 66 20 61 6e 64 20  turn it off and 
25fb0 55 52 49 20 71 75 65 72 79 20 70 61 72 61 6d 65  URI query parame
25fc0 74 65 72 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  ter available to
25fd0 20 74 75 72 6e 20 69 74 20 6f 66 66 2e 0a 2a 2f   turn it off..*/
25fe0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
25ff0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
26000 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69  stics(sqlite3_fi
26010 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46  le *id){.  unixF
26020 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69  ile *p = (unixFi
26030 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
26040 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 5f 5f 51   = 0;.#ifdef __Q
26050 4e 58 4e 54 4f 5f 5f 0a 20 20 69 66 28 20 70 2d  NXNTO__.  if( p-
26060 3e 73 65 63 74 6f 72 53 69 7a 65 3d 3d 30 20 29  >sectorSize==0 )
26070 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28   unixSectorSize(
26080 69 64 29 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 64  id);.  rc = p->d
26090 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
260a0 74 69 63 73 3b 0a 23 65 6e 64 69 66 0a 20 20 69  tics;.#endif.  i
260b0 66 28 20 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20  f( p->ctrlFlags 
260c0 26 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20  & UNIXFILE_PSOW 
260d0 29 7b 0a 20 20 20 20 72 63 20 7c 3d 20 53 51 4c  ){.    rc |= SQL
260e0 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
260f0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3b 0a 20  AFE_OVERWRITE;. 
26100 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
26110 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
26120 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
26130 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
26140 4d 41 50 5f 53 49 5a 45 3e 30 0a 0a 2f 2a 0a 2a  MAP_SIZE>0../*.*
26150 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 79 73  * Return the sys
26160 74 65 6d 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  tem page size..*
26170 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
26180 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  on should not be
26190 20 63 61 6c 6c 65 64 20 64 69 72 65 63 74 6c 79   called directly
261a0 20 62 79 20 6f 74 68 65 72 20 63 6f 64 65 20 69   by other code i
261b0 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 0a 2a 2a  n this file. .**
261c0 20 49 6e 73 74 65 61 64 2c 20 69 74 20 73 68 6f   Instead, it sho
261d0 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 76 69  uld be called vi
261e0 61 20 6d 61 63 72 6f 20 6f 73 47 65 74 70 61 67  a macro osGetpag
261f0 65 73 69 7a 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  esize()..*/.stat
26200 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 70 61  ic int unixGetpa
26210 67 65 73 69 7a 65 28 76 6f 69 64 29 7b 0a 23 69  gesize(void){.#i
26220 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 72  f OS_VXWORKS.  r
26230 65 74 75 72 6e 20 31 30 32 34 3b 0a 23 65 6c 69  eturn 1024;.#eli
26240 66 20 64 65 66 69 6e 65 64 28 5f 42 53 44 5f 53  f defined(_BSD_S
26250 4f 55 52 43 45 29 0a 20 20 72 65 74 75 72 6e 20  OURCE).  return 
26260 67 65 74 70 61 67 65 73 69 7a 65 28 29 3b 0a 23  getpagesize();.#
26270 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 28 69  else.  return (i
26280 6e 74 29 73 79 73 63 6f 6e 66 28 5f 53 43 5f 50  nt)sysconf(_SC_P
26290 41 47 45 53 49 5a 45 29 3b 0a 23 65 6e 64 69 66  AGESIZE);.#endif
262a0 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  .}..#endif /* !d
262b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
262c0 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
262d0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
262e0 30 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  0 */..#ifndef SQ
262f0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f  LITE_OMIT_WAL../
26300 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64  *.** Object used
26310 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 6e   to represent an
26320 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62   shared memory b
26330 75 66 66 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57  uffer.  .**.** W
26340 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72  hen multiple thr
26350 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e  eads all referen
26360 63 65 20 74 68 65 20 73 61 6d 65 20 77 61 6c 2d  ce the same wal-
26370 69 6e 64 65 78 2c 20 65 61 63 68 20 74 68 72 65  index, each thre
26380 61 64 0a 2a 2a 20 68 61 73 20 69 74 73 20 6f 77  ad.** has its ow
26390 6e 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  n unixShm object
263a0 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c 20 70  , but they all p
263b0 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65  oint to a single
263c0 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20   instance.** of 
263d0 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65  this unixShmNode
263e0 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68   object.  In oth
263f0 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68 20 77  er words, each w
26400 61 6c 2d 69 6e 64 65 78 20 69 73 20 6f 70 65 6e  al-index is open
26410 65 64 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20  ed.** only once 
26420 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  per process..**.
26430 2a 2a 20 45 61 63 68 20 75 6e 69 78 53 68 6d 4e  ** Each unixShmN
26440 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63 6f  ode object is co
26450 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 69 6e  nnected to a sin
26460 67 6c 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  gle unixInodeInf
26470 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20  o object..** We 
26480 63 6f 75 6c 64 20 63 6f 61 6c 65 73 63 65 20 74  could coalesce t
26490 68 69 73 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20  his object into 
264a0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62  unixInodeInfo, b
264b0 75 74 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 65  ut that would me
264c0 61 6e 0a 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e  an.** every open
264d0 20 66 69 6c 65 20 74 68 61 74 20 64 6f 65 73 20   file that does 
264e0 6e 6f 74 20 75 73 65 20 73 68 61 72 65 64 20 6d  not use shared m
264f0 65 6d 6f 72 79 20 28 69 6e 20 6f 74 68 65 72 20  emory (in other 
26500 77 6f 72 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f  words, most.** o
26510 70 65 6e 20 66 69 6c 65 73 29 20 77 6f 75 6c 64  pen files) would
26520 20 68 61 76 65 20 74 6f 20 63 61 72 72 79 20 61   have to carry a
26530 72 6f 75 6e 64 20 74 68 69 73 20 65 78 74 72 61  round this extra
26540 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53   information.  S
26550 6f 0a 2a 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f  o.** the unixIno
26560 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f  deInfo object co
26570 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
26580 20 74 6f 20 74 68 69 73 20 75 6e 69 78 53 68 6d   to this unixShm
26590 4e 6f 64 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61  Node object.** a
265a0 6e 64 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f  nd the unixShmNo
265b0 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  de object is cre
265c0 61 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e  ated only when n
265d0 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69  eeded..**.** uni
265e0 78 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73  xMutexHeld() mus
265f0 74 20 62 65 20 74 72 75 65 20 77 68 65 6e 20 63  t be true when c
26600 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72  reating or destr
26610 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62  oying.** this ob
26620 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65  ject or while re
26630 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
26640 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
26650 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ields:.**.**    
26660 20 20 6e 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65    nRef.**.** The
26670 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
26680 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20  s are read-only 
26690 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74  after the object
266a0 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20   is created:.** 
266b0 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20  .**      fid.** 
266c0 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a       zFilename.*
266d0 2a 0a 2a 2a 20 45 69 74 68 65 72 20 75 6e 69 78  *.** Either unix
266e0 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75  ShmNode.mutex mu
266f0 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20 75 6e  st be held or un
26700 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d  ixShmNode.nRef==
26710 30 20 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74  0 and.** unixMut
26720 65 78 48 65 6c 64 28 29 20 69 73 20 74 72 75 65  exHeld() is true
26730 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72   when reading or
26740 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68   writing any oth
26750 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74  er field.** in t
26760 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  his structure..*
26770 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d  /.struct unixShm
26780 4e 6f 64 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f  Node {.  unixIno
26790 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
267a0 20 20 20 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65      /* unixInode
267b0 49 6e 66 6f 20 74 68 61 74 20 6f 77 6e 73 20 74  Info that owns t
267c0 68 69 73 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a  his SHM node */.
267d0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
267e0 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20  *mutex;      /* 
267f0 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20  Mutex to access 
26800 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  this object */. 
26810 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
26820 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
26830 61 6d 65 20 6f 66 20 74 68 65 20 6d 6d 61 70 70  ame of the mmapp
26840 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ed file */.  int
26850 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   h;             
26860 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
26870 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
26880 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f  */.  int szRegio
26890 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
268a0 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65  /* Size of share
268b0 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
268c0 20 2a 2f 0a 20 20 75 31 36 20 6e 52 65 67 69 6f   */.  u16 nRegio
268d0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
268e0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61   /* Size of arra
268f0 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20  y apRegion */.  
26900 75 38 20 69 73 52 65 61 64 6f 6e 6c 79 3b 20 20  u8 isReadonly;  
26910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
26920 75 65 20 69 66 20 72 65 61 64 2d 6f 6e 6c 79 20  ue if read-only 
26930 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 70 52 65  */.  char **apRe
26940 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
26950 2f 2a 20 41 72 72 61 79 20 6f 66 20 6d 61 70 70  /* Array of mapp
26960 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
26970 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   regions */.  in
26980 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
26990 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
269a0 65 72 20 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62  er of unixShm ob
269b0 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
269c0 6f 20 74 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78  o this */.  unix
269d0 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20  Shm *pFirst;    
269e0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e         /* All un
269f0 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  ixShm objects po
26a00 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
26a10 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
26a20 44 45 42 55 47 0a 20 20 75 38 20 65 78 63 6c 4d  DEBUG.  u8 exclM
26a30 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
26a40 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78     /* Mask of ex
26a50 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65  clusive locks he
26a60 6c 64 20 2a 2f 0a 20 20 75 38 20 73 68 61 72 65  ld */.  u8 share
26a70 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  dMask;          
26a80 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68     /* Mask of sh
26a90 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20  ared locks held 
26aa0 2a 2f 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49  */.  u8 nextShmI
26ab0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
26ac0 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c  /* Next availabl
26ad0 65 20 75 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c  e unixShm.id val
26ae0 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  ue */.#endif.};.
26af0 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65  ./*.** Structure
26b00 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
26b10 20 62 79 20 74 68 69 73 20 56 46 53 20 74 6f 20   by this VFS to 
26b20 72 65 63 6f 72 64 20 74 68 65 20 73 74 61 74 65  record the state
26b30 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73   of an.** open s
26b40 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e  hared memory con
26b50 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  nection..**.** T
26b60 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
26b70 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69  lds are initiali
26b80 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62  zed when this ob
26b90 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20  ject is created 
26ba0 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d  and.** are read-
26bb0 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a  only thereafter:
26bc0 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68  .**.**    unixSh
26bd0 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20 20 20 75 6e  m.pFile.**    un
26be0 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41  ixShm.id.**.** A
26bf0 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  ll other fields 
26c00 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20  are read/write. 
26c10 20 54 68 65 20 75 6e 69 78 53 68 6d 2e 70 46 69   The unixShm.pFi
26c20 6c 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62  le->mutex must b
26c30 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20  e held.** while 
26c40 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65  accessing any re
26c50 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e  ad/write fields.
26c60 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53  .*/.struct unixS
26c70 68 6d 20 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  hm {.  unixShmNo
26c80 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
26c90 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
26ca0 69 6e 67 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  ing unixShmNode 
26cb0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78  object */.  unix
26cc0 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  Shm *pNext;     
26cd0 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75         /* Next u
26ce0 6e 69 78 53 68 6d 20 77 69 74 68 20 74 68 65 20  nixShm with the 
26cf0 73 61 6d 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65  same unixShmNode
26d00 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65   */.  u8 hasMute
26d10 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
26d20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64   /* True if hold
26d30 69 6e 67 20 74 68 65 20 75 6e 69 78 53 68 6d 4e  ing the unixShmN
26d40 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75  ode mutex */.  u
26d50 38 20 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  8 id;           
26d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20            /* Id 
26d70 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  of this connecti
26d80 6f 6e 20 77 69 74 68 69 6e 20 69 74 73 20 75 6e  on within its un
26d90 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75  ixShmNode */.  u
26da0 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20  16 sharedMask;  
26db0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
26dc0 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b  k of shared lock
26dd0 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20  s held */.  u16 
26de0 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20  exclMask;       
26df0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
26e00 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  f exclusive lock
26e10 73 20 68 65 6c 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  s held */.};../*
26e20 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73  .** Constants us
26e30 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a  ed for locking.*
26e40 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53  /.#define UNIX_S
26e50 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53  HM_BASE   ((22+S
26e60 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29  QLITE_SHM_NLOCK)
26e70 2a 34 29 20 20 20 20 20 20 20 20 20 2f 2a 20 66  *4)         /* f
26e80 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a  irst lock byte *
26e90 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53  /.#define UNIX_S
26ea0 48 4d 5f 44 4d 53 20 20 20 20 28 55 4e 49 58 5f  HM_DMS    (UNIX_
26eb0 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f  SHM_BASE+SQLITE_
26ec0 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64  SHM_NLOCK)  /* d
26ed0 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f  eadman switch */
26ee0 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 70 6f  ../*.** Apply po
26ef0 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  six advisory loc
26f00 6b 73 20 66 6f 72 20 61 6c 6c 20 62 79 74 65 73  ks for all bytes
26f10 20 66 72 6f 6d 20 6f 66 73 74 20 74 68 72 6f 75   from ofst throu
26f20 67 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a  gh ofst+n-1..**.
26f30 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20 69  ** Locks block i
26f40 66 20 74 68 65 20 6d 61 73 6b 20 69 73 20 65 78  f the mask is ex
26f50 61 63 74 6c 79 20 55 4e 49 58 5f 53 48 4d 5f 43  actly UNIX_SHM_C
26f60 20 61 6e 64 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f   and are non-blo
26f70 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65 72 77 69  cking.** otherwi
26f80 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
26f90 74 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  t unixShmSystemL
26fa0 6f 63 6b 28 0a 20 20 75 6e 69 78 46 69 6c 65 20  ock(.  unixFile 
26fb0 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a  *pFile,       /*
26fc0 20 4f 70 65 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e   Open connection
26fd0 20 74 6f 20 74 68 65 20 57 41 4c 20 66 69 6c 65   to the WAL file
26fe0 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79   */.  int lockTy
26ff0 70 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pe,          /* 
27000 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b  F_UNLCK, F_RDLCK
27010 2c 20 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a  , or F_WRLCK */.
27020 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20    int ofst,     
27030 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
27040 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6c 6f  t byte of the lo
27050 63 6b 69 6e 67 20 72 61 6e 67 65 20 2a 2f 0a 20  cking range */. 
27060 20 69 6e 74 20 6e 20 20 20 20 20 20 20 20 20 20   int n          
27070 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
27080 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
27090 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53  ck */.){.  unixS
270a0 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
270b0 3b 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73  ; /* Apply locks
270c0 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68   to this open sh
270d0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d  ared-memory segm
270e0 65 6e 74 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ent */.  struct 
270f0 66 6c 6f 63 6b 20 66 3b 20 20 20 20 20 20 20 20  flock f;        
27100 2f 2a 20 54 68 65 20 70 6f 73 69 78 20 61 64 76  /* The posix adv
27110 69 73 6f 72 79 20 6c 6f 63 6b 69 6e 67 20 73 74  isory locking st
27120 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74  ructure */.  int
27130 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
27140 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
27150 64 65 20 66 6f 72 6d 20 66 63 6e 74 6c 28 29 20  de form fcntl() 
27160 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20  */..  /* Access 
27170 74 6f 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f  to the unixShmNo
27180 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72  de object is ser
27190 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63  ialized by the c
271a0 61 6c 6c 65 72 20 2a 2f 0a 20 20 70 53 68 6d 4e  aller */.  pShmN
271b0 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
271c0 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode->pShmNode;. 
271d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
271e0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 53 68 6d  _mutex_held(pShm
271f0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20  Node->mutex) || 
27200 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  pShmNode->nRef==
27210 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 68 61 72 65  0 );..  /* Share
27220 64 20 6c 6f 63 6b 73 20 6e 65 76 65 72 20 73 70  d locks never sp
27230 61 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  an more than one
27240 20 62 79 74 65 20 2a 2f 0a 20 20 61 73 73 65 72   byte */.  asser
27250 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54  t( n==1 || lockT
27260 79 70 65 21 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a  ype!=F_RDLCK );.
27270 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20 61 72 65 20  .  /* Locks are 
27280 77 69 74 68 69 6e 20 72 61 6e 67 65 20 2a 2f 0a  within range */.
27290 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 26    assert( n>=1 &
272a0 26 20 6e 3c 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  & n<SQLITE_SHM_N
272b0 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70  LOCK );..  if( p
272c0 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b  ShmNode->h>=0 ){
272d0 0a 20 20 20 20 69 6e 74 20 6c 6b 54 79 70 65 3b  .    int lkType;
272e0 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
272f0 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70  ze the locking p
27300 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20  arameters */.   
27310 20 6d 65 6d 73 65 74 28 26 66 2c 20 30 2c 20 73   memset(&f, 0, s
27320 69 7a 65 6f 66 28 66 29 29 3b 0a 20 20 20 20 66  izeof(f));.    f
27330 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f 63 6b 54 79  .l_type = lockTy
27340 70 65 3b 0a 20 20 20 20 66 2e 6c 5f 77 68 65 6e  pe;.    f.l_when
27350 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
27360 20 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20 6f     f.l_start = o
27370 66 73 74 3b 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e  fst;.    f.l_len
27380 20 3d 20 6e 3b 0a 0a 20 20 20 20 6c 6b 54 79 70   = n;..    lkTyp
27390 65 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c  e = (pFile->ctrl
273a0 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
273b0 5f 42 4c 4f 43 4b 29 21 3d 30 20 3f 20 46 5f 53  _BLOCK)!=0 ? F_S
273c0 45 54 4c 4b 57 20 3a 20 46 5f 53 45 54 4c 4b 3b  ETLKW : F_SETLK;
273d0 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74  .    rc = osFcnt
273e0 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 6c  l(pShmNode->h, l
273f0 6b 54 79 70 65 2c 20 26 66 29 3b 0a 20 20 20 20  kType, &f);.    
27400 72 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29 20  rc = (rc!=(-1)) 
27410 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51  ? SQLITE_OK : SQ
27420 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 70  LITE_BUSY;.    p
27430 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
27440 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 42 4c 4f  &= ~UNIXFILE_BLO
27450 43 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70  CK;.  }..  /* Up
27460 64 61 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 20  date the global 
27470 6c 6f 63 6b 20 73 74 61 74 65 20 61 6e 64 20 64  lock state and d
27480 6f 20 64 65 62 75 67 20 74 72 61 63 69 6e 67 20  o debug tracing 
27490 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
274a0 5f 44 45 42 55 47 0a 20 20 7b 20 75 31 36 20 6d  _DEBUG.  { u16 m
274b0 61 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ask;.  OSTRACE((
274c0 22 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20  "SHM-LOCK "));. 
274d0 20 6d 61 73 6b 20 3d 20 6f 66 73 74 3e 33 31 20   mask = ofst>31 
274e0 3f 20 30 78 66 66 66 66 20 3a 20 28 31 3c 3c 28  ? 0xffff : (1<<(
274f0 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f  ofst+n)) - (1<<o
27500 66 73 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  fst);.  if( rc==
27510 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27520 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
27530 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
27540 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b  OSTRACE(("unlock
27550 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b   %d ok", ofst));
27560 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
27570 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61  >exclMask &= ~ma
27580 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  sk;.      pShmNo
27590 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  de->sharedMask &
275a0 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c  = ~mask;.    }el
275b0 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d  se if( lockType=
275c0 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_RDLCK ){.    
275d0 20 20 4f 53 54 52 41 43 45 28 28 22 72 65 61 64    OSTRACE(("read
275e0 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66  -lock %d ok", of
275f0 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d  st));.      pShm
27600 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26  Node->exclMask &
27610 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  = ~mask;.      p
27620 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d  ShmNode->sharedM
27630 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
27640 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
27650 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  sert( lockType==
27660 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20  F_WRLCK );.     
27670 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74 65   OSTRACE(("write
27680 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66  -lock %d ok", of
27690 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d  st));.      pShm
276a0 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c  Node->exclMask |
276b0 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53  = mask;.      pS
276c0 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
276d0 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
276e0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
276f0 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
27700 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  UNLCK ){.      O
27710 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20  STRACE(("unlock 
27720 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74  %d failed", ofst
27730 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ));.    }else if
27740 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44  ( lockType==F_RD
27750 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  LCK ){.      OST
27760 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b  RACE(("read-lock
27770 20 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20   failed"));.    
27780 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
27790 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46  ert( lockType==F
277a0 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20  _WRLCK );.      
277b0 4f 53 54 52 41 43 45 28 28 22 77 72 69 74 65 2d  OSTRACE(("write-
277c0 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c  lock %d failed",
277d0 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20   ofst));.    }. 
277e0 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 20   }.  OSTRACE((" 
277f0 2d 20 61 66 74 65 72 77 61 72 64 73 20 25 30 33  - afterwards %03
27800 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20  x,%03x\n",.     
27810 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
27820 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 53 68 6d  sharedMask, pShm
27830 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 29 29  Node->exclMask))
27840 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
27850 72 65 74 75 72 6e 20 72 63 3b 20 20 20 20 20 20  return rc;      
27860 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75    .}../*.** Retu
27870 72 6e 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6e  rn the minimum n
27880 75 6d 62 65 72 20 6f 66 20 33 32 4b 42 20 73 68  umber of 32KB sh
27890 6d 20 72 65 67 69 6f 6e 73 20 74 68 61 74 20 73  m regions that s
278a0 68 6f 75 6c 64 20 62 65 20 6d 61 70 70 65 64 20  hould be mapped 
278b0 61 74 0a 2a 2a 20 61 20 74 69 6d 65 2c 20 61 73  at.** a time, as
278c0 73 75 6d 69 6e 67 20 74 68 61 74 20 65 61 63 68  suming that each
278d0 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65   mapping must be
278e0 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74   an integer mult
278f0 69 70 6c 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  iple of the.** c
27900 75 72 72 65 6e 74 20 73 79 73 74 65 6d 20 70 61  urrent system pa
27910 67 65 2d 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 55  ge-size..**.** U
27920 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20  sually, this is 
27930 31 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  1. The exception
27940 20 73 65 65 6d 73 20 74 6f 20 62 65 20 73 79 73   seems to be sys
27950 74 65 6d 73 20 74 68 61 74 20 61 72 65 20 63 6f  tems that are co
27960 6e 66 69 67 75 72 65 64 0a 2a 2a 20 74 6f 20 75  nfigured.** to u
27970 73 65 20 36 34 4b 42 20 70 61 67 65 73 20 2d 20  se 64KB pages - 
27980 69 6e 20 74 68 69 73 20 63 61 73 65 20 65 61 63  in this case eac
27990 68 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 63  h mapping must c
279a0 6f 76 65 72 20 61 74 20 6c 65 61 73 74 20 74 77  over at least tw
279b0 6f 0a 2a 2a 20 73 68 6d 20 72 65 67 69 6f 6e 73  o.** shm regions
279c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
279d0 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72  unixShmRegionPer
279e0 4d 61 70 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74  Map(void){.  int
279f0 20 73 68 6d 73 7a 20 3d 20 33 32 2a 31 30 32 34   shmsz = 32*1024
27a00 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
27a10 53 48 4d 20 72 65 67 69 6f 6e 20 73 69 7a 65 20  SHM region size 
27a20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20  */.  int pgsz = 
27a30 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 3b  osGetpagesize();
27a40 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 70 61 67     /* System pag
27a50 65 20 73 69 7a 65 20 2a 2f 0a 20 20 61 73 73 65  e size */.  asse
27a60 72 74 28 20 28 28 70 67 73 7a 2d 31 29 26 70 67  rt( ((pgsz-1)&pg
27a70 73 7a 29 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 50  sz)==0 );   /* P
27a80 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  age size must be
27a90 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 2a 2f   a power of 2 */
27aa0 0a 20 20 69 66 28 20 70 67 73 7a 3c 73 68 6d 73  .  if( pgsz<shms
27ab0 7a 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  z ) return 1;.  
27ac0 72 65 74 75 72 6e 20 70 67 73 7a 2f 73 68 6d 73  return pgsz/shms
27ad0 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67  z;.}../*.** Purg
27ae0 65 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  e the unixShmNod
27af0 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c  eList list of al
27b00 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68 20 75  l entries with u
27b10 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d  nixShmNode.nRef=
27b20 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  =0..**.** This i
27b30 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72  s not a VFS shar
27b40 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64  ed-memory method
27b50 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c 69 74  ; it is a utilit
27b60 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  y function calle
27b70 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72  d.** by VFS shar
27b80 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64  ed-memory method
27b90 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
27ba0 64 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 75  d unixShmPurge(u
27bb0 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20  nixFile *pFd){. 
27bc0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 20   unixShmNode *p 
27bd0 3d 20 70 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70  = pFd->pInode->p
27be0 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72  ShmNode;.  asser
27bf0 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
27c00 28 29 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26  () );.  if( p &&
27c10 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20   p->nRef==0 ){. 
27c20 20 20 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d 61     int nShmPerMa
27c30 70 20 3d 20 75 6e 69 78 53 68 6d 52 65 67 69 6f  p = unixShmRegio
27c40 6e 50 65 72 4d 61 70 28 29 3b 0a 20 20 20 20 69  nPerMap();.    i
27c50 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74  nt i;.    assert
27c60 28 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64  ( p->pInode==pFd
27c70 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20  ->pInode );.    
27c80 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
27c90 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  ee(p->mutex);.  
27ca0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
27cb0 6e 52 65 67 69 6f 6e 3b 20 69 2b 3d 6e 53 68 6d  nRegion; i+=nShm
27cc0 50 65 72 4d 61 70 29 7b 0a 20 20 20 20 20 20 69  PerMap){.      i
27cd0 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  f( p->h>=0 ){.  
27ce0 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70        osMunmap(p
27cf0 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70  ->apRegion[i], p
27d00 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20  ->szRegion);.   
27d10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27d20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
27d30 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a  ->apRegion[i]);.
27d40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
27d50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
27d60 2d 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20  ->apRegion);.   
27d70 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a   if( p->h>=0 ){.
27d80 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
27d90 73 65 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f  se(pFd, p->h, __
27da0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 70  LINE__);.      p
27db0 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  ->h = -1;.    }.
27dc0 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70      p->pInode->p
27dd0 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ShmNode = 0;.   
27de0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
27df0 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66  ;.  }.}..#if def
27e00 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
27e10 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
27e20 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73  _LOCKING_STYLE.s
27e30 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
27e40 20 2a 70 72 6f 78 79 53 68 61 72 65 64 4d 65 6d   *proxySharedMem
27e50 6f 72 79 42 61 73 65 50 61 74 68 28 75 6e 69 78  oryBasePath(unix
27e60 46 69 6c 65 20 2a 29 3b 0a 23 65 6e 64 69 66 0a  File *);.#endif.
27e70 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68  ./*.** Open a sh
27e80 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61  ared-memory area
27e90 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
27ea0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
27eb0 69 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20  ile pDbFd.  .** 
27ec0 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20  This particular 
27ed0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75  implementation u
27ee0 73 65 73 20 6d 6d 61 70 70 65 64 20 66 69 6c 65  ses mmapped file
27ef0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c  s..**.** The fil
27f00 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
27f10 65 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ent shared-memor
27f20 79 20 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65  y is in the same
27f30 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73   directory.** as
27f40 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
27f50 73 65 20 66 69 6c 65 20 61 6e 64 20 68 61 73 20  se file and has 
27f60 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
27f70 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
27f80 73 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74 68 20  se.** file with 
27f90 74 68 65 20 22 2d 73 68 6d 22 20 73 75 66 66 69  the "-shm" suffi
27fa0 78 20 61 64 64 65 64 2e 20 20 46 6f 72 20 65 78  x added.  For ex
27fb0 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 64 61  ample, if the da
27fc0 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69  tabase file.** i
27fd0 73 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63  s "/home/user1/c
27fe0 6f 6e 66 69 67 2e 64 62 22 20 74 68 65 6e 20 74  onfig.db" then t
27ff0 68 65 20 66 69 6c 65 20 74 68 61 74 20 69 73 20  he file that is 
28000 63 72 65 61 74 65 64 20 61 6e 64 20 6d 6d 61 70  created and mmap
28010 70 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65  ped.** for share
28020 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65  d memory will be
28030 20 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75   called "/home/u
28040 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73  ser1/config.db-s
28050 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f  hm".  .**.** Ano
28060 74 68 65 72 20 61 70 70 72 6f 61 63 68 20 74 6f  ther approach to
28070 20 69 73 20 74 6f 20 75 73 65 20 66 69 6c 65 73   is to use files
28080 20 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20   in /dev/shm or 
28090 2f 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a  /dev/tmp or an.*
280a0 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70  * some other tmp
280b0 66 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66  fs mount. But if
280c0 20 61 20 66 69 6c 65 20 69 6e 20 61 20 64 69 66   a file in a dif
280d0 66 65 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79  ferent directory
280e0 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 61 74  .** from the dat
280f0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 73  abase file is us
28100 65 64 2c 20 74 68 65 6e 20 64 69 66 66 65 72 69  ed, then differi
28110 6e 67 20 61 63 63 65 73 73 20 70 65 72 6d 69 73  ng access permis
28120 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68  sions.** or a ch
28130 72 6f 6f 74 28 29 20 6d 69 67 68 74 20 63 61 75  root() might cau
28140 73 65 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74  se two different
28150 20 70 72 6f 63 65 73 73 65 73 20 6f 6e 20 74 68   processes on th
28160 65 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61  e same.** databa
28170 73 65 20 74 6f 20 65 6e 64 20 75 70 20 75 73 69  se to end up usi
28180 6e 67 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c  ng different fil
28190 65 73 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65  es for shared me
281a0 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69  mory - .** meani
281b0 6e 67 20 74 68 61 74 20 74 68 65 69 72 20 6d 65  ng that their me
281c0 6d 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72  mory would not r
281d0 65 61 6c 6c 79 20 62 65 20 73 68 61 72 65 64 20  eally be shared 
281e0 2d 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69  - resulting.** i
281f0 6e 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  n database corru
28200 70 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65  ption.  Neverthe
28210 6c 65 73 73 2c 20 74 68 69 73 20 74 6d 70 66 73  less, this tmpfs
28220 20 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63   file usage.** c
28230 61 6e 20 62 65 20 65 6e 61 62 6c 65 64 20 61 74  an be enabled at
28240 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73   compile-time us
28250 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d  ing -DSQLITE_SHM
28260 5f 44 49 52 45 43 54 4f 52 59 3d 22 2f 64 65 76  _DIRECTORY="/dev
28270 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20  /shm".** or the 
28280 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 54 68 65  equivalent.  The
28290 20 75 73 65 20 6f 66 20 74 68 65 20 53 51 4c 49   use of the SQLI
282a0 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
282b0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a   compile-time.**
282c0 20 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74 73 20   option results 
282d0 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
282e0 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 51 4c 69  le build of SQLi
282f0 74 65 3b 20 20 62 75 69 6c 64 73 20 6f 66 20 53  te;  builds of S
28300 51 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20 77 69  QLite.** that wi
28310 74 68 20 64 69 66 66 65 72 69 6e 67 20 53 51 4c  th differing SQL
28320 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
28330 59 20 73 65 74 74 69 6e 67 73 20 61 74 74 65 6d  Y settings attem
28340 70 74 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a  pt to use the.**
28350 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
28360 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20  ile at the same 
28370 74 69 6d 65 2c 20 64 61 74 61 62 61 73 65 20 63  time, database c
28380 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c  orruption will l
28390 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e  ikely.** result.
283a0 20 54 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f   The SQLITE_SHM_
283b0 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c  DIRECTORY compil
283c0 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
283d0 20 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22   considered.** "
283e0 75 6e 73 75 70 70 6f 72 74 65 64 22 20 61 6e 64  unsupported" and
283f0 20 6d 61 79 20 67 6f 20 61 77 61 79 20 69 6e 20   may go away in 
28400 61 20 66 75 74 75 72 65 20 53 51 4c 69 74 65 20  a future SQLite 
28410 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57  release..**.** W
28420 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65  hen opening a ne
28430 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  w shared-memory 
28440 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65  file, if no othe
28450 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
28460 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20  hat.** file are 
28470 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20  currently open, 
28480 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
28490 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63  or in other proc
284a0 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74  esses, then.** t
284b0 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  he file must be 
284c0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
284d0 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65  o length or have
284e0 20 69 74 73 20 68 65 61 64 65 72 20 63 6c 65 61   its header clea
284f0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  red..**.** If th
28500 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
28510 61 73 65 20 66 69 6c 65 20 28 70 44 62 46 64 29  ase file (pDbFd)
28520 20 69 73 20 75 73 69 6e 67 20 74 68 65 20 22 75   is using the "u
28530 6e 69 78 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a  nix-excl" VFS.**
28540 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
28550 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
28560 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
28570 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
28580 61 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f  and.** that no o
28590 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61  ther processes a
285a0 72 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20  re able to read 
285b0 6f 72 20 77 72 69 74 65 20 74 68 65 20 64 61 74  or write the dat
285c0 61 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68  abase.  In.** th
285d0 61 74 20 63 61 73 65 2c 20 77 65 20 64 6f 20 6e  at case, we do n
285e0 6f 74 20 72 65 61 6c 6c 79 20 6e 65 65 64 20 73  ot really need s
285f0 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e  hared memory.  N
28600 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a  o shared memory.
28610 2a 2a 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ** file is creat
28620 65 64 2e 20 20 54 68 65 20 73 68 61 72 65 64 20  ed.  The shared 
28630 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 73  memory will be s
28640 69 6d 75 6c 61 74 65 64 20 77 69 74 68 20 68 65  imulated with he
28650 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  ap memory..*/.st
28660 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65  atic int unixOpe
28670 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e  nSharedMemory(un
28680 69 78 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a  ixFile *pDbFd){.
28690 20 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d    struct unixShm
286a0 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20   *p = 0;        
286b0 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74    /* The connect
286c0 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  ion to be opened
286d0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69   */.  struct uni
286e0 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
286f0 64 65 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  de;   /* The und
28700 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20  erlying mmapped 
28710 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  file */.  int rc
28720 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
28740 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e  ult code */.  un
28750 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
28760 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ode;          /*
28770 20 54 68 65 20 69 6e 6f 64 65 20 6f 66 20 66 64   The inode of fd
28780 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d   */.  char *zShm
28790 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
287a0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
287b0 20 74 68 65 20 66 69 6c 65 20 75 73 65 64 20 66   the file used f
287c0 6f 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20  or SHM */.  int 
287d0 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20  nShmFilename;   
287e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
287f0 69 7a 65 20 6f 66 20 74 68 65 20 53 48 4d 20 66  ize of the SHM f
28800 69 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74 65 73  ilename in bytes
28810 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
28820 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
28830 20 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a   new unixShm obj
28840 65 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71  ect. */.  p = sq
28850 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
28860 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
28870 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
28880 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
28890 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
288a0 65 6f 66 28 2a 70 29 29 3b 0a 20 20 61 73 73 65  eof(*p));.  asse
288b0 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d  rt( pDbFd->pShm=
288c0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  =0 );..  /* Chec
288d0 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20 75 6e  k to see if a un
288e0 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
288f0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e   already exists.
28900 20 52 65 75 73 65 20 61 6e 20 65 78 69 73 74 69   Reuse an existi
28910 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70  ng.  ** one if p
28920 72 65 73 65 6e 74 2e 20 43 72 65 61 74 65 20 61  resent. Create a
28930 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65   new one if nece
28940 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e  ssary..  */.  un
28950 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
28960 20 20 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64    pInode = pDbFd
28970 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d  ->pInode;.  pShm
28980 4e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  Node = pInode->p
28990 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70  ShmNode;.  if( p
289a0 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20  ShmNode==0 ){.  
289b0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
289c0 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tat;            
289d0 20 20 20 20 20 2f 2a 20 66 73 74 61 74 28 29 20       /* fstat() 
289e0 69 6e 66 6f 20 66 6f 72 20 64 61 74 61 62 61 73  info for databas
289f0 65 20 66 69 6c 65 20 2a 2f 0a 23 69 66 6e 64 65  e file */.#ifnde
28a00 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  f SQLITE_SHM_DIR
28a10 45 43 54 4f 52 59 0a 20 20 20 20 63 6f 6e 73 74  ECTORY.    const
28a20 20 63 68 61 72 20 2a 7a 42 61 73 65 50 61 74 68   char *zBasePath
28a30 20 3d 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 3b   = pDbFd->zPath;
28a40 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
28a50 43 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20  Call fstat() to 
28a60 66 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 70  figure out the p
28a70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68  ermissions on th
28a80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
28a90 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77   If.    ** a new
28aa0 20 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73 20 63   *-shm file is c
28ab0 72 65 61 74 65 64 2c 20 61 6e 20 61 74 74 65 6d  reated, an attem
28ac0 70 74 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20  pt will be made 
28ad0 74 6f 20 63 72 65 61 74 65 20 69 74 0a 20 20 20  to create it.   
28ae0 20 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d   ** with the sam
28af0 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 20  e permissions.. 
28b00 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73     */.    if( os
28b10 46 73 74 61 74 28 70 44 62 46 64 2d 3e 68 2c 20  Fstat(pDbFd->h, 
28b20 26 73 53 74 61 74 29 20 26 26 20 70 49 6e 6f 64  &sStat) && pInod
28b30 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
28b40 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  =0 ){.      stor
28b50 65 4c 61 73 74 45 72 72 6e 6f 28 70 44 62 46 64  eLastErrno(pDbFd
28b60 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
28b70 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
28b80 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 20 20 67  R_FSTAT;.      g
28b90 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
28ba0 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 64 65 66  ;.    }..#if def
28bb0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
28bc0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
28bd0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 5c  _LOCKING_STYLE \
28be0 0a 20 20 20 20 20 20 26 26 20 21 64 65 66 69 6e  .      && !defin
28bf0 65 64 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  ed(SQLITE_SHM_DI
28c00 52 45 43 54 4f 52 59 29 0a 20 20 20 20 2f 2a 20  RECTORY).    /* 
28c10 49 66 20 70 44 62 46 64 20 69 73 20 63 6f 6e 66  If pDbFd is conf
28c20 69 67 75 72 65 64 20 77 69 74 68 20 70 72 6f 78  igured with prox
28c30 79 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20  y locking mode, 
28c40 75 73 65 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20  use the local . 
28c50 20 20 20 2a 2a 20 6c 6f 63 6b 20 66 69 6c 65 20     ** lock file 
28c60 70 61 74 68 20 74 6f 20 64 65 74 65 72 6d 69 6e  path to determin
28c70 65 20 74 68 65 20 2d 73 68 6d 20 66 69 6c 65 20  e the -shm file 
28c80 70 61 74 68 0a 20 20 20 20 2a 2f 0a 20 20 20 20  path.    */.    
28c90 69 66 28 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69  if( isProxyLocki
28ca0 6e 67 4d 6f 64 65 28 70 44 62 46 64 29 20 29 7b  ngMode(pDbFd) ){
28cb0 0a 20 20 20 20 20 20 7a 42 61 73 65 50 61 74 68  .      zBasePath
28cc0 20 3d 20 70 72 6f 78 79 53 68 61 72 65 64 4d 65   = proxySharedMe
28cd0 6d 6f 72 79 42 61 73 65 50 61 74 68 28 70 44 62  moryBasePath(pDb
28ce0 46 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  Fd);.      if( !
28cf0 7a 42 61 73 65 50 61 74 68 20 29 7b 0a 20 20 20  zBasePath ){.   
28d00 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
28d10 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
28d20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
28d30 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20  _open_err;.     
28d40 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
28d50 20 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49      .#ifdef SQLI
28d60 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
28d70 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d  .    nShmFilenam
28d80 65 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49 54  e = sizeof(SQLIT
28d90 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 29  E_SHM_DIRECTORY)
28da0 20 2b 20 33 31 3b 0a 23 65 6c 73 65 0a 20 20 20   + 31;.#else.   
28db0 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20   nShmFilename = 
28dc0 36 20 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  6 + (int)strlen(
28dd0 7a 42 61 73 65 50 61 74 68 29 3b 0a 23 65 6e 64  zBasePath);.#end
28de0 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20  if.    pShmNode 
28df0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
28e00 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f  ( sizeof(*pShmNo
28e10 64 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61  de) + nShmFilena
28e20 6d 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53  me );.    if( pS
28e30 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  hmNode==0 ){.   
28e40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
28e50 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
28e60 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
28e70 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
28e80 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a  pShmNode, 0, siz
28e90 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 2b 6e  eof(*pShmNode)+n
28ea0 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ShmFilename);.  
28eb0 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d    zShmFilename =
28ec0 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65   pShmNode->zFile
28ed0 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
28ee0 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66 64  ShmNode[1];.#ifd
28ef0 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  ef SQLITE_SHM_DI
28f00 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71 6c 69  RECTORY.    sqli
28f10 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68  te3_snprintf(nSh
28f20 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46  mFilename, zShmF
28f30 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ilename, .      
28f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
28f50 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
28f60 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d 73 68 6d  ORY "/sqlite-shm
28f70 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20 20 20 20  -%x-%x",.       
28f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75                (u
28f90 33 32 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f 2c  32)sStat.st_ino,
28fa0 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 64   (u32)sStat.st_d
28fb0 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73  ev);.#else.    s
28fc0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
28fd0 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53  nShmFilename, zS
28fe0 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d  hmFilename, "%s-
28ff0 73 68 6d 22 2c 20 7a 42 61 73 65 50 61 74 68 29  shm", zBasePath)
29000 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c  ;.    sqlite3Fil
29010 65 53 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e  eSuffix3(pDbFd->
29020 7a 50 61 74 68 2c 20 7a 53 68 6d 46 69 6c 65 6e  zPath, zShmFilen
29030 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ame);.#endif.   
29040 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d   pShmNode->h = -
29050 31 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e 70 49  1;.    pDbFd->pI
29060 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d  node->pShmNode =
29070 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 70   pShmNode;.    p
29080 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 20  ShmNode->pInode 
29090 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b  = pDbFd->pInode;
290a0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d  .    pShmNode->m
290b0 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  utex = sqlite3_m
290c0 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
290d0 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
290e0 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
290f0 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
29100 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
29110 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
29120 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
29130 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49     }..    if( pI
29140 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
29150 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ck==0 ){.      i
29160 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f  nt openFlags = O
29170 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b  _RDWR | O_CREAT;
29180 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
29190 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 70  e3_uri_boolean(p
291a0 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 22 72 65  DbFd->zPath, "re
291b0 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30 29 0a  adonly_shm", 0).
291c0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
291d0 54 45 5f 45 4e 41 42 4c 45 5f 50 45 52 53 49 53  TE_ENABLE_PERSIS
291e0 54 5f 57 41 4c 29 26 26 28 53 51 4c 49 54 45 5f  T_WAL)&&(SQLITE_
291f0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
29200 54 59 4c 45 20 5c 0a 20 20 20 20 7c 7c 20 64 65  TYLE \.    || de
29210 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
29220 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70  ).         || (p
29230 44 62 46 64 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  DbFd->openFlags 
29240 26 20 4f 5f 52 44 57 52 29 20 21 3d 20 4f 5f 52  & O_RDWR) != O_R
29250 44 57 52 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  DWR.#endif.     
29260 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 6f      ){.        o
29270 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f  penFlags = O_RDO
29280 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 70 53 68  NLY;.        pSh
29290 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c  mNode->isReadonl
292a0 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 1;.      }. 
292b0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68       pShmNode->h
292c0 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a   = robust_open(z
292d0 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 6f 70 65  ShmFilename, ope
292e0 6e 46 6c 61 67 73 2c 20 28 73 53 74 61 74 2e 73  nFlags, (sStat.s
292f0 74 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a 20  t_mode&0777));. 
29300 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64       if( pShmNod
29310 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20  e->h<0 ){.      
29320 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
29330 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
29340 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22  PEN_BKPT, "open"
29350 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b  , zShmFilename);
29360 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68  .        goto sh
29370 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
29380 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68    }..      /* Ch
29390 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e  eck to see if an
293a0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
293b0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65 61   holding the dea
293c0 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20 20  d-man switch..  
293d0 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74      ** If not, t
293e0 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65  runcate the file
293f0 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e   to zero length.
29400 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
29410 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
29420 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 53  .      if( unixS
29430 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62  hmSystemLock(pDb
29440 46 64 2c 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49  Fd, F_WRLCK, UNI
29450 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53  X_SHM_DMS, 1)==S
29460 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29470 20 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66      if( robust_f
29480 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64  truncate(pShmNod
29490 65 2d 3e 68 2c 20 30 29 20 29 7b 0a 20 20 20 20  e->h, 0) ){.    
294a0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
294b0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
294c0 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 22 66  OERR_SHMOPEN, "f
294d0 74 72 75 6e 63 61 74 65 22 2c 20 7a 53 68 6d 46  truncate", zShmF
294e0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
294f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29500 20 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67     /* If running
29510 20 61 73 20 72 6f 6f 74 20 73 65 74 20 74 68 65   as root set the
29520 20 75 69 64 2f 67 69 64 20 6f 66 20 74 68 65 20   uid/gid of the 
29530 73 68 6d 20 66 69 6c 65 20 74 6f 20 6d 61 74 63  shm file to matc
29540 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  h.          ** t
29550 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
29560 20 20 20 20 20 20 20 20 20 75 69 64 5f 74 20 65           uid_t e
29570 75 69 64 20 3d 20 67 65 74 65 75 69 64 28 29 3b  uid = geteuid();
29580 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
29590 21 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61  !pShmNode->isRea
295a0 64 6f 6e 6c 79 29 20 26 26 20 65 75 69 64 3d 3d  donly) && euid==
295b0 30 20 26 26 20 28 65 75 69 64 21 3d 73 53 74 61  0 && (euid!=sSta
295c0 74 2e 73 74 5f 75 69 64 20 7c 7c 20 67 65 74 65  t.st_uid || gete
295d0 67 69 64 28 29 21 3d 73 53 74 61 74 2e 73 74 5f  gid()!=sStat.st_
295e0 67 69 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  gid) ){.        
295f0 20 20 20 20 69 66 28 20 6f 73 46 63 68 6f 77 6e      if( osFchown
29600 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53  (pShmNode->h, sS
29610 74 61 74 2e 73 74 5f 75 69 64 2c 20 73 53 74 61  tat.st_uid, sSta
29620 74 2e 73 74 5f 67 69 64 29 20 29 7b 0a 20 20 20  t.st_gid) ){.   
29630 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
29640 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
29650 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  OPEN;.          
29660 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
29670 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29680 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
29690 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
296a0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68       rc = unixSh
296b0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46  mSystemLock(pDbF
296c0 64 2c 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49 58  d, F_RDLCK, UNIX
296d0 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20  _SHM_DMS, 1);.  
296e0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
296f0 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70  rc ) goto shm_op
29700 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20  en_err;.    }.  
29710 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65  }..  /* Make the
29720 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   new connection 
29730 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 75  a child of the u
29740 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  nixShmNode */.  
29750 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53  p->pShmNode = pS
29760 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53  hmNode;.#ifdef S
29770 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d  QLITE_DEBUG.  p-
29780 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  >id = pShmNode->
29790 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e  nextShmId++;.#en
297a0 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  dif.  pShmNode->
297b0 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d  nRef++;.  pDbFd-
297c0 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75 6e 69  >pShm = p;.  uni
297d0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  xLeaveMutex();..
297e0 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e    /* The referen
297f0 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d  ce count on pShm
29800 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79  Node has already
29810 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65   been incremente
29820 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65  d under.  ** the
29830 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 75 6e   cover of the un
29840 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d  ixEnterMutex() m
29850 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69  utex and the poi
29860 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20  nter from the.  
29870 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20 75  ** new (struct u
29880 6e 69 78 53 68 6d 29 20 6f 62 6a 65 63 74 20 74  nixShm) object t
29890 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68  o the pShmNode h
298a0 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c  as been set. All
298b0 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65   that is.  ** le
298c0 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c  ft to do is to l
298d0 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65  ink the new obje
298e0 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  ct into the link
298f0 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
29900 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64  .  ** at pShmNod
29910 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20  e->pFirst. This 
29920 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69  must be done whi
29930 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70  le holding the p
29940 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a  ShmNode->mutex .
29950 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f    ** mutex..  */
29960 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
29970 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
29980 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e  >mutex);.  p->pN
29990 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ext = pShmNode->
299a0 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f  pFirst;.  pShmNo
299b0 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a  de->pFirst = p;.
299c0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
299d0 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
299e0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
299f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
29a00 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61  * Jump here on a
29a10 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f  ny error */.shm_
29a20 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e 69 78  open_err:.  unix
29a30 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b  ShmPurge(pDbFd);
29a40 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
29a50 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f  all frees pShmNo
29a60 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  de if required *
29a70 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
29a80 28 70 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  (p);.  unixLeave
29a90 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
29aa0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
29ab0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
29ac0 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
29ad0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65   a pointer to re
29ae0 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20  gion iRegion of 
29af0 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d 6d  the .** shared-m
29b00 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
29b10 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
29b20 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72  se file fd. Shar
29b30 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
29b40 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72  s .** are number
29b50 65 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d  ed starting from
29b60 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72   zero. Each shar
29b70 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
29b80 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a   is szRegion .**
29b90 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
29ba0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
29bb0 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72  r occurs, an err
29bc0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
29bd0 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73  ned and *pp is s
29be0 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
29bf0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
29c00 74 68 65 20 62 45 78 74 65 6e 64 20 70 61 72 61  the bExtend para
29c10 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64 20 74  meter is 0 and t
29c20 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61  he requested sha
29c30 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65  red-memory.** re
29c40 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65  gion has not bee
29c50 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20  n allocated (by 
29c60 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c  any client, incl
29c70 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e  uding one runnin
29c80 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61  g in a.** separa
29c90 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65  te process), the
29ca0 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  n *pp is set to 
29cb0 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f  NULL and SQLITE_
29cc0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
29cd0 0a 2a 2a 20 62 45 78 74 65 6e 64 20 69 73 20 6e  .** bExtend is n
29ce0 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20  on-zero and the 
29cf0 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64  requested shared
29d00 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68  -memory region h
29d10 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20 62  as not yet .** b
29d20 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69  een allocated, i
29d30 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  t is allocated b
29d40 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
29d50 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68  .**.** If the sh
29d60 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
29d70 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
29d80 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72  een allocated or
29d90 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79   is allocated by
29da0 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61 73  .** this call as
29db0 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
29dc0 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61 70  , then it is map
29dd0 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ped into this pr
29de0 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64 64 72  ocesses .** addr
29df0 65 73 73 20 73 70 61 63 65 20 28 69 66 20 69 74  ess space (if it
29e00 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29   is not already)
29e10 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  , *pp is set to 
29e20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70  point to the map
29e30 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  ped .** memory a
29e40 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
29e50 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
29e60 20 69 6e 74 20 75 6e 69 78 53 68 6d 4d 61 70 28   int unixShmMap(
29e70 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
29e80 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *fd,            
29e90 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65     /* Handle ope
29ea0 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69  n on database fi
29eb0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  le */.  int iReg
29ec0 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
29ed0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f          /* Regio
29ee0 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f  n to retrieve */
29ef0 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c  .  int szRegion,
29f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f10 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65     /* Size of re
29f20 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62  gions */.  int b
29f30 45 78 74 65 6e 64 2c 20 20 20 20 20 20 20 20 20  Extend,         
29f40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
29f50 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c  ue to extend fil
29f60 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  e if necessary *
29f70 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c  /.  void volatil
29f80 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20  e **pp          
29f90 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70      /* OUT: Mapp
29fa0 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a  ed memory */.){.
29fb0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46    unixFile *pDbF
29fc0 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66  d = (unixFile*)f
29fd0 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b  d;.  unixShm *p;
29fe0 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
29ff0 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20  pShmNode;.  int 
2a000 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2a010 20 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d 61 70    int nShmPerMap
2a020 20 3d 20 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e   = unixShmRegion
2a030 50 65 72 4d 61 70 28 29 3b 0a 20 20 69 6e 74 20  PerMap();.  int 
2a040 6e 52 65 71 52 65 67 69 6f 6e 3b 0a 0a 20 20 2f  nReqRegion;..  /
2a050 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d  * If the shared-
2a060 6d 65 6d 6f 72 79 20 66 69 6c 65 20 68 61 73 20  memory file has 
2a070 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
2a080 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77  ned, open it now
2a090 2e 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 46 64  . */.  if( pDbFd
2a0a0 2d 3e 70 53 68 6d 3d 3d 30 20 29 7b 0a 20 20 20  ->pShm==0 ){.   
2a0b0 20 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e 53 68   rc = unixOpenSh
2a0c0 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64  aredMemory(pDbFd
2a0d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2a0e0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
2a0f0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d  n rc;.  }..  p =
2a100 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
2a110 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
2a120 68 6d 4e 6f 64 65 3b 0a 20 20 73 71 6c 69 74 65  hmNode;.  sqlite
2a130 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
2a140 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
2a150 20 20 61 73 73 65 72 74 28 20 73 7a 52 65 67 69    assert( szRegi
2a160 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a  on==pShmNode->sz
2a170 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f  Region || pShmNo
2a180 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29  de->nRegion==0 )
2a190 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
2a1a0 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44  Node->pInode==pD
2a1b0 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20  bFd->pInode );. 
2a1c0 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
2a1d0 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64  e->h>=0 || pDbFd
2a1e0 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
2a1f0 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61  ssLock==1 );.  a
2a200 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
2a210 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70  >h<0 || pDbFd->p
2a220 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
2a230 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  ock==0 );..  /* 
2a240 4d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Minimum number o
2a250 66 20 72 65 67 69 6f 6e 73 20 72 65 71 75 69 72  f regions requir
2a260 65 64 20 74 6f 20 62 65 20 6d 61 70 70 65 64 2e  ed to be mapped.
2a270 20 2a 2f 0a 20 20 6e 52 65 71 52 65 67 69 6f 6e   */.  nReqRegion
2a280 20 3d 20 28 28 69 52 65 67 69 6f 6e 2b 6e 53 68   = ((iRegion+nSh
2a290 6d 50 65 72 4d 61 70 29 20 2f 20 6e 53 68 6d 50  mPerMap) / nShmP
2a2a0 65 72 4d 61 70 29 20 2a 20 6e 53 68 6d 50 65 72  erMap) * nShmPer
2a2b0 4d 61 70 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d  Map;..  if( pShm
2a2c0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52  Node->nRegion<nR
2a2d0 65 71 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  eqRegion ){.    
2a2e0 63 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20 20 20  char **apNew;   
2a2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a300 20 20 20 2f 2a 20 4e 65 77 20 61 70 52 65 67 69     /* New apRegi
2a310 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  on[] array */.  
2a320 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e 52    int nByte = nR
2a330 65 71 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f  eqRegion*szRegio
2a340 6e 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  n;   /* Minimum 
2a350 72 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69  required file si
2a360 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  ze */.    struct
2a370 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
2a380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a390 55 73 65 64 20 62 79 20 66 73 74 61 74 28 29 20  Used by fstat() 
2a3a0 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  */..    pShmNode
2a3b0 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52  ->szRegion = szR
2a3c0 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 69 66 28 20  egion;..    if( 
2a3d0 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29  pShmNode->h>=0 )
2a3e0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  {.      /* The r
2a3f0 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20  equested region 
2a400 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e  is not mapped in
2a410 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
2a420 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
2a430 0a 20 20 20 20 20 20 2a 2a 20 43 68 65 63 6b 20  .      ** Check 
2a440 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73  to see if it has
2a450 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
2a460 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c  (i.e. if the wal
2a470 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20  -index file is. 
2a480 20 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e       ** large en
2a490 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ough to contain 
2a4a0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  the requested re
2a4b0 67 69 6f 6e 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  gion)..      */.
2a4c0 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61        if( osFsta
2a4d0 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26  t(pShmNode->h, &
2a4e0 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20  sStat) ){.      
2a4f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
2a500 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20 20  ERR_SHMSIZE;.   
2a510 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
2a520 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  e_out;.      }. 
2a530 20 0a 20 20 20 20 20 20 69 66 28 20 73 53 74 61   .      if( sSta
2a540 74 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 74 65 20  t.st_size<nByte 
2a550 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
2a560 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
2a570 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e  ry region does n
2a580 6f 74 20 65 78 69 73 74 2e 20 49 66 20 62 45 78  ot exist. If bEx
2a590 74 65 6e 64 20 69 73 20 73 65 74 20 74 6f 0a 20  tend is set to. 
2a5a0 20 20 20 20 20 20 20 2a 2a 20 66 61 6c 73 65 2c         ** false,
2a5b0 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70   exit early. *pp
2a5c0 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
2a5d0 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f  NULL and SQLITE_
2a5e0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20  OK returned..   
2a5f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2a600 69 66 28 20 21 62 45 78 74 65 6e 64 20 29 7b 0a  if( !bExtend ){.
2a610 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
2a620 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
2a630 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
2a640 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c  * Alternatively,
2a650 20 69 66 20 62 45 78 74 65 6e 64 20 69 73 20 74   if bExtend is t
2a660 72 75 65 2c 20 65 78 74 65 6e 64 20 74 68 65 20  rue, extend the 
2a670 66 69 6c 65 2e 20 44 6f 20 74 68 69 73 20 62 79  file. Do this by
2a680 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 72 69 74  .        ** writ
2a690 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74  ing a single byt
2a6a0 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  e to the end of 
2a6b0 65 61 63 68 20 28 4f 53 29 20 70 61 67 65 20 62  each (OS) page b
2a6c0 65 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  eing.        ** 
2a6d0 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65 78 74  allocated or ext
2a6e0 65 6e 64 65 64 2e 20 54 65 63 68 6e 69 63 61 6c  ended. Technical
2a6f0 6c 79 2c 20 77 65 20 6e 65 65 64 20 6f 6e 6c 79  ly, we need only
2a700 20 77 72 69 74 65 20 74 6f 20 74 68 65 0a 20 20   write to the.  
2a710 20 20 20 20 20 20 2a 2a 20 6c 61 73 74 20 70 61        ** last pa
2a720 67 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 65  ge in order to e
2a730 78 74 65 6e 64 20 74 68 65 20 66 69 6c 65 2e 20  xtend the file. 
2a740 42 75 74 20 77 72 69 74 69 6e 67 20 74 6f 20 61  But writing to a
2a750 6c 6c 20 6e 65 77 0a 20 20 20 20 20 20 20 20 2a  ll new.        *
2a760 2a 20 70 61 67 65 73 20 66 6f 72 63 65 73 20 74  * pages forces t
2a770 68 65 20 4f 53 20 74 6f 20 61 6c 6c 6f 63 61 74  he OS to allocat
2a780 65 20 74 68 65 6d 20 69 6d 6d 65 64 69 61 74 65  e them immediate
2a790 6c 79 2c 20 77 68 69 63 68 20 72 65 64 75 63 65  ly, which reduce
2a7a0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  s.        ** the
2a7b0 20 63 68 61 6e 63 65 73 20 6f 66 20 53 49 47 42   chances of SIGB
2a7c0 55 53 20 77 68 69 6c 65 20 61 63 63 65 73 73 69  US while accessi
2a7d0 6e 67 20 74 68 65 20 6d 61 70 70 65 64 20 72 65  ng the mapped re
2a7e0 67 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 0a 20  gion later on.. 
2a7f0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2a800 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20    else{.        
2a810 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69    static const i
2a820 6e 74 20 70 67 73 7a 20 3d 20 34 30 39 36 3b 0a  nt pgsz = 4096;.
2a830 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 50            int iP
2a840 67 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  g;..          /*
2a850 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 6c 61   Write to the la
2a860 73 74 20 62 79 74 65 20 6f 66 20 65 61 63 68 20  st byte of each 
2a870 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  newly allocated 
2a880 6f 72 20 65 78 74 65 6e 64 65 64 20 70 61 67 65  or extended page
2a890 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
2a8a0 73 65 72 74 28 20 28 6e 42 79 74 65 20 25 20 70  sert( (nByte % p
2a8b0 67 73 7a 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  gsz)==0 );.     
2a8c0 20 20 20 20 20 66 6f 72 28 69 50 67 3d 28 73 53       for(iPg=(sS
2a8d0 74 61 74 2e 73 74 5f 73 69 7a 65 2f 70 67 73 7a  tat.st_size/pgsz
2a8e0 29 3b 20 69 50 67 3c 28 6e 42 79 74 65 2f 70 67  ); iPg<(nByte/pg
2a8f0 73 7a 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20  sz); iPg++){.   
2a900 20 20 20 20 20 20 20 20 20 69 66 28 20 73 65 65           if( see
2a910 6b 41 6e 64 57 72 69 74 65 46 64 28 70 53 68 6d  kAndWriteFd(pShm
2a920 4e 6f 64 65 2d 3e 68 2c 20 69 50 67 2a 70 67 73  Node->h, iPg*pgs
2a930 7a 20 2b 20 70 67 73 7a 2d 31 2c 20 22 22 2c 20  z + pgsz-1, "", 
2a940 31 2c 20 30 29 21 3d 31 20 29 7b 0a 20 20 20 20  1, 0)!=1 ){.    
2a950 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
2a960 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 70 53  char *zFile = pS
2a970 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
2a980 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
2a990 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
2a9a0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
2a9b0 53 48 4d 53 49 5a 45 2c 20 22 77 72 69 74 65 22  SHMSIZE, "write"
2a9c0 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  , zFile);.      
2a9d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
2a9e0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
2a9f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2aa00 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2aa10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2aa20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75   /* Map the requ
2aa30 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
2aa40 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ion into this pr
2aa50 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20  ocesses address 
2aa60 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70  space. */.    ap
2aa70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 2a 29 73  New = (char **)s
2aa80 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a  qlite3_realloc(.
2aa90 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
2aaa0 2d 3e 61 70 52 65 67 69 6f 6e 2c 20 6e 52 65 71  ->apRegion, nReq
2aab0 52 65 67 69 6f 6e 2a 73 69 7a 65 6f 66 28 63 68  Region*sizeof(ch
2aac0 61 72 20 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20  ar *).    );.   
2aad0 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20   if( !apNew ){. 
2aae0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2aaf0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
2ab00 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
2ab10 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
2ab20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
2ab30 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20  on = apNew;.    
2ab40 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d  while( pShmNode-
2ab50 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52 65 67  >nRegion<nReqReg
2ab60 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ion ){.      int
2ab70 20 6e 4d 61 70 20 3d 20 73 7a 52 65 67 69 6f 6e   nMap = szRegion
2ab80 2a 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20 20 20  *nShmPerMap;.   
2ab90 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
2aba0 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20 20 20  void *pMem;.    
2abb0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
2abc0 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  h>=0 ){.        
2abd0 70 4d 65 6d 20 3d 20 6f 73 4d 6d 61 70 28 30 2c  pMem = osMmap(0,
2abe0 20 6e 4d 61 70 2c 0a 20 20 20 20 20 20 20 20 20   nMap,.         
2abf0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52     pShmNode->isR
2ac00 65 61 64 6f 6e 6c 79 20 3f 20 50 52 4f 54 5f 52  eadonly ? PROT_R
2ac10 45 41 44 20 3a 20 50 52 4f 54 5f 52 45 41 44 7c  EAD : PROT_READ|
2ac20 50 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20 20 20  PROT_WRITE, .   
2ac30 20 20 20 20 20 20 20 20 20 4d 41 50 5f 53 48 41           MAP_SHA
2ac40 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  RED, pShmNode->h
2ac50 2c 20 73 7a 52 65 67 69 6f 6e 2a 28 69 36 34 29  , szRegion*(i64)
2ac60 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
2ac70 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  n.        );.   
2ac80 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d       if( pMem==M
2ac90 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20  AP_FAILED ){.   
2aca0 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
2acb0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
2acc0 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d  IOERR_SHMMAP, "m
2acd0 6d 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  map", pShmNode->
2ace0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
2acf0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
2ad00 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ge_out;.        
2ad10 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
2ad20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 73 71         pMem = sq
2ad30 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 7a 52  lite3_malloc(szR
2ad40 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20  egion);.        
2ad50 69 66 28 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20  if( pMem==0 ){. 
2ad60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2ad70 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2ad80 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
2ad90 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ge_out;.        
2ada0 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  }.        memset
2adb0 28 70 4d 65 6d 2c 20 30 2c 20 73 7a 52 65 67 69  (pMem, 0, szRegi
2adc0 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  on);.      }..  
2add0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2ade0 53 68 6d 50 65 72 4d 61 70 3b 20 69 2b 2b 29 7b  ShmPerMap; i++){
2adf0 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  .        pShmNod
2ae00 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68 6d  e->apRegion[pShm
2ae10 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 69 5d  Node->nRegion+i]
2ae20 20 3d 20 26 28 28 63 68 61 72 2a 29 70 4d 65 6d   = &((char*)pMem
2ae30 29 5b 73 7a 52 65 67 69 6f 6e 2a 69 5d 3b 0a 20  )[szRegion*i];. 
2ae40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68       }.      pSh
2ae50 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 20 2b  mNode->nRegion +
2ae60 3d 20 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20 20  = nShmPerMap;.  
2ae70 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65    }.  }..shmpage
2ae80 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d  _out:.  if( pShm
2ae90 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52  Node->nRegion>iR
2aea0 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 2a 70 70  egion ){.    *pp
2aeb0 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52   = pShmNode->apR
2aec0 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a  egion[iRegion];.
2aed0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
2aee0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
2aef0 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64  pShmNode->isRead
2af00 6f 6e 6c 79 20 26 26 20 72 63 3d 3d 53 51 4c 49  only && rc==SQLI
2af10 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c  TE_OK ) rc = SQL
2af20 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
2af30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
2af40 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
2af50 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
2af60 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
2af70 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ge the lock stat
2af80 65 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d  e for a shared-m
2af90 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a  emory segment..*
2afa0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
2afb0 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20  he relationship 
2afc0 62 65 74 77 65 65 6e 20 53 48 41 52 45 64 20 61  between SHAREd a
2afd0 6e 64 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  nd EXCLUSIVE loc
2afe0 6b 73 20 69 73 20 61 20 6c 69 74 74 6c 65 0a 2a  ks is a little.*
2aff0 2a 20 64 69 66 66 65 72 65 6e 74 20 68 65 72 65  * different here
2b000 20 74 68 61 6e 20 69 6e 20 70 6f 73 69 78 2e 20   than in posix. 
2b010 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28 29 2c 20   In xShmLock(), 
2b020 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72 6f 6d 20  one can go from 
2b030 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f 20 73  unlocked.** to s
2b040 68 61 72 65 64 20 61 6e 64 20 62 61 63 6b 20 6f  hared and back o
2b050 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20  r from unlocked 
2b060 74 6f 20 65 78 63 6c 75 73 69 76 65 20 61 6e 64  to exclusive and
2b070 20 62 61 63 6b 2e 20 20 42 75 74 20 6f 6e 65 20   back.  But one 
2b080 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20 66 72  may.** not go fr
2b090 6f 6d 20 73 68 61 72 65 64 20 74 6f 20 65 78 63  om shared to exc
2b0a0 6c 75 73 69 76 65 20 6f 72 20 66 72 6f 6d 20 65  lusive or from e
2b0b0 78 63 6c 75 73 69 76 65 20 74 6f 20 73 68 61 72  xclusive to shar
2b0c0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2b0d0 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 28 0a 20  t unixShmLock(. 
2b0e0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
2b0f0 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  d,          /* D
2b100 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
2b110 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ding the shared 
2b120 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20  memory */.  int 
2b130 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  ofst,           
2b140 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
2b150 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65 20  lock to acquire 
2b160 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  or release */.  
2b170 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
2b180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2b190 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f  mber of locks to
2b1a0 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
2b1b0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ase */.  int fla
2b1c0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
2b1d0 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
2b1e0 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  o with the lock 
2b1f0 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  */.){.  unixFile
2b200 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46   *pDbFd = (unixF
2b210 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 2f 2a  ile*)fd;      /*
2b220 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64   Connection hold
2b230 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ing shared memor
2b240 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  y */.  unixShm *
2b250 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
2b260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b270 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  The shared memor
2b280 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a  y being locked *
2b290 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 58 3b  /.  unixShm *pX;
2b2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
2b2c0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c   looping over al
2b2d0 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20  l siblings */.  
2b2e0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
2b2f0 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
2b300 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20 75 6e 64  ode;  /* The und
2b310 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 69 4e 6f  erlying file iNo
2b320 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  de */.  int rc =
2b330 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2b340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b350 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
2b360 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20    u16 mask;     
2b370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b380 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
2b390 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65  of locks to take
2b3a0 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a   or release */..
2b3b0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
2b3c0 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
2b3d0 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20  e->pShmNode );. 
2b3e0 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
2b3f0 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64  e->pInode==pDbFd
2b400 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73  ->pInode );.  as
2b410 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26  sert( ofst>=0 &&
2b420 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f   ofst+n<=SQLITE_
2b430 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61  SHM_NLOCK );.  a
2b440 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20  ssert( n>=1 );. 
2b450 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
2b460 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
2b470 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   | SQLITE_SHM_SH
2b480 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  ARED).       || 
2b490 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
2b4a0 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  HM_LOCK | SQLITE
2b4b0 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a  _SHM_EXCLUSIVE).
2b4c0 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
2b4d0 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  =(SQLITE_SHM_UNL
2b4e0 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
2b4f0 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
2b500 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
2b510 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
2b520 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
2b530 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  IVE) );.  assert
2b540 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73  ( n==1 || (flags
2b550 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   & SQLITE_SHM_EX
2b560 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 20  CLUSIVE)!=0 );. 
2b570 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
2b580 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64  e->h>=0 || pDbFd
2b590 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
2b5a0 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61  ssLock==1 );.  a
2b5b0 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
2b5c0 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70  >h<0 || pDbFd->p
2b5d0 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
2b5e0 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 6d 61 73  ock==0 );..  mas
2b5f0 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29  k = (1<<(ofst+n)
2b600 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20  ) - (1<<ofst);. 
2b610 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20   assert( n>1 || 
2b620 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20  mask==(1<<ofst) 
2b630 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
2b640 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
2b650 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  e->mutex);.  if(
2b660 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
2b670 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  SHM_UNLOCK ){.  
2b680 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20    u16 allMask = 
2b690 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f  0; /* Mask of lo
2b6a0 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c  cks held by sibl
2b6b0 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ings */..    /* 
2b6c0 53 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69  See if any sibli
2b6d0 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61  ngs hold this sa
2b6e0 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66  me lock */.    f
2b6f0 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
2b700 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
2b710 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
2b720 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e   if( pX==p ) con
2b730 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73  tinue;.      ass
2b740 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61  ert( (pX->exclMa
2b750 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73  sk & (p->exclMas
2b760 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29  k|p->sharedMask)
2b770 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c  )==0 );.      al
2b780 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61  lMask |= pX->sha
2b790 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a  redMask;.    }..
2b7a0 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68      /* Unlock th
2b7b0 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c  e system-level l
2b7c0 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
2b7d0 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29  (mask & allMask)
2b7e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
2b7f0 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
2b800 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 55 4e 4c  ock(pDbFd, F_UNL
2b810 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48  CK, ofst+UNIX_SH
2b820 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
2b830 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2b840 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2b850 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20   }..    /* Undo 
2b860 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20  the local locks 
2b870 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
2b880 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b890 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d    p->exclMask &=
2b8a0 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d   ~mask;.      p-
2b8b0 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e  >sharedMask &= ~
2b8c0 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d  mask;.    } .  }
2b8d0 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
2b8e0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
2b8f0 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c  ED ){.    u16 al
2b900 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a  lShared = 0;  /*
2b910 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20   Union of locks 
2b920 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
2b930 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22  ons other than "
2b940 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69  p" */..    /* Fi
2b950 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61  nd out which sha
2b960 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c  red locks are al
2b970 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69  ready held by si
2b980 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
2b990 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79  s..    ** If any
2b9a0 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79   sibling already
2b9b0 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73   holds an exclus
2b9c0 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65  ive lock, go ahe
2b9d0 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ad and return.  
2b9e0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59    ** SQLITE_BUSY
2b9f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
2ba00 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
2ba10 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
2ba20 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
2ba30 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  f( (pX->exclMask
2ba40 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20   & mask)!=0 ){. 
2ba50 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2ba60 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
2ba70 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2ba80 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20        allShared 
2ba90 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  |= pX->sharedMas
2baa0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
2bab0 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   Get shared lock
2bac0 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  s at the system 
2bad0 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73  level, if necess
2bae0 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  ary */.    if( r
2baf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2bb00 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68        if( (allSh
2bb10 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20  ared & mask)==0 
2bb20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2bb30 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
2bb40 6b 28 70 44 62 46 64 2c 20 46 5f 52 44 4c 43 4b  k(pDbFd, F_RDLCK
2bb50 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f  , ofst+UNIX_SHM_
2bb60 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
2bb70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
2bb80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2bb90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
2bba0 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63    /* Get the loc
2bbb0 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  al shared locks 
2bbc0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
2bbd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2bbe0 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20    p->sharedMask 
2bbf0 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20  |= mask;.    }. 
2bc00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d   }else{.    /* M
2bc10 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c  ake sure no sibl
2bc20 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
2bc30 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20  hold locks that 
2bc40 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a  will block this.
2bc50 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66      ** lock.  If
2bc60 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20   any do, return 
2bc70 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68  SQLITE_BUSY righ
2bc80 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20  t away..    */. 
2bc90 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
2bca0 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
2bcb0 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
2bcc0 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78       if( (pX->ex
2bcd0 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  clMask & mask)!=
2bce0 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64  0 || (pX->shared
2bcf0 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
2bd00 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2bd10 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
2bd20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2bd30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
2bd40 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c   /* Get the excl
2bd50 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74  usive locks at t
2bd60 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e  he system level.
2bd70 20 20 54 68 65 6e 20 69 66 20 73 75 63 63 65 73    Then if succes
2bd80 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f  sful.    ** also
2bd90 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20   mark the local 
2bda0 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65  connection as be
2bdb0 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20  ing locked..    
2bdc0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
2bdd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2bde0 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
2bdf0 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20  stemLock(pDbFd, 
2be00 46 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e  F_WRLCK, ofst+UN
2be10 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IX_SHM_BASE, n);
2be20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2be30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2be40 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e      assert( (p->
2be50 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73  sharedMask & mas
2be60 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  k)==0 );.       
2be70 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20   p->exclMask |= 
2be80 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mask;.      }.  
2be90 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
2bea0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
2beb0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
2bec0 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
2bed0 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70  LOCK shmid-%d, p
2bee0 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c 25  id-%d got %03x,%
2bef0 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  03x\n",.        
2bf00 20 20 20 70 2d 3e 69 64 2c 20 6f 73 47 65 74 70     p->id, osGetp
2bf10 69 64 28 30 29 2c 20 70 2d 3e 73 68 61 72 65 64  id(0), p->shared
2bf20 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73  Mask, p->exclMas
2bf30 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  k));.  return rc
2bf40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
2bf50 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61  ment a memory ba
2bf60 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20  rrier or memory 
2bf70 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20  fence on shared 
2bf80 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20  memory.  .**.** 
2bf90 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74  All loads and st
2bfa0 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72  ores begun befor
2bfb0 65 20 74 68 65 20 62 61 72 72 69 65 72 20 6d 75  e the barrier mu
2bfc0 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f  st complete befo
2bfd0 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f  re.** any load o
2bfe0 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66  r store begun af
2bff0 74 65 72 20 74 68 65 20 62 61 72 72 69 65 72 2e  ter the barrier.
2c000 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2c010 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 28 0a  unixShmBarrier(.
2c020 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
2c030 66 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  fd              
2c040 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
2c050 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  le holding the s
2c060 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
2c070 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2c080 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 75 6e 69  METER(fd);.  uni
2c090 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
2c0a0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2c0b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
2c0c0 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  e a connection t
2c0d0 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e  o shared-memory.
2c0e0 20 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64    Delete the und
2c0f0 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72  erlying .** stor
2c100 61 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61  age if deleteFla
2c110 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a  g is true..**.**
2c120 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
2c130 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73  shared memory as
2c140 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
2c150 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65  e connection the
2c160 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  n this.** routin
2c170 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20  e is a harmless 
2c180 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
2c190 20 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61   int unixShmUnma
2c1a0 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  p(.  sqlite3_fil
2c1b0 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
2c1c0 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
2c1d0 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
2c1e0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65  file */.  int de
2c1f0 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20 20 20  leteFlag        
2c200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c            /* Del
2c210 65 74 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ete shared-memor
2c220 79 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  y if true */.){.
2c230 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20    unixShm *p;   
2c240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c250 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74    /* The connect
2c260 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64  ion to be closed
2c270 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64   */.  unixShmNod
2c280 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20  e *pShmNode;    
2c290 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
2c2a0 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d  erlying shared-m
2c2b0 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
2c2c0 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20  unixShm **pp;   
2c2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c2e0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
2c2f0 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e  ver sibling conn
2c300 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69  ections */.  uni
2c310 78 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20  xFile *pDbFd;   
2c320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c330 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
2c340 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2c350 0a 20 20 70 44 62 46 64 20 3d 20 28 75 6e 69 78  .  pDbFd = (unix
2c360 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20  File*)fd;.  p = 
2c370 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69  pDbFd->pShm;.  i
2c380 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
2c390 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53   SQLITE_OK;.  pS
2c3a0 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
2c3b0 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Node;..  assert(
2c3c0 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64   pShmNode==pDbFd
2c3d0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
2c3e0 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  de );.  assert( 
2c3f0 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65  pShmNode->pInode
2c400 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20  ==pDbFd->pInode 
2c410 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20  );..  /* Remove 
2c420 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f  connection p fro
2c430 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e  m the set of con
2c440 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61  nections associa
2c450 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53  ted.  ** with pS
2c460 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  hmNode */.  sqli
2c470 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
2c480 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
2c490 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d  ;.  for(pp=&pShm
2c4a0 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a  Node->pFirst; (*
2c4b0 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a  pp)!=p; pp = &(*
2c4c0 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  pp)->pNext){}.  
2c4d0 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  *pp = p->pNext;.
2c4e0 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63  .  /* Free the c
2c4f0 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20  onnection p */. 
2c500 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
2c510 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20  ;.  pDbFd->pShm 
2c520 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
2c530 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
2c540 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20  ode->mutex);..  
2c550 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e  /* If pShmNode->
2c560 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65 64  nRef has reached
2c570 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74   0, then close t
2c580 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20  he underlying.  
2c590 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
2c5a0 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20   file, too */.  
2c5b0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
2c5c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
2c5d0 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  Node->nRef>0 );.
2c5e0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66    pShmNode->nRef
2c5f0 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  --;.  if( pShmNo
2c600 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  de->nRef==0 ){. 
2c610 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61     if( deleteFla
2c620 67 20 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  g && pShmNode->h
2c630 3e 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 69 66  >=0 ) {.      if
2c640 20 28 64 65 6c 65 74 65 46 6c 61 67 20 3d 3d 20   (deleteFlag == 
2c650 31 29 20 7b 20 0a 20 20 20 20 20 20 20 20 6f 73  1) { .        os
2c660 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d  Unlink(pShmNode-
2c670 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
2c680 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 64 65     } else if (de
2c690 6c 65 74 65 46 6c 61 67 20 3d 3d 20 32 29 20 7b  leteFlag == 2) {
2c6a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 74 72 75  .        /* ftru
2c6b0 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  ncate(pShmNode->
2c6c0 68 2c 20 33 32 20 2a 20 31 30 32 34 29 3b 20 2a  h, 32 * 1024); *
2c6d0 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
2c6e0 20 20 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65      unixShmPurge
2c6f0 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75  (pDbFd);.  }.  u
2c700 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
2c710 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
2c720 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a  E_OK;.}...#else.
2c730 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
2c740 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69  Map     0.# defi
2c750 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20  ne unixShmLock  
2c760 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69    0.# define uni
2c770 78 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20  xShmBarrier 0.# 
2c780 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e  define unixShmUn
2c790 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f  map   0.#endif /
2c7a0 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
2c7b0 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 23 69  _OMIT_WAL */..#i
2c7c0 66 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  f (SQLITE_ENABLE
2c7d0 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26  _APPLE_SPI>0) &&
2c7e0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2c7f0 5f 5f 29 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  __).static const
2c800 20 63 68 61 72 20 2a 75 6e 69 78 54 65 6d 70 46   char *unixTempF
2c810 69 6c 65 44 69 72 28 76 6f 69 64 29 3b 0a 0a 73  ileDir(void);..s
2c820 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 49 6e  tatic int unixIn
2c830 76 61 6c 69 64 61 74 65 53 75 70 70 6f 72 74 46  validateSupportF
2c840 69 6c 65 73 28 75 6e 69 78 46 69 6c 65 20 2a 70  iles(unixFile *p
2c850 46 69 6c 65 2c 20 69 6e 74 20 73 6b 69 70 57 41  File, int skipWA
2c860 4c 29 20 7b 0a 20 20 63 68 61 72 20 6a 50 61 74  L) {.  char jPat
2c870 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 39 5d 3b  h[MAXPATHLEN+9];
2c880 0a 20 20 69 6e 74 20 7a 4c 65 6e 20 3d 20 73 74  .  int zLen = st
2c890 72 6c 63 70 79 28 6a 50 61 74 68 2c 20 70 46 69  rlcpy(jPath, pFi
2c8a0 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58 50 41  le->zPath, MAXPA
2c8b0 54 48 4c 45 4e 2b 39 29 3b 0a 20 20 69 66 28 20  THLEN+9);.  if( 
2c8c0 7a 4c 65 6e 3c 4d 41 58 50 41 54 48 4c 45 4e 20  zLen<MAXPATHLEN 
2c8d0 29 7b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6a 4c  ){.    size_t jL
2c8e0 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  en;.    const ch
2c8f0 61 72 20 65 78 74 65 6e 73 69 6f 6e 73 5b 33 5d  ar extensions[3]
2c900 5b 39 5d 20 3d 20 7b 20 22 2d 77 61 6c 22 2c 20  [9] = { "-wal", 
2c910 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 22 2d 73 68  "-journal", "-sh
2c920 6d 22 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6a 20  m" };.    int j 
2c930 3d 20 28 73 6b 69 70 57 41 4c 20 3f 20 31 20 3a  = (skipWAL ? 1 :
2c940 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 20 3b 20   0);.    for( ; 
2c950 6a 3c 33 3b 20 6a 2b 2b 20 29 7b 0a 20 20 20 20  j<3; j++ ){.    
2c960 20 20 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63    .      /* Chec
2c970 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
2c980 73 68 6d 20 66 69 6c 65 20 69 73 20 61 6c 72 65  shm file is alre
2c990 61 64 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 74  ady opened for t
2c9a0 68 69 73 20 70 46 69 6c 65 20 2a 2f 0a 20 20 20  his pFile */.   
2c9b0 20 20 20 69 66 28 20 6a 3d 3d 32 20 29 7b 0a 20     if( j==2 ){. 
2c9c0 20 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72         unixEnter
2c9d0 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61  Mutex(); /* Beca
2c9e0 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
2c9f0 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
2ca00 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20  ss threads */.  
2ca10 20 20 20 20 20 20 75 6e 69 78 53 68 6d 4e 6f 64        unixShmNod
2ca20 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 46  e *pShmNode = pF
2ca30 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  ile->pInode->pSh
2ca40 6d 4e 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 69  mNode;.        i
2ca50 66 28 20 70 53 68 6d 4e 6f 64 65 20 26 26 20 21  f( pShmNode && !
2ca60 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64  pShmNode->isRead
2ca70 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  only ){.        
2ca80 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
2ca90 74 61 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73  tat;.          s
2caa0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
2cab0 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
2cac0 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 0a  ex);.          .
2cad0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
2cae0 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 26 26 20  hmNode->h>=0 && 
2caf0 21 6f 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64  !osFstat(pShmNod
2cb00 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b  e->h, &sStat) ){
2cb10 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73  .            uns
2cb20 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 7a 65 20  igned long size 
2cb30 3d 20 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  = (sStat.st_size
2cb40 3c 34 29 20 3f 20 73 53 74 61 74 2e 73 74 5f 73  <4) ? sStat.st_s
2cb50 69 7a 65 20 3a 20 34 3b 0a 20 20 20 20 20 20 20  ize : 4;.       
2cb60 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e 30 20       if( size>0 
2cb70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2cb80 20 62 7a 65 72 6f 28 70 53 68 6d 4e 6f 64 65 2d   bzero(pShmNode-
2cb90 3e 61 70 52 65 67 69 6f 6e 5b 30 5d 2c 20 73 69  >apRegion[0], si
2cba0 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ze);.           
2cbb0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
2cbc0 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
2cbd0 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20  >mutex);.       
2cbe0 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65         unixLeave
2cbf0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20  Mutex();.       
2cc00 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2cc10 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2cc20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2cc30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
2cc40 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
2cc50 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  e->mutex);.     
2cc60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 6e 69     }.        uni
2cc70 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
2cc80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 4c 65       }.      jLe
2cc90 6e 20 3d 20 73 74 72 6c 63 70 79 28 26 6a 50 61  n = strlcpy(&jPa
2cca0 74 68 5b 7a 4c 65 6e 5d 2c 20 65 78 74 65 6e 73  th[zLen], extens
2ccb0 69 6f 6e 73 5b 6a 5d 2c 20 39 29 3b 0a 20 20 20  ions[j], 9);.   
2ccc0 20 20 20 69 66 28 20 6a 4c 65 6e 20 3c 20 39 20     if( jLen < 9 
2ccd0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  ){.        int j
2cce0 66 6c 61 67 73 20 3d 20 28 6a 3c 32 29 20 3f 20  flags = (j<2) ? 
2ccf0 4f 5f 54 52 55 4e 43 20 3a 20 4f 5f 52 44 57 52  O_TRUNC : O_RDWR
2cd00 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 66  ;.        int jf
2cd10 64 20 3d 20 6f 70 65 6e 28 6a 50 61 74 68 2c 20  d = open(jPath, 
2cd20 6a 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20  jflags);.       
2cd30 20 69 66 28 20 6a 66 64 3d 3d 28 2d 31 29 20 29   if( jfd==(-1) )
2cd40 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2cd50 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b  errno!=ENOENT ){
2cd60 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 65 72  .            per
2cd70 72 6f 72 28 6a 50 61 74 68 29 3b 0a 20 20 20 20  ror(jPath);.    
2cd80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2cd90 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
2cda0 20 20 20 69 66 28 20 6a 3d 3d 32 20 29 7b 0a 20     if( j==2 ){. 
2cdb0 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63             struc
2cdc0 74 20 73 74 61 74 20 73 53 74 61 74 3b 0a 20 20  t stat sStat;.  
2cdd0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6f            if( !o
2cde0 73 46 73 74 61 74 28 6a 66 64 2c 20 26 73 53 74  sFstat(jfd, &sSt
2cdf0 61 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  at) ){.         
2ce00 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f       unsigned lo
2ce10 6e 67 20 73 69 7a 65 20 3d 20 28 73 53 74 61 74  ng size = (sStat
2ce20 2e 73 74 5f 73 69 7a 65 3c 34 29 20 3f 20 73 53  .st_size<4) ? sS
2ce30 74 61 74 2e 73 74 5f 73 69 7a 65 20 3a 20 34 3b  tat.st_size : 4;
2ce40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2ce50 66 28 20 73 69 7a 65 3e 30 20 29 7b 0a 20 20 20  f( size>0 ){.   
2ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 75 69 6e               uin
2ce70 74 33 32 5f 74 20 7a 65 72 6f 20 3d 20 30 3b 0a  t32_t zero = 0;.
2ce80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce90 70 77 72 69 74 65 28 6a 66 64 2c 20 26 7a 65 72  pwrite(jfd, &zer
2cea0 6f 2c 20 28 73 69 7a 65 5f 74 29 73 69 7a 65 2c  o, (size_t)size,
2ceb0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
2cec0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2ced0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2cee0 20 20 20 20 20 20 20 20 20 66 73 79 6e 63 28 6a           fsync(j
2cef0 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  fd);.          c
2cf00 6c 6f 73 65 28 6a 66 64 29 3b 0a 20 20 20 20 20  lose(jfd);.     
2cf10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2cf20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2cf30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74  SQLITE_OK;.}..st
2cf40 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 73  atic int unixUns
2cf50 61 66 65 54 72 75 6e 63 61 74 65 44 61 74 61 62  afeTruncateDatab
2cf60 61 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ase(unixFile *pF
2cf70 69 6c 65 29 7b 0a 20 20 2f 2a 20 74 68 69 73 20  ile){.  /* this 
2cf80 69 73 20 6e 61 73 74 79 20 26 20 62 61 64 2e 20  is nasty & bad. 
2cf90 20 64 65 73 74 72 75 63 74 69 6f 6e 20 77 69 74   destruction wit
2cfa0 68 20 70 72 65 6a 75 64 69 63 65 2e 20 20 77 65  h prejudice.  we
2cfb0 27 6c 6c 20 6c 6f 73 65 20 61 6c 6c 20 74 68 65  'll lose all the
2cfc0 0a 20 20 2a 2a 20 66 69 6c 65 20 6c 6f 63 6b 73  .  ** file locks
2cfd0 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
2cfe0 2c 20 68 6f 77 65 76 65 72 2e 20 73 71 6c 69 74  , however. sqlit
2cff0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20  e3_file_control 
2d000 77 6f 72 6b 73 20 70 72 6f 70 65 72 6c 79 2e 0a  works properly..
2d010 20 20 2a 2a 20 42 75 74 20 69 66 20 69 74 20 66    ** But if it f
2d020 61 69 6c 73 2c 20 74 68 69 73 20 77 6f 72 6b 73  ails, this works
2d030 20 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 0a 20   approximately. 
2d040 20 2a 2f 0a 20 20 63 68 61 72 20 6a 6f 75 72 6e   */.  char journ
2d050 61 6c 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45  alPath[MAXPATHLE
2d060 4e 5d 3b 0a 20 20 63 68 61 72 20 77 61 6c 50 61  N];.  char walPa
2d070 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a  th[MAXPATHLEN];.
2d080 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2d090 45 5f 4f 4b 3b 0a 20 20 0a 23 69 66 64 65 66 20  E_OK;.  .#ifdef 
2d0a0 44 45 42 55 47 0a 20 20 66 70 72 69 6e 74 66 28  DEBUG.  fprintf(
2d0b0 73 74 64 65 72 72 2c 20 22 46 6f 72 63 65 20 74  stderr, "Force t
2d0c0 72 75 6e 63 61 74 69 6e 67 20 64 61 74 61 62 61  runcating databa
2d0d0 73 65 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  se %s\n", pFile-
2d0e0 3e 7a 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a  >zPath);.#endif.
2d0f0 20 20 73 74 72 6c 63 70 79 28 6a 6f 75 72 6e 61    strlcpy(journa
2d100 6c 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 7a 50  lPath, pFile->zP
2d110 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
2d120 3b 0a 20 20 73 74 72 6c 63 61 74 28 6a 6f 75 72  ;.  strlcat(jour
2d130 6e 61 6c 50 61 74 68 2c 20 22 2d 6a 6f 75 72 6e  nalPath, "-journ
2d140 61 6c 22 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  al", MAXPATHLEN)
2d150 3b 0a 20 20 73 74 72 6c 63 70 79 28 77 61 6c 50  ;.  strlcpy(walP
2d160 61 74 68 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ath, pFile->zPat
2d170 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
2d180 20 20 73 74 72 6c 63 61 74 28 77 61 6c 50 61 74    strlcat(walPat
2d190 68 2c 20 22 2d 77 61 6c 22 2c 20 4d 41 58 50 41  h, "-wal", MAXPA
2d1a0 54 48 4c 45 4e 29 3b 0a 20 20 69 6e 74 20 66 64  THLEN);.  int fd
2d1b0 31 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  1 = pFile->h;.  
2d1c0 69 6e 74 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a  int result = 0;.
2d1d0 20 20 72 65 73 75 6c 74 20 3d 20 66 74 72 75 6e    result = ftrun
2d1e0 63 61 74 65 28 66 64 31 2c 20 30 6c 6c 29 3b 0a  cate(fd1, 0ll);.
2d1f0 20 20 69 66 20 28 72 65 73 75 6c 74 29 20 7b 0a    if (result) {.
2d200 20 20 20 20 72 65 73 75 6c 74 20 3d 20 65 72 72      result = err
2d210 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 20 28 72 65  no;.  }.  if (re
2d220 73 75 6c 74 29 20 7b 0a 20 20 20 20 72 63 20 3d  sult) {.    rc =
2d230 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
2d240 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
2d250 6f 28 70 46 69 6c 65 2c 20 72 65 73 75 6c 74 29  o(pFile, result)
2d260 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 6e 74 20 66  ;.  }.  .  int f
2d270 64 32 20 3d 20 6f 70 65 6e 28 6a 6f 75 72 6e 61  d2 = open(journa
2d280 6c 50 61 74 68 2c 20 4f 5f 52 44 57 52 29 3b 0a  lPath, O_RDWR);.
2d290 20 20 69 6e 74 20 72 65 73 75 6c 74 32 20 3d 20    int result2 = 
2d2a0 30 3b 0a 20 20 69 66 20 28 66 64 32 20 3c 20 30  0;.  if (fd2 < 0
2d2b0 29 20 7b 0a 20 20 20 20 69 66 20 28 65 72 72 6e  ) {.    if (errn
2d2c0 6f 20 21 3d 20 45 4e 4f 45 4e 54 29 20 7b 0a 20  o != ENOENT) {. 
2d2d0 20 20 20 20 20 72 65 73 75 6c 74 32 20 3d 20 65       result2 = e
2d2e0 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65  rrno;.    } else
2d2f0 20 7b 0a 20 20 20 20 20 20 72 65 73 75 6c 74 32   {.      result2
2d300 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 20   = 0;.    }.  } 
2d310 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 73 75 6c  else {.    resul
2d320 74 32 20 3d 20 66 74 72 75 6e 63 61 74 65 28 66  t2 = ftruncate(f
2d330 64 32 2c 20 30 6c 6c 29 3b 0a 20 20 20 20 69 66  d2, 0ll);.    if
2d340 20 28 72 65 73 75 6c 74 32 29 20 7b 0a 20 20 20   (result2) {.   
2d350 20 20 20 72 65 73 75 6c 74 32 20 3d 20 65 72 72     result2 = err
2d360 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  no;.    }.  }.  
2d370 69 66 20 28 72 65 73 75 6c 74 32 20 26 26 20 21  if (result2 && !
2d380 72 65 73 75 6c 74 29 20 7b 0a 20 20 20 20 72 63  result) {.    rc
2d390 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b   = SQLITE_IOERR;
2d3a0 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
2d3b0 72 6e 6f 28 70 46 69 6c 65 2c 20 72 65 73 75 6c  rno(pFile, resul
2d3c0 74 32 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 6e  t2);.  }.  .  in
2d3d0 74 20 66 64 33 20 3d 20 6f 70 65 6e 28 77 61 6c  t fd3 = open(wal
2d3e0 50 61 74 68 2c 20 4f 5f 52 44 57 52 29 3b 0a 20  Path, O_RDWR);. 
2d3f0 20 69 6e 74 20 72 65 73 75 6c 74 33 20 3d 20 30   int result3 = 0
2d400 3b 0a 20 20 69 66 20 28 66 64 33 20 3c 20 30 29  ;.  if (fd3 < 0)
2d410 20 7b 0a 20 20 20 20 69 66 20 28 65 72 72 6e 6f   {.    if (errno
2d420 20 21 3d 20 45 4e 4f 45 4e 54 29 20 7b 0a 20 20   != ENOENT) {.  
2d430 20 20 20 20 72 65 73 75 6c 74 33 20 3d 20 65 72      result3 = er
2d440 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  rno;.    } else 
2d450 7b 0a 20 20 20 20 20 20 72 65 73 75 6c 74 33 20  {.      result3 
2d460 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65  = 0;.    }.  } e
2d470 6c 73 65 20 7b 0a 20 20 20 20 72 65 73 75 6c 74  lse {.    result
2d480 33 20 3d 20 66 74 72 75 6e 63 61 74 65 28 66 64  3 = ftruncate(fd
2d490 33 2c 20 30 6c 6c 29 3b 0a 20 20 20 20 69 66 20  3, 0ll);.    if 
2d4a0 28 72 65 73 75 6c 74 33 29 20 7b 0a 20 20 20 20  (result3) {.    
2d4b0 20 20 72 65 73 75 6c 74 33 20 3d 20 65 72 72 6e    result3 = errn
2d4c0 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  o;.    }.  }.  i
2d4d0 66 20 28 72 65 73 75 6c 74 33 20 26 26 20 21 28  f (result3 && !(
2d4e0 72 65 73 75 6c 74 20 7c 7c 20 72 65 73 75 6c 74  result || result
2d4f0 32 29 29 20 7b 0a 20 20 20 20 72 63 20 3d 20 53  2)) {.    rc = S
2d500 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
2d510 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
2d520 70 46 69 6c 65 2c 20 72 65 73 75 6c 74 32 29 3b  pFile, result2);
2d530 0a 20 20 7d 0a 20 20 0a 20 20 69 66 20 28 66 64  .  }.  .  if (fd
2d540 33 20 3e 3d 20 30 29 20 7b 0a 20 20 20 20 66 73  3 >= 0) {.    fs
2d550 79 6e 63 28 66 64 33 29 3b 0a 20 20 20 20 63 6c  ync(fd3);.    cl
2d560 6f 73 65 28 66 64 33 29 3b 0a 20 20 7d 0a 20 20  ose(fd3);.  }.  
2d570 69 66 20 28 66 64 32 20 3e 3d 20 30 29 20 7b 0a  if (fd2 >= 0) {.
2d580 20 20 20 20 66 73 79 6e 63 28 66 64 32 29 3b 0a      fsync(fd2);.
2d590 20 20 20 20 63 6c 6f 73 65 28 66 64 32 29 3b 0a      close(fd2);.
2d5a0 20 20 7d 0a 20 20 66 73 79 6e 63 28 66 64 31 29    }.  fsync(fd1)
2d5b0 3b 0a 09 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ;...  return rc;
2d5c0 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .}..static int u
2d5d0 6e 69 78 54 72 75 6e 63 61 74 65 44 61 74 61 62  nixTruncateDatab
2d5e0 61 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ase(unixFile *pF
2d5f0 69 6c 65 2c 20 69 6e 74 20 62 46 6c 61 67 73 29  ile, int bFlags)
2d600 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c   {.  sqlite3_fil
2d610 65 20 2a 69 64 20 3d 20 28 73 71 6c 69 74 65 33  e *id = (sqlite3
2d620 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
2d630 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2d640 5f 4f 4b 3b 0a 20 20 76 6f 69 64 20 2a 70 4c 6f  _OK;.  void *pLo
2d650 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 69 6e 74  ck = NULL;.  int
2d660 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 69 6e   flags = 0;.  in
2d670 74 20 63 6f 72 72 75 70 74 46 69 6c 65 4c 6f 63  t corruptFileLoc
2d680 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 43  k = 0;.  int isC
2d690 6f 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 69 6e  orrupt = 0;.  in
2d6a0 74 20 66 6f 72 63 65 20 3d 20 28 62 46 6c 61 67  t force = (bFlag
2d6b0 73 20 26 20 53 51 4c 49 54 45 5f 54 52 55 4e 43  s & SQLITE_TRUNC
2d6c0 41 54 45 5f 46 4f 52 43 45 29 3b 0a 20 20 69 6e  ATE_FORCE);.  in
2d6d0 74 20 73 61 66 65 46 61 69 6c 65 64 20 3d 20 30  t safeFailed = 0
2d6e0 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  ;..#if SQLITE_EN
2d6f0 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43  ABLE_DATA_PROTEC
2d700 54 49 4f 4e 0a 20 20 66 6c 61 67 73 20 7c 3d 20  TION.  flags |= 
2d710 70 46 69 6c 65 2d 3e 70 72 6f 74 46 6c 61 67 73  pFile->protFlags
2d720 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
2d730 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2d740 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 69  NG_STYLE.  if( i
2d750 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64  sProxyLockingMod
2d760 65 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  e(pFile) ){.    
2d770 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
2d780 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 3b 0a  OPEN_AUTOPROXY;.
2d790 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
2d7a0 72 63 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f  rc = sqlite3demo
2d7b0 5f 73 75 70 65 72 6c 6f 63 6b 28 70 46 69 6c 65  _superlock(pFile
2d7c0 2d 3e 7a 50 61 74 68 2c 20 30 2c 20 66 6c 61 67  ->zPath, 0, flag
2d7d0 73 2c 20 30 2c 20 30 2c 20 26 70 4c 6f 63 6b 29  s, 0, 0, &pLock)
2d7e0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
2d7f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2d800 5f 43 4f 52 52 55 50 54 20 7c 7c 20 72 63 3d 3d  _CORRUPT || rc==
2d810 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 29 7b  SQLITE_NOTADB ){
2d820 0a 20 20 20 20 20 20 69 73 43 6f 72 72 75 70 74  .      isCorrupt
2d830 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 1;.      rc =
2d840 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70   sqlite3demo_sup
2d850 65 72 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 69  erlock_corrupt(i
2d860 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45  d, SQLITE_LOCK_E
2d870 58 43 4c 55 53 49 56 45 2c 0a 20 20 20 20 20 20  XCLUSIVE,.      
2d880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d8a0 20 20 20 26 63 6f 72 72 75 70 74 46 69 6c 65 4c     &corruptFileL
2d8b0 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ock);.    }.    
2d8c0 69 66 28 20 72 63 20 26 26 20 21 66 6f 72 63 65  if( rc && !force
2d8d0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2d8e0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
2d8f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f  c = SQLITE_OK; /
2d900 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 6c 6f 63  * Ignore the loc
2d910 6b 69 6e 67 20 66 61 69 6c 75 72 65 20 69 66 20  king failure if 
2d920 66 6f 72 63 65 20 69 73 20 74 72 75 65 20 2a 2f  force is true */
2d930 0a 20 20 7d 0a 20 20 69 66 28 20 28 62 46 6c 61  .  }.  if( (bFla
2d940 67 73 26 53 51 4c 49 54 45 5f 54 52 55 4e 43 41  gs&SQLITE_TRUNCA
2d950 54 45 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 48 45  TE_INITIALIZE_HE
2d960 41 44 45 52 5f 4d 41 53 4b 29 21 3d 30 20 29 7b  ADER_MASK)!=0 ){
2d970 0a 20 20 20 20 2f 2a 20 69 6e 69 74 69 61 6c 69  .    /* initiali
2d980 7a 65 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  ze a new databas
2d990 65 20 69 6e 20 54 4d 50 44 49 52 20 61 6e 64 20  e in TMPDIR and 
2d9a0 63 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74  copy the content
2d9b0 73 20 6f 76 65 72 20 2a 2f 0a 20 20 20 20 63 6f  s over */.    co
2d9c0 6e 73 74 20 63 68 61 72 20 2a 74 44 69 72 20 3d  nst char *tDir =
2d9d0 20 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72   unixTempFileDir
2d9e0 28 29 3b 0a 20 20 20 20 69 6e 74 20 74 44 69 72  ();.    int tDir
2d9f0 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 74 44 69  Len = strlen(tDi
2da00 72 29 3b 0a 20 20 20 20 69 6e 74 20 74 4c 65 6e  r);.    int tLen
2da10 20 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 29 20   = sizeof(char) 
2da20 2a 20 28 74 44 69 72 4c 65 6e 20 2b 20 31 32 29  * (tDirLen + 12)
2da30 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 44 62 50  ;.    char *tDbP
2da40 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29 6d 61  ath = (char *)ma
2da50 6c 6c 6f 63 28 74 4c 65 6e 29 3b 0a 20 20 20 20  lloc(tLen);.    
2da60 69 6e 74 20 74 46 64 20 3d 20 2d 31 3b 0a 20 20  int tFd = -1;.  
2da70 20 20 0a 20 20 20 20 73 74 72 6c 63 70 79 28 74    .    strlcpy(t
2da80 44 62 50 61 74 68 2c 20 74 44 69 72 2c 20 74 4c  DbPath, tDir, tL
2da90 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 74 44 62  en);.    if( tDb
2daa0 50 61 74 68 5b 28 74 44 69 72 4c 65 6e 2d 31 29  Path[(tDirLen-1)
2dab0 5d 20 21 3d 20 27 2f 27 20 29 7b 0a 20 20 20 20  ] != '/' ){.    
2dac0 20 20 73 74 72 6c 63 61 74 28 74 44 62 50 61 74    strlcat(tDbPat
2dad0 68 2c 20 22 2f 74 6d 70 64 62 58 58 58 58 58 22  h, "/tmpdbXXXXX"
2dae0 2c 20 74 4c 65 6e 29 3b 0a 20 20 20 20 7d 20 65  , tLen);.    } e
2daf0 6c 73 65 20 7b 0a 20 20 20 20 20 20 73 74 72 6c  lse {.      strl
2db00 63 61 74 28 74 44 62 50 61 74 68 2c 20 22 74 6d  cat(tDbPath, "tm
2db10 70 64 62 58 58 58 58 58 22 2c 20 74 4c 65 6e 29  pdbXXXXX", tLen)
2db20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 46 64 20  ;.    }.    tFd 
2db30 3d 20 6d 6b 73 74 65 6d 70 28 74 44 62 50 61 74  = mkstemp(tDbPat
2db40 68 29 3b 0a 20 20 20 20 69 66 28 20 74 46 64 3d  h);.    if( tFd=
2db50 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 73 74 6f  =-1 ){.      sto
2db60 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
2db70 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
2db80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
2db90 52 52 3b 0a 20 20 20 20 20 20 73 61 66 65 46 61  RR;.      safeFa
2dba0 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65  iled = 1;.    }e
2dbb0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2dbc0 65 33 20 2a 74 44 62 20 3d 20 4e 55 4c 4c 3b 0a  e3 *tDb = NULL;.
2dbd0 20 20 20 20 20 20 63 6f 70 79 66 69 6c 65 5f 73        copyfile_s
2dbe0 74 61 74 65 5f 74 20 73 3b 0a 20 20 20 20 20 20  tate_t s;.      
2dbf0 69 6e 74 20 74 72 63 20 3d 20 73 71 6c 69 74 65  int trc = sqlite
2dc00 33 5f 6f 70 65 6e 5f 76 32 28 74 44 62 50 61 74  3_open_v2(tDbPat
2dc10 68 2c 20 26 74 44 62 2c 0a 20 20 20 20 20 20 20  h, &tDb,.       
2dc20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c              (SQL
2dc30 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
2dc40 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  | SQLITE_OPEN_RE
2dc50 41 44 57 52 49 54 45 0a 20 20 20 20 20 20 20 20  ADWRITE.        
2dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
2dc70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f  SQLITE_OPEN_AUTO
2dc80 50 52 4f 58 59 29 2c 20 4e 55 4c 4c 29 3b 0a 20  PROXY), NULL);. 
2dc90 20 20 20 20 20 63 68 61 72 20 2a 65 72 72 6d 73       char *errms
2dca0 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  g = NULL;.      
2dcb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 20  const char *sql 
2dcc0 3d 20 22 22 3b 0a 20 20 20 20 20 20 69 66 28 20  = "";.      if( 
2dcd0 21 74 72 63 20 26 26 20 28 62 46 6c 61 67 73 26  !trc && (bFlags&
2dce0 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f  SQLITE_TRUNCATE_
2dcf0 50 41 47 45 53 49 5a 45 5f 4d 41 53 4b 29 20 29  PAGESIZE_MASK) )
2dd00 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
2dd10 63 68 61 72 20 70 61 67 65 73 69 7a 65 5f 73 71  char pagesize_sq
2dd20 6c 5b 34 5d 5b 32 32 5d 20 3d 20 7b 0a 20 20 20  l[4][22] = {.   
2dd30 20 20 20 20 20 20 20 22 70 72 61 67 6d 61 20 70         "pragma p
2dd40 61 67 65 5f 73 69 7a 65 3d 31 30 32 34 22 2c 0a  age_size=1024",.
2dd50 20 20 20 20 20 20 20 20 20 20 22 70 72 61 67 6d            "pragm
2dd60 61 20 70 61 67 65 5f 73 69 7a 65 3d 32 30 34 38  a page_size=2048
2dd70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 22 70 72  ",.          "pr
2dd80 61 67 6d 61 20 70 61 67 65 5f 73 69 7a 65 3d 34  agma page_size=4
2dd90 30 39 36 22 2c 0a 20 20 20 20 20 20 20 20 20 20  096",.          
2dda0 22 70 72 61 67 6d 61 20 70 61 67 65 5f 73 69 7a  "pragma page_siz
2ddb0 65 3d 38 31 39 32 22 20 0a 20 20 20 20 20 20 20  e=8192" .       
2ddc0 20 7d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   };.        int 
2ddd0 69 50 61 67 65 73 69 7a 65 20 3d 20 28 28 28 62  iPagesize = (((b
2dde0 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 54 52 55  Flags&SQLITE_TRU
2ddf0 4e 43 41 54 45 5f 50 41 47 45 53 49 5a 45 5f 4d  NCATE_PAGESIZE_M
2de00 41 53 4b 29 20 3e 3e 20 34 29 20 2d 20 31 29 3b  ASK) >> 4) - 1);
2de10 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2de20 20 69 50 61 67 65 73 69 7a 65 3e 3d 30 20 26 26   iPagesize>=0 &&
2de30 20 69 50 61 67 65 73 69 7a 65 3c 3d 34 20 29 3b   iPagesize<=4 );
2de40 0a 20 20 20 20 20 20 20 20 73 71 6c 20 3d 20 70  .        sql = p
2de50 61 67 65 73 69 7a 65 5f 73 71 6c 5b 69 50 61 67  agesize_sql[iPag
2de60 65 73 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20  esize];.        
2de70 74 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  trc = sqlite3_ex
2de80 65 63 28 74 44 62 2c 20 73 71 6c 2c 20 30 2c 20  ec(tDb, sql, 0, 
2de90 30 2c 20 26 65 72 72 6d 73 67 29 3b 0a 20 20 20  0, &errmsg);.   
2dea0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
2deb0 74 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 63  trc ){.        c
2dec0 6f 6e 73 74 20 63 68 61 72 20 61 75 74 6f 76 61  onst char autova
2ded0 63 75 75 6d 5f 73 71 6c 5b 33 5d 5b 32 31 5d 20  cuum_sql[3][21] 
2dee0 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 22 70  = {.          "p
2def0 72 61 67 6d 61 20 61 75 74 6f 5f 76 61 63 75 75  ragma auto_vacuu
2df00 6d 3d 30 22 2c 0a 20 20 20 20 20 20 20 20 20 20  m=0",.          
2df10 22 70 72 61 67 6d 61 20 61 75 74 6f 5f 76 61 63  "pragma auto_vac
2df20 75 75 6d 3d 31 22 2c 0a 20 20 20 20 20 20 20 20  uum=1",.        
2df30 20 20 22 70 72 61 67 6d 61 20 61 75 74 6f 5f 76    "pragma auto_v
2df40 61 63 75 75 6d 3d 32 22 0a 20 20 20 20 20 20 20  acuum=2".       
2df50 20 7d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   };.        int 
2df60 69 41 75 74 6f 76 61 63 75 75 6d 20 3d 20 32 3b  iAutovacuum = 2;
2df70 20 2f 2a 20 64 65 66 61 75 6c 74 20 74 6f 20 69   /* default to i
2df80 6e 63 72 65 6d 65 6e 74 61 6c 20 2a 2f 0a 20 20  ncremental */.  
2df90 20 20 20 20 20 20 69 66 28 20 28 62 46 6c 61 67        if( (bFlag
2dfa0 73 26 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54  s&SQLITE_TRUNCAT
2dfb0 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4d 41 53  E_AUTOVACUUM_MAS
2dfc0 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  K) ){.          
2dfd0 69 41 75 74 6f 76 61 63 75 75 6d 20 3d 20 28 28  iAutovacuum = ((
2dfe0 28 62 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 54  (bFlags&SQLITE_T
2dff0 52 55 4e 43 41 54 45 5f 41 55 54 4f 56 41 43 55  RUNCATE_AUTOVACU
2e000 55 4d 5f 4d 41 53 4b 29 20 3e 3e 20 32 29 20 2d  UM_MASK) >> 2) -
2e010 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   1);.        }. 
2e020 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
2e030 41 75 74 6f 76 61 63 75 75 6d 3e 3d 30 20 26 26  Autovacuum>=0 &&
2e040 20 69 41 75 74 6f 76 61 63 75 75 6d 3c 3d 32 20   iAutovacuum<=2 
2e050 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 20 3d  );.        sql =
2e060 20 61 75 74 6f 76 61 63 75 75 6d 5f 73 71 6c 5b   autovacuum_sql[
2e070 69 41 75 74 6f 76 61 63 75 75 6d 5d 3b 0a 20 20  iAutovacuum];.  
2e080 20 20 20 20 20 20 74 72 63 20 3d 20 73 71 6c 69        trc = sqli
2e090 74 65 33 5f 65 78 65 63 28 74 44 62 2c 20 73 71  te3_exec(tDb, sq
2e0a0 6c 2c 20 30 2c 20 30 2c 20 26 65 72 72 6d 73 67  l, 0, 0, &errmsg
2e0b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2e0c0 20 69 66 28 20 21 74 72 63 20 26 26 20 28 62 46   if( !trc && (bF
2e0d0 6c 61 67 73 26 53 51 4c 49 54 45 5f 54 52 55 4e  lags&SQLITE_TRUN
2e0e0 43 41 54 45 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  CATE_JOURNALMODE
2e0f0 5f 57 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  _WAL) ){.       
2e100 20 73 71 6c 20 3d 20 22 70 72 61 67 6d 61 20 6a   sql = "pragma j
2e110 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22  ournal_mode=wal"
2e120 3b 0a 20 20 20 20 20 20 20 20 74 72 63 20 3d 20  ;.        trc = 
2e130 73 71 6c 69 74 65 33 5f 65 78 65 63 28 74 44 62  sqlite3_exec(tDb
2e140 2c 20 73 71 6c 2c 20 30 2c 20 30 2c 20 26 65 72  , sql, 0, 0, &er
2e150 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rmsg);.      }. 
2e160 20 20 20 20 20 69 66 28 20 74 72 63 20 29 7b 0a       if( trc ){.
2e170 20 20 20 20 20 20 20 20 69 66 28 20 21 74 44 62          if( !tDb
2e180 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70   ){.          fp
2e190 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
2e1a0 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 65  ailed to open te
2e1b0 6d 70 20 64 61 74 61 62 61 73 65 20 27 25 73 27  mp database '%s'
2e1c0 20 74 6f 20 72 65 73 65 74 20 22 0a 20 20 20 20   to reset ".    
2e1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1e0 20 20 20 20 20 20 22 74 72 75 6e 63 61 74 65 64        "truncated
2e1f0 20 64 61 74 61 62 61 73 65 20 25 73 20 77 69 74   database %s wit
2e200 68 20 66 6c 61 67 73 20 25 78 3a 20 25 64 5c 6e  h flags %x: %d\n
2e210 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2e220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 44                tD
2e230 62 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 7a 50  bPath, pFile->zP
2e240 61 74 68 2c 20 62 46 6c 61 67 73 2c 20 74 72 63  ath, bFlags, trc
2e250 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2e260 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  {.          fpri
2e270 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 61 69  ntf(stderr, "fai
2e280 6c 65 64 20 74 6f 20 73 65 74 20 27 25 73 27 20  led to set '%s' 
2e290 6f 6e 20 74 72 75 6e 63 61 74 65 64 20 64 61 74  on truncated dat
2e2a0 61 62 61 73 65 20 25 73 2c 20 25 64 3a 20 22 0a  abase %s, %d: ".
2e2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2c0 20 20 20 20 20 20 20 20 20 20 22 25 73 5c 6e 22            "%s\n"
2e2d0 2c 20 73 71 6c 2c 20 70 46 69 6c 65 2d 3e 7a 50  , sql, pFile->zP
2e2e0 61 74 68 2c 20 74 72 63 2c 20 65 72 72 6d 73 67  ath, trc, errmsg
2e2f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2e300 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 74     }.      if( t
2e310 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  Db ){.        in
2e320 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  t off = 0;.     
2e330 20 20 20 2f 2a 20 6d 65 72 67 65 20 74 68 65 20     /* merge the 
2e340 77 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 62 20  wal into the db 
2e350 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
2e360 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
2e370 74 44 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54  tDb, NULL, SQLIT
2e380 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f  E_FCNTL_PERSIST_
2e390 57 41 4c 2c 20 26 6f 66 66 29 3b 0a 20 20 20 20  WAL, &off);.    
2e3a0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
2e3b0 65 28 74 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a  e(tDb);.      }.
2e3c0 20 20 20 20 20 20 73 20 3d 20 63 6f 70 79 66 69        s = copyfi
2e3d0 6c 65 5f 73 74 61 74 65 5f 61 6c 6c 6f 63 28 29  le_state_alloc()
2e3e0 3b 0a 20 20 20 20 20 20 6c 73 65 65 6b 28 74 46  ;.      lseek(tF
2e3f0 64 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b  d, 0, SEEK_SET);
2e400 0a 20 20 20 20 20 20 6c 73 65 65 6b 28 70 46 69  .      lseek(pFi
2e410 6c 65 2d 3e 68 2c 20 30 2c 20 53 45 45 4b 5f 53  le->h, 0, SEEK_S
2e420 45 54 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66  ET);.      if( f
2e430 63 6f 70 79 66 69 6c 65 28 74 46 64 2c 20 70 46  copyfile(tFd, pF
2e440 69 6c 65 2d 3e 68 2c 20 73 2c 20 43 4f 50 59 46  ile->h, s, COPYF
2e450 49 4c 45 5f 44 41 54 41 29 20 29 7b 0a 20 20 20  ILE_DATA) ){.   
2e460 20 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72       int err=err
2e470 6e 6f 3b 0a 20 20 20 20 20 20 20 20 73 77 69 74  no;.        swit
2e480 63 68 28 65 72 72 29 20 7b 0a 20 20 20 20 20 20  ch(err) {.      
2e490 20 20 20 20 63 61 73 65 20 45 4e 4f 4d 45 4d 3a      case ENOMEM:
2e4a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 63  .            trc
2e4b0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2e4c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
2e4d0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 64 65  ak;.          de
2e4e0 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20  fault:.         
2e4f0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
2e500 6f 28 70 46 69 6c 65 2c 20 65 72 72 29 3b 0a 20  o(pFile, err);. 
2e510 20 20 20 20 20 20 20 20 20 20 20 74 72 63 20 3d             trc =
2e520 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
2e530 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2e540 0a 20 20 20 20 20 20 63 6f 70 79 66 69 6c 65 5f  .      copyfile_
2e550 73 74 61 74 65 5f 66 72 65 65 28 73 29 3b 0a 20  state_free(s);. 
2e560 20 20 20 20 20 66 73 79 6e 63 28 70 46 69 6c 65       fsync(pFile
2e570 2d 3e 68 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73  ->h);.      clos
2e580 65 28 74 46 64 29 3b 0a 20 20 20 20 20 20 75 6e  e(tFd);.      un
2e590 6c 69 6e 6b 28 74 44 62 50 61 74 68 29 3b 0a 20  link(tDbPath);. 
2e5a0 20 20 20 20 20 69 66 28 20 74 72 63 21 3d 53 51       if( trc!=SQ
2e5b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e5c0 20 20 20 73 61 66 65 46 61 69 6c 65 64 20 3d 20     safeFailed = 
2e5d0 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  1;.        rc = 
2e5e0 74 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  trc;.      }.   
2e5f0 20 7d 0a 20 20 20 20 66 72 65 65 28 74 44 62 50   }.    free(tDbP
2e600 61 74 68 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  ath);.  } else {
2e610 0a 20 20 20 20 72 63 20 3d 20 70 46 69 6c 65 2d  .    rc = pFile-
2e620 3e 70 4d 65 74 68 6f 64 2d 3e 78 54 72 75 6e 63  >pMethod->xTrunc
2e630 61 74 65 28 69 64 2c 20 0a 20 20 20 20 20 20 20  ate(id, .       
2e640 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 66 73 46      ((pFile->fsF
2e650 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 53  lags & SQLITE_FS
2e660 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29 20  FLAGS_IS_MSDOS) 
2e670 21 3d 20 30 29 20 3f 20 31 4c 20 3a 20 30 4c 29  != 0) ? 1L : 0L)
2e680 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
2e690 20 20 20 20 20 20 73 61 66 65 46 61 69 6c 65 64        safeFailed
2e6a0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
2e6b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e6c0 5f 4f 4b 20 7c 7c 20 66 6f 72 63 65 20 29 7b 0a  _OK || force ){.
2e6d0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 49 6e 76      rc = unixInv
2e6e0 61 6c 69 64 61 74 65 53 75 70 70 6f 72 74 46 69  alidateSupportFi
2e6f0 6c 65 73 28 70 46 69 6c 65 2c 20 30 29 3b 0a 20  les(pFile, 0);. 
2e700 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2e710 20 20 20 73 61 66 65 46 61 69 6c 65 64 20 3d 20     safeFailed = 
2e720 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
2e730 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
2e740 53 79 6e 63 28 69 64 2c 20 53 51 4c 49 54 45 5f  Sync(id, SQLITE_
2e750 53 59 4e 43 5f 46 55 4c 4c 29 3b 0a 0a 0a 20 20  SYNC_FULL);...  
2e760 69 66 28 20 69 73 43 6f 72 72 75 70 74 20 29 7b  if( isCorrupt ){
2e770 0a 20 20 20 20 73 71 6c 69 74 65 33 64 65 6d 6f  .    sqlite3demo
2e780 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 5f 63 6f 72  _superunlock_cor
2e790 72 75 70 74 28 69 64 2c 20 63 6f 72 72 75 70 74  rupt(id, corrupt
2e7a0 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 7d 65 6c  FileLock);.  }el
2e7b0 73 65 20 69 66 28 20 70 4c 6f 63 6b 20 29 7b 0a  se if( pLock ){.
2e7c0 20 20 20 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f      sqlite3demo_
2e7d0 73 75 70 65 72 75 6e 6c 6f 63 6b 28 70 4c 6f 63  superunlock(pLoc
2e7e0 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  k);.  }else{.   
2e7f0 20 61 73 73 65 72 74 28 66 6f 72 63 65 29 3b 0a   assert(force);.
2e800 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 66 6f 72    }.  .  if( for
2e810 63 65 20 26 26 20 73 61 66 65 46 61 69 6c 65 64  ce && safeFailed
2e820 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78  ){.    rc = unix
2e830 55 6e 73 61 66 65 54 72 75 6e 63 61 74 65 44 61  UnsafeTruncateDa
2e840 74 61 62 61 73 65 28 70 46 69 6c 65 29 3b 0a 20  tabase(pFile);. 
2e850 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72   }.  .  return r
2e860 63 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 4c 6f 63  c;.}../*. ** Loc
2e870 6b 20 6c 6f 63 61 74 69 6f 6e 73 20 66 6f 72 20  k locations for 
2e880 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6c 6f  shared-memory lo
2e890 63 6b 73 20 75 73 65 64 20 62 79 20 57 41 4c 20  cks used by WAL 
2e8a0 6d 6f 64 65 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65  mode.. */.#ifnde
2e8b0 66 20 53 48 4d 5f 42 41 53 45 0a 23 20 64 65 66  f SHM_BASE.# def
2e8c0 69 6e 65 20 53 48 4d 5f 42 41 53 45 20 20 20 20  ine SHM_BASE    
2e8d0 20 20 20 20 20 20 31 32 30 0a 23 20 64 65 66 69        120.# defi
2e8e0 6e 65 20 53 48 4d 5f 57 52 49 54 45 20 20 20 20  ne SHM_WRITE    
2e8f0 20 20 20 20 20 53 48 4d 5f 42 41 53 45 0a 23 20       SHM_BASE.# 
2e900 64 65 66 69 6e 65 20 53 48 4d 5f 43 48 45 43 4b  define SHM_CHECK
2e910 50 4f 49 4e 54 20 20 20 20 28 53 48 4d 5f 42 41  POINT    (SHM_BA
2e920 53 45 2b 31 29 0a 23 20 64 65 66 69 6e 65 20 53  SE+1).# define S
2e930 48 4d 5f 52 45 43 4f 56 45 52 20 20 20 20 20 20  HM_RECOVER      
2e940 20 28 53 48 4d 5f 42 41 53 45 2b 32 29 0a 23 20   (SHM_BASE+2).# 
2e950 64 65 66 69 6e 65 20 53 48 4d 5f 52 45 41 44 5f  define SHM_READ_
2e960 46 49 52 53 54 20 20 20 20 28 53 48 4d 5f 42 41  FIRST    (SHM_BA
2e970 53 45 2b 33 29 0a 23 20 64 65 66 69 6e 65 20 53  SE+3).# define S
2e980 48 4d 5f 52 45 41 44 5f 53 49 5a 45 20 20 20 20  HM_READ_SIZE    
2e990 20 35 0a 23 65 6e 64 69 66 20 2f 2a 20 53 48 4d   5.#endif /* SHM
2e9a0 5f 42 41 53 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _BASE */../*.** 
2e9b0 54 68 69 73 20 74 65 73 74 20 6f 6e 6c 79 20 77  This test only w
2e9c0 6f 72 6b 73 20 66 6f 72 20 6c 6f 63 6b 20 74 65  orks for lock te
2e9d0 73 74 69 6e 67 20 6f 6e 20 75 6e 69 78 2f 70 6f  sting on unix/po
2e9e0 73 69 78 20 56 46 53 2e 0a 2a 2a 20 41 64 61 70  six VFS..** Adap
2e9f0 74 65 64 20 66 72 6f 6d 20 74 6f 6f 6c 2f 67 65  ted from tool/ge
2ea00 74 6c 6f 63 6b 2e 63 20 66 34 63 33 39 62 36 35  tlock.c f4c39b65
2ea10 31 33 37 30 31 35 36 63 61 65 39 37 39 35 30 31  1370156cae979501
2ea20 61 37 62 31 35 36 62 64 62 61 35 30 65 37 63 65  a7b156bdba50e7ce
2ea30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2ea40 6e 69 78 4c 6f 63 6b 73 74 61 74 65 50 69 64 28  nixLockstatePid(
2ea50 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
2ea60 20 70 69 64 5f 74 20 70 69 64 2c 20 69 6e 74 20   pid_t pid, int 
2ea70 2a 70 4c 6f 63 6b 73 74 61 74 65 29 7b 0a 20 20  *pLockstate){.  
2ea80 69 6e 74 20 68 44 62 3b 20 20 20 20 20 20 20 20  int hDb;        
2ea90 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
2eaa0 6f 72 20 66 6f 72 20 74 68 65 20 6f 70 65 6e 20  or for the open 
2eab0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2eac0 0a 20 20 69 6e 74 20 68 53 68 6d 20 3d 20 2d 31  .  int hShm = -1
2ead0 3b 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72  ;  /* File descr
2eae0 69 70 74 6f 72 20 66 6f 72 20 57 41 4c 20 73 68  iptor for WAL sh
2eaf0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
2eb00 20 2a 2f 0a 20 20 73 73 69 7a 65 5f 74 20 67 6f   */.  ssize_t go
2eb10 74 3b 20 20 20 20 2f 2a 20 42 79 74 65 73 20 72  t;    /* Bytes r
2eb20 65 61 64 20 66 72 6f 6d 20 68 65 61 64 65 72 20  ead from header 
2eb30 2a 2f 0a 20 20 69 6e 74 20 69 73 57 61 6c 20 3d  */.  int isWal =
2eb40 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2eb50 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20 57 41  /* True if in WA
2eb60 4c 20 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  L mode */.  int 
2eb70 6e 4c 6f 63 6b 20 3d 20 30 3b 20 20 20 20 20 20  nLock = 0;      
2eb80 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2eb90 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a   of locks held *
2eba0 2f 0a 20 20 69 6e 74 20 6e 6f 48 64 72 20 3d 20  /.  int noHdr = 
2ebb0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2ebc0 2a 20 5a 65 72 6f 20 62 79 74 65 20 44 42 20 68  * Zero byte DB h
2ebd0 61 73 20 6e 6f 20 68 65 61 64 65 72 20 2a 2f 0a  as no header */.
2ebe0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2ebf0 61 48 64 72 5b 31 30 30 5d 3b 20 20 20 2f 2a 20  aHdr[100];   /* 
2ec00 44 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  Database header 
2ec10 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 70  */.  .  assert(p
2ec20 4c 6f 63 6b 73 74 61 74 65 29 3b 0a 20 20 0a 20  Lockstate);.  . 
2ec30 20 2f 2a 20 6d 61 6b 65 20 73 75 72 65 20 77 65   /* make sure we
2ec40 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
2ec50 68 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  h a database fil
2ec60 65 20 2a 2f 0a 20 20 68 44 62 20 3d 20 70 46 69  e */.  hDb = pFi
2ec70 6c 65 2d 3e 68 3b 0a 20 20 69 66 28 20 68 44 62  le->h;.  if( hDb
2ec80 3c 30 20 29 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b  <0 ){.    *pLock
2ec90 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c  state = SQLITE_L
2eca0 4f 43 4b 53 54 41 54 45 5f 45 52 52 4f 52 3b 0a  OCKSTATE_ERROR;.
2ecb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ecc0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61  E_ERROR;.  }.  a
2ecd0 73 73 65 72 74 28 20 28 73 74 72 6c 65 6e 28 53  ssert( (strlen(S
2ece0 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41 44 45  QLITE_FILE_HEADE
2ecf0 52 29 2b 31 29 3d 3d 53 51 4c 49 54 45 5f 46 49  R)+1)==SQLITE_FI
2ed00 4c 45 5f 48 45 41 44 45 52 5f 4c 45 4e 20 29 3b  LE_HEADER_LEN );
2ed10 0a 20 20 67 6f 74 20 3d 20 70 72 65 61 64 28 68  .  got = pread(h
2ed20 44 62 2c 20 61 48 64 72 2c 20 31 30 30 2c 20 30  Db, aHdr, 100, 0
2ed30 29 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29  );.  if( got<0 )
2ed40 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61 74  {.    *pLockstat
2ed50 65 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53  e = SQLITE_LOCKS
2ed60 54 41 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  TATE_ERROR;.    
2ed70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2ed80 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
2ed90 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 6f 48  ot==0 ){.    noH
2eda0 64 72 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  dr = 1;.  }else 
2edb0 69 66 28 20 67 6f 74 21 3d 31 30 30 0a 20 20 20  if( got!=100.   
2edc0 20 20 20 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28        || memcmp(
2edd0 61 48 64 72 2c 20 53 51 4c 49 54 45 5f 46 49 4c  aHdr, SQLITE_FIL
2ede0 45 5f 48 45 41 44 45 52 2c 20 53 51 4c 49 54 45  E_HEADER, SQLITE
2edf0 5f 46 49 4c 45 5f 48 45 41 44 45 52 5f 4c 45 4e  _FILE_HEADER_LEN
2ee00 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2a 70  )!=0.  ){.    *p
2ee10 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53 51 4c 49  Lockstate = SQLI
2ee20 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4e 4f 54  TE_LOCKSTATE_NOT
2ee30 41 44 42 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ADB;.    return 
2ee40 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
2ee50 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 72 73 74   }.  .  /* First
2ee60 20 63 68 65 63 6b 20 66 6f 72 20 61 6e 20 65 78   check for an ex
2ee70 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
2ee80 20 20 6e 4c 6f 63 6b 20 2b 3d 20 75 6e 69 78 49    nLock += unixI
2ee90 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 44 62  sLocked(pid, hDb
2eea0 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48 41 52 45  , F_RDLCK, SHARE
2eeb0 44 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f  D_FIRST, SHARED_
2eec0 53 49 5a 45 2c 0a 20 20 20 20 20 20 20 20 20 20  SIZE,.          
2eed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 45                "E
2eee0 58 43 4c 55 53 49 56 45 22 29 3b 0a 20 20 69 66  XCLUSIVE");.  if
2eef0 20 28 21 6e 6f 48 64 72 29 20 7b 0a 20 20 20 20   (!noHdr) {.    
2ef00 69 73 57 61 6c 20 3d 20 61 48 64 72 5b 31 38 5d  isWal = aHdr[18]
2ef10 3d 3d 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  ==2;.  }.  if( n
2ef20 4c 6f 63 6b 3d 3d 30 20 26 26 20 69 73 57 61 6c  Lock==0 && isWal
2ef30 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 52 6f  ==0 ){.    /* Ro
2ef40 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 2a 2f 0a 20  llback mode */. 
2ef50 20 20 20 6e 4c 6f 63 6b 20 2b 3d 20 75 6e 69 78     nLock += unix
2ef60 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 44  IsLocked(pid, hD
2ef70 62 2c 20 46 5f 57 52 4c 43 4b 2c 20 50 45 4e 44  b, F_WRLCK, PEND
2ef80 49 4e 47 5f 42 59 54 45 2c 20 53 48 41 52 45 44  ING_BYTE, SHARED
2ef90 5f 53 49 5a 45 2b 32 2c 0a 20 20 20 20 20 20 20  _SIZE+2,.       
2efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2efb0 20 20 20 22 50 45 4e 44 49 4e 47 7c 52 45 53 45     "PENDING|RESE
2efc0 52 56 45 44 7c 53 48 41 52 45 44 22 29 3b 0a 20  RVED|SHARED");. 
2efd0 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 63 6b 3d 3d   }.  if( nLock==
2efe0 30 20 26 26 20 69 73 57 61 6c 21 3d 30 20 29 7b  0 && isWal!=0 ){
2eff0 0a 20 20 20 20 2f 2a 20 6c 6f 6f 6b 75 70 20 74  .    /* lookup t
2f000 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
2f010 6f 72 20 66 6f 72 20 74 68 65 20 73 68 61 72 65  or for the share
2f020 64 20 6d 65 6d 6f 72 79 20 66 69 6c 65 20 69 66  d memory file if
2f030 20 77 65 20 68 61 76 65 20 69 74 20 6f 70 65 6e   we have it open
2f040 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20  .    ** in this 
2f050 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 20 20 75  process */.    u
2f060 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
2f070 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c   /* Because pFil
2f080 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61  e->pInode is sha
2f090 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
2f0a0 64 73 20 2a 2f 0a 20 20 20 20 75 6e 69 78 53 68  ds */.    unixSh
2f0b0 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20  mNode *pShmNode 
2f0c0 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
2f0d0 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 69  >pShmNode;.    i
2f0e0 66 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20  f( pShmNode ){. 
2f0f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
2f100 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
2f110 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  e->mutex);.     
2f120 20 0a 20 20 20 20 20 20 68 53 68 6d 20 3d 20 70   .      hShm = p
2f130 53 68 6d 4e 6f 64 65 2d 3e 68 3b 0a 20 20 20 20  ShmNode->h;.    
2f140 20 20 69 66 28 20 68 53 68 6d 20 3e 3d 20 30 29    if( hShm >= 0)
2f150 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  {.        if( un
2f160 69 78 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20  ixIsLocked(pid, 
2f170 68 53 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53  hShm, F_RDLCK, S
2f180 48 4d 5f 52 45 43 4f 56 45 52 2c 20 31 2c 20 22  HM_RECOVER, 1, "
2f190 57 41 4c 2d 52 45 43 4f 56 45 52 59 22 29 20 7c  WAL-RECOVERY") |
2f1a0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 75 6e 69  |.           uni
2f1b0 78 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68  xIsLocked(pid, h
2f1c0 53 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48  Shm, F_RDLCK, SH
2f1d0 4d 5f 57 52 49 54 45 2c 20 31 2c 20 22 57 41 4c  M_WRITE, 1, "WAL
2f1e0 2d 57 52 49 54 45 22 29 20 29 7b 0a 20 20 20 20  -WRITE") ){.    
2f1f0 20 20 20 20 20 20 6e 4c 6f 63 6b 20 3d 20 31 3b        nLock = 1;
2f200 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f210 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
2f220 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
2f230 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
2f240 74 65 78 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20  tex);.    } .   
2f250 20 0a 20 20 20 20 69 66 28 20 68 53 68 6d 3c 30   .    if( hShm<0
2f260 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 74 68 65   ){.      /* the
2f270 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 66   shared memory f
2f280 69 6c 65 20 69 73 6e 27 74 20 6f 70 65 6e 20 69  ile isn't open i
2f290 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 73  n this process s
2f2a0 70 61 63 65 2c 20 6f 70 65 6e 20 6f 75 72 0a 20  pace, open our. 
2f2b0 20 20 20 20 20 2a 2a 20 6f 77 6e 20 46 44 20 2a       ** own FD *
2f2c0 2f 0a 20 20 20 20 20 20 63 68 61 72 20 7a 53 68  /.      char zSh
2f2d0 6d 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20  m[MAXPATHLEN];. 
2f2e0 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 57       .      /* W
2f2f0 41 4c 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 20  AL mode */.     
2f300 20 73 74 72 6c 63 70 79 28 7a 53 68 6d 2c 20 70   strlcpy(zShm, p
2f310 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58  File->zPath, MAX
2f320 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20  PATHLEN);.      
2f330 73 74 72 6c 63 61 74 28 7a 53 68 6d 2c 20 22 2d  strlcat(zShm, "-
2f340 73 68 6d 22 2c 20 4d 41 58 50 41 54 48 4c 45 4e  shm", MAXPATHLEN
2f350 29 3b 0a 20 20 20 20 20 20 68 53 68 6d 20 3d 20  );.      hShm = 
2f360 6f 70 65 6e 28 7a 53 68 6d 2c 20 4f 5f 52 44 4f  open(zShm, O_RDO
2f370 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  NLY, 0);.      i
2f380 66 28 20 68 53 68 6d 3c 30 20 29 7b 0a 20 20 20  f( hShm<0 ){.   
2f390 20 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61 74 65       *pLockstate
2f3a0 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54   = SQLITE_LOCKST
2f3b0 41 54 45 5f 4f 46 46 3b 0a 20 20 20 20 20 20 20  ATE_OFF;.       
2f3c0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2f3d0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2f3e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2f3f0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 75     }.      if( u
2f400 6e 69 78 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c  nixIsLocked(pid,
2f410 20 68 53 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20   hShm, F_RDLCK, 
2f420 53 48 4d 5f 52 45 43 4f 56 45 52 2c 20 31 2c 20  SHM_RECOVER, 1, 
2f430 22 57 41 4c 2d 52 45 43 4f 56 45 52 59 22 29 20  "WAL-RECOVERY") 
2f440 7c 7c 0a 20 20 20 20 20 20 20 20 20 75 6e 69 78  ||.         unix
2f450 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 53  IsLocked(pid, hS
2f460 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48 4d  hm, F_RDLCK, SHM
2f470 5f 57 52 49 54 45 2c 20 31 2c 20 22 57 41 4c 2d  _WRITE, 1, "WAL-
2f480 57 52 49 54 45 22 29 20 29 7b 0a 20 20 20 20 20  WRITE") ){.     
2f490 20 20 20 6e 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20     nLock = 1;.  
2f4a0 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 6f 73      }.      clos
2f4b0 65 28 68 53 68 6d 29 3b 0a 20 20 20 20 7d 0a 20  e(hShm);.    }. 
2f4c0 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
2f4d0 78 28 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  x();.  }.  if( n
2f4e0 4c 6f 63 6b 3e 30 20 29 7b 0a 20 20 20 20 2a 70  Lock>0 ){.    *p
2f4f0 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53 51 4c 49  Lockstate = SQLI
2f500 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4f 4e 3b  TE_LOCKSTATE_ON;
2f510 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
2f520 2a 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53 51  *pLockstate = SQ
2f530 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4f  LITE_LOCKSTATE_O
2f540 46 46 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  FF;.  }.  return
2f550 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
2f560 65 6e 64 69 66 20 2f 2a 20 28 53 51 4c 49 54 45  endif /* (SQLITE
2f570 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50  _ENABLE_APPLE_SP
2f580 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65 64 28  I>0) && defined(
2f590 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 0a 23  __APPLE__) */..#
2f5a0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
2f5b0 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20  AP_SIZE>0./*.** 
2f5c0 49 66 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  If it is current
2f5d0 6c 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64  ly memory mapped
2f5e0 2c 20 75 6e 6d 61 70 20 66 69 6c 65 20 70 46 64  , unmap file pFd
2f5f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2f600 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75   unixUnmapfile(u
2f610 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20  nixFile *pFd){. 
2f620 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46   assert( pFd->nF
2f630 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20  etchOut==0 );.  
2f640 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67  if( pFd->pMapReg
2f650 69 6f 6e 20 29 7b 0a 20 20 20 20 6f 73 4d 75 6e  ion ){.    osMun
2f660 6d 61 70 28 70 46 64 2d 3e 70 4d 61 70 52 65 67  map(pFd->pMapReg
2f670 69 6f 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70 53 69  ion, pFd->mmapSi
2f680 7a 65 41 63 74 75 61 6c 29 3b 0a 20 20 20 20 70  zeActual);.    p
2f690 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d  Fd->pMapRegion =
2f6a0 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61   0;.    pFd->mma
2f6b0 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  pSize = 0;.    p
2f6c0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
2f6d0 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  al = 0;.  }.}../
2f6e0 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
2f6f0 73 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  set the size of 
2f700 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  the memory mappi
2f710 6e 67 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79  ng maintained by
2f720 20 66 69 6c 65 20 0a 2a 2a 20 64 65 73 63 72 69   file .** descri
2f730 70 74 6f 72 20 70 46 64 20 74 6f 20 6e 4e 65 77  ptor pFd to nNew
2f740 20 62 79 74 65 73 2e 20 41 6e 79 20 65 78 69 73   bytes. Any exis
2f750 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20  ting mapping is 
2f760 64 69 73 63 61 72 64 65 64 2e 0a 2a 2a 0a 2a 2a  discarded..**.**
2f770 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
2f780 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  this function se
2f790 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ts the following
2f7a0 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a   variables:.**.*
2f7b0 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65  *       unixFile
2f7c0 2e 70 4d 61 70 52 65 67 69 6f 6e 0a 2a 2a 20 20  .pMapRegion.**  
2f7d0 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d       unixFile.mm
2f7e0 61 70 53 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20  apSize.**       
2f7f0 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a  unixFile.mmapSiz
2f800 65 41 63 74 75 61 6c 0a 2a 2a 0a 2a 2a 20 49 66  eActual.**.** If
2f810 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 61   unsuccessful, a
2f820 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
2f830 69 73 20 6c 6f 67 67 65 64 20 76 69 61 20 73 71  is logged via sq
2f840 6c 69 74 65 33 5f 6c 6f 67 28 29 20 61 6e 64 0a  lite3_log() and.
2f850 2a 2a 20 74 68 65 20 74 68 72 65 65 20 76 61 72  ** the three var
2f860 69 61 62 6c 65 73 20 61 62 6f 76 65 20 61 72 65  iables above are
2f870 20 7a 65 72 6f 65 64 2e 20 49 6e 20 74 68 69 73   zeroed. In this
2f880 20 63 61 73 65 20 53 51 4c 69 74 65 20 73 68 6f   case SQLite sho
2f890 75 6c 64 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 20  uld.** continue 
2f8a0 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 64 61  accessing the da
2f8b0 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65  tabase using the
2f8c0 20 78 52 65 61 64 28 29 20 61 6e 64 20 78 57 72   xRead() and xWr
2f8d0 69 74 65 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 73  ite().** methods
2f8e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2f8f0 20 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 0a   unixRemapfile(.
2f900 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c    unixFile *pFd,
2f910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f920 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
2f930 70 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ptor object */. 
2f940 20 69 36 34 20 6e 4e 65 77 20 20 20 20 20 20 20   i64 nNew       
2f950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f960 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6d 61 70   /* Required map
2f970 70 69 6e 67 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a  ping size */.){.
2f980 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
2f990 72 72 20 3d 20 22 6d 6d 61 70 22 3b 0a 20 20 69  rr = "mmap";.  i
2f9a0 6e 74 20 68 20 3d 20 70 46 64 2d 3e 68 3b 20 20  nt h = pFd->h;  
2f9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f9c0 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
2f9d0 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 64  riptor open on d
2f9e0 62 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a  b file */.  u8 *
2f9f0 70 4f 72 69 67 20 3d 20 28 75 38 20 2a 29 70 46  pOrig = (u8 *)pF
2fa00 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20  d->pMapRegion;  
2fa10 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
2fa20 75 72 72 65 6e 74 20 66 69 6c 65 20 6d 61 70 70  urrent file mapp
2fa30 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20 6e 4f 72  ing */.  i64 nOr
2fa40 69 67 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69  ig = pFd->mmapSi
2fa50 7a 65 41 63 74 75 61 6c 3b 20 20 20 20 20 2f 2a  zeActual;     /*
2fa60 20 53 69 7a 65 20 6f 66 20 70 4f 72 69 67 20 72   Size of pOrig r
2fa70 65 67 69 6f 6e 20 69 6e 20 62 79 74 65 73 20 2a  egion in bytes *
2fa80 2f 0a 20 20 75 38 20 2a 70 4e 65 77 20 3d 20 30  /.  u8 *pNew = 0
2fa90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2faa0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
2fab0 74 69 6f 6e 20 6f 66 20 6e 65 77 20 6d 61 70 70  tion of new mapp
2fac0 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ing */.  int fla
2fad0 67 73 20 3d 20 50 52 4f 54 5f 52 45 41 44 3b 20  gs = PROT_READ; 
2fae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2faf0 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74   Flags to pass t
2fb00 6f 20 6d 6d 61 70 28 29 20 2a 2f 0a 0a 20 20 61  o mmap() */..  a
2fb10 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74  ssert( pFd->nFet
2fb20 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 61 73  chOut==0 );.  as
2fb30 73 65 72 74 28 20 6e 4e 65 77 3e 70 46 64 2d 3e  sert( nNew>pFd->
2fb40 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20 61 73  mmapSize );.  as
2fb50 73 65 72 74 28 20 6e 4e 65 77 3c 3d 70 46 64 2d  sert( nNew<=pFd-
2fb60 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 3b 0a  >mmapSizeMax );.
2fb70 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30    assert( nNew>0
2fb80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46   );.  assert( pF
2fb90 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d->mmapSizeActua
2fba0 6c 3e 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  l>=pFd->mmapSize
2fbb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 41   );.  assert( MA
2fbc0 50 5f 46 41 49 4c 45 44 21 3d 30 20 29 3b 0a 0a  P_FAILED!=0 );..
2fbd0 20 20 69 66 28 20 28 70 46 64 2d 3e 63 74 72 6c    if( (pFd->ctrl
2fbe0 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
2fbf0 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 20 66 6c  _RDONLY)==0 ) fl
2fc00 61 67 73 20 7c 3d 20 50 52 4f 54 5f 57 52 49 54  ags |= PROT_WRIT
2fc10 45 3b 0a 0a 20 20 69 66 28 20 70 4f 72 69 67 20  E;..  if( pOrig 
2fc20 29 7b 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d  ){.#if HAVE_MREM
2fc30 41 50 0a 20 20 20 20 69 36 34 20 6e 52 65 75 73  AP.    i64 nReus
2fc40 65 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  e = pFd->mmapSiz
2fc50 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e  e;.#else.    con
2fc60 73 74 20 69 6e 74 20 73 7a 53 79 73 70 61 67 65  st int szSyspage
2fc70 20 3d 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65   = osGetpagesize
2fc80 28 29 3b 0a 20 20 20 20 69 36 34 20 6e 52 65 75  ();.    i64 nReu
2fc90 73 65 20 3d 20 28 70 46 64 2d 3e 6d 6d 61 70 53  se = (pFd->mmapS
2fca0 69 7a 65 20 26 20 7e 28 73 7a 53 79 73 70 61 67  ize & ~(szSyspag
2fcb0 65 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  e-1));.#endif.  
2fcc0 20 20 75 38 20 2a 70 52 65 71 20 3d 20 26 70 4f    u8 *pReq = &pO
2fcd0 72 69 67 5b 6e 52 65 75 73 65 5d 3b 0a 0a 20 20  rig[nReuse];..  
2fce0 20 20 2f 2a 20 55 6e 6d 61 70 20 61 6e 79 20 70    /* Unmap any p
2fcf0 61 67 65 73 20 6f 66 20 74 68 65 20 65 78 69 73  ages of the exis
2fd00 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 74 68 61  ting mapping tha
2fd10 74 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 75 73  t cannot be reus
2fd20 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  ed. */.    if( n
2fd30 52 65 75 73 65 21 3d 6e 4f 72 69 67 20 29 7b 0a  Reuse!=nOrig ){.
2fd40 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70        osMunmap(p
2fd50 52 65 71 2c 20 6e 4f 72 69 67 2d 6e 52 65 75 73  Req, nOrig-nReus
2fd60 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 48  e);.    }..#if H
2fd70 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20 70  AVE_MREMAP.    p
2fd80 4e 65 77 20 3d 20 6f 73 4d 72 65 6d 61 70 28 70  New = osMremap(p
2fd90 4f 72 69 67 2c 20 6e 52 65 75 73 65 2c 20 6e 4e  Orig, nReuse, nN
2fda0 65 77 2c 20 4d 52 45 4d 41 50 5f 4d 41 59 4d 4f  ew, MREMAP_MAYMO
2fdb0 56 45 29 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20  VE);.    zErr = 
2fdc0 22 6d 72 65 6d 61 70 22 3b 0a 23 65 6c 73 65 0a  "mremap";.#else.
2fdd0 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61      pNew = osMma
2fde0 70 28 70 52 65 71 2c 20 6e 4e 65 77 2d 6e 52 65  p(pReq, nNew-nRe
2fdf0 75 73 65 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f  use, flags, MAP_
2fe00 53 48 41 52 45 44 2c 20 68 2c 20 6e 52 65 75 73  SHARED, h, nReus
2fe10 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  e);.    if( pNew
2fe20 21 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a  !=MAP_FAILED ){.
2fe30 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d        if( pNew!=
2fe40 70 52 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20  pReq ){.        
2fe50 6f 73 4d 75 6e 6d 61 70 28 70 4e 65 77 2c 20 6e  osMunmap(pNew, n
2fe60 4e 65 77 20 2d 20 6e 52 65 75 73 65 29 3b 0a 20  New - nReuse);. 
2fe70 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30 3b         pNew = 0;
2fe80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2fe90 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 4f 72        pNew = pOr
2fea0 69 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ig;.      }.    
2feb0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
2fec0 20 54 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   The attempt to 
2fed0 65 78 74 65 6e 64 20 74 68 65 20 65 78 69 73 74  extend the exist
2fee0 69 6e 67 20 6d 61 70 70 69 6e 67 20 66 61 69 6c  ing mapping fail
2fef0 65 64 2e 20 46 72 65 65 20 69 74 2e 20 2a 2f 0a  ed. Free it. */.
2ff00 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41      if( pNew==MA
2ff10 50 5f 46 41 49 4c 45 44 20 7c 7c 20 70 4e 65 77  P_FAILED || pNew
2ff20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d  ==0 ){.      osM
2ff30 75 6e 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52 65  unmap(pOrig, nRe
2ff40 75 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  use);.    }.  }.
2ff50 0a 20 20 2f 2a 20 49 66 20 70 4e 65 77 20 69 73  .  /* If pNew is
2ff60 20 73 74 69 6c 6c 20 4e 55 4c 4c 2c 20 74 72 79   still NULL, try
2ff70 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 65 6e   to create an en
2ff80 74 69 72 65 6c 79 20 6e 65 77 20 6d 61 70 70 69  tirely new mappi
2ff90 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65  ng. */.  if( pNe
2ffa0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77  w==0 ){.    pNew
2ffb0 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4e 65   = osMmap(0, nNe
2ffc0 77 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53 48  w, flags, MAP_SH
2ffd0 41 52 45 44 2c 20 68 2c 20 30 29 3b 0a 20 20 7d  ARED, h, 0);.  }
2ffe0 0a 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41  ..  if( pNew==MA
2fff0 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  P_FAILED ){.    
30000 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 6e 4e  pNew = 0;.    nN
30010 65 77 20 3d 20 30 3b 0a 20 20 20 20 75 6e 69 78  ew = 0;.    unix
30020 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
30030 4f 4b 2c 20 7a 45 72 72 2c 20 70 46 64 2d 3e 7a  OK, zErr, pFd->z
30040 50 61 74 68 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  Path);..    /* I
30050 66 20 74 68 65 20 6d 6d 61 70 28 29 20 61 62 6f  f the mmap() abo
30060 76 65 20 66 61 69 6c 65 64 2c 20 61 73 73 75 6d  ve failed, assum
30070 65 20 74 68 61 74 20 61 6c 6c 20 73 75 62 73 65  e that all subse
30080 71 75 65 6e 74 20 6d 6d 61 70 28 29 20 63 61 6c  quent mmap() cal
30090 6c 73 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 70  ls.    ** will p
300a0 72 6f 62 61 62 6c 79 20 66 61 69 6c 20 74 6f 6f  robably fail too
300b0 2e 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 20 75  . Fall back to u
300c0 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74  sing xRead/xWrit
300d0 65 20 65 78 63 6c 75 73 69 76 65 6c 79 0a 20 20  e exclusively.  
300e0 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73    ** in this cas
300f0 65 2e 20 20 2a 2f 0a 20 20 20 20 70 46 64 2d 3e  e.  */.    pFd->
30100 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 30 3b  mmapSizeMax = 0;
30110 0a 20 20 7d 0a 20 20 70 46 64 2d 3e 70 4d 61 70  .  }.  pFd->pMap
30120 52 65 67 69 6f 6e 20 3d 20 28 76 6f 69 64 20 2a  Region = (void *
30130 29 70 4e 65 77 3b 0a 20 20 70 46 64 2d 3e 6d 6d  )pNew;.  pFd->mm
30140 61 70 53 69 7a 65 20 3d 20 70 46 64 2d 3e 6d 6d  apSize = pFd->mm
30150 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 6e  apSizeActual = n
30160 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65  New;.}../*.** Me
30170 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72 65 6d 61  mory map or rema
30180 70 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  p the file opene
30190 64 20 62 79 20 66 69 6c 65 2d 64 65 73 63 72 69  d by file-descri
301a0 70 74 6f 72 20 70 46 64 20 28 69 66 20 74 68 65  ptor pFd (if the
301b0 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65   file.** is alre
301c0 61 64 79 20 6d 61 70 70 65 64 2c 20 74 68 65 20  ady mapped, the 
301d0 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67  existing mapping
301e0 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20   is replaced by 
301f0 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66  the new). Or, if
30200 20 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72 65 61   .** there alrea
30210 64 79 20 65 78 69 73 74 73 20 61 20 6d 61 70 70  dy exists a mapp
30220 69 6e 67 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ing for this fil
30230 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  e, and there are
30240 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f 75 74 73 74   still .** outst
30250 61 6e 64 69 6e 67 20 78 46 65 74 63 68 28 29 20  anding xFetch() 
30260 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 69 74  references to it
30270 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
30280 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
30290 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
302a0 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61  Byte is non-nega
302b0 74 69 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73  tive, then it is
302c0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
302d0 69 7a 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20 6d  ize of .** the m
302e0 61 70 70 69 6e 67 20 74 6f 20 63 72 65 61 74 65  apping to create
302f0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
30300 6e 42 79 74 65 20 69 73 20 6c 65 73 73 20 74 68  nByte is less th
30310 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
30320 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20  e .** requested 
30330 73 69 7a 65 20 69 73 20 74 68 65 20 73 69 7a 65  size is the size
30340 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   of the file on 
30350 64 69 73 6b 2e 20 54 68 65 20 61 63 74 75 61 6c  disk. The actual
30360 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
30370 63 72 65 61 74 65 64 20 6d 61 70 70 69 6e 67 20  created mapping 
30380 69 73 20 65 69 74 68 65 72 20 74 68 65 20 72 65  is either the re
30390 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 72 20  quested size or 
303a0 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67  the value config
303b0 75 72 65 64 20 0a 2a 2a 20 75 73 69 6e 67 20 53  ured .** using S
303c0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50  QLITE_FCNTL_MMAP
303d0 5f 4c 49 4d 49 54 2c 20 77 68 69 63 68 65 76 65  _LIMIT, whicheve
303e0 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a  r is smaller..**
303f0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
30400 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20   returned if no 
30410 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65 76  error occurs (ev
30420 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70 69 6e  en if the mappin
30430 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63 72  g is not.** recr
30440 65 61 74 65 64 20 61 73 20 61 20 72 65 73 75 6c  eated as a resul
30450 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  t of outstanding
30460 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f 72 20   references) or 
30470 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a  an SQLite error.
30480 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  ** code otherwis
30490 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
304a0 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 75 6e 69   unixMapfile(uni
304b0 78 46 69 6c 65 20 2a 70 46 64 2c 20 69 36 34 20  xFile *pFd, i64 
304c0 6e 42 79 74 65 29 7b 0a 20 20 69 36 34 20 6e 4d  nByte){.  i64 nM
304d0 61 70 20 3d 20 6e 42 79 74 65 3b 0a 20 20 69 6e  ap = nByte;.  in
304e0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
304f0 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d   nMap>=0 || pFd-
30500 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b  >nFetchOut==0 );
30510 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46 65 74  .  if( pFd->nFet
30520 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75 72 6e  chOut>0 ) return
30530 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
30540 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20  f( nMap<0 ){.   
30550 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61   struct stat sta
30560 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 2f  tbuf;          /
30570 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65  * Low-level file
30580 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
30590 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74      rc = osFstat
305a0 28 70 46 64 2d 3e 68 2c 20 26 73 74 61 74 62 75  (pFd->h, &statbu
305b0 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  f);.    if( rc!=
305c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
305d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
305e0 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
305f0 20 20 7d 0a 20 20 20 20 6e 4d 61 70 20 3d 20 73    }.    nMap = s
30600 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a  tatbuf.st_size;.
30610 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70    }.  if( nMap>p
30620 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  Fd->mmapSizeMax 
30630 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70 46  ){.    nMap = pF
30640 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a  d->mmapSizeMax;.
30650 20 20 7d 0a 0a 20 20 69 66 28 20 6e 4d 61 70 21    }..  if( nMap!
30660 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  =pFd->mmapSize )
30670 7b 0a 20 20 20 20 69 66 28 20 6e 4d 61 70 3e 30  {.    if( nMap>0
30680 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 52 65   ){.      unixRe
30690 6d 61 70 66 69 6c 65 28 70 46 64 2c 20 6e 4d 61  mapfile(pFd, nMa
306a0 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
306b0 20 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69       unixUnmapfi
306c0 6c 65 28 70 46 64 29 3b 0a 20 20 20 20 7d 0a 20  le(pFd);.    }. 
306d0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
306e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
306f0 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   /* SQLITE_MAX_M
30700 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f  MAP_SIZE>0 */../
30710 2a 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c 65  *.** If possible
30720 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  , return a point
30730 65 72 20 74 6f 20 61 20 6d 61 70 70 69 6e 67 20  er to a mapping 
30740 6f 66 20 66 69 6c 65 20 66 64 20 73 74 61 72 74  of file fd start
30750 69 6e 67 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a  ing at offset.**
30760 20 69 4f 66 66 2e 20 54 68 65 20 6d 61 70 70 69   iOff. The mappi
30770 6e 67 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64  ng must be valid
30780 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 41   for at least nA
30790 6d 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  mt bytes..**.** 
307a0 49 66 20 73 75 63 68 20 61 20 70 6f 69 6e 74 65  If such a pointe
307b0 72 20 63 61 6e 20 62 65 20 6f 62 74 61 69 6e 65  r can be obtaine
307c0 64 2c 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a  d, store it in *
307d0 70 70 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  pp and return SQ
307e0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20  LITE_OK..** Or, 
307f0 69 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 75  if one cannot bu
30800 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
30810 73 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 30 20  s, set *pp to 0 
30820 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
30830 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79  E_OK..** Finally
30840 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 64 6f  , if an error do
30850 65 73 20 6f 63 63 75 72 2c 20 72 65 74 75 72 6e  es occur, return
30860 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
30870 20 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c   code. The final
30880 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 2a 70 70  .** value of *pp
30890 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e   is undefined in
308a0 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
308b0 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
308c0 6f 6e 20 64 6f 65 73 20 72 65 74 75 72 6e 20 61  on does return a
308d0 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 20 63 61   pointer, the ca
308e0 6c 6c 65 72 20 6d 75 73 74 20 65 76 65 6e 74 75  ller must eventu
308f0 61 6c 6c 79 20 0a 2a 2a 20 72 65 6c 65 61 73 65  ally .** release
30900 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 62   the reference b
30910 79 20 63 61 6c 6c 69 6e 67 20 75 6e 69 78 55 6e  y calling unixUn
30920 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73 74 61 74  fetch()..*/.stat
30930 69 63 20 69 6e 74 20 75 6e 69 78 46 65 74 63 68  ic int unixFetch
30940 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
30950 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 69 6e 74  d, i64 iOff, int
30960 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 70   nAmt, void **pp
30970 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ){.#if SQLITE_MA
30980 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
30990 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20  unixFile *pFd = 
309a0 28 75 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20  (unixFile *)fd; 
309b0 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
309c0 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
309d0 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70  e */.#endif.  *p
309e0 70 20 3d 20 30 3b 0a 0a 23 69 66 20 53 51 4c 49  p = 0;..#if SQLI
309f0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
30a00 3e 30 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d  >0.  if( pFd->mm
30a10 61 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a 20  apSizeMax>0 ){. 
30a20 20 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70     if( pFd->pMap
30a30 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20  Region==0 ){.   
30a40 20 20 20 69 6e 74 20 72 63 20 3d 20 75 6e 69 78     int rc = unix
30a50 4d 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31 29  Mapfile(pFd, -1)
30a60 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
30a70 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
30a80 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
30a90 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69   if( pFd->mmapSi
30aa0 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74 20  ze >= iOff+nAmt 
30ab0 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 26  ){.      *pp = &
30ac0 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70  ((u8 *)pFd->pMap
30ad0 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20  Region)[iOff];. 
30ae0 20 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68       pFd->nFetch
30af0 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  Out++;.    }.  }
30b00 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
30b10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
30b20 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69 72  *.** If the thir
30b30 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
30b40 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69  n-NULL, then thi
30b50 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65 61  s function relea
30b60 73 65 73 20 61 20 0a 2a 2a 20 72 65 66 65 72 65  ses a .** refere
30b70 6e 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20  nce obtained by 
30b80 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  an earlier call 
30b90 74 6f 20 75 6e 69 78 46 65 74 63 68 28 29 2e 20  to unixFetch(). 
30ba0 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72  The second.** ar
30bb0 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
30bc0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   this function m
30bd0 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
30be0 61 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  as the correspon
30bf0 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  ding.** argument
30c00 20 74 68 61 74 20 77 61 73 20 70 61 73 73 65 64   that was passed
30c10 20 74 6f 20 74 68 65 20 75 6e 69 78 46 65 74 63   to the unixFetc
30c20 68 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20  h() invocation. 
30c30 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68  .**.** Or, if th
30c40 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
30c50 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
30c60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
30c70 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 0a 2a 2a  being called .**
30c80 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20 56   to inform the V
30c90 46 53 20 6c 61 79 65 72 20 74 68 61 74 2c 20 61  FS layer that, a
30ca0 63 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53 49  ccording to POSI
30cb0 58 2c 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  X, any existing 
30cc0 6d 61 70 70 69 6e 67 20 0a 2a 2a 20 6d 61 79 20  mapping .** may 
30cd0 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69 64 20 61  now be invalid a
30ce0 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 75 6e 6d  nd should be unm
30cf0 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  apped..*/.static
30d00 20 69 6e 74 20 75 6e 69 78 55 6e 66 65 74 63 68   int unixUnfetch
30d10 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
30d20 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f 69  d, i64 iOff, voi
30d30 64 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54  d *p){.#if SQLIT
30d40 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
30d50 30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  0.  unixFile *pF
30d60 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  d = (unixFile *)
30d70 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  fd;   /* The und
30d80 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
30d90 20 66 69 6c 65 20 2a 2f 0a 20 20 55 4e 55 53 45   file */.  UNUSE
30da0 44 5f 50 41 52 41 4d 45 54 45 52 28 69 4f 66 66  D_PARAMETER(iOff
30db0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d 30  );..  /* If p==0
30dc0 20 28 75 6e 6d 61 70 20 74 68 65 20 65 6e 74 69   (unmap the enti
30dd0 72 65 20 66 69 6c 65 29 20 74 68 65 6e 20 74 68  re file) then th
30de0 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 6f  ere must be no o
30df0 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a  utstanding .  **
30e00 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63   xFetch referenc
30e10 65 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30 20  es. Or, if p!=0 
30e20 28 6d 65 61 6e 69 6e 67 20 69 74 20 69 73 20 61  (meaning it is a
30e30 6e 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e  n xFetch referen
30e40 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74  ce),.  ** then t
30e50 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 74 20  here must be at 
30e60 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61  least one outsta
30e70 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73 73  nding.  */.  ass
30e80 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70 46  ert( (p==0)==(pF
30e90 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 29  d->nFetchOut==0)
30ea0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21 3d   );..  /* If p!=
30eb0 30 2c 20 69 74 20 6d 75 73 74 20 6d 61 74 63 68  0, it must match
30ec0 20 74 68 65 20 69 4f 66 66 20 76 61 6c 75 65 2e   the iOff value.
30ed0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 3d   */.  assert( p=
30ee0 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20 2a  =0 || p==&((u8 *
30ef0 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  )pFd->pMapRegion
30f00 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20 69 66  )[iOff] );..  if
30f10 28 20 70 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e  ( p ){.    pFd->
30f20 6e 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d  nFetchOut--;.  }
30f30 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 55 6e  else{.    unixUn
30f40 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20  mapfile(pFd);.  
30f50 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 64  }..  assert( pFd
30f60 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20 29  ->nFetchOut>=0 )
30f70 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
30f80 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a  _PARAMETER(fd);.
30f90 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
30fa0 45 52 28 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ER(p);.  UNUSED_
30fb0 50 41 52 41 4d 45 54 45 52 28 69 4f 66 66 29 3b  PARAMETER(iOff);
30fc0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
30fd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
30fe0 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74  *.** Here ends t
30ff0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
31000 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33  n of all sqlite3
31010 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a  _file methods..*
31020 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
31030 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c  ******** End sql
31040 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64  ite3_file Method
31050 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
31060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31070 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
31080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
310a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
310b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
310c0 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69  /../*.** This di
310d0 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  vision contains 
310e0 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73  definitions of s
310f0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
31100 73 20 6f 62 6a 65 63 74 73 20 74 68 61 74 0a 2a  s objects that.*
31110 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69  * implement vari
31120 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  ous file locking
31130 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 49 74   strategies.  It
31140 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64   also contains d
31150 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66  efinitions.** of
31160 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69   "finder" functi
31170 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65 72 2d 66  ons.  A finder-f
31180 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
31190 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 61 70  to locate the ap
311a0 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c  propriate.** sql
311b0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
311c0 6f 62 6a 65 63 74 20 66 6f 72 20 61 20 70 61 72  object for a par
311d0 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
311e0 20 66 69 6c 65 2e 20 20 54 68 65 20 70 41 70 70   file.  The pApp
311f0 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66  Data.** field of
31200 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73   the sqlite3_vfs
31210 20 56 46 53 20 6f 62 6a 65 63 74 73 20 61 72 65   VFS objects are
31220 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
31230 62 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a  be pointers to.*
31240 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 66 69  * the correct fi
31250 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f  nder-function fo
31260 72 20 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a  r that VFS..**.*
31270 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72 20 66 75  * Most finder fu
31280 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 61  nctions return a
31290 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69   pointer to a fi
312a0 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  xed sqlite3_io_m
312b0 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74  ethods.** object
312c0 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65  .  The only inte
312d0 72 65 73 74 69 6e 67 20 66 69 6e 64 65 72 2d 66  resting finder-f
312e0 75 6e 63 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c  unction is autol
312f0 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68 69  ockIoFinder, whi
31300 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74  ch.** looks at t
31310 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79  he filesystem ty
31320 70 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20  pe and tries to 
31330 67 75 65 73 73 20 74 68 65 20 62 65 73 74 20 6c  guess the best l
31340 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65  ocking.** strate
31350 67 79 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a  gy from that..**
31360 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d 66  .** For finder-f
31370 75 6e 63 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f  unction F, two o
31380 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74  bjects are creat
31390 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ed:.**.**    (1)
313a0 20 54 68 65 20 72 65 61 6c 20 66 69 6e 64 65 72   The real finder
313b0 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20  -function named 
313c0 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a  "FImpt()"..**.**
313d0 20 20 20 20 28 32 29 20 41 20 63 6f 6e 73 74 61      (2) A consta
313e0 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  nt pointer to th
313f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  is function name
31400 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a  d just "F"..**.*
31410 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74  *.** A pointer t
31420 6f 20 74 68 65 20 46 20 70 6f 69 6e 74 65 72 20  o the F pointer 
31430 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20 70  is used as the p
31440 41 70 70 44 61 74 61 20 76 61 6c 75 65 20 66 6f  AppData value fo
31450 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73  r VFS.** objects
31460 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f  .  We have to do
31470 20 74 68 69 73 20 69 6e 73 74 65 61 64 20 6f 66   this instead of
31480 20 6c 65 74 74 69 6e 67 20 70 41 70 70 44 61 74   letting pAppDat
31490 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63  a point.** direc
314a0 74 6c 79 20 61 74 20 74 68 65 20 66 69 6e 64 65  tly at the finde
314b0 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65  r-function since
314c0 20 43 39 30 20 72 75 6c 65 73 20 70 72 65 76 65   C90 rules preve
314d0 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72  nt a void*.** fr
314e0 6f 6d 20 62 65 20 63 61 73 74 20 69 6e 74 6f 20  om be cast into 
314f0 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  a function point
31500 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63  er..**.**.** Eac
31510 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  h instance of th
31520 69 73 20 6d 61 63 72 6f 20 67 65 6e 65 72 61 74  is macro generat
31530 65 73 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a  es two objects:.
31540 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e  **.**   *  A con
31550 73 74 61 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  stant sqlite3_io
31560 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
31570 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61 74  call METHOD that
31580 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   has locking.** 
31590 20 20 20 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f       methods CLO
315a0 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b  SE, LOCK, UNLOCK
315b0 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a  , CKRESLOCK..**.
315c0 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d  **   *  An I/O m
315d0 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e  ethod finder fun
315e0 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e  ction called FIN
315f0 44 45 52 20 74 68 61 74 20 72 65 74 75 72 6e 73  DER that returns
31600 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20   a pointer.**   
31610 20 20 20 74 6f 20 74 68 65 20 4d 45 54 48 4f 44     to the METHOD
31620 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 70   object in the p
31630 72 65 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a  revious bullet..
31640 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45 54  */.#define IOMET
31650 48 4f 44 53 28 46 49 4e 44 45 52 2c 4d 45 54 48  HODS(FINDER,METH
31660 4f 44 2c 56 45 52 53 49 4f 4e 2c 43 4c 4f 53 45  OD,VERSION,CLOSE
31670 2c 4c 4f 43 4b 2c 55 4e 4c 4f 43 4b 2c 43 4b 4c  ,LOCK,UNLOCK,CKL
31680 4f 43 4b 2c 53 48 4d 4d 41 50 29 20 20 20 20 20  OCK,SHMMAP)     
31690 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  \.static const s
316a0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
316b0 73 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20 20  s METHOD = {    
316c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
316d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
316e0 0a 20 20 20 56 45 52 53 49 4f 4e 2c 20 20 20 20  .   VERSION,    
316f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31700 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20  /* iVersion */  
31710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
31730 20 20 20 43 4c 4f 53 45 2c 20 20 20 20 20 20 20     CLOSE,       
31740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31750 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20  * xClose */     
31760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31770 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
31780 20 20 75 6e 69 78 52 65 61 64 2c 20 20 20 20 20    unixRead,     
31790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
317a0 20 78 52 65 61 64 20 2a 2f 20 20 20 20 20 20 20   xRead */       
317b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317c0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
317d0 20 75 6e 69 78 57 72 69 74 65 2c 20 20 20 20 20   unixWrite,     
317e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
317f0 78 57 72 69 74 65 20 2a 2f 20 20 20 20 20 20 20  xWrite */       
31800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31810 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
31820 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20  unixTruncate,   
31830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
31840 54 72 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20  Truncate */     
31850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31860 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
31870 6e 69 78 53 79 6e 63 2c 20 20 20 20 20 20 20 20  nixSync,        
31880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
31890 79 6e 63 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ync */          
318a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318b0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
318c0 69 78 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20  ixFileSize,     
318d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
318e0 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20  leSize */       
318f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31900 20 20 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43          \.   LOC
31910 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K,              
31920 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
31930 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
31940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31950 20 20 20 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f         \.   UNLO
31960 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CK,             
31970 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
31980 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
31990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319a0 20 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43        \.   CKLOC
319b0 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K,              
319c0 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b         /* xCheck
319d0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20  ReservedLock */ 
319e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319f0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69       \.   unixFi
31a00 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20  leControl,      
31a10 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f        /* xFileCo
31a20 6e 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20  ntrol */        
31a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a40 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 65 63      \.   unixSec
31a50 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20  torSize,        
31a60 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53       /* xSectorS
31a70 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ize */          
31a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a90 20 20 20 5c 0a 20 20 20 75 6e 69 78 44 65 76 69     \.   unixDevi
31aa0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
31ab0 73 2c 20 20 2f 2a 20 78 44 65 76 69 63 65 43 61  s,  /* xDeviceCa
31ac0 70 61 62 69 6c 69 74 69 65 73 20 2a 2f 20 20 20  pabilities */   
31ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ae0 20 20 5c 0a 20 20 20 53 48 4d 4d 41 50 2c 20 20    \.   SHMMAP,  
31af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b00 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f     /* xShmMap */
31b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b30 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63   \.   unixShmLoc
31b40 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
31b50 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f    /* xShmLock */
31b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b80 5c 0a 20 20 20 75 6e 69 78 53 68 6d 42 61 72 72  \.   unixShmBarr
31b90 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ier,            
31ba0 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20   /* xShmBarrier 
31bb0 2a 2f 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 5c                 \
31bd0 0a 20 20 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70  .   unixShmUnmap
31be0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
31bf0 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 20  /* xShmUnmap */ 
31c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
31c20 20 20 20 75 6e 69 78 46 65 74 63 68 2c 20 20 20     unixFetch,   
31c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31c40 2a 20 78 46 65 74 63 68 20 2a 2f 20 20 20 20 20  * xFetch */     
31c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c60 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
31c70 20 20 75 6e 69 78 55 6e 66 65 74 63 68 2c 20 20    unixUnfetch,  
31c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31c90 20 78 55 6e 66 65 74 63 68 20 2a 2f 20 20 20 20   xUnfetch */    
31ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31cb0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b              \.};
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 20 20 20 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 5c 0a 73 74 61             \.sta
31d10 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
31d20 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49  3_io_methods *FI
31d30 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74  NDER##Impl(const
31d40 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69   char *z, unixFi
31d50 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e  le *p){   \.  UN
31d60 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a  USED_PARAMETER(z
31d70 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  ); UNUSED_PARAME
31d80 54 45 52 28 70 29 3b 20 20 20 20 20 20 20 20 20  TER(p);         
31d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31da0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 72 65 74           \.  ret
31db0 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20 20  urn &METHOD;    
31dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31df0 20 20 20 20 20 20 20 20 5c 0a 7d 20 20 20 20 20          \.}     
31e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e40 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20         \.static 
31e50 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
31e60 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73  _methods *(*cons
31e70 74 20 46 49 4e 44 45 52 29 28 63 6f 6e 73 74 20  t FINDER)(const 
31e80 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a  char*,unixFile *
31e90 70 29 20 20 20 20 5c 0a 20 20 20 20 3d 20 46 49  p)    \.    = FI
31ea0 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a  NDER##Impl;../*.
31eb0 2a 2a 20 48 65 72 65 20 61 72 65 20 61 6c 6c 20  ** Here are all 
31ec0 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  of the sqlite3_i
31ed0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
31ee0 73 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68  s for each of th
31ef0 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72  e.** locking str
31f00 61 74 65 67 69 65 73 2e 20 20 46 75 6e 63 74 69  ategies.  Functi
31f10 6f 6e 73 20 74 68 61 74 20 72 65 74 75 72 6e 20  ons that return 
31f20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 73  pointers to thes
31f30 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65  e methods.** are
31f40 20 61 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a   also created..*
31f50 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70  /.IOMETHODS(.  p
31f60 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c 20 20 20  osixIoFinder,   
31f70 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
31f80 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
31f90 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74   */.  posixIoMet
31fa0 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
31fb0 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
31fc0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
31fd0 65 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20 20 20  e */.  3,       
31fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ff0 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
32000 79 20 61 6e 64 20 6d 6d 61 70 20 61 72 65 20 65  y and mmap are e
32010 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78  nabled */.  unix
32020 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
32030 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
32040 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
32050 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
32060 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
32070 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55  ethod */.  unixU
32080 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
32090 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
320a0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
320b0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
320c0 6b 2c 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  k,    /* xCheckR
320d0 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
320e0 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4d  od */.  unixShmM
320f0 61 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ap              
32100 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74    /* xShmMap met
32110 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f  hod */.).IOMETHO
32120 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69  DS(.  nolockIoFi
32130 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
32140 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
32150 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c  on name */.  nol
32160 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  ockIoMethods,   
32170 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
32180 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
32190 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c  ect name */.  2,
321a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
321b0 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
321c0 64 20 6d 65 6d 6f 72 79 20 69 73 20 65 6e 61 62  d memory is enab
321d0 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43  led */.  nolockC
321e0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
321f0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
32200 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c  hod */.  nolockL
32210 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
32220 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
32230 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e  od */.  nolockUn
32240 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
32250 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
32260 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43  hod */.  nolockC
32270 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
32280 2c 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65  ,  /* xCheckRese
32290 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
322a0 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
322b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
322c0 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64  * xShmMap method
322d0 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28   */.).IOMETHODS(
322e0 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64  .  dotlockIoFind
322f0 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  er,          /* 
32300 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
32310 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  name */.  dotloc
32320 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  kIoMethods,     
32330 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
32340 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
32350 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
32360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32370 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
32380 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
32390 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c  d */.  dotlockCl
323a0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
323b0 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
323c0 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f  d */.  dotlockLo
323d0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
323e0 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
323f0 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c   */.  dotlockUnl
32400 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
32410 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
32420 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68  d */.  dotlockCh
32430 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
32440 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
32450 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
32460 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  .  0            
32470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32480 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
32490 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  /.)..#if SQLITE_
324a0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
324b0 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  TYLE.IOMETHODS(.
324c0 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c    flockIoFinder,
324d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
324e0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
324f0 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f  ame */.  flockIo
32500 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
32510 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
32520 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
32530 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
32540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32550 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
32560 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
32570 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65   */.  flockClose
32580 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32590 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
325a0 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c   */.  flockLock,
325b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
325c0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
325d0 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b  */.  flockUnlock
325e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
325f0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
32600 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b   */.  flockCheck
32610 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
32620 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
32630 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
32640 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
32650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
32660 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
32670 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f  .).#endif..#if O
32680 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48  S_VXWORKS.IOMETH
32690 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64  ODS(.  semIoFind
326a0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
326b0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
326c0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65  ion name */.  se
326d0 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  mIoMethods,     
326e0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
326f0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
32700 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
32710 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32720 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
32730 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
32740 61 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 58 43  abled */.  semXC
32750 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
32760 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
32770 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 4c  ethod */.  semXL
32780 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
32790 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
327a0 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 55 6e  thod */.  semXUn
327b0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
327c0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
327d0 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 43  ethod */.  semXC
327e0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
327f0 2c 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  ,    /* xCheckRe
32800 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
32810 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
32820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32830 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
32840 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
32850 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
32860 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
32870 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
32880 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28  STYLE.IOMETHODS(
32890 0a 20 20 61 66 70 49 6f 46 69 6e 64 65 72 2c 20  .  afpIoFinder, 
328a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
328b0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
328c0 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d  name */.  afpIoM
328d0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
328e0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
328f0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
32900 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
32910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32920 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
32930 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
32940 64 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c  d */.  afpClose,
32950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32960 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
32970 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20  d */.  afpLock, 
32980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32990 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
329a0 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c   */.  afpUnlock,
329b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
329c0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
329d0 64 20 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b 52  d */.  afpCheckR
329e0 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
329f0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
32a00 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
32a10 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  .  0            
32a20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32a30 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
32a40 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  /.).#endif../*.*
32a50 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  * The proxy lock
32a60 69 6e 67 20 6d 65 74 68 6f 64 20 69 73 20 61 20  ing method is a 
32a70 22 73 75 70 65 72 2d 6d 65 74 68 6f 64 22 20 69  "super-method" i
32a80 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68 61 74  n the sense that
32a90 20 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63   it.** opens sec
32aa0 6f 6e 64 61 72 79 20 66 69 6c 65 20 64 65 73 63  ondary file desc
32ab0 72 69 70 74 6f 72 73 20 66 6f 72 20 74 68 65 20  riptors for the 
32ac0 63 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66  conch and lock f
32ad0 69 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75  iles and.** it u
32ae0 73 65 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66  ses proxy, dot-f
32af0 69 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c  ile, AFP, and fl
32b00 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65  ock() locking me
32b10 74 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a  thods on those.*
32b20 2a 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65  * secondary file
32b30 73 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65 61  s.  For this rea
32b40 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f  son, the divisio
32b50 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  n that implement
32b60 73 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69  s.** proxy locki
32b70 6e 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6d 75  ng is located mu
32b80 63 68 20 66 75 72 74 68 65 72 20 64 6f 77 6e 20  ch further down 
32b90 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 42 75  in the file.  Bu
32ba0 74 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20  t we need.** to 
32bb0 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64 65 66  go ahead and def
32bc0 69 6e 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ine the sqlite3_
32bd0 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20 66  io_methods and f
32be0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a  inder function.*
32bf0 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b  * for proxy lock
32c00 69 6e 67 20 68 65 72 65 2e 20 20 53 6f 20 77 65  ing here.  So we
32c10 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 65   forward declare
32c20 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73   the I/O methods
32c30 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
32c40 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
32c50 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
32c60 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74 69  KING_STYLE.stati
32c70 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65  c int proxyClose
32c80 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b  (sqlite3_file*);
32c90 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
32ca0 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  yLock(sqlite3_fi
32cb0 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69  le*, int);.stati
32cc0 63 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63  c int proxyUnloc
32cd0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
32ce0 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e   int);.static in
32cf0 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65  t proxyCheckRese
32d00 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
32d10 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49  _file*, int*);.I
32d20 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 72 6f 78  OMETHODS(.  prox
32d30 79 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  yIoFinder,      
32d40 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
32d50 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
32d60 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64  .  proxyIoMethod
32d70 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
32d80 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
32d90 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
32da0 2f 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20 20  /.  2,          
32db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32dc0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
32dd0 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 70  s enabled */.  p
32de0 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20  roxyClose,      
32df0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
32e00 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70  se method */.  p
32e10 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20  roxyLock,       
32e20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
32e30 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  k method */.  pr
32e40 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  oxyUnlock,      
32e50 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
32e60 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70  ck method */.  p
32e70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65  roxyCheckReserve
32e80 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78 43 68 65  dLock,   /* xChe
32e90 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
32ea0 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20  ethod */.  0    
32eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ec0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
32ed0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
32ee0 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64  if../* nfs lockd
32ef0 20 6f 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f   on OSX 10.3+ do
32f00 65 73 6e 27 74 20 63 6c 65 61 72 20 77 72 69 74  esn't clear writ
32f10 65 20 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20 72  e locks when a r
32f20 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 20  ead lock is set 
32f30 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
32f40 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
32f50 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
32f60 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f  NG_STYLE.IOMETHO
32f70 44 53 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65  DS(.  nfsIoFinde
32f80 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
32f90 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
32fa0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66  ion name */.  nf
32fb0 73 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  sIoMethods,     
32fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
32fd0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
32fe0 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
32ff0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
33000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
33010 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
33020 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69  isabled */.  uni
33030 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  xClose,         
33040 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
33050 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  e method */.  un
33060 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ixLock,         
33070 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
33080 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66  k method */.  nf
33090 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  sUnlock,        
330a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
330b0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
330c0 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
330d0 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43  dLock,     /* xC
330e0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
330f0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20   method */.  0  
33100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33110 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
33120 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ap method */.).#
33130 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
33140 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
33150 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
33160 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20  OCKING_STYLE./* 
33170 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72  .** This "finder
33180 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  " function attem
33190 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  pts to determine
331a0 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
331b0 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66  g strategy .** f
331c0 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
331d0 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e  file "filePath".
331e0 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e    It then return
331f0 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  s the sqlite3_io
33200 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65  _methods.** obje
33210 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
33220 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79  ts that strategy
33230 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
33240 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e  for MacOSX only.
33250 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
33260 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
33270 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46  ods *autolockIoF
33280 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e  inderImpl(.  con
33290 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74  st char *filePat
332a0 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66  h,    /* name of
332b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
332c0 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
332d0 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20   *pNew          
332e0 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62   /* open file ob
332f0 6a 65 63 74 20 66 6f 72 20 74 68 65 20 64 61 74  ject for the dat
33300 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b  abase file */.){
33310 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
33320 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b  struct Mapping {
33330 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
33340 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 20 20  *zFilesystem;   
33350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
33360 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 6e 61  lesystem type na
33370 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  me */.    const 
33380 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
33390 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20  ds *pMethods;   
333a0 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65 20 6c  /* Appropriate l
333b0 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f  ocking method */
333c0 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a  .  } aMap[] = {.
333d0 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20 20      { "hfs",    
333e0 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20  &posixIoMethods 
333f0 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22 2c 20  },.    { "ufs", 
33400 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f     &posixIoMetho
33410 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70  ds },.    { "afp
33420 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68  fs",  &afpIoMeth
33430 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d  ods },.    { "sm
33440 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74  bfs",  &afpIoMet
33450 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77  hods },.    { "w
33460 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49  ebdav", &nolockI
33470 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
33480 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20  { 0, 0 }.  };.  
33490 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
334a0 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20  statfs fsInfo;. 
334b0 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
334c0 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21  ckInfo;..  if( !
334d0 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20  filePath ){.    
334e0 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d  /* If filePath==
334f0 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
33500 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
33510 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ith a transient 
33520 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  file.    ** that
33530 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
33540 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  o be locked. */.
33550 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
33560 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
33570 0a 20 20 69 66 28 20 73 74 61 74 66 73 28 66 69  .  if( statfs(fi
33580 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29  lePath, &fsInfo)
33590 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69 66   != -1 ){.    if
335a0 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73  ( fsInfo.f_flags
335b0 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b   & MNT_RDONLY ){
335c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e  .      return &n
335d0 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
335e0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
335f0 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65  0; aMap[i].zFile
33600 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  system; i++){.  
33610 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66      if( strcmp(f
33620 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
33630 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c  me, aMap[i].zFil
33640 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20  esystem)==0 ){. 
33650 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 4d         return aM
33660 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a  ap[i].pMethods;.
33670 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
33680 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20  }..  /* Default 
33690 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61  case. Handles, a
336a0 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20 22  mongst others, "
336b0 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20  nfs"..  ** Test 
336c0 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20  byte-range lock 
336d0 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49  using fcntl(). I
336e0 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63 63 65  f the call succe
336f0 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d  eds, .  ** assum
33700 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 2d  e that the file-
33710 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20  system supports 
33720 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b  POSIX style lock
33730 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49  s. .  */.  lockI
33740 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  nfo.l_len = 1;. 
33750 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72   lockInfo.l_star
33760 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66  t = 0;.  lockInf
33770 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  o.l_whence = SEE
33780 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66  K_SET;.  lockInf
33790 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  o.l_type = F_RDL
337a0 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74  CK;.  if( osFcnt
337b0 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54  l(pNew->h, F_GET
337c0 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d  LK, &lockInfo)!=
337d0 2d 31 20 29 20 7b 0a 20 20 20 20 69 66 28 20 73  -1 ) {.    if( s
337e0 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66  trcmp(fsInfo.f_f
337f0 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22  stypename, "nfs"
33800 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
33810 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f  turn &nfsIoMetho
33820 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ds;.    } else {
33830 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70  .      return &p
33840 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  osixIoMethods;. 
33850 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
33860 20 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63    return &dotloc
33870 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  kIoMethods;.  }.
33880 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  }.static const s
33890 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
338a0 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75  s .  *(*const au
338b0 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28  tolockIoFinder)(
338c0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
338d0 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63  File*) = autoloc
338e0 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a  kIoFinderImpl;..
338f0 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
33900 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
33910 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
33920 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
33930 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f  #if OS_VXWORKS./
33940 2a 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65  *.** This "finde
33950 72 22 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  r" function for 
33960 56 78 57 6f 72 6b 73 20 63 68 65 63 6b 73 20 74  VxWorks checks t
33970 6f 20 73 65 65 20 69 66 20 70 6f 73 69 78 20 61  o see if posix a
33980 64 76 69 73 6f 72 79 0a 2a 2a 20 6c 6f 63 6b 69  dvisory.** locki
33990 6e 67 20 77 6f 72 6b 73 2e 20 20 49 66 20 69 74  ng works.  If it
339a0 20 64 6f 65 73 2c 20 74 68 65 6e 20 74 68 61 74   does, then that
339b0 20 69 73 20 77 68 61 74 20 69 73 20 75 73 65 64   is what is used
339c0 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f  .  If it does no
339d0 74 0a 2a 2a 20 77 6f 72 6b 2c 20 74 68 65 6e 20  t.** work, then 
339e0 66 61 6c 6c 62 61 63 6b 20 74 6f 20 6e 61 6d 65  fallback to name
339f0 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
33a00 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ing..*/.static c
33a10 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
33a20 6d 65 74 68 6f 64 73 20 2a 76 78 77 6f 72 6b 73  methods *vxworks
33a30 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20  IoFinderImpl(.  
33a40 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
33a50 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65  Path,    /* name
33a60 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
33a70 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46   file */.  unixF
33a80 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20  ile *pNew       
33a90 20 20 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20      /* the open 
33aa0 66 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  file object */.)
33ab0 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  {.  struct flock
33ac0 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66   lockInfo;..  if
33ad0 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20  ( !filePath ){. 
33ae0 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74     /* If filePat
33af0 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  h==NULL that mea
33b00 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  ns we are dealin
33b10 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65  g with a transie
33b20 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74  nt file.    ** t
33b30 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
33b40 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20  d to be locked. 
33b50 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e  */.    return &n
33b60 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
33b70 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69    }..  /* Test i
33b80 66 20 66 63 6e 74 6c 28 29 20 69 73 20 73 75 70  f fcntl() is sup
33b90 70 6f 72 74 65 64 20 61 6e 64 20 75 73 65 20 50  ported and use P
33ba0 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73  OSIX style locks
33bb0 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65  ..  ** Otherwise
33bc0 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68   fall back to th
33bd0 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  e named semaphor
33be0 65 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20  e method..  */. 
33bf0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20   lockInfo.l_len 
33c00 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 1;.  lockInfo.
33c10 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c  l_start = 0;.  l
33c20 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65  ockInfo.l_whence
33c30 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c   = SEEK_SET;.  l
33c40 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d  ockInfo.l_type =
33c50 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20   F_RDLCK;.  if( 
33c60 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c  osFcntl(pNew->h,
33c70 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49   F_GETLK, &lockI
33c80 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20  nfo)!=-1 ) {.   
33c90 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f   return &posixIo
33ca0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65  Methods;.  }else
33cb0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 73 65  {.    return &se
33cc0 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  mIoMethods;.  }.
33cd0 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  }.static const s
33ce0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
33cf0 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 76 78  s .  *(*const vx
33d00 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72 29 28 63  worksIoFinder)(c
33d10 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
33d20 69 6c 65 2a 29 20 3d 20 76 78 77 6f 72 6b 73 49  ile*) = vxworksI
33d30 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65  oFinderImpl;..#e
33d40 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
33d50 4b 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  KS */../*.** An 
33d60 61 62 73 74 72 61 63 74 20 74 79 70 65 20 66 6f  abstract type fo
33d70 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  r a pointer to a
33d80 6e 20 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64  n IO method find
33d90 65 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a  er function:.*/.
33da0 74 79 70 65 64 65 66 20 63 6f 6e 73 74 20 73 71  typedef const sq
33db0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
33dc0 20 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70 65 29   *(*finder_type)
33dd0 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69  (const char*,uni
33de0 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a  xFile*);.../****
33df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33e30 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
33e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33e50 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  ***** sqlite3_vf
33e60 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  s methods ******
33e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33e80 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69  ******.**.** Thi
33e90 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61  s division conta
33ea0 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ins the implemen
33eb0 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64  tation of method
33ec0 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69  s on the.** sqli
33ed0 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a  te3_vfs object..
33ee0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  */../*.** Initia
33ef0 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  lize the content
33f00 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c  s of the unixFil
33f10 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  e structure poin
33f20 74 65 64 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a  ted to by pId..*
33f30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
33f40 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 73  lInUnixFile(.  s
33f50 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
33f60 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ,      /* Pointe
33f70 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20  r to vfs object 
33f80 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20  */.  int h,     
33f90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33fa0 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  Open file descri
33fb0 70 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69  ptor of file bei
33fc0 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73  ng opened */.  s
33fd0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64  qlite3_file *pId
33fe0 2c 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ,      /* Write 
33ff0 74 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  to the unixFile 
34000 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
34010 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
34020 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e  zFilename,  /* N
34030 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
34040 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a  being opened */.
34050 20 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20    int ctrlFlags 
34060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72            /* Zer
34070 6f 20 6f 72 20 6d 6f 72 65 20 55 4e 49 58 46 49  o or more UNIXFI
34080 4c 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 29  LE_* values */.)
34090 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  {.  const sqlite
340a0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c  3_io_methods *pL
340b0 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75  ockingStyle;.  u
340c0 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20  nixFile *pNew = 
340d0 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b  (unixFile *)pId;
340e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
340f0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
34100 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d  ( pNew->pInode==
34110 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 55 73  NULL );..  /* Us
34120 75 61 6c 6c 79 20 74 68 65 20 70 61 74 68 20 7a  ually the path z
34130 46 69 6c 65 6e 61 6d 65 20 73 68 6f 75 6c 64 20  Filename should 
34140 6e 6f 74 20 62 65 20 61 20 72 65 6c 61 74 69 76  not be a relativ
34150 65 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 0a  e pathname. The.
34160 20 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20 69    ** exception i
34170 73 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74  s when opening t
34180 68 65 20 70 72 6f 78 79 20 22 63 6f 6e 63 68 22  he proxy "conch"
34190 20 66 69 6c 65 20 69 6e 20 62 75 69 6c 64 73 20   file in builds 
341a0 74 68 61 74 0a 20 20 2a 2a 20 69 6e 63 6c 75 64  that.  ** includ
341b0 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 41 70  e the special Ap
341c0 70 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c  ple locking styl
341d0 65 73 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66  es..  */.#if def
341e0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
341f0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
34200 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
34210 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
34220 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61  me==0 || zFilena
34230 6d 65 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20  me[0]=='/' .    
34240 7c 7c 20 70 56 66 73 2d 3e 70 41 70 70 44 61 74  || pVfs->pAppDat
34250 61 3d 3d 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c  a==(void*)&autol
34260 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 3b 0a 23  ockIoFinder );.#
34270 65 6c 73 65 0a 20 20 61 73 73 65 72 74 28 20 7a  else.  assert( z
34280 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
34290 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27  Filename[0]=='/'
342a0 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   );.#endif..  /*
342b0 20 4e 6f 20 6c 6f 63 6b 69 6e 67 20 6f 63 63 75   No locking occu
342c0 72 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20  rs in temporary 
342d0 66 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  files */.  asser
342e0 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20  t( zFilename!=0 
342f0 7c 7c 20 28 63 74 72 6c 46 6c 61 67 73 20 26 20  || (ctrlFlags & 
34300 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 29  UNIXFILE_NOLOCK)
34310 21 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  !=0 );..  OSTRAC
34320 45 28 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64  E(("OPEN    %-3d
34330 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65   %s\n", h, zFile
34340 6e 61 6d 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  name));.  pNew->
34350 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 70  h = h;.  pNew->p
34360 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 4e  Vfs = pVfs;.  pN
34370 65 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c  ew->zPath = zFil
34380 65 6e 61 6d 65 3b 0a 20 20 70 4e 65 77 2d 3e 63  ename;.  pNew->c
34390 74 72 6c 46 6c 61 67 73 20 3d 20 28 75 38 29 63  trlFlags = (u8)c
343a0 74 72 6c 46 6c 61 67 73 3b 0a 23 69 66 20 53 51  trlFlags;.#if SQ
343b0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
343c0 5a 45 3e 30 0a 20 20 70 4e 65 77 2d 3e 6d 6d 61  ZE>0.  pNew->mma
343d0 70 53 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74  pSizeMax = sqlit
343e0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
343f0 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69 66 0a 20 20  zMmap;.#endif.  
34400 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  if( sqlite3_uri_
34410 62 6f 6f 6c 65 61 6e 28 28 28 63 74 72 6c 46 6c  boolean(((ctrlFl
34420 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 55  ags & UNIXFILE_U
34430 52 49 29 20 3f 20 7a 46 69 6c 65 6e 61 6d 65 20  RI) ? zFilename 
34440 3a 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  : 0),.          
34450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34460 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f   "psow", SQLITE_
34470 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
34480 49 54 45 29 20 29 7b 0a 20 20 20 20 70 4e 65 77  ITE) ){.    pNew
34490 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ->ctrlFlags |= U
344a0 4e 49 58 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20  NIXFILE_PSOW;.  
344b0 7d 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 70  }.  if( strcmp(p
344c0 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78  Vfs->zName,"unix
344d0 2d 65 78 63 6c 22 29 3d 3d 30 20 29 7b 0a 20 20  -excl")==0 ){.  
344e0 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67    pNew->ctrlFlag
344f0 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 45 58  s |= UNIXFILE_EX
34500 43 4c 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f  CL;.  }..#if OS_
34510 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e  VXWORKS.  pNew->
34520 70 49 64 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e  pId = vxworksFin
34530 64 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d  dFileId(zFilenam
34540 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e  e);.  if( pNew->
34550 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20 63 74  pId==0 ){.    ct
34560 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
34570 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 20 20  ILE_NOLOCK;.    
34580 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
34590 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  M;.  }.#endif.. 
345a0 20 69 66 28 20 63 74 72 6c 46 6c 61 67 73 20 26   if( ctrlFlags &
345b0 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b   UNIXFILE_NOLOCK
345c0 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67   ){.    pLocking
345d0 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49  Style = &nolockI
345e0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73  oMethods;.  }els
345f0 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53  e{.    pLockingS
34600 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65  tyle = (**(finde
34610 72 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41  r_type*)pVfs->pA
34620 70 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d  ppData)(zFilenam
34630 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51  e, pNew);.#if SQ
34640 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
34650 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a  ING_STYLE.    /*
34660 20 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65   Cache zFilename
34670 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
34680 63 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64  context (AFP and
34690 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64   dotlock overrid
346a0 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72  e) for.    ** pr
346b0 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69  oxyLock activati
346c0 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28  on is possible (
346d0 72 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20  remote proxy is 
346e0 62 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65  based on db name
346f0 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61  ).    ** zFilena
34700 6d 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  me remains valid
34710 20 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63   until file is c
34720 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72  losed, to suppor
34730 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c  t */.    pNew->l
34740 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
34750 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65  (void*)zFilename
34760 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
34770 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
34780 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74  e == &posixIoMet
34790 68 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64  hods.#if defined
347a0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
347b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
347c0 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c  KING_STYLE.    |
347d0 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  | pLockingStyle 
347e0 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73  == &nfsIoMethods
347f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 2f 2a 20  .#endif.     /* 
34800 73 75 70 70 6f 72 74 20 57 41 4c 20 6d 6f 64 65  support WAL mode
34810 20 6f 6e 20 72 65 61 64 20 6f 6e 6c 79 20 6d 6f   on read only mo
34820 75 6e 74 65 64 20 66 69 6c 65 73 79 73 74 65 6d  unted filesystem
34830 20 2a 2f 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b   */.    || pLock
34840 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e 6f 6c  ingStyle == &nol
34850 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 0a 20 20  ockIoMethods .  
34860 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  ){.    unixEnter
34870 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20  Mutex();.    rc 
34880 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  = findInodeInfo(
34890 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e  pNew, &pNew->pIn
348a0 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ode);.    if( rc
348b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
348c0 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72       /* If an er
348d0 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20  ror occurred in 
348e0 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c  findInodeInfo(),
348f0 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
34900 64 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20 20  descriptor.     
34910 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c   ** immediately,
34920 20 62 65 66 6f 72 65 20 72 65 6c 65 61 73 69 6e   before releasin
34930 67 20 74 68 65 20 6d 75 74 65 78 2e 20 66 69 6e  g the mutex. fin
34940 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79  dInodeInfo() may
34950 20 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69   fail.      ** i
34960 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a  n two scenarios:
34970 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
34980 2a 2a 20 20 20 28 61 29 20 41 20 63 61 6c 6c 20  **   (a) A call 
34990 74 6f 20 66 73 74 61 74 28 29 20 66 61 69 6c 65  to fstat() faile
349a0 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 62  d..      **   (b
349b0 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65  ) A malloc faile
349c0 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
349d0 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28 62    ** Scenario (b
349e0 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72  ) may only occur
349f0 20 69 66 20 74 68 65 20 70 72 6f 63 65 73 73 20   if the process 
34a00 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74  is holding no ot
34a10 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  her.      ** fil
34a20 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70  e descriptors op
34a30 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66  en on the same f
34a40 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 77 65  ile. If there we
34a50 72 65 20 6f 74 68 65 72 20 66 69 6c 65 0a 20 20  re other file.  
34a60 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f      ** descripto
34a70 72 73 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c  rs on this file,
34a80 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20   then no malloc 
34a90 77 6f 75 6c 64 20 62 65 20 72 65 71 75 69 72 65  would be require
34aa0 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 66 69  d by.      ** fi
34ab0 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49  ndInodeInfo(). I
34ac0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
34ad0 73 65 2c 20 69 74 20 69 73 20 71 75 69 74 65 20  se, it is quite 
34ae0 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20  safe to close.  
34af0 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20      ** handle h 
34b00 2d 20 61 73 20 69 74 20 69 73 20 67 75 61 72 61  - as it is guara
34b10 6e 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70 6f  nteed that no po
34b20 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62  six locks will b
34b30 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 20  e released.     
34b40 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e   ** by doing so.
34b50 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
34b60 2a 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20 28  ** If scenario (
34b70 61 29 20 63 61 75 73 65 64 20 74 68 65 20 65 72  a) caused the er
34b80 72 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73 20  ror then things 
34b90 61 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e  are not so safe.
34ba0 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d   The.      ** im
34bb0 70 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69 6f  plicit assumptio
34bc0 6e 20 68 65 72 65 20 69 73 20 74 68 61 74 20 69  n here is that i
34bd0 66 20 66 73 74 61 74 28 29 20 66 61 69 6c 73 2c  f fstat() fails,
34be0 20 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a 20   things are in. 
34bf0 20 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61 64       ** such bad
34c00 20 73 68 61 70 65 20 74 68 61 74 20 64 72 6f 70   shape that drop
34c10 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74  ping a lock or t
34c20 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  wo doesn't matte
34c30 72 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f  r much..      */
34c40 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
34c50 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c  ose(pNew, h, __L
34c60 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68 20  INE__);.      h 
34c70 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
34c80 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
34c90 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54  ;.  }..#if SQLIT
34ca0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
34cb0 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
34cc0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 65  d(__APPLE__).  e
34cd0 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  lse if( pLocking
34ce0 53 74 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f 4d  Style == &afpIoM
34cf0 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
34d00 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65   AFP locking use
34d10 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20  s the file path 
34d20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  so it needs to b
34d30 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20  e included in.  
34d40 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b    ** the afpLock
34d50 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20  ingContext..    
34d60 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e  */.    afpLockin
34d70 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a  gContext *pCtx;.
34d80 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
34d90 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 20  gContext = pCtx 
34da0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
34db0 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20  ( sizeof(*pCtx) 
34dc0 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 3d  );.    if( pCtx=
34dd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
34de0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
34df0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34e00 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65  /* NB: zFilename
34e10 20 65 78 69 73 74 73 20 61 6e 64 20 72 65 6d 61   exists and rema
34e20 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20  ins valid until 
34e30 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  the file is clos
34e40 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 63 63 6f  ed.      ** acco
34e50 72 64 69 6e 67 20 74 6f 20 72 65 71 75 69 72 65  rding to require
34e60 6d 65 6e 74 20 46 31 31 31 34 31 2e 20 20 53 6f  ment F11141.  So
34e70 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20   we do not need 
34e80 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20 20 20  to make a.      
34e90 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66  ** copy of the f
34ea0 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20  ilename. */.    
34eb0 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d    pCtx->dbPath =
34ec0 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20   zFilename;.    
34ed0 20 20 70 43 74 78 2d 3e 72 65 73 65 72 76 65 64    pCtx->reserved
34ee0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 72 61 6e   = 0;.      sran
34ef0 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20 20 20  domdev();.      
34f00 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
34f10 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69 6e  ;.      rc = fin
34f20 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c  dInodeInfo(pNew,
34f30 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b   &pNew->pInode);
34f40 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
34f50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34f60 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
34f70 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  (pNew->lockingCo
34f80 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  ntext);.        
34f90 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
34fa0 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
34fb0 0a 20 20 20 20 20 20 20 20 68 20 3d 20 2d 31 3b  .        h = -1;
34fc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75  .      }.      u
34fd0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
34fe0 20 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20          .    }. 
34ff0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73   }.#endif..  els
35000 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74  e if( pLockingSt
35010 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49  yle == &dotlockI
35020 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
35030 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  /* Dotfile locki
35040 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65  ng uses the file
35050 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64   path so it need
35060 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64  s to be included
35070 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   in.    ** the d
35080 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e  otlockLockingCon
35090 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20  text .    */.   
350a0 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
350b0 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e  ;.    int nFilen
350c0 61 6d 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ame;.    assert(
350d0 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 29 3b   zFilename!=0 );
350e0 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d  .    nFilename =
350f0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69   (int)strlen(zFi
35100 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20  lename) + 6;.   
35110 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68   zLockFile = (ch
35120 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ar *)sqlite3_mal
35130 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a  loc(nFilename);.
35140 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c      if( zLockFil
35150 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
35160 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
35170 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
35180 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
35190 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c  tf(nFilename, zL
351a0 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22 20 44 4f  ockFile, "%s" DO
351b0 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46  TLOCK_SUFFIX, zF
351c0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ilename);.    }.
351d0 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
351e0 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b  gContext = zLock
351f0 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f  File;.  }..#if O
35200 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65  S_VXWORKS.  else
35210 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
35220 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68  le == &semIoMeth
35230 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61  ods ){.    /* Na
35240 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
35250 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
35260 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
35270 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a  eeds to be.    *
35280 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  * included in th
35290 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74  e semLockingCont
352a0 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75  ext.    */.    u
352b0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
352c0 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e  .    rc = findIn
352d0 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70  odeInfo(pNew, &p
352e0 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20  New->pInode);.  
352f0 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54    if( (rc==SQLIT
35300 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e  E_OK) && (pNew->
35310 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55  pInode->pSem==NU
35320 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61  LL) ){.      cha
35330 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e  r *zSemName = pN
35340 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d  ew->pInode->aSem
35350 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20  Name;.      int 
35360 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  n;.      sqlite3
35370 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41  _snprintf(MAX_PA
35380 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65  THNAME, zSemName
35390 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20  , "/%s.sem",.   
353a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
353b0 20 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a      pNew->pId->z
353c0 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a  CanonicalName);.
353d0 20 20 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20        for( n=1; 
353e0 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b  zSemName[n]; n++
353f0 20 29 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a   ).        if( z
35400 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20  SemName[n]=='/' 
35410 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20  ) zSemName[n] = 
35420 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  '_';.      pNew-
35430 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20  >pInode->pSem = 
35440 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d  sem_open(zSemNam
35450 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36 36 36  e, O_CREAT, 0666
35460 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
35470 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  pNew->pInode->pS
35480 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44  em == SEM_FAILED
35490 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
354a0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
354b0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e         pNew->pIn
354c0 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d  ode->aSemName[0]
354d0 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d   = '\0';.      }
354e0 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c  .    }.    unixL
354f0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
35500 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 73 74 6f  .#endif.  .  sto
35510 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 4e 65 77  reLastErrno(pNew
35520 2c 20 30 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57  , 0);.#if OS_VXW
35530 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53  ORKS.  if( rc!=S
35540 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35550 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73  if( h>=0 ) robus
35560 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c  t_close(pNew, h,
35570 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
35580 68 20 3d 20 2d 31 3b 0a 20 20 20 20 6f 73 55 6e  h = -1;.    osUn
35590 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  link(zFilename);
355a0 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46  .    pNew->ctrlF
355b0 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
355c0 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 0a 23 65 6e  _DELETE;.  }.#en
355d0 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51  dif.  if( rc!=SQ
355e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
355f0 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74  f( h>=0 ) robust
35600 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20  _close(pNew, h, 
35610 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c  __LINE__);.  }el
35620 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d  se{.    pNew->pM
35630 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67  ethod = pLocking
35640 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43  Style;.    OpenC
35650 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 20 20  ounter(+1);.    
35660 76 65 72 69 66 79 44 62 46 69 6c 65 28 70 4e 65  verifyDbFile(pNe
35670 77 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  w);.  }.  return
35680 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
35690 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
356a0 20 61 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20   a directory in 
356b0 77 68 69 63 68 20 74 6f 20 70 75 74 20 74 65 6d  which to put tem
356c0 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a  porary files..**
356d0 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20   If no suitable 
356e0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 64  temporary file d
356f0 69 72 65 63 74 6f 72 79 20 63 61 6e 20 62 65 20  irectory can be 
35700 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e 55  found, return NU
35710 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  LL..*/.static co
35720 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54 65  nst char *unixTe
35730 6d 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29 7b  mpFileDir(void){
35740 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
35750 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d  char *azDirs[] =
35760 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20   {.     0,.     
35770 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20  0,.     0,.     
35780 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/var/tmp",.    
35790 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20   "/usr/tmp",.   
357a0 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 30    "/tmp",.     0
357b0 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
357c0 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20  terminator */.  
357d0 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  };.  unsigned in
357e0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74  t i;.  struct st
357f0 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20  at buf;.  const 
35800 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a  char *zDir = 0;.
35810 0a 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73  .  azDirs[0] = s
35820 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
35830 63 74 6f 72 79 3b 0a 20 20 69 66 28 20 21 61 7a  ctory;.  if( !az
35840 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73  Dirs[1] ) azDirs
35850 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 53 51  [1] = getenv("SQ
35860 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20  LITE_TMPDIR");. 
35870 20 69 66 28 20 21 61 7a 44 69 72 73 5b 32 5d 20   if( !azDirs[2] 
35880 29 20 61 7a 44 69 72 73 5b 32 5d 20 3d 20 67 65  ) azDirs[2] = ge
35890 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a  tenv("TMPDIR");.
358a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
358b0 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65  eof(azDirs)/size
358c0 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a  of(azDirs[0]); z
358d0 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29  Dir=azDirs[i++])
358e0 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d  {.    if( zDir==
358f0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
35900 20 20 69 66 28 20 6f 73 53 74 61 74 28 7a 44 69    if( osStat(zDi
35910 72 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69  r, &buf) ) conti
35920 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f  nue;.    if( !S_
35930 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64  ISDIR(buf.st_mod
35940 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
35950 20 20 20 69 66 28 20 6f 73 41 63 63 65 73 73 28     if( osAccess(
35960 7a 44 69 72 2c 20 30 37 29 20 29 20 63 6f 6e 74  zDir, 07) ) cont
35970 69 6e 75 65 3b 0a 20 20 20 20 62 72 65 61 6b 3b  inue;.    break;
35980 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 44  .  }.  return zD
35990 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  ir;.}../*.** Cre
359a0 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ate a temporary 
359b0 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75  file name in zBu
359c0 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65  f.  zBuf must be
359d0 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79   allocated.** by
359e0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   the calling pro
359f0 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65  cess and must be
35a00 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
35a10 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  old at least.** 
35a20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
35a30 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   bytes..*/.stati
35a40 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d  c int unixGetTem
35a50 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20  pname(int nBuf, 
35a60 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73  char *zBuf){.  s
35a70 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
35a80 67 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72 73  gned char zChars
35a90 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66  [] =.    "abcdef
35aa0 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
35ab0 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45  wxyz".    "ABCDE
35ac0 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55  FGHIJKLMNOPQRSTU
35ad0 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33  VWXYZ".    "0123
35ae0 34 35 36 37 38 39 22 3b 0a 20 20 75 6e 73 69 67  456789";.  unsig
35af0 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ned int i, j;.  
35b00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72  const char *zDir
35b10 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  ;..  /* It's odd
35b20 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
35b30 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
35b40 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
35b50 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
35b60 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
35b70 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
35b80 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
35b90 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
35ba0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
35bb0 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69  ling. .  */.  Si
35bc0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
35bd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
35be0 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20  RR );..  zDir = 
35bf0 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28  unixTempFileDir(
35c00 29 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d 30  );.  if( zDir==0
35c10 20 29 20 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a   ) zDir = ".";..
35c20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
35c30 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
35c40 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  r is large enoug
35c50 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72  h for the tempor
35c60 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e  ary file .  ** n
35c70 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ame. If it is no
35c80 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
35c90 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69  _ERROR..  */.  i
35ca0 66 28 20 28 73 74 72 6c 65 6e 28 7a 44 69 72 29  f( (strlen(zDir)
35cb0 20 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49 54 45   + strlen(SQLITE
35cc0 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
35cd0 58 29 20 2b 20 31 38 29 20 3e 3d 20 28 73 69 7a  X) + 18) >= (siz
35ce0 65 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20 20 20  e_t)nBuf ){.    
35cf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
35d00 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a  ROR;.  }..  do{.
35d10 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
35d20 69 6e 74 66 28 6e 42 75 66 2d 31 38 2c 20 7a 42  intf(nBuf-18, zB
35d30 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f  uf, "%s/"SQLITE_
35d40 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
35d50 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d  , zDir);.    j =
35d60 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75   (int)strlen(zBu
35d70 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  f);.    sqlite3_
35d80 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26  randomness(15, &
35d90 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f  zBuf[j]);.    fo
35da0 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b  r(i=0; i<15; i++
35db0 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42  , j++){.      zB
35dc0 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43  uf[j] = (char)zC
35dd0 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64  hars[ ((unsigned
35de0 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28   char)zBuf[j])%(
35df0 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31  sizeof(zChars)-1
35e00 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ) ];.    }.    z
35e10 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  Buf[j] = 0;.    
35e20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20  zBuf[j+1] = 0;. 
35e30 20 7d 77 68 69 6c 65 28 20 6f 73 41 63 63 65 73   }while( osAcces
35e40 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a  s(zBuf,0)==0 );.
35e50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
35e60 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  OK;.}..#if SQLIT
35e70 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
35e80 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
35e90 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a  d(__APPLE__)./*.
35ea0 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72  ** Routine to tr
35eb0 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69  ansform a unixFi
35ec0 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d  le into a proxy-
35ed0 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65  locking unixFile
35ee0 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  ..** Implementat
35ef0 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79  ion in the proxy
35f00 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20  -lock division, 
35f10 62 75 74 20 75 73 65 64 20 62 79 20 75 6e 69 78  but used by unix
35f20 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c  Open().** if SQL
35f30 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
35f40 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69  _LOCKING is defi
35f50 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
35f60 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72  nt proxyTransfor
35f70 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69  mUnixFile(unixFi
35f80 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  le*, const char*
35f90 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  );.#endif../*.**
35fa0 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75   Search for an u
35fb0 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
35fc0 69 70 74 6f 72 20 74 68 61 74 20 77 61 73 20 6f  iptor that was o
35fd0 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74  pened on the dat
35fe0 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28  abase .** file (
35ff0 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72  not a journal or
36000 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
36010 66 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65 64  file) identified
36020 20 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20   by pathname.** 
36030 7a 50 61 74 68 20 77 69 74 68 20 53 51 4c 49 54  zPath with SQLIT
36040 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73  E_OPEN_XXX flags
36050 20 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65 20   matching those 
36060 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
36070 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  cond.** argument
36080 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
36090 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20  n..**.** Such a 
360a0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
360b0 6d 61 79 20 65 78 69 73 74 20 69 66 20 61 20 64  may exist if a d
360c0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
360d0 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a  on was closed.**
360e0 20 62 75 74 20 74 68 65 20 61 73 73 6f 63 69 61   but the associa
360f0 74 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  ted file descrip
36100 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  tor could not be
36110 20 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65 20   closed because 
36120 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69  some.** other fi
36130 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70  le descriptor op
36140 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66  en on the same f
36150 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  ile is holding a
36160 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52   file-lock..** R
36170 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73  efer to comments
36180 20 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f 73   in the unixClos
36190 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  e() function and
361a0 20 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d   the lengthy com
361b0 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62 69  ment.** describi
361c0 6e 67 20 22 50 6f 73 69 78 20 41 64 76 69 73 6f  ng "Posix Adviso
361d0 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74  ry Locking" at t
361e0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73  he start of this
361f0 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75   file for .** fu
36200 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20 41  rther details. A
36210 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30 31  lso, ticket #401
36220 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75  8..**.** If a su
36230 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63  itable file desc
36240 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c  riptor is found,
36250 20 74 68 65 6e 20 69 74 20 69 73 20 72 65 74 75   then it is retu
36260 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73  rned. If no.** s
36270 75 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70  uch file descrip
36280 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c 20  tor is located, 
36290 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  -1 is returned..
362a0 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55 6e  */.static UnixUn
362b0 75 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75 73  usedFd *findReus
362c0 61 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68 61  ableFd(const cha
362d0 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c  r *zPath, int fl
362e0 61 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73  ags){.  UnixUnus
362f0 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20  edFd *pUnused = 
36300 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  0;..  /* Do not 
36310 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e  search for an un
36320 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
36330 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e  ptor on vxworks.
36340 20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20 2a   Not because.  *
36350 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20  * vxworks would 
36360 6e 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f 6d  not benefit from
36370 20 74 68 65 20 63 68 61 6e 67 65 20 28 69 74 20   the change (it 
36380 6d 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f 74  might, we're not
36390 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74   sure),.  ** but
363a0 20 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79 20   because no way 
363b0 74 6f 20 74 65 73 74 20 69 74 20 69 73 20 63 75  to test it is cu
363c0 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c  rrently availabl
363d0 65 2e 20 49 74 20 69 73 20 62 65 74 74 65 72 20  e. It is better 
363e0 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73  .  ** not to ris
363f0 6b 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f 72  k breaking vxwor
36400 6b 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74  ks support for t
36410 68 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68 20  he sake of such 
36420 61 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a  an obscure .  **
36430 20 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69   feature.  */.#i
36440 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  f !OS_VXWORKS.  
36450 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
36460 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
36470 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20       /* Results 
36480 6f 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20 2a  of stat() call *
36490 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28 29  /..  /* A stat()
364a0 20 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66   call may fail f
364b0 6f 72 20 76 61 72 69 6f 75 73 20 72 65 61 73 6f  or various reaso
364c0 6e 73 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ns. If this happ
364d0 65 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20  ens, it is.  ** 
364e0 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74  almost certain t
364f0 68 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63 61  hat an open() ca
36500 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70  ll on the same p
36510 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61  ath will also fa
36520 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69  il..  ** For thi
36530 73 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20  s reason, if an 
36540 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
36550 74 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c 20  the stat() call 
36560 68 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a  here, it is.  **
36570 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20   ignored and -1 
36580 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65  is returned. The
36590 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79   caller will try
365a0 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66   to open a new f
365b0 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70  ile.  ** descrip
365c0 74 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  tor on the same 
365d0 70 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20  path, fail, and 
365e0 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
365f0 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a  to SQLite..  **.
36600 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20 73    ** Even if a s
36610 75 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28 29  ubsequent open()
36620 20 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63 65   call does succe
36630 65 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75 65  ed, the conseque
36640 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74  nces of.  ** not
36650 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 61   searching for a
36660 20 72 65 75 73 61 62 6c 65 20 66 69 6c 65 20 64   reusable file d
36670 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6e 6f  escriptor are no
36680 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66  t dire.  */.  if
36690 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74  ( 0==osStat(zPat
366a0 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20  h, &sStat) ){.  
366b0 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
366c0 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e  *pInode;..    un
366d0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
366e0 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f      pInode = ino
366f0 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c  deList;.    whil
36700 65 28 20 70 49 6e 6f 64 65 20 26 26 20 28 70 49  e( pInode && (pI
36710 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76  node->fileId.dev
36720 21 3d 73 53 74 61 74 2e 73 74 5f 64 65 76 0a 20  !=sStat.st_dev. 
36730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36740 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66      || pInode->f
36750 69 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74  ileId.ino!=sStat
36760 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20  .st_ino) ){.    
36770 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f     pInode = pIno
36780 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  de->pNext;.    }
36790 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 20  .    if( pInode 
367a0 29 7b 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75  ){.      UnixUnu
367b0 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20  sedFd **pp;.    
367c0 20 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65    for(pp=&pInode
367d0 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26  ->pUnused; *pp &
367e0 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d  & (*pp)->flags!=
367f0 66 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70  flags; pp=&((*pp
36800 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20  )->pNext));.    
36810 20 20 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b    pUnused = *pp;
36820 0a 20 20 20 20 20 20 69 66 28 20 70 55 6e 75 73  .      if( pUnus
36830 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  ed ){.        *p
36840 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65  p = pUnused->pNe
36850 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
36860 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  }.    unixLeaveM
36870 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64  utex();.  }.#end
36880 69 66 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f  if    /* if !OS_
36890 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74  VXWORKS */.  ret
368a0 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a  urn pUnused;.}..
368b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
368c0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
368d0 20 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20 64   unixOpen() to d
368e0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 75 6e 69  etermine the uni
368f0 78 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a  x permissions.**
36900 20 74 6f 20 63 72 65 61 74 65 20 6e 65 77 20 66   to create new f
36910 69 6c 65 73 20 77 69 74 68 2e 20 49 66 20 6e 6f  iles with. If no
36920 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
36930 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  hen SQLITE_OK is
36940 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64   returned.** and
36950 20 61 20 76 61 6c 75 65 20 73 75 69 74 61 62 6c   a value suitabl
36960 65 20 66 6f 72 20 70 61 73 73 69 6e 67 20 61 73  e for passing as
36970 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
36980 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32 29 20 69  ent to open(2) i
36990 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20  s.** written to 
369a0 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f  *pMode. If an IO
369b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
369c0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
369d0 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  ode is .** retur
369e0 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75  ned and the valu
369f0 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e  e of *pMode is n
36a00 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  ot modified..**.
36a10 2a 2a 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73  ** In most cases
36a20 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  , this routine s
36a30 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 30 2c  ets *pMode to 0,
36a40 20 77 68 69 63 68 20 77 69 6c 6c 20 62 65 63 6f   which will beco
36a50 6d 65 0a 2a 2a 20 61 6e 20 69 6e 64 69 63 61 74  me.** an indicat
36a60 69 6f 6e 20 74 6f 20 72 6f 62 75 73 74 5f 6f 70  ion to robust_op
36a70 65 6e 28 29 20 74 6f 20 63 72 65 61 74 65 20 74  en() to create t
36a80 68 65 20 66 69 6c 65 20 75 73 69 6e 67 0a 2a 2a  he file using.**
36a90 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
36aa0 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
36ab0 20 61 64 6a 75 73 74 65 64 20 62 79 20 74 68 65   adjusted by the
36ac0 20 75 6d 61 73 6b 2e 0a 2a 2a 20 42 75 74 20 69   umask..** But i
36ad0 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67  f the file being
36ae0 20 6f 70 65 6e 65 64 20 69 73 20 61 20 57 41 4c   opened is a WAL
36af0 20 6f 72 20 72 65 67 75 6c 61 72 20 6a 6f 75 72   or regular jour
36b00 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a  nal file, then .
36b10 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
36b20 20 71 75 65 72 69 65 73 20 74 68 65 20 66 69 6c   queries the fil
36b30 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65  e-system for the
36b40 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20   permissions on 
36b50 74 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  the .** correspo
36b60 6e 64 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  nding database f
36b70 69 6c 65 20 61 6e 64 20 73 65 74 73 20 2a 70 4d  ile and sets *pM
36b80 6f 64 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ode to this valu
36b90 65 2e 20 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20  e. Whenever .** 
36ba0 70 6f 73 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e  possible, WAL an
36bb0 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  d journal files 
36bc0 61 72 65 20 63 72 65 61 74 65 64 20 75 73 69 6e  are created usin
36bd0 67 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69  g the same permi
36be0 73 73 69 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68  ssions .** as th
36bf0 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74  e associated dat
36c00 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
36c10 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * If the SQLITE_
36c20 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53  ENABLE_8_3_NAMES
36c30 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
36c40 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ed, then the.** 
36c50 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d  original filenam
36c60 65 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65  e is unavailable
36c70 2e 20 20 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53  .  But 8_3_NAMES
36c80 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f   is only used fo
36c90 72 0a 2a 2a 20 46 41 54 20 66 69 6c 65 73 79 73  r.** FAT filesys
36ca0 74 65 6d 73 20 61 6e 64 20 70 65 72 6d 69 73 73  tems and permiss
36cb0 69 6f 6e 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74  ions do not matt
36cc0 65 72 20 74 68 65 72 65 2c 20 73 6f 20 6a 75 73  er there, so jus
36cd0 74 20 75 73 65 0a 2a 2a 20 74 68 65 20 64 65 66  t use.** the def
36ce0 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73  ault permissions
36cf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
36d00 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f  findCreateFileMo
36d10 64 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  de(.  const char
36d20 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
36d30 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66        /* Path of
36d40 20 66 69 6c 65 20 28 70 6f 73 73 69 62 6c 79 29   file (possibly)
36d50 20 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 2a   being created *
36d60 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
36d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d80 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
36d90 73 65 64 20 61 73 20 34 74 68 20 61 72 67 75 6d  sed as 4th argum
36da0 65 6e 74 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a  ent to xOpen() *
36db0 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64  /.  mode_t *pMod
36dc0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
36dd0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d      /* OUT: Perm
36de0 69 73 73 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20  issions to open 
36df0 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 75  file with */.  u
36e00 69 64 5f 74 20 2a 70 55 69 64 2c 20 20 20 20 20  id_t *pUid,     
36e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36e20 2a 20 4f 55 54 3a 20 75 69 64 20 74 6f 20 73 65  * OUT: uid to se
36e30 74 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f  t on the file */
36e40 0a 20 20 67 69 64 5f 74 20 2a 70 47 69 64 20 20  .  gid_t *pGid  
36e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e60 20 20 20 2f 2a 20 4f 55 54 3a 20 67 69 64 20 74     /* OUT: gid t
36e70 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c  o set on the fil
36e80 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
36e90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
36ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
36eb0 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 2a 70  urn Code */.  *p
36ec0 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 2a 70 55 69  Mode = 0;.  *pUi
36ed0 64 20 3d 20 30 3b 0a 20 20 2a 70 47 69 64 20 3d  d = 0;.  *pGid =
36ee0 20 30 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20   0;.  if( flags 
36ef0 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  & (SQLITE_OPEN_W
36f00 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  AL|SQLITE_OPEN_M
36f10 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a  AIN_JOURNAL) ){.
36f20 20 20 20 20 63 68 61 72 20 7a 44 62 5b 4d 41 58      char zDb[MAX
36f30 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 20 20 20  _PATHNAME+1];   
36f40 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
36f50 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69  le path */.    i
36f60 6e 74 20 6e 44 62 3b 20 20 20 20 20 20 20 20 20  nt nDb;         
36f70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36f80 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  Number of valid 
36f90 62 79 74 65 73 20 69 6e 20 7a 44 62 20 2a 2f 0a  bytes in zDb */.
36fa0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
36fb0 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
36fc0 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f 66 20 73    /* Output of s
36fd0 74 61 74 28 29 20 6f 6e 20 64 61 74 61 62 61 73  tat() on databas
36fe0 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f  e file */..    /
36ff0 2a 20 7a 50 61 74 68 20 69 73 20 61 20 70 61 74  * zPath is a pat
37000 68 20 74 6f 20 61 20 57 41 4c 20 6f 72 20 6a 6f  h to a WAL or jo
37010 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
37020 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
37030 64 65 72 69 76 65 73 0a 20 20 20 20 2a 2a 20 74  derives.    ** t
37040 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 61  he path to the a
37050 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
37060 73 65 20 66 69 6c 65 20 66 72 6f 6d 20 7a 50 61  se file from zPa
37070 74 68 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 68  th. This block h
37080 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a 20 74 68  andles.    ** th
37090 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69  e following nami
370a0 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a  ng conventions:.
370b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
370c0 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f  "<path to db>-jo
370d0 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20  urnal".    **   
370e0 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61  "<path to db>-wa
370f0 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  l".    **   "<pa
37100 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61  th to db>-journa
37110 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c  lNN".    **   "<
37120 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 4e  path to db>-walN
37130 4e 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  N".    **.    **
37140 20 77 68 65 72 65 20 4e 4e 20 69 73 20 61 20 64   where NN is a d
37150 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72 2e 20 54  ecimal number. T
37160 68 65 20 4e 4e 20 6e 61 6d 69 6e 67 20 73 63 68  he NN naming sch
37170 65 6d 65 73 20 61 72 65 20 0a 20 20 20 20 2a 2a  emes are .    **
37180 20 75 73 65 64 20 62 79 20 74 68 65 20 74 65 73   used by the tes
37190 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63 20 6d 6f  t_multiplex.c mo
371a0 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  dule..    */.   
371b0 20 6e 44 62 20 3d 20 73 71 6c 69 74 65 33 53 74   nDb = sqlite3St
371c0 72 6c 65 6e 33 30 28 7a 50 61 74 68 29 20 2d 20  rlen30(zPath) - 
371d0 31 3b 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54  1; .#ifdef SQLIT
371e0 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d  E_ENABLE_8_3_NAM
371f0 45 53 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 44  ES.    while( nD
37200 62 3e 30 20 26 26 20 73 71 6c 69 74 65 33 49 73  b>0 && sqlite3Is
37210 61 6c 6e 75 6d 28 7a 50 61 74 68 5b 6e 44 62 5d  alnum(zPath[nDb]
37220 29 20 29 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 69  ) ) nDb--;.    i
37230 66 28 20 6e 44 62 3d 3d 30 20 7c 7c 20 7a 50 61  f( nDb==0 || zPa
37240 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 20 72  th[nDb]!='-' ) r
37250 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
37260 0a 23 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65  .#else.    while
37270 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d  ( zPath[nDb]!='-
37280 27 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ' ){.      asser
37290 74 28 20 6e 44 62 3e 30 20 29 3b 0a 20 20 20 20  t( nDb>0 );.    
372a0 20 20 61 73 73 65 72 74 28 20 7a 50 61 74 68 5b    assert( zPath[
372b0 6e 44 62 5d 21 3d 27 5c 6e 27 20 29 3b 0a 20 20  nDb]!='\n' );.  
372c0 20 20 20 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d      nDb--;.    }
372d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 6d 65 6d 63  .#endif.    memc
372e0 70 79 28 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e  py(zDb, zPath, n
372f0 44 62 29 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62  Db);.    zDb[nDb
37300 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 69  ] = '\0';..    i
37310 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 44 62  f( 0==osStat(zDb
37320 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20  , &sStat) ){.   
37330 20 20 20 2a 70 4d 6f 64 65 20 3d 20 73 53 74 61     *pMode = sSta
37340 74 2e 73 74 5f 6d 6f 64 65 20 26 20 30 37 37 37  t.st_mode & 0777
37350 3b 0a 20 20 20 20 20 20 2a 70 55 69 64 20 3d 20  ;.      *pUid = 
37360 73 53 74 61 74 2e 73 74 5f 75 69 64 3b 0a 20 20  sStat.st_uid;.  
37370 20 20 20 20 2a 70 47 69 64 20 3d 20 73 53 74 61      *pGid = sSta
37380 74 2e 73 74 5f 67 69 64 3b 0a 20 20 20 20 7d 65  t.st_gid;.    }e
37390 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
373a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
373b0 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  AT;.    }.  }els
373c0 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51  e if( flags & SQ
373d0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
373e0 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20 2a  ONCLOSE ){.    *
373f0 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b 0a 20 20  pMode = 0600;.  
37400 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
37410 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
37420 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20   file zPath..** 
37430 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c 20  .** Previously, 
37440 74 68 65 20 53 51 4c 69 74 65 20 4f 53 20 6c 61  the SQLite OS la
37450 79 65 72 20 75 73 65 64 20 74 68 72 65 65 20 66  yer used three f
37460 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63  unctions in plac
37470 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65  e of this.** one
37480 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69  :.**.**     sqli
37490 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69  te3OsOpenReadWri
374a0 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c  te();.**     sql
374b0 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e  ite3OsOpenReadOn
374c0 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c  ly();.**     sql
374d0 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73  ite3OsOpenExclus
374e0 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ive();.**.** The
374f0 73 65 20 63 61 6c 6c 73 20 63 6f 72 72 65 73 70  se calls corresp
37500 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ond to the follo
37510 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wing combination
37520 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a  s of flags:.**.*
37530 2a 20 20 20 20 20 52 65 61 64 57 72 69 74 65 28  *     ReadWrite(
37540 29 20 2d 3e 20 20 20 20 20 28 52 45 41 44 57 52  ) ->     (READWR
37550 49 54 45 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a  ITE | CREATE).**
37560 20 20 20 20 20 52 65 61 64 4f 6e 6c 79 28 29 20       ReadOnly() 
37570 20 2d 3e 20 20 20 20 20 28 52 45 41 44 4f 4e 4c   ->     (READONL
37580 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45  Y) .**     OpenE
37590 78 63 6c 75 73 69 76 65 28 29 20 2d 3e 20 28 52  xclusive() -> (R
375a0 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54  EADWRITE | CREAT
375b0 45 20 7c 20 45 58 43 4c 55 53 49 56 45 29 0a 2a  E | EXCLUSIVE).*
375c0 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65  *.** The old Ope
375d0 6e 45 78 63 6c 75 73 69 76 65 28 29 20 61 63 63  nExclusive() acc
375e0 65 70 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20  epted a boolean 
375f0 61 72 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46  argument - "delF
37600 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65  lag". If.** true
37610 2c 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 63  , the file was c
37620 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 62 65 20  onfigured to be 
37630 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
37640 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 0a 2a  leted when the.*
37650 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c  * file handle cl
37660 6f 73 65 64 2e 20 54 6f 20 61 63 68 69 65 76 65  osed. To achieve
37670 20 74 68 65 20 73 61 6d 65 20 65 66 66 65 63 74   the same effect
37680 20 75 73 69 6e 67 20 74 68 69 73 20 6e 65 77 20   using this new 
37690 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 61  .** interface, a
376a0 64 64 20 74 68 65 20 44 45 4c 45 54 45 4f 4e 43  dd the DELETEONC
376b0 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20 74 68 6f  LOSE flag to tho
376c0 73 65 20 73 70 65 63 69 66 69 65 64 20 61 62 6f  se specified abo
376d0 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45  ve for .** OpenE
376e0 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73  xclusive()..*/.s
376f0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70  tatic int unixOp
37700 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
37710 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
37720 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 66 6f     /* The VFS fo
37730 72 20 77 68 69 63 68 20 74 68 69 73 20 69 73 20  r which this is 
37740 74 68 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64  the xOpen method
37750 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
37760 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
37770 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f     /* Pathname o
37780 66 20 66 69 6c 65 20 74 6f 20 62 65 20 6f 70 65  f file to be ope
37790 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ned */.  sqlite3
377a0 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20  _file *pFile,   
377b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
377c0 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
377d0 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a  be filled in */.
377e0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
377f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37800 2a 20 49 6e 70 75 74 20 66 6c 61 67 73 20 74 6f  * Input flags to
37810 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65   control the ope
37820 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ning */.  int *p
37830 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20  OutFlags        
37840 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
37850 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20   flags returned 
37860 74 6f 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a  to SQLite core *
37870 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
37880 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  *p = (unixFile *
37890 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64  )pFile;.  int fd
378a0 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
378b0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
378c0 20 64 65 73 63 72 69 70 74 6f 72 20 72 65 74 75   descriptor retu
378d0 72 6e 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a  rned by open() *
378e0 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  /.  int openFlag
378f0 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
37900 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70     /* Flags to p
37910 61 73 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f  ass to open() */
37920 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
37930 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49  LE_DATA_PROTECTI
37940 4f 4e 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  ON.  int eType =
37950 20 66 6c 61 67 73 26 30 78 46 46 30 46 46 46 30   flags&0xFF0FFF0
37960 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66  0;  /* Type of f
37970 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23  ile to open */.#
37980 65 6c 73 65 0a 20 20 69 6e 74 20 65 54 79 70 65  else.  int eType
37990 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46   = flags&0xFFFFF
379a0 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66  F00;  /* Type of
379b0 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
379c0 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 6e 6f  .#endif.  int no
379d0 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
379e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
379f0 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67   to omit locking
37a00 20 70 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20   primitives */. 
37a10 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
37a20 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
37a30 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75  /* Function Retu
37a40 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn Code */.  int
37a50 20 63 74 72 6c 46 6c 61 67 73 20 3d 20 30 3b 20   ctrlFlags = 0; 
37a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
37a70 4e 49 58 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20  NIXFILE_* flags 
37a80 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c  */..  int isExcl
37a90 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20  usive  = (flags 
37aa0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  & SQLITE_OPEN_EX
37ab0 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20  CLUSIVE);.  int 
37ac0 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28  isDelete     = (
37ad0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
37ae0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
37af0 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61  E);.  int isCrea
37b00 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
37b10 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  & SQLITE_OPEN_CR
37b20 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52  EATE);.  int isR
37b30 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61  eadonly   = (fla
37b40 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
37b50 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e  _READONLY);.  in
37b60 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d  t isReadWrite  =
37b70 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
37b80 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29  _OPEN_READWRITE)
37b90 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ;.#if SQLITE_ENA
37ba0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
37bb0 45 0a 20 20 69 6e 74 20 69 73 41 75 74 6f 50 72  E.  int isAutoPr
37bc0 6f 78 79 20 20 3d 20 28 66 6c 61 67 73 20 26 20  oxy  = (flags & 
37bd0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f  SQLITE_OPEN_AUTO
37be0 50 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a 23  PROXY);.#endif.#
37bf0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
37c00 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f  LE__) || SQLITE_
37c10 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
37c20 54 59 4c 45 0a 20 20 73 74 72 75 63 74 20 73 74  TYLE.  struct st
37c30 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 23 65 6e  atfs fsInfo;.#en
37c40 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65  dif..  /* If cre
37c50 61 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6f  ating a master o
37c60 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72  r main-file jour
37c70 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69  nal, this functi
37c80 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a  on will open.  *
37c90 2a 20 61 20 66 69 6c 65 2d 64 65 73 63 72 69 70  * a file-descrip
37ca0 74 6f 72 20 6f 6e 20 74 68 65 20 64 69 72 65 63  tor on the direc
37cb0 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20 66 69  tory too. The fi
37cc0 72 73 74 20 74 69 6d 65 20 75 6e 69 78 53 79 6e  rst time unixSyn
37cd0 63 28 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c  c().  ** is call
37ce0 65 64 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ed the directory
37cf0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
37d00 20 77 69 6c 6c 20 62 65 20 66 73 79 6e 63 28 29   will be fsync()
37d10 65 64 20 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e  ed and close()d.
37d20 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63  .  */.  int sync
37d30 44 69 72 20 3d 20 28 69 73 43 72 65 61 74 65 20  Dir = (isCreate 
37d40 26 26 20 28 0a 20 20 20 20 20 20 20 20 65 54 79  && (.        eTy
37d50 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
37d60 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a  MASTER_JOURNAL .
37d70 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
37d80 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
37d90 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c  JOURNAL .     ||
37da0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
37db0 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a 20  PEN_WAL.  ));.. 
37dc0 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20   /* If argument 
37dd0 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20  zPath is a NULL 
37de0 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75  pointer, this fu
37df0 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  nction is requir
37e00 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20  ed to open.  ** 
37e10 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
37e20 2e 20 55 73 65 20 74 68 69 73 20 62 75 66 66 65  . Use this buffe
37e30 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66  r to store the f
37e40 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a  ile name in..  *
37e50 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d  /.  char zTmpnam
37e60 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32  e[MAX_PATHNAME+2
37e70 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ];.  const char 
37e80 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a  *zName = zPath;.
37e90 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20  .  /* Check the 
37ea0 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d  following statem
37eb0 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a  ents are true: .
37ec0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20    **.  **   (a) 
37ed0 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74  Exactly one of t
37ee0 68 65 20 52 45 41 44 57 52 49 54 45 20 61 6e 64  he READWRITE and
37ef0 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20   READONLY flags 
37f00 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64  must be set, and
37f10 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20   .  **   (b) if 
37f20 43 52 45 41 54 45 20 69 73 20 73 65 74 2c 20 74  CREATE is set, t
37f30 68 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75  hen READWRITE mu
37f40 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20  st also be set, 
37f50 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69  and.  **   (c) i
37f60 66 20 45 58 43 4c 55 53 49 56 45 20 69 73 20 73  f EXCLUSIVE is s
37f70 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20  et, then CREATE 
37f80 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
37f90 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20  ..  **   (d) if 
37fa0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73  DELETEONCLOSE is
37fb0 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54   set, then CREAT
37fc0 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
37fd0 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
37fe0 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30  t((isReadonly==0
37ff0 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d   || isReadWrite=
38000 3d 30 29 20 26 26 20 28 69 73 52 65 61 64 57 72  =0) && (isReadWr
38010 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c  ite || isReadonl
38020 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  y));.  assert(is
38030 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52  Create==0 || isR
38040 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73  eadWrite);.  ass
38050 65 72 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d  ert(isExclusive=
38060 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
38070 0a 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65  .  assert(isDele
38080 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74  te==0 || isCreat
38090 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61  e);..  /* The ma
380a0 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72  in DB, main jour
380b0 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e  nal, WAL file an
380c0 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  d master journal
380d0 20 61 72 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a   are never .  **
380e0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
380f0 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20  eleted. Nor are 
38100 74 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72  they ever tempor
38110 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20  ary files.  */. 
38120 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
38130 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
38140 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
38150 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20  PEN_MAIN_DB );. 
38160 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
38170 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
38180 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
38190 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
381a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
381b0 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
381c0 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
381d0 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
381e0 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73  JOURNAL );.  ass
381f0 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
38200 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
38210 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
38220 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73  WAL );..  /* Ass
38230 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70 70  ert that the upp
38240 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 74  er layer has set
38250 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c   one of the "fil
38260 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a  e-type" flags. *
38270 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  /.  assert( eTyp
38280 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
38290 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65  AIN_DB      || e
382a0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
382b0 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20  N_TEMP_DB .     
382c0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
382d0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
382e0 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53  RNAL || eType==S
382f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
38300 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20  JOURNAL .       
38310 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
38320 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
38330 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
38340 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
38350 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20  JOURNAL .       
38360 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
38370 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
38380 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  DB || eType==SQL
38390 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29  ITE_OPEN_WAL.  )
383a0 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 63 74 20 61  ;..  /* Detect a
383b0 20 70 69 64 20 63 68 61 6e 67 65 20 61 6e 64 20   pid change and 
383c0 72 65 73 65 74 20 74 68 65 20 50 52 4e 47 2e 20  reset the PRNG. 
383d0 20 54 68 65 72 65 20 69 73 20 61 20 72 61 63 65   There is a race
383e0 20 63 6f 6e 64 69 74 69 6f 6e 0a 20 20 2a 2a 20   condition.  ** 
383f0 68 65 72 65 20 73 75 63 68 20 74 68 61 74 20 74  here such that t
38400 77 6f 20 6f 72 20 6d 6f 72 65 20 74 68 72 65 61  wo or more threa
38410 64 73 20 61 6c 6c 20 74 72 79 69 6e 67 20 74 6f  ds all trying to
38420 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 73 20   open databases 
38430 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65  at.  ** the same
38440 20 69 6e 73 74 61 6e 74 20 6d 69 67 68 74 20 61   instant might a
38450 6c 6c 20 72 65 73 65 74 20 74 68 65 20 50 52 4e  ll reset the PRN
38460 47 2e 20 20 42 75 74 20 6d 75 6c 74 69 70 6c 65  G.  But multiple
38470 20 72 65 73 65 74 73 0a 20 20 2a 2a 20 61 72 65   resets.  ** are
38480 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a   harmless..  */.
38490 20 20 69 66 28 20 72 61 6e 64 6f 6d 6e 65 73 73    if( randomness
384a0 50 69 64 21 3d 6f 73 47 65 74 70 69 64 28 30 29  Pid!=osGetpid(0)
384b0 20 29 7b 0a 20 20 20 20 72 61 6e 64 6f 6d 6e 65   ){.    randomne
384c0 73 73 50 69 64 20 3d 20 6f 73 47 65 74 70 69 64  ssPid = osGetpid
384d0 28 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (0);.    sqlite3
384e0 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29  _randomness(0,0)
384f0 3b 0a 20 20 7d 0a 0a 20 20 6d 65 6d 73 65 74 28  ;.  }..  memset(
38500 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  p, 0, sizeof(uni
38510 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20  xFile));..  if( 
38520 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
38530 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20  EN_MAIN_DB ){.  
38540 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
38550 70 55 6e 75 73 65 64 3b 0a 20 20 20 20 70 55 6e  pUnused;.    pUn
38560 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61  used = findReusa
38570 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c 61  bleFd(zName, fla
38580 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e  gs);.    if( pUn
38590 75 73 65 64 20 29 7b 0a 20 20 2