/ Hex Artifact Content
Login

Artifact d8e37bc3af9b15a52c3fecd366c95416251aa8d89481dd56170bad538b421721:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 20 55 73 65 20 70 72 65 61 64 28  f../* Use pread(
0b40: 29 20 61 6e 64 20 70 77 72 69 74 65 28 29 20 69  ) and pwrite() i
0b50: 66 20 74 68 65 79 20 61 72 65 20 61 76 61 69 6c  f they are avail
0b60: 61 62 6c 65 20 2a 2f 0a 23 69 66 20 64 65 66 69  able */.#if defi
0b70: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23  ned(__APPLE__).#
0b80: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 50 52 45   define HAVE_PRE
0b90: 41 44 20 31 0a 23 20 64 65 66 69 6e 65 20 48 41  AD 1.# define HA
0ba0: 56 45 5f 50 57 52 49 54 45 20 31 0a 23 65 6e 64  VE_PWRITE 1.#end
0bb0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  if.#if defined(H
0bc0: 41 56 45 5f 50 52 45 41 44 36 34 29 20 26 26 20  AVE_PREAD64) && 
0bd0: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 57 52  defined(HAVE_PWR
0be0: 49 54 45 36 34 29 0a 23 20 75 6e 64 65 66 20 55  ITE64).# undef U
0bf0: 53 45 5f 50 52 45 41 44 0a 23 20 64 65 66 69 6e  SE_PREAD.# defin
0c00: 65 20 55 53 45 5f 50 52 45 41 44 36 34 20 31 0a  e USE_PREAD64 1.
0c10: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41  #elif defined(HA
0c20: 56 45 5f 50 52 45 41 44 29 20 26 26 20 64 65 66  VE_PREAD) && def
0c30: 69 6e 65 64 28 48 41 56 45 5f 50 57 52 49 54 45  ined(HAVE_PWRITE
0c40: 29 0a 23 20 75 6e 64 65 66 20 55 53 45 5f 50 52  ).# undef USE_PR
0c50: 45 41 44 36 34 0a 23 20 64 65 66 69 6e 65 20 55  EAD64.# define U
0c60: 53 45 5f 50 52 45 41 44 20 31 0a 23 65 6e 64 69  SE_PREAD 1.#endi
0c70: 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72  f../*.** standar
0c80: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
0c90: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0ca0: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0cb0: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0cc0: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0cd0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
0ce0: 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 69 6e 63 6c  s/ioctl.h>.#incl
0cf0: 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23  ude <unistd.h>.#
0d00: 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e  include <time.h>
0d10: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
0d20: 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ime.h>.#include 
0d30: 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 66 20 21 64  <errno.h>.#if !d
0d40: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
0d50: 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
0d60: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
0d70: 30 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  0.# include <sys
0d80: 2f 6d 6d 61 6e 2e 68 3e 0a 23 65 6e 64 69 66 0a  /mman.h>.#endif.
0d90: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
0da0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
0db0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  .# include <sys/
0dc0: 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e 63 6c 75  ioctl.h>.# inclu
0dd0: 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a  de <sys/file.h>.
0de0: 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70  # include <sys/p
0df0: 61 72 61 6d 2e 68 3e 0a 23 65 6e 64 69 66 20 2f  aram.h>.#endif /
0e00: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
0e10: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
0e20: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
0e30: 41 50 50 4c 45 5f 5f 29 20 26 26 20 28 28 5f 5f  APPLE__) && ((__
0e40: 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e  MAC_OS_X_VERSION
0e50: 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 20 3e 20  _MIN_REQUIRED > 
0e60: 31 30 35 30 29 20 7c 7c 20 5c 0a 20 20 20 20 20  1050) || \.     
0e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e80: 20 20 20 20 20 20 28 5f 5f 49 50 48 4f 4e 45 5f        (__IPHONE_
0e90: 4f 53 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52  OS_VERSION_MIN_R
0ea0: 45 51 55 49 52 45 44 20 3e 20 32 30 30 30 29 29  EQUIRED > 2000))
0eb0: 0a 23 20 20 69 66 20 28 21 64 65 66 69 6e 65 64  .#  if (!defined
0ec0: 28 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45 44  (TARGET_OS_EMBED
0ed0: 44 45 44 29 20 7c 7c 20 28 54 41 52 47 45 54 5f  DED) || (TARGET_
0ee0: 4f 53 5f 45 4d 42 45 44 44 45 44 3d 3d 30 29 29  OS_EMBEDDED==0))
0ef0: 20 5c 0a 20 20 20 20 20 20 20 26 26 20 28 21 64   \.       && (!d
0f00: 65 66 69 6e 65 64 28 54 41 52 47 45 54 5f 49 50  efined(TARGET_IP
0f10: 48 4f 4e 45 5f 53 49 4d 55 4c 41 54 4f 52 29 20  HONE_SIMULATOR) 
0f20: 7c 7c 20 28 54 41 52 47 45 54 5f 49 50 48 4f 4e  || (TARGET_IPHON
0f30: 45 5f 53 49 4d 55 4c 41 54 4f 52 3d 3d 30 29 29  E_SIMULATOR==0))
0f40: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 48 41 56  .#    define HAV
0f50: 45 5f 47 45 54 48 4f 53 54 55 55 49 44 20 31 0a  E_GETHOSTUUID 1.
0f60: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 77 61 72  #  else.#    war
0f70: 6e 69 6e 67 20 22 67 65 74 68 6f 73 74 75 75 69  ning "gethostuui
0f80: 64 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2e  d() is disabled.
0f90: 22 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  ".#  endif.#endi
0fa0: 66 0a 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  f...#if OS_VXWOR
0fb0: 4b 53 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79  KS.# include <sy
0fc0: 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e 63  s/ioctl.h>.# inc
0fd0: 6c 75 64 65 20 3c 73 65 6d 61 70 68 6f 72 65 2e  lude <semaphore.
0fe0: 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 6c 69  h>.# include <li
0ff0: 6d 69 74 73 2e 68 3e 0a 23 65 6e 64 69 66 20 2f  mits.h>.#endif /
1000: 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
1010: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
1020: 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54  PPLE__) || SQLIT
1030: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1040: 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64 65  _STYLE.# include
1050: 20 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23   <sys/mount.h>.#
1060: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 48 41  endif..#ifdef HA
1070: 56 45 5f 55 54 49 4d 45 0a 23 20 69 6e 63 6c 75  VE_UTIME.# inclu
1080: 64 65 20 3c 75 74 69 6d 65 2e 68 3e 0a 23 65 6e  de <utime.h>.#en
1090: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  dif../*.** Allow
10a0: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69  ed values of uni
10b0: 78 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f  xFile.fsFlags.*/
10c0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
10d0: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
10e0: 20 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20       0x1../*.** 
10f0: 49 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20  If we are to be 
1100: 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63  thread-safe, inc
1110: 6c 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64  lude the pthread
1120: 73 20 68 65 61 64 65 72 20 61 6e 64 20 64 65 66  s header and def
1130: 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  ine.** the SQLIT
1140: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d  E_UNIX_THREADS m
1150: 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  acro..*/.#if SQL
1160: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23  ITE_THREADSAFE.#
1170: 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61   include <pthrea
1180: 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51  d.h>.# define SQ
1190: 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44  LITE_UNIX_THREAD
11a0: 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  S 1.#endif../*.*
11b0: 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73  * Default permis
11c0: 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74  sions when creat
11d0: 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a  ing a new file.*
11e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
11f0: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
1200: 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69  RMISSIONS.# defi
1210: 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ne SQLITE_DEFAUL
1220: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
1230: 4e 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a  NS 0644.#endif..
1240: 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70 65  /*.** Default pe
1250: 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63  rmissions when c
1260: 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f  reating auto pro
1270: 78 79 20 64 69 72 0a 2a 2f 0a 23 69 66 6e 64 65  xy dir.*/.#ifnde
1280: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
1290: 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
12a0: 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53  SIONS.# define S
12b0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
12c0: 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
12d0: 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a  NS 0755.#endif..
12e0: 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75  /*.** Maximum su
12f0: 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e  pported path-len
1300: 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  gth..*/.#define 
1310: 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32  MAX_PATHNAME 512
1320: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
1330: 73 75 70 70 6f 72 74 65 64 20 73 79 6d 62 6f 6c  supported symbol
1340: 69 63 20 6c 69 6e 6b 73 0a 2a 2f 0a 23 64 65 66  ic links.*/.#def
1350: 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ine SQLITE_MAX_S
1360: 59 4d 4c 49 4e 4b 53 20 31 30 30 0a 0a 2f 2a 20  YMLINKS 100../* 
1370: 41 6c 77 61 79 73 20 63 61 73 74 20 74 68 65 20  Always cast the 
1380: 67 65 74 70 69 64 28 29 20 72 65 74 75 72 6e 20  getpid() return 
1390: 74 79 70 65 20 66 6f 72 20 63 6f 6d 70 61 74 69  type for compati
13a0: 62 69 6c 69 74 79 20 77 69 74 68 0a 2a 2a 20 6b  bility with.** k
13b0: 65 72 6e 65 6c 20 6d 6f 64 75 6c 65 73 20 69 6e  ernel modules in
13c0: 20 56 78 57 6f 72 6b 73 2e 20 2a 2f 0a 23 64 65   VxWorks. */.#de
13d0: 66 69 6e 65 20 6f 73 47 65 74 70 69 64 28 58 29  fine osGetpid(X)
13e0: 20 28 70 69 64 5f 74 29 67 65 74 70 69 64 28 29   (pid_t)getpid()
13f0: 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74  ../*.** Only set
1400: 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69   the lastErrno i
1410: 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  f the error code
1420: 20 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72   is a real error
1430: 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e   and not .** a n
1440: 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72  ormal expected r
1450: 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51  eturn code of SQ
1460: 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c  LITE_BUSY or SQL
1470: 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e  ITE_OK.*/.#defin
1480: 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  e IS_LOCK_ERROR(
1490: 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54  x)  ((x != SQLIT
14a0: 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53  E_OK) && (x != S
14b0: 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a  QLITE_BUSY))../*
14c0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
14d0: 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  ces */.typedef s
14e0: 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e  truct unixShm un
14f0: 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  ixShm;          
1500: 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
1510: 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  on shared memory
1520: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
1530: 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75  ct unixShmNode u
1540: 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20  nixShmNode;     
1550: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1560: 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74  ry instance */.t
1570: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
1580: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78  ixInodeInfo unix
1590: 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20  InodeInfo;   /* 
15a0: 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70  An i-node */.typ
15b0: 65 64 65 66 20 73 74 72 75 63 74 20 55 6e 69 78  edef struct Unix
15c0: 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75  UnusedFd UnixUnu
15d0: 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e  sedFd;     /* An
15e0: 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
15f0: 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a  criptor */../*.*
1600: 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74  * Sometimes, aft
1610: 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65  er a file handle
1620: 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51   is closed by SQ
1630: 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64  Lite, the file d
1640: 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e  escriptor.** can
1650: 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d  not be closed im
1660: 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68  mediately. In th
1670: 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61  ese cases, insta
1680: 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  nces of the foll
1690: 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  owing.** structu
16a0: 72 65 20 61 72 65 20 75 73 65 64 20 74 6f 20 73  re are used to s
16b0: 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64 65  tore the file de
16c0: 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77  scriptor while w
16d0: 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a  aiting for an.**
16e0: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
16f0: 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20  either close or 
1700: 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72  reuse it..*/.str
1710: 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64  uct UnixUnusedFd
1720: 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20   {.  int fd;    
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1740: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
1750: 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20  r to close */.  
1760: 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20  int flags;      
1770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
1780: 67 73 20 74 68 69 73 20 66 69 6c 65 20 64 65 73  gs this file des
1790: 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e  criptor was open
17a0: 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69  ed with */.  Uni
17b0: 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74  xUnusedFd *pNext
17c0: 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75  ;      /* Next u
17d0: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
17e0: 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69  iptor on same fi
17f0: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
1800: 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  The unixFile str
1810: 75 63 74 75 72 65 20 69 73 20 73 75 62 63 6c 61  ucture is subcla
1820: 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69  ss of sqlite3_fi
1830: 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f 20 74  le specific to t
1840: 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69  he unix.** VFS i
1850: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a  mplementations..
1860: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1870: 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46  t unixFile unixF
1880: 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78  ile;.struct unix
1890: 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  File {.  sqlite3
18a0: 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73  _io_methods cons
18b0: 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20  t *pMethod;  /* 
18c0: 41 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  Always the first
18d0: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69   entry */.  sqli
18e0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1900: 2f 2a 20 54 68 65 20 56 46 53 20 74 68 61 74 20  /* The VFS that 
1910: 63 72 65 61 74 65 64 20 74 68 69 73 20 75 6e 69  created this uni
1920: 78 46 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 49  xFile */.  unixI
1930: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
1940: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1950: 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63  * Info about loc
1960: 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65  ks on this inode
1970: 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20   */.  int h;    
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19a0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
19b0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
19c0: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
19d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19e0: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65   type of lock he
19f0: 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f  ld on this fd */
1a00: 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  .  unsigned shor
1a10: 74 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 3b  t int ctrlFlags;
1a20: 20 20 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69         /* Behavi
1a30: 6f 72 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58  oral bits.  UNIX
1a40: 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  FILE_* flags */.
1a50: 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b    int lastErrno;
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69        /* The uni
1a80: 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73  x errno from las
1a90: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20  t I/O error */. 
1aa0: 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f   void *lockingCo
1ab0: 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  ntext;          
1ac0: 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20       /* Locking 
1ad0: 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20 73  style specific s
1ae0: 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  tate */.  UnixUn
1af0: 75 73 65 64 46 64 20 2a 70 50 72 65 61 6c 6c 6f  usedFd *pPreallo
1b00: 63 61 74 65 64 55 6e 75 73 65 64 3b 20 20 2f 2a  catedUnused;  /*
1b10: 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55   Pre-allocated U
1b20: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20  nixUnusedFd */. 
1b30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1b40: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1b50: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1b60: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
1b70: 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  ixShm *pShm;    
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1ba0: 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72  ry segment infor
1bb0: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  mation */.  int 
1bc0: 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79  /* Configured by
1bf0: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
1c00: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
1c10: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1c20: 20 20 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b    int nFetchOut;
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c50: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78  of outstanding x
1c60: 46 65 74 63 68 20 72 65 66 73 20 2a 2f 0a 20 20  Fetch refs */.  
1c70: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
1c80: 61 70 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  apSize;         
1c90: 20 20 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69      /* Usable si
1ca0: 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74  ze of mapping at
1cb0: 20 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20   pMapRegion */. 
1cc0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d   sqlite3_int64 m
1cd0: 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 20  mapSizeActual;  
1ce0: 20 20 20 20 20 2f 2a 20 41 63 74 75 61 6c 20 73       /* Actual s
1cf0: 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61  ize of mapping a
1d00: 74 20 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a  t pMapRegion */.
1d10: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1d20: 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20  mmapSizeMax;    
1d30: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75        /* Configu
1d40: 72 65 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  red FCNTL_MMAP_S
1d50: 49 5a 45 20 76 61 6c 75 65 20 2a 2f 0a 20 20 76  IZE value */.  v
1d60: 6f 69 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b  oid *pMapRegion;
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d80: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70     /* Memory map
1d90: 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23 65  ped region */.#e
1da0: 6e 64 69 66 0a 20 20 69 6e 74 20 73 65 63 74 6f  ndif.  int secto
1db0: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
1dc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1dd0: 76 69 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65  vice sector size
1de0: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65   */.  int device
1df0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b  Characteristics;
1e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
1e10: 63 6f 6d 70 75 74 65 64 20 64 65 76 69 63 65 20  computed device 
1e20: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1e30: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
1e40: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1e50: 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  LE.  int openFla
1e60: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e80: 66 6c 61 67 73 20 73 70 65 63 69 66 69 65 64 20  flags specified 
1e90: 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65 6e  at open() */.#en
1ea0: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
1eb0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1ec0: 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  YLE || defined(_
1ed0: 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e 73 69  _APPLE__).  unsi
1ee0: 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20 20 20  gned fsFlags;   
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f00: 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61 69 6c  /* cached detail
1f10: 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28 29 20  s from statfs() 
1f20: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  */.#endif.#ifdef
1f30: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
1f40: 45 54 4c 4b 5f 54 49 4d 45 4f 55 54 0a 20 20 75  ETLK_TIMEOUT.  u
1f50: 6e 73 69 67 6e 65 64 20 69 42 75 73 79 54 69 6d  nsigned iBusyTim
1f60: 65 6f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  eout;           
1f70: 20 20 20 2f 2a 20 57 61 69 74 20 74 68 69 73 20     /* Wait this 
1f80: 6d 61 6e 79 20 6d 69 6c 6c 69 73 65 63 20 6f 6e  many millisec on
1f90: 20 6c 6f 63 6b 73 20 2a 2f 0a 23 65 6e 64 69 66   locks */.#endif
1fa0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1fb0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
1fc0: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20  FileId *pId;    
1fd0: 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20        /* Unique 
1fe0: 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69  file ID */.#endi
1ff0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
2000: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e  DEBUG.  /* The n
2010: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72  ext group of var
2020: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  iables are used 
2030: 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72  to track whether
2040: 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a   or not the.  **
2050: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
2060: 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34  nter in bytes 24
2070: 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20  -27 of database 
2080: 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65  files are update
2090: 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20  d.  ** whenever 
20a0: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
20b0: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
20c0: 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
20d0: 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  fault will.  ** 
20e0: 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20  occur if a file 
20f0: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f  is updated witho
2100: 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67  ut also updating
2110: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2120: 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20  .  ** counter.  
2130: 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64  This test is mad
2140: 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70  e to avoid new p
2150: 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20  roblems similar 
2160: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20  to the.  ** one 
2170: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63  described by tic
2180: 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f  ket #3584. .  */
2190: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
21a0: 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20   transCntrChng; 
21b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
21c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
21d0: 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a  nter changed */.
21e0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
21f0: 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  dbUpdate;       
2200: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
2210: 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65  part of database
2220: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f   file changed */
2230: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2240: 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20   inNormalWrite; 
2250: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
2260: 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f  a normal write o
2270: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e  peration */..#en
2280: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
2290: 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20  TE_TEST.  /* In 
22a0: 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65  test mode, incre
22b0: 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
22c0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61  this structure a
22d0: 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20   bit so that .  
22e0: 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20  ** it is larger 
22f0: 74 68 61 6e 20 74 68 65 20 73 74 72 75 63 74 20  than the struct 
2300: 43 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65  CrashFile define
2310: 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20  d in test6.c..  
2320: 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64 69  */.  char aPaddi
2330: 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d  ng[32];.#endif.}
2340: 3b 0a 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  ;../* This varia
2350: 62 6c 65 20 68 6f 6c 64 73 20 74 68 65 20 70 72  ble holds the pr
2360: 6f 63 65 73 73 20 69 64 20 28 70 69 64 29 20 66  ocess id (pid) f
2370: 72 6f 6d 20 77 68 65 6e 20 74 68 65 20 78 52 61  rom when the xRa
2380: 6e 64 6f 6d 6e 65 73 73 28 29 0a 2a 2a 20 6d 65  ndomness().** me
2390: 74 68 6f 64 20 77 61 73 20 63 61 6c 6c 65 64 2e  thod was called.
23a0: 20 20 49 66 20 78 4f 70 65 6e 28 29 20 69 73 20    If xOpen() is 
23b0: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 20 64 69  called from a di
23c0: 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20  fferent process 
23d0: 69 64 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  id,.** indicatin
23e0: 67 20 74 68 61 74 20 61 20 66 6f 72 6b 28 29 20  g that a fork() 
23f0: 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68  has occurred, th
2400: 65 20 50 52 4e 47 20 77 69 6c 6c 20 62 65 20 72  e PRNG will be r
2410: 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eset..*/.static 
2420: 70 69 64 5f 74 20 72 61 6e 64 6f 6d 6e 65 73 73  pid_t randomness
2430: 50 69 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  Pid = 0;../*.** 
2440: 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66  Allowed values f
2450: 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e  or the unixFile.
2460: 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61 73  ctrlFlags bitmas
2470: 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  k:.*/.#define UN
2480: 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20 20  IXFILE_EXCL     
2490: 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20 43     0x01     /* C
24a0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
24b0: 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79  one process only
24c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
24d0: 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20  FILE_RDONLY     
24e0: 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f 6e   0x02     /* Con
24f0: 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20  nection is read 
2500: 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20  only */.#define 
2510: 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54  UNIXFILE_PERSIST
2520: 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f 2a  _WAL 0x04     /*
2530: 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20   Persistent WAL 
2540: 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  mode */.#ifndef 
2550: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
2560: 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  IRSYNC.# define 
2570: 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
2580: 20 20 20 20 30 78 30 38 20 20 20 20 20 2f 2a 20      0x08     /* 
2590: 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 6e  Directory sync n
25a0: 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a 23  eeded */.#else.#
25b0: 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45   define UNIXFILE
25c0: 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30 30  _DIRSYNC    0x00
25d0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
25e0: 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 20 20  UNIXFILE_PSOW   
25f0: 20 20 20 20 20 30 78 31 30 20 20 20 20 20 2f 2a       0x10     /*
2600: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
2610: 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
2620: 45 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  E */.#define UNI
2630: 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 20 20 20  XFILE_DELETE    
2640: 20 20 30 78 32 30 20 20 20 20 20 2f 2a 20 44 65    0x20     /* De
2650: 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  lete on close */
2660: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2670: 45 5f 55 52 49 20 20 20 20 20 20 20 20 20 30 78  E_URI         0x
2680: 34 30 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61  40     /* Filena
2690: 6d 65 20 6d 69 67 68 74 20 68 61 76 65 20 71 75  me might have qu
26a0: 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ery parameters *
26b0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
26c0: 4c 45 5f 4e 4f 4c 4f 43 4b 20 20 20 20 20 20 30  LE_NOLOCK      0
26d0: 78 38 30 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  x80     /* Do no
26e0: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f   file locking */
26f0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20  ../*.** Include 
2700: 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d  code that is com
2710: 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e  mon to all os_*.
2720: 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c  c files.*/.#incl
2730: 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68  ude "os_common.h
2740: 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  "../*.** Define 
2750: 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74  various macros t
2760: 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20  hat are missing 
2770: 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d  from some system
2780: 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f  s..*/.#ifndef O_
2790: 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69  LARGEFILE.# defi
27a0: 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30  ne O_LARGEFILE 0
27b0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
27c0: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46  QLITE_DISABLE_LF
27d0: 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47  S.# undef O_LARG
27e0: 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f  EFILE.# define O
27f0: 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e  _LARGEFILE 0.#en
2800: 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f  dif.#ifndef O_NO
2810: 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20  FOLLOW.# define 
2820: 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e  O_NOFOLLOW 0.#en
2830: 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49  dif.#ifndef O_BI
2840: 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f  NARY.# define O_
2850: 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a  BINARY 0.#endif.
2860: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61  ./*.** The threa
2870: 64 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76  did macro resolv
2880: 65 73 20 74 6f 20 74 68 65 20 74 68 72 65 61 64  es to the thread
2890: 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73  -id or to 0.  Us
28a0: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
28b0: 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
28c0: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  only..*/.#if SQL
28d0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23  ITE_THREADSAFE.#
28e0: 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20  define threadid 
28f0: 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23  pthread_self().#
2900: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72  else.#define thr
2910: 65 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a  eadid 0.#endif..
2920: 2f 2a 0a 2a 2a 20 48 41 56 45 5f 4d 52 45 4d 41  /*.** HAVE_MREMA
2930: 50 20 64 65 66 61 75 6c 74 73 20 74 6f 20 74 72  P defaults to tr
2940: 75 65 20 6f 6e 20 4c 69 6e 75 78 20 61 6e 64 20  ue on Linux and 
2950: 66 61 6c 73 65 20 65 76 65 72 79 77 68 65 72 65  false everywhere
2960: 20 65 6c 73 65 2e 0a 2a 2f 0a 23 69 66 20 21 64   else..*/.#if !d
2970: 65 66 69 6e 65 64 28 48 41 56 45 5f 4d 52 45 4d  efined(HAVE_MREM
2980: 41 50 29 0a 23 20 69 66 20 64 65 66 69 6e 65 64  AP).# if defined
2990: 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64  (__linux__) && d
29a0: 65 66 69 6e 65 64 28 5f 47 4e 55 5f 53 4f 55 52  efined(_GNU_SOUR
29b0: 43 45 29 0a 23 20 20 64 65 66 69 6e 65 20 48 41  CE).#  define HA
29c0: 56 45 5f 4d 52 45 4d 41 50 20 31 0a 23 20 65 6c  VE_MREMAP 1.# el
29d0: 73 65 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56  se.#  define HAV
29e0: 45 5f 4d 52 45 4d 41 50 20 30 0a 23 20 65 6e 64  E_MREMAP 0.# end
29f0: 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  if.#endif../*.**
2a00: 20 45 78 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c   Explicitly call
2a10: 20 74 68 65 20 36 34 2d 62 69 74 20 76 65 72 73   the 64-bit vers
2a20: 69 6f 6e 20 6f 66 20 6c 73 65 65 6b 28 29 20 6f  ion of lseek() o
2a30: 6e 20 41 6e 64 72 6f 69 64 2e 20 4f 74 68 65 72  n Android. Other
2a40: 77 69 73 65 2c 20 6c 73 65 65 6b 28 29 0a 2a 2a  wise, lseek().**
2a50: 20 69 73 20 74 68 65 20 33 32 2d 62 69 74 20 76   is the 32-bit v
2a60: 65 72 73 69 6f 6e 2c 20 65 76 65 6e 20 69 66 20  ersion, even if 
2a70: 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54  _FILE_OFFSET_BIT
2a80: 53 3d 36 34 20 69 73 20 64 65 66 69 6e 65 64 2e  S=64 is defined.
2a90: 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 41 4e 44  .*/.#ifdef __AND
2aa0: 52 4f 49 44 5f 5f 0a 23 20 64 65 66 69 6e 65 20  ROID__.# define 
2ab0: 6c 73 65 65 6b 20 6c 73 65 65 6b 36 34 0a 23 65  lseek lseek64.#e
2ac0: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 5f 5f 6c  ndif..#ifdef __l
2ad0: 69 6e 75 78 5f 5f 0a 2f 2a 0a 2a 2a 20 4c 69 6e  inux__./*.** Lin
2ae0: 75 78 2d 73 70 65 63 69 66 69 63 20 49 4f 43 54  ux-specific IOCT
2af0: 4c 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 73 20  L magic numbers 
2b00: 75 73 65 64 20 66 6f 72 20 63 6f 6e 74 72 6f 6c  used for control
2b10: 6c 69 6e 67 20 46 32 46 53 0a 2a 2f 0a 23 64 65  ling F2FS.*/.#de
2b20: 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 54 4c 5f  fine F2FS_IOCTL_
2b30: 4d 41 47 49 43 20 20 20 20 20 20 20 20 30 78 66  MAGIC        0xf
2b40: 35 0a 23 64 65 66 69 6e 65 20 46 32 46 53 5f 49  5.#define F2FS_I
2b50: 4f 43 5f 53 54 41 52 54 5f 41 54 4f 4d 49 43 5f  OC_START_ATOMIC_
2b60: 57 52 49 54 45 20 20 20 20 20 5f 49 4f 28 46 32  WRITE     _IO(F2
2b70: 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49 43 2c 20  FS_IOCTL_MAGIC, 
2b80: 31 29 0a 23 64 65 66 69 6e 65 20 46 32 46 53 5f  1).#define F2FS_
2b90: 49 4f 43 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d 49  IOC_COMMIT_ATOMI
2ba0: 43 5f 57 52 49 54 45 20 20 20 20 5f 49 4f 28 46  C_WRITE    _IO(F
2bb0: 32 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49 43 2c  2FS_IOCTL_MAGIC,
2bc0: 20 32 29 0a 23 64 65 66 69 6e 65 20 46 32 46 53   2).#define F2FS
2bd0: 5f 49 4f 43 5f 53 54 41 52 54 5f 56 4f 4c 41 54  _IOC_START_VOLAT
2be0: 49 4c 45 5f 57 52 49 54 45 20 20 20 5f 49 4f 28  ILE_WRITE   _IO(
2bf0: 46 32 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49 43  F2FS_IOCTL_MAGIC
2c00: 2c 20 33 29 0a 23 64 65 66 69 6e 65 20 46 32 46  , 3).#define F2F
2c10: 53 5f 49 4f 43 5f 41 42 4f 52 54 5f 56 4f 4c 41  S_IOC_ABORT_VOLA
2c20: 54 49 4c 45 5f 57 52 49 54 45 20 20 20 5f 49 4f  TILE_WRITE   _IO
2c30: 28 46 32 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49  (F2FS_IOCTL_MAGI
2c40: 43 2c 20 35 29 0a 23 64 65 66 69 6e 65 20 46 32  C, 5).#define F2
2c50: 46 53 5f 49 4f 43 5f 47 45 54 5f 46 45 41 54 55  FS_IOC_GET_FEATU
2c60: 52 45 53 20 20 20 20 20 20 20 20 20 20 20 5f 49  RES           _I
2c70: 4f 52 28 46 32 46 53 5f 49 4f 43 54 4c 5f 4d 41  OR(F2FS_IOCTL_MA
2c80: 47 49 43 2c 20 31 32 2c 20 75 33 32 29 0a 23 64  GIC, 12, u32).#d
2c90: 65 66 69 6e 65 20 46 32 46 53 5f 46 45 41 54 55  efine F2FS_FEATU
2ca0: 52 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20  RE_ATOMIC_WRITE 
2cb0: 30 78 30 30 30 34 0a 23 65 6e 64 69 66 20 2f 2a  0x0004.#endif /*
2cc0: 20 5f 5f 6c 69 6e 75 78 5f 5f 20 2a 2f 0a 0a 0a   __linux__ */...
2cd0: 2f 2a 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20  /*.** Different 
2ce0: 55 6e 69 78 20 73 79 73 74 65 6d 73 20 64 65 63  Unix systems dec
2cf0: 6c 61 72 65 20 6f 70 65 6e 28 29 20 69 6e 20 64  lare open() in d
2d00: 69 66 66 65 72 65 6e 74 20 77 61 79 73 2e 20 20  ifferent ways.  
2d10: 53 61 6d 65 20 75 73 65 0a 2a 2a 20 6f 70 65 6e  Same use.** open
2d20: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
2d30: 2c 6d 6f 64 65 5f 74 29 2e 20 20 4f 74 68 65 72  ,mode_t).  Other
2d40: 73 20 75 73 65 20 6f 70 65 6e 28 63 6f 6e 73 74  s use open(const
2d50: 20 63 68 61 72 2a 2c 69 6e 74 2c 2e 2e 2e 29 2e   char*,int,...).
2d60: 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
2d70: 63 65 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  ce is important 
2d80: 77 68 65 6e 20 75 73 69 6e 67 20 61 20 70 6f 69  when using a poi
2d90: 6e 74 65 72 20 74 6f 20 74 68 65 20 66 75 6e 63  nter to the func
2da0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
2db0: 73 61 66 65 73 74 20 77 61 79 20 74 6f 20 64 65  safest way to de
2dc0: 61 6c 20 77 69 74 68 20 74 68 65 20 70 72 6f 62  al with the prob
2dd0: 6c 65 6d 20 69 73 20 74 6f 20 61 6c 77 61 79 73  lem is to always
2de0: 20 75 73 65 20 74 68 69 73 20 77 72 61 70 70 65   use this wrappe
2df0: 72 0a 2a 2a 20 77 68 69 63 68 20 61 6c 77 61 79  r.** which alway
2e00: 73 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 77  s has the same w
2e10: 65 6c 6c 2d 64 65 66 69 6e 65 64 20 69 6e 74 65  ell-defined inte
2e20: 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rface..*/.static
2e30: 20 69 6e 74 20 70 6f 73 69 78 4f 70 65 6e 28 63   int posixOpen(c
2e40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2e50: 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 69 6e 74  , int flags, int
2e60: 20 6d 6f 64 65 29 7b 0a 20 20 72 65 74 75 72 6e   mode){.  return
2e70: 20 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 66 6c 61   open(zFile, fla
2e80: 67 73 2c 20 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a  gs, mode);.}../*
2e90: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
2ea0: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ce */.static int
2eb0: 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63   openDirectory(c
2ec0: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 2a  onst char*, int*
2ed0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  );.static int un
2ee0: 69 78 47 65 74 70 61 67 65 73 69 7a 65 28 76 6f  ixGetpagesize(vo
2ef0: 69 64 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79  id);../*.** Many
2f00: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72   system calls ar
2f10: 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f 75  e accessed throu
2f20: 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75  gh pointer-to-fu
2f30: 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a  nctions so that.
2f40: 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f  ** they may be o
2f50: 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e  verridden at run
2f60: 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61  time to facilita
2f70: 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69  te fault injecti
2f80: 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73  on during.** tes
2f90: 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78  ting and sandbox
2fa0: 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ing.  The follow
2fb0: 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20  ing array holds 
2fc0: 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f  the names and po
2fd0: 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c  inters.** to all
2fe0: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
2ff0: 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73  stem calls..*/.s
3000: 74 61 74 69 63 20 73 74 72 75 63 74 20 75 6e 69  tatic struct uni
3010: 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f  x_syscall {.  co
3020: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
3030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3040: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  ame of the syste
3050: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
3060: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
3070: 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72  pCurrent; /* Cur
3080: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68  rent value of th
3090: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
30a0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
30b0: 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b  ll_ptr pDefault;
30c0: 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75   /* Default valu
30d0: 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b  e */.} aSyscall[
30e0: 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70 65 6e 22  ] = {.  { "open"
30f0: 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ,         (sqlit
3100: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
3110: 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20 20 7d 2c  osixOpen,  0  },
3120: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 20  .#define osOpen 
3130: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
3140: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 69 6e  nst char*,int,in
3150: 74 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70  t))aSyscall[0].p
3160: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 63  Current)..  { "c
3170: 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 28 73  lose",        (s
3180: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3190: 74 72 29 63 6c 6f 73 65 2c 20 20 20 20 20 20 30  tr)close,      0
31a0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 43    },.#define osC
31b0: 6c 6f 73 65 20 20 20 20 20 28 28 69 6e 74 28 2a  lose     ((int(*
31c0: 29 28 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b  )(int))aSyscall[
31d0: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  1].pCurrent)..  
31e0: 7b 20 22 61 63 63 65 73 73 22 2c 20 20 20 20 20  { "access",     
31f0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3200: 6c 6c 5f 70 74 72 29 61 63 63 65 73 73 2c 20 20  ll_ptr)access,  
3210: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3220: 20 6f 73 41 63 63 65 73 73 20 20 20 20 28 28 69   osAccess    ((i
3230: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3240: 2a 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b  *,int))aSyscall[
3250: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
3260: 7b 20 22 67 65 74 63 77 64 22 2c 20 20 20 20 20  { "getcwd",     
3270: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3280: 6c 6c 5f 70 74 72 29 67 65 74 63 77 64 2c 20 20  ll_ptr)getcwd,  
3290: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
32a0: 20 6f 73 47 65 74 63 77 64 20 20 20 20 28 28 63   osGetcwd    ((c
32b0: 68 61 72 2a 28 2a 29 28 63 68 61 72 2a 2c 73 69  har*(*)(char*,si
32c0: 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 33  ze_t))aSyscall[3
32d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
32e0: 20 22 73 74 61 74 22 2c 20 20 20 20 20 20 20 20   "stat",        
32f0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3300: 6c 5f 70 74 72 29 73 74 61 74 2c 20 20 20 20 20  l_ptr)stat,     
3310: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
3320: 6f 73 53 74 61 74 20 20 20 20 20 20 28 28 69 6e  osStat      ((in
3330: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
3340: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
3350: 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72  Syscall[4].pCurr
3360: 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ent)../*.** The 
3370: 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65  DJGPP compiler e
3380: 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73  nvironment looks
3390: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69   mostly like Uni
33a0: 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63  x, but it.** lac
33b0: 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73  ks the fcntl() s
33c0: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20  ystem call.  So 
33d0: 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29  redefine fcntl()
33e0: 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
33f0: 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20  .** that always 
3400: 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73 20  succeeds.  This 
3410: 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69  means that locki
3420: 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  ng does not occu
3430: 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50  r under.** DJGPP
3440: 2e 20 20 42 75 74 20 69 74 20 69 73 20 44 4f 53  .  But it is DOS
3450: 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 20   - what did you 
3460: 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65  expect?.*/.#ifde
3470: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 7b 20  f __DJGPP__.  { 
3480: 22 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20  "fstat",        
3490: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
34a0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
34b0: 20 6f 73 46 73 74 61 74 28 61 2c 62 2c 63 29 20   osFstat(a,b,c) 
34c0: 20 20 20 30 0a 23 65 6c 73 65 20 20 20 20 20 0a     0.#else     .
34d0: 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20    { "fstat",    
34e0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
34f0: 63 61 6c 6c 5f 70 74 72 29 66 73 74 61 74 2c 20  call_ptr)fstat, 
3500: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
3510: 6e 65 20 6f 73 46 73 74 61 74 20 20 20 20 20 28  ne osFstat     (
3520: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73 74 72 75  (int(*)(int,stru
3530: 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61  ct stat*))aSysca
3540: 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[5].pCurrent).
3550: 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 66 74 72  #endif..  { "ftr
3560: 75 6e 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c  uncate",    (sql
3570: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3580: 29 66 74 72 75 6e 63 61 74 65 2c 20 20 30 20 20  )ftruncate,  0  
3590: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 74 72  },.#define osFtr
35a0: 75 6e 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28  uncate ((int(*)(
35b0: 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63  int,off_t))aSysc
35c0: 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29  all[6].pCurrent)
35d0: 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22 2c 20 20  ..  { "fcntl",  
35e0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
35f0: 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 6e 74 6c  yscall_ptr)fcntl
3600: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
3610: 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 20 20 20  fine osFcntl    
3620: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69 6e   ((int(*)(int,in
3630: 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b  t,...))aSyscall[
3640: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  7].pCurrent)..  
3650: 7b 20 22 72 65 61 64 22 2c 20 20 20 20 20 20 20  { "read",       
3660: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3670: 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20 20 20 20  ll_ptr)read,    
3680: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3690: 20 6f 73 52 65 61 64 20 20 20 20 20 20 28 28 73   osRead      ((s
36a0: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f  size_t(*)(int,vo
36b0: 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73  id*,size_t))aSys
36c0: 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74  call[8].pCurrent
36d0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  )..#if defined(U
36e0: 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53 51 4c  SE_PREAD) || SQL
36f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
3700: 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70 72  NG_STYLE.  { "pr
3710: 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73 71  ead",        (sq
3720: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3730: 72 29 70 72 65 61 64 2c 20 20 20 20 20 20 30 20  r)pread,      0 
3740: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70   },.#else.  { "p
3750: 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73  read",        (s
3760: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3770: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
3780: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3790: 69 6e 65 20 6f 73 50 72 65 61 64 20 20 20 20 20  ine osPread     
37a0: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
37b0: 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66  ,void*,size_t,of
37c0: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d  f_t))aSyscall[9]
37d0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
37e0: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
37f0: 44 36 34 29 0a 20 20 7b 20 22 70 72 65 61 64 36  D64).  { "pread6
3800: 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65  4",      (sqlite
3810: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72  3_syscall_ptr)pr
3820: 65 61 64 36 34 2c 20 20 20 20 30 20 20 7d 2c 0a  ead64,    0  },.
3830: 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64  #else.  { "pread
3840: 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74  64",      (sqlit
3850: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
3860: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
3870: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
3880: 6f 73 50 72 65 61 64 36 34 20 28 28 73 73 69 7a  osPread64 ((ssiz
3890: 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a  e_t(*)(int,void*
38a0: 2c 73 69 7a 65 5f 74 2c 6f 66 66 36 34 5f 74 29  ,size_t,off64_t)
38b0: 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43  )aSyscall[10].pC
38c0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 77 72  urrent)..  { "wr
38d0: 69 74 65 22 2c 20 20 20 20 20 20 20 20 28 73 71  ite",        (sq
38e0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
38f0: 72 29 77 72 69 74 65 2c 20 20 20 20 20 20 30 20  r)write,      0 
3900: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 57 72   },.#define osWr
3910: 69 74 65 20 20 20 20 20 28 28 73 73 69 7a 65 5f  ite     ((ssize_
3920: 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76  t(*)(int,const v
3930: 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  oid*,size_t))aSy
3940: 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65  scall[11].pCurre
3950: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
3960: 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53  (USE_PREAD) || S
3970: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
3980: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22  KING_STYLE.  { "
3990: 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 28  pwrite",       (
39a0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
39b0: 70 74 72 29 70 77 72 69 74 65 2c 20 20 20 20 20  ptr)pwrite,     
39c0: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
39d0: 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20  "pwrite",       
39e0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
39f0: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
3a00: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
3a10: 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65 20 20  efine osPwrite  
3a20: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
3a30: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73  nt,const void*,s
3a40: 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20  ize_t,off_t))\. 
3a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a60: 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e     aSyscall[12].
3a70: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3a80: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
3a90: 36 34 29 0a 20 20 7b 20 22 70 77 72 69 74 65 36  64).  { "pwrite6
3aa0: 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33  4",     (sqlite3
3ab0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72  _syscall_ptr)pwr
3ac0: 69 74 65 36 34 2c 20 20 20 30 20 20 7d 2c 0a 23  ite64,   0  },.#
3ad0: 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65  else.  { "pwrite
3ae0: 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65  64",     (sqlite
3af0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
3b00: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
3b10: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3b20: 73 50 77 72 69 74 65 36 34 20 20 28 28 73 73 69  sPwrite64  ((ssi
3b30: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73  ze_t(*)(int,cons
3b40: 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t void*,size_t,o
3b50: 66 66 36 34 5f 74 29 29 5c 0a 20 20 20 20 20 20  ff64_t))\.      
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
3b70: 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72  yscall[13].pCurr
3b80: 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 68 6d 6f  ent)..  { "fchmo
3b90: 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  d",       (sqlit
3ba0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66  e3_syscall_ptr)f
3bb0: 63 68 6d 6f 64 2c 20 20 20 20 20 20 20 20 20 20  chmod,          
3bc0: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
3bd0: 46 63 68 6d 6f 64 20 20 20 20 28 28 69 6e 74 28  Fchmod    ((int(
3be0: 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f 74 29 29 61  *)(int,mode_t))a
3bf0: 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72  Syscall[14].pCur
3c00: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
3c10: 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41  ed(HAVE_POSIX_FA
3c20: 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56 45  LLOCATE) && HAVE
3c30: 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
3c40: 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22  .  { "fallocate"
3c50: 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79  ,    (sqlite3_sy
3c60: 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 5f  scall_ptr)posix_
3c70: 66 61 6c 6c 6f 63 61 74 65 2c 20 20 30 20 7d 2c  fallocate,  0 },
3c80: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 61 6c 6c  .#else.  { "fall
3c90: 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69  ocate",    (sqli
3ca0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3cb0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3cc0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64    0 },.#endif.#d
3cd0: 65 66 69 6e 65 20 6f 73 46 61 6c 6c 6f 63 61 74  efine osFallocat
3ce0: 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f  e ((int(*)(int,o
3cf0: 66 66 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  ff_t,off_t))aSys
3d00: 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e  call[15].pCurren
3d10: 74 29 0a 0a 20 20 7b 20 22 75 6e 6c 69 6e 6b 22  t)..  { "unlink"
3d20: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3d30: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 75 6e 6c  _syscall_ptr)unl
3d40: 69 6e 6b 2c 20 20 20 20 20 20 20 20 20 20 20 30  ink,           0
3d50: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e   },.#define osUn
3d60: 6c 69 6e 6b 20 20 20 20 28 28 69 6e 74 28 2a 29  link    ((int(*)
3d70: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53  (const char*))aS
3d80: 79 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72  yscall[16].pCurr
3d90: 65 6e 74 29 0a 0a 20 20 7b 20 22 6f 70 65 6e 44  ent)..  { "openD
3da0: 69 72 65 63 74 6f 72 79 22 2c 20 20 20 20 28 73  irectory",    (s
3db0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3dc0: 74 72 29 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  tr)openDirectory
3dd0: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66  ,      0 },.#def
3de0: 69 6e 65 20 6f 73 4f 70 65 6e 44 69 72 65 63 74  ine osOpenDirect
3df0: 6f 72 79 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e  ory ((int(*)(con
3e00: 73 74 20 63 68 61 72 2a 2c 69 6e 74 2a 29 29 61  st char*,int*))a
3e10: 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72  Syscall[17].pCur
3e20: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6d 6b 64 69  rent)..  { "mkdi
3e30: 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  r",        (sqli
3e40: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3e50: 6d 6b 64 69 72 2c 20 20 20 20 20 20 20 20 20 20  mkdir,          
3e60: 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73   0 },.#define os
3e70: 4d 6b 64 69 72 20 20 20 20 20 28 28 69 6e 74 28  Mkdir     ((int(
3e80: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 6d  *)(const char*,m
3e90: 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ode_t))aSyscall[
3ea0: 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  18].pCurrent).. 
3eb0: 20 7b 20 22 72 6d 64 69 72 22 2c 20 20 20 20 20   { "rmdir",     
3ec0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3ed0: 61 6c 6c 5f 70 74 72 29 72 6d 64 69 72 2c 20 20  all_ptr)rmdir,  
3ee0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64           0 },.#d
3ef0: 65 66 69 6e 65 20 6f 73 52 6d 64 69 72 20 20 20  efine osRmdir   
3f00: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
3f10: 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c   char*))aSyscall
3f20: 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [19].pCurrent)..
3f30: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
3f40: 5f 46 43 48 4f 57 4e 29 0a 20 20 7b 20 22 66 63  _FCHOWN).  { "fc
3f50: 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28 73 71  hown",       (sq
3f60: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3f70: 72 29 66 63 68 6f 77 6e 2c 20 20 20 20 20 20 20  r)fchown,       
3f80: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3f90: 7b 20 22 66 63 68 6f 77 6e 22 2c 20 20 20 20 20  { "fchown",     
3fa0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3fb0: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
3fc0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3fd0: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 63  dif.#define osFc
3fe0: 68 6f 77 6e 20 20 20 20 28 28 69 6e 74 28 2a 29  hown    ((int(*)
3ff0: 28 69 6e 74 2c 75 69 64 5f 74 2c 67 69 64 5f 74  (int,uid_t,gid_t
4000: 29 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70  ))aSyscall[20].p
4010: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
4020: 66 69 6e 65 64 28 48 41 56 45 5f 46 43 48 4f 57  fined(HAVE_FCHOW
4030: 4e 29 0a 20 20 7b 20 22 67 65 74 65 75 69 64 22  N).  { "geteuid"
4040: 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f  ,      (sqlite3_
4050: 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 74 65  syscall_ptr)gete
4060: 75 69 64 2c 20 20 20 20 20 20 20 20 20 30 20 7d  uid,         0 }
4070: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 67 65 74  ,.#else.  { "get
4080: 65 75 69 64 22 2c 20 20 20 20 20 20 28 73 71 6c  euid",      (sql
4090: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
40a0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
40b0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64    0 },.#endif.#d
40c0: 65 66 69 6e 65 20 6f 73 47 65 74 65 75 69 64 20  efine osGeteuid 
40d0: 20 20 28 28 75 69 64 5f 74 28 2a 29 28 76 6f 69    ((uid_t(*)(voi
40e0: 64 29 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e  d))aSyscall[21].
40f0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
4100: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
4110: 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
4120: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
4130: 3e 30 0a 20 20 7b 20 22 6d 6d 61 70 22 2c 20 20  >0.  { "mmap",  
4140: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
4150: 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d 6d 61 70  syscall_ptr)mmap
4160: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
4170: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 6d 6d 61  ,.#else.  { "mma
4180: 70 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  p",         (sql
4190: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
41a0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
41b0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64    0 },.#endif.#d
41c0: 65 66 69 6e 65 20 6f 73 4d 6d 61 70 20 28 28 76  efine osMmap ((v
41d0: 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69  oid*(*)(void*,si
41e0: 7a 65 5f 74 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74  ze_t,int,int,int
41f0: 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,off_t))aSyscall
4200: 5b 32 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [22].pCurrent)..
4210: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
4220: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
4230: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
4240: 5f 53 49 5a 45 3e 30 0a 20 20 7b 20 22 6d 75 6e  _SIZE>0.  { "mun
4250: 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c  map",       (sql
4260: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
4270: 29 6d 75 6e 6d 61 70 2c 20 20 20 20 20 20 20 20  )munmap,        
4280: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4290: 20 22 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20 20   "munmap",      
42a0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
42b0: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
42c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
42d0: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75 6e  if.#define osMun
42e0: 6d 61 70 20 28 28 69 6e 74 28 2a 29 28 76 6f 69  map ((int(*)(voi
42f0: 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63  d*,size_t))aSysc
4300: 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65 6e 74  all[23].pCurrent
4310: 29 0a 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d  )..#if HAVE_MREM
4320: 41 50 20 26 26 20 28 21 64 65 66 69 6e 65 64 28  AP && (!defined(
4330: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
4340: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
4350: 4d 41 50 5f 53 49 5a 45 3e 30 29 0a 20 20 7b 20  MAP_SIZE>0).  { 
4360: 22 6d 72 65 6d 61 70 22 2c 20 20 20 20 20 20 20  "mremap",       
4370: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
4380: 5f 70 74 72 29 6d 72 65 6d 61 70 2c 20 20 20 20  _ptr)mremap,    
4390: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
43a0: 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20  .  { "mremap",  
43b0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
43c0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
43d0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
43e0: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
43f0: 73 4d 72 65 6d 61 70 20 28 28 76 6f 69 64 2a 28  sMremap ((void*(
4400: 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  *)(void*,size_t,
4410: 73 69 7a 65 5f 74 2c 69 6e 74 2c 2e 2e 2e 29 29  size_t,int,...))
4420: 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75  aSyscall[24].pCu
4430: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66  rrent)..#if !def
4440: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
4450: 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f  _WAL) || SQLITE_
4460: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
4470: 20 20 7b 20 22 67 65 74 70 61 67 65 73 69 7a 65    { "getpagesize
4480: 22 2c 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73  ",  (sqlite3_sys
4490: 63 61 6c 6c 5f 70 74 72 29 75 6e 69 78 47 65 74  call_ptr)unixGet
44a0: 70 61 67 65 73 69 7a 65 2c 20 30 20 7d 2c 0a 23  pagesize, 0 },.#
44b0: 65 6c 73 65 0a 20 20 7b 20 22 67 65 74 70 61 67  else.  { "getpag
44c0: 65 73 69 7a 65 22 2c 20 20 28 73 71 6c 69 74 65  esize",  (sqlite
44d0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
44e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
44f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69   },.#endif.#defi
4500: 6e 65 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65  ne osGetpagesize
4510: 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 29 29   ((int(*)(void))
4520: 61 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75  aSyscall[25].pCu
4530: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
4540: 6e 65 64 28 48 41 56 45 5f 52 45 41 44 4c 49 4e  ned(HAVE_READLIN
4550: 4b 29 0a 20 20 7b 20 22 72 65 61 64 6c 69 6e 6b  K).  { "readlink
4560: 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f  ",     (sqlite3_
4570: 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65 61 64  syscall_ptr)read
4580: 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20 30 20 7d  link,        0 }
4590: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 72 65 61  ,.#else.  { "rea
45a0: 64 6c 69 6e 6b 22 2c 20 20 20 20 20 28 73 71 6c  dlink",     (sql
45b0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
45c0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
45d0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64    0 },.#endif.#d
45e0: 65 66 69 6e 65 20 6f 73 52 65 61 64 6c 69 6e 6b  efine osReadlink
45f0: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 63 6f   ((ssize_t(*)(co
4600: 6e 73 74 20 63 68 61 72 2a 2c 63 68 61 72 2a 2c  nst char*,char*,
4610: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
4620: 5b 32 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [26].pCurrent)..
4630: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
4640: 5f 4c 53 54 41 54 29 0a 20 20 7b 20 22 6c 73 74  _LSTAT).  { "lst
4650: 61 74 22 2c 20 20 20 20 20 20 20 20 20 28 73 71  at",         (sq
4660: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
4670: 72 29 6c 73 74 61 74 2c 20 20 20 20 20 20 20 20  r)lstat,        
4680: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4690: 20 22 6c 73 74 61 74 22 2c 20 20 20 20 20 20 20   "lstat",       
46a0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
46b0: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
46c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
46d0: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 4c 73 74  if.#define osLst
46e0: 61 74 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29  at      ((int(*)
46f0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74 72  (const char*,str
4700: 75 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63  uct stat*))aSysc
4710: 61 6c 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74  all[27].pCurrent
4720: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  )..#if defined(_
4730: 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64 65 66  _linux__) && def
4740: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
4750: 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f  LE_BATCH_ATOMIC_
4760: 57 52 49 54 45 29 0a 20 20 7b 20 22 69 6f 63 74  WRITE).  { "ioct
4770: 6c 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  l",         (sql
4780: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
4790: 29 69 6f 63 74 6c 2c 20 20 20 20 20 20 20 20 20  )ioctl,         
47a0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
47b0: 22 69 6f 63 74 6c 22 2c 20 20 20 20 20 20 20 20  "ioctl",        
47c0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
47d0: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
47e0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
47f0: 66 0a 23 64 65 66 69 6e 65 20 6f 73 49 6f 63 74  f.#define osIoct
4800: 6c 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69  l ((int(*)(int,i
4810: 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c  nt,...))aSyscall
4820: 5b 32 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [28].pCurrent)..
4830: 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65  }; /* End of the
4840: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
4850: 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 0a  stem calls */...
4860: 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73 79  /*.** On some sy
4870: 73 74 65 6d 73 2c 20 63 61 6c 6c 73 20 74 6f 20  stems, calls to 
4880: 66 63 68 6f 77 6e 28 29 20 77 69 6c 6c 20 74 72  fchown() will tr
4890: 69 67 67 65 72 20 61 20 6d 65 73 73 61 67 65 20  igger a message 
48a0: 69 6e 20 61 20 73 65 63 75 72 69 74 79 0a 2a 2a  in a security.**
48b0: 20 6c 6f 67 20 69 66 20 74 68 65 79 20 63 6f 6d   log if they com
48c0: 65 20 66 72 6f 6d 20 6e 6f 6e 2d 72 6f 6f 74 20  e from non-root 
48d0: 70 72 6f 63 65 73 73 65 73 2e 20 20 53 6f 20 61  processes.  So a
48e0: 76 6f 69 64 20 63 61 6c 6c 69 6e 67 20 66 63 68  void calling fch
48f0: 6f 77 6e 28 29 20 69 66 0a 2a 2a 20 77 65 20 61  own() if.** we a
4900: 72 65 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 61  re not running a
4910: 73 20 72 6f 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  s root..*/.stati
4920: 63 20 69 6e 74 20 72 6f 62 75 73 74 46 63 68 6f  c int robustFcho
4930: 77 6e 28 69 6e 74 20 66 64 2c 20 75 69 64 5f 74  wn(int fd, uid_t
4940: 20 75 69 64 2c 20 67 69 64 5f 74 20 67 69 64 29   uid, gid_t gid)
4950: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  {.#if defined(HA
4960: 56 45 5f 46 43 48 4f 57 4e 29 0a 20 20 72 65 74  VE_FCHOWN).  ret
4970: 75 72 6e 20 6f 73 47 65 74 65 75 69 64 28 29 20  urn osGeteuid() 
4980: 3f 20 30 20 3a 20 6f 73 46 63 68 6f 77 6e 28 66  ? 0 : osFchown(f
4990: 64 2c 75 69 64 2c 67 69 64 29 3b 0a 23 65 6c 73  d,uid,gid);.#els
49a0: 65 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  e.  return 0;.#e
49b0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ndif.}../*.** Th
49c0: 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53 79  is is the xSetSy
49d0: 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f  stemCall() metho
49e0: 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73  d of sqlite3_vfs
49f0: 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a   for all of the.
4a00: 2a 2a 20 22 75 6e 69 78 22 20 56 46 53 65 73 2e  ** "unix" VFSes.
4a10: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
4a20: 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66  OK opon successf
4a30: 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68  ully updating th
4a40: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  e.** system call
4a50: 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c   pointer, or SQL
4a60: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20  ITE_NOTFOUND if 
4a70: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66  there is no conf
4a80: 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74  igurable.** syst
4a90: 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e  em call named zN
4aa0: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
4ab0: 6e 74 20 75 6e 69 78 53 65 74 53 79 73 74 65 6d  nt unixSetSystem
4ac0: 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f  Call(.  sqlite3_
4ad0: 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20  vfs *pNotUsed,  
4ae0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
4af0: 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75   pointer.  Not u
4b00: 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  sed */.  const c
4b10: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
4b20: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
4b30: 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f  f system call to
4b40: 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73   override */.  s
4b50: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
4b60: 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20  tr pNewFunc  /* 
4b70: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73  Pointer to new s
4b80: 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65  ystem call value
4b90: 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
4ba0: 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72  d int i;.  int r
4bb0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  c = SQLITE_NOTFO
4bc0: 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  UND;..  UNUSED_P
4bd0: 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65  ARAMETER(pNotUse
4be0: 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  d);.  if( zName=
4bf0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
4c00: 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65  no zName is give
4c10: 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73  n, restore all s
4c20: 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74  ystem calls to t
4c30: 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20  heir default.   
4c40: 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64   ** settings and
4c50: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20   return NULL.   
4c60: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
4c70: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28  ITE_OK;.    for(
4c80: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
4c90: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
4ca0: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
4cb0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 79  ){.      if( aSy
4cc0: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
4cd0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79  t ){.        aSy
4ce0: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
4cf0: 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  t = aSyscall[i].
4d00: 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20  pDefault;.      
4d10: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
4d20: 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65  .    /* If zName
4d30: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f   is specified, o
4d40: 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74  perate on only t
4d50: 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61  he one system ca
4d60: 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66  ll.    ** specif
4d70: 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ied..    */.    
4d80: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
4d90: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
4da0: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
4db0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
4dc0: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
4dd0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
4de0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
4df0: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
4e00: 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20  pDefault==0 ){. 
4e10: 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c           aSyscal
4e20: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20  l[i].pDefault = 
4e30: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
4e40: 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rent;.        }.
4e50: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
4e60: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
4e70: 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20  if( pNewFunc==0 
4e80: 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79  ) pNewFunc = aSy
4e90: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
4ea0: 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63  t;.        aSysc
4eb0: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20  all[i].pCurrent 
4ec0: 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20  = pNewFunc;.    
4ed0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4ee0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
4ef0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
4f00: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
4f10: 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20  lue of a system 
4f20: 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55  call.  Return NU
4f30: 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e  LL if zName is n
4f40: 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a  ot a.** recogniz
4f50: 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ed system call n
4f60: 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c  ame.  NULL is al
4f70: 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  so returned if t
4f80: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a  he system call.*
4f90: 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  * is currently u
4fa0: 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
4fb0: 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63  tic sqlite3_sysc
4fc0: 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65 74 53  all_ptr unixGetS
4fd0: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
4fe0: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
4ff0: 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ed,.  const char
5000: 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73   *zName.){.  uns
5010: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20  igned int i;..  
5020: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
5030: 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f  (pNotUsed);.  fo
5040: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
5050: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
5060: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
5070: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
5080: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
5090: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
50a0: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
50b0: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a  ll[i].pCurrent;.
50c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
50d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
50e0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
50f0: 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c  first system cal
5100: 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20  l after zName.  
5110: 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a  If zName==NULL.*
5120: 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  * then return th
5130: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
5140: 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  rst system call.
5150: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
5160: 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65   zName.** is the
5170: 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c   last system cal
5180: 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73  l or if zName is
5190: 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   not the name of
51a0: 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74   a valid.** syst
51b0: 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  em call..*/.stat
51c0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75  ic const char *u
51d0: 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  nixNextSystemCal
51e0: 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  l(sqlite3_vfs *p
51f0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
5200: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20  ame){.  int i = 
5210: 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  -1;..  UNUSED_PA
5220: 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69 66  RAMETER(p);.  if
5230: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66  ( zName ){.    f
5240: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
5250: 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b  ize(aSyscall)-1;
5260: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
5270: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
5280: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
5290: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
52a0: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b    }.  }.  for(i+
52b0: 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  +; i<ArraySize(a
52c0: 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a  Syscall); i++){.
52d0: 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c      if( aSyscall
52e0: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30 20  [i].pCurrent!=0 
52f0: 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c  ) return aSyscal
5300: 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a  l[i].zName;.  }.
5310: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
5320: 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 63 63 65  *.** Do not acce
5330: 70 74 20 61 6e 79 20 66 69 6c 65 20 64 65 73 63  pt any file desc
5340: 72 69 70 74 6f 72 20 6c 65 73 73 20 74 68 61 6e  riptor less than
5350: 20 74 68 69 73 20 76 61 6c 75 65 2c 20 69 6e 20   this value, in 
5360: 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 0a 2a  order to avoid.*
5370: 2a 20 6f 70 65 6e 69 6e 67 20 64 61 74 61 62 61  * opening databa
5380: 73 65 20 66 69 6c 65 20 75 73 69 6e 67 20 66 69  se file using fi
5390: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74  le descriptors t
53a0: 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 6c 79  hat are commonly
53b0: 20 75 73 65 64 20 66 6f 72 20 0a 2a 2a 20 73 74   used for .** st
53c0: 61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 6f 75  andard input, ou
53d0: 74 70 75 74 2c 20 61 6e 64 20 65 72 72 6f 72 2e  tput, and error.
53e0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
53f0: 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f  TE_MINIMUM_FILE_
5400: 44 45 53 43 52 49 50 54 4f 52 0a 23 20 64 65 66  DESCRIPTOR.# def
5410: 69 6e 65 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d  ine SQLITE_MINIM
5420: 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54  UM_FILE_DESCRIPT
5430: 4f 52 20 33 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  OR 3.#endif../*.
5440: 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70 65 6e 28 29  ** Invoke open()
5450: 2e 20 20 44 6f 20 73 6f 20 6d 75 6c 74 69 70 6c  .  Do so multipl
5460: 65 20 74 69 6d 65 73 2c 20 75 6e 74 69 6c 20 69  e times, until i
5470: 74 20 65 69 74 68 65 72 20 73 75 63 63 65 65 64  t either succeed
5480: 73 20 6f 72 0a 2a 2a 20 66 61 69 6c 73 20 66 6f  s or.** fails fo
5490: 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e 20 6f 74  r some reason ot
54a0: 68 65 72 20 74 68 61 6e 20 45 49 4e 54 52 2e 0a  her than EINTR..
54b0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
54c0: 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20  e creation mode 
54d0: 22 6d 22 20 69 73 20 30 20 74 68 65 6e 20 73 65  "m" is 0 then se
54e0: 74 20 69 74 20 74 6f 20 74 68 65 20 64 65 66 61  t it to the defa
54f0: 75 6c 74 20 66 6f 72 0a 2a 2a 20 53 51 4c 69 74  ult for.** SQLit
5500: 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  e.  The default 
5510: 69 73 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  is SQLITE_DEFAUL
5520: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
5530: 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20  NS (normally.** 
5540: 30 36 34 34 29 20 61 73 20 6d 6f 64 69 66 69 65  0644) as modifie
5550: 64 20 62 79 20 74 68 65 20 73 79 73 74 65 6d 20  d by the system 
5560: 75 6d 61 73 6b 2e 20 20 49 66 20 6d 20 69 73 20  umask.  If m is 
5570: 6e 6f 74 20 30 2c 20 74 68 65 6e 0a 2a 2a 20 6d  not 0, then.** m
5580: 61 6b 65 20 74 68 65 20 66 69 6c 65 20 63 72 65  ake the file cre
5590: 61 74 69 6f 6e 20 6d 6f 64 65 20 62 65 20 65 78  ation mode be ex
55a0: 61 63 74 6c 79 20 6d 20 69 67 6e 6f 72 69 6e 67  actly m ignoring
55b0: 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 0a 2a   the umask..**.*
55c0: 2a 20 54 68 65 20 6d 20 70 61 72 61 6d 65 74 65  * The m paramete
55d0: 72 20 77 69 6c 6c 20 62 65 20 6e 6f 6e 2d 7a 65  r will be non-ze
55e0: 72 6f 20 6f 6e 6c 79 20 77 68 65 6e 20 63 72 65  ro only when cre
55f0: 61 74 69 6e 67 20 2d 77 61 6c 2c 20 2d 6a 6f 75  ating -wal, -jou
5600: 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20 2d 73 68  rnal,.** and -sh
5610: 6d 20 66 69 6c 65 73 2e 20 20 57 65 20 77 61 6e  m files.  We wan
5620: 74 20 74 68 6f 73 65 20 66 69 6c 65 73 20 74 6f  t those files to
5630: 20 68 61 76 65 20 2a 65 78 61 63 74 6c 79 2a 20   have *exactly* 
5640: 74 68 65 20 73 61 6d 65 0a 2a 2a 20 70 65 72 6d  the same.** perm
5650: 69 73 73 69 6f 6e 73 20 61 73 20 74 68 65 69 72  issions as their
5660: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
5670: 73 65 2c 20 75 6e 61 64 75 6c 74 65 72 61 74 65  se, unadulterate
5680: 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a  d by the umask..
5690: 2a 2a 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20  ** In that way, 
56a0: 69 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69  if a database fi
56b0: 6c 65 20 69 73 20 2d 72 77 2d 72 77 2d 72 77 20  le is -rw-rw-rw 
56c0: 6f 72 20 2d 72 77 2d 72 77 2d 72 2d 2c 20 61 6e  or -rw-rw-r-, an
56d0: 64 20 61 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  d a.** transacti
56e0: 6f 6e 20 63 72 61 73 68 65 73 20 61 6e 64 20 6c  on crashes and l
56f0: 65 61 76 65 73 20 62 65 68 69 6e 64 20 68 6f 74  eaves behind hot
5700: 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20   journals, then 
5710: 61 6e 79 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74  any.** process t
5720: 68 61 74 20 69 73 20 61 62 6c 65 20 74 6f 20 77  hat is able to w
5730: 72 69 74 65 20 74 6f 20 74 68 65 20 64 61 74 61  rite to the data
5740: 62 61 73 65 20 77 69 6c 6c 20 61 6c 73 6f 20 62  base will also b
5750: 65 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 72 65 63  e able to.** rec
5760: 6f 76 65 72 20 74 68 65 20 68 6f 74 20 6a 6f 75  over the hot jou
5770: 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  rnals..*/.static
5780: 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f 70 65 6e   int robust_open
5790: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
57a0: 69 6e 74 20 66 2c 20 6d 6f 64 65 5f 74 20 6d 29  int f, mode_t m)
57b0: 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 6d 6f  {.  int fd;.  mo
57c0: 64 65 5f 74 20 6d 32 20 3d 20 6d 20 3f 20 6d 20  de_t m2 = m ? m 
57d0: 3a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  : SQLITE_DEFAULT
57e0: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
57f0: 53 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 23  S;.  while(1){.#
5800: 69 66 20 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f  if defined(O_CLO
5810: 45 58 45 43 29 0a 20 20 20 20 66 64 20 3d 20 6f  EXEC).    fd = o
5820: 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43 4c 4f 45  sOpen(z,f|O_CLOE
5830: 58 45 43 2c 6d 32 29 3b 0a 23 65 6c 73 65 0a 20  XEC,m2);.#else. 
5840: 20 20 20 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a     fd = osOpen(z
5850: 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64 69 66 0a 20  ,f,m2);.#endif. 
5860: 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20     if( fd<0 ){. 
5870: 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d       if( errno==
5880: 45 49 4e 54 52 20 29 20 63 6f 6e 74 69 6e 75 65  EINTR ) continue
5890: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
58a0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3e     }.    if( fd>
58b0: 3d 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f  =SQLITE_MINIMUM_
58c0: 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52 20  FILE_DESCRIPTOR 
58d0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6f 73 43  ) break;.    osC
58e0: 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 73 71  lose(fd);.    sq
58f0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
5900: 5f 57 41 52 4e 49 4e 47 2c 20 0a 20 20 20 20 20  _WARNING, .     
5910: 20 20 20 20 20 20 20 20 20 20 20 22 61 74 74 65             "atte
5920: 6d 70 74 20 74 6f 20 6f 70 65 6e 20 5c 22 25 73  mpt to open \"%s
5930: 5c 22 20 61 73 20 66 69 6c 65 20 64 65 73 63 72  \" as file descr
5940: 69 70 74 6f 72 20 25 64 22 2c 20 7a 2c 20 66 64  iptor %d", z, fd
5950: 29 3b 0a 20 20 20 20 66 64 20 3d 20 2d 31 3b 0a  );.    fd = -1;.
5960: 20 20 20 20 69 66 28 20 6f 73 4f 70 65 6e 28 22      if( osOpen("
5970: 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 66 2c 20 6d  /dev/null", f, m
5980: 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  )<0 ) break;.  }
5990: 0a 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a  .  if( fd>=0 ){.
59a0: 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a      if( m!=0 ){.
59b0: 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61        struct sta
59c0: 74 20 73 74 61 74 62 75 66 3b 0a 20 20 20 20 20  t statbuf;.     
59d0: 20 69 66 28 20 6f 73 46 73 74 61 74 28 66 64 2c   if( osFstat(fd,
59e0: 20 26 73 74 61 74 62 75 66 29 3d 3d 30 20 0a 20   &statbuf)==0 . 
59f0: 20 20 20 20 20 20 26 26 20 73 74 61 74 62 75 66        && statbuf
5a00: 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a 20 20 20 20  .st_size==0.    
5a10: 20 20 20 26 26 20 28 73 74 61 74 62 75 66 2e 73     && (statbuf.s
5a20: 74 5f 6d 6f 64 65 26 30 37 37 37 29 21 3d 6d 20  t_mode&0777)!=m 
5a30: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
5a40: 20 20 6f 73 46 63 68 6d 6f 64 28 66 64 2c 20 6d    osFchmod(fd, m
5a50: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5a60: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 46 44 5f  .#if defined(FD_
5a70: 43 4c 4f 45 58 45 43 29 20 26 26 20 28 21 64 65  CLOEXEC) && (!de
5a80: 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58 45 43 29  fined(O_CLOEXEC)
5a90: 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45 43 3d 3d 30   || O_CLOEXEC==0
5aa0: 29 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64  ).    osFcntl(fd
5ab0: 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e  , F_SETFD, osFcn
5ac0: 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20  tl(fd, F_GETFD, 
5ad0: 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29  0) | FD_CLOEXEC)
5ae0: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  ;.#endif.  }.  r
5af0: 65 74 75 72 6e 20 66 64 3b 0a 7d 0a 0a 2f 2a 0a  eturn fd;.}../*.
5b00: 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
5b10: 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ons to obtain an
5b20: 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65  d relinquish the
5b30: 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54   global mutex. T
5b40: 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74  he.** global mut
5b50: 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  ex is used to pr
5b60: 6f 74 65 63 74 20 74 68 65 20 75 6e 69 78 49 6e  otect the unixIn
5b70: 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76  odeInfo and.** v
5b80: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
5b90: 65 63 74 73 20 75 73 65 64 20 62 79 20 74 68 69  ects used by thi
5ba0: 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77  s file, all of w
5bb0: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
5bc0: 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70  shared by multip
5bd0: 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a  le threads..**.*
5be0: 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d  * Function unixM
5bf0: 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73  utexHeld() is us
5c00: 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  ed to assert() t
5c10: 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  hat the global m
5c20: 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64  utex .** is held
5c30: 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20   when required. 
5c40: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
5c50: 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61   only used as pa
5c60: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a  rt of assert() .
5c70: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65  ** statements. e
5c80: 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78  .g..**.**   unix
5c90: 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20  EnterMutex().** 
5ca0: 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 78      assert( unix
5cb0: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a  MutexHeld() );.*
5cc0: 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4c 65 61  *   unixEnterLea
5cd0: 76 65 28 29 0a 2a 2a 0a 2a 2a 20 54 6f 20 70 72  ve().**.** To pr
5ce0: 65 76 65 6e 74 20 64 65 61 64 6c 6f 63 6b 2c 20  event deadlock, 
5cf0: 74 68 65 20 67 6c 6f 62 61 6c 20 75 6e 69 78 42  the global unixB
5d00: 69 67 4c 6f 63 6b 20 6d 75 73 74 20 6d 75 73 74  igLock must must
5d10: 20 62 65 20 61 63 71 75 69 72 65 64 0a 2a 2a 20   be acquired.** 
5d20: 62 65 66 6f 72 65 20 74 68 65 20 75 6e 69 78 49  before the unixI
5d30: 6e 6f 64 65 49 6e 66 6f 2e 70 4c 6f 63 6b 4d 75  nodeInfo.pLockMu
5d40: 74 65 78 20 6d 75 74 65 78 2c 20 69 66 20 62 6f  tex mutex, if bo
5d50: 74 68 20 61 72 65 20 68 65 6c 64 2e 20 20 49 74  th are held.  It
5d60: 20 69 73 0a 2a 2a 20 4f 4b 20 74 6f 20 67 65 74   is.** OK to get
5d70: 20 74 68 65 20 70 4c 6f 63 6b 4d 75 74 65 78 20   the pLockMutex 
5d80: 77 69 74 68 6f 75 74 20 68 6f 6c 64 69 6e 67 20  without holding 
5d90: 75 6e 69 78 42 69 67 4c 6f 63 6b 20 66 69 72 73  unixBigLock firs
5da0: 74 2c 20 62 75 74 20 69 66 0a 2a 2a 20 74 68 61  t, but if.** tha
5db0: 74 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 75  t happens, the u
5dc0: 6e 69 78 42 69 67 4c 6f 63 6b 20 6d 75 74 65 78  nixBigLock mutex
5dd0: 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 63 71   must not be acq
5de0: 75 69 72 65 64 20 75 6e 74 69 6c 20 61 66 74 65  uired until afte
5df0: 72 0a 2a 2a 20 70 4c 6f 63 6b 4d 75 74 65 78 20  r.** pLockMutex 
5e00: 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  is released..**.
5e10: 2a 2a 20 20 20 20 20 20 4f 4b 3a 20 20 20 20 20  **      OK:     
5e20: 65 6e 74 65 72 28 75 6e 69 78 42 69 67 4c 6f 63  enter(unixBigLoc
5e30: 6b 29 2c 20 20 65 6e 74 65 72 28 70 4c 6f 63 6b  k),  enter(pLock
5e40: 49 6e 66 6f 29 0a 2a 2a 20 20 20 20 20 20 4f 4b  Info).**      OK
5e50: 3a 20 20 20 20 20 65 6e 74 65 72 28 75 6e 69 78  :     enter(unix
5e60: 42 69 67 4c 6f 63 6b 29 0a 2a 2a 20 20 20 20 20  BigLock).**     
5e70: 20 4f 4b 3a 20 20 20 20 20 65 6e 74 65 72 28 70   OK:     enter(p
5e80: 4c 6f 63 6b 49 6e 66 6f 29 0a 2a 2a 20 20 20 45  LockInfo).**   E
5e90: 52 52 4f 52 3a 20 20 20 20 20 65 6e 74 65 72 28  RROR:     enter(
5ea0: 70 4c 6f 63 6b 49 6e 66 6f 29 2c 20 65 6e 74 65  pLockInfo), ente
5eb0: 72 28 75 6e 69 78 42 69 67 4c 6f 63 6b 29 0a 2a  r(unixBigLock).*
5ec0: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
5ed0: 5f 6d 75 74 65 78 20 2a 75 6e 69 78 42 69 67 4c  _mutex *unixBigL
5ee0: 6f 63 6b 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  ock = 0;.static 
5ef0: 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72 4d 75  void unixEnterMu
5f00: 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 61 73 73  tex(void){.  ass
5f10: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
5f20: 65 78 5f 6e 6f 74 68 65 6c 64 28 75 6e 69 78 42  ex_notheld(unixB
5f30: 69 67 4c 6f 63 6b 29 20 29 3b 20 20 2f 2a 20 4e  igLock) );  /* N
5f40: 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20 6d  ot a recursive m
5f50: 75 74 65 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65  utex */.  sqlite
5f60: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 75 6e  3_mutex_enter(un
5f70: 69 78 42 69 67 4c 6f 63 6b 29 3b 0a 7d 0a 73 74  ixBigLock);.}.st
5f80: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4c 65  atic void unixLe
5f90: 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  aveMutex(void){.
5fa0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5fb0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 75 6e 69  3_mutex_held(uni
5fc0: 78 42 69 67 4c 6f 63 6b 29 20 29 3b 0a 20 20 73  xBigLock) );.  s
5fd0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
5fe0: 76 65 28 75 6e 69 78 42 69 67 4c 6f 63 6b 29 3b  ve(unixBigLock);
5ff0: 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  .}.#ifdef SQLITE
6000: 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  _DEBUG.static in
6010: 74 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  t unixMutexHeld(
6020: 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e  void) {.  return
6030: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6040: 65 6c 64 28 75 6e 69 78 42 69 67 4c 6f 63 6b 29  eld(unixBigLock)
6050: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
6060: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f  def SQLITE_HAVE_
6070: 4f 53 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 48  OS_TRACE./*.** H
6080: 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66  elper function f
6090: 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75 74 20  or printing out 
60a0: 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  trace informatio
60b0: 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69 6e 67  n from debugging
60c0: 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20 54 68  .** binaries. Th
60d0: 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  is returns the s
60e0: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
60f0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70 70  tion of the supp
6100: 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20  lied.** integer 
6110: 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74  lock-type..*/.st
6120: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
6130: 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e 74 20  *azFileLock(int 
6140: 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73 77  eFileLock){.  sw
6150: 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20  itch( eFileLock 
6160: 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f 5f 4c  ){.    case NO_L
6170: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e  OCK: return "NON
6180: 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53 48 41  E";.    case SHA
6190: 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  RED_LOCK: return
61a0: 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20 20 63   "SHARED";.    c
61b0: 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  ase RESERVED_LOC
61c0: 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45 52  K: return "RESER
61d0: 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 50  VED";.    case P
61e0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74  ENDING_LOCK: ret
61f0: 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20  urn "PENDING";. 
6200: 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56     case EXCLUSIV
6210: 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  E_LOCK: return "
6220: 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a  EXCLUSIVE";.  }.
6230: 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52 22    return "ERROR"
6240: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ;.}.#endif..#ifd
6250: 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  ef SQLITE_LOCK_T
6260: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  RACE./*.** Print
6270: 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   out information
6280: 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69   about all locki
6290: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  ng operations..*
62a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
62b0: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 72  e is used for tr
62c0: 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f  oubleshooting lo
62d0: 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65  cks on multithre
62e0: 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d  aded.** platform
62f0: 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f  s.  Enable by co
6300: 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65  mpiling with the
6310: 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54   -DSQLITE_LOCK_T
6320: 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d  RACE.** command-
6330: 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74  line option on t
6340: 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68  he compiler.  Th
6350: 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61  is code is norma
6360: 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66  lly.** turned of
6370: 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
6380: 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66   lockTrace(int f
6390: 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63  d, int op, struc
63a0: 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63  t flock *p){.  c
63b0: 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a  har *zOpName, *z
63c0: 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20  Type;.  int s;. 
63d0: 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b   int savedErrno;
63e0: 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54  .  if( op==F_GET
63f0: 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d  LK ){.    zOpNam
6400: 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d  e = "GETLK";.  }
6410: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53  else if( op==F_S
6420: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
6430: 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20  ame = "SETLK";. 
6440: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20   }else{.    s = 
6450: 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20  osFcntl(fd, op, 
6460: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
6470: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
6480: 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20  l unknown %d %d 
6490: 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73  %d\n", fd, op, s
64a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b  );.    return s;
64b0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f  .  }.  if( p->l_
64c0: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  type==F_RDLCK ){
64d0: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44  .    zType = "RD
64e0: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  LCK";.  }else if
64f0: 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57  ( p->l_type==F_W
6500: 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70  RLCK ){.    zTyp
6510: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d  e = "WRLCK";.  }
6520: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79  else if( p->l_ty
6530: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
6540: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
6550: 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K";.  }else{.   
6560: 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20   assert( 0 );.  
6570: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  }.  assert( p->l
6580: 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45  _whence==SEEK_SE
6590: 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46 63 6e  T );.  s = osFcn
65a0: 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20  tl(fd, op, p);. 
65b0: 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65 72   savedErrno = er
65c0: 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  rno;.  sqlite3De
65d0: 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c  bugPrintf("fcntl
65e0: 20 25 64 20 25 64 20 25 73 20 25 73 20 25 64 20   %d %d %s %s %d 
65f0: 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  %d %d %d\n",.   
6600: 20 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c 20    threadid, fd, 
6610: 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20  zOpName, zType, 
6620: 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c  (int)p->l_start,
6630: 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a   (int)p->l_len,.
6640: 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70       (int)p->l_p
6650: 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73 3d  id, s);.  if( s=
6660: 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f 53  =(-1) && op==F_S
6670: 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79  ETLK && (p->l_ty
6680: 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70  pe==F_RDLCK || p
6690: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  ->l_type==F_WRLC
66a0: 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  K) ){.    struct
66b0: 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c   flock l2;.    l
66c0: 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73 46 63  2 = *p;.    osFc
66d0: 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c  ntl(fd, F_GETLK,
66e0: 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20 6c   &l2);.    if( l
66f0: 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  2.l_type==F_RDLC
6700: 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  K ){.      zType
6710: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20   = "RDLCK";.    
6720: 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74  }else if( l2.l_t
6730: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a  ype==F_WRLCK ){.
6740: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57        zType = "W
6750: 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  RLCK";.    }else
6760: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
6770: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
6780: 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22   zType = "UNLCK"
6790: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
67a0: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
67b0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
67c0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
67d0: 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61 73  ntl-failure-reas
67e0: 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64 5c  on: %s %d %d %d\
67f0: 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70 65  n",.       zType
6800: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72  , (int)l2.l_star
6810: 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e  t, (int)l2.l_len
6820: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29  , (int)l2.l_pid)
6830: 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20  ;.  }.  errno = 
6840: 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65  savedErrno;.  re
6850: 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64 65 66  turn s;.}.#undef
6860: 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69 6e 65   osFcntl.#define
6870: 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54 72 61   osFcntl lockTra
6880: 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  ce.#endif /* SQL
6890: 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a  ITE_LOCK_TRACE *
68a0: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66  /../*.** Retry f
68b0: 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 73  truncate() calls
68c0: 20 74 68 61 74 20 66 61 69 6c 20 64 75 65 20 74   that fail due t
68d0: 6f 20 45 49 4e 54 52 0a 2a 2a 0a 2a 2a 20 41 6c  o EINTR.**.** Al
68e0: 6c 20 63 61 6c 6c 73 20 74 6f 20 66 74 72 75 6e  l calls to ftrun
68f0: 63 61 74 65 28 29 20 77 69 74 68 69 6e 20 74 68  cate() within th
6900: 69 73 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  is file should b
6910: 65 20 6d 61 64 65 20 74 68 72 6f 75 67 68 0a 2a  e made through.*
6920: 2a 20 74 68 69 73 20 77 72 61 70 70 65 72 2e 20  * this wrapper. 
6930: 20 4f 6e 20 74 68 65 20 41 6e 64 72 6f 69 64 20   On the Android 
6940: 70 6c 61 74 66 6f 72 6d 2c 20 62 79 70 61 73 73  platform, bypass
6950: 69 6e 67 20 74 68 65 20 6c 6f 67 69 63 20 62 65  ing the logic be
6960: 6c 6f 77 0a 2a 2a 20 63 6f 75 6c 64 20 6c 65 61  low.** could lea
6970: 64 20 74 6f 20 61 20 63 6f 72 72 75 70 74 20 64  d to a corrupt d
6980: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
6990: 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 74  ic int robust_ft
69a0: 72 75 6e 63 61 74 65 28 69 6e 74 20 68 2c 20 73  runcate(int h, s
69b0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 29  qlite3_int64 sz)
69c0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 23 69 66 64  {.  int rc;.#ifd
69d0: 65 66 20 5f 5f 41 4e 44 52 4f 49 44 5f 5f 0a 20  ef __ANDROID__. 
69e0: 20 2f 2a 20 4f 6e 20 41 6e 64 72 6f 69 64 2c 20   /* On Android, 
69f0: 66 74 72 75 6e 63 61 74 65 28 29 20 61 6c 77 61  ftruncate() alwa
6a00: 79 73 20 75 73 65 73 20 33 32 2d 62 69 74 20 6f  ys uses 32-bit o
6a10: 66 66 73 65 74 73 2c 20 65 76 65 6e 20 69 66 20  ffsets, even if 
6a20: 0a 20 20 2a 2a 20 5f 46 49 4c 45 5f 4f 46 46 53  .  ** _FILE_OFFS
6a30: 45 54 5f 42 49 54 53 3d 36 34 20 69 73 20 64 65  ET_BITS=64 is de
6a40: 66 69 6e 65 64 2e 20 54 68 69 73 20 6d 65 61 6e  fined. This mean
6a50: 73 20 69 74 20 69 73 20 75 6e 73 61 66 65 20 74  s it is unsafe t
6a60: 6f 20 61 74 74 65 6d 70 74 20 74 6f 0a 20 20 2a  o attempt to.  *
6a70: 2a 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c  * truncate a fil
6a80: 65 20 74 6f 20 61 6e 79 20 73 69 7a 65 20 6c 61  e to any size la
6a90: 72 67 65 72 20 74 68 61 6e 20 32 47 69 42 2e 20  rger than 2GiB. 
6aa0: 53 69 6c 65 6e 74 6c 79 20 69 67 6e 6f 72 65 20  Silently ignore 
6ab0: 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 61 74  any.  ** such at
6ac0: 74 65 6d 70 74 73 2e 20 20 2a 2f 0a 20 20 69 66  tempts.  */.  if
6ad0: 28 20 73 7a 3e 28 73 71 6c 69 74 65 33 5f 69 6e  ( sz>(sqlite3_in
6ae0: 74 36 34 29 30 78 37 46 46 46 46 46 46 46 20 29  t64)0x7FFFFFFF )
6af0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
6b00: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  E_OK;.  }else.#e
6b10: 6e 64 69 66 0a 20 20 64 6f 7b 20 72 63 20 3d 20  ndif.  do{ rc = 
6b20: 6f 73 46 74 72 75 6e 63 61 74 65 28 68 2c 73 7a  osFtruncate(h,sz
6b30: 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  ); }while( rc<0 
6b40: 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
6b50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
6b60: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
6b70: 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74 65 73  utine translates
6b80: 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f 53 49   a standard POSI
6b90: 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74  X errno code int
6ba0: 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75  o something.** u
6bb0: 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63 6c 69  seful to the cli
6bc0: 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71 6c 69  ents of the sqli
6bd0: 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  te3 functions.  
6be0: 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 74  Specifically, it
6bf0: 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20   is.** intended 
6c00: 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61 20 76  to translate a v
6c10: 61 72 69 65 74 79 20 6f 66 20 22 74 72 79 20 61  ariety of "try a
6c20: 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69 6e 74  gain" errors int
6c30: 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a  o SQLITE_BUSY.**
6c40: 20 61 6e 64 20 61 20 76 61 72 69 65 74 79 20 6f   and a variety o
6c50: 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73 65 20  f "please close 
6c60: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
6c70: 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72 73 20  tor NOW" errors 
6c80: 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  into .** SQLITE_
6c90: 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72  IOERR.** .** Err
6ca0: 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69 74 69  ors during initi
6cb0: 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63  alization of loc
6cc0: 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79 73 74  ks, or file syst
6cd0: 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c  em support for l
6ce0: 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20  ocks,.** should 
6cf0: 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45  handle ENOLCK, E
6d00: 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55  NOTSUP, EOPNOTSU
6d10: 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a  PP separately..*
6d20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
6d30: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
6d40: 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73 69 78  xError(int posix
6d50: 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74  Error, int sqlit
6d60: 65 49 4f 45 72 72 29 20 7b 0a 20 20 61 73 73 65  eIOErr) {.  asse
6d70: 72 74 28 20 28 73 71 6c 69 74 65 49 4f 45 72 72  rt( (sqliteIOErr
6d80: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
6d90: 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20  _LOCK) || .     
6da0: 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72       (sqliteIOEr
6db0: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
6dc0: 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20  R_UNLOCK) || .  
6dd0: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 49          (sqliteI
6de0: 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49  OErr == SQLITE_I
6df0: 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a  OERR_RDLOCK) ||.
6e00: 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
6e10: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
6e20: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
6e30: 52 56 45 44 4c 4f 43 4b 29 20 29 3b 0a 20 20 73  RVEDLOCK) );.  s
6e40: 77 69 74 63 68 20 28 70 6f 73 69 78 45 72 72 6f  witch (posixErro
6e50: 72 29 20 7b 0a 20 20 63 61 73 65 20 45 41 43 43  r) {.  case EACC
6e60: 45 53 3a 20 0a 20 20 63 61 73 65 20 45 41 47 41  ES: .  case EAGA
6e70: 49 4e 3a 0a 20 20 63 61 73 65 20 45 54 49 4d 45  IN:.  case ETIME
6e80: 44 4f 55 54 3a 0a 20 20 63 61 73 65 20 45 42 55  DOUT:.  case EBU
6e90: 53 59 3a 0a 20 20 63 61 73 65 20 45 49 4e 54 52  SY:.  case EINTR
6ea0: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a  :.  case ENOLCK:
6eb0: 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d    .    /* random
6ec0: 20 4e 46 53 20 72 65 74 72 79 20 65 72 72 6f 72   NFS retry error
6ed0: 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20  , unless during 
6ee0: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
6ef0: 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72  ort .     * intr
6f00: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
6f10: 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20  ich it actually 
6f20: 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61  means what it sa
6f30: 79 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ys */.    return
6f40: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
6f50: 20 20 0a 20 20 63 61 73 65 20 45 50 45 52 4d 3a    .  case EPERM:
6f60: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c   .    return SQL
6f70: 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 20  ITE_PERM;.    . 
6f80: 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20 72   default: .    r
6f90: 65 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45 72  eturn sqliteIOEr
6fa0: 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a  r;.  }.}.../****
6fb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
7000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
7010: 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c 65 20  gin Unique File 
7020: 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20  ID Utility Used 
7030: 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a  By VxWorks *****
7040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
7050: 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e   On most version
7060: 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20 63 61  s of unix, we ca
7070: 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65 20 49  n get a unique I
7080: 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62 79 20  D for a file by 
7090: 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a  concatenating.**
70a0: 20 74 68 65 20 64 65 76 69 63 65 20 6e 75 6d 62   the device numb
70b0: 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f 64 65  er and the inode
70c0: 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20 74 68   number.  But th
70d0: 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  is does not work
70e0: 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20   on VxWorks..** 
70f0: 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e  On VxWorks, a un
7100: 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d 75 73  ique file id mus
7110: 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68  t be based on th
7120: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  e canonical file
7130: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f  name..**.** A po
7140: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
7150: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
7160: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
7170: 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 61  can be used as a
7180: 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c 65 20  .** unique file 
7190: 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20  ID in VxWorks.  
71a0: 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66  Each instance of
71b0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
71c0: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f  contains.** a co
71d0: 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69  py of the canoni
71e0: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54  cal filename.  T
71f0: 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 72  here is also a r
7200: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20  eference count. 
7210: 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63 74 75   .** The structu
7220: 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65 64 20  re is reclaimed 
7230: 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  when the number 
7240: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 69  of pointers to i
7250: 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65  t drops to.** ze
7260: 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  ro..**.** There 
7270: 61 72 65 20 6e 65 76 65 72 20 76 65 72 79 20 6d  are never very m
7280: 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e 20 61  any files open a
7290: 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c  t one time and l
72a0: 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a  ookups are not.*
72b0: 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d  * a performance-
72c0: 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c 20 73  critical path, s
72d0: 6f 20 69 74 20 69 73 20 73 75 66 66 69 63 69 65  o it is sufficie
72e0: 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73 65 0a  nt to put these.
72f0: 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 6f 6e  ** structures on
7300: 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a   a linked list..
7310: 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f 72 6b  */.struct vxwork
7320: 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74 72 75  sFileId {.  stru
7330: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
7340: 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78   *pNext;  /* Nex
7350: 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 74  t in a list of t
7360: 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74  hem all */.  int
7370: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
7380: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7390: 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
73a0: 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a  es to this one *
73b0: 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73d0: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
73e0: 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  he zCanonicalNam
73f0: 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  e[] string */.  
7400: 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c  char *zCanonical
7410: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Name;         /*
7420: 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   Canonical filen
7430: 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f  ame */.};..#if O
7440: 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a  S_VXWORKS./* .**
7450: 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69 6c 65   All unique file
7460: 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64 20 6f  names are held o
7470: 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  n a linked list 
7480: 68 65 61 64 65 64 20 62 79 20 74 68 69 73 0a 2a  headed by this.*
7490: 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73  * variable:.*/.s
74a0: 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77  tatic struct vxw
74b0: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f  orksFileId *vxwo
74c0: 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b  rksFileList = 0;
74d0: 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79  ../*.** Simplify
74e0: 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f   a filename into
74f0: 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66   its canonical f
7500: 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67  orm.** by making
7510: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
7520: 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a  hanges:.**.**  *
7530: 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72   removing any tr
7540: 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70 6c 69  ailing and dupli
7550: 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e  cate /.**  * con
7560: 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75  vert /./ into ju
7570: 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65  st /.**  * conve
7580: 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20  rt /A/../ where 
7590: 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c 65 20  A is any simple 
75a0: 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f  name into just /
75b0: 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61  .**.** Changes a
75c0: 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65  re made in-place
75d0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65  .  Return the ne
75e0: 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a  w name length..*
75f0: 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61  *.** The origina
7600: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e  l filename is in
7610: 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74   z[0..n-1].  Ret
7620: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
7630: 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20  f.** characters 
7640: 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66 69 65  in the simplifie
7650: 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  d name..*/.stati
7660: 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d  c int vxworksSim
7670: 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72 20 2a  plifyName(char *
7680: 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74  z, int n){.  int
7690: 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20   i, j;.  while( 
76a0: 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27  n>1 && z[n-1]=='
76b0: 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66  /' ){ n--; }.  f
76c0: 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
76d0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69  ++){.    if( z[i
76e0: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
76f0: 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20  if( z[i+1]=='/' 
7700: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7710: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e    if( z[i+1]=='.
7720: 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b  ' && i+2<n && z[
7730: 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i+2]=='/' ){.   
7740: 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20       i += 1;.   
7750: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
7760: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
7770: 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20   z[i+1]=='.' && 
7780: 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d  i+3<n && z[i+2]=
7790: 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d  ='.' && z[i+3]==
77a0: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77  '/' ){.        w
77b0: 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a  hile( j>0 && z[j
77c0: 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b  -1]!='/' ){ j--;
77d0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
77e0: 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20  >0 ){ j--; }.   
77f0: 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20       i += 2;.   
7800: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
7810: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
7820: 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a   z[j++] = z[i];.
7830: 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a    }.  z[j] = 0;.
7840: 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f    return j;.}../
7850: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e 69 71  *.** Find a uniq
7860: 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 74  ue file ID for t
7870: 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c 75 74  he given absolut
7880: 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74  e pathname.  Ret
7890: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
78a0: 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b 73 46   to the vxworksF
78b0: 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 54  ileId object.  T
78c0: 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73 20 74  his pointer is t
78d0: 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c  he unique.** fil
78e0: 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e ID..**.** The 
78f0: 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20 74 68  nRef field of th
7900: 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  e vxworksFileId 
7910: 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72 65 6d  object is increm
7920: 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  ented before.** 
7930: 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 72 65  the object is re
7940: 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77 20 76  turned.  A new v
7950: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
7960: 65 63 74 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ect is created.*
7970: 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74  * and added to t
7980: 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69  he global list i
7990: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  f necessary..**.
79a0: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
79b0: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
79c0: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
79d0: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ULL..*/.static s
79e0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
79f0: 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64  eId *vxworksFind
7a00: 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63 68 61  FileId(const cha
7a10: 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  r *zAbsoluteName
7a20: 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  ){.  struct vxwo
7a30: 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b  rksFileId *pNew;
7a40: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 61 72           /* sear
7a50: 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77 20 66  ch key and new f
7a60: 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74 72 75  ile ID */.  stru
7a70: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
7a80: 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20 20 20   *pCandidate;   
7a90: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
7aa0: 76 65 72 20 65 78 69 73 74 69 6e 67 20 66 69 6c  ver existing fil
7ab0: 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  e IDs */.  int n
7ac0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7ae0: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41 62 73  * Length of zAbs
7af0: 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69 6e 67  oluteName string
7b00: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 7a   */..  assert( z
7b10: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d  AbsoluteName[0]=
7b20: 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69  ='/' );.  n = (i
7b30: 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c  nt)strlen(zAbsol
7b40: 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77  uteName);.  pNew
7b50: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
7b60: 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65  c64( sizeof(*pNe
7b70: 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20  w) + (n+1) );.  
7b80: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
7b90: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
7ba0: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d  zCanonicalName =
7bb0: 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
7bc0: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d  ;.  memcpy(pNew-
7bd0: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
7be0: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20   zAbsoluteName, 
7bf0: 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f  n+1);.  n = vxwo
7c00: 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28  rksSimplifyName(
7c10: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
7c20: 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20  Name, n);..  /* 
7c30: 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78  Search for an ex
7c40: 69 73 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61  isting entry tha
7c50: 74 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 63  t matching the c
7c60: 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20  anonical name.. 
7c70: 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e   ** If found, in
7c80: 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
7c90: 72 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64 20  rence count and 
7ca0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
7cb0: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 69   to.  ** the exi
7cc0: 73 74 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20  sting file ID.. 
7cd0: 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
7ce0: 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 43  utex();.  for(pC
7cf0: 61 6e 64 69 64 61 74 65 3d 76 78 77 6f 72 6b 73  andidate=vxworks
7d00: 46 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64 69  FileList; pCandi
7d10: 64 61 74 65 3b 20 70 43 61 6e 64 69 64 61 74 65  date; pCandidate
7d20: 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65  =pCandidate->pNe
7d30: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 61  xt){.    if( pCa
7d40: 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d  ndidate->nName==
7d50: 6e 20 0a 20 20 20 20 20 26 26 20 6d 65 6d 63 6d  n .     && memcm
7d60: 70 28 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43  p(pCandidate->zC
7d70: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e  anonicalName, pN
7d80: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
7d90: 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b  me, n)==0.    ){
7da0: 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  .       sqlite3_
7db0: 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  free(pNew);.    
7dc0: 20 20 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e     pCandidate->n
7dd0: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e  Ref++;.       un
7de0: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
7df0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43         return pC
7e00: 61 6e 64 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a  andidate;.    }.
7e10: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74    }..  /* No mat
7e20: 63 68 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 57  ch was found.  W
7e30: 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65  e will make a ne
7e40: 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70  w file ID */.  p
7e50: 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  New->nRef = 1;. 
7e60: 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e   pNew->nName = n
7e70: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
7e80: 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73  = vxworksFileLis
7e90: 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c 65  t;.  vxworksFile
7ea0: 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75  List = pNew;.  u
7eb0: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
7ec0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
7ed0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
7ee0: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
7ef0: 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f   count on a vxwo
7f00: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
7f10: 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f  .  Free.** the o
7f20: 62 6a 65 63 74 20 77 68 65 6e 20 74 68 65 20 72  bject when the r
7f30: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72  eference count r
7f40: 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a  eaches zero..*/.
7f50: 73 74 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f  static void vxwo
7f60: 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64  rksReleaseFileId
7f70: 28 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46  (struct vxworksF
7f80: 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20 20 75  ileId *pId){.  u
7f90: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
7fa0: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 2d 3e  .  assert( pId->
7fb0: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d  nRef>0 );.  pId-
7fc0: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
7fd0: 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Id->nRef==0 ){. 
7fe0: 20 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b     struct vxwork
7ff0: 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20  sFileId **pp;.  
8000: 20 20 66 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b    for(pp=&vxwork
8010: 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26  sFileList; *pp &
8020: 26 20 2a 70 70 21 3d 70 49 64 3b 20 70 70 20 3d  & *pp!=pId; pp =
8030: 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29   &((*pp)->pNext)
8040: 29 7b 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20  ){}.    assert( 
8050: 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20  *pp==pId );.    
8060: 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74  *pp = pId->pNext
8070: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
8080: 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75  ee(pId);.  }.  u
8090: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
80a0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  .}.#endif /* OS_
80b0: 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a  VXWORKS */./****
80c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
80d0: 6f 66 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49  of Unique File I
80e0: 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20 42  D Utility Used B
80f0: 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a  y VxWorks ******
8100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
8110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a  *********/.../**
8160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
81a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
81b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
81c0: 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41  ******** Posix A
81d0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20  dvisory Locking 
81e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
81f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
8200: 2a 2a 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  ** POSIX advisor
8210: 79 20 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b  y locks are brok
8220: 65 6e 20 62 79 20 64 65 73 69 67 6e 2e 20 20 41  en by design.  A
8230: 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31 20 28  NSI STD 1003.1 (
8240: 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e  1996).** section
8250: 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34   6.5.2.2 lines 4
8260: 38 33 20 74 68 72 6f 75 67 68 20 34 39 30 20 73  83 through 490 s
8270: 70 65 63 69 66 79 20 74 68 61 74 20 77 68 65 6e  pecify that when
8280: 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65   a process.** se
8290: 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c  ts or clears a l
82a0: 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74  ock, that operat
82b0: 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e  ion overrides an
82c0: 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65  y prior locks se
82d0: 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65  t.** by the same
82e0: 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f   process.  It do
82f0: 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c  es not explicitl
8300: 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68  y say so, but th
8310: 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68  is implies.** th
8320: 61 74 20 69 74 20 6f 76 65 72 72 69 64 65 73 20  at it overrides 
8330: 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68 65  locks set by the
8340: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73   same process us
8350: 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a  ing a different.
8360: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
8370: 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68  or.  Consider th
8380: 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a  is test case:.**
8390: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64  .**       int fd
83a0: 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65  1 = open("./file
83b0: 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  1", O_RDWR|O_CRE
83c0: 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20  AT, 0644);.**   
83d0: 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70      int fd2 = op
83e0: 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f  en("./file2", O_
83f0: 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36  RDWR|O_CREAT, 06
8400: 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  44);.**.** Suppo
8410: 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e  se ./file1 and .
8420: 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c  /file2 are reall
8430: 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  y the same file 
8440: 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20  (because.** one 
8450: 69 73 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d  is a hard or sym
8460: 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68  bolic link to th
8470: 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66  e other) then if
8480: 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65   you set.** an e
8490: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
84a0: 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74   fd1, then try t
84b0: 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69  o get an exclusi
84c0: 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64  ve lock.** on fd
84d0: 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20  2, it works.  I 
84e0: 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65 63  would have expec
84f0: 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c  ted the second l
8500: 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73  ock to.** fail s
8510: 69 6e 63 65 20 74 68 65 72 65 20 77 61 73 20 61  ince there was a
8520: 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e  lready a lock on
8530: 20 74 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f   the file due to
8540: 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74   fd1..** But not
8550: 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68   so.  Since both
8560: 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d   locks came from
8570: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
8580: 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  s, the.** second
8590: 20 6f 76 65 72 72 69 64 65 73 20 74 68 65 20 66   overrides the f
85a0: 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67  irst, even thoug
85b0: 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64  h they were on d
85c0: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65  ifferent.** file
85d0: 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
85e0: 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74  ned on different
85f0: 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a   file names..**.
8600: 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  ** This means th
8610: 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65  at we cannot use
8620: 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20   POSIX locks to 
8630: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65  synchronize file
8640: 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67   access.** among
8650: 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61   competing threa
8660: 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70  ds of the same p
8670: 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c  rocess.  POSIX l
8680: 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66  ocks will work f
8690: 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72  ine.** to synchr
86a0: 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72  onize access for
86b0: 20 74 68 72 65 61 64 73 20 69 6e 20 73 65 70 61   threads in sepa
86c0: 72 61 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20  rate processes, 
86d0: 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61  but not.** threa
86e0: 64 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  ds within the sa
86f0: 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  me process..**.*
8700: 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
8710: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51   the problem, SQ
8720: 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61  Lite has to mana
8730: 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e  ge file locks in
8740: 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69  ternally.** on i
8750: 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65  ts own.  Wheneve
8760: 72 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  r a new database
8770: 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68   is opened, we h
8780: 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a  ave to find the.
8790: 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64  ** specific inod
87a0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
87b0: 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64  e file (the inod
87c0: 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
87d0: 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76  by the.** st_dev
87e0: 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c   and st_ino fiel
87f0: 64 73 20 6f 66 20 74 68 65 20 73 74 61 74 20 73  ds of the stat s
8800: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 66 73  tructure that fs
8810: 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a  tat() fills in).
8820: 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72  ** and check for
8830: 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65   locks already e
8840: 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20  xisting on that 
8850: 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63  inode.  When loc
8860: 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65  ks are.** create
8870: 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65  d or removed, we
8880: 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74   have to look at
8890: 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61   our own interna
88a0: 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a  l record of the.
88b0: 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20  ** locks to see 
88c0: 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  if another threa
88d0: 64 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79  d has previously
88e0: 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74   set a lock on t
88f0: 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64  hat same.** inod
8900: 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a  e..**.** (Aside:
8910: 20 54 68 65 20 75 73 65 20 6f 66 20 69 6e 6f 64   The use of inod
8920: 65 20 6e 75 6d 62 65 72 73 20 61 73 20 75 6e 69  e numbers as uni
8930: 71 75 65 20 49 44 73 20 64 6f 65 73 20 6e 6f 74  que IDs does not
8940: 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73   work on VxWorks
8950: 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73  ..** For VxWorks
8960: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 75 73 65  , we have to use
8970: 20 74 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65   the alternative
8980: 20 75 6e 69 71 75 65 20 49 44 20 73 79 73 74 65   unique ID syste
8990: 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61  m based on.** ca
89a0: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
89b0: 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64   and implemented
89c0: 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
89d0: 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a   division.).**.*
89e0: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69  * The sqlite3_fi
89f0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  le structure for
8a00: 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e   POSIX is no lon
8a10: 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65  ger just an inte
8a20: 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  ger file.** desc
8a30: 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e  riptor.  It is n
8a40: 6f 77 20 61 20 73 74 72 75 63 74 75 72 65 20 74  ow a structure t
8a50: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e  hat holds the in
8a60: 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65  teger file.** de
8a70: 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70  scriptor and a p
8a80: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75  ointer to a stru
8a90: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
8aa0: 69 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61  ibes the interna
8ab0: 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  l.** locks on th
8ac0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
8ad0: 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73  inode.  There is
8ae0: 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72   one locking str
8af0: 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e  ucture.** per in
8b00: 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73  ode, so if the s
8b10: 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65  ame inode is ope
8b20: 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20  ned twice, both 
8b30: 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
8b40: 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20  res.** point to 
8b50: 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67  the same locking
8b60: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
8b70: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
8b80: 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65  re keeps.** a re
8b90: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73  ference count (s
8ba0: 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77  o we will know w
8bb0: 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74  hen to delete it
8bc0: 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a  ) and a "cnt".**
8bd0: 20 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c   field that tell
8be0: 73 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61  s us its interna
8bf0: 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20  l lock status.  
8c00: 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65  cnt==0 means the
8c10: 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  .** file is unlo
8c20: 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d  cked.  cnt==-1 m
8c30: 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61  eans the file ha
8c40: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
8c50: 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65  ock..** cnt>0 me
8c60: 61 6e 73 20 74 68 65 72 65 20 61 72 65 20 63 6e  ans there are cn
8c70: 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f  t shared locks o
8c80: 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  n the file..**.*
8c90: 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f  * Any attempt to
8ca0: 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20   lock or unlock 
8cb0: 61 20 66 69 6c 65 20 66 69 72 73 74 20 63 68 65  a file first che
8cc0: 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a  cks the locking.
8cd0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  ** structure.  T
8ce0: 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65  he fcntl() syste
8cf0: 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69  m call is only i
8d00: 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20  nvoked to set a 
8d10: 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69  .** POSIX lock i
8d20: 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c  f the internal l
8d30: 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20 74 72  ock structure tr
8d40: 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65  ansitions betwee
8d50: 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e  n.** a locked an
8d60: 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74  d an unlocked st
8d70: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77  ate..**.** But w
8d80: 61 69 74 3a 20 20 74 68 65 72 65 20 61 72 65 20  ait:  there are 
8d90: 79 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d  yet more problem
8da0: 73 20 77 69 74 68 20 50 4f 53 49 58 20 61 64 76  s with POSIX adv
8db0: 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a  isory locks..**.
8dc0: 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20  ** If you close 
8dd0: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
8de0: 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f  r that points to
8df0: 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61 73   a file that has
8e00: 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c   locks,.** all l
8e10: 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c  ocks on that fil
8e20: 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64  e that are owned
8e30: 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
8e40: 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72  process are.** r
8e50: 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72  eleased.  To wor
8e60: 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72  k around this pr
8e70: 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78  oblem, each unix
8e80: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
8e90: 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61 20  .** maintains a 
8ea0: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
8eb0: 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c  ber of pending l
8ec0: 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64  ocks on tha inod
8ed0: 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74  e..** When an at
8ee0: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
8ef0: 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69   close an unixFi
8f00: 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  le, if there are
8f10: 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69  .** other unixFi
8f20: 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  le open on the s
8f30: 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61  ame inode that a
8f40: 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73  re holding locks
8f50: 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f  , the call.** to
8f60: 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c   close() the fil
8f70: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
8f80: 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61  deferred until a
8f90: 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20  ll of the locks 
8fa0: 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e  clear..** The un
8fb0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75  ixInodeInfo stru
8fc0: 63 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69  cture keeps a li
8fd0: 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72  st of file descr
8fe0: 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64  iptors that need
8ff0: 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64   to.** be closed
9000: 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69   and that list i
9010: 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c  s walked (and cl
9020: 65 61 72 65 64 29 20 77 68 65 6e 20 74 68 65 20  eared) when the 
9030: 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65  last lock.** cle
9040: 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61  ars..**.** Yet a
9050: 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20  nother problem: 
9060: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f   LinuxThreads do
9070: 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77   not play well w
9080: 69 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e  ith posix locks.
9090: 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65  .**.** Many olde
90a0: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69  r versions of li
90b0: 6e 75 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75  nux use the Linu
90c0: 78 54 68 72 65 61 64 73 20 6c 69 62 72 61 72 79  xThreads library
90d0: 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74   which is.** not
90e0: 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74   posix compliant
90f0: 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68  .  Under LinuxTh
9100: 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72  reads, a lock cr
9110: 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64 0a  eated by thread.
9120: 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d  ** A cannot be m
9130: 6f 64 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72  odified or overr
9140: 69 64 64 65 6e 20 62 79 20 61 20 64 69 66 66 65  idden by a diffe
9150: 72 65 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a  rent thread B..*
9160: 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20  * Only thread A 
9170: 63 61 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c  can modify the l
9180: 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65  ock.  Locking be
9190: 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63  havior is correc
91a0: 74 0a 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c  t.** if the appl
91b0: 69 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20  iation uses the 
91c0: 6e 65 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73  newer Native Pos
91d0: 69 78 20 54 68 72 65 61 64 20 4c 69 62 72 61 72  ix Thread Librar
91e0: 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c  y (NPTL).** on l
91f0: 69 6e 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c  inux - with NPTL
9200: 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20   a lock created 
9210: 62 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20  by thread A can 
9220: 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a  override locks.*
9230: 2a 20 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20  * in thread B.  
9240: 42 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  But there is no 
9250: 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63  way to know at c
9260: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63  ompile-time whic
9270: 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c  h.** threading l
9280: 69 62 72 61 72 79 20 69 73 20 62 65 69 6e 67 20  ibrary is being 
9290: 75 73 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20  used.  So there 
92a0: 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f  is no way to kno
92b0: 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d  w at.** compile-
92c0: 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20  time whether or 
92d0: 6e 6f 74 20 74 68 72 65 61 64 20 41 20 63 61 6e  not thread A can
92e0: 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20   override locks 
92f0: 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20  on thread B..** 
9300: 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 61 20  One has to do a 
9310: 72 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74  run-time check t
9320: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 62  o discover the b
9330: 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a  ehavior of the.*
9340: 2a 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73  * current proces
9350: 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  s..**.** SQLite 
9360: 75 73 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20  used to support 
9370: 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 20 20 42  LinuxThreads.  B
9380: 75 74 20 73 75 70 70 6f 72 74 20 66 6f 72 20 4c  ut support for L
9390: 69 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a 20 77  inuxThreads.** w
93a0: 61 73 20 64 72 6f 70 70 65 64 20 62 65 67 69 6e  as dropped begin
93b0: 6e 69 6e 67 20 77 69 74 68 20 76 65 72 73 69 6f  ning with versio
93c0: 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65  n 3.7.0.  SQLite
93d0: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b   will still work
93e0: 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68   with.** LinuxTh
93f0: 72 65 61 64 73 20 70 72 6f 76 69 64 65 64 20 74  reads provided t
9400: 68 61 74 20 28 31 29 20 74 68 65 72 65 20 69 73  hat (1) there is
9410: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
9420: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a  e connection .**
9430: 20 70 65 72 20 64 61 74 61 62 61 73 65 20 66 69   per database fi
9440: 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70  le in the same p
9450: 72 6f 63 65 73 73 20 61 6e 64 20 28 32 29 20 64  rocess and (2) d
9460: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
9470: 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f  ons.** do not mo
9480: 76 65 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ve across thread
9490: 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  s..*/../*.** An 
94a0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
94b0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
94c0: 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68  ure serves as th
94d0: 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f  e key used.** to
94e0: 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63   locate a partic
94f0: 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ular unixInodeIn
9500: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
9510: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
9520: 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20  {.  dev_t dev;  
9530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9540: 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72  /* Device number
9550: 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   */.#if OS_VXWOR
9560: 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  KS.  struct vxwo
9570: 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20  rksFileId *pId; 
9580: 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20   /* Unique file 
9590: 49 44 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20  ID for vxworks. 
95a0: 2a 2f 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 57 65  */.#else.  /* We
95b0: 20 61 72 65 20 74 6f 6c 64 20 74 68 61 74 20 73   are told that s
95c0: 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
95d0: 41 6e 64 72 6f 69 64 20 63 6f 6e 74 61 69 6e 20  Android contain 
95e0: 61 20 62 75 67 20 74 68 61 74 0a 20 20 2a 2a 20  a bug that.  ** 
95f0: 73 69 7a 65 73 20 69 6e 6f 5f 74 20 61 74 20 6f  sizes ino_t at o
9600: 6e 6c 79 20 33 32 2d 62 69 74 73 20 69 6e 73 74  nly 32-bits inst
9610: 65 61 64 20 6f 66 20 36 34 2d 62 69 74 73 2e 20  ead of 64-bits. 
9620: 28 53 65 65 0a 20 20 2a 2a 20 68 74 74 70 73 3a  (See.  ** https:
9630: 2f 2f 61 6e 64 72 6f 69 64 2d 72 65 76 69 65 77  //android-review
9640: 2e 67 6f 6f 67 6c 65 73 6f 75 72 63 65 2e 63 6f  .googlesource.co
9650: 6d 2f 23 2f 63 2f 31 31 35 33 35 31 2f 33 2f 64  m/#/c/115351/3/d
9660: 69 73 74 2f 73 71 6c 69 74 65 33 2e 63 29 0a 20  ist/sqlite3.c). 
9670: 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75   ** To work arou
9680: 6e 64 20 74 68 69 73 2c 20 61 6c 77 61 79 73 20  nd this, always 
9690: 61 6c 6c 6f 63 61 74 65 20 36 34 2d 62 69 74 73  allocate 64-bits
96a0: 20 66 6f 72 20 74 68 65 20 69 6e 6f 64 65 20 6e   for the inode n
96b0: 75 6d 62 65 72 2e 20 20 0a 20 20 2a 2a 20 4f 6e  umber.  .  ** On
96c0: 20 73 6d 61 6c 6c 20 6d 61 63 68 69 6e 65 73 20   small machines 
96d0: 74 68 61 74 20 6f 6e 6c 79 20 68 61 76 65 20 33  that only have 3
96e0: 32 2d 62 69 74 20 69 6e 6f 64 65 73 2c 20 74 68  2-bit inodes, th
96f0: 69 73 20 77 61 73 74 65 73 20 34 20 62 79 74 65  is wastes 4 byte
9700: 73 2c 0a 20 20 2a 2a 20 62 75 74 20 74 68 61 74  s,.  ** but that
9710: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61   should not be a
9720: 20 62 69 67 20 64 65 61 6c 2e 20 2a 2f 0a 20 20   big deal. */.  
9730: 2f 2a 20 57 41 53 3a 20 20 69 6e 6f 5f 74 20 69  /* WAS:  ino_t i
9740: 6e 6f 3b 20 20 20 2a 2f 0a 20 20 75 36 34 20 69  no;   */.  u64 i
9750: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
9760: 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e        /* Inode n
9770: 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a  umber */.#endif.
9780: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  };../*.** An ins
9790: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
97a0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
97b0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f   is allocated fo
97c0: 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69  r each open.** i
97d0: 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69  node.  Or, on Li
97e0: 6e 75 78 54 68 72 65 61 64 73 2c 20 74 68 65 72  nuxThreads, ther
97f0: 65 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73  e is one of thes
9800: 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72  e structures for
9810: 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65 20 6f  .** each inode o
9820: 70 65 6e 65 64 20 62 79 20 65 61 63 68 20 74 68  pened by each th
9830: 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69  read..**.** A si
9840: 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68  ngle inode can h
9850: 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c  ave multiple fil
9860: 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73  e descriptors, s
9870: 6f 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a  o each unixFile.
9880: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ** structure con
9890: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
98a0: 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  to an instance o
98b0: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e  f this object an
98c0: 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74  d this.** object
98d0: 20 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f   keeps a count o
98e0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
98f0: 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e  unixFile pointin
9900: 67 20 74 6f 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4d  g to it..**.** M
9910: 75 74 65 78 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a  utex rules:.**.*
9920: 2a 20 20 28 31 29 20 4f 6e 6c 79 20 74 68 65 20  *  (1) Only the 
9930: 70 4c 6f 63 6b 4d 75 74 65 78 20 6d 75 74 65 78  pLockMutex mutex
9940: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 69 6e   must be held in
9950: 20 6f 72 64 65 72 20 74 6f 20 72 65 61 64 20 6f   order to read o
9960: 72 20 77 72 69 74 65 0a 2a 2a 20 20 20 20 20 20  r write.**      
9970: 61 6e 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69  any of the locki
9980: 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 20 20 20  ng fields:.**   
9990: 20 20 20 20 20 20 20 6e 53 68 61 72 65 64 2c 20         nShared, 
99a0: 6e 4c 6f 63 6b 2c 20 65 46 69 6c 65 4c 6f 63 6b  nLock, eFileLock
99b0: 2c 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b 2c 20  , bProcessLock, 
99c0: 70 55 6e 75 73 65 64 0a 2a 2a 0a 2a 2a 20 20 28  pUnused.**.**  (
99d0: 32 29 20 57 68 65 6e 20 6e 52 65 66 3e 30 2c 20  2) When nRef>0, 
99e0: 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  then the followi
99f0: 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 75 6e  ng fields are un
9a00: 63 68 61 6e 67 69 6e 67 20 61 6e 64 20 63 61 6e  changing and can
9a10: 0a 2a 2a 20 20 20 20 20 20 62 65 20 72 65 61 64  .**      be read
9a20: 20 28 62 75 74 20 6e 6f 74 20 77 72 69 74 74 65   (but not writte
9a30: 6e 29 20 77 69 74 68 6f 75 74 20 68 6f 6c 64 69  n) without holdi
9a40: 6e 67 20 61 6e 79 20 6d 75 74 65 78 3a 0a 2a 2a  ng any mutex:.**
9a50: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 49 64            fileId
9a60: 2c 20 70 4c 6f 63 6b 4d 75 74 65 78 0a 2a 2a 0a  , pLockMutex.**.
9a70: 2a 2a 20 20 28 33 29 20 57 69 74 68 20 74 68 65  **  (3) With the
9a80: 20 65 78 63 65 70 74 69 6f 6e 73 20 61 62 6f 76   exceptions abov
9a90: 65 2c 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  e, all the field
9aa0: 73 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 72 65  s may only be re
9ab0: 61 64 0a 2a 2a 20 20 20 20 20 20 6f 72 20 77 72  ad.**      or wr
9ac0: 69 74 74 65 6e 20 77 68 69 6c 65 20 68 6f 6c 64  itten while hold
9ad0: 69 6e 67 20 74 68 65 20 67 6c 6f 62 61 6c 20 75  ing the global u
9ae0: 6e 69 78 42 69 67 4c 6f 63 6b 20 6d 75 74 65 78  nixBigLock mutex
9af0: 2e 0a 2a 2a 0a 2a 2a 20 44 65 61 64 6c 6f 63 6b  ..**.** Deadlock
9b00: 20 70 72 65 76 65 6e 74 69 6f 6e 3a 20 20 54 68   prevention:  Th
9b10: 65 20 67 6c 6f 62 61 6c 20 75 6e 69 78 42 69 67  e global unixBig
9b20: 4c 6f 63 6b 20 6d 75 74 65 78 20 6d 61 79 20 6e  Lock mutex may n
9b30: 6f 74 0a 2a 2a 20 62 65 20 61 63 71 75 69 72 65  ot.** be acquire
9b40: 64 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  d while holding 
9b50: 74 68 65 20 70 4c 6f 63 6b 4d 75 74 65 78 20 6d  the pLockMutex m
9b60: 75 74 65 78 2e 20 20 49 66 20 62 6f 74 68 20 75  utex.  If both u
9b70: 6e 69 78 42 69 67 4c 6f 63 6b 0a 2a 2a 20 61 6e  nixBigLock.** an
9b80: 64 20 70 4c 6f 63 6b 4d 75 74 65 78 20 61 72 65  d pLockMutex are
9b90: 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 75 6e   needed, then un
9ba0: 69 78 42 69 67 4c 6f 63 6b 20 6d 75 73 74 20 62  ixBigLock must b
9bb0: 65 20 61 63 71 75 69 72 65 64 20 66 69 72 73 74  e acquired first
9bc0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
9bd0: 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74  InodeInfo {.  st
9be0: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
9bf0: 66 69 6c 65 49 64 3b 20 20 20 20 20 20 20 2f 2a  fileId;       /*
9c00: 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20   The lookup key 
9c10: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
9c20: 65 78 20 2a 70 4c 6f 63 6b 4d 75 74 65 78 3b 20  ex *pLockMutex; 
9c30: 20 20 20 20 20 2f 2a 20 48 6f 6c 64 20 74 68 69       /* Hold thi
9c40: 73 20 6d 75 74 65 78 20 66 6f 72 2e 2e 2e 20 2a  s mutex for... *
9c50: 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72 65 64 3b  /.  int nShared;
9c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c70: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9c80: 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20  of SHARED locks 
9c90: 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  held */.  int nL
9ca0: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
9cb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9cc0: 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e  umber of outstan
9cd0: 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20  ding file locks 
9ce0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
9cf0: 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20  ar eFileLock;   
9d00: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
9d10: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
9d20: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e  SERVED_LOCK etc.
9d30: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
9d40: 68 61 72 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b  har bProcessLock
9d50: 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78  ;       /* An ex
9d60: 63 6c 75 73 69 76 65 20 70 72 6f 63 65 73 73 20  clusive process 
9d70: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0a  lock is held */.
9d80: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
9d90: 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20  pUnused;        
9da0: 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66 69      /* Unused fi
9db0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74  le descriptors t
9dc0: 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e 74  o close */.  int
9dd0: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
9de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9df0: 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65  Number of pointe
9e00: 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63  rs to this struc
9e10: 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68  ture */.  unixSh
9e20: 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
9e30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
9e40: 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red memory assoc
9e50: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
9e60: 69 6e 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49  inode */.  unixI
9e70: 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b  nodeInfo *pNext;
9e80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
9e90: 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e  st of all unixIn
9ea0: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20  odeInfo objects 
9eb0: 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
9ec0: 66 6f 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20  fo *pPrev;      
9ed0: 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20       /*    .... 
9ee0: 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f  doubly linked */
9ef0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
9f00: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
9f10: 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
9f20: 20 6c 6f 6e 67 20 73 68 61 72 65 64 42 79 74 65   long sharedByte
9f30: 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50 20 73 69  ;  /* for AFP si
9f40: 6d 75 6c 61 74 65 64 20 73 68 61 72 65 64 20 6c  mulated shared l
9f50: 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  ock */.#endif.#i
9f60: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
9f70: 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20 20  em_t *pSem;     
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9f90: 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65  * Named POSIX se
9fa0: 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61  maphore */.  cha
9fb0: 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50  r aSemName[MAX_P
9fc0: 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20  ATHNAME+2];  /* 
9fd0: 4e 61 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d  Name of that sem
9fe0: 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66  aphore */.#endif
9ff0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  .};../*.** A lis
a000: 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e  ts of all unixIn
a010: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e  odeInfo objects.
a020: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69 78 49  .*/.static unixI
a030: 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c  nodeInfo *inodeL
a040: 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20 41 6c 6c  ist = 0;  /* All
a050: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
a060: 62 6a 65 63 74 73 20 2a 2f 0a 0a 23 69 66 64 65  bjects */..#ifde
a070: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
a080: 2a 0a 2a 2a 20 54 72 75 65 20 69 66 20 74 68 65  *.** True if the
a090: 20 69 6e 6f 64 65 20 6d 75 74 65 78 20 69 73 20   inode mutex is 
a0a0: 68 65 6c 64 2c 20 6f 72 20 6e 6f 74 2e 20 20 55  held, or not.  U
a0b0: 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20  sed only within 
a0c0: 61 73 73 65 72 74 28 29 0a 2a 2a 20 74 6f 20 68  assert().** to h
a0d0: 65 6c 70 20 76 65 72 69 66 79 20 63 6f 72 72 65  elp verify corre
a0e0: 63 74 20 6d 75 74 65 78 20 75 73 61 67 65 2e 0a  ct mutex usage..
a0f0: 2a 2f 0a 69 6e 74 20 75 6e 69 78 46 69 6c 65 4d  */.int unixFileM
a100: 75 74 65 78 48 65 6c 64 28 75 6e 69 78 46 69 6c  utexHeld(unixFil
a110: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 61 73 73  e *pFile){.  ass
a120: 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ert( pFile->pIno
a130: 64 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  de );.  return s
a140: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
a150: 64 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  d(pFile->pInode-
a160: 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 7d 0a  >pLockMutex);.}.
a170: 69 6e 74 20 75 6e 69 78 46 69 6c 65 4d 75 74 65  int unixFileMute
a180: 78 4e 6f 74 68 65 6c 64 28 75 6e 69 78 46 69 6c  xNotheld(unixFil
a190: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 61 73 73  e *pFile){.  ass
a1a0: 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ert( pFile->pIno
a1b0: 64 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  de );.  return s
a1c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74  qlite3_mutex_not
a1d0: 68 65 6c 64 28 70 46 69 6c 65 2d 3e 70 49 6e 6f  held(pFile->pIno
a1e0: 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b  de->pLockMutex);
a1f0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
a200: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
a210: 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  n - unixLogError
a220: 41 74 4c 69 6e 65 28 29 2c 20 69 73 20 6f 6e 6c  AtLine(), is onl
a230: 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69  y ever called vi
a240: 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 75  a the macro.** u
a250: 6e 69 78 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a  nixLogError()..*
a260: 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b  *.** It is invok
a270: 65 64 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f  ed after an erro
a280: 72 20 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f  r occurs in an O
a290: 53 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 65  S function and e
a2a0: 72 72 6e 6f 20 68 61 73 20 62 65 65 6e 0a 2a 2a  rrno has been.**
a2b0: 20 73 65 74 2e 20 49 74 20 6c 6f 67 73 20 61 20   set. It logs a 
a2c0: 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73 71  message using sq
a2d0: 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74  lite3_log() cont
a2e0: 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65  aining the curre
a2f0: 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65  nt value of.** e
a300: 72 72 6e 6f 20 61 6e 64 2c 20 69 66 20 70 6f 73  rrno and, if pos
a310: 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e  sible, the human
a320: 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69 76 61  -readable equiva
a330: 6c 65 6e 74 20 66 72 6f 6d 20 73 74 72 65 72 72  lent from strerr
a340: 6f 72 28 29 20 6f 72 0a 2a 2a 20 73 74 72 65 72  or() or.** strer
a350: 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  ror_r()..**.** T
a360: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
a370: 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  t passed to the 
a380: 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20  macro should be 
a390: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
a3a0: 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72  hat.** will be r
a3b0: 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74  eturned to SQLit
a3c0: 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49  e (e.g. SQLITE_I
a3d0: 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c  OERR_DELETE, SQL
a3e0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a  ITE_CANTOPEN). .
a3f0: 2a 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73 65  ** The two subse
a400: 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20  quent arguments 
a410: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61  should be the na
a420: 6d 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e  me of the OS fun
a430: 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61  ction that.** fa
a440: 69 6c 65 64 20 28 65 2e 67 2e 20 22 75 6e 6c 69  iled (e.g. "unli
a450: 6e 6b 22 2c 20 22 6f 70 65 6e 22 29 20 61 6e 64  nk", "open") and
a460: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
a470: 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68  file-system path
a480: 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a  ,.** if any..*/.
a490: 23 64 65 66 69 6e 65 20 75 6e 69 78 4c 6f 67 45  #define unixLogE
a4a0: 72 72 6f 72 28 61 2c 62 2c 63 29 20 20 20 20 20  rror(a,b,c)     
a4b0: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69  unixLogErrorAtLi
a4c0: 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f  ne(a,b,c,__LINE_
a4d0: 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  _).static int un
a4e0: 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  ixLogErrorAtLine
a4f0: 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c  (.  int errcode,
a500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a510: 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72      /* SQLite er
a520: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  ror code */.  co
a530: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a550: 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63   Name of OS func
a560: 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64  tion that failed
a570: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
a580: 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
a590: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61        /* File pa
a5a0: 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  th associated wi
a5b0: 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e  th error */.  in
a5c0: 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20  t iLine         
a5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a5e0: 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d   Source line num
a5f0: 62 65 72 20 77 68 65 72 65 20 65 72 72 6f 72 20  ber where error 
a600: 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20  occurred */.){. 
a610: 20 63 68 61 72 20 2a 7a 45 72 72 3b 20 20 20 20   char *zErr;    
a620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a630: 20 2f 2a 20 4d 65 73 73 61 67 65 20 66 72 6f 6d   /* Message from
a640: 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72 20 65   strerror() or e
a650: 71 75 69 76 61 6c 65 6e 74 20 2a 2f 0a 20 20 69  quivalent */.  i
a660: 6e 74 20 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt iErrno = errn
a670: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  o;             /
a680: 2a 20 53 61 76 65 64 20 73 79 73 63 61 6c 6c 20  * Saved syscall 
a690: 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a  error number */.
a6a0: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
a6b0: 20 6e 6f 74 20 61 20 74 68 72 65 61 64 73 61 66   not a threadsaf
a6c0: 65 20 62 75 69 6c 64 20 28 53 51 4c 49 54 45 5f  e build (SQLITE_
a6d0: 54 48 52 45 41 44 53 41 46 45 3d 3d 30 29 2c 20  THREADSAFE==0), 
a6e0: 74 68 65 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68  then use.  ** th
a6f0: 65 20 73 74 72 65 72 72 6f 72 28 29 20 66 75 6e  e strerror() fun
a700: 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20  ction to obtain 
a710: 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  the human-readab
a720: 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  le error message
a730: 0a 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74  .  ** equivalent
a740: 20 74 6f 20 65 72 72 6e 6f 2e 20 4f 74 68 65 72   to errno. Other
a750: 77 69 73 65 2c 20 75 73 65 20 73 74 72 65 72 72  wise, use strerr
a760: 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a 23 69  or_r()..  */ .#i
a770: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
a780: 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 48  AFE && defined(H
a790: 41 56 45 5f 53 54 52 45 52 52 4f 52 5f 52 29 0a  AVE_STRERROR_R).
a7a0: 20 20 63 68 61 72 20 61 45 72 72 5b 38 30 5d 3b    char aErr[80];
a7b0: 0a 20 20 6d 65 6d 73 65 74 28 61 45 72 72 2c 20  .  memset(aErr, 
a7c0: 30 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29 29  0, sizeof(aErr))
a7d0: 3b 0a 20 20 7a 45 72 72 20 3d 20 61 45 72 72 3b  ;.  zErr = aErr;
a7e0: 0a 0a 20 20 2f 2a 20 49 66 20 53 54 52 45 52 52  ..  /* If STRERR
a7f0: 4f 52 5f 52 5f 43 48 41 52 5f 50 20 28 73 65 74  OR_R_CHAR_P (set
a800: 20 62 79 20 61 75 74 6f 63 6f 6e 66 20 73 63 72   by autoconf scr
a810: 69 70 74 73 29 20 6f 72 20 5f 5f 55 53 45 5f 47  ipts) or __USE_G
a820: 4e 55 20 69 73 20 64 65 66 69 6e 65 64 2c 0a 20  NU is defined,. 
a830: 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20   ** assume that 
a840: 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69  the system provi
a850: 64 65 73 20 74 68 65 20 47 4e 55 20 76 65 72 73  des the GNU vers
a860: 69 6f 6e 20 6f 66 20 73 74 72 65 72 72 6f 72 5f  ion of strerror_
a870: 72 28 29 20 74 68 61 74 0a 20 20 2a 2a 20 72 65  r() that.  ** re
a880: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
a890: 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
a8a0: 61 69 6e 69 6e 67 20 74 68 65 20 65 72 72 6f 72  aining the error
a8b0: 20 6d 65 73 73 61 67 65 2e 20 54 68 61 74 20 70   message. That p
a8c0: 6f 69 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 61 79  ointer .  ** may
a8d0: 20 70 6f 69 6e 74 20 74 6f 20 61 45 72 72 5b 5d   point to aErr[]
a8e0: 2c 20 6f 72 20 69 74 20 6d 61 79 20 70 6f 69 6e  , or it may poin
a8f0: 74 20 74 6f 20 73 6f 6d 65 20 73 74 61 74 69 63  t to some static
a900: 20 73 74 6f 72 61 67 65 20 73 6f 6d 65 77 68 65   storage somewhe
a910: 72 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77  re. .  ** Otherw
a920: 69 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74  ise, assume that
a930: 20 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76   the system prov
a940: 69 64 65 73 20 74 68 65 20 50 4f 53 49 58 20 76  ides the POSIX v
a950: 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20  ersion of .  ** 
a960: 73 74 72 65 72 72 6f 72 5f 72 28 29 2c 20 77 68  strerror_r(), wh
a970: 69 63 68 20 61 6c 77 61 79 73 20 77 72 69 74 65  ich always write
a980: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
a990: 67 65 20 69 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a  ge into aErr[]..
a9a0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
a9b0: 20 63 6f 64 65 20 69 6e 63 6f 72 72 65 63 74 6c   code incorrectl
a9c0: 79 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69  y assumes that i
a9d0: 74 20 69 73 20 74 68 65 20 50 4f 53 49 58 20 76  t is the POSIX v
a9e0: 65 72 73 69 6f 6e 20 74 68 61 74 20 69 73 0a 20  ersion that is. 
a9f0: 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2c 20 74   ** available, t
aa00: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
aa10: 20 77 69 6c 6c 20 6f 66 74 65 6e 20 62 65 20 61   will often be a
aa20: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20  n empty string. 
aa30: 4e 6f 74 20 61 0a 20 20 2a 2a 20 68 75 67 65 20  Not a.  ** huge 
aa40: 70 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f 72 72 65  problem. Incorre
aa50: 63 74 6c 79 20 63 6f 6e 63 6c 75 64 69 6e 67 20  ctly concluding 
aa60: 74 68 61 74 20 74 68 65 20 47 4e 55 20 76 65 72  that the GNU ver
aa70: 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c  sion is availabl
aa80: 65 20 0a 20 20 2a 2a 20 63 6f 75 6c 64 20 6c 65  e .  ** could le
aa90: 61 64 20 74 6f 20 61 20 73 65 67 66 61 75 6c 74  ad to a segfault
aaa0: 20 74 68 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23 69   though..  */.#i
aab0: 66 20 64 65 66 69 6e 65 64 28 53 54 52 45 52 52  f defined(STRERR
aac0: 4f 52 5f 52 5f 43 48 41 52 5f 50 29 20 7c 7c 20  OR_R_CHAR_P) || 
aad0: 64 65 66 69 6e 65 64 28 5f 5f 55 53 45 5f 47 4e  defined(__USE_GN
aae0: 55 29 0a 20 20 7a 45 72 72 20 3d 20 0a 23 20 65  U).  zErr = .# e
aaf0: 6e 64 69 66 0a 20 20 73 74 72 65 72 72 6f 72 5f  ndif.  strerror_
ab00: 72 28 69 45 72 72 6e 6f 2c 20 61 45 72 72 2c 20  r(iErrno, aErr, 
ab10: 73 69 7a 65 6f 66 28 61 45 72 72 29 2d 31 29 3b  sizeof(aErr)-1);
ab20: 0a 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 54  ..#elif SQLITE_T
ab30: 48 52 45 41 44 53 41 46 45 0a 20 20 2f 2a 20 54  HREADSAFE.  /* T
ab40: 68 69 73 20 69 73 20 61 20 74 68 72 65 61 64 73  his is a threads
ab50: 61 66 65 20 62 75 69 6c 64 2c 20 62 75 74 20 73  afe build, but s
ab60: 74 72 65 72 72 6f 72 5f 72 28 29 20 69 73 20 6e  trerror_r() is n
ab70: 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 2a 2f  ot available. */
ab80: 0a 20 20 7a 45 72 72 20 3d 20 22 22 3b 0a 23 65  .  zErr = "";.#e
ab90: 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72  lse.  /* Non-thr
aba0: 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 75  eadsafe build, u
abb0: 73 65 20 73 74 72 65 72 72 6f 72 28 29 2e 20 2a  se strerror(). *
abc0: 2f 0a 20 20 7a 45 72 72 20 3d 20 73 74 72 65 72  /.  zErr = strer
abd0: 72 6f 72 28 69 45 72 72 6e 6f 29 3b 0a 23 65 6e  ror(iErrno);.#en
abe0: 64 69 66 0a 0a 20 20 69 66 28 20 7a 50 61 74 68  dif..  if( zPath
abf0: 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22  ==0 ) zPath = ""
ac00: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ;.  sqlite3_log(
ac10: 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20 22  errcode,.      "
ac20: 6f 73 5f 75 6e 69 78 2e 63 3a 25 64 3a 20 28 25  os_unix.c:%d: (%
ac30: 64 29 20 25 73 28 25 73 29 20 2d 20 25 73 22 2c  d) %s(%s) - %s",
ac40: 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20 69 45  .      iLine, iE
ac50: 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61  rrno, zFunc, zPa
ac60: 74 68 2c 20 7a 45 72 72 0a 20 20 29 3b 0a 0a 20  th, zErr.  );.. 
ac70: 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b   return errcode;
ac80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
ac90: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
aca0: 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75  r..**.** We assu
acb0: 6d 65 20 74 68 61 74 20 63 6c 6f 73 65 28 29 20  me that close() 
acc0: 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 77 6f  almost always wo
acd0: 72 6b 73 2c 20 73 69 6e 63 65 20 69 74 20 69 73  rks, since it is
ace0: 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a 20 76 65   only in a.** ve
acf0: 72 79 20 73 69 63 6b 20 61 70 70 6c 69 63 61 74  ry sick applicat
ad00: 69 6f 6e 20 6f 72 20 6f 6e 20 61 20 76 65 72 79  ion or on a very
ad10: 20 73 69 63 6b 20 70 6c 61 74 66 6f 72 6d 20 74   sick platform t
ad20: 68 61 74 20 69 74 20 6d 69 67 68 74 20 66 61 69  hat it might fai
ad30: 6c 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73  l..** If it does
ad40: 20 66 61 69 6c 2c 20 73 69 6d 70 6c 79 20 6c 65   fail, simply le
ad50: 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ak the file desc
ad60: 72 69 70 74 6f 72 2c 20 62 75 74 20 64 6f 20 6c  riptor, but do l
ad70: 6f 67 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 2e  og the.** error.
ad80: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
ad90: 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   it is not safe 
ada0: 74 6f 20 72 65 74 72 79 20 63 6c 6f 73 65 28 29  to retry close()
adb0: 20 61 66 74 65 72 20 45 49 4e 54 52 20 73 69 6e   after EINTR sin
adc0: 63 65 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64  ce the.** file d
add0: 65 73 63 72 69 70 74 6f 72 20 6d 69 67 68 74 20  escriptor might 
ade0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
adf0: 6e 20 72 65 75 73 65 64 20 62 79 20 61 6e 6f 74  n reused by anot
ae00: 68 65 72 20 74 68 72 65 61 64 2e 0a 2a 2a 20 53  her thread..** S
ae10: 6f 20 77 65 20 64 6f 6e 27 74 20 65 76 65 6e 20  o we don't even 
ae20: 74 72 79 20 74 6f 20 72 65 63 6f 76 65 72 20 66  try to recover f
ae30: 72 6f 6d 20 61 6e 20 45 49 4e 54 52 2e 20 20 4a  rom an EINTR.  J
ae40: 75 73 74 20 6c 6f 67 20 74 68 65 20 65 72 72 6f  ust log the erro
ae50: 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65 20 6f 6e  r.** and move on
ae60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ae70: 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 75 6e   robust_close(un
ae80: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  ixFile *pFile, i
ae90: 6e 74 20 68 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f  nt h, int lineno
aea0: 29 7b 0a 20 20 69 66 28 20 6f 73 43 6c 6f 73 65  ){.  if( osClose
aeb0: 28 68 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c  (h) ){.    unixL
aec0: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 53 51  ogErrorAtLine(SQ
aed0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
aee0: 2c 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20 20  , "close",.     
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af00: 20 20 70 46 69 6c 65 20 3f 20 70 46 69 6c 65 2d    pFile ? pFile-
af10: 3e 7a 50 61 74 68 20 3a 20 30 2c 20 6c 69 6e 65  >zPath : 0, line
af20: 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  no);.  }.}../*.*
af30: 2a 20 53 65 74 20 74 68 65 20 70 46 69 6c 65 2d  * Set the pFile-
af40: 3e 6c 61 73 74 45 72 72 6e 6f 2e 20 20 44 6f 20  >lastErrno.  Do 
af50: 74 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75  this in a subrou
af60: 74 69 6e 65 20 61 73 20 74 68 61 74 20 70 72 6f  tine as that pro
af70: 76 69 64 65 73 0a 2a 2a 20 61 20 63 6f 6e 76 65  vides.** a conve
af80: 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20 73  nient place to s
af90: 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 2e  et a breakpoint.
afa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
afb0: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 75  storeLastErrno(u
afc0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
afd0: 69 6e 74 20 65 72 72 6f 72 29 7b 0a 20 20 70 46  int error){.  pF
afe0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
aff0: 20 65 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   error;.}../*.**
b000: 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20   Close all file 
b010: 64 65 73 63 72 69 70 74 6f 72 73 20 61 63 63 75  descriptors accu
b020: 6d 75 61 74 65 64 20 69 6e 20 74 68 65 20 75 6e  muated in the un
b030: 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e  ixInodeInfo->pUn
b040: 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73  used list..*/ .s
b050: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
b060: 50 65 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46  PendingFds(unixF
b070: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75  ile *pFile){.  u
b080: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
b090: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
b0a0: 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73  node;.  UnixUnus
b0b0: 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55  edFd *p;.  UnixU
b0c0: 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a  nusedFd *pNext;.
b0d0: 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 46 69    assert( unixFi
b0e0: 6c 65 4d 75 74 65 78 48 65 6c 64 28 70 46 69 6c  leMutexHeld(pFil
b0f0: 65 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 49  e) );.  for(p=pI
b100: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70  node->pUnused; p
b110: 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  ; p=pNext){.    
b120: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
b130: 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f  ;.    robust_clo
b140: 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c  se(pFile, p->fd,
b150: 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
b160: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
b170: 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70  .  }.  pInode->p
b180: 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f  Unused = 0;.}../
b190: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75  *.** Release a u
b1a0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72  nixInodeInfo str
b1b0: 75 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c  ucture previousl
b1c0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66  y allocated by f
b1d0: 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a  indInodeInfo()..
b1e0: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  **.** The mutex 
b1f0: 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68  entered using th
b200: 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  e unixEnterMutex
b210: 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  () function must
b220: 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e   be held.** when
b230: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
b240: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
b250: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
b260: 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46 69  InodeInfo(unixFi
b270: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e  le *pFile){.  un
b280: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
b290: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
b2a0: 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75  ode;.  assert( u
b2b0: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
b2c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ;.  assert( unix
b2d0: 46 69 6c 65 4d 75 74 65 78 4e 6f 74 68 65 6c 64  FileMutexNotheld
b2e0: 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 69 66 28  (pFile) );.  if(
b2f0: 20 41 4c 57 41 59 53 28 70 49 6e 6f 64 65 29 20   ALWAYS(pInode) 
b300: 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  ){.    pInode->n
b310: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
b320: 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  Inode->nRef==0 )
b330: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
b340: 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
b350: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
b360: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
b370: 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75  (pInode->pLockMu
b380: 74 65 78 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73  tex);.      clos
b390: 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
b3a0: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
b3b0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 49  3_mutex_leave(pI
b3c0: 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78  node->pLockMutex
b3d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  );.      if( pIn
b3e0: 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ode->pPrev ){.  
b3f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
b400: 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  node->pPrev->pNe
b410: 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  xt==pInode );.  
b420: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50        pInode->pP
b430: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e  rev->pNext = pIn
b440: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ode->pNext;.    
b450: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b460: 20 61 73 73 65 72 74 28 20 69 6e 6f 64 65 4c 69   assert( inodeLi
b470: 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  st==pInode );.  
b480: 20 20 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20        inodeList 
b490: 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
b4a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
b4b0: 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74  f( pInode->pNext
b4c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
b4d0: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  rt( pInode->pNex
b4e0: 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65  t->pPrev==pInode
b4f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   );.        pIno
b500: 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  de->pNext->pPrev
b510: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76   = pInode->pPrev
b520: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b530: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
b540: 65 65 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b  ee(pInode->pLock
b550: 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 73 71  Mutex);.      sq
b560: 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e 6f 64  lite3_free(pInod
b570: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
b580: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66  ./*.** Given a f
b590: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20  ile descriptor, 
b5a0: 6c 6f 63 61 74 65 20 74 68 65 20 75 6e 69 78 49  locate the unixI
b5b0: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
b5c0: 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65  that.** describe
b5d0: 73 20 74 68 61 74 20 66 69 6c 65 20 64 65 73 63  s that file desc
b5e0: 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20  riptor.  Create 
b5f0: 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
b600: 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20  essary.  The.** 
b610: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6d 69 67  return value mig
b620: 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69  ht be uninitiali
b630: 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20  zed if an error 
b640: 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  occurs..**.** Th
b650: 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20  e mutex entered 
b660: 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e  using the unixEn
b670: 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74  terMutex() funct
b680: 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ion must be held
b690: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75  .** when this fu
b6a0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
b6b0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
b6c0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
b6d0: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
b6e0: 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64  tic int findInod
b6f0: 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c  eInfo(.  unixFil
b700: 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
b710: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20          /* Unix 
b720: 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65 20 64  file with file d
b730: 65 73 63 20 75 73 65 64 20 69 6e 20 74 68 65 20  esc used in the 
b740: 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  key */.  unixIno
b750: 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65  deInfo **ppInode
b760: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
b770: 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  n the unixInodeI
b780: 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65 72 65 20  nfo object here 
b790: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
b7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7b0: 20 20 20 20 20 20 20 2f 2a 20 53 79 73 74 65 6d         /* System
b7c0: 20 63 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64   call return cod
b7d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20  e */.  int fd;  
b7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
b800: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
b810: 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75   pFile */.  stru
b820: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69  ct unixFileId fi
b830: 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  leId;      /* Lo
b840: 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65  okup key for the
b850: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
b860: 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  /.  struct stat 
b870: 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20 20  statbuf;        
b880: 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20     /* Low-level 
b890: 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  file information
b8a0: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
b8b0: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b  nfo *pInode = 0;
b8c0: 20 20 20 20 20 2f 2a 20 43 61 6e 64 69 64 61 74       /* Candidat
b8d0: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
b8e0: 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73  object */..  ass
b8f0: 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
b900: 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65  ld() );..  /* Ge
b910: 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f  t low-level info
b920: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
b930: 65 20 66 69 6c 65 20 74 68 61 74 20 77 65 20 63  e file that we c
b940: 61 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20  an used to.  ** 
b950: 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 20  create a unique 
b960: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 66 69 6c  name for the fil
b970: 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70  e..  */.  fd = p
b980: 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20  File->h;.  rc = 
b990: 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61  osFstat(fd, &sta
b9a0: 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21  tbuf);.  if( rc!
b9b0: 3d 30 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c  =0 ){.    storeL
b9c0: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
b9d0: 65 72 72 6e 6f 29 3b 0a 23 69 66 20 64 65 66 69  errno);.#if defi
b9e0: 6e 65 64 28 45 4f 56 45 52 46 4c 4f 57 29 20 26  ned(EOVERFLOW) &
b9f0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
ba00: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 29 0a 20 20  _DISABLE_LFS).  
ba10: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73    if( pFile->las
ba20: 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f  tErrno==EOVERFLO
ba30: 57 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  W ) return SQLIT
ba40: 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a  E_NOLFS;.#endif.
ba50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ba60: 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23 69  E_IOERR;.  }..#i
ba70: 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20  fdef __APPLE__. 
ba80: 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61   /* On OS X on a
ba90: 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74  n msdos filesyst
baa0: 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e 75  em, the inode nu
bab0: 6d 62 65 72 20 69 73 20 72 65 70 6f 72 74 65 64  mber is reported
bac0: 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c  .  ** incorrectl
bad0: 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20  y for zero-size 
bae0: 66 69 6c 65 73 2e 20 20 53 65 65 20 74 69 63 6b  files.  See tick
baf0: 65 74 20 23 33 32 36 30 2e 20 20 54 6f 20 77 6f  et #3260.  To wo
bb00: 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74  rk.  ** around t
bb10: 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 77 65 20  his problem (we 
bb20: 63 6f 6e 73 69 64 65 72 20 69 74 20 61 20 62 75  consider it a bu
bb30: 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53  g in OS X, not S
bb40: 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65 20 61  QLite).  ** we a
bb50: 6c 77 61 79 73 20 69 6e 63 72 65 61 73 65 20 74  lways increase t
bb60: 68 65 20 66 69 6c 65 20 73 69 7a 65 20 74 6f 20  he file size to 
bb70: 31 20 62 79 20 77 72 69 74 69 6e 67 20 61 20 73  1 by writing a s
bb80: 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20  ingle byte.  ** 
bb90: 70 72 69 6f 72 20 74 6f 20 61 63 63 65 73 73 69  prior to accessi
bba0: 6e 67 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d  ng the inode num
bbb0: 62 65 72 2e 20 20 54 68 65 20 6f 6e 65 20 62 79  ber.  The one by
bbc0: 74 65 20 77 72 69 74 74 65 6e 20 69 73 0a 20 20  te written is.  
bbd0: 2a 2a 20 61 6e 20 41 53 43 49 49 20 27 53 27 20  ** an ASCII 'S' 
bbe0: 63 68 61 72 61 63 74 65 72 20 77 68 69 63 68 20  character which 
bbf0: 61 6c 73 6f 20 68 61 70 70 65 6e 73 20 74 6f 20  also happens to 
bc00: 62 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74  be the first byt
bc10: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 68 65  e.  ** in the he
bc20: 61 64 65 72 20 6f 66 20 65 76 65 72 79 20 53 51  ader of every SQ
bc30: 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20  Lite database.  
bc40: 49 6e 20 74 68 69 73 20 77 61 79 2c 20 69 66 20  In this way, if 
bc50: 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 61 20  there.  ** is a 
bc60: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73  race condition s
bc70: 75 63 68 20 74 68 61 74 20 61 6e 6f 74 68 65 72  uch that another
bc80: 20 74 68 72 65 61 64 20 68 61 73 20 61 6c 72 65   thread has alre
bc90: 61 64 79 20 70 6f 70 75 6c 61 74 65 64 0a 20 20  ady populated.  
bca0: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ** the first pag
bcb0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
bcc0: 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69 73 20  e, no damage is 
bcd0: 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  done..  */.  if(
bce0: 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65   statbuf.st_size
bcf0: 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 66  ==0 && (pFile->f
bd00: 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
bd10: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
bd20: 29 21 3d 30 20 29 7b 0a 20 20 20 20 64 6f 7b 20  )!=0 ){.    do{ 
bd30: 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c  rc = osWrite(fd,
bd40: 20 22 53 22 2c 20 31 29 3b 20 7d 77 68 69 6c 65   "S", 1); }while
bd50: 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
bd60: 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 69 66  =EINTR );.    if
bd70: 28 20 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20  ( rc!=1 ){.     
bd80: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
bd90: 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
bda0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
bdb0: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a  TE_IOERR;.    }.
bdc0: 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74      rc = osFstat
bdd0: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a  (fd, &statbuf);.
bde0: 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
bdf0: 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
be00: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
be10: 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  no);.      retur
be20: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
be30: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
be40: 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69 6c 65  ..  memset(&file
be50: 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 69  Id, 0, sizeof(fi
be60: 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c 65 49 64  leId));.  fileId
be70: 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73  .dev = statbuf.s
be80: 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f 56 58  t_dev;.#if OS_VX
be90: 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49 64 2e 70  WORKS.  fileId.p
bea0: 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64 3b  Id = pFile->pId;
beb0: 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65 49 64 2e  .#else.  fileId.
bec0: 69 6e 6f 20 3d 20 28 75 36 34 29 73 74 61 74 62  ino = (u64)statb
bed0: 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69  uf.st_ino;.#endi
bee0: 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f  f.  pInode = ino
bef0: 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28  deList;.  while(
bf00: 20 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d   pInode && memcm
bf10: 70 28 26 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f  p(&fileId, &pIno
bf20: 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65  de->fileId, size
bf30: 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a 20  of(fileId)) ){. 
bf40: 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f     pInode = pIno
bf50: 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  de->pNext;.  }. 
bf60: 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29   if( pInode==0 )
bf70: 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 73  {.    pInode = s
bf80: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
bf90: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29   sizeof(*pInode)
bfa0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   );.    if( pIno
bfb0: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  de==0 ){.      r
bfc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
bfd0: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
bfe0: 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65     memset(pInode
bff0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e  , 0, sizeof(*pIn
c000: 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70  ode));.    memcp
c010: 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  y(&pInode->fileI
c020: 64 2c 20 26 66 69 6c 65 49 64 2c 20 73 69 7a 65  d, &fileId, size
c030: 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 20  of(fileId));.   
c040: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
c050: 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
c060: 74 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  tex ){.      pIn
c070: 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 20  ode->pLockMutex 
c080: 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
c090: 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
c0a0: 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20  EX_FAST);.      
c0b0: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63  if( pInode->pLoc
c0c0: 6b 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  kMutex==0 ){.   
c0d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
c0e0: 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20  e(pInode);.     
c0f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c100: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
c110: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
c120: 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b  Inode->nRef = 1;
c130: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  .    pInode->pNe
c140: 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a  xt = inodeList;.
c150: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65      pInode->pPre
c160: 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69  v = 0;.    if( i
c170: 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65  nodeList ) inode
c180: 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49  List->pPrev = pI
c190: 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c  node;.    inodeL
c1a0: 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20  ist = pInode;.  
c1b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64  }else{.    pInod
c1c0: 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  e->nRef++;.  }. 
c1d0: 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f   *ppInode = pIno
c1e0: 64 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  de;.  return SQL
c1f0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
c200: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
c210: 70 46 69 6c 65 20 68 61 73 20 62 65 65 6e 20 72  pFile has been r
c220: 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b  enamed or unlink
c230: 65 64 20 73 69 6e 63 65 20 69 74 20 77 61 73 20  ed since it was 
c240: 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 0a 2a 2f  first opened..*/
c250: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
c260: 48 61 73 4d 6f 76 65 64 28 75 6e 69 78 46 69 6c  HasMoved(unixFil
c270: 65 20 2a 70 46 69 6c 65 29 7b 0a 23 69 66 20 4f  e *pFile){.#if O
c280: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65 74 75  S_VXWORKS.  retu
c290: 72 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  rn pFile->pInode
c2a0: 21 3d 30 20 26 26 20 70 46 69 6c 65 2d 3e 70 49  !=0 && pFile->pI
c2b0: 64 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  d!=pFile->pInode
c2c0: 2d 3e 66 69 6c 65 49 64 2e 70 49 64 3b 0a 23 65  ->fileId.pId;.#e
c2d0: 6c 73 65 0a 20 20 73 74 72 75 63 74 20 73 74 61  lse.  struct sta
c2e0: 74 20 62 75 66 3b 0a 20 20 72 65 74 75 72 6e 20  t buf;.  return 
c2f0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30  pFile->pInode!=0
c300: 20 26 26 0a 20 20 20 20 20 20 28 6f 73 53 74 61   &&.      (osSta
c310: 74 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20  t(pFile->zPath, 
c320: 26 62 75 66 29 21 3d 30 20 0a 20 20 20 20 20 20  &buf)!=0 .      
c330: 20 20 20 7c 7c 20 28 75 36 34 29 62 75 66 2e 73     || (u64)buf.s
c340: 74 5f 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70 49  t_ino!=pFile->pI
c350: 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f  node->fileId.ino
c360: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  );.#endif.}.../*
c370: 0a 2a 2a 20 43 68 65 63 6b 20 61 20 75 6e 69 78  .** Check a unix
c380: 46 69 6c 65 20 74 68 61 74 20 69 73 20 61 20 64  File that is a d
c390: 61 74 61 62 61 73 65 2e 20 20 56 65 72 69 66 79  atabase.  Verify
c3a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
c3b0: 2a 2a 0a 2a 2a 20 28 31 29 20 54 68 65 72 65 20  **.** (1) There 
c3c0: 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 68  is exactly one h
c3d0: 61 72 64 20 6c 69 6e 6b 20 6f 6e 20 74 68 65 20  ard link on the 
c3e0: 66 69 6c 65 0a 2a 2a 20 28 32 29 20 54 68 65 20  file.** (2) The 
c3f0: 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 73 79  file is not a sy
c400: 6d 62 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20 28  mbolic link.** (
c410: 33 29 20 54 68 65 20 66 69 6c 65 20 68 61 73 20  3) The file has 
c420: 6e 6f 74 20 62 65 65 6e 20 72 65 6e 61 6d 65 64  not been renamed
c430: 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 0a   or unlinked.**.
c440: 2a 2a 20 49 73 73 75 65 20 73 71 6c 69 74 65 33  ** Issue sqlite3
c450: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e  _log(SQLITE_WARN
c460: 49 4e 47 2c 2e 2e 2e 29 20 6d 65 73 73 61 67 65  ING,...) message
c470: 73 20 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73  s if anything is
c480: 20 6e 6f 74 20 72 69 67 68 74 2e 0a 2a 2f 0a 73   not right..*/.s
c490: 74 61 74 69 63 20 76 6f 69 64 20 76 65 72 69 66  tatic void verif
c4a0: 79 44 62 46 69 6c 65 28 75 6e 69 78 46 69 6c 65  yDbFile(unixFile
c4b0: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 73 74 72 75   *pFile){.  stru
c4c0: 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 69  ct stat buf;.  i
c4d0: 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65  nt rc;..  /* The
c4e0: 73 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73  se verifications
c4f0: 20 6f 63 63 75 72 73 20 66 6f 72 20 74 68 65 20   occurs for the 
c500: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 6f 6e  main database on
c510: 6c 79 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ly */.  if( pFil
c520: 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
c530: 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29  NIXFILE_NOLOCK )
c540: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 72 63 20 3d   return;..  rc =
c550: 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e   osFstat(pFile->
c560: 68 2c 20 26 62 75 66 29 3b 0a 20 20 69 66 28 20  h, &buf);.  if( 
c570: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  rc!=0 ){.    sql
c580: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
c590: 57 41 52 4e 49 4e 47 2c 20 22 63 61 6e 6e 6f 74  WARNING, "cannot
c5a0: 20 66 73 74 61 74 20 64 62 20 66 69 6c 65 20 25   fstat db file %
c5b0: 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  s", pFile->zPath
c5c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
c5d0: 20 7d 0a 20 20 69 66 28 20 62 75 66 2e 73 74 5f   }.  if( buf.st_
c5e0: 6e 6c 69 6e 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  nlink==0 ){.    
c5f0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
c600: 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c  TE_WARNING, "fil
c610: 65 20 75 6e 6c 69 6e 6b 65 64 20 77 68 69 6c 65  e unlinked while
c620: 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c   open: %s", pFil
c630: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72  e->zPath);.    r
c640: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
c650: 20 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3e 31 20   buf.st_nlink>1 
c660: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
c670: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
c680: 47 2c 20 22 6d 75 6c 74 69 70 6c 65 20 6c 69 6e  G, "multiple lin
c690: 6b 73 20 74 6f 20 66 69 6c 65 3a 20 25 73 22 2c  ks to file: %s",
c6a0: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
c6b0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
c6c0: 20 20 69 66 28 20 66 69 6c 65 48 61 73 4d 6f 76    if( fileHasMov
c6d0: 65 64 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  ed(pFile) ){.   
c6e0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
c6f0: 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69  ITE_WARNING, "fi
c700: 6c 65 20 72 65 6e 61 6d 65 64 20 77 68 69 6c 65  le renamed while
c710: 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c   open: %s", pFil
c720: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72  e->zPath);.    r
c730: 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  eturn;.  }.}.../
c740: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
c750: 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
c760: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
c770: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
c780: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
c790: 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
c7a0: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
c7b0: 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
c7c0: 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
c7d0: 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
c7e0: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
c7f0: 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
c800: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
c810: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
c820: 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
c830: 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
c840: 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
c850: 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
c860: 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
c870: 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63  tic int unixChec
c880: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
c890: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
c8a0: 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
c8b0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c8c0: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
c8d0: 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
c8e0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
c8f0: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
c900: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
c910: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
c920: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
c930: 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73  DLOCK; );..  ass
c940: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
c950: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
c960: 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
c970: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 73 71 6c 69 74  _LOCK );.  sqlit
c980: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
c990: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 4c  File->pInode->pL
c9a0: 6f 63 6b 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  ockMutex);..  /*
c9b0: 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
c9c0: 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
c9d0: 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
c9e0: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
c9f0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
ca00: 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
ca10: 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76  CK ){.    reserv
ca20: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  ed = 1;.  }..  /
ca30: 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
ca40: 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
ca50: 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a  ocess holds it..
ca60: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44    */.#ifndef __D
ca70: 4a 47 50 50 5f 5f 0a 20 20 69 66 28 20 21 72 65  JGPP__.  if( !re
ca80: 73 65 72 76 65 64 20 26 26 20 21 70 46 69 6c 65  served && !pFile
ca90: 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
caa0: 73 73 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74  ssLock ){.    st
cab0: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
cac0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  .    lock.l_when
cad0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
cae0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
caf0: 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b  = RESERVED_BYTE;
cb00: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
cb10: 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  = 1;.    lock.l_
cb20: 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a  type = F_WRLCK;.
cb30: 20 20 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28      if( osFcntl(
cb40: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c  pFile->h, F_GETL
cb50: 4b 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  K, &lock) ){.   
cb60: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
cb70: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
cb80: 45 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74  EDLOCK;.      st
cb90: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
cba0: 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
cbb0: 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e  } else if( lock.
cbc0: 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20  l_type!=F_UNLCK 
cbd0: 29 7b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65  ){.      reserve
cbe0: 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 1;.    }.  }
cbf0: 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 73 71 6c  .#endif.  .  sql
cc00: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
cc10: 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e  (pFile->pInode->
cc20: 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20 4f  pLockMutex);.  O
cc30: 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
cc40: 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
cc50: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
cc60: 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
cc70: 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20  ));..  *pResOut 
cc80: 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
cc90: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
cca0: 2a 20 53 65 74 20 61 20 70 6f 73 69 78 2d 61 64  * Set a posix-ad
ccb0: 76 69 73 6f 72 79 2d 6c 6f 63 6b 2e 0a 2a 2a 0a  visory-lock..**.
ccc0: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  ** There are two
ccd0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69   versions of thi
cce0: 73 20 72 6f 75 74 69 6e 65 2e 20 20 49 66 20 63  s routine.  If c
ccf0: 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a 2a 2a 20  ompiled with.** 
cd00: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
cd10: 54 4c 4b 5f 54 49 4d 45 4f 55 54 20 74 68 65 6e  TLK_TIMEOUT then
cd20: 20 74 68 65 20 72 6f 75 74 69 6e 65 20 68 61 73   the routine has
cd30: 20 61 6e 20 65 78 74 72 61 20 70 61 72 61 6d 65   an extra parame
cd40: 74 65 72 0a 2a 2a 20 77 68 69 63 68 20 69 73 20  ter.** which is 
cd50: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 75  a pointer to a u
cd60: 6e 69 78 46 69 6c 65 2e 20 20 49 66 20 74 68 65  nixFile.  If the
cd70: 20 75 6e 69 78 46 69 6c 65 2d 3e 69 42 75 73 79   unixFile->iBusy
cd80: 54 69 6d 65 6f 75 74 0a 2a 2a 20 76 61 6c 75 65  Timeout.** value
cd90: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 69 74   is set, then it
cda0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
cdb0: 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 74  f milliseconds t
cdc0: 6f 20 77 61 69 74 20 62 65 66 6f 72 65 0a 2a 2a  o wait before.**
cdd0: 20 66 61 69 6c 69 6e 67 20 74 68 65 20 6c 6f 63   failing the loc
cde0: 6b 2e 20 20 54 68 65 20 69 42 75 73 79 54 69 6d  k.  The iBusyTim
cdf0: 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20 61 6c  eout value is al
ce00: 77 61 79 73 20 72 65 73 65 74 20 62 61 63 6b 20  ways reset back 
ce10: 74 6f 0a 2a 2a 20 7a 65 72 6f 20 6f 6e 20 65 61  to.** zero on ea
ce20: 63 68 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  ch call..**.** I
ce30: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
ce40: 53 45 54 4c 4b 5f 54 49 4d 45 4f 55 54 20 69 73  SETLK_TIMEOUT is
ce50: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 74 68   not defined, th
ce60: 65 6e 20 64 6f 20 61 20 6e 6f 6e 2d 62 6c 6f 63  en do a non-bloc
ce70: 6b 69 6e 67 0a 2a 2a 20 61 74 74 65 6d 70 74 20  king.** attempt 
ce80: 74 6f 20 73 65 74 20 74 68 65 20 6c 6f 63 6b 2e  to set the lock.
ce90: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
cea0: 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c 4b 5f  TE_ENABLE_SETLK_
ceb0: 54 49 4d 45 4f 55 54 0a 23 20 64 65 66 69 6e 65  TIMEOUT.# define
cec0: 20 6f 73 53 65 74 50 6f 73 69 78 41 64 76 69 73   osSetPosixAdvis
ced0: 6f 72 79 4c 6f 63 6b 28 68 2c 78 2c 74 29 20 6f  oryLock(h,x,t) o
cee0: 73 46 63 6e 74 6c 28 68 2c 46 5f 53 45 54 4c 4b  sFcntl(h,F_SETLK
cef0: 2c 78 29 0a 23 65 6c 73 65 0a 73 74 61 74 69 63  ,x).#else.static
cf00: 20 69 6e 74 20 6f 73 53 65 74 50 6f 73 69 78 41   int osSetPosixA
cf10: 64 76 69 73 6f 72 79 4c 6f 63 6b 28 0a 20 20 69  dvisoryLock(.  i
cf20: 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20  nt h,           
cf30: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
cf40: 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 77   descriptor on w
cf50: 68 69 63 68 20 74 6f 20 74 61 6b 65 20 74 68 65  hich to take the
cf60: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63   lock */.  struc
cf70: 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 2c 20  t flock *pLock, 
cf80: 20 2f 2a 20 54 68 65 20 64 65 73 63 72 69 70 74   /* The descript
cf90: 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  ion of the lock 
cfa0: 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
cfb0: 46 69 6c 65 20 20 20 20 20 20 20 2f 2a 20 53 74  File       /* St
cfc0: 72 75 63 74 75 72 65 20 68 6f 6c 64 69 6e 67 20  ructure holding 
cfd0: 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2a 2f  timeout value */
cfe0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 6f  .){.  int rc = o
cff0: 73 46 63 6e 74 6c 28 68 2c 46 5f 53 45 54 4c 4b  sFcntl(h,F_SETLK
d000: 2c 70 4c 6f 63 6b 29 3b 0a 20 20 77 68 69 6c 65  ,pLock);.  while
d010: 28 20 72 63 3c 30 20 26 26 20 70 46 69 6c 65 2d  ( rc<0 && pFile-
d020: 3e 69 42 75 73 79 54 69 6d 65 6f 75 74 3e 30 20  >iBusyTimeout>0 
d030: 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 20 73 79 73  ){.    /* On sys
d040: 74 65 6d 73 20 74 68 61 74 20 73 75 70 70 6f 72  tems that suppor
d050: 74 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 62  t some kind of b
d060: 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 20 6c 6f 63  locking file loc
d070: 6b 20 77 69 74 68 20 61 20 74 69 6d 65 6f 75 74  k with a timeout
d080: 2c 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 61 70  ,.    ** make ap
d090: 70 72 6f 70 72 69 61 74 65 20 63 68 61 6e 67 65  propriate change
d0a0: 73 20 68 65 72 65 20 74 6f 20 69 6e 76 6f 6b 65  s here to invoke
d0b0: 20 74 68 61 74 20 62 6c 6f 63 6b 69 6e 67 20 66   that blocking f
d0c0: 69 6c 65 20 6c 6f 63 6b 2e 20 20 4f 6e 0a 20 20  ile lock.  On.  
d0d0: 20 20 2a 2a 20 67 65 6e 65 72 69 63 20 70 6f 73    ** generic pos
d0e0: 69 78 2c 20 68 6f 77 65 76 65 72 2c 20 74 68 65  ix, however, the
d0f0: 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 41 50  re is no such AP
d100: 49 2e 20 20 53 6f 20 77 65 20 73 69 6d 70 6c 79  I.  So we simply
d110: 20 74 72 79 20 74 68 65 0a 20 20 20 20 2a 2a 20   try the.    ** 
d120: 6c 6f 63 6b 20 6f 6e 63 65 20 65 76 65 72 79 20  lock once every 
d130: 6d 69 6c 6c 69 73 65 63 6f 6e 64 20 75 6e 74 69  millisecond unti
d140: 6c 20 65 69 74 68 65 72 20 74 68 65 20 74 69 6d  l either the tim
d150: 65 6f 75 74 20 65 78 70 69 72 65 73 2c 20 6f 72  eout expires, or
d160: 20 75 6e 74 69 6c 0a 20 20 20 20 2a 2a 20 74 68   until.    ** th
d170: 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  e lock is obtain
d180: 65 64 2e 20 2a 2f 0a 20 20 20 20 75 73 6c 65 65  ed. */.    uslee
d190: 70 28 31 30 30 30 29 3b 0a 20 20 20 20 72 63 20  p(1000);.    rc 
d1a0: 3d 20 6f 73 46 63 6e 74 6c 28 68 2c 46 5f 53 45  = osFcntl(h,F_SE
d1b0: 54 4c 4b 2c 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  TLK,pLock);.    
d1c0: 70 46 69 6c 65 2d 3e 69 42 75 73 79 54 69 6d 65  pFile->iBusyTime
d1d0: 6f 75 74 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65 74  out--;.  }.  ret
d1e0: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
d1f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
d200: 45 5f 53 45 54 4c 4b 5f 54 49 4d 45 4f 55 54 20  E_SETLK_TIMEOUT 
d210: 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  */.../*.** Attem
d220: 70 74 20 74 6f 20 73 65 74 20 61 20 73 79 73 74  pt to set a syst
d230: 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  em-lock on the f
d240: 69 6c 65 20 70 46 69 6c 65 2e 20 20 54 68 65 20  ile pFile.  The 
d250: 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73 63  lock is .** desc
d260: 72 69 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e 0a  ribed by pLock..
d270: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 46 69  **.** If the pFi
d280: 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65  le was opened re
d290: 61 64 2f 77 72 69 74 65 20 66 72 6f 6d 20 75 6e  ad/write from un
d2a0: 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74 68  ix-excl, then th
d2b0: 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65  e only lock.** e
d2c0: 76 65 72 20 6f 62 74 61 69 6e 65 64 20 69 73 20  ver obtained is 
d2d0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
d2e0: 6b 2c 20 61 6e 64 20 69 74 20 69 73 20 6f 62 74  k, and it is obt
d2f0: 61 69 6e 65 64 20 65 78 61 63 74 6c 79 20 6f 6e  ained exactly on
d300: 63 65 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  ce.** the first 
d310: 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73  time any lock is
d320: 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41 6c 6c   attempted.  All
d330: 20 73 75 62 73 65 71 75 65 6e 74 20 73 79 73 74   subsequent syst
d340: 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70  em locking.** op
d350: 65 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65 20  erations become 
d360: 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e 67  no-ops.  Locking
d370: 20 6f 70 65 72 61 74 69 6f 6e 73 20 73 74 69 6c   operations stil
d380: 6c 20 68 61 70 70 65 6e 20 69 6e 74 65 72 6e 61  l happen interna
d390: 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72  lly,.** in order
d3a0: 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 61   to coordinate a
d3b0: 63 63 65 73 73 20 62 65 74 77 65 65 6e 20 73 65  ccess between se
d3c0: 70 61 72 61 74 65 20 64 61 74 61 62 61 73 65 20  parate database 
d3d0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 77  connections.** w
d3e0: 69 74 68 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ithin this proce
d3f0: 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20 74  ss, but all of t
d400: 68 61 74 20 69 73 20 68 61 6e 64 6c 65 64 20 69  hat is handled i
d410: 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68 65  n memory and the
d420: 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79  .** operating sy
d430: 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70 61  stem does not pa
d440: 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a  rticipate..**.**
d450: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
d460: 73 20 61 20 70 61 73 73 2d 74 68 72 6f 75 67 68  s a pass-through
d470: 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c   to fcntl(F_SETL
d480: 4b 29 20 69 66 20 70 46 69 6c 65 20 69 73 20 75  K) if pFile is u
d490: 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53 20  sing.** any VFS 
d4a0: 6f 74 68 65 72 20 74 68 61 6e 20 22 75 6e 69 78  other than "unix
d4b0: 2d 65 78 63 6c 22 20 6f 72 20 69 66 20 70 46 69  -excl" or if pFi
d4c0: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20  le is opened on 
d4d0: 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20 61  "unix-excl".** a
d4e0: 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e  nd is read-only.
d4f0: 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72  .**.** Zero is r
d500: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 63  eturned if the c
d510: 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73 75  all completes su
d520: 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20 2d  ccessfully, or -
d530: 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20 74  1 if a call.** t
d540: 6f 20 66 63 6e 74 6c 28 29 20 66 61 69 6c 73 2e  o fcntl() fails.
d550: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 65   In this case, e
d560: 72 72 6e 6f 20 69 73 20 73 65 74 20 61 70 70 72  rrno is set appr
d570: 6f 70 72 69 61 74 65 6c 79 20 28 62 79 20 66 63  opriately (by fc
d580: 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69  ntl())..*/.stati
d590: 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c 6f  c int unixFileLo
d5a0: 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ck(unixFile *pFi
d5b0: 6c 65 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  le, struct flock
d5c0: 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20   *pLock){.  int 
d5d0: 72 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  rc;.  unixInodeI
d5e0: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
d5f0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
d600: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 21 3d 30  ssert( pInode!=0
d610: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
d620: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d630: 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75  (pInode->pLockMu
d640: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 28 70  tex) );.  if( (p
d650: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
d660: 26 20 28 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c  & (UNIXFILE_EXCL
d670: 7c 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59  |UNIXFILE_RDONLY
d680: 29 29 3d 3d 55 4e 49 58 46 49 4c 45 5f 45 58 43  ))==UNIXFILE_EXC
d690: 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e  L ){.    if( pIn
d6a0: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
d6b0: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74  k==0 ){.      st
d6c0: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
d6d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d6e0: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20  Inode->nLock==0 
d6f0: 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  );.      lock.l_
d700: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
d710: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
d720: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
d730: 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  IRST;.      lock
d740: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
d750: 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  SIZE;.      lock
d760: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
d770: 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73  K;.      rc = os
d780: 53 65 74 50 6f 73 69 78 41 64 76 69 73 6f 72 79  SetPosixAdvisory
d790: 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 26  Lock(pFile->h, &
d7a0: 6c 6f 63 6b 2c 20 70 46 69 6c 65 29 3b 0a 20 20  lock, pFile);.  
d7b0: 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 20 72      if( rc<0 ) r
d7c0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
d7d0: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
d7e0: 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20  Lock = 1;.      
d7f0: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
d800: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d810: 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a    rc = 0;.    }.
d820: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
d830: 3d 20 6f 73 53 65 74 50 6f 73 69 78 41 64 76 69  = osSetPosixAdvi
d840: 73 6f 72 79 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e  soryLock(pFile->
d850: 68 2c 20 70 4c 6f 63 6b 2c 20 70 46 69 6c 65 29  h, pLock, pFile)
d860: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
d870: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
d880: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
d890: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
d8a0: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
d8b0: 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
d8c0: 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
d8d0: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
d8e0: 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
d8f0: 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
d900: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
d910: 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
d920: 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
d930: 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
d940: 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
d950: 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
d960: 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
d970: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
d980: 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
d990: 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
d9a0: 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
d9b0: 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
d9c0: 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
d9d0: 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
d9e0: 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
d9f0: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
da00: 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
da10: 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
da20: 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
da30: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
da40: 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
da50: 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
da60: 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
da70: 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
da80: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
da90: 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
daa0: 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
dab0: 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
dac0: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
dad0: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
dae0: 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
daf0: 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
db00: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
db10: 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
db20: 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
db30: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
db40: 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
db50: 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
db60: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
db70: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
db80: 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
db90: 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
dba0: 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71   int unixLock(sq
dbb0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
dbc0: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
dbd0: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
dbe0: 6e 67 20 64 65 73 63 72 69 62 65 73 20 74 68 65  ng describes the
dbf0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
dc00: 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c  of the various l
dc10: 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f  ocks and.  ** lo
dc20: 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69  ck transitions i
dc30: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50  n terms of the P
dc40: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 73 68  OSIX advisory sh
dc50: 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69  ared and exclusi
dc60: 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69  ve.  ** lock pri
dc70: 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20  mitives (called 
dc80: 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77  read-locks and w
dc90: 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77  rite-locks below
dca0: 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20  , to avoid.  ** 
dcb0: 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53  confusion with S
dcc0: 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73  QLite lock names
dcd0: 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d  ). The algorithm
dce0: 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65  s are complicate
dcf0: 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20  d.  ** slightly 
dd00: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63  in order to be c
dd10: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 57  ompatible with W
dd20: 69 6e 64 6f 77 73 39 35 20 73 79 73 74 65 6d 73  indows95 systems
dd30: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a   simultaneously.
dd40: 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74    ** accessing t
dd50: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
dd60: 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74   file, in case t
dd70: 68 61 74 20 69 73 20 65 76 65 72 20 72 65 71 75  hat is ever requ
dd80: 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ired..  **.  ** 
dd90: 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20  Symbols defined 
dda0: 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66  in os.h indentif
ddb0: 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  y the 'pending b
ddc0: 79 74 65 27 20 61 6e 64 20 74 68 65 20 27 72 65  yte' and the 're
ddd0: 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65  served.  ** byte
dde0: 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62  ', each single b
ddf0: 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f  ytes at well kno
de00: 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20  wn offsets, and 
de10: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
de20: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20  .  ** range', a 
de30: 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74  range of 510 byt
de40: 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f  es at a well kno
de50: 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a  wn offset..  **.
de60: 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61    ** To obtain a
de70: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20   SHARED lock, a 
de80: 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74  read-lock is obt
de90: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65  ained on the 'pe
dea0: 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27  nding.  ** byte'
deb0: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73 75  .  If this is su
dec0: 63 63 65 73 73 66 75 6c 2c 20 27 73 68 61 72 65  ccessful, 'share
ded0: 64 20 62 79 74 65 20 72 61 6e 67 65 27 20 69 73  d byte range' is
dee0: 20 72 65 61 64 2d 6c 6f 63 6b 65 64 0a 20 20 2a   read-locked.  *
def0: 2a 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  * and the lock o
df00: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  n the 'pending b
df10: 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 20 20  yte' released.  
df20: 28 4c 65 67 61 63 79 20 6e 6f 74 65 3a 20 20 57  (Legacy note:  W
df30: 68 65 6e 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20  hen.  ** SQLite 
df40: 77 61 73 20 66 69 72 73 74 20 64 65 76 65 6c 6f  was first develo
df50: 70 65 64 2c 20 57 69 6e 64 6f 77 73 39 35 20 73  ped, Windows95 s
df60: 79 73 74 65 6d 73 20 77 65 72 65 20 73 74 69 6c  ystems were stil
df70: 6c 20 76 65 72 79 20 63 6f 6d 6d 6f 6e 2c 0a 20  l very common,. 
df80: 20 2a 2a 20 61 6e 64 20 57 69 64 6e 6f 77 73 39   ** and Widnows9
df90: 35 20 6c 61 63 6b 73 20 61 20 73 68 61 72 65 64  5 lacks a shared
dfa0: 2d 6c 6f 63 6b 20 63 61 70 61 62 69 6c 69 74 79  -lock capability
dfb0: 2e 20 20 53 6f 20 6f 6e 20 57 69 6e 64 6f 77 73  .  So on Windows
dfc0: 39 35 2c 20 61 0a 20 20 2a 2a 20 73 69 6e 67 6c  95, a.  ** singl
dfd0: 65 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63  e randomly selec
dfe0: 74 65 64 20 62 79 20 66 72 6f 6d 20 74 68 65 20  ted by from the 
dff0: 27 73 68 61 72 65 64 20 62 79 74 65 20 72 61 6e  'shared byte ran
e000: 67 65 27 20 69 73 20 6c 6f 63 6b 65 64 2e 0a 20  ge' is locked.. 
e010: 20 2a 2a 20 57 69 6e 64 6f 77 73 39 35 20 69 73   ** Windows95 is
e020: 20 6e 6f 77 20 70 72 65 74 74 79 20 6d 75 63 68   now pretty much
e030: 20 65 78 74 69 6e 63 74 2c 20 62 75 74 20 74 68   extinct, but th
e040: 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 66  is work-around f
e050: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6c 61 63 6b  or the.  ** lack
e060: 20 6f 66 20 73 68 61 72 65 64 2d 6c 6f 63 6b 73   of shared-locks
e070: 20 6f 6e 20 57 69 6e 64 6f 77 73 39 35 20 6c 69   on Windows95 li
e080: 76 65 73 20 6f 6e 2c 20 66 6f 72 20 62 61 63 6b  ves on, for back
e090: 77 61 72 64 73 0a 20 20 2a 2a 20 63 6f 6d 70 61  wards.  ** compa
e0a0: 74 69 62 69 6c 69 74 79 2e 29 0a 20 20 2a 2a 0a  tibility.).  **.
e0b0: 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d    ** A process m
e0c0: 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61  ay only obtain a
e0d0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61   RESERVED lock a
e0e0: 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53 48  fter it has a SH
e0f0: 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ARED lock..  ** 
e100: 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  A RESERVED lock 
e110: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
e120: 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72 69  y grabbing a wri
e130: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  te-lock on the. 
e140: 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62 79   ** 'reserved by
e150: 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  te'. .  **.  ** 
e160: 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e  A process may on
e170: 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44  ly obtain a PEND
e180: 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69  ING lock after i
e190: 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61  t has obtained a
e1a0: 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63  .  ** SHARED loc
e1b0: 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  k. A PENDING loc
e1c0: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
e1d0: 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   by obtaining a 
e1e0: 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20  write-lock.  ** 
e1f0: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
e200: 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75  byte'. This ensu
e210: 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20  res that no new 
e220: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e  SHARED locks can
e230: 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65   be.  ** obtaine
e240: 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67 20  d, but existing 
e250: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65  SHARED locks are
e260: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73   allowed to pers
e270: 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20  ist. A process. 
e280: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76   ** does not hav
e290: 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45  e to obtain a RE
e2a0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
e2b0: 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44  he way to a PEND
e2c0: 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54  ING lock..  ** T
e2d0: 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73 20  his property is 
e2e0: 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f  used by the algo
e2f0: 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e  rithm for rollin
e300: 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  g back a journal
e310: 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72   file.  ** after
e320: 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20   a crash..  **. 
e330: 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45   ** An EXCLUSIVE
e340: 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20   lock, obtained 
e350: 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20  after a PENDING 
e360: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73  lock is held, is
e370: 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65  .  ** implemente
e380: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
e390: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
e3a0: 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72 65  he entire 'share
e3b0: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
e3c0: 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74  e'. Since all ot
e3d0: 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72  her locks requir
e3e0: 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  e a read-lock on
e3f0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65   one of the byte
e400: 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68  s.  ** within th
e410: 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65  is range, this e
e420: 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f  nsures that no o
e430: 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68  ther locks are h
e440: 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  eld on the.  ** 
e450: 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2f 0a  database. .  */.
e460: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e470: 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
e480: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
e490: 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
e4a0: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
e4b0: 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
e4c0: 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72   lock;.  int tEr
e4d0: 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  rno = 0;..  asse
e4e0: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
e4f0: 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
e500: 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73   %d %s was %s(%s
e510: 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69  ,%d) pid=%d (uni
e520: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
e530: 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63  .      azFileLoc
e540: 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a  k(eFileLock), az
e550: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e  FileLock(pFile->
e560: 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20  eFileLock),.    
e570: 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69    azFileLock(pFi
e580: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
e590: 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e 70  eLock), pFile->p
e5a0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a  Inode->nShared,.
e5b0: 20 20 20 20 20 20 6f 73 47 65 74 70 69 64 28 30        osGetpid(0
e5c0: 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  )));..  /* If th
e5d0: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
e5e0: 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
e5f0: 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
e600: 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
e610: 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20  ** unixFile, do 
e620: 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
e630: 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a  se the end_lock:
e640: 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
e650: 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74   ** unixEnterMut
e660: 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
e670: 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
e680: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
e690: 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c  FileLock>=eFileL
e6a0: 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ock ){.    OSTRA
e6b0: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
e6c0: 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68  %s ok (already h
e6d0: 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20  eld) (unix)\n", 
e6e0: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
e6f0: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
e700: 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20  (eFileLock)));. 
e710: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e720: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
e730: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
e740: 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
e750: 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20   correct..  **  
e760: 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76  (1) We never mov
e770: 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20  e from unlocked 
e780: 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68  to anything high
e790: 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c  er than shared l
e7a0: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53  ock..  **  (2) S
e7b0: 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c  QLite never expl
e7c0: 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20  icitly requests 
e7d0: 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20  a pendig lock.. 
e7e0: 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65   **  (3) A share
e7f0: 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73  d lock is always
e800: 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73   held when a res
e810: 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71  erve lock is req
e820: 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  uested..  */.  a
e830: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
e840: 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b  ileLock!=NO_LOCK
e850: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   || eFileLock==S
e860: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
e870: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
e880: 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k!=PENDING_LOCK 
e890: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
e8a0: 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44  leLock!=RESERVED
e8b0: 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
e8c0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
e8d0: 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  D_LOCK );..  /* 
e8e0: 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65  This mutex is ne
e8f0: 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69  eded because pFi
e900: 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
e910: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
e920: 61 64 73 0a 20 20 2a 2f 0a 20 20 70 49 6e 6f 64  ads.  */.  pInod
e930: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
e940: 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  e;.  sqlite3_mut
e950: 65 78 5f 65 6e 74 65 72 28 70 49 6e 6f 64 65 2d  ex_enter(pInode-
e960: 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 0a 20  >pLockMutex);.. 
e970: 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65   /* If some thre
e980: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
e990: 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61  D has a lock via
e9a0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69   a different uni
e9b0: 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64  xFile*.  ** hand
e9c0: 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65  le that preclude
e9d0: 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
e9e0: 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53  lock, return BUS
e9f0: 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  Y..  */.  if( (p
ea00: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
ea10: 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  =pInode->eFileLo
ea20: 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  ck && .         
ea30: 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
ea40: 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
ea50: 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53  K || eFileLock>S
ea60: 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29  HARED_LOCK)).  )
ea70: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
ea80: 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
ea90: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a   end_lock;.  }..
eaa0: 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44    /* If a SHARED
eab0: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
eac0: 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72  ed, and some thr
ead0: 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
eae0: 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ID already.  ** 
eaf0: 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20  has a SHARED or 
eb00: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74  RESERVED lock, t
eb10: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65  hen increment re
eb20: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61  ference counts a
eb30: 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  nd.  ** return S
eb40: 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20  QLITE_OK..  */. 
eb50: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
eb60: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
eb70: 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65        (pInode->e
eb80: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
eb90: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
eba0: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45  >eFileLock==RESE
ebb0: 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  RVED_LOCK) ){.  
ebc0: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
ebd0: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
ebe0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
ebf0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
ec00: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
ec10: 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
ec20: 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c  ed>0 );.    pFil
ec30: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
ec40: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
ec50: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b  pInode->nShared+
ec60: 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  +;.    pInode->n
ec70: 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  Lock++;.    goto
ec80: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a   end_lock;.  }..
ec90: 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20  .  /* A PENDING 
eca0: 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62  lock is needed b
ecb0: 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20  efore acquiring 
ecc0: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e  a SHARED lock an
ecd0: 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63  d before.  ** ac
ece0: 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55  quiring an EXCLU
ecf0: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20  SIVE lock.  For 
ed00: 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
ed10: 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c   the PENDING wil
ed20: 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73  l.  ** be releas
ed30: 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e  ed..  */.  lock.
ed40: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f  l_len = 1L;.  lo
ed50: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
ed60: 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46  EK_SET;.  if( eF
ed70: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
ed80: 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28  LOCK .      || (
ed90: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
eda0: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69  SIVE_LOCK && pFi
edb0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45  le->eFileLock<PE
edc0: 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b  NDING_LOCK).  ){
edd0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
ede0: 20 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   = (eFileLock==S
edf0: 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c  HARED_LOCK?F_RDL
ee00: 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20  CK:F_WRLCK);.   
ee10: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
ee20: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
ee30: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
ee40: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
ee50: 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   ){.      tErrno
ee60: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
ee70: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
ee80: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
ee90: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
eea0: 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
eeb0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
eec0: 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
eed0: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
eee0: 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
eef0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
ef00: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  o end_lock;.    
ef10: 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20  }.  }...  /* If 
ef20: 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20  control gets to 
ef30: 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
ef40: 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65   actually go ahe
ef50: 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a  ad and make.  **
ef60: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
ef70: 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  m calls for the 
ef80: 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a  specified lock..
ef90: 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
efa0: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
efb0: 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
efc0: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
efd0: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
efe0: 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
eff0: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Lock==0 );.    a
f000: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
f010: 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  E_OK );..    /* 
f020: 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64  Now get the read
f030: 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63  -lock */.    loc
f040: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
f050: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f  ED_FIRST;.    lo
f060: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
f070: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20  D_SIZE;.    if( 
f080: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
f090: 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20  le, &lock) ){.  
f0a0: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
f0b0: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
f0c0: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
f0d0: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
f0e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
f0f0: 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  CK);.    }..    
f100: 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70  /* Drop the temp
f110: 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f  orary PENDING lo
f120: 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c  ck */.    lock.l
f130: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
f140: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
f150: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20  l_len = 1L;.    
f160: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
f170: 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 75  UNLCK;.    if( u
f180: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
f190: 65 2c 20 26 6c 6f 63 6b 29 20 26 26 20 72 63 3d  e, &lock) && rc=
f1a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f1b0: 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 75 6c      /* This coul
f1c0: 64 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 20  d happen with a 
f1d0: 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f  network mount */
f1e0: 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
f1f0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
f200: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
f210: 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 7d 0a 0a 20  NLOCK; .    }.. 
f220: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
f230: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
f240: 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
f250: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
f260: 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
f270: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
f280: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
f290: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
f2a0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
f2b0: 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
f2c0: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f       pInode->nLo
f2d0: 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  ck++;.      pIno
f2e0: 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b  de->nShared = 1;
f2f0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
f300: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
f310: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
f320: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
f330: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  1 ){.    /* We a
f340: 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e  re trying for an
f350: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
f360: 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  but another thre
f370: 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a  ad in this.    *
f380: 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69  * same process i
f390: 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  s still holding 
f3a0: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a  a shared lock. *
f3b0: 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
f3c0: 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b  E_BUSY;.  }else{
f3d0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
f3e0: 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45  est was for a RE
f3f0: 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
f400: 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73  IVE lock.  It is
f410: 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20  .    ** assumed 
f420: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20  that there is a 
f430: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
f440: 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  r lock on the fi
f450: 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  le.    ** alread
f460: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  y..    */.    as
f470: 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e  sert( 0!=pFile->
f480: 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  eFileLock );.   
f490: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
f4a0: 5f 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73 73  _WRLCK;..    ass
f4b0: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ert( eFileLock==
f4c0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
f4d0: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
f4e0: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
f4f0: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
f500: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
f510: 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  {.      lock.l_s
f520: 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f  tart = RESERVED_
f530: 42 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  BYTE;.      lock
f540: 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20  .l_len = 1L;.   
f550: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f   }else{.      lo
f560: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
f570: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
f580: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
f590: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 7d  ARED_SIZE;.    }
f5a0: 0a 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ..    if( unixFi
f5b0: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
f5c0: 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45  ock) ){.      tE
f5d0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
f5e0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
f5f0: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
f600: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
f610: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
f620: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
f630: 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
f640: 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
f650: 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
f660: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
f670: 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 64 65 66 20  .  }.  ..#ifdef 
f680: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
f690: 2a 20 53 65 74 20 75 70 20 74 68 65 20 74 72 61  * Set up the tra
f6a0: 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72  nsaction-counter
f6b0: 20 63 68 61 6e 67 65 20 63 68 65 63 6b 69 6e 67   change checking
f6c0: 20 66 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a   flags when.  **
f6d0: 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66   transitioning f
f6e0: 72 6f 6d 20 61 20 53 48 41 52 45 44 20 74 6f 20  rom a SHARED to 
f6f0: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e  a RESERVED lock.
f700: 20 20 54 68 65 20 63 68 61 6e 67 65 0a 20 20 2a    The change.  *
f710: 2a 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f  * from SHARED to
f720: 20 52 45 53 45 52 56 45 44 20 6d 61 72 6b 73 20   RESERVED marks 
f730: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
f740: 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77   a normal.  ** w
f750: 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 28  rite operation (
f760: 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  not a hot journa
f770: 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a  l rollback)..  *
f780: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
f790: 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c  TE_OK.   && pFil
f7a0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  e->eFileLock<=SH
f7b0: 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20  ARED_LOCK.   && 
f7c0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
f7d0: 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20  VED_LOCK.  ){.  
f7e0: 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e    pFile->transCn
f7f0: 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20  trChng = 0;.    
f800: 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20  pFile->dbUpdate 
f810: 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
f820: 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
f830: 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a  1;.  }.#endif...
f840: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f850: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  _OK ){.    pFile
f860: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
f870: 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e  ileLock;.    pIn
f880: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
f890: 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65   eFileLock;.  }e
f8a0: 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
f8b0: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
f8c0: 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
f8d0: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44  eFileLock = PEND
f8e0: 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49  ING_LOCK;.    pI
f8f0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
f900: 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
f910: 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20    }..end_lock:. 
f920: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
f930: 65 61 76 65 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f  eave(pInode->pLo
f940: 63 6b 4d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52  ckMutex);.  OSTR
f950: 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
f960: 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22   %s %s (unix)\n"
f970: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69  , pFile->h, azFi
f980: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
f990: 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51  ), .      rc==SQ
f9a0: 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
f9b0: 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72   "failed"));.  r
f9c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
f9d0: 2a 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65 20  ** Add the file 
f9e0: 64 65 73 63 72 69 70 74 6f 72 20 75 73 65 64 20  descriptor used 
f9f0: 62 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70  by file handle p
fa00: 46 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72 72  File to the corr
fa10: 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e  esponding.** pUn
fa20: 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  used list..*/.st
fa30: 61 74 69 63 20 76 6f 69 64 20 73 65 74 50 65 6e  atic void setPen
fa40: 64 69 6e 67 46 64 28 75 6e 69 78 46 69 6c 65 20  dingFd(unixFile 
fa50: 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49  *pFile){.  unixI
fa60: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
fa70: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
fa80: 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
fa90: 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 50 72   *p = pFile->pPr
faa0: 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64  eallocatedUnused
fab0: 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ;.  assert( unix
fac0: 46 69 6c 65 4d 75 74 65 78 48 65 6c 64 28 70 46  FileMutexHeld(pF
fad0: 69 6c 65 29 20 29 3b 0a 20 20 70 2d 3e 70 4e 65  ile) );.  p->pNe
fae0: 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e  xt = pInode->pUn
faf0: 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e  used;.  pInode->
fb00: 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20 70  pUnused = p;.  p
fb10: 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
fb20: 70 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63  pFile->pPrealloc
fb30: 61 74 65 64 55 6e 75 73 65 64 20 3d 20 30 3b 0a  atedUnused = 0;.
fb40: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
fb50: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
fb60: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
fb70: 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
fb80: 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
fb90: 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
fba0: 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
fbb0: 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
fbc0: 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
fbd0: 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
fbe0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
fbf0: 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
fc00: 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
fc10: 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
fc20: 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
fc30: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
fc40: 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e  * .** If handleN
fc50: 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65  FSUnlock is true
fc60: 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72  , then on downgr
fc70: 61 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  ading an EXCLUSI
fc80: 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45  VE_LOCK to SHARE
fc90: 44 0a 2a 2a 20 74 68 65 20 62 79 74 65 20 72 61  D.** the byte ra
fca0: 6e 67 65 20 69 73 20 64 69 76 69 64 65 64 20 69  nge is divided i
fcb0: 6e 74 6f 20 32 20 70 61 72 74 73 20 61 6e 64 20  nto 2 parts and 
fcc0: 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20 69  the first part i
fcd0: 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a  s unlocked then.
fce0: 2a 2a 20 73 65 74 20 74 6f 20 61 20 72 65 61 64  ** set to a read
fcf0: 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20   lock, then the 
fd00: 6f 74 68 65 72 20 70 61 72 74 20 69 73 20 73 69  other part is si
fd10: 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20  mply unlocked.  
fd20: 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61  This works .** a
fd30: 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e 20 42  round a bug in B
fd40: 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c  SD NFS lockd (al
fd50: 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53  so seen on MacOS
fd60: 58 20 31 30 2e 33 2b 29 20 74 68 61 74 20 66 61  X 10.3+) that fa
fd70: 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76  ils to .** remov
fd80: 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
fd90: 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77 68 65   on a region whe
fda0: 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73  n a read lock is
fdb0: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
fdc0: 69 6e 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28  int posixUnlock(
fdd0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
fde0: 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c  , int eFileLock,
fdf0: 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e   int handleNFSUn
fe00: 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c  lock){.  unixFil
fe10: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
fe20: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
fe30: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
fe40: 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  e;.  struct floc
fe50: 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63  k lock;.  int rc
fe60: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
fe70: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
fe80: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
fe90: 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
fea0: 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64  %d(%d,%d) pid=%d
feb0: 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
fec0: 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
fed0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  .      pFile->eF
fee0: 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e  ileLock, pFile->
fef0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
ff00: 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
ff10: 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20  ->nShared,.     
ff20: 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a   osGetpid(0)));.
ff30: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
ff40: 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
ff50: 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  K );.  if( pFile
ff60: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69  ->eFileLock<=eFi
ff70: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
ff80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ff90: 20 20 7d 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70    }.  pInode = p
ffa0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
ffb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
ffc0: 74 65 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63  ter(pInode->pLoc
ffd0: 6b 4d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  kMutex);.  asser
ffe0: 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
fff0: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
10000 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
10010 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
10020 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
10030 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46  e->eFileLock==pF
10040 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
10050 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
10060 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68  _DEBUG.    /* Wh
10070 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f  en reducing a lo
10080 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68  ck such that oth
10090 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e  er processes can
100a0 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65   start.    ** re
100b0 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ading the databa
100c0 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d  se file again, m
100d0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
100e0 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
100f0 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73  tion counter was
10100 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20   updated if any 
10110 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
10120 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
10130 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68   changed.  If th
10140 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
10150 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64  unter is not upd
10160 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68  ated,.    ** oth
10170 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  er connections t
10180 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  o the same file 
10190 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a  might not realiz
101a0 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
101b0 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67  e file has chang
101c0 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67  ed and hence mig
101d0 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66  ht not know to f
101e0 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a  lush their.    *
101f0 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73  * cache.  The us
10200 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63  e of a stale cac
10210 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64  he can lead to d
10220 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
10230 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  on..    */.    p
10240 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
10250 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ite = 0;.#endif.
10260 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64  .    /* downgrad
10270 69 6e 67 20 74 6f 20 61 20 73 68 61 72 65 64 20  ing to a shared 
10280 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f  lock on NFS invo
10290 6c 76 65 73 20 63 6c 65 61 72 69 6e 67 20 74 68  lves clearing th
102a0 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20  e write lock.   
102b0 20 2a 2a 20 62 65 66 6f 72 65 20 65 73 74 61 62   ** before estab
102c0 6c 69 73 68 69 6e 67 20 74 68 65 20 72 65 61 64  lishing the read
102d0 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20  lock - to avoid 
102e0 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  a race condition
102f0 20 77 65 20 64 6f 77 6e 67 72 61 64 65 0a 20 20   we downgrade.  
10300 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e    ** the lock in
10310 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68   2 blocks, so th
10320 61 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 72  at part of the r
10330 61 6e 67 65 20 77 69 6c 6c 20 62 65 20 63 6f 76  ange will be cov
10340 65 72 65 64 20 62 79 20 61 20 0a 20 20 20 20 2a  ered by a .    *
10350 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74  * write lock unt
10360 69 6c 20 74 68 65 20 72 65 73 74 20 69 73 20 63  il the rest is c
10370 6f 76 65 72 65 64 20 62 79 20 61 20 72 65 61 64  overed by a read
10380 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20 31   lock:.    **  1
10390 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20 20 20 20  :   [WWWWW].    
103a0 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d  **  2:   [....W]
103b0 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b 52  .    **  3:   [R
103c0 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34 3a  RRRW].    **  4:
103d0 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20 2a     [RRRR.].    *
103e0 2f 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c  /.    if( eFileL
103f0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
10400 20 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64   ){.#if !defined
10410 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21  (__APPLE__) || !
10420 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
10430 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
10440 20 20 28 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46    (void)handleNF
10450 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61  SUnlock;.      a
10460 73 73 65 72 74 28 20 68 61 6e 64 6c 65 4e 46 53  ssert( handleNFS
10470 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e  Unlock==0 );.#en
10480 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
10490 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
104a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
104b0 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20  ING_STYLE.      
104c0 69 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  if( handleNFSUnl
104d0 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ock ){.        i
104e0 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20 20 20 20  nt tErrno;      
104f0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
10500 72 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74  r code from syst
10510 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a  em call errors *
10520 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20  /.        off_t 
10530 64 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44  divSize = SHARED
10540 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20  _SIZE - 1;.     
10550 20 20 20 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b     .        lock
10560 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
10570 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
10580 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
10590 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
105a0 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
105b0 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
105c0 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64    lock.l_len = d
105d0 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
105e0 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
105f0 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
10600 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
10610 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
10620 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
10630 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
10640 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  LOCK;.          
10650 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
10660 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
10670 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
10680 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
10690 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    }.        lock
106a0 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
106b0 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
106c0 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
106d0 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
106e0 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
106f0 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
10700 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64    lock.l_len = d
10710 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
10720 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
10730 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
10740 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
10750 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
10760 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
10770 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
10780 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
10790 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
107a0 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  RDLOCK);.       
107b0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
107c0 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
107d0 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
107e0 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
107f0 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  rrno);.         
10800 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74   }.          got
10810 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
10820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10830 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
10840 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c  UNLCK;.        l
10850 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
10860 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20  EEK_SET;.       
10870 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
10880 53 48 41 52 45 44 5f 46 49 52 53 54 2b 64 69 76  SHARED_FIRST+div
10890 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f  Size;.        lo
108a0 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
108b0 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a  D_SIZE-divSize;.
108c0 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78          if( unix
108d0 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
108e0 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a  &lock)==(-1) ){.
108f0 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f            tErrno
10900 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
10910 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10920 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
10930 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
10940 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
10950 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  rrno);.         
10960 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
10970 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10980 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
10990 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
109a0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
109b0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
109c0 59 4c 45 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20  YLE */.      {. 
109d0 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79         lock.l_ty
109e0 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
109f0 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
10a00 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
10a10 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
10a20 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
10a30 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
10a40 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
10a50 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 69  _SIZE;.        i
10a60 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
10a70 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b  pFile, &lock) ){
10a80 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  .          /* In
10a90 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63 61 6c   theory, the cal
10aa0 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c 6f 63  l to unixFileLoc
10ab0 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  k() cannot fail 
10ac0 62 65 63 61 75 73 65 20 61 6e 6f 74 68 65 72 0a  because another.
10ad0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
10ae0 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
10af0 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
10b00 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f 65 73  lock. If it does
10b10 2c 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  , this .        
10b20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 74    ** indicates t
10b30 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 70 72  hat the other pr
10b40 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c  ocess is not fol
10b50 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69  lowing the locki
10b60 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
10b70 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74 68 69  protocol. If thi
10b80 73 20 68 61 70 70 65 6e 73 2c 20 72 65 74 75 72  s happens, retur
10b90 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  n SQLITE_IOERR_R
10ba0 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69 6e 67  DLOCK. Returning
10bb0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51  .          ** SQ
10bc0 4c 49 54 45 5f 42 55 53 59 20 77 6f 75 6c 64 20  LITE_BUSY would 
10bd0 63 6f 6e 66 75 73 65 20 74 68 65 20 75 70 70 65  confuse the uppe
10be0 72 20 6c 61 79 65 72 20 28 69 6e 20 70 72 61 63  r layer (in prac
10bf0 74 69 63 65 20 69 74 20 63 61 75 73 65 73 20 0a  tice it causes .
10c00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20            ** an 
10c10 61 73 73 65 72 74 20 74 6f 20 66 61 69 6c 29 2e  assert to fail).
10c20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 72   */ .          r
10c30 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
10c40 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _RDLOCK;.       
10c50 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
10c60 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
10c70 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
10c80 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
10c90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
10ca0 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74    }.    lock.l_t
10cb0 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
10cc0 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
10cd0 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
10ce0 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
10cf0 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
10d00 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32    lock.l_len = 2
10d10 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44  L;  assert( PEND
10d20 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45  ING_BYTE+1==RESE
10d30 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20  RVED_BYTE );.   
10d40 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
10d50 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d  k(pFile, &lock)=
10d60 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  =0 ){.      pIno
10d70 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
10d80 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
10d90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
10da0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
10db0 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74  UNLOCK;.      st
10dc0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
10dd0 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
10de0 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
10df0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
10e00 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  f( eFileLock==NO
10e10 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  _LOCK ){.    /* 
10e20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68  Decrement the sh
10e30 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65  ared lock counte
10e40 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20  r.  Release the 
10e50 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20  lock using an.  
10e60 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c    ** OS call onl
10e70 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61  y when all threa
10e80 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20  ds in this same 
10e90 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c  process have rel
10ea0 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65  eased.    ** the
10eb0 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   lock..    */.  
10ec0 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
10ed0 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  d--;.    if( pIn
10ee0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
10ef0 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ){.      lock.l_
10f00 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
10f10 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
10f20 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
10f30 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
10f40 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  rt = lock.l_len 
10f50 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69 66 28 20  = 0L;.      if( 
10f60 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
10f70 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b  le, &lock)==0 ){
10f80 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
10f90 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
10fa0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  LOCK;.      }els
10fb0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
10fc0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
10fd0 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 73 74 6f  OCK;.        sto
10fe0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
10ff0 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
11000 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
11010 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
11020 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
11030 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
11040 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  CK;.      }.    
11050 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  }..    /* Decrem
11060 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66  ent the count of
11070 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74   locks against t
11080 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20  his same file.  
11090 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  When the.    ** 
110a0 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
110b0 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74  ro, close any ot
110c0 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  her file descrip
110d0 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65  tors whose close
110e0 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65  .    ** was defe
110f0 72 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20  rred because of 
11100 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
11110 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  s..    */.    pI
11120 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  node->nLock--;. 
11130 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
11140 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20  e->nLock>=0 );. 
11150 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
11160 4c 6f 63 6b 3d 3d 30 20 29 20 63 6c 6f 73 65 50  Lock==0 ) closeP
11170 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29  endingFds(pFile)
11180 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63  ;.  }..end_unloc
11190 6b 3a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  k:.  sqlite3_mut
111a0 65 78 5f 6c 65 61 76 65 28 70 49 6e 6f 64 65 2d  ex_leave(pInode-
111b0 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20  >pLockMutex);.  
111c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
111d0 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
111e0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
111f0 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  eLock;.  }.  ret
11200 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11210 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
11220 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
11230 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
11240 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
11250 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
11260 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
11270 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
11280 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
11290 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
112a0 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
112b0 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
112c0 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
112d0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
112e0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
112f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
11300 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
11310 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28   int unixUnlock(
11320 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
11330 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
11340 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
11350 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 61  _MMAP_SIZE>0.  a
11360 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
11370 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
11380 20 28 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64   ((unixFile *)id
11390 29 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20  )->nFetchOut==0 
113a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
113b0 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69  rn posixUnlock(i
113c0 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30 29  d, eFileLock, 0)
113d0 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
113e0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
113f0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d  static int unixM
11400 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  apfile(unixFile 
11410 2a 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65 29  *pFd, i64 nByte)
11420 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  ;.static void un
11430 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78  ixUnmapfile(unix
11440 46 69 6c 65 20 2a 70 46 64 29 3b 0a 23 65 6e 64  File *pFd);.#end
11450 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
11460 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73  unction performs
11470 20 74 68 65 20 70 61 72 74 73 20 6f 66 20 74 68   the parts of th
11480 65 20 22 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f  e "close file" o
11490 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d  peration .** com
114a0 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69  mon to all locki
114b0 6e 67 20 73 63 68 65 6d 65 73 2e 20 49 74 20 63  ng schemes. It c
114c0 6c 6f 73 65 73 20 74 68 65 20 64 69 72 65 63 74  loses the direct
114d0 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20  ory and file.** 
114e0 68 61 6e 64 6c 65 73 2c 20 69 66 20 74 68 65 79  handles, if they
114f0 20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e 64 20   are valid, and 
11500 73 65 74 73 20 61 6c 6c 20 66 69 65 6c 64 73 20  sets all fields 
11510 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a  of the unixFile.
11520 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  ** structure to 
11530 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a  0..**.** It is *
11540 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72 79 20 74  not* necessary t
11550 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78  o hold the mutex
11560 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
11570 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a  ne is called,.**
11580 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73   even on VxWorks
11590 2e 20 20 41 20 6d 75 74 65 78 20 77 69 6c 6c 20  .  A mutex will 
115a0 62 65 20 61 63 71 75 69 72 65 64 20 6f 6e 20 56  be acquired on V
115b0 78 57 6f 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a  xWorks by the.**
115c0 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46   vxworksReleaseF
115d0 69 6c 65 49 64 28 29 20 72 6f 75 74 69 6e 65 2e  ileId() routine.
115e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
115f0 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 73 71 6c  loseUnixFile(sql
11600 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
11610 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
11620 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
11630 64 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  d;.#if SQLITE_MA
11640 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
11650 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46  unixUnmapfile(pF
11660 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  ile);.#endif.  i
11670 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29  f( pFile->h>=0 )
11680 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f  {.    robust_clo
11690 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  se(pFile, pFile-
116a0 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  >h, __LINE__);. 
116b0 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31     pFile->h = -1
116c0 3b 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57  ;.  }.#if OS_VXW
116d0 4f 52 4b 53 0a 20 20 69 66 28 20 70 46 69 6c 65  ORKS.  if( pFile
116e0 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20 69 66 28  ->pId ){.    if(
116f0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
11700 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c  s & UNIXFILE_DEL
11710 45 54 45 20 29 7b 0a 20 20 20 20 20 20 6f 73 55  ETE ){.      osU
11720 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64  nlink(pFile->pId
11730 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
11740 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 78 77  );.    }.    vxw
11750 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
11760 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20  d(pFile->pId);. 
11770 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20     pFile->pId = 
11780 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  0;.  }.#endif.#i
11790 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 4c 49  fdef SQLITE_UNLI
117a0 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45 0a 20  NK_AFTER_CLOSE. 
117b0 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c   if( pFile->ctrl
117c0 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
117d0 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6f  _DELETE ){.    o
117e0 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 7a  sUnlink(pFile->z
117f0 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Path);.    sqlit
11800 65 33 5f 66 72 65 65 28 2a 28 63 68 61 72 2a 2a  e3_free(*(char**
11810 29 26 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  )&pFile->zPath);
11820 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74  .    pFile->zPat
11830 68 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  h = 0;.  }.#endi
11840 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c  f.  OSTRACE(("CL
11850 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70  OSE   %-3d\n", p
11860 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65  File->h));.  Ope
11870 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20  nCounter(-1);.  
11880 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69  sqlite3_free(pFi
11890 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65  le->pPreallocate
118a0 64 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73  dUnused);.  mems
118b0 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a  et(pFile, 0, siz
118c0 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
118d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
118e0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
118f0 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  se a file..*/.st
11900 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f  atic int unixClo
11910 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
11920 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *id){.  int rc =
11930 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
11940 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
11950 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a  (unixFile *)id;.
11960 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
11970 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
11980 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 61 73 73 65  >pInode;..  asse
11990 72 74 28 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b  rt( pInode!=0 );
119a0 0a 20 20 76 65 72 69 66 79 44 62 46 69 6c 65 28  .  verifyDbFile(
119b0 70 46 69 6c 65 29 3b 0a 20 20 75 6e 69 78 55 6e  pFile);.  unixUn
119c0 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
119d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  );.  assert( uni
119e0 78 46 69 6c 65 4d 75 74 65 78 4e 6f 74 68 65 6c  xFileMutexNothel
119f0 64 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 75 6e  d(pFile) );.  un
11a00 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
11a10 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 2e 70  .  /* unixFile.p
11a20 49 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20  Inode is always 
11a30 76 61 6c 69 64 20 68 65 72 65 2e 20 4f 74 68 65  valid here. Othe
11a40 72 77 69 73 65 2c 20 61 20 64 69 66 66 65 72 65  rwise, a differe
11a50 6e 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f  nt close.  ** ro
11a60 75 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f  utine (e.g. nolo
11a70 63 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75 6c 64  ckClose()) would
11a80 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65   be called inste
11a90 61 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ad..  */.  asser
11aa0 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  t( pFile->pInode
11ab0 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46 69  ->nLock>0 || pFi
11ac0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  le->pInode->bPro
11ad0 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  cessLock==0 );. 
11ae0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
11af0 6e 74 65 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f  nter(pInode->pLo
11b00 63 6b 4d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ckMutex);.  if( 
11b10 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b  pInode->nLock ){
11b20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
11b30 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
11b40 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61   locks, do not a
11b50 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68  ctually close th
11b60 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20  e file just.    
11b70 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
11b80 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
11b90 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
11ba0 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
11bb0 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72  ile.    ** descr
11bc0 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d  iptor to pInode-
11bd0 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20  >pUnused list.  
11be0 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
11bf0 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
11c00 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65  .    ** when the
11c10 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c   last lock is cl
11c20 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  eared..    */.  
11c30 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70    setPendingFd(p
11c40 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  File);.  }.  sql
11c50 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
11c60 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75  (pInode->pLockMu
11c70 74 65 78 29 3b 0a 20 20 72 65 6c 65 61 73 65 49  tex);.  releaseI
11c80 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b  nodeInfo(pFile);
11c90 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69  .  rc = closeUni
11ca0 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69  xFile(id);.  uni
11cb0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
11cc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
11ce0 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20  nd of the posix 
11cf0 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d  advisory lock im
11d00 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
11d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
11d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
11d70 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
11d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
11dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
11de0 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  o-op Locking ***
11df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
11e10 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72  **.** Of the var
11e20 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70  ious locking imp
11e30 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61  lementations ava
11e40 69 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20  ilable, this is 
11e50 62 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69  by far the.** si
11e60 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67  mplest:  locking
11e70 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f   is ignored.  No
11e80 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
11e90 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74   to lock the dat
11ea0 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f  abase.** file fo
11eb0 72 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  r reading or wri
11ec0 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ting..**.** This
11ed0 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73   locking mode is
11ee0 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
11ef0 20 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c   use on read-onl
11f00 79 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28  y databases.** (
11f10 65 78 3a 20 64 61 74 61 62 61 73 65 73 20 74 68  ex: databases th
11f20 61 74 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e  at are burned in
11f30 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65  to CD-ROM, for e
11f40 78 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e  xample.)  It can
11f50 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64  .** also be used
11f60 20 69 66 20 74 68 65 20 61 70 70 6c 69 63 61 74   if the applicat
11f70 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65  ion employs some
11f80 20 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e   external mechan
11f90 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e  ism to.** preven
11fa0 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61  t simultaneous a
11fb0 63 63 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d  ccess of the sam
11fc0 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74 77  e database by tw
11fd0 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74  o or more.** dat
11fe0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
11ff0 73 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73  s.  But there is
12000 20 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20   a serious risk 
12010 6f 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  of database.** c
12020 6f 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69  orruption if thi
12030 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69  s locking mode i
12040 73 20 75 73 65 64 20 69 6e 20 73 69 74 75 61 74  s used in situat
12050 69 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69  ions where multi
12060 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ple.** database 
12070 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20  connections are 
12080 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
12090 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
120a0 20 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   at the same.** 
120b0 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20  time and one or 
120c0 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f  more of those co
120d0 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72  nnections are wr
120e0 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69  iting..*/..stati
120f0 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63  c int nolockChec
12100 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
12110 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
12120 73 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  sed, int *pResOu
12130 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
12140 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
12150 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b  .  *pResOut = 0;
12160 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12170 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  _OK;.}.static in
12180 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c  t nolockLock(sql
12190 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
121a0 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32  ed, int NotUsed2
121b0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
121c0 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
121d0 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74  NotUsed2);.  ret
121e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
121f0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
12200 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ckUnlock(sqlite3
12210 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20  _file *NotUsed, 
12220 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20  int NotUsed2){. 
12230 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
12240 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
12250 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
12260 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12270 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69  .** Close the fi
12280 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
12290 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71  t nolockClose(sq
122a0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
122b0 7b 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65  {.  return close
122c0 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a  UnixFile(id);.}.
122d0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
122e0 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
122f0 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c   no-op lock impl
12300 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
12310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12320 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
12330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
12370 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
12380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123c0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
123d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
123e0 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69  n dot-file Locki
123f0 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
12400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12410 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66  *.**.** The dotf
12420 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ile locking impl
12430 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20  ementation uses 
12440 74 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66  the existence of
12450 20 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a   separate lock.*
12460 2a 20 66 69 6c 65 73 20 28 72 65 61 6c 6c 79 20  * files (really 
12470 61 20 64 69 72 65 63 74 6f 72 79 29 20 74 6f 20  a directory) to 
12480 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74  control access t
12490 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
124a0 20 54 68 69 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f   This works.** o
124b0 6e 20 6a 75 73 74 20 61 62 6f 75 74 20 65 76 65  n just about eve
124c0 72 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69 6d  ry filesystem im
124d0 61 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20 74  aginable.  But t
124e0 68 65 72 65 20 61 72 65 20 73 65 72 69 6f 75 73  here are serious
124f0 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a   downsides:.**.*
12500 2a 20 20 20 20 28 31 29 20 20 54 68 65 72 65 20  *    (1)  There 
12510 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65  is zero concurre
12520 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 72  ncy.  A single r
12530 65 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c  eader blocks all
12540 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20   other.**       
12550 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72    connections fr
12560 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  om reading or wr
12570 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
12580 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  se..**.**    (2)
12590 20 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e    An application
125a0 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20   crash or power 
125b0 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20 73  loss can leave s
125c0 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a  tale lock files.
125d0 2a 2a 20 20 20 20 20 20 20 20 20 73 69 74 74 69  **         sitti
125e0 6e 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20 6e  ng around that n
125f0 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65  eed to be cleare
12600 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a  d manually..**.*
12610 2a 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20  * Nevertheless, 
12620 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20  a dotlock is an 
12630 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b  appropriate lock
12640 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73 65  ing mode for use
12650 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20   if no.** other 
12660 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79  locking strategy
12670 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
12680 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63  *.** Dotfile loc
12690 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63 72  king works by cr
126a0 65 61 74 69 6e 67 20 61 20 73 75 62 64 69 72 65  eating a subdire
126b0 63 74 6f 72 79 20 69 6e 20 74 68 65 20 73 61 6d  ctory in the sam
126c0 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a 2a  e directory as.*
126d0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  * the database a
126e0 6e 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  nd with the same
126f0 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20 61   name but with a
12700 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69   ".lock" extensi
12710 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65  on added..** The
12720 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 61 20   existence of a 
12730 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20 69  lock directory i
12740 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53  mplies an EXCLUS
12750 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f  IVE lock.  All o
12760 74 68 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70  ther.** lock typ
12770 65 73 20 28 53 48 41 52 45 44 2c 20 52 45 53 45  es (SHARED, RESE
12780 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61  RVED, PENDING) a
12790 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45  re mapped into E
127a0 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a  XCLUSIVE..*/../*
127b0 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66  .** The file suf
127c0 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 68 65  fix added to the
127d0 20 64 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e   data base filen
127e0 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ame in order to 
127f0 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f  create the.** lo
12800 63 6b 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f  ck directory..*/
12810 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b  .#define DOTLOCK
12820 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a  _SUFFIX ".lock".
12830 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
12840 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
12850 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
12860 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
12870 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
12880 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
12890 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
128a0 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
128b0 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
128c0 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
128d0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
128e0 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
128f0 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
12900 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
12910 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
12920 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
12930 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
12940 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
12950 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  k checking..**.*
12960 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63  * In dotfile loc
12970 6b 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20 6c  king, either a l
12980 6f 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69 74  ock exists or it
12990 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69   does not.  So i
129a0 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 74  n this.** variat
129b0 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73 65  ion of CheckRese
129c0 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65  rvedLock(), *pRe
129d0 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74  sOut is set to t
129e0 72 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a  rue if any lock.
129f0 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ** is held on th
12a00 65 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73 65  e file and false
12a10 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
12a20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61  unlocked..*/.sta
12a30 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43  tic int dotlockC
12a40 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
12a50 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
12a60 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
12a70 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
12a80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
12a90 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
12aa0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
12ab0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
12ac0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
12ad0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
12ae0 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
12af0 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
12b00 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
12b10 20 29 3b 0a 20 20 72 65 73 65 72 76 65 64 20 3d   );.  reserved =
12b20 20 6f 73 41 63 63 65 73 73 28 28 63 6f 6e 73 74   osAccess((const
12b30 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f   char*)pFile->lo
12b40 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 30 29  ckingContext, 0)
12b50 3d 3d 30 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ==0;.  OSTRACE((
12b60 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
12b70 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29   %d %d (dotlock)
12b80 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
12b90 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20  c, reserved));. 
12ba0 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
12bb0 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
12bc0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
12bd0 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
12be0 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
12bf0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
12c00 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
12c10 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
12c20 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
12c30 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
12c40 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
12c50 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
12c60 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
12c70 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
12c80 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
12c90 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
12ca0 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
12cb0 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
12cc0 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
12cd0 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
12ce0 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
12cf0 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
12d00 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
12d10 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
12d20 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
12d30 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
12d40 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
12d50 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
12d60 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
12d70 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
12d80 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
12d90 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
12da0 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
12db0 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
12dc0 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
12dd0 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
12de0 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
12df0 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
12e00 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
12e10 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
12e20 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
12e30 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
12e40 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
12e50 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
12e60 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
12e70 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
12e80 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
12e90 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
12ea0 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
12eb0 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
12ec0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
12ed0 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
12ee0 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  level..**.** Wit
12ef0 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  h dotfile lockin
12f00 67 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c  g, we really onl
12f10 79 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20  y support state 
12f20 28 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a  (4): EXCLUSIVE..
12f30 2a 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20  ** But we track 
12f40 74 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  the other lockin
12f50 67 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61  g levels interna
12f60 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lly..*/.static i
12f70 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73  nt dotlockLock(s
12f80 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
12f90 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
12fa0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
12fb0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
12fc0 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f  )id;.  char *zLo
12fd0 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a  ckFile = (char *
12fe0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
12ff0 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63  ontext;.  int rc
13000 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a   = SQLITE_OK;...
13010 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20    /* If we have 
13020 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74  any lock, then t
13030 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72  he lock file alr
13040 65 61 64 79 20 65 78 69 73 74 73 2e 20 20 41 6c  eady exists.  Al
13050 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74  l we have.  ** t
13060 6f 20 64 6f 20 69 73 20 61 64 6a 75 73 74 20 6f  o do is adjust o
13070 75 72 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f  ur internal reco
13080 72 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c  rd of the lock l
13090 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  evel..  */.  if(
130a0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
130b0 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  k > NO_LOCK ){. 
130c0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
130d0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
130e0 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75  .    /* Always u
130f0 70 64 61 74 65 20 74 68 65 20 74 69 6d 65 73 74  pdate the timest
13100 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66  amp on the old f
13110 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 48 41  ile */.#ifdef HA
13120 56 45 5f 55 54 49 4d 45 0a 20 20 20 20 75 74 69  VE_UTIME.    uti
13130 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55  me(zLockFile, NU
13140 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75  LL);.#else.    u
13150 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c  times(zLockFile,
13160 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20   NULL);.#endif. 
13170 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13180 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
13190 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
131a0 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20  ve lock */.  rc 
131b0 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46  = osMkdir(zLockF
131c0 69 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20 69 66  ile, 0777);.  if
131d0 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a  ( rc<0 ){.    /*
131e0 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f   failed to open/
131f0 63 72 65 61 74 65 20 74 68 65 20 6c 6f 63 6b 20  create the lock 
13200 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20  directory */.   
13210 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
13220 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58  rno;.    if( EEX
13230 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b  IST == tErrno ){
13240 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
13250 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65  TE_BUSY;.    } e
13260 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  lse {.      rc =
13270 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
13280 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
13290 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
132a0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
132b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
132c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
132d0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
132e0 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
132f0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
13300 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 0a  urn rc;.  } .  .
13310 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
13320 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
13330 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69  turn ok */.  pFi
13340 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
13350 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
13360 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13370 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
13380 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
13390 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
133a0 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
133b0 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
133c0 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
133d0 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
133e0 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
133f0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
13400 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
13410 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
13420 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
13430 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
13440 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
13450 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
13460 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  no-op..**.** Whe
13470 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  n the locking le
13480 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c  vel reaches NO_L
13490 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20  OCK, delete the 
134a0 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  lock file..*/.st
134b0 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
134c0 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
134d0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
134e0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
134f0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
13500 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63  nixFile*)id;.  c
13510 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
13520 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
13530 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
13540 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
13550 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
13560 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
13570 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
13580 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c  id=%d (dotlock)\
13590 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46  n", pFile->h, eF
135a0 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20  ileLock,.       
135b0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
135c0 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 30  Lock, osGetpid(0
135d0 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  )));.  assert( e
135e0 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
135f0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
13600 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62   no-op if possib
13610 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  le */.  if( pFil
13620 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46  e->eFileLock==eF
13630 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
13640 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13650 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f  .  }..  /* To do
13660 77 6e 67 72 61 64 65 20 74 6f 20 73 68 61 72 65  wngrade to share
13670 64 2c 20 73 69 6d 70 6c 79 20 75 70 64 61 74 65  d, simply update
13680 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   our internal no
13690 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a  tion of the.  **
136a0 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f   lock state.  No
136b0 20 6e 65 65 64 20 74 6f 20 6d 65 73 73 20 77 69   need to mess wi
136c0 74 68 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  th the file on d
136d0 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  isk..  */.  if( 
136e0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
136f0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  D_LOCK ){.    pF
13700 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
13710 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
13720 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13730 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
13740 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20  To fully unlock 
13750 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 64 65  the database, de
13760 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69  lete the lock fi
13770 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  le */.  assert( 
13780 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
13790 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 52  CK );.  rc = osR
137a0 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b  mdir(zLockFile);
137b0 0a 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20  .  if( rc<0 ){. 
137c0 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
137d0 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 74  errno;.    if( t
137e0 45 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 29 7b  Errno==ENOENT ){
137f0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
13800 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
13810 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
13820 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
13830 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  ;.      storeLas
13840 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
13850 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rrno);.    }.   
13860 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d   return rc; .  }
13870 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
13880 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
13890 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
138a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  K;.}../*.** Clos
138b0 65 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20  e a file.  Make 
138c0 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61  sure the lock ha
138d0 73 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20  s been released 
138e0 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a  before closing..
138f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
13900 74 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74  tlockClose(sqlit
13910 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
13920 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
13930 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
13940 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ;.  assert( id!=
13950 30 20 29 3b 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e  0 );.  dotlockUn
13960 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
13970 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
13980 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  e(pFile->locking
13990 43 6f 6e 74 65 78 74 29 3b 0a 20 20 72 65 74 75  Context);.  retu
139a0 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65  rn closeUnixFile
139b0 28 69 64 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  (id);.}./*******
139c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
139d0 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20  of the dot-file 
139e0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
139f0 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
13a00 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
13a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a50 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
13a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13aa0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
13ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ac0 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20  *** Begin flock 
13ad0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
13ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13af0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55  ********.**.** U
13b00 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73  se the flock() s
13b10 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f  ystem call to do
13b20 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a   file locking..*
13b30 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63  *.** flock() loc
13b40 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74  king is like dot
13b50 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e  -file locking in
13b60 20 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75   that the variou
13b70 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20  s.** fine-grain 
13b80 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73  locking levels s
13b90 75 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69  upported by SQLi
13ba0 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64  te are collapsed
13bb0 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
13bc0 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
13bd0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
13be0 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52  s, SHARED, RESER
13bf0 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44  VED, and.** PEND
13c00 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68  ING locks are th
13c10 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20  e same thing as 
13c20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
13c30 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74  k.  SQLite.** st
13c40 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79  ill works when y
13c50 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20  ou do this, but 
13c60 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72  concurrency is r
13c70 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20  educed since.** 
13c80 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72  only a single pr
13c90 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61  ocess can be rea
13ca0 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
13cb0 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a  e at a time..**.
13cc0 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63  ** Omit this sec
13cd0 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45  tion if SQLITE_E
13ce0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
13cf0 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66  YLE is turned of
13d00 66 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  f.*/.#if SQLITE_
13d10 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
13d20 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  TYLE../*.** Retr
13d30 79 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20  y flock() calls 
13d40 74 68 61 74 20 66 61 69 6c 20 77 69 74 68 20 45  that fail with E
13d50 49 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45  INTR.*/.#ifdef E
13d60 49 4e 54 52 0a 73 74 61 74 69 63 20 69 6e 74 20  INTR.static int 
13d70 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74  robust_flock(int
13d80 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20   fd, int op){.  
13d90 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63  int rc;.  do{ rc
13da0 20 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b   = flock(fd,op);
13db0 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
13dc0 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
13dd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13de0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72  #else.# define r
13df0 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29  obust_flock(a,b)
13e00 20 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64   flock(a,b).#end
13e10 69 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  if.     ../*.** 
13e20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
13e30 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
13e40 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
13e50 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
13e60 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
13e70 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
13e80 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
13e90 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
13ea0 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
13eb0 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
13ec0 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
13ed0 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
13ee0 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
13ef0 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
13f00 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
13f10 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
13f20 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
13f30 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
13f40 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
13f50 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73  nt flockCheckRes
13f60 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
13f70 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
13f80 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
13f90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13fa0 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
13fb0 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
13fc0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
13fd0 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d  le*)id;.  .  Sim
13fe0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
13ff0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
14000 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
14010 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
14020 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
14030 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
14040 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
14050 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
14060 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
14070 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
14080 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
14090 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
140a0 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
140b0 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
140c0 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
140d0 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a  cess holds it. *
140e0 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
140f0 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65  d ){.    /* atte
14100 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c  mpt to get the l
14110 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  ock */.    int l
14120 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63  rc = robust_floc
14130 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
14140 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a  _EX | LOCK_NB);.
14150 20 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a      if( !lrc ){.
14160 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65        /* got the
14170 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74   lock, unlock it
14180 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
14190 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69  robust_flock(pFi
141a0 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b  le->h, LOCK_UN);
141b0 0a 20 20 20 20 20 20 69 66 20 28 20 6c 72 63 20  .      if ( lrc 
141c0 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ) {.        int 
141d0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
141e0 20 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63          /* unloc
141f0 6b 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e  k failed with an
14200 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
14210 20 20 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f 49    lrc = SQLITE_I
14220 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20  OERR_UNLOCK; .  
14230 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
14240 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
14250 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  no);.        rc 
14260 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  = lrc;.      }. 
14270 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
14280 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
14290 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73 65  rrno;.      rese
142a0 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rved = 1;.      
142b0 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  /* someone else 
142c0 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72 65  might have it re
142d0 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20 20  served */.      
142e0 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f  lrc = sqliteErro
142f0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
14300 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
14310 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20  OERR_LOCK); .   
14320 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
14330 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
14340 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
14350 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
14360 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  o);.        rc =
14370 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20   lrc;.      }.  
14380 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
14390 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
143a0 20 25 64 20 25 64 20 25 64 20 28 66 6c 6f 63 6b   %d %d %d (flock
143b0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
143c0 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
143d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
143e0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
143f0 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72  _ERRORS.  if( (r
14400 63 20 26 20 30 78 66 66 29 20 3d 3d 20 53 51 4c  c & 0xff) == SQL
14410 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
14420 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14430 0a 20 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b  .    reserved=1;
14440 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
14450 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
14460 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  CK_LOCK_ERRORS *
14470 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  /.  *pResOut = r
14480 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
14490 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
144a0 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
144b0 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
144c0 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
144d0 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
144e0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
144f0 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
14500 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
14510 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
14520 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
14530 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
14540 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
14550 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
14560 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
14570 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
14580 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
14590 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
145a0 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
145b0 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
145c0 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
145d0 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
145e0 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
145f0 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
14600 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
14610 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
14620 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
14630 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
14640 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
14650 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
14660 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
14670 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
14680 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
14690 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
146a0 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
146b0 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
146c0 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
146d0 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
146e0 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
146f0 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
14700 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
14710 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
14720 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
14730 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
14740 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
14750 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72  * flock() only r
14760 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58  eally support EX
14770 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20  CLUSIVE locks.  
14780 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65  We track interme
14790 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74  diate.** lock st
147a0 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69  ates in the sqli
147b0 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
147c0 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b  re, but all lock
147d0 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61  s SHARED or.** a
147e0 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20  bove are really 
147f0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20  EXCLUSIVE locks 
14800 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20  and exclude all 
14810 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
14820 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74  from.** access t
14830 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
14840 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
14850 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
14860 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
14870 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
14880 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
14890 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
148a0 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
148b0 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73   int flockLock(s
148c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
148d0 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
148e0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
148f0 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
14900 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
14910 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73  xFile*)id;..  as
14920 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a  sert( pFile );..
14930 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61    /* if we alrea
14940 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20  dy have a lock, 
14950 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e  it is exclusive.
14960 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a    .  ** Just adj
14970 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75  ust level and pu
14980 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65  nt on outta here
14990 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65  . */.  if (pFile
149a0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f  ->eFileLock > NO
149b0 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
149c0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
149d0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72  eFileLock;.    r
149e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
149f0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61  .  }.  .  /* gra
14a00 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  b an exclusive l
14a10 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28  ock */.  .  if (
14a20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69  robust_flock(pFi
14a30 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c  le->h, LOCK_EX |
14a40 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20   LOCK_NB)) {.   
14a50 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
14a60 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e  rno;.    /* didn
14a70 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20  't get, must be 
14a80 62 75 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d  busy */.    rc =
14a90 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
14aa0 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
14ab0 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
14ac0 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49  LOCK);.    if( I
14ad0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
14ae0 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
14af0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
14b00 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20  tErrno);.    }. 
14b10 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a   } else {.    /*
14b20 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65   got it, set the
14b30 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e   type and return
14b40 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65   ok */.    pFile
14b50 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
14b60 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f  ileLock;.  }.  O
14b70 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
14b80 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f 63 6b   %d %s %s (flock
14b90 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
14ba0 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
14bb0 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20  Lock), .        
14bc0 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
14bd0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
14be0 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  d"));.#ifdef SQL
14bf0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
14c00 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69  _LOCK_ERRORS.  i
14c10 66 28 20 28 72 63 20 26 20 30 78 66 66 29 20 3d  f( (rc & 0xff) =
14c20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  = SQLITE_IOERR )
14c30 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
14c40 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64  E_BUSY;.  }.#end
14c50 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
14c60 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
14c70 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75 72  RRORS */.  retur
14c80 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
14c90 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
14ca0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
14cb0 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
14cc0 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
14cd0 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
14ce0 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
14cf0 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
14d00 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
14d10 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
14d20 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
14d30 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
14d40 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
14d50 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
14d60 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
14d70 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
14d80 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
14d90 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28  int flockUnlock(
14da0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
14db0 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
14dc0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
14dd0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
14de0 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72  *)id;.  .  asser
14df0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
14e00 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
14e10 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64  %d %d was %d pid
14e20 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20  =%d (flock)\n", 
14e30 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
14e40 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
14e50 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
14e60 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b  , osGetpid(0)));
14e70 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
14e80 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
14e90 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
14ea0 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
14eb0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
14ec0 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c  FileLock==eFileL
14ed0 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
14ee0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
14ef0 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20  .  .  /* shared 
14f00 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20  can just be set 
14f10 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79  because we alway
14f20 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  s have an exclus
14f30 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69  ive */.  if (eFi
14f40 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
14f50 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
14f60 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
14f70 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74  ileLock;.    ret
14f80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14f90 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72   }.  .  /* no, r
14fa0 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a  eally, unlock. *
14fb0 2f 0a 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66  /.  if( robust_f
14fc0 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
14fd0 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65  OCK_UN) ){.#ifde
14fe0 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
14ff0 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
15000 53 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  S.    return SQL
15010 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f  ITE_OK;.#endif /
15020 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
15030 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
15040 53 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  S */.    return 
15050 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
15060 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OCK;.  }else{.  
15070 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
15080 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
15090 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
150a0 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
150b0 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
150c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
150d0 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
150e0 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 61 73  file *id) {.  as
150f0 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
15100 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c   flockUnlock(id,
15110 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 72 65 74   NO_LOCK);.  ret
15120 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  urn closeUnixFil
15130 65 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66  e(id);.}..#endif
15140 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
15150 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
15160 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f  && !OS_VXWORK */
15170 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
15180 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
15190 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70  e flock lock imp
151a0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
151b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
151c0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
151d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
151e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
151f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15210 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
15220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15260 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
15270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
15280 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72  n Named Semaphor
15290 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  e Locking ******
152a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
152b0 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73  **.**.** Named s
152c0 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
152d0 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   is only support
152e0 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  ed on VxWorks..*
152f0 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c  *.** Semaphore l
15300 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64  ocking is like d
15310 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63  ot-lock and floc
15320 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72 65 61  k in that it rea
15330 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70  lly only.** supp
15340 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45 20 6c  orts EXCLUSIVE l
15350 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20  ocking.  Only a 
15360 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63  single process c
15370 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  an read or write
15380 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
15390 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65 2e   file at a time.
153a0 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20 70    This reduces p
153b0 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72  otential concurr
153c0 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b  ency, but.** mak
153d0 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c  es the lock impl
153e0 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20  ementation much 
153f0 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f  easier..*/.#if O
15400 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a  S_VXWORKS../*.**
15410 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
15420 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
15430 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
15440 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
15450 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
15460 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
15470 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
15480 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
15490 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
154a0 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
154b0 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
154c0 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
154d0 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
154e0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
154f0 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
15500 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
15510 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
15520 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
15530 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
15540 69 6e 74 20 73 65 6d 58 43 68 65 63 6b 52 65 73  int semXCheckRes
15550 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
15560 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
15570 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e  *pResOut) {.  in
15580 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
15590 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
155a0 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
155b0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
155c0 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
155d0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
155e0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
155f0 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
15600 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
15610 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
15620 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
15630 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
15640 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
15650 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
15660 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
15670 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
15680 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
15690 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
156a0 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
156b0 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
156c0 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20  s holds it. */. 
156d0 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
156e0 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65  {.    sem_t *pSe
156f0 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  m = pFile->pInod
15700 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 20 20 69 66  e->pSem;..    if
15710 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53  ( sem_trywait(pS
15720 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20  em)==-1 ){.     
15730 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
15740 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45  rno;.      if( E
15750 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20  AGAIN != tErrno 
15760 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
15770 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
15780 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
15790 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  , SQLITE_IOERR_C
157a0 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
157b0 29 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  );.        store
157c0 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
157d0 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
157e0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
157f0 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65   /* someone else
15800 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77 68   has the lock wh
15810 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f  en we are in NO_
15820 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20  LOCK */.        
15830 72 65 73 65 72 76 65 64 20 3d 20 28 70 46 69 6c  reserved = (pFil
15840 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53  e->eFileLock < S
15850 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
15860 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
15870 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c        /* we coul
15880 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65 20  d have it if we 
15890 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20  want it */.     
158a0 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b   sem_post(pSem);
158b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
158c0 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
158d0 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 73 65  OCK %d %d %d (se
158e0 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  m)\n", pFile->h,
158f0 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
15900 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  ..  *pResOut = r
15910 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
15920 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
15930 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
15940 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
15950 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
15960 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
15970 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
15980 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
15990 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
159a0 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
159b0 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
159c0 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
159d0 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
159e0 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
159f0 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
15a00 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
15a10 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
15a20 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
15a30 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
15a40 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
15a50 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
15a60 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
15a70 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
15a80 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
15a90 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
15aa0 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
15ab0 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
15ac0 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
15ad0 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
15ae0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
15af0 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
15b00 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
15b10 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
15b20 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
15b30 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
15b40 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
15b50 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
15b60 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
15b70 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
15b80 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
15b90 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
15ba0 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
15bb0 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
15bc0 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
15bd0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
15be0 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  * Semaphore lock
15bf0 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75  s only really su
15c00 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20  pport EXCLUSIVE 
15c10 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b  locks.  We track
15c20 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a   intermediate.**
15c30 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20   lock states in 
15c40 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
15c50 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20   structure, but 
15c60 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44  all locks SHARED
15c70 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65   or.** above are
15c80 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56   really EXCLUSIV
15c90 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c  E locks and excl
15ca0 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72  ude all other pr
15cb0 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20  ocesses from.** 
15cc0 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e  access the file.
15cd0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
15ce0 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
15cf0 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
15d00 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
15d10 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
15d20 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
15d30 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
15d40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
15d50 58 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  XLock(sqlite3_fi
15d60 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
15d70 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
15d80 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
15d90 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65  ixFile*)id;.  se
15da0 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c  m_t *pSem = pFil
15db0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b  e->pInode->pSem;
15dc0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
15dd0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20  TE_OK;..  /* if 
15de0 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
15df0 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78  a lock, it is ex
15e00 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20  clusive.  .  ** 
15e10 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65  Just adjust leve
15e20 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75  l and punt on ou
15e30 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69  tta here. */.  i
15e40 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f (pFile->eFileL
15e50 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b  ock > NO_LOCK) {
15e60 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
15e70 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
15e80 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  k;.    rc = SQLI
15e90 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20  TE_OK;.    goto 
15ea0 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  sem_end_lock;.  
15eb0 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73  }.  .  /* lock s
15ec0 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74  emaphore now but
15ed0 20 62 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61   bail out when a
15ee0 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a  lready locked. *
15ef0 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77  /.  if( sem_tryw
15f00 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b  ait(pSem)==-1 ){
15f10 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
15f20 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
15f30 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  sem_end_lock;.  
15f40 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20  }..  /* got it, 
15f50 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  set the type and
15f60 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20   return ok */.  
15f70 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
15f80 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20   = eFileLock;.. 
15f90 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20  sem_end_lock:.  
15fa0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15fb0 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
15fc0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
15fd0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
15fe0 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
15ff0 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
16000 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
16010 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
16020 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
16030 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
16040 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
16050 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
16060 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
16070 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
16080 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
16090 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
160a0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
160b0 74 69 63 20 69 6e 74 20 73 65 6d 58 55 6e 6c 6f  tic int semXUnlo
160c0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
160d0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
160e0 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
160f0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
16100 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74  ile*)id;.  sem_t
16110 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
16120 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20  pInode->pSem;.. 
16130 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
16140 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6d  ;.  assert( pSem
16150 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
16160 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
16170 73 20 25 64 20 70 69 64 3d 25 64 20 28 73 65 6d  s %d pid=%d (sem
16180 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
16190 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
161a0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
161b0 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64  leLock, osGetpid
161c0 28 30 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  (0)));.  assert(
161d0 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52   eFileLock<=SHAR
161e0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
161f0 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73  /* no-op if poss
16200 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46  ible */.  if( pF
16210 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
16220 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
16230 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16240 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73  K;.  }.  .  /* s
16250 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62  hared can just b
16260 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65  e set because we
16270 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20   always have an 
16280 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69  exclusive */.  i
16290 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f (eFileLock==SH
162a0 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  ARED_LOCK) {.   
162b0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
162c0 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
162d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
162e0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
162f0 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f   no, really unlo
16300 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 65  ck. */.  if ( se
16310 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31  m_post(pSem)==-1
16320 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c   ) {.    int rc,
16330 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
16340 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
16350 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
16360 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
16370 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
16380 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
16390 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
163a0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
163b0 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
163c0 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  o);.    }.    re
163d0 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20  turn rc; .  }.  
163e0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
163f0 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65   = NO_LOCK;.  re
16400 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16410 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20  }../*. ** Close 
16420 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74  a file.. */.stat
16430 69 63 20 69 6e 74 20 73 65 6d 58 43 6c 6f 73 65  ic int semXClose
16440 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
16450 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b  d) {.  if( id ){
16460 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
16470 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
16480 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 58 55 6e  *)id;.    semXUn
16490 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
164a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
164b0 46 69 6c 65 20 29 3b 0a 20 20 20 20 61 73 73 65  File );.    asse
164c0 72 74 28 20 75 6e 69 78 46 69 6c 65 4d 75 74 65  rt( unixFileMute
164d0 78 4e 6f 74 68 65 6c 64 28 70 46 69 6c 65 29 20  xNotheld(pFile) 
164e0 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  );.    unixEnter
164f0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 6c  Mutex();.    rel
16500 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46  easeInodeInfo(pF
16510 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65  ile);.    unixLe
16520 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
16530 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
16540 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
16550 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
16560 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
16570 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  KS */./*.** Name
16580 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
16590 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ing is only avai
165a0 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73  lable on VxWorks
165b0 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
165c0 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
165d0 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  named semaphore 
165e0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
165f0 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
16600 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
16610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16650 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ***/.../********
16660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
166a0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
166b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
166c0 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63  ** Begin AFP Loc
166d0 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
166e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
166f0 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50  ******.**.** AFP
16700 20 69 73 20 74 68 65 20 41 70 70 6c 65 20 46 69   is the Apple Fi
16710 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20  ling Protocol.  
16720 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b  AFP is a network
16730 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e   filesystem foun
16740 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61  d.** on Apple Ma
16750 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72  cintosh computer
16760 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64  s - both OS9 and
16770 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72   OSX..**.** Thir
16780 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e  d-party implemen
16790 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61  tations of AFP a
167a0 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42  re available.  B
167b0 75 74 20 74 68 69 73 20 63 6f 64 65 20 68 65 72  ut this code her
167c0 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  e.** only works 
167d0 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20  on OSX..*/..#if 
167e0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
167f0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
16800 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
16810 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c  E./*.** The afpL
16820 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74  ockingContext st
16830 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
16840 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70   all afp lock sp
16850 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a  ecific state.*/.
16860 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61  typedef struct a
16870 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
16880 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
16890 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f  xt;.struct afpLo
168a0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20  ckingContext {. 
168b0 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0a 20   int reserved;. 
168c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50   const char *dbP
168d0 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ath;            
168e0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
168f0 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a  open file */.};.
16900 0a 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67  .struct ByteRang
16910 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73  eLockPB2.{.  uns
16920 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
16930 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
16940 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73  * offset to firs
16950 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a  t byte to lock *
16960 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
16970 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20  g long length;  
16980 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20        /* nbr of 
16990 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
169a0 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
169b0 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74   long retRangeSt
169c0 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31  art; /* nbr of 1
169d0 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69  st byte locked i
169e0 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a  f successful */.
169f0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
16a00 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20  unLockFlag;     
16a10 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63      /* 1 = unloc
16a20 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20  k, 0 = lock */. 
16a30 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73   unsigned char s
16a40 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20  tartEndFlag;    
16a50 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65     /* 1=rel to e
16a60 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65  nd of fork, 0=re
16a70 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20  l to start */.  
16a80 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
16a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16aa0 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74    /* file desc t
16ab0 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63  o assoc this loc
16ac0 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64  k with */.};..#d
16ad0 65 66 69 6e 65 20 61 66 70 66 73 42 79 74 65 52  efine afpfsByteR
16ae0 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20  angeLock2FSCTL  
16af0 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c        _IOWR('z',
16b00 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65   23, struct Byte
16b10 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f  RangeLockPB2)../
16b20 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75  *.** This is a u
16b30 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69  tility for setti
16b40 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61  ng or clearing a
16b50 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20   bit-range lock 
16b60 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c  on an.** AFP fil
16b70 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20  esystem..** .** 
16b80 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
16b90 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c   on success, SQL
16ba0 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c  ITE_BUSY on fail
16bb0 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
16bc0 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20  nt afpSetLock(. 
16bd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74   const char *pat
16be0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
16bf0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
16c00 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ile to be locked
16c10 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a   or unlocked */.
16c20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
16c30 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
16c40 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65   /* Open file de
16c50 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68  scriptor on path
16c60 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
16c70 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c  ong long offset,
16c80 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
16c90 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  te to be locked 
16ca0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
16cb0 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20  ng long length, 
16cc0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
16cd0 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
16ce0 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46  /.  int setLockF
16cf0 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20  lag             
16d00 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65     /* True to se
16d10 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74  t lock.  False t
16d20 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a  o clear lock */.
16d30 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74 65  ){.  struct Byte
16d40 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b  RangeLockPB2 pb;
16d50 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20  .  int err;.  . 
16d60 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d   pb.unLockFlag =
16d70 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30   setLockFlag ? 0
16d80 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74   : 1;.  pb.start
16d90 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70  EndFlag = 0;.  p
16da0 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65  b.offset = offse
16db0 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d  t;.  pb.length =
16dc0 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66   length; .  pb.f
16dd0 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  d = pFile->h;.  
16de0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50  .  OSTRACE(("AFP
16df0 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72  SETLOCK [%s] for
16e00 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25   %d%s in range %
16e10 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20  llx:%llx\n", .  
16e20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22    (setLockFlag?"
16e30 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c  ON":"OFF"), pFil
16e40 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31  e->h, (pb.fd==-1
16e50 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22  ?"[testval-1]":"
16e60 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20  "),.    offset, 
16e70 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72 72 20  length));.  err 
16e80 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66  = fsctl(path, af
16e90 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  pfsByteRangeLock
16ea0 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b  2FSCTL, &pb, 0);
16eb0 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20  .  if ( err==-1 
16ec0 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  ) {.    int rc;.
16ed0 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
16ee0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52   errno;.    OSTR
16ef0 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b  ACE(("AFPSETLOCK
16f00 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c   failed to fsctl
16f10 28 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22  () '%s' %d %s\n"
16f20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70  ,.             p
16f30 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72  ath, tErrno, str
16f40 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 29 3b  error(tErrno)));
16f50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
16f60 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45  GNORE_AFP_LOCK_E
16f70 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20 53  RRORS.    rc = S
16f80 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73  QLITE_BUSY;.#els
16f90 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  e.    rc = sqlit
16fa0 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
16fb0 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20  rror(tErrno,.   
16fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fd0 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53   setLockFlag ? S
16fe0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
16ff0 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   : SQLITE_IOERR_
17000 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20  UNLOCK);.#endif 
17010 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
17020 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  _AFP_LOCK_ERRORS
17030 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f 4c   */.    if( IS_L
17040 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
17050 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
17060 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
17070 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rno);.    }.    
17080 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65  return rc;.  } e
17090 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  lse {.    return
170a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
170b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
170c0 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
170d0 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
170e0 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
170f0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
17100 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
17110 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
17120 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
17130 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
17140 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
17150 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
17160 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
17170 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
17180 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
17190 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
171a0 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
171b0 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
171c0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
171d0 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
171e0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43  .static int afpC
171f0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
17200 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
17210 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
17220 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
17230 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
17240 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
17250 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
17260 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
17270 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
17280 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20 0a  xt *context;.  .
17290 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
172a0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
172b0 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
172c0 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
172d0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
172e0 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20 28  );.  context = (
172f0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
17300 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
17310 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66  ingContext;.  if
17320 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72  ( context->reser
17330 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  ved ){.    *pRes
17340 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Out = 1;.    ret
17350 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
17360 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
17370 65 78 5f 65 6e 74 65 72 28 70 46 69 6c 65 2d 3e  ex_enter(pFile->
17380 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74  pInode->pLockMut
17390 65 78 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ex);.  /* Check 
173a0 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
173b0 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
173c0 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
173d0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49  .  if( pFile->pI
173e0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
173f0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
17400 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
17410 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68  .  }.  .  /* Oth
17420 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
17430 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
17440 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f   holds it..   */
17450 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
17460 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20   ){.    /* lock 
17470 74 68 65 20 52 45 53 45 52 56 45 44 20 62 79 74  the RESERVED byt
17480 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63  e */.    int lrc
17490 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
174a0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
174b0 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
174c0 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20  YTE, 1,1);  .   
174d0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
174e0 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  lrc ){.      /* 
174f0 69 66 20 77 65 20 73 75 63 63 65 65 64 65 64 20  if we succeeded 
17500 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65  in taking the re
17510 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c  served lock, unl
17520 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72  ock it to restor
17530 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f  e.      ** the o
17540 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f  riginal state */
17550 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 61 66 70  .      lrc = afp
17560 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
17570 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
17580 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
17590 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  , 0);.    } else
175a0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77   {.      /* if w
175b0 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20  e failed to get 
175c0 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f  the lock then so
175d0 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20  meone else must 
175e0 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20  have it */.     
175f0 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
17600 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f     }.    if( IS_
17610 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20  LOCK_ERROR(lrc) 
17620 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b  ){.      rc=lrc;
17630 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
17640 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
17650 61 76 65 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ave(pFile->pInod
17660 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a  e->pLockMutex);.
17670 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
17680 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
17690 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
176a0 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
176b0 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73  ed));.  .  *pRes
176c0 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
176d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
176e0 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
176f0 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
17700 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
17710 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
17720 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
17730 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
17740 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
17750 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
17760 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
17770 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
17780 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
17790 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
177a0 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
177b0 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
177c0 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
177d0 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
177e0 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
177f0 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
17800 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
17810 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
17820 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
17830 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
17840 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
17850 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
17860 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
17870 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
17880 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
17890 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
178a0 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
178b0 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
178c0 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
178d0 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
178e0 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
178f0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
17900 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
17910 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
17920 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
17930 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
17940 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
17950 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
17960 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
17970 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
17980 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
17990 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
179a0 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
179b0 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
179c0 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
179d0 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
179e0 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
179f0 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
17a00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
17a10 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  fpLock(sqlite3_f
17a20 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
17a30 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  leLock){.  int r
17a40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
17a50 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
17a60 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
17a70 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
17a80 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
17a90 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70  e->pInode;.  afp
17aa0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
17ab0 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
17ac0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
17ad0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
17ae0 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65  ntext;.  .  asse
17af0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
17b00 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
17b10 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73   %d %s was %s(%s
17b20 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70  ,%d) pid=%d (afp
17b30 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
17b40 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
17b50 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
17b60 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69  , azFileLock(pFi
17b70 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a  le->eFileLock),.
17b80 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
17b90 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46  eLock(pInode->eF
17ba0 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65  ileLock), pInode
17bb0 2d 3e 6e 53 68 61 72 65 64 20 2c 20 6f 73 47 65  ->nShared , osGe
17bc0 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f 2a  tpid(0)));..  /*
17bd0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
17be0 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
17bf0 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
17c00 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
17c10 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c  the.  ** unixFil
17c20 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
17c30 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61 66 70  on't use the afp
17c40 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20  _end_lock: exit 
17c50 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e  path, as.  ** un
17c60 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  ixEnterMutex() h
17c70 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
17c80 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
17c90 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
17ca0 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck>=eFileLock ){
17cb0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c  .    OSTRACE(("L
17cc0 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20  OCK    %d %s ok 
17cd0 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28  (already held) (
17ce0 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
17cf0 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a  h,.           az
17d00 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
17d10 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ck)));.    retur
17d20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
17d30 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
17d40 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71   the locking seq
17d50 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74  uence is correct
17d60 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65  .  **  (1) We ne
17d70 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e  ver move from un
17d80 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69  locked to anythi
17d90 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73  ng higher than s
17da0 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  hared lock..  **
17db0 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76    (2) SQLite nev
17dc0 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65  er explicitly re
17dd0 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20  quests a pendig 
17de0 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20  lock..  **  (3) 
17df0 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73  A shared lock is
17e00 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65   always held whe
17e10 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b  n a reserve lock
17e20 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20   is requested.. 
17e30 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
17e40 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
17e50 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NO_LOCK || eFile
17e60 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
17e70 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
17e80 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  FileLock!=PENDIN
17e90 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
17ea0 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52  rt( eFileLock!=R
17eb0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
17ec0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17ed0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
17ee0 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75  .  .  /* This mu
17ef0 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62 65  tex is needed be
17f00 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
17f10 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
17f20 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a  ross threads.  *
17f30 2f 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  /.  pInode = pFi
17f40 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73 71  le->pInode;.  sq
17f50 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
17f60 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d  r(pInode->pLockM
17f70 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  utex);..  /* If 
17f80 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
17f90 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61  g this PID has a
17fa0 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66   lock via a diff
17fb0 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a  erent unixFile*.
17fc0 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74    ** handle that
17fd0 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72   precludes the r
17fe0 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72  equested lock, r
17ff0 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f  eturn BUSY..  */
18000 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65  .  if( (pFile->e
18010 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65  FileLock!=pInode
18020 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a  ->eFileLock && .
18030 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e         (pInode->
18040 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49  eFileLock>=PENDI
18050 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NG_LOCK || eFile
18060 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
18070 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20 20 72  )).     ){.    r
18080 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
18090 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e  .    goto afp_en
180a0 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20  d_lock;.  }.  . 
180b0 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20   /* If a SHARED 
180c0 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
180d0 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65  d, and some thre
180e0 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
180f0 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68  D already.  ** h
18100 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52  as a SHARED or R
18110 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68  ESERVED lock, th
18120 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66  en increment ref
18130 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e  erence counts an
18140 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51  d.  ** return SQ
18150 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20  LITE_OK..  */.  
18160 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
18170 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20  HARED_LOCK && . 
18180 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69      (pInode->eFi
18190 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
181a0 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65  OCK || pInode->e
181b0 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
181c0 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  ED_LOCK) ){.    
181d0 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
181e0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
181f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
18200 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
18210 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
18220 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
18230 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  >0 );.    pFile-
18240 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
18250 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49  RED_LOCK;.    pI
18260 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b  node->nShared++;
18270 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  .    pInode->nLo
18280 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61  ck++;.    goto a
18290 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  fp_end_lock;.  }
182a0 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e  .    .  /* A PEN
182b0 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65  DING lock is nee
182c0 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69  ded before acqui
182d0 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
182e0 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20  ck and before.  
182f0 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20  ** acquiring an 
18300 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
18310 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20   For the SHARED 
18320 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e  lock, the PENDIN
18330 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72  G will.  ** be r
18340 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  eleased..  */.  
18350 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
18360 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20  HARED_LOCK .    
18370 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d    || (eFileLock=
18380 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
18390 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
183a0 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ock<PENDING_LOCK
183b0 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  ).  ){.    int f
183c0 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65  ailed;.    faile
183d0 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
183e0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
183f0 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42  pFile, PENDING_B
18400 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  YTE, 1, 1);.    
18410 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20  if (failed) {.  
18420 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
18430 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  .      goto afp_
18440 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  end_lock;.    }.
18450 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63    }.  .  /* If c
18460 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74  ontrol gets to t
18470 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
18480 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61  actually go ahea
18490 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20  d and make.  ** 
184a0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
184b0 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73   calls for the s
184c0 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20  pecified lock.. 
184d0 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
184e0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
184f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63 31   ){.    int lrc1
18500 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72 6e  , lrc2, lrc1Errn
18510 6f 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67 20  o = 0;.    long 
18520 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20  lk, mask;.    . 
18530 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
18540 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b  e->nShared==0 );
18550 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
18560 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
18570 30 20 29 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  0 );.        .  
18580 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66    mask = (sizeof
18590 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52  (long)==8) ? LAR
185a0 47 45 53 54 5f 49 4e 54 36 34 20 3a 20 30 78 37  GEST_INT64 : 0x7
185b0 66 66 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20  fffffff;.    /* 
185c0 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64  Now get the read
185d0 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43  -lock SHARED_LOC
185e0 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65  K */.    /* note
185f0 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69 74   that the qualit
18600 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e  y of the randomn
18610 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  ess doesn't matt
18620 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a  er that much */.
18630 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28      lk = random(
18640 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ); .    pInode->
18650 73 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c 6b  sharedByte = (lk
18660 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52 45 44   & mask)%(SHARED
18670 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20  _SIZE - 1);.    
18680 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c 6f 63  lrc1 = afpSetLoc
18690 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
186a0 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
186b0 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53       SHARED_FIRS
186c0 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64  T+pInode->shared
186d0 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Byte, 1, 1);.   
186e0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
186f0 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20 20 20  OR(lrc1) ){.    
18700 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70 46    lrc1Errno = pF
18710 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  ile->lastErrno;.
18720 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f      }.    /* Dro
18730 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  p the temporary 
18740 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a  PENDING lock */.
18750 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70 53 65      lrc2 = afpSe
18760 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
18770 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
18780 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30  NDING_BYTE, 1, 0
18790 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  );.    .    if( 
187a0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
187b0 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20 73 74  c1) ) {.      st
187c0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
187d0 6c 65 2c 20 6c 72 63 31 45 72 72 6e 6f 29 3b 0a  le, lrc1Errno);.
187e0 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
187f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  .      goto afp_
18800 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20  end_lock;.    } 
18810 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b  else if( IS_LOCK
18820 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a  _ERROR(lrc2) ){.
18830 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32 3b        rc = lrc2;
18840 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  .      goto afp_
18850 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20  end_lock;.    } 
18860 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d  else if( lrc1 !=
18870 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20   SQLITE_OK ) {. 
18880 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a       rc = lrc1;.
18890 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
188a0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
188b0 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
188c0 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  K;.      pInode-
188d0 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20  >nLock++;.      
188e0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20  pInode->nShared 
188f0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
18900 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
18910 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
18920 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61   && pInode->nSha
18930 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  red>1 ){.    /* 
18940 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f  We are trying fo
18950 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
18960 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20  ock but another 
18970 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20  thread in this. 
18980 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63      ** same proc
18990 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c  ess is still hol
189a0 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  ding a shared lo
189b0 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ck. */.    rc = 
189c0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
189d0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
189e0 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72   request was for
189f0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
18a00 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
18a10 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73  It is.    ** ass
18a20 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20  umed that there 
18a30 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67  is a SHARED or g
18a40 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
18a50 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61  he file.    ** a
18a60 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
18a70 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20     int failed = 
18a80 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  0;.    assert( 0
18a90 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  !=pFile->eFileLo
18aa0 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65 46  ck );.    if (eF
18ab0 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52  ileLock >= RESER
18ac0 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  VED_LOCK && pFil
18ad0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52  e->eFileLock < R
18ae0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a  ESERVED_LOCK) {.
18af0 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69          /* Acqui
18b00 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  re a RESERVED lo
18b10 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61  ck */.        fa
18b20 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
18b30 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
18b40 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
18b50 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20  ED_BYTE, 1,1);. 
18b60 20 20 20 20 20 69 66 28 20 21 66 61 69 6c 65 64       if( !failed
18b70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   ){.        cont
18b80 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20  ext->reserved = 
18b90 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
18ba0 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c 65 64  .    if (!failed
18bb0 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d   && eFileLock ==
18bc0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
18bd0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75   {.      /* Acqu
18be0 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ire an EXCLUSIVE
18bf0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
18c00 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76   .      /* Remov
18c10 65 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  e the shared loc
18c20 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20  k before trying 
18c30 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c  the range.  we'l
18c40 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20  l need to .     
18c50 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20   ** reestablish 
18c60 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
18c70 69 66 20 77 65 20 63 61 6e 27 74 20 67 65 74 20  if we can't get 
18c80 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20  the  afpUnlock. 
18c90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
18ca0 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66 70  ( !(failed = afp
18cb0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
18cc0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
18cd0 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20  SHARED_FIRST +. 
18ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cf0 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
18d00 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30  sharedByte, 1, 0
18d10 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  )) ){.        in
18d20 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49  t failed2 = SQLI
18d30 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f  TE_OK;.        /
18d40 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74  * now attemmpt t
18d50 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75 73  o get the exclus
18d60 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a  ive lock range *
18d70 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64  /.        failed
18d80 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
18d90 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
18da0 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
18db0 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ST, .           
18dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18dd0 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c      SHARED_SIZE,
18de0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
18df0 20 66 61 69 6c 65 64 20 26 26 20 28 66 61 69 6c   failed && (fail
18e00 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  ed2 = afpSetLock
18e10 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
18e20 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20  , pFile, .      
18e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e40 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20   SHARED_FIRST + 
18e50 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
18e60 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20  te, 1, 1)) ){.  
18e70 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74          /* Can't
18e80 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65   reestablish the
18e90 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53   shared lock.  S
18ea0 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c  qlite can't deal
18eb0 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20 20 20  , this is.      
18ec0 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61      ** a critica
18ed0 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20  l I/O error.    
18ee0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
18ef0 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64     rc = ((failed
18f00 20 26 20 30 78 66 66 29 20 3d 3d 20 53 51 4c 49   & 0xff) == SQLI
18f10 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61 69 6c  TE_IOERR) ? fail
18f20 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20 20 20  ed2 : .         
18f30 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45        SQLITE_IOE
18f40 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  RR_LOCK;.       
18f50 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
18f60 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20  lock;.        } 
18f70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18f80 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65        rc = faile
18f90 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d; .      }.    
18fa0 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65 64  }.    if( failed
18fb0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
18fc0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  ailed;.    }.  }
18fd0 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  .  .  if( rc==SQ
18fe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
18ff0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
19000 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
19010 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
19020 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
19030 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c    }else if( eFil
19040 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
19050 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
19060 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
19070 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
19080 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
19090 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ock = PENDING_LO
190a0 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65  CK;.  }.  .afp_e
190b0 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 73 71 6c 69 74  nd_lock:.  sqlit
190c0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
190d0 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65  Inode->pLockMute
190e0 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  x);.  OSTRACE(("
190f0 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73  LOCK    %d %s %s
19100 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
19110 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ->h, azFileLock(
19120 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20  eFileLock), .   
19130 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
19140 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
19150 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
19160 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
19170 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
19180 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
19190 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
191a0 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
191b0 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
191c0 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
191d0 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
191e0 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
191f0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
19200 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
19210 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
19220 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
19230 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
19240 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
19250 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
19260 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
19270 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c  nt afpUnlock(sql
19280 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
19290 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
192a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
192b0 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
192c0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
192d0 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
192e0 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
192f0 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
19300 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
19310 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
19320 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
19330 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
19340 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d  int skipShared =
19350 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
19360 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d  E_TEST.  int h =
19370 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69   pFile->h;.#endi
19380 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  f..  assert( pFi
19390 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
193a0 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
193b0 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69  was %d(%d,%d) pi
193c0 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70  d=%d (afp)\n", p
193d0 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
193e0 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
193f0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
19400 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
19410 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
19420 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
19430 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  d,.           os
19440 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20  Getpid(0)));..  
19450 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
19460 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
19470 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
19480 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c  FileLock<=eFileL
19490 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
194a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
194b0 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
194c0 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73 71 6c  e->pInode;.  sql
194d0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
194e0 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75  (pInode->pLockMu
194f0 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
19500 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21  pInode->nShared!
19510 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  =0 );.  if( pFil
19520 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
19530 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
19540 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
19550 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65  eFileLock==pFile
19560 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20  ->eFileLock );. 
19570 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
19580 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
19590 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
195a0 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53  ( h=(-1) ).    S
195b0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
195c0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23 69  nign(0);.    .#i
195d0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
195e0 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65  G.    /* When re
195f0 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75  ducing a lock su
19600 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72  ch that other pr
19610 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72  ocesses can star
19620 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  t.    ** reading
19630 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19640 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73  le again, make s
19650 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ure that the.   
19660 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
19670 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
19680 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20  ted if any part 
19690 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
196a0 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e      ** file chan
196b0 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
196c0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
196d0 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c   is not updated,
196e0 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f  .    ** other co
196f0 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65  nnections to the
19700 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74   same file might
19710 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61   not realize tha
19720 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c  t.    ** the fil
19730 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e  e has changed an
19740 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f  d hence might no
19750 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20  t know to flush 
19760 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63  their.    ** cac
19770 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  he.  The use of 
19780 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61  a stale cache ca
19790 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
197a0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
197b0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
197c0 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61  ( pFile->inNorma
197d0 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20  lWrite==0.      
197e0 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64       || pFile->d
197f0 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20  bUpdate==0.     
19800 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e        || pFile->
19810 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31  transCntrChng==1
19820 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69   );.    pFile->i
19830 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30  nNormalWrite = 0
19840 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20  ;.#endif.    .  
19850 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
19860 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
19870 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
19880 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
19890 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
198a0 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46   pFile, SHARED_F
198b0 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a  IRST, SHARED_SIZ
198c0 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  E, 0);.      if(
198d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
198e0 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  & (eFileLock==SH
198f0 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e  ARED_LOCK || pIn
19900 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 20  ode->nShared>1) 
19910 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e  ){.        /* on
19920 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20  ly re-establish 
19930 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
19940 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
19950 20 20 20 20 20 20 20 20 69 6e 74 20 73 68 61 72          int shar
19960 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41  edLockByte = SHA
19970 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65  RED_FIRST+pInode
19980 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20  ->sharedByte;.  
19990 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
199a0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
199b0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68  bPath, pFile, sh
199c0 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c  aredLockByte, 1,
199d0 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73   1);.      } els
199e0 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69 70  e {.        skip
199f0 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  Shared = 1;.    
19a00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
19a10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19a20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
19a30 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
19a40 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
19a50 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
19a60 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
19a70 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
19a80 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a 20   1, 0);.    } . 
19a90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19aa0 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  E_OK && pFile->e
19ab0 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  FileLock>=RESERV
19ac0 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74 65  ED_LOCK && conte
19ad0 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a  xt->reserved ){.
19ae0 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
19af0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
19b00 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
19b10 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20  SERVED_BYTE, 1, 
19b20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72  0);.      if( !r
19b30 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63 6f  c ){ .        co
19b40 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
19b50 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  = 0; .      }.  
19b60 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
19b70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46  SQLITE_OK && (eF
19b80 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
19b90 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
19ba0 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20 20  nShared>1)){.   
19bb0 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
19bc0 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
19bd0 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  CK;.    }.  }.  
19be0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19bf0 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K && eFileLock==
19c00 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20 20  NO_LOCK ){..    
19c10 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
19c20 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75   shared lock cou
19c30 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74  nter.  Release t
19c40 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e  he lock using an
19c50 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20  .    ** OS call 
19c60 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68  only when all th
19c70 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61  reads in this sa
19c80 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20  me process have 
19c90 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20  released.    ** 
19ca0 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f  the lock..    */
19cb0 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  .    unsigned lo
19cc0 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f  ng long sharedLo
19cd0 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f  ckByte = SHARED_
19ce0 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68  FIRST+pInode->sh
19cf0 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70 49  aredByte;.    pI
19d00 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b  node->nShared--;
19d10 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
19d20 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20  >nShared==0 ){. 
19d30 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
19d40 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
19d50 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
19d60 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20  rror( h=(-1) ). 
19d70 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
19d80 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
19d90 20 20 20 20 20 69 66 28 20 21 73 6b 69 70 53 68       if( !skipSh
19da0 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ared ){.        
19db0 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
19dc0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
19dd0 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f   pFile, sharedLo
19de0 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20  ckByte, 1, 0);. 
19df0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
19e00 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20   !rc ){.        
19e10 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
19e20 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
19e30 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
19e40 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
19e50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19e60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19e70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 49  E_OK ){.      pI
19e80 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  node->nLock--;. 
19e90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
19ea0 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  ode->nLock>=0 );
19eb0 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64  .      if( pInod
19ec0 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 20 63 6c  e->nLock==0 ) cl
19ed0 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46  osePendingFds(pF
19ee0 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ile);.    }.  }.
19ef0 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74    .  sqlite3_mut
19f00 65 78 5f 6c 65 61 76 65 28 70 49 6e 6f 64 65 2d  ex_leave(pInode-
19f10 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20  >pLockMutex);.  
19f20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19f30 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
19f40 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
19f50 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  eLock;.  }.  ret
19f60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19f70 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26 20   Close a file & 
19f80 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65 63  cleanup AFP spec
19f90 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e  ific locking con
19fa0 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63 20  text .*/.static 
19fb0 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73 71 6c  int afpClose(sql
19fc0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
19fd0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19fe0 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
19ff0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1a000 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73 65  File*)id;.  asse
1a010 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61  rt( id!=0 );.  a
1a020 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  fpUnlock(id, NO_
1a030 4c 4f 43 4b 29 3b 0a 20 20 61 73 73 65 72 74 28  LOCK);.  assert(
1a040 20 75 6e 69 78 46 69 6c 65 4d 75 74 65 78 4e 6f   unixFileMutexNo
1a050 74 68 65 6c 64 28 70 46 69 6c 65 29 20 29 3b 0a  theld(pFile) );.
1a060 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
1a070 28 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  ();.  if( pFile-
1a080 3e 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20 75  >pInode ){.    u
1a090 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
1a0a0 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
1a0b0 6e 6f 64 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  node;.    sqlite
1a0c0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 49  3_mutex_enter(pI
1a0d0 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78  node->pLockMutex
1a0e0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  );.    if( pInod
1a0f0 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  e->nLock ){.    
1a100 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
1a110 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  e outstanding lo
1a120 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75  cks, do not actu
1a130 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66  ally close the f
1a140 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20 2a  ile just.      *
1a150 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68  * yet because th
1a160 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74  at would clear t
1a170 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73  hose locks.  Ins
1a180 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69  tead, add the fi
1a190 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63  le.      ** desc
1a1a0 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65  riptor to pInode
1a1b0 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20  ->aPending.  It 
1a1c0 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69  will be automati
1a1d0 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65  cally closed whe
1a1e0 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c  n.      ** the l
1a1f0 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
1a200 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  red..      */.  
1a210 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64      setPendingFd
1a220 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
1a230 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1a240 5f 6c 65 61 76 65 28 70 49 6e 6f 64 65 2d 3e 70  _leave(pInode->p
1a250 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20 7d 0a  LockMutex);.  }.
1a260 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e    releaseInodeIn
1a270 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 73 71 6c  fo(pFile);.  sql
1a280 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
1a290 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
1a2a0 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e  ;.  rc = closeUn
1a2b0 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e  ixFile(id);.  un
1a2c0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
1a2d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a2e0 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
1a2f0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
1a300 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1a310 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f  CKING_STYLE */./
1a320 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62  *.** The code ab
1a330 6f 76 65 20 69 73 20 74 68 65 20 41 46 50 20 6c  ove is the AFP l
1a340 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
1a350 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73  on.  The code is
1a360 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20   specific.** to 
1a370 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20  MacOSX and does 
1a380 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65  not work on othe
1a390 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73  r unix platforms
1a3a0 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76  .  No alternativ
1a3b0 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  e.** is availabl
1a3c0 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27 74  e.  If you don't
1a3d0 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d   compile for a m
1a3e0 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75 6e  ac, then the "un
1a3f0 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20 69  ix-afp".** VFS i
1a400 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  s not available.
1a410 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
1a420 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
1a430 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d   the AFP lock im
1a440 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
1a450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a460 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
1a470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a4a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a4b0 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
1a4c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a4d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a4e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a4f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a500 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
1a510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a520 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b 69   Begin NFS Locki
1a530 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
1a540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a550 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ***/..#if define
1a560 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
1a570 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1a580 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20  CKING_STYLE./*. 
1a590 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
1a5a0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
1a5b0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
1a5c0 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
1a5d0 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a  .  eFileLock. **
1a5e0 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
1a5f0 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
1a600 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20  D_LOCK.. **. ** 
1a610 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
1a620 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
1a630 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
1a640 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
1a650 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75 65  ow. ** the reque
1a660 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
1a670 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
1a680 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f   is a no-op.. */
1a690 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73 55  .static int nfsU
1a6a0 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
1a6b0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
1a6c0 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e  eLock){.  return
1a6d0 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c   posixUnlock(id,
1a6e0 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a   eFileLock, 1);.
1a6f0 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  }..#endif /* def
1a700 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
1a710 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
1a720 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
1a730 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  /./*.** The code
1a740 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e 46   above is the NF
1a750 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  S lock implement
1a760 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65  ation.  The code
1a770 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20   is specific.** 
1a780 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f  to MacOSX and do
1a790 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f  es not work on o
1a7a0 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f  ther unix platfo
1a7b0 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61  rms.  No alterna
1a7c0 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c  tive.** is avail
1a7d0 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a  able.  .**.*****
1a7e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a7f0 20 45 6e 64 20 6f 66 20 74 68 65 20 4e 46 53 20   End of the NFS 
1a800 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
1a810 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
1a820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
1a830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
1a880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a8a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a8b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a8c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
1a8d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e  ************ Non
1a8e0 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33  -locking sqlite3
1a8f0 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2a  _file methods **
1a900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
1a920 2a 20 54 68 65 20 6e 65 78 74 20 64 69 76 69 73  * The next divis
1a930 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d 70  ion contains imp
1a940 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72  lementations for
1a950 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66 20   all methods of 
1a960 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  the .** sqlite3_
1a970 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68 65  file object othe
1a980 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b 69  r than the locki
1a990 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65  ng methods.  The
1a9a0 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68   locking.** meth
1a9b0 6f 64 73 20 77 65 72 65 20 64 65 66 69 6e 65 64  ods were defined
1a9c0 20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61 62   in divisions ab
1a9d0 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67  ove (one locking
1a9e0 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20 64   method per.** d
1a9f0 69 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73 65  ivision).  Those
1aa00 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61 72   methods that ar
1aa10 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20  e common to all 
1aa20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a  locking modes.**
1aa30 20 61 72 65 20 67 61 74 68 65 72 20 74 6f 67 65   are gather toge
1aa40 74 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20 64  ther into this d
1aa50 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a  ivision..*/../*.
1aa60 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f  ** Seek to the o
1aa70 66 66 73 65 74 20 70 61 73 73 65 64 20 61 73 20  ffset passed as 
1aa80 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1aa90 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63  ent, then read c
1aaa0 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74  nt .** bytes int
1aab0 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20 74  o pBuf. Return t
1aac0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1aad0 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
1aae0 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20  ..**.** NB:  If 
1aaf0 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f 50  you define USE_P
1ab00 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45 41  READ or USE_PREA
1ab10 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69 67  D64, then it mig
1ab20 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65  ht also.** be ne
1ab30 63 65 73 73 61 72 79 20 74 6f 20 64 65 66 69 6e  cessary to defin
1ab40 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20  e _XOPEN_SOURCE 
1ab50 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69 73  to be 500.  This
1ab60 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20   varies from.** 
1ab70 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61 6e  one system to an
1ab80 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53 51  other.  Since SQ
1ab90 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64 65  Lite does not de
1aba0 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a 2a  fine USE_PREAD.*
1abb0 2a 20 69 6e 20 61 6e 79 20 66 6f 72 6d 20 62 79  * in any form by
1abc0 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69 6c   default, we wil
1abd0 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  l not attempt to
1abe0 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53   define _XOPEN_S
1abf0 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69  OURCE..** See ti
1ac00 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64 20  ckets #2741 and 
1ac10 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  #2681..**.** To 
1ac20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74  avoid stomping t
1ac30 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f  he errno value o
1ac40 6e 20 61 20 66 61 69 6c 65 64 20 72 65 61 64 20  n a failed read 
1ac50 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61  the lastErrno va
1ac60 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65  lue.** is set be
1ac70 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
1ac80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
1ac90 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69  ekAndRead(unixFi
1aca0 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f  le *id, sqlite3_
1acb0 69 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76 6f  int64 offset, vo
1acc0 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e  id *pBuf, int cn
1acd0 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20  t){.  int got;. 
1ace0 20 69 6e 74 20 70 72 69 6f 72 20 3d 20 30 3b 0a   int prior = 0;.
1acf0 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55 53  #if (!defined(US
1ad00 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65 66  E_PREAD) && !def
1ad10 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
1ad20 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73  )).  i64 newOffs
1ad30 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d  et;.#endif.  TIM
1ad40 45 52 5f 53 54 41 52 54 3b 0a 20 20 61 73 73 65  ER_START;.  asse
1ad50 72 74 28 20 63 6e 74 3d 3d 28 63 6e 74 26 30 78  rt( cnt==(cnt&0x
1ad60 31 66 66 66 66 29 20 29 3b 0a 20 20 61 73 73 65  1ffff) );.  asse
1ad70 72 74 28 20 69 64 2d 3e 68 3e 32 20 29 3b 0a 20  rt( id->h>2 );. 
1ad80 20 64 6f 7b 0a 23 69 66 20 64 65 66 69 6e 65 64   do{.#if defined
1ad90 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 20 20  (USE_PREAD).    
1ada0 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 28 69 64  got = osPread(id
1adb0 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20  ->h, pBuf, cnt, 
1adc0 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d  offset);.    Sim
1add0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f  ulateIOError( go
1ade0 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20  t = -1 );.#elif 
1adf0 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
1ae00 44 36 34 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f  D64).    got = o
1ae10 73 50 72 65 61 64 36 34 28 69 64 2d 3e 68 2c 20  sPread64(id->h, 
1ae20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65  pBuf, cnt, offse
1ae30 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  t);.    Simulate
1ae40 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d  IOError( got = -
1ae50 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e  1 );.#else.    n
1ae60 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b  ewOffset = lseek
1ae70 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20  (id->h, offset, 
1ae80 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53  SEEK_SET);.    S
1ae90 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1aea0 6e 65 77 4f 66 66 73 65 74 20 3d 20 2d 31 20 29  newOffset = -1 )
1aeb0 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66  ;.    if( newOff
1aec0 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 73  set<0 ){.      s
1aed0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75  toreLastErrno((u
1aee0 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72 72  nixFile*)id, err
1aef0 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  no);.      retur
1af00 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n -1;.    }.    
1af10 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 69 64 2d  got = osRead(id-
1af20 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a  >h, pBuf, cnt);.
1af30 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 67  #endif.    if( g
1af40 6f 74 3d 3d 63 6e 74 20 29 20 62 72 65 61 6b 3b  ot==cnt ) break;
1af50 0a 20 20 20 20 69 66 28 20 67 6f 74 3c 30 20 29  .    if( got<0 )
1af60 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 6e  {.      if( errn
1af70 6f 3d 3d 45 49 4e 54 52 20 29 7b 20 67 6f 74 20  o==EINTR ){ got 
1af80 3d 20 31 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d  = 1; continue; }
1af90 0a 20 20 20 20 20 20 70 72 69 6f 72 20 3d 20 30  .      prior = 0
1afa0 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  ;.      storeLas
1afb0 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65  tErrno((unixFile
1afc0 2a 29 69 64 2c 20 20 65 72 72 6e 6f 29 3b 0a 20  *)id,  errno);. 
1afd0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1afe0 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3e 30 20  }else if( got>0 
1aff0 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d 3d 20  ){.      cnt -= 
1b000 67 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  got;.      offse
1b010 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20  t += got;.      
1b020 70 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a 20 20  prior += got;.  
1b030 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64      pBuf = (void
1b040 2a 29 28 67 6f 74 20 2b 20 28 63 68 61 72 2a 29  *)(got + (char*)
1b050 70 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pBuf);.    }.  }
1b060 77 68 69 6c 65 28 20 67 6f 74 3e 30 20 29 3b 0a  while( got>0 );.
1b070 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f    TIMER_END;.  O
1b080 53 54 52 41 43 45 28 28 22 52 45 41 44 20 20 20  STRACE(("READ   
1b090 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20   %-3d %5d %7lld 
1b0a0 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %llu\n",.       
1b0b0 20 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f 74 2b       id->h, got+
1b0c0 70 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d 70 72  prior, offset-pr
1b0d0 69 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53  ior, TIMER_ELAPS
1b0e0 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67  ED));.  return g
1b0f0 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a  ot+prior;.}../*.
1b100 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
1b110 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20  m a file into a 
1b120 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20  buffer.  Return 
1b130 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c  SQLITE_OK if all
1b140 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72  .** bytes were r
1b150 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
1b160 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52   and SQLITE_IOER
1b170 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  R if anything go
1b180 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a  es.** wrong..*/.
1b190 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52  static int unixR
1b1a0 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ead(.  sqlite3_f
1b1b0 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64  ile *id, .  void
1b1c0 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61   *pBuf, .  int a
1b1d0 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  mt,.  sqlite3_in
1b1e0 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20  t64 offset.){.  
1b1f0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
1b200 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64  = (unixFile *)id
1b210 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61  ;.  int got;.  a
1b220 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61  ssert( id );.  a
1b230 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30  ssert( offset>=0
1b240 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d   );.  assert( am
1b250 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  t>0 );..  /* If 
1b260 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61  this is a databa
1b270 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a  se file (not a j
1b280 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a  ournal, master-j
1b290 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20  ournal or temp. 
1b2a0 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62   ** file), the b
1b2b0 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b  ytes in the lock
1b2c0 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64  ing range should
1b2d0 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f   never be read o
1b2e0 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69  r written. */.#i
1b2f0 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46  f 0.  assert( pF
1b300 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74  ile->pPreallocat
1b310 65 64 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20  edUnused==0.    
1b320 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45     || offset>=PE
1b330 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20  NDING_BYTE+512. 
1b340 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b        || offset+
1b350 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  amt<=PENDING_BYT
1b360 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  E .  );.#endif..
1b370 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
1b380 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20  MAP_SIZE>0.  /* 
1b390 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63  Deal with as muc
1b3a0 68 20 6f 66 20 74 68 69 73 20 72 65 61 64 20 72  h of this read r
1b3b0 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69 62  equest as possib
1b3c0 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e  le by transferin
1b3d0 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d  g.  ** data from
1b3e0 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70   the memory mapp
1b3f0 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79  ing using memcpy
1b400 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66  ().  */.  if( of
1b410 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70  fset<pFile->mmap
1b420 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Size ){.    if( 
1b430 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46  offset+amt <= pF
1b440 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
1b450 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42  .      memcpy(pB
1b460 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69  uf, &((u8 *)(pFi
1b470 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
1b480 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74 29 3b 0a  [offset], amt);.
1b490 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1b4a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
1b4b0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  e{.      int nCo
1b4c0 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  py = pFile->mmap
1b4d0 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20  Size - offset;. 
1b4e0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66       memcpy(pBuf
1b4f0 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65  , &((u8 *)(pFile
1b500 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
1b510 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a  ffset], nCopy);.
1b520 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28        pBuf = &((
1b530 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79  u8 *)pBuf)[nCopy
1b540 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  ];.      amt -= 
1b550 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66  nCopy;.      off
1b560 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20  set += nCopy;.  
1b570 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1b580 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52    got = seekAndR
1b590 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ead(pFile, offse
1b5a0 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20  t, pBuf, amt);. 
1b5b0 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b   if( got==amt ){
1b5c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1b5d0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
1b5e0 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
1b5f0 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74  /* lastErrno set
1b600 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20   by seekAndRead 
1b610 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
1b620 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b  LITE_IOERR_READ;
1b630 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74  .  }else{.    st
1b640 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
1b650 6c 65 2c 20 30 29 3b 20 20 20 2f 2a 20 6e 6f 74  le, 0);   /* not
1b660 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20   a system error 
1b670 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64  */.    /* Unread
1b680 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75   parts of the bu
1b690 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72  ffer must be zer
1b6a0 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20  o-filled */.    
1b6b0 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29  memset(&((char*)
1b6c0 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61  pBuf)[got], 0, a
1b6d0 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74  mt-got);.    ret
1b6e0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1b6f0 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d  _SHORT_READ;.  }
1b700 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
1b710 74 20 74 6f 20 73 65 65 6b 20 74 68 65 20 66 69  t to seek the fi
1b720 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70 61  le-descriptor pa
1b730 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
1b740 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a  t argument to.**
1b750 20 61 62 73 6f 6c 75 74 65 20 6f 66 66 73 65 74   absolute offset
1b760 20 69 4f 66 66 2c 20 74 68 65 6e 20 61 74 74 65   iOff, then atte
1b770 6d 70 74 20 74 6f 20 77 72 69 74 65 20 6e 42 75  mpt to write nBu
1b780 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  f bytes of data 
1b790 66 72 6f 6d 0a 2a 2a 20 70 42 75 66 20 74 6f 20  from.** pBuf to 
1b7a0 69 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  it. If an error 
1b7b0 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 2d  occurs, return -
1b7c0 31 20 61 6e 64 20 73 65 74 20 2a 70 69 45 72 72  1 and set *piErr
1b7d0 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a  no. Otherwise, .
1b7e0 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61 63  ** return the ac
1b7f0 74 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  tual number of b
1b800 79 74 65 73 20 77 72 69 74 74 65 6e 20 28 77 68  ytes written (wh
1b810 69 63 68 20 6d 61 79 20 62 65 20 6c 65 73 73 20  ich may be less 
1b820 74 68 61 6e 0a 2a 2a 20 6e 42 75 66 29 2e 0a 2a  than.** nBuf)..*
1b830 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
1b840 6b 41 6e 64 57 72 69 74 65 46 64 28 0a 20 20 69  kAndWriteFd(.  i
1b850 6e 74 20 66 64 2c 20 20 20 20 20 20 20 20 20 20  nt fd,          
1b860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b870 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
1b880 72 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  r to write to */
1b890 0a 20 20 69 36 34 20 69 4f 66 66 2c 20 20 20 20  .  i64 iOff,    
1b8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8b0 20 20 20 2f 2a 20 46 69 6c 65 20 6f 66 66 73 65     /* File offse
1b8c0 74 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69  t to begin writi
1b8d0 6e 67 20 61 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ng at */.  const
1b8e0 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
1b8f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1b900 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69  py data from thi
1b910 73 20 62 75 66 66 65 72 20 74 6f 20 74 68 65 20  s buffer to the 
1b920 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  file */.  int nB
1b930 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
1b940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1b950 65 20 6f 66 20 62 75 66 66 65 72 20 70 42 75 66  e of buffer pBuf
1b960 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
1b970 6e 74 20 2a 70 69 45 72 72 6e 6f 20 20 20 20 20  nt *piErrno     
1b980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b990 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6e 75 6d  * OUT: Error num
1b9a0 62 65 72 20 69 66 20 65 72 72 6f 72 20 6f 63 63  ber if error occ
1b9b0 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  urs */.){.  int 
1b9c0 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rc = 0;         
1b9d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1b9e0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
1b9f0 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a   system call */.
1ba00 0a 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3d  .  assert( nBuf=
1ba10 3d 28 6e 42 75 66 26 30 78 31 66 66 66 66 29 20  =(nBuf&0x1ffff) 
1ba20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e  );.  assert( fd>
1ba30 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  2 );.  assert( p
1ba40 69 45 72 72 6e 6f 21 3d 30 20 29 3b 0a 20 20 6e  iErrno!=0 );.  n
1ba50 42 75 66 20 26 3d 20 30 78 31 66 66 66 66 3b 0a  Buf &= 0x1ffff;.
1ba60 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 0a    TIMER_START;..
1ba70 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
1ba80 50 52 45 41 44 29 0a 20 20 64 6f 7b 20 72 63 20  PREAD).  do{ rc 
1ba90 3d 20 28 69 6e 74 29 6f 73 50 77 72 69 74 65 28  = (int)osPwrite(
1baa0 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66 2c 20  fd, pBuf, nBuf, 
1bab0 69 4f 66 66 29 3b 20 7d 77 68 69 6c 65 28 20 72  iOff); }while( r
1bac0 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  c<0 && errno==EI
1bad0 4e 54 52 20 29 3b 0a 23 65 6c 69 66 20 64 65 66  NTR );.#elif def
1bae0 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
1baf0 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20 28 69 6e  ).  do{ rc = (in
1bb00 74 29 6f 73 50 77 72 69 74 65 36 34 28 66 64 2c  t)osPwrite64(fd,
1bb10 20 70 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66   pBuf, nBuf, iOf
1bb20 66 29 3b 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  f);}while( rc<0 
1bb30 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29  && errno==EINTR)
1bb40 3b 0a 23 65 6c 73 65 0a 20 20 64 6f 7b 0a 20 20  ;.#else.  do{.  
1bb50 20 20 69 36 34 20 69 53 65 65 6b 20 3d 20 6c 73    i64 iSeek = ls
1bb60 65 65 6b 28 66 64 2c 20 69 4f 66 66 2c 20 53 45  eek(fd, iOff, SE
1bb70 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53 69 6d  EK_SET);.    Sim
1bb80 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 69 53  ulateIOError( iS
1bb90 65 65 6b 20 3d 20 2d 31 20 29 3b 0a 20 20 20 20  eek = -1 );.    
1bba0 69 66 28 20 69 53 65 65 6b 3c 30 20 29 7b 0a 20  if( iSeek<0 ){. 
1bbb0 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1bbc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1bbd0 0a 20 20 20 20 72 63 20 3d 20 6f 73 57 72 69 74  .    rc = osWrit
1bbe0 65 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66  e(fd, pBuf, nBuf
1bbf0 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3c  );.  }while( rc<
1bc00 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
1bc10 52 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 54  R );.#endif..  T
1bc20 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52  IMER_END;.  OSTR
1bc30 41 43 45 28 28 22 57 52 49 54 45 20 20 20 25 2d  ACE(("WRITE   %-
1bc40 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c  3d %5d %7lld %ll
1bc50 75 5c 6e 22 2c 20 66 64 2c 20 72 63 2c 20 69 4f  u\n", fd, rc, iO
1bc60 66 66 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  ff, TIMER_ELAPSE
1bc70 44 29 29 3b 0a 0a 20 20 69 66 28 20 72 63 3c 30  D));..  if( rc<0
1bc80 20 29 20 2a 70 69 45 72 72 6e 6f 20 3d 20 65 72   ) *piErrno = er
1bc90 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  rno;.  return rc
1bca0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  ;.}.../*.** Seek
1bcb0 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69   to the offset i
1bcc0 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68 65  n id->offset the
1bcd0 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74 65 73  n read cnt bytes
1bce0 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52   into pBuf..** R
1bcf0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1bd00 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
1bd10 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61 74 65  ly read.  Update
1bd20 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a   the offset..**.
1bd30 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d  ** To avoid stom
1bd40 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76  ping the errno v
1bd50 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64  alue on a failed
1bd60 20 77 72 69 74 65 20 74 68 65 20 6c 61 73 74 45   write the lastE
1bd70 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73  rrno value.** is
1bd80 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75   set before retu
1bd90 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
1bda0 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74   int seekAndWrit
1bdb0 65 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20  e(unixFile *id, 
1bdc0 69 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73  i64 offset, cons
1bdd0 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e  t void *pBuf, in
1bde0 74 20 63 6e 74 29 7b 0a 20 20 72 65 74 75 72 6e  t cnt){.  return
1bdf0 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64 28   seekAndWriteFd(
1be00 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 70  id->h, offset, p
1be10 42 75 66 2c 20 63 6e 74 2c 20 26 69 64 2d 3e 6c  Buf, cnt, &id->l
1be20 61 73 74 45 72 72 6e 6f 29 3b 0a 7d 0a 0a 0a 2f  astErrno);.}.../
1be30 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20  *.** Write data 
1be40 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e  from a buffer in
1be50 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75  to a file.  Retu
1be60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
1be70 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f  success.** or so
1be80 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
1be90 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  ode on failure..
1bea0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1beb0 69 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74  ixWrite(.  sqlit
1bec0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20  e3_file *id, .  
1bed0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
1bee0 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20  , .  int amt,.  
1bef0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
1bf00 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78 46  fset .){.  unixF
1bf10 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1bf20 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
1bf30 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61  t wrote = 0;.  a
1bf40 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61  ssert( id );.  a
1bf50 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
1bf60 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
1bf70 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
1bf80 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c   (not a journal,
1bf90 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
1bfa0 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c  or temp.  ** fil
1bfb0 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e  e), the bytes in
1bfc0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
1bfd0 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ge should never 
1bfe0 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1bff0 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  en. */.#if 0.  a
1c000 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 50  ssert( pFile->pP
1c010 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65  reallocatedUnuse
1c020 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f  d==0.       || o
1c030 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42  ffset>=PENDING_B
1c040 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c  YTE+512.       |
1c050 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45  | offset+amt<=PE
1c060 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b  NDING_BYTE .  );
1c070 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1c080 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
1c090 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e  * If we are doin
1c0a0 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65  g a normal write
1c0b0 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66   to a database f
1c0c0 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20  ile (as opposed 
1c0d0 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20  to.  ** doing a 
1c0e0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
1c0f0 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20  back or a write 
1c100 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68  to some file oth
1c110 65 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20 6e  er than a.  ** n
1c120 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66  ormal database f
1c130 69 6c 65 29 20 74 68 65 6e 20 72 65 63 6f 72 64  ile) then record
1c140 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
1c150 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
1c160 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 49   has changed.  I
1c170 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1c180 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f 64  n counter is mod
1c190 69 66 69 65 64 2c 20 72 65 63 6f 72 64 20 74 68  ified, record th
1c1a0 61 74 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f 6f  at.  ** fact too
1c1b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
1c1c0 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
1c1d0 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  e ){.    pFile->
1c1e0 64 62 55 70 64 61 74 65 20 3d 20 31 3b 20 20 2f  dbUpdate = 1;  /
1c1f0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 68  * The database h
1c200 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
1c210 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 66 73   */.    if( offs
1c220 65 74 3c 3d 32 34 20 26 26 20 6f 66 66 73 65 74  et<=24 && offset
1c230 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20 20  +amt>=27 ){.    
1c240 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
1c250 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b  char oldCntr[4];
1c260 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
1c270 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
1c280 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 65 6b  .      rc = seek
1c290 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20 32  AndRead(pFile, 2
1c2a0 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b 0a  4, oldCntr, 4);.
1c2b0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1c2c0 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
1c2d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 34 20        if( rc!=4 
1c2e0 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e 74  || memcmp(oldCnt
1c2f0 72 2c 20 26 28 28 63 68 61 72 2a 29 70 42 75 66  r, &((char*)pBuf
1c300 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34 29  )[24-offset], 4)
1c310 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
1c320 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
1c330 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65  hng = 1;  /* The
1c340 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1c350 6e 74 65 72 20 68 61 73 20 63 68 61 6e 67 65 64  nter has changed
1c360 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
1c370 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  }.  }.#endif..#i
1c380 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1c390 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45 29  _MMAP_READWRITE)
1c3a0 20 26 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   && SQLITE_MAX_M
1c3b0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20  MAP_SIZE>0.  /* 
1c3c0 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63  Deal with as muc
1c3d0 68 20 6f 66 20 74 68 69 73 20 77 72 69 74 65 20  h of this write 
1c3e0 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69  request as possi
1c3f0 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69  ble by transferi
1c400 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f  ng.  ** data fro
1c410 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70  m the memory map
1c420 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70  ping using memcp
1c430 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f  y().  */.  if( o
1c440 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61  ffset<pFile->mma
1c450 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28  pSize ){.    if(
1c460 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
1c470 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
1c480 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
1c490 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
1c4a0 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
1c4b0 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b  et], pBuf, amt);
1c4c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1c4d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1c4e0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43  se{.      int nC
1c4f0 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  opy = pFile->mma
1c500 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  pSize - offset;.
1c510 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28        memcpy(&((
1c520 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
1c530 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
1c540 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29 3b  ], pBuf, nCopy);
1c550 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28  .      pBuf = &(
1c560 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70  (u8 *)pBuf)[nCop
1c570 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d  y];.      amt -=
1c580 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66   nCopy;.      of
1c590 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20  fset += nCopy;. 
1c5a0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1c5b0 20 0a 20 20 77 68 69 6c 65 28 20 28 77 72 6f 74   .  while( (wrot
1c5c0 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65  e = seekAndWrite
1c5d0 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20  (pFile, offset, 
1c5e0 70 42 75 66 2c 20 61 6d 74 29 29 3c 61 6d 74 20  pBuf, amt))<amt 
1c5f0 26 26 20 77 72 6f 74 65 3e 30 20 29 7b 0a 20 20  && wrote>0 ){.  
1c600 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a    amt -= wrote;.
1c610 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72      offset += wr
1c620 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20  ote;.    pBuf = 
1c630 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77  &((char*)pBuf)[w
1c640 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d  rote];.  }.  Sim
1c650 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77  ulateIOError(( w
1c660 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31  rote=(-1), amt=1
1c670 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44   ));.  SimulateD
1c680 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77  iskfullError(( w
1c690 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29  rote=0, amt=1 ))
1c6a0 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e 77 72 6f  ;..  if( amt>wro
1c6b0 74 65 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72  te ){.    if( wr
1c6c0 6f 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e  ote<0 && pFile->
1c6d0 6c 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53 50  lastErrno!=ENOSP
1c6e0 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61  C ){.      /* la
1c6f0 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73  stErrno set by s
1c700 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20  eekAndWrite */. 
1c710 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1c720 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
1c730 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c740 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
1c750 70 46 69 6c 65 2c 20 30 29 3b 20 2f 2a 20 6e 6f  pFile, 0); /* no
1c760 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72  t a system error
1c770 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1c780 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
1c790 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
1c7a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1c7b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1c7c0 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74  ST./*.** Count t
1c7d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c  he number of ful
1c7e0 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61  lsyncs and norma
1c7f0 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69  l syncs.  This i
1c800 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a  s used to test.*
1c810 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64  * that syncs and
1c820 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f   fullsyncs are o
1c830 63 63 75 72 72 69 6e 67 20 61 74 20 74 68 65 20  ccurring at the 
1c840 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a  right times..*/.
1c850 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  int sqlite3_sync
1c860 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20  _count = 0;.int 
1c870 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
1c880 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
1c890 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20  if../*.** We do 
1c8a0 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74 65 6d  not trust system
1c8b0 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20 77  s to provide a w
1c8c0 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79 6e 63  orking fdatasync
1c8d0 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a  ().  Some do..**
1c8e0 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20 20   Others do no.  
1c8f0 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65 20 77  To be safe, we w
1c900 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68 20 74  ill stick with t
1c910 68 65 20 28 73 6c 69 67 68 74 6c 79 20 73 6c 6f  he (slightly slo
1c920 77 65 72 29 0a 2a 2a 20 66 73 79 6e 63 28 29 2e  wer).** fsync().
1c930 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61   If you know tha
1c940 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64 6f  t your system do
1c950 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74 61  es support fdata
1c960 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c 79  sync() correctly
1c970 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79  ,.** then simply
1c980 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44   compile with -D
1c990 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61 73  fdatasync=fdatas
1c9a0 79 6e 63 20 6f 72 20 2d 44 48 41 56 45 5f 46 44  ync or -DHAVE_FD
1c9b0 41 54 41 53 59 4e 43 0a 2a 2f 0a 23 69 66 20 21  ATASYNC.*/.#if !
1c9c0 64 65 66 69 6e 65 64 28 66 64 61 74 61 73 79 6e  defined(fdatasyn
1c9d0 63 29 20 26 26 20 21 48 41 56 45 5f 46 44 41 54  c) && !HAVE_FDAT
1c9e0 41 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 66  ASYNC.# define f
1c9f0 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23  datasync fsync.#
1ca00 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  endif../*.** Def
1ca10 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
1ca20 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70  NC to 0 or 1 dep
1ca30 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
1ca40 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20  r or not.** the 
1ca50 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72  F_FULLFSYNC macr
1ca60 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46  o is defined.  F
1ca70 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75  _FULLFSYNC is cu
1ca80 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20  rrently.** only 
1ca90 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
1caa0 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61 74   OS X.  But that
1cab0 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a   could change..*
1cac0 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46  /.#ifdef F_FULLF
1cad0 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41  SYNC.# define HA
1cae0 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23  VE_FULLFSYNC 1.#
1caf0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41  else.# define HA
1cb00 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23  VE_FULLFSYNC 0.#
1cb10 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
1cb20 65 20 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d  e fsync() system
1cb30 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77   call does not w
1cb40 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69 73 65  ork as advertise
1cb50 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69  d on many.** uni
1cb60 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20  x systems.  The 
1cb70 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64  following proced
1cb80 75 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ure is an attemp
1cb90 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20  t to make.** it 
1cba0 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a  work better..**.
1cbb0 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f  ** The SQLITE_NO
1cbc0 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61  _SYNC macro disa
1cbd0 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29  bles all fsync()
1cbe0 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 66  s.  This is usef
1cbf0 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e  ul.** for testin
1cc00 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74  g when we want t
1cc10 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68  o run through th
1cc20 65 20 74 65 73 74 20 73 75 69 74 65 20 71 75 69  e test suite qui
1cc30 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65  ckly..** You are
1cc40 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65   strongly advise
1cc50 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f  d *not* to deplo
1cc60 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f  y with SQLITE_NO
1cc70 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64  _SYNC.** enabled
1cc80 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65  , however, since
1cc90 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f   with SQLITE_NO_
1cca0 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e  SYNC enabled, an
1ccb0 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20   OS crash.** or 
1ccc0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 69  power failure wi
1ccd0 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70  ll likely corrup
1cce0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
1ccf0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ile..**.** SQLit
1cd00 65 20 73 65 74 73 20 74 68 65 20 64 61 74 61 4f  e sets the dataO
1cd10 6e 6c 79 20 66 6c 61 67 20 69 66 20 74 68 65 20  nly flag if the 
1cd20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1cd30 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   is unchanged..*
1cd40 2a 20 54 68 65 20 69 64 65 61 20 62 65 68 69 6e  * The idea behin
1cd50 64 20 64 61 74 61 4f 6e 6c 79 20 69 73 20 74 68  d dataOnly is th
1cd60 61 74 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c  at it should onl
1cd70 79 20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65  y write the file
1cd80 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 64   content.** to d
1cd90 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f  isk, not the ino
1cda0 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65 74  de.  We only set
1cdb0 20 64 61 74 61 4f 6e 6c 79 20 69 66 20 74 68 65   dataOnly if the
1cdc0 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 0a 2a   file size is .*
1cdd0 2a 20 75 6e 63 68 61 6e 67 65 64 20 73 69 6e 63  * unchanged sinc
1cde0 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  e the file size 
1cdf0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  is part of the i
1ce00 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c 20  node.  However, 
1ce10 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74 65 6c  .** Ted Ts'o tel
1ce20 6c 73 20 75 73 20 74 68 61 74 20 66 64 61 74 61  ls us that fdata
1ce30 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f  sync() will also
1ce40 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f 64 65   write the inode
1ce50 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20   if the.** file 
1ce60 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67 65 64  size has changed
1ce70 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 6c  .  The only real
1ce80 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
1ce90 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28 29 0a  een fdatasync().
1cea0 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29 2c 20  ** and fsync(), 
1ceb0 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20 69 73  Ted tells us, is
1cec0 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28   that fdatasync(
1ced0 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73 68  ) will not flush
1cee0 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69 66   the.** inode if
1cef0 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f 77   the mtime or ow
1cf00 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 69 6e 6f  ner or other ino
1cf10 64 65 20 61 74 74 72 69 62 75 74 65 73 20 68 61  de attributes ha
1cf20 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 57  ve changed..** W
1cf30 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75  e only care abou
1cf40 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c  t the file size,
1cf50 20 6e 6f 74 20 74 68 65 20 6f 74 68 65 72 20 66   not the other f
1cf60 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 2c 20  ile attributes, 
1cf70 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61 73 20  so.** as far as 
1cf80 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 63 65 72  SQLite is concer
1cf90 6e 65 64 2c 20 61 6e 20 66 64 61 74 61 73 79 6e  ned, an fdatasyn
1cfa0 63 28 29 20 69 73 20 61 6c 77 61 79 73 20 61 64  c() is always ad
1cfb0 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77  equate..** So, w
1cfc0 65 20 61 6c 77 61 79 73 20 75 73 65 20 66 64 61  e always use fda
1cfd0 74 61 73 79 6e 63 28 29 20 69 66 20 69 74 20 69  tasync() if it i
1cfe0 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 67  s available, reg
1cff0 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74 68  ardless of.** th
1d000 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  e value of the d
1d010 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f  ataOnly flag..*/
1d020 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c 6c  .static int full
1d030 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20 69  _fsync(int fd, i
1d040 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74  nt fullSync, int
1d050 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e   dataOnly){.  in
1d060 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  t rc;..  /* The 
1d070 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65 66  following "ifdef
1d080 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f  /elif/else/" blo
1d090 63 6b 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  ck has the same 
1d0a0 73 74 72 75 63 74 75 72 65 20 61 73 0a 20 20 2a  structure as.  *
1d0b0 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e  * the one below.
1d0c0 20 49 74 20 69 73 20 72 65 70 6c 69 63 61 74 65   It is replicate
1d0d0 64 20 68 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f  d here solely to
1d0e0 20 61 76 6f 69 64 20 63 6c 75 74 74 65 72 69 6e   avoid clutterin
1d0f0 67 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 72  g .  ** up the r
1d100 65 61 6c 20 63 6f 64 65 20 77 69 74 68 20 74 68  eal code with th
1d110 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54  e UNUSED_PARAMET
1d120 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a  ER() macros..  *
1d130 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1d140 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45 44  NO_SYNC.  UNUSED
1d150 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a  _PARAMETER(fd);.
1d160 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1d170 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  ER(fullSync);.  
1d180 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1d190 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69  (dataOnly);.#eli
1d1a0 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
1d1b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1d1c0 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23  TER(dataOnly);.#
1d1d0 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
1d1e0 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63  RAMETER(fullSync
1d1f0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1d200 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b  METER(dataOnly);
1d210 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65  .#endif..  /* Re
1d220 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20  cord the number 
1d230 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 77 65  of times that we
1d240 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79   do a normal fsy
1d250 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46  nc() and .  ** F
1d260 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69  ULLSYNC.  This i
1d270 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65  s used during te
1d280 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20  sting to verify 
1d290 74 68 61 74 20 74 68 69 73 20 70 72 6f 63 65 64  that this proced
1d2a0 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61  ure.  ** gets ca
1d2b0 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 6f  lled with the co
1d2c0 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e  rrect arguments.
1d2d0 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1d2e0 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66  ITE_TEST.  if( f
1d2f0 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65  ullSync ) sqlite
1d300 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
1d310 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79  ++;.  sqlite3_sy
1d320 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  nc_count++;.#end
1d330 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  if..  /* If we c
1d340 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65  ompiled with the
1d350 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
1d360 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69  flag, then synci
1d370 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d  ng is a.  ** no-
1d380 6f 70 2e 20 20 42 75 74 20 67 6f 20 61 68 65 61  op.  But go ahea
1d390 64 20 61 6e 64 20 63 61 6c 6c 20 66 73 74 61 74  d and call fstat
1d3a0 28 29 20 74 6f 20 76 61 6c 69 64 61 74 65 20 74  () to validate t
1d3b0 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73  he file.  ** des
1d3c0 63 72 69 70 74 6f 72 20 61 73 20 77 65 20 6e 65  criptor as we ne
1d3d0 65 64 20 61 20 6d 65 74 68 6f 64 20 74 6f 20 70  ed a method to p
1d3e0 72 6f 76 6f 6b 65 20 61 20 66 61 69 6c 75 72 65  rovoke a failure
1d3f0 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 63 6f 76   during.  ** cov
1d400 65 72 61 74 65 20 74 65 73 74 69 6e 67 2e 0a 20  erate testing.. 
1d410 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1d420 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 7b 0a 20 20  E_NO_SYNC.  {.  
1d430 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
1d440 66 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73  f;.    rc = osFs
1d450 74 61 74 28 66 64 2c 20 26 62 75 66 29 3b 0a 20  tat(fd, &buf);. 
1d460 20 7d 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55   }.#elif HAVE_FU
1d470 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66 75  LLFSYNC.  if( fu
1d480 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63  llSync ){.    rc
1d490 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46   = osFcntl(fd, F
1d4a0 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a  _FULLFSYNC, 0);.
1d4b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
1d4c0 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66  = 1;.  }.  /* If
1d4d0 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20 66   the FULLFSYNC f
1d4e0 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b  ailed, fall back
1d4f0 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20 61   to attempting a
1d500 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a 20  n fsync()..  ** 
1d510 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65 20  It shouldn't be 
1d520 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75 6c  possible for ful
1d530 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f  lfsync to fail o
1d540 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20 2a  n the local .  *
1d550 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28 6f  * file system (o
1d560 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c 75  n OSX), so failu
1d570 72 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  re indicates tha
1d580 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a  t FULLFSYNC.  **
1d590 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64   isn't supported
1d5a0 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20 73   for this file s
1d5b0 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d  ystem. So, attem
1d5c0 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20 2a  pt an fsync .  *
1d5d0 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20  * and (for now) 
1d5e0 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72 68  ignore the overh
1d5f0 65 61 64 20 6f 66 20 61 20 73 75 70 65 72 66 6c  ead of a superfl
1d600 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e  uous fcntl call.
1d610 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62 65 20    .  ** It'd be 
1d620 62 65 74 74 65 72 20 74 6f 20 64 65 74 65 63 74  better to detect
1d630 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f   fullfsync suppo
1d640 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69  rt once and avoi
1d650 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e 74  d .  ** the fcnt
1d660 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69 6d  l call every tim
1d670 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65 64  e sync is called
1d680 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 20  ..  */.  if( rc 
1d690 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29  ) rc = fsync(fd)
1d6a0 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  ;..#elif defined
1d6b0 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a  (__APPLE__).  /*
1d6c0 20 66 64 61 74 61 73 79 6e 63 28 29 20 6f 6e 20   fdatasync() on 
1d6d0 48 46 53 2b 20 64 6f 65 73 6e 27 74 20 79 65 74  HFS+ doesn't yet
1d6e0 20 66 6c 75 73 68 20 74 68 65 20 66 69 6c 65 20   flush the file 
1d6f0 73 69 7a 65 20 69 66 20 69 74 20 63 68 61 6e 67  size if it chang
1d700 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a  ed correctly.  *
1d710 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c 79 20 77  * so currently w
1d720 65 20 64 65 66 61 75 6c 74 20 74 6f 20 74 68 65  e default to the
1d730 20 6d 61 63 72 6f 20 74 68 61 74 20 72 65 64 65   macro that rede
1d740 66 69 6e 65 73 20 66 64 61 74 61 73 79 6e 63 20  fines fdatasync 
1d750 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a 20 20  to fsync.  */.  
1d760 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a  rc = fsync(fd);.
1d770 23 65 6c 73 65 20 0a 20 20 72 63 20 3d 20 66 64  #else .  rc = fd
1d780 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 23 69 66  atasync(fd);.#if
1d790 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66   OS_VXWORKS.  if
1d7a0 28 20 72 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e  ( rc==-1 && errn
1d7b0 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20  o==ENOTSUP ){.  
1d7c0 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29    rc = fsync(fd)
1d7d0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
1d7e0 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23 65  OS_VXWORKS */.#e
1d7f0 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51  ndif /* ifdef SQ
1d800 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69  LITE_NO_SYNC eli
1d810 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
1d820 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58   */..  if( OS_VX
1d830 57 4f 52 4b 53 20 26 26 20 72 63 21 3d 20 2d 31  WORKS && rc!= -1
1d840 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a   ){.    rc = 0;.
1d850 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1d860 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
1d870 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1d880 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72   to the director
1d890 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c  y containing fil
1d8a0 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20  e zFilename..** 
1d8b0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a  If successful, *
1d8c0 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 74 68  pFd is set to th
1d8d0 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65  e opened file de
1d8e0 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20  scriptor and.** 
1d8f0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1d900 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72  urned. If an err
1d910 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65  or occurs, eithe
1d920 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a  r SQLITE_NOMEM.*
1d930 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54  * or SQLITE_CANT
1d940 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64  OPEN is returned
1d950 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74   and *pFd is set
1d960 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64   to an undefined
1d970 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  .** value..**.**
1d980 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20 66   The directory f
1d990 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
1d9a0 73 20 75 73 65 64 20 66 6f 72 20 6f 6e 6c 79 20  s used for only 
1d9b0 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74 6f 0a 2a  one thing - to.*
1d9c0 2a 20 66 73 79 6e 63 28 29 20 61 20 64 69 72 65  * fsync() a dire
1d9d0 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65 20 73 75  ctory to make su
1d9e0 72 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e  re file creation
1d9f0 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 20 65 76   and deletion ev
1da00 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66 6c 75 73  ents.** are flus
1da10 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 53 75  hed to disk.  Su
1da20 63 68 20 66 73 79 6e 63 73 20 61 72 65 20 6e 6f  ch fsyncs are no
1da30 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e 65 77 65  t needed on newe
1da40 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67 20  r.** journaling 
1da50 66 69 6c 65 73 79 73 74 65 6d 73 2c 20 62 75 74  filesystems, but
1da60 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e   are required on
1da70 20 6f 6c 64 65 72 20 66 69 6c 65 73 79 73 74 65   older filesyste
1da80 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ms..**.** This r
1da90 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 6f 76  outine can be ov
1daa0 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20 74  erridden using t
1dab0 68 65 20 78 53 65 74 53 79 73 43 61 6c 6c 20 69  he xSetSysCall i
1dac0 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20 54 68 65  nterface..** The
1dad0 20 61 62 69 6c 69 74 79 20 74 6f 20 6f 76 65 72   ability to over
1dae0 72 69 64 65 20 74 68 69 73 20 72 6f 75 74 69 6e  ride this routin
1daf0 65 20 77 61 73 20 61 64 64 65 64 20 69 6e 20 73  e was added in s
1db00 75 70 70 6f 72 74 20 6f 66 20 74 68 65 0a 2a 2a  upport of the.**
1db10 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f   chromium sandbo
1db20 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61 20 64 69  x.  Opening a di
1db30 72 65 63 74 6f 72 79 20 69 73 20 61 20 73 65 63  rectory is a sec
1db40 75 72 69 74 79 20 72 69 73 6b 20 28 77 65 20 61  urity risk (we a
1db50 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f 20 6d  re.** told) so m
1db60 61 6b 69 6e 67 20 69 74 20 6f 76 65 72 72 69 64  aking it overrid
1db70 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20 74 68 65  eable allows the
1db80 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f   chromium sandbo
1db90 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61 63 65 20  x to.** replace 
1dba0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
1dbb0 68 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  h a harmless no-
1dbc0 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20 74 68 69  op.  To make thi
1dbd0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 20 6e  s routine.** a n
1dbe0 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65 20 69 74  o-op, replace it
1dbf0 20 77 69 74 68 20 61 20 73 74 75 62 20 74 68 61   with a stub tha
1dc00 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
1dc10 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 73 0a 2a  _OK but leaves.*
1dc20 2a 20 2a 70 46 64 20 73 65 74 20 74 6f 20 61 20  * *pFd set to a 
1dc30 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e  negative number.
1dc40 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
1dc50 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
1dc60 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   the caller is r
1dc70 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
1dc80 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69  losing.** the fi
1dc90 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 70  le descriptor *p
1dca0 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28 29  Fd using close()
1dcb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1dcc0 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f  openDirectory(co
1dcd0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1dce0 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a  ame, int *pFd){.
1dcf0 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20    int ii;.  int 
1dd00 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20  fd = -1;.  char 
1dd10 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54  zDirname[MAX_PAT
1dd20 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c  HNAME+1];..  sql
1dd30 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
1dd40 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72  X_PATHNAME, zDir
1dd50 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c  name, "%s", zFil
1dd60 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69  ename);.  for(ii
1dd70 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69  =(int)strlen(zDi
1dd80 72 6e 61 6d 65 29 3b 20 69 69 3e 30 20 26 26 20  rname); ii>0 && 
1dd90 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f  zDirname[ii]!='/
1dda0 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20  '; ii--);.  if( 
1ddb0 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69 72  ii>0 ){.    zDir
1ddc0 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b  name[ii] = '\0';
1ddd0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
1dde0 28 20 7a 44 69 72 6e 61 6d 65 5b 30 5d 21 3d 27  ( zDirname[0]!='
1ddf0 2f 27 20 29 20 7a 44 69 72 6e 61 6d 65 5b 30 5d  /' ) zDirname[0]
1de00 20 3d 20 27 2e 27 3b 0a 20 20 20 20 7a 44 69 72   = '.';.    zDir
1de10 6e 61 6d 65 5b 31 5d 20 3d 20 30 3b 0a 20 20 7d  name[1] = 0;.  }
1de20 0a 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f  .  fd = robust_o
1de30 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f  pen(zDirname, O_
1de40 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c  RDONLY|O_BINARY,
1de50 20 30 29 3b 0a 20 20 69 66 28 20 66 64 3e 3d 30   0);.  if( fd>=0
1de60 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
1de70 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25  ("OPENDIR %-3d %
1de80 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61  s\n", fd, zDirna
1de90 6d 65 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 46 64  me));.  }.  *pFd
1dea0 20 3d 20 66 64 3b 0a 20 20 69 66 28 20 66 64 3e   = fd;.  if( fd>
1deb0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1dec0 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e 20  TE_OK;.  return 
1ded0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
1dee0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
1def0 54 2c 20 22 6f 70 65 6e 44 69 72 65 63 74 6f 72  T, "openDirector
1df00 79 22 2c 20 7a 44 69 72 6e 61 6d 65 29 3b 0a 7d  y", zDirname);.}
1df10 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
1df20 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20  e all writes to 
1df30 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c  a particular fil
1df40 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20  e are committed 
1df50 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49  to disk..**.** I
1df60 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68  f dataOnly==0 th
1df70 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65  en both the file
1df80 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20   itself and its 
1df90 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a  metadata (file.*
1dfa0 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74  * size, access t
1dfb0 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73 79  ime, etc) are sy
1dfc0 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e  nced.  If dataOn
1dfd0 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20  ly!=0 then only 
1dfe0 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61  the.** file data
1dff0 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a   is synced..**.*
1e000 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c  * Under Unix, al
1e010 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  so make sure tha
1e020 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  t the directory 
1e030 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
1e040 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63  le.** has been c
1e050 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d  reated by fsync-
1e060 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72  ing the director
1e070 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  y that contains 
1e080 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20  the file..** If 
1e090 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69  we do not do thi
1e0a0 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74  s and we encount
1e0b0 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  er a power failu
1e0c0 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72  re, the director
1e0d0 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74  y.** entry for t
1e0e0 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
1e0f0 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65 72   not exist after
1e100 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65   we reboot.  The
1e110 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20   next.** SQLite 
1e120 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66 69  to access the fi
1e130 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77  le will not know
1e140 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1e150 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75 73  l exists (becaus
1e160 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f  e.** the directo
1e170 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ry entry for the
1e180 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76   journal was nev
1e190 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64 20  er created) and 
1e1a0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
1e1b0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  ** will not roll
1e1c0 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79   back - possibly
1e1d0 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61   leading to data
1e1e0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
1e1f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1e200 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f  nixSync(sqlite3_
1e210 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c  file *id, int fl
1e220 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ags){.  int rc;.
1e230 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1e240 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
1e250 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61  d;..  int isData
1e260 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51  Only = (flags&SQ
1e270 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
1e280 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c  LY);.  int isFul
1e290 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30  lsync = (flags&0
1e2a0 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
1e2b0 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68  C_FULL;..  /* Ch
1e2c0 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  eck that one of 
1e2d0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
1e2e0 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70  AL or FULL was p
1e2f0 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  assed */.  asser
1e300 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  t((flags&0x0F)==
1e310 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
1e320 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61  AL.      || (fla
1e330 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
1e340 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a  _SYNC_FULL.  );.
1e350 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f  .  /* Unix canno
1e360 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74  t, but some syst
1e370 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ems may return S
1e380 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20  QLITE_FULL from 
1e390 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20  here. This.  ** 
1e3a0 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20  line is to test 
1e3b0 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f  that doing so do
1e3c0 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79  es not cause any
1e3d0 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a   problems..  */.
1e3e0 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
1e3f0 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  llError( return 
1e400 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a  SQLITE_FULL );..
1e410 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
1e420 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  );.  OSTRACE(("S
1e430 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20  YNC    %-3d\n", 
1e440 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63  pFile->h));.  rc
1e450 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46   = full_fsync(pF
1e460 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79  ile->h, isFullsy
1e470 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b  nc, isDataOnly);
1e480 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1e490 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66  or( rc=1 );.  if
1e4a0 28 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f 72  ( rc ){.    stor
1e4b0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
1e4c0 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65  , errno);.    re
1e4d0 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
1e4e0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  r(SQLITE_IOERR_F
1e4f0 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73 79 6e  SYNC, "full_fsyn
1e500 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  c", pFile->zPath
1e510 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73  );.  }..  /* Als
1e520 6f 20 66 73 79 6e 63 20 74 68 65 20 64 69 72 65  o fsync the dire
1e530 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  ctory containing
1e540 20 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65   the file if the
1e550 20 44 49 52 53 59 4e 43 20 66 6c 61 67 0a 20 20   DIRSYNC flag.  
1e560 2a 2a 20 69 73 20 73 65 74 2e 20 20 54 68 69 73  ** is set.  This
1e570 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d 65 20 6f   is a one-time o
1e580 63 63 75 72 72 65 6e 63 65 2e 20 20 4d 61 6e 79  ccurrence.  Many
1e590 20 73 79 73 74 65 6d 73 20 28 65 78 61 6d 70 6c   systems (exampl
1e5a0 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a 20 61 72  es: AIX).  ** ar
1e5b0 65 20 75 6e 61 62 6c 65 20 74 6f 20 66 73 79 6e  e unable to fsyn
1e5c0 63 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 73  c a directory, s
1e5d0 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f 72 73 20  o ignore errors 
1e5e0 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e 0a 20 20  on the fsync..  
1e5f0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
1e600 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
1e610 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 29 7b 0a  FILE_DIRSYNC ){.
1e620 20 20 20 20 69 6e 74 20 64 69 72 66 64 3b 0a 20      int dirfd;. 
1e630 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 49 52     OSTRACE(("DIR
1e640 53 59 4e 43 20 25 73 20 28 68 61 76 65 5f 66 75  SYNC %s (have_fu
1e650 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73  llfsync=%d fulls
1e660 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c  ync=%d)\n", pFil
1e670 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20 20 20 20  e->zPath,.      
1e680 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46        HAVE_FULLF
1e690 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63  SYNC, isFullsync
1e6a0 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f  ));.    rc = osO
1e6b0 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70 46 69  penDirectory(pFi
1e6c0 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64 69 72 66  le->zPath, &dirf
1e6d0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
1e6e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e6f0 20 20 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64 69     full_fsync(di
1e700 72 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  rfd, 0, 0);.    
1e710 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
1e720 46 69 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f 4c  File, dirfd, __L
1e730 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73  INE__);.    }els
1e740 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
1e750 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
1e760 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 72 63  OPEN );.      rc
1e770 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1e780 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63    }.    pFile->c
1e790 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e 49  trlFlags &= ~UNI
1e7a0 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20  XFILE_DIRSYNC;. 
1e7b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1e7c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
1e7d0 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74  e an open file t
1e7e0 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69  o a specified si
1e7f0 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ze.*/.static int
1e800 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73 71   unixTruncate(sq
1e810 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1e820 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 75 6e  i64 nByte){.  un
1e830 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1e840 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a  (unixFile *)id;.
1e850 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
1e860 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53  rt( pFile );.  S
1e870 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1e880 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1e890 45 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a  ERR_TRUNCATE );.
1e8a0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65  .  /* If the use
1e8b0 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64  r has configured
1e8c0 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f   a chunk-size fo
1e8d0 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75  r this file, tru
1e8e0 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66  ncate the.  ** f
1e8f0 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63  ile so that it c
1e900 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e  onsists of an in
1e910 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20  teger number of 
1e920 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65  chunks (i.e. the
1e930 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c  .  ** actual fil
1e940 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 65  e size after the
1e950 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62   operation may b
1e960 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  e larger than th
1e970 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a  e requested.  **
1e980 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69   size)..  */.  i
1e990 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  f( pFile->szChun
1e9a0 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65  k>0 ){.    nByte
1e9b0 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69   = ((nByte + pFi
1e9c0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29  le->szChunk - 1)
1e9d0 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29  /pFile->szChunk)
1e9e0 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   * pFile->szChun
1e9f0 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72  k;.  }..  rc = r
1ea00 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
1ea10 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29  pFile->h, nByte)
1ea20 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1ea30 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
1ea40 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
1ea50 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
1ea60 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1ea70 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22  OERR_TRUNCATE, "
1ea80 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c  ftruncate", pFil
1ea90 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  e->zPath);.  }el
1eaa0 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  se{.#ifdef SQLIT
1eab0 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 49  E_DEBUG.    /* I
1eac0 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
1ead0 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f   normal write to
1eae0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
1eaf0 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a   (as opposed to.
1eb00 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68      ** doing a h
1eb10 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1eb20 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74  ack or a write t
1eb30 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65  o some file othe
1eb40 72 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a 20  r than a.    ** 
1eb50 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20  normal database 
1eb60 66 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72 75  file) and we tru
1eb70 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
1eb80 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a 20  o zero length,. 
1eb90 20 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65 63     ** that effec
1eba0 74 69 76 65 6c 79 20 75 70 64 61 74 65 73 20 74  tively updates t
1ebb0 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
1ebc0 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 68  r.  This might h
1ebd0 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68 65  appen.    ** whe
1ebe0 6e 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64 61  n restoring a da
1ebf0 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65  tabase using the
1ec00 20 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f 6d   backup API from
1ec10 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a 20   a zero-length. 
1ec20 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20 20     ** source..  
1ec30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 69    */.    if( pFi
1ec40 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
1ec50 65 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b  e && nByte==0 ){
1ec60 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72  .      pFile->tr
1ec70 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b  ansCntrChng = 1;
1ec80 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  .    }.#endif..#
1ec90 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1eca0 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 2f 2a  AP_SIZE>0.    /*
1ecb0 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73   If the file was
1ecc0 20 6a 75 73 74 20 74 72 75 6e 63 61 74 65 64 20   just truncated 
1ecd0 74 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c 6c 65  to a size smalle
1ece0 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
1ecf0 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6d 61 70 70  ntly.    ** mapp
1ed00 65 64 20 72 65 67 69 6f 6e 2c 20 72 65 64 75 63  ed region, reduc
1ed10 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  e the effective 
1ed20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 61 73 20  mapping size as 
1ed30 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77 69 6c  well. SQLite wil
1ed40 6c 0a 20 20 20 20 2a 2a 20 75 73 65 20 72 65 61  l.    ** use rea
1ed50 64 28 29 20 61 6e 64 20 77 72 69 74 65 28 29 20  d() and write() 
1ed60 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 20 62  to access data b
1ed70 65 79 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e 74  eyond this point
1ed80 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 20 20 0a   from now on.  .
1ed90 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
1eda0 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70  Byte<pFile->mmap
1edb0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 46  Size ){.      pF
1edc0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20  ile->mmapSize = 
1edd0 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a 23 65 6e  nByte;.    }.#en
1ede0 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20  dif..    return 
1edf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
1ee00 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
1ee10 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  e the current si
1ee20 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20  ze of a file in 
1ee30 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  bytes.*/.static 
1ee40 69 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65  int unixFileSize
1ee50 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1ee60 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a  d, i64 *pSize){.
1ee70 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75    int rc;.  stru
1ee80 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61  ct stat buf;.  a
1ee90 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72  ssert( id );.  r
1eea0 63 20 3d 20 6f 73 46 73 74 61 74 28 28 28 75 6e  c = osFstat(((un
1eeb0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20  ixFile*)id)->h, 
1eec0 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74  &buf);.  Simulat
1eed0 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29  eIOError( rc=1 )
1eee0 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
1eef0 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
1ef00 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  rno((unixFile*)i
1ef10 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72  d, errno);.    r
1ef20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1ef30 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20  RR_FSTAT;.  }.  
1ef40 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f  *pSize = buf.st_
1ef50 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e  size;..  /* When
1ef60 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f 2d   opening a zero-
1ef70 73 69 7a 65 20 64 61 74 61 62 61 73 65 2c 20 74  size database, t
1ef80 68 65 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  he findInodeInfo
1ef90 28 29 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a  () procedure.  *
1efa0 2a 20 77 72 69 74 65 73 20 61 20 73 69 6e 67 6c  * writes a singl
1efb0 65 20 62 79 74 65 20 69 6e 74 6f 20 74 68 61 74  e byte into that
1efc0 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74   file in order t
1efd0 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20  o work around a 
1efe0 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  bug.  ** in the 
1eff0 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65 73  OS-X msdos files
1f000 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72  ystem.  In order
1f010 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65   to avoid proble
1f020 6d 73 20 77 69 74 68 20 75 70 70 65 72 0a 20 20  ms with upper.  
1f030 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65 20 6e 65  ** layers, we ne
1f040 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 69  ed to report thi
1f050 73 20 66 69 6c 65 20 73 69 7a 65 20 61 73 20 7a  s file size as z
1f060 65 72 6f 20 65 76 65 6e 20 74 68 6f 75 67 68 20  ero even though 
1f070 69 74 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c 6c  it is.  ** reall
1f080 79 20 31 2e 20 20 20 54 69 63 6b 65 74 20 23 33  y 1.   Ticket #3
1f090 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  260..  */.  if( 
1f0a0 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53 69  *pSize==1 ) *pSi
1f0b0 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74 75  ze = 0;...  retu
1f0c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1f0d0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
1f0e0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1f0f0 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
1f100 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e  PLE__)./*.** Han
1f110 64 6c 65 72 20 66 6f 72 20 70 72 6f 78 79 2d 6c  dler for proxy-l
1f120 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e 74  ocking file-cont
1f130 72 6f 6c 20 76 65 72 62 73 2e 20 20 44 65 66 69  rol verbs.  Defi
1f140 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20 74 68 65  ned below in the
1f150 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63  .** proxying loc
1f160 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a 2a  king division..*
1f170 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
1f180 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  xyFileControl(sq
1f190 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c  lite3_file*,int,
1f1a0 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a  void*);.#endif..
1f1b0 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  /* .** This func
1f1c0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
1f1d0 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 53 51 4c  o handle the SQL
1f1e0 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
1f1f0 49 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d 63 6f 6e  INT .** file-con
1f200 74 72 6f 6c 20 6f 70 65 72 61 74 69 6f 6e 2e 20  trol operation. 
1f210 20 45 6e 6c 61 72 67 65 20 74 68 65 20 64 61 74   Enlarge the dat
1f220 61 62 61 73 65 20 74 6f 20 6e 42 79 74 65 73 20  abase to nBytes 
1f230 69 6e 20 73 69 7a 65 0a 2a 2a 20 28 72 6f 75 6e  in size.** (roun
1f240 64 65 64 20 75 70 20 74 6f 20 74 68 65 20 6e 65  ded up to the ne
1f250 78 74 20 63 68 75 6e 6b 2d 73 69 7a 65 29 2e 20  xt chunk-size). 
1f260 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1f270 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6e   is already.** n
1f280 42 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2c  Bytes or larger,
1f290 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1f2a0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
1f2b0 74 69 63 20 69 6e 74 20 66 63 6e 74 6c 53 69 7a  tic int fcntlSiz
1f2c0 65 48 69 6e 74 28 75 6e 69 78 46 69 6c 65 20 2a  eHint(unixFile *
1f2d0 70 46 69 6c 65 2c 20 69 36 34 20 6e 42 79 74 65  pFile, i64 nByte
1f2e0 29 7b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  ){.  if( pFile->
1f2f0 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20  szChunk>0 ){.   
1f300 20 69 36 34 20 6e 53 69 7a 65 3b 20 20 20 20 20   i64 nSize;     
1f310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f320 2a 20 52 65 71 75 69 72 65 64 20 66 69 6c 65 20  * Required file 
1f330 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75  size */.    stru
1f340 63 74 20 73 74 61 74 20 62 75 66 3b 20 20 20 20  ct stat buf;    
1f350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
1f360 64 20 74 6f 20 68 6f 6c 64 20 72 65 74 75 72 6e  d to hold return
1f370 20 76 61 6c 75 65 73 20 6f 66 20 66 73 74 61 74   values of fstat
1f380 28 29 20 2a 2f 0a 20 20 20 0a 20 20 20 20 69 66  () */.   .    if
1f390 28 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d  ( osFstat(pFile-
1f3a0 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20  >h, &buf) ){.   
1f3b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f3c0 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
1f3d0 20 20 7d 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d    }..    nSize =
1f3e0 20 28 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e   ((nByte+pFile->
1f3f0 73 7a 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69  szChunk-1) / pFi
1f400 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70  le->szChunk) * p
1f410 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20  File->szChunk;. 
1f420 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 28 69 36     if( nSize>(i6
1f430 34 29 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b  4)buf.st_size ){
1f440 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  ..#if defined(HA
1f450 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
1f460 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49  TE) && HAVE_POSI
1f470 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20  X_FALLOCATE.    
1f480 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 62 65    /* The code be
1f490 6c 6f 77 20 69 73 20 68 61 6e 64 6c 69 6e 67 20  low is handling 
1f4a0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
1f4b0 20 6f 66 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28   of osFallocate(
1f4c0 29 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  ) .      ** corr
1f4d0 65 63 74 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c  ectly. posix_fal
1f4e0 6c 6f 63 61 74 65 28 29 20 69 73 20 64 65 66 69  locate() is defi
1f4f0 6e 65 64 20 74 6f 20 22 72 65 74 75 72 6e 73 20  ned to "returns 
1f500 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c  zero on success,
1f510 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e   .      ** or an
1f520 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e   error number on
1f530 20 20 66 61 69 6c 75 72 65 22 2e 20 53 65 65 20    failure". See 
1f540 74 68 65 20 6d 61 6e 70 61 67 65 20 66 6f 72 20  the manpage for 
1f550 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20  details. */.    
1f560 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20 20    int err;.     
1f570 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 65 72 72   do{.        err
1f580 20 3d 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70   = osFallocate(p
1f590 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f  File->h, buf.st_
1f5a0 73 69 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e  size, nSize-buf.
1f5b0 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  st_size);.      
1f5c0 7d 77 68 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e  }while( err==EIN
1f5d0 54 52 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  TR );.      if( 
1f5e0 65 72 72 20 26 26 20 65 72 72 21 3d 45 49 4e 56  err && err!=EINV
1f5f0 41 4c 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  AL ) return SQLI
1f600 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
1f610 23 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20 49  #else.      /* I
1f620 66 20 74 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f  f the OS does no
1f630 74 20 68 61 76 65 20 70 6f 73 69 78 5f 66 61 6c  t have posix_fal
1f640 6c 6f 63 61 74 65 28 29 2c 20 66 61 6b 65 20 69  locate(), fake i
1f650 74 2e 20 57 72 69 74 65 20 61 20 0a 20 20 20 20  t. Write a .    
1f660 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65    ** single byte
1f670 20 74 6f 20 74 68 65 20 6c 61 73 74 20 62 79 74   to the last byt
1f680 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b 20  e in each block 
1f690 74 68 61 74 20 66 61 6c 6c 73 20 65 6e 74 69 72  that falls entir
1f6a0 65 6c 79 0a 20 20 20 20 20 20 2a 2a 20 77 69 74  ely.      ** wit
1f6b0 68 69 6e 20 74 68 65 20 65 78 74 65 6e 64 65 64  hin the extended
1f6c0 20 72 65 67 69 6f 6e 2e 20 54 68 65 6e 2c 20 69   region. Then, i
1f6d0 66 20 72 65 71 75 69 72 65 64 2c 20 61 20 73 69  f required, a si
1f6e0 6e 67 6c 65 20 62 79 74 65 0a 20 20 20 20 20 20  ngle byte.      
1f6f0 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 28 6e 53  ** at offset (nS
1f700 69 7a 65 2d 31 29 2c 20 74 6f 20 73 65 74 20 74  ize-1), to set t
1f710 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
1f720 69 6c 65 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20  ile correctly.. 
1f730 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
1f740 61 20 73 69 6d 69 6c 61 72 20 74 65 63 68 6e 69  a similar techni
1f750 71 75 65 20 74 6f 20 74 68 61 74 20 75 73 65 64  que to that used
1f760 20 62 79 20 67 6c 69 62 63 20 6f 6e 20 73 79 73   by glibc on sys
1f770 74 65 6d 73 0a 20 20 20 20 20 20 2a 2a 20 74 68  tems.      ** th
1f780 61 74 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61  at do not have a
1f790 20 72 65 61 6c 20 66 61 6c 6c 6f 63 61 74 65 28   real fallocate(
1f7a0 29 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f  ) call..      */
1f7b0 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b 20  .      int nBlk 
1f7c0 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a 65  = buf.st_blksize
1f7d0 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74 65  ;  /* File-syste
1f7e0 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a  m block size */.
1f7f0 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74 65        int nWrite
1f800 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1f810 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1f820 79 74 65 73 20 77 72 69 74 74 65 6e 20 62 79 20  ytes written by 
1f830 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a  seekAndWrite */.
1f840 20 20 20 20 20 20 69 36 34 20 69 57 72 69 74 65        i64 iWrite
1f850 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f860 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65 74    /* Next offset
1f870 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
1f880 0a 20 20 20 20 20 20 69 57 72 69 74 65 20 3d 20  .      iWrite = 
1f890 28 62 75 66 2e 73 74 5f 73 69 7a 65 2f 6e 42 6c  (buf.st_size/nBl
1f8a0 6b 29 2a 6e 42 6c 6b 20 2b 20 6e 42 6c 6b 20 2d  k)*nBlk + nBlk -
1f8b0 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   1;.      assert
1f8c0 28 20 69 57 72 69 74 65 3e 3d 62 75 66 2e 73 74  ( iWrite>=buf.st
1f8d0 5f 73 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  _size );.      a
1f8e0 73 73 65 72 74 28 20 28 28 69 57 72 69 74 65 2b  ssert( ((iWrite+
1f8f0 31 29 25 6e 42 6c 6b 29 3d 3d 30 20 29 3b 0a 20  1)%nBlk)==0 );. 
1f900 20 20 20 20 20 66 6f 72 28 2f 2a 6e 6f 2d 6f 70       for(/*no-op
1f910 2a 2f 3b 20 69 57 72 69 74 65 3c 6e 53 69 7a 65  */; iWrite<nSize
1f920 2b 6e 42 6c 6b 2d 31 3b 20 69 57 72 69 74 65 2b  +nBlk-1; iWrite+
1f930 3d 6e 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 20  =nBlk ){.       
1f940 20 69 66 28 20 69 57 72 69 74 65 3e 3d 6e 53 69   if( iWrite>=nSi
1f950 7a 65 20 29 20 69 57 72 69 74 65 20 3d 20 6e 53  ze ) iWrite = nS
1f960 69 7a 65 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  ize - 1;.       
1f970 20 6e 57 72 69 74 65 20 3d 20 73 65 65 6b 41 6e   nWrite = seekAn
1f980 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 69 57  dWrite(pFile, iW
1f990 72 69 74 65 2c 20 22 22 2c 20 31 29 3b 0a 20 20  rite, "", 1);.  
1f9a0 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74 65        if( nWrite
1f9b0 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=1 ) return SQL
1f9c0 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
1f9d0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1f9e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 20 53      }.  }..#if S
1f9f0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
1fa00 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 69 6c  IZE>0.  if( pFil
1fa10 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30  e->mmapSizeMax>0
1fa20 20 26 26 20 6e 42 79 74 65 3e 70 46 69 6c 65 2d   && nByte>pFile-
1fa30 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
1fa40 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 66 28   int rc;.    if(
1fa50 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3c   pFile->szChunk<
1fa60 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1fa70 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
1fa80 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65  (pFile->h, nByte
1fa90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  ) ){.        sto
1faa0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
1fab0 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
1fac0 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
1fad0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1fae0 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66  ERR_TRUNCATE, "f
1faf0 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65  truncate", pFile
1fb00 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
1fb10 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  }.    }..    rc 
1fb20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46  = unixMapfile(pF
1fb30 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ile, nByte);.   
1fb40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1fb50 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
1fb60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1fb70 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73  *.** If *pArg is
1fb80 20 69 6e 69 74 69 61 6c 6c 79 20 6e 65 67 61 74   initially negat
1fb90 69 76 65 20 74 68 65 6e 20 74 68 69 73 20 69 73  ive then this is
1fba0 20 61 20 71 75 65 72 79 2e 20 20 53 65 74 20 2a   a query.  Set *
1fbb0 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20  pArg to.** 1 or 
1fbc0 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  0 depending on w
1fbd0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62 69  hether or not bi
1fbe0 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d  t mask of pFile-
1fbf0 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73 65  >ctrlFlags is se
1fc00 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72  t..**.** If *pAr
1fc10 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68 65  g is 0 or 1, the
1fc20 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20 74  n clear or set t
1fc30 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20 70  he mask bit of p
1fc40 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e  File->ctrlFlags.
1fc50 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1fc60 75 6e 69 78 4d 6f 64 65 42 69 74 28 75 6e 69 78  unixModeBit(unix
1fc70 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73  File *pFile, uns
1fc80 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c  igned char mask,
1fc90 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69   int *pArg){.  i
1fca0 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20  f( *pArg<0 ){.  
1fcb0 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65    *pArg = (pFile
1fcc0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61  ->ctrlFlags & ma
1fcd0 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20  sk)!=0;.  }else 
1fce0 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29  if( (*pArg)==0 )
1fcf0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
1fd00 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b  lFlags &= ~mask;
1fd10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
1fd20 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
1fd30 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = mask;.  }.}../
1fd40 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
1fd50 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  ation */.static 
1fd60 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e  int unixGetTempn
1fd70 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68  ame(int nBuf, ch
1fd80 61 72 20 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a  ar *zBuf);../*.*
1fd90 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e  * Information an
1fda0 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20  d control of an 
1fdb0 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65  open file handle
1fdc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1fdd0 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  unixFileControl(
1fde0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1fdf0 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
1fe00 70 41 72 67 29 7b 0a 20 20 75 6e 69 78 46 69 6c  pArg){.  unixFil
1fe10 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1fe20 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69 74  File*)id;.  swit
1fe30 63 68 28 20 6f 70 20 29 7b 0a 23 69 66 20 64 65  ch( op ){.#if de
1fe40 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29  fined(__linux__)
1fe50 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
1fe60 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f  TE_ENABLE_BATCH_
1fe70 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 0a 20 20  ATOMIC_WRITE).  
1fe80 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1fe90 4e 54 4c 5f 42 45 47 49 4e 5f 41 54 4f 4d 49 43  NTL_BEGIN_ATOMIC
1fea0 5f 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20  _WRITE: {.      
1feb0 69 6e 74 20 72 63 20 3d 20 6f 73 49 6f 63 74 6c  int rc = osIoctl
1fec0 28 70 46 69 6c 65 2d 3e 68 2c 20 46 32 46 53 5f  (pFile->h, F2FS_
1fed0 49 4f 43 5f 53 54 41 52 54 5f 41 54 4f 4d 49 43  IOC_START_ATOMIC
1fee0 5f 57 52 49 54 45 29 3b 0a 20 20 20 20 20 20 72  _WRITE);.      r
1fef0 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54  eturn rc ? SQLIT
1ff00 45 5f 49 4f 45 52 52 5f 42 45 47 49 4e 5f 41 54  E_IOERR_BEGIN_AT
1ff10 4f 4d 49 43 20 3a 20 53 51 4c 49 54 45 5f 4f 4b  OMIC : SQLITE_OK
1ff20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1ff30 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 4f   SQLITE_FCNTL_CO
1ff40 4d 4d 49 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54  MMIT_ATOMIC_WRIT
1ff50 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  E: {.      int r
1ff60 63 20 3d 20 6f 73 49 6f 63 74 6c 28 70 46 69 6c  c = osIoctl(pFil
1ff70 65 2d 3e 68 2c 20 46 32 46 53 5f 49 4f 43 5f 43  e->h, F2FS_IOC_C
1ff80 4f 4d 4d 49 54 5f 41 54 4f 4d 49 43 5f 57 52 49  OMMIT_ATOMIC_WRI
1ff90 54 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  TE);.      retur
1ffa0 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 49 4f  n rc ? SQLITE_IO
1ffb0 45 52 52 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d 49  ERR_COMMIT_ATOMI
1ffc0 43 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  C : SQLITE_OK;. 
1ffd0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1ffe0 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 4f 4c 4c 42  LITE_FCNTL_ROLLB
1fff0 41 43 4b 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  ACK_ATOMIC_WRITE
20000 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  : {.      int rc
20010 20 3d 20 6f 73 49 6f 63 74 6c 28 70 46 69 6c 65   = osIoctl(pFile
20020 2d 3e 68 2c 20 46 32 46 53 5f 49 4f 43 5f 41 42  ->h, F2FS_IOC_AB
20030 4f 52 54 5f 56 4f 4c 41 54 49 4c 45 5f 57 52 49  ORT_VOLATILE_WRI
20040 54 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  TE);.      retur
20050 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 49 4f  n rc ? SQLITE_IO
20060 45 52 52 5f 52 4f 4c 4c 42 41 43 4b 5f 41 54 4f  ERR_ROLLBACK_ATO
20070 4d 49 43 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 3b  MIC : SQLITE_OK;
20080 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
20090 20 5f 5f 6c 69 6e 75 78 5f 5f 20 26 26 20 53 51   __linux__ && SQ
200a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43  LITE_ENABLE_BATC
200b0 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 2a  H_ATOMIC_WRITE *
200c0 2f 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  /..    case SQLI
200d0 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41  TE_FCNTL_LOCKSTA
200e0 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e  TE: {.      *(in
200f0 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d  t*)pArg = pFile-
20100 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20  >eFileLock;.    
20110 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20120 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
20130 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
20140 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20  LAST_ERRNO: {.  
20150 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
20160 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  = pFile->lastErr
20170 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  no;.      return
20180 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
20190 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
201a0 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  E_FCNTL_CHUNK_SI
201b0 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ZE: {.      pFil
201c0 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69  e->szChunk = *(i
201d0 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  nt *)pArg;.     
201e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
201f0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
20200 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
20210 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20  IZE_HINT: {.    
20220 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
20230 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
20240 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
20250 72 63 20 3d 20 66 63 6e 74 6c 53 69 7a 65 48 69  rc = fcntlSizeHi
20260 6e 74 28 70 46 69 6c 65 2c 20 2a 28 69 36 34 20  nt(pFile, *(i64 
20270 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 53  *)pArg);.      S
20280 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
20290 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 72  nign(0);.      r
202a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
202b0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
202c0 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41  FCNTL_PERSIST_WA
202d0 4c 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d  L: {.      unixM
202e0 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55 4e  odeBit(pFile, UN
202f0 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57  IXFILE_PERSIST_W
20300 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b  AL, (int*)pArg);
20310 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
20320 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
20330 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
20340 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f  CNTL_POWERSAFE_O
20350 56 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20 20  VERWRITE: {.    
20360 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46    unixModeBit(pF
20370 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 53  ile, UNIXFILE_PS
20380 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b  OW, (int*)pArg);
20390 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
203a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
203b0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
203c0 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a  CNTL_VFSNAME: {.
203d0 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70        *(char**)p
203e0 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Arg = sqlite3_mp
203f0 72 69 6e 74 66 28 22 25 73 22 2c 20 70 46 69 6c  rintf("%s", pFil
20400 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b  e->pVfs->zName);
20410 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
20420 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
20430 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
20440 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d  CNTL_TEMPFILENAM
20450 45 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20  E: {.      char 
20460 2a 7a 54 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  *zTFile = sqlite
20470 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 70 46 69 6c  3_malloc64( pFil
20480 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  e->pVfs->mxPathn
20490 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ame );.      if(
204a0 20 7a 54 46 69 6c 65 20 29 7b 0a 20 20 20 20 20   zTFile ){.     
204b0 20 20 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61     unixGetTempna
204c0 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e  me(pFile->pVfs->
204d0 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54 46 69  mxPathname, zTFi
204e0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 28 63  le);.        *(c
204f0 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a 54 46  har**)pArg = zTF
20500 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ile;.      }.   
20510 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20520 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
20530 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
20540 5f 48 41 53 5f 4d 4f 56 45 44 3a 20 7b 0a 20 20  _HAS_MOVED: {.  
20550 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
20560 3d 20 66 69 6c 65 48 61 73 4d 6f 76 65 64 28 70  = fileHasMoved(p
20570 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 65 74  File);.      ret
20580 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
20590 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
205a0 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c 4b 5f  TE_ENABLE_SETLK_
205b0 54 49 4d 45 4f 55 54 0a 20 20 20 20 63 61 73 65  TIMEOUT.    case
205c0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f   SQLITE_FCNTL_LO
205d0 43 4b 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a 20 20  CK_TIMEOUT: {.  
205e0 20 20 20 20 70 46 69 6c 65 2d 3e 69 42 75 73 79      pFile->iBusy
205f0 54 69 6d 65 6f 75 74 20 3d 20 2a 28 69 6e 74 2a  Timeout = *(int*
20600 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74  )pArg;.      ret
20610 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
20620 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
20630 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
20640 53 49 5a 45 3e 30 0a 20 20 20 20 63 61 73 65 20  SIZE>0.    case 
20650 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41  SQLITE_FCNTL_MMA
20660 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  P_SIZE: {.      
20670 69 36 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a  i64 newLimit = *
20680 28 69 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20  (i64*)pArg;.    
20690 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
206a0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20  E_OK;.      if( 
206b0 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33  newLimit>sqlite3
206c0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d  GlobalConfig.mxM
206d0 6d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  map ){.        n
206e0 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  ewLimit = sqlite
206f0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78  3GlobalConfig.mx
20700 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Mmap;.      }.. 
20710 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75       /* The valu
20720 65 20 6f 66 20 6e 65 77 4c 69 6d 69 74 20 6d 61  e of newLimit ma
20730 79 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20  y be eventually 
20740 63 61 73 74 20 74 6f 20 28 73 69 7a 65 5f 74 29  cast to (size_t)
20750 20 61 6e 64 20 70 61 73 73 65 64 0a 20 20 20 20   and passed.    
20760 20 20 2a 2a 20 74 6f 20 6d 6d 61 70 28 29 2e 20    ** to mmap(). 
20770 52 65 73 74 72 69 63 74 20 69 74 73 20 76 61 6c  Restrict its val
20780 75 65 20 74 6f 20 32 47 42 20 69 66 20 28 73 69  ue to 2GB if (si
20790 7a 65 5f 74 29 20 69 73 20 6e 6f 74 20 61 74 20  ze_t) is not at 
207a0 6c 65 61 73 74 20 61 0a 20 20 20 20 20 20 2a 2a  least a.      **
207b0 20 36 34 2d 62 69 74 20 74 79 70 65 2e 20 2a 2f   64-bit type. */
207c0 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69  .      if( newLi
207d0 6d 69 74 3e 30 20 26 26 20 73 69 7a 65 6f 66 28  mit>0 && sizeof(
207e0 73 69 7a 65 5f 74 29 3c 38 20 29 7b 0a 20 20 20  size_t)<8 ){.   
207f0 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20       newLimit = 
20800 28 6e 65 77 4c 69 6d 69 74 20 26 20 30 78 37 46  (newLimit & 0x7F
20810 46 46 46 46 46 46 29 3b 0a 20 20 20 20 20 20 7d  FFFFFF);.      }
20820 0a 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70  ..      *(i64*)p
20830 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  Arg = pFile->mma
20840 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20  pSizeMax;.      
20850 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20  if( newLimit>=0 
20860 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69  && newLimit!=pFi
20870 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  le->mmapSizeMax 
20880 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68  && pFile->nFetch
20890 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Out==0 ){.      
208a0 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
208b0 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b  eMax = newLimit;
208c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69  .        if( pFi
208d0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29  le->mmapSize>0 )
208e0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 78  {.          unix
208f0 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29  Unmapfile(pFile)
20900 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
20910 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69   unixMapfile(pFi
20920 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  le, -1);.       
20930 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
20940 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
20950 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  }.#endif.#ifdef 
20960 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
20970 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61   /* The pager ca
20980 6c 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20  lls this method 
20990 74 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69  to signal that i
209a0 74 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a  t has done.    *
209b0 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64  * a rollback and
209c0 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
209d0 73 65 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  se is therefore 
209e0 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20  unchanged and.  
209f0 20 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74    ** it hence it
20a00 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74   is OK for the t
20a10 72 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67  ransaction chang
20a20 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a  e counter to be.
20a30 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64      ** unchanged
20a40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
20a50 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  e SQLITE_FCNTL_D
20a60 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20  B_UNCHANGED: {. 
20a70 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a       ((unixFile*
20a80 29 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d  )id)->dbUpdate =
20a90 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
20aa0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
20ab0 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  }.#endif.#if SQL
20ac0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
20ad0 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
20ae0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
20af0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
20b00 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  CNTL_SET_LOCKPRO
20b10 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65  XYFILE:.    case
20b20 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45   SQLITE_FCNTL_GE
20b30 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a  T_LOCKPROXYFILE:
20b40 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
20b50 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c  proxyFileControl
20b60 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20  (id,op,pArg);.  
20b70 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
20b80 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
20b90 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
20ba0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
20bb0 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
20bc0 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
20bd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46 64  .}../*.** If pFd
20be0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  ->sectorSize is 
20bf0 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 74 68  non-zero when th
20c00 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
20c10 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 0a 2a  alled, it is a.*
20c20 2a 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  * no-op. Otherwi
20c30 73 65 2c 20 74 68 65 20 76 61 6c 75 65 73 20 6f  se, the values o
20c40 66 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a  f pFd->sectorSiz
20c50 65 20 61 6e 64 20 0a 2a 2a 20 70 46 64 2d 3e 64  e and .** pFd->d
20c60 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
20c70 74 69 63 73 20 61 72 65 20 73 65 74 20 61 63 63  tics are set acc
20c80 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 66 69  ording to the fi
20c90 6c 65 2d 73 79 73 74 65 6d 20 0a 2a 2a 20 63 68  le-system .** ch
20ca0 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 20 0a  aracteristics. .
20cb0 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  **.** There are 
20cc0 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  two versions of 
20cd0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f  this function. O
20ce0 6e 65 20 66 6f 72 20 51 4e 58 20 61 6e 64 20 6f  ne for QNX and o
20cf0 6e 65 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 6f 74  ne for all.** ot
20d00 68 65 72 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a  her systems..*/.
20d10 23 69 66 6e 64 65 66 20 5f 5f 51 4e 58 4e 54 4f  #ifndef __QNXNTO
20d20 5f 5f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  __.static void s
20d30 65 74 44 65 76 69 63 65 43 68 61 72 61 63 74 65  etDeviceCharacte
20d40 72 69 73 74 69 63 73 28 75 6e 69 78 46 69 6c 65  ristics(unixFile
20d50 20 2a 70 46 64 29 7b 0a 20 20 61 73 73 65 72 74   *pFd){.  assert
20d60 28 20 70 46 64 2d 3e 64 65 76 69 63 65 43 68 61  ( pFd->deviceCha
20d70 72 61 63 74 65 72 69 73 74 69 63 73 3d 3d 30 20  racteristics==0 
20d80 7c 7c 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69  || pFd->sectorSi
20d90 7a 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ze!=0 );.  if( p
20da0 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3d 3d  Fd->sectorSize==
20db0 30 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  0 ){.#if defined
20dc0 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64  (__linux__) && d
20dd0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
20de0 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49  ABLE_BATCH_ATOMI
20df0 43 5f 57 52 49 54 45 29 0a 20 20 20 20 69 6e 74  C_WRITE).    int
20e00 20 72 65 73 3b 0a 20 20 20 20 75 33 32 20 66 20   res;.    u32 f 
20e10 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  = 0;..    /* Che
20e20 63 6b 20 66 6f 72 20 73 75 70 70 6f 72 74 20 66  ck for support f
20e30 6f 72 20 46 32 46 53 20 61 74 6f 6d 69 63 20 62  or F2FS atomic b
20e40 61 74 63 68 20 77 72 69 74 65 73 2e 20 2a 2f 0a  atch writes. */.
20e50 20 20 20 20 72 65 73 20 3d 20 6f 73 49 6f 63 74      res = osIoct
20e60 6c 28 70 46 64 2d 3e 68 2c 20 46 32 46 53 5f 49  l(pFd->h, F2FS_I
20e70 4f 43 5f 47 45 54 5f 46 45 41 54 55 52 45 53 2c  OC_GET_FEATURES,
20e80 20 26 66 29 3b 0a 20 20 20 20 69 66 28 20 72 65   &f);.    if( re
20e90 73 3d 3d 30 20 26 26 20 28 66 20 26 20 46 32 46  s==0 && (f & F2F
20ea0 53 5f 46 45 41 54 55 52 45 5f 41 54 4f 4d 49 43  S_FEATURE_ATOMIC
20eb0 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20  _WRITE) ){.     
20ec0 20 70 46 64 2d 3e 64 65 76 69 63 65 43 68 61 72   pFd->deviceChar
20ed0 61 63 74 65 72 69 73 74 69 63 73 20 3d 20 53 51  acteristics = SQ
20ee0 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41 54 43 48  LITE_IOCAP_BATCH
20ef0 5f 41 54 4f 4d 49 43 3b 0a 20 20 20 20 7d 0a 23  _ATOMIC;.    }.#
20f00 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69 6e 75 78  endif /* __linux
20f10 5f 5f 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  __ && SQLITE_ENA
20f20 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  BLE_BATCH_ATOMIC
20f30 5f 57 52 49 54 45 20 2a 2f 0a 0a 20 20 20 20 2f  _WRITE */..    /
20f40 2a 20 53 65 74 20 74 68 65 20 50 4f 57 45 52 53  * Set the POWERS
20f50 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 66 6c  AFE_OVERWRITE fl
20f60 61 67 20 69 66 20 72 65 71 75 65 73 74 65 64 2e  ag if requested.
20f70 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 64 2d   */.    if( pFd-
20f80 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
20f90 58 46 49 4c 45 5f 50 53 4f 57 20 29 7b 0a 20 20  XFILE_PSOW ){.  
20fa0 20 20 20 20 70 46 64 2d 3e 64 65 76 69 63 65 43      pFd->deviceC
20fb0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 7c  haracteristics |
20fc0 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  = SQLITE_IOCAP_P
20fd0 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
20fe0 54 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  TE;.    }..    p
20ff0 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  Fd->sectorSize =
21000 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
21010 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d  SECTOR_SIZE;.  }
21020 0a 7d 0a 23 65 6c 73 65 0a 23 69 6e 63 6c 75 64  .}.#else.#includ
21030 65 20 3c 73 79 73 2f 64 63 6d 64 5f 62 6c 6b 2e  e <sys/dcmd_blk.
21040 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
21050 2f 73 74 61 74 76 66 73 2e 68 3e 0a 73 74 61 74  /statvfs.h>.stat
21060 69 63 20 76 6f 69 64 20 73 65 74 44 65 76 69 63  ic void setDevic
21070 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
21080 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
21090 29 7b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  ){.  if( pFile->
210a0 73 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20 30 20  sectorSize == 0 
210b0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  ){.    struct st
210c0 61 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20  atvfs fsInfo;.  
210d0 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 65 74       .    /* Set
210e0 20 64 65 66 61 75 6c 74 73 20 66 6f 72 20 6e 6f   defaults for no
210f0 6e 2d 73 75 70 70 6f 72 74 65 64 20 66 69 6c 65  n-supported file
21100 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20 20 70  systems */.    p
21110 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
21120 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
21130 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  T_SECTOR_SIZE;. 
21140 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
21150 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
21160 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 66 73 74  = 0;.    if( fst
21170 61 74 76 66 73 28 70 46 69 6c 65 2d 3e 68 2c 20  atvfs(pFile->h, 
21180 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29  &fsInfo) == -1 )
21190 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b   {.      return;
211a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
211b0 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66  !strcmp(fsInfo.f
211c0 5f 62 61 73 65 74 79 70 65 2c 20 22 74 6d 70 22  _basetype, "tmp"
211d0 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ) ) {.      pFil
211e0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  e->sectorSize = 
211f0 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a  fsInfo.f_bsize;.
21200 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76        pFile->dev
21210 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
21220 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c  cs =.        SQL
21230 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
21240 34 4b 20 7c 20 20 20 20 20 20 20 2f 2a 20 41 6c  4K |       /* Al
21250 6c 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  l ram filesystem
21260 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d   writes are atom
21270 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  ic */.        SQ
21280 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
21290 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67  APPEND |    /* g
212a0 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20  rowing the file 
212b0 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
212c0 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20  ntil.           
212d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212e0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
212f0 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73  e write succeeds
21300 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
21310 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
21320 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65  IAL |     /* The
21330 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
21340 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68  has no write beh
21350 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ind.            
21360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21370 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
21380 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f  it is ordered */
21390 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
213a0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73 74 72  }else if( strstr
213b0 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79  (fsInfo.f_basety
213c0 70 65 2c 20 22 65 74 66 73 22 29 20 29 7b 0a 20  pe, "etfs") ){. 
213d0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74       pFile->sect
213e0 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e  orSize = fsInfo.
213f0 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70  f_bsize;.      p
21400 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
21410 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20  acteristics =.  
21420 20 20 20 20 20 20 2f 2a 20 65 74 66 73 20 63 6c        /* etfs cl
21430 75 73 74 65 72 20 73 69 7a 65 20 77 72 69 74 65  uster size write
21440 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a  s are atomic */.
21450 20 20 20 20 20 20 20 20 28 70 46 69 6c 65 2d 3e          (pFile->
21460 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32  sectorSize / 512
21470 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   * SQLITE_IOCAP_
21480 41 54 4f 4d 49 43 35 31 32 29 20 7c 0a 20 20 20  ATOMIC512) |.   
21490 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
214a0 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20  P_SAFE_APPEND | 
214b0 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68     /* growing th
214c0 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
214d0 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20  occur until.    
214e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21500 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73    ** the write s
21510 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20  ucceeds */.     
21520 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
21530 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20  SEQUENTIAL |    
21540 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65   /* The ram file
21550 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72  system has no wr
21560 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20  ite behind.     
21570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21590 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64   ** so it is ord
215a0 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
215b0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
215c0 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e   !strcmp(fsInfo.
215d0 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71 6e 78  f_basetype, "qnx
215e0 36 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  6") ){.      pFi
215f0 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
21600 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
21610 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
21620 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
21630 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51  ics =.        SQ
21640 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
21650 43 20 7c 20 20 20 20 20 20 20 20 20 2f 2a 20 41  C |         /* A
21660 6c 6c 20 66 69 6c 65 73 79 73 74 65 6d 20 77 72  ll filesystem wr
21670 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20  ites are atomic 
21680 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  */.        SQLIT
21690 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
216a0 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77  END |    /* grow
216b0 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65  ing the file doe
216c0 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69  s not occur unti
216d0 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l.              
216e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216f0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77          ** the w
21700 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f  rite succeeds */
21710 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
21720 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
21730 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61   |     /* The ra
21740 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73  m filesystem has
21750 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64   no write behind
21760 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21780 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20         ** so it 
21790 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20  is ordered */.  
217a0 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c        0;.    }el
217b0 73 65 20 69 66 28 20 21 73 74 72 63 6d 70 28 66  se if( !strcmp(f
217c0 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65  sInfo.f_basetype
217d0 2c 20 22 71 6e 78 34 22 29 20 29 7b 0a 20 20 20  , "qnx4") ){.   
217e0 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72     pFile->sector
217f0 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f  Size = fsInfo.f_
21800 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69  bsize;.      pFi
21810 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
21820 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20  teristics =.    
21830 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73      /* full bits
21840 65 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66 72  et of atomics fr
21850 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73 69  om max sector si
21860 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a  ze and smaller *
21870 2f 0a 20 20 20 20 20 20 20 20 28 28 70 46 69 6c  /.        ((pFil
21880 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20  e->sectorSize / 
21890 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43  512 * SQLITE_IOC
218a0 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c  AP_ATOMIC512) <<
218b0 20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20 20   1) - 2 |.      
218c0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
218d0 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20  EQUENTIAL |     
218e0 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73  /* The ram files
218f0 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69  ystem has no wri
21900 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20  te behind.      
21910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21930 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65  ** so it is orde
21940 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30  red */.        0
21950 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
21960 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f  strstr(fsInfo.f_
21970 62 61 73 65 74 79 70 65 2c 20 22 64 6f 73 22 29  basetype, "dos")
21980 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
21990 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73  >sectorSize = fs
219a0 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20  Info.f_bsize;.  
219b0 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
219c0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
219d0 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 75   =.        /* fu
219e0 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74 6f  ll bitset of ato
219f0 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73 65  mics from max se
21a00 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73 6d  ctor size and sm
21a10 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  aller */.       
21a20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72   ((pFile->sector
21a30 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c  Size / 512 * SQL
21a40 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
21a50 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c  512) << 1) - 2 |
21a60 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
21a70 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
21a80 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61   |     /* The ra
21a90 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73  m filesystem has
21aa0 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64   no write behind
21ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ad0 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20         ** so it 
21ae0 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20  is ordered */.  
21af0 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c        0;.    }el
21b00 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
21b10 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
21b20 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20  istics =.       
21b30 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
21b40 4f 4d 49 43 35 31 32 20 7c 20 20 20 20 20 20 2f  OMIC512 |      /
21b50 2a 20 62 6c 6f 63 6b 73 20 61 72 65 20 61 74 6f  * blocks are ato
21b60 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  mic */.        S
21b70 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
21b80 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20  _APPEND |    /* 
21b90 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  growing the file
21ba0 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
21bb0 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20  until.          
21bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bd0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
21be0 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64  he write succeed
21bf0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a  s */.        0;.
21c00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4c      }.  }.  /* L
21c10 61 73 74 20 63 68 61 6e 63 65 20 76 65 72 69 66  ast chance verif
21c20 69 63 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  ication.  If the
21c30 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 6e   sector size isn
21c40 27 74 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66  't a multiple of
21c50 20 35 31 32 0a 20 20 2a 2a 20 74 68 65 6e 20 69   512.  ** then i
21c60 74 20 69 73 6e 27 74 20 76 61 6c 69 64 2e 2a 2f  t isn't valid.*/
21c70 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 65  .  if( pFile->se
21c80 63 74 6f 72 53 69 7a 65 20 25 20 35 31 32 20 21  ctorSize % 512 !
21c90 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  = 0 ){.    pFile
21ca0 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
21cb0 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20 20  ristics = 0;.   
21cc0 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
21cd0 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ze = SQLITE_DEFA
21ce0 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  ULT_SECTOR_SIZE;
21cf0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
21d00 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
21d10 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62  sector size in b
21d20 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65  ytes of the unde
21d30 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76  rlying block dev
21d40 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ice for.** the s
21d50 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54  pecified file. T
21d60 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c  his is almost al
21d70 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20  ways 512 bytes, 
21d80 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61  but may be.** la
21d90 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65  rger for some de
21da0 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  vices..**.** SQL
21db0 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73  ite code assumes
21dc0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
21dd0 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61  annot fail. It a
21de0 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74  lso assumes that
21df0 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73  .** if two files
21e00 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20   are created in 
21e10 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79  the same file-sy
21e20 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28  stem directory (
21e30 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61  i.e..** a databa
21e40 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e  se and its journ
21e50 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68  al file) that th
21e60 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69  e sector size wi
21e70 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d  ll be the.** sam
21e80 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73  e for both..*/.s
21e90 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65  tatic int unixSe
21ea0 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
21eb0 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
21ec0 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75  ixFile *pFd = (u
21ed0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  nixFile*)id;.  s
21ee0 65 74 44 65 76 69 63 65 43 68 61 72 61 63 74 65  etDeviceCharacte
21ef0 72 69 73 74 69 63 73 28 70 46 64 29 3b 0a 20 20  ristics(pFd);.  
21f00 72 65 74 75 72 6e 20 70 46 64 2d 3e 73 65 63 74  return pFd->sect
21f10 6f 72 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  orSize;.}../*.**
21f20 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76 69   Return the devi
21f30 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
21f40 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e  cs for the file.
21f50 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 56 46 53 20  .**.** This VFS 
21f60 69 73 20 73 65 74 20 75 70 20 74 6f 20 72 65 74  is set up to ret
21f70 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  urn SQLITE_IOCAP
21f80 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
21f90 52 49 54 45 20 62 79 20 64 65 66 61 75 6c 74 2e  RITE by default.
21fa0 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61  .** However, tha
21fb0 74 20 63 68 6f 69 63 65 20 69 73 20 63 6f 6e 74  t choice is cont
21fc0 72 6f 76 65 72 73 69 61 6c 20 73 69 6e 63 65 20  roversial since 
21fd0 74 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20  technically the 
21fe0 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 66 69  underlying.** fi
21ff0 6c 65 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e  le system does n
22000 6f 74 20 61 6c 77 61 79 73 20 70 72 6f 76 69 64  ot always provid
22010 65 20 70 6f 77 65 72 73 61 66 65 20 6f 76 65 72  e powersafe over
22020 77 72 69 74 65 73 2e 20 20 28 49 6e 20 6f 74 68  writes.  (In oth
22030 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 66 74  er.** words, aft
22040 65 72 20 61 20 70 6f 77 65 72 2d 6c 6f 73 73 20  er a power-loss 
22050 65 76 65 6e 74 2c 20 70 61 72 74 73 20 6f 66 20  event, parts of 
22060 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77 65  the file that we
22070 72 65 20 6e 65 76 65 72 0a 2a 2a 20 77 72 69 74  re never.** writ
22080 74 65 6e 20 6d 69 67 68 74 20 65 6e 64 20 75 70  ten might end up
22090 20 62 65 69 6e 67 20 61 6c 74 65 72 65 64 2e 29   being altered.)
220a0 20 20 48 6f 77 65 76 65 72 2c 20 6e 6f 6e 2d 50    However, non-P
220b0 53 4f 57 20 62 65 68 61 76 69 6f 72 20 69 73 20  SOW behavior is 
220c0 76 65 72 79 2c 0a 2a 2a 20 76 65 72 79 20 72 61  very,.** very ra
220d0 72 65 2e 20 20 41 6e 64 20 61 73 73 65 72 74 69  re.  And asserti
220e0 6e 67 20 50 53 4f 57 20 6d 61 6b 65 73 20 61 20  ng PSOW makes a 
220f0 6c 61 72 67 65 20 72 65 64 75 63 74 69 6f 6e 20  large reduction 
22100 69 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a  in the amount.**
22110 20 6f 66 20 72 65 71 75 69 72 65 64 20 49 2f 4f   of required I/O
22120 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e 67 2c   for journaling,
22130 20 73 69 6e 63 65 20 61 20 6c 6f 74 20 6f 66 20   since a lot of 
22140 70 61 64 64 69 6e 67 20 69 73 20 65 6c 69 6d 69  padding is elimi
22150 6e 61 74 65 64 2e 0a 2a 2a 20 20 48 65 6e 63 65  nated..**  Hence
22160 2c 20 77 68 69 6c 65 20 50 4f 57 45 52 53 41 46  , while POWERSAF
22170 45 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20 6f  E_OVERWRITE is o
22180 6e 20 62 79 20 64 65 66 61 75 6c 74 2c 20 74 68  n by default, th
22190 65 72 65 20 69 73 20 61 20 66 69 6c 65 2d 63 6f  ere is a file-co
221a0 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c 61 62  ntrol.** availab
221b0 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66  le to turn it of
221c0 66 20 61 6e 64 20 55 52 49 20 71 75 65 72 79 20  f and URI query 
221d0 70 61 72 61 6d 65 74 65 72 20 61 76 61 69 6c 61  parameter availa
221e0 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f  ble to turn it o
221f0 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ff..*/.static in
22200 74 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72  t unixDeviceChar
22210 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69  acteristics(sqli
22220 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
22230 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d   unixFile *pFd =
22240 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
22250 20 20 73 65 74 44 65 76 69 63 65 43 68 61 72 61    setDeviceChara
22260 63 74 65 72 69 73 74 69 63 73 28 70 46 64 29 3b  cteristics(pFd);
22270 0a 20 20 72 65 74 75 72 6e 20 70 46 64 2d 3e 64  .  return pFd->d
22280 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
22290 74 69 63 73 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  tics;.}..#if !de
222a0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
222b0 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45  T_WAL) || SQLITE
222c0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
222d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
222e0 68 65 20 73 79 73 74 65 6d 20 70 61 67 65 20 73  he system page s
222f0 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ize..**.** This 
22300 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
22310 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 64 69  not be called di
22320 72 65 63 74 6c 79 20 62 79 20 6f 74 68 65 72 20  rectly by other 
22330 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c  code in this fil
22340 65 2e 20 0a 2a 2a 20 49 6e 73 74 65 61 64 2c 20  e. .** Instead, 
22350 69 74 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  it should be cal
22360 6c 65 64 20 76 69 61 20 6d 61 63 72 6f 20 6f 73  led via macro os
22370 47 65 74 70 61 67 65 73 69 7a 65 28 29 2e 0a 2a  Getpagesize()..*
22380 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
22390 78 47 65 74 70 61 67 65 73 69 7a 65 28 76 6f 69  xGetpagesize(voi
223a0 64 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  d){.#if OS_VXWOR
223b0 4b 53 0a 20 20 72 65 74 75 72 6e 20 31 30 32 34  KS.  return 1024
223c0 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
223d0 5f 42 53 44 5f 53 4f 55 52 43 45 29 0a 20 20 72  _BSD_SOURCE).  r
223e0 65 74 75 72 6e 20 67 65 74 70 61 67 65 73 69 7a  eturn getpagesiz
223f0 65 28 29 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  e();.#else.  ret
22400 75 72 6e 20 28 69 6e 74 29 73 79 73 63 6f 6e 66  urn (int)sysconf
22410 28 5f 53 43 5f 50 41 47 45 53 49 5a 45 29 3b 0a  (_SC_PAGESIZE);.
22420 23 65 6e 64 69 66 0a 7d 0a 0a 23 65 6e 64 69 66  #endif.}..#endif
22430 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
22440 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
22450 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
22460 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 23 69 66 6e  _SIZE>0 */..#ifn
22470 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22480 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63  WAL../*.** Objec
22490 74 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  t used to repres
224a0 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20 6d 65  ent an shared me
224b0 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20 0a 2a  mory buffer.  .*
224c0 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70  *.** When multip
224d0 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72  le threads all r
224e0 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d  eference the sam
224f0 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65 61 63  e wal-index, eac
22500 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61 73 20  h thread.** has 
22510 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68 6d 20  its own unixShm 
22520 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79  object, but they
22530 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 61 20   all point to a 
22540 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 0a  single instance.
22550 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69 78 53  ** of this unixS
22560 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e 20 20  hmNode object.  
22570 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
22580 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78 20 69  each wal-index i
22590 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c 79  s opened.** only
225a0 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73   once per proces
225b0 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 75 6e  s..**.** Each un
225c0 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
225d0 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f   is connected to
225e0 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78 49 6e   a single unixIn
225f0 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a  odeInfo object..
22600 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f 61 6c  ** We could coal
22610 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65 63 74  esce this object
22620 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64 65 49   into unixInodeI
22630 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20 77 6f  nfo, but that wo
22640 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76 65 72  uld mean.** ever
22650 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68 61 74  y open file that
22660 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 73 68   does not use sh
22670 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69 6e 20  ared memory (in 
22680 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 6f 73  other words, mos
22690 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65 73 29  t.** open files)
226a0 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f 20 63   would have to c
226b0 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68 69 73  arry around this
226c0 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   extra informati
226d0 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65 20 75  on.  So.** the u
226e0 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
226f0 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  ect contains a p
22700 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 75  ointer to this u
22710 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
22720 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75 6e 69  t.** and the uni
22730 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
22740 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c 79 20  is created only 
22750 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a  when needed..**.
22760 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  ** unixMutexHeld
22770 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20  () must be true 
22780 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72  when creating or
22790 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74   destroying.** t
227a0 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68  his object or wh
227b0 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77  ile reading or w
227c0 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  riting the follo
227d0 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a  wing fields:.**.
227e0 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 0a  **      nRef.**.
227f0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
22800 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
22810 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20  -only after the 
22820 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
22830 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66  d:.** .**      f
22840 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65  id.**      zFile
22850 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65  name.**.** Eithe
22860 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6d 75  r unixShmNode.mu
22870 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
22880 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e   or unixShmNode.
22890 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 75  nRef==0 and.** u
228a0 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69  nixMutexHeld() i
228b0 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64  s true when read
228c0 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61  ing or writing a
228d0 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a  ny other field.*
228e0 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  * in this struct
228f0 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75  ure..*/.struct u
22900 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 75  nixShmNode {.  u
22910 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
22920 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75 6e 69  node;     /* uni
22930 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61 74 20  xInodeInfo that 
22940 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20 6e 6f  owns this SHM no
22950 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
22960 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20  mutex *mutex;   
22970 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61     /* Mutex to a
22980 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63  ccess this objec
22990 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  t */.  char *zFi
229a0 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
229b0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
229c0 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f   mmapped file */
229d0 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20  .  int h;       
229e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
229f0 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   Open file descr
22a00 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73  iptor */.  int s
22a10 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  zRegion;        
22a20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
22a30 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
22a40 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31 36 20  egions */.  u16 
22a50 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  nRegion;        
22a60 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
22a70 66 20 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e  f array apRegion
22a80 20 2a 2f 0a 20 20 75 38 20 69 73 52 65 61 64 6f   */.  u8 isReado
22a90 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
22aa0 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61 64   /* True if read
22ab0 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 75 38 20 69 73  -only */.  u8 is
22ac0 55 6e 6c 6f 63 6b 65 64 3b 20 20 20 20 20 20 20  Unlocked;       
22ad0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
22ae0 20 6e 6f 20 44 4d 53 20 6c 6f 63 6b 20 68 65 6c   no DMS lock hel
22af0 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 70  d */.  char **ap
22b00 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Region;         
22b10 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6d 61    /* Array of ma
22b20 70 70 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  pped shared-memo
22b30 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  ry regions */.  
22b40 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
22b50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
22b60 6d 62 65 72 20 6f 66 20 75 6e 69 78 53 68 6d 20  mber of unixShm 
22b70 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67  objects pointing
22b80 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 75 6e   to this */.  un
22b90 69 78 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20  ixShm *pFirst;  
22ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
22bb0 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20  unixShm objects 
22bc0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
22bd0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
22be0 45 5f 44 45 42 55 47 0a 20 20 75 38 20 65 78 63  E_DEBUG.  u8 exc
22bf0 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  lMask;          
22c00 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
22c10 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
22c20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73 68 61  held */.  u8 sha
22c30 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  redMask;        
22c40 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
22c50 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c  shared locks hel
22c60 64 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74 53 68  d */.  u8 nextSh
22c70 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  mId;            
22c80 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61    /* Next availa
22c90 62 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64 20 76  ble unixShm.id v
22ca0 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  alue */.#endif.}
22cb0 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75  ;../*.** Structu
22cc0 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  re used internal
22cd0 6c 79 20 62 79 20 74 68 69 73 20 56 46 53 20 74  ly by this VFS t
22ce0 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 74 61  o record the sta
22cf0 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e  te of an.** open
22d00 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63   shared memory c
22d10 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  onnection..**.**
22d20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
22d30 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61  ields are initia
22d40 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20  lized when this 
22d50 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
22d60 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61  d and.** are rea
22d70 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65  d-only thereafte
22d80 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e 69 78  r:.**.**    unix
22d90 53 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20 20 20  Shm.pFile.**    
22da0 75 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a  unixShm.id.**.**
22db0 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64   All other field
22dc0 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74 65  s are read/write
22dd0 2e 20 20 54 68 65 20 75 6e 69 78 53 68 6d 2e 70  .  The unixShm.p
22de0 46 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74  File->mutex must
22df0 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c   be held.** whil
22e00 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20  e accessing any 
22e10 72 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64  read/write field
22e20 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  s..*/.struct uni
22e30 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53 68 6d  xShm {.  unixShm
22e40 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
22e50 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
22e60 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d 4e 6f 64  lying unixShmNod
22e70 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 6e  e object */.  un
22e80 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20  ixShm *pNext;   
22e90 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
22ea0 20 75 6e 69 78 53 68 6d 20 77 69 74 68 20 74 68   unixShm with th
22eb0 65 20 73 61 6d 65 20 75 6e 69 78 53 68 6d 4e 6f  e same unixShmNo
22ec0 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75  de */.  u8 hasMu
22ed0 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  tex;            
22ee0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f     /* True if ho
22ef0 6c 64 69 6e 67 20 74 68 65 20 75 6e 69 78 53 68  lding the unixSh
22f00 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20  mNode mutex */. 
22f10 20 75 38 20 69 64 3b 20 20 20 20 20 20 20 20 20   u8 id;         
22f20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
22f30 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  d of this connec
22f40 74 69 6f 6e 20 77 69 74 68 69 6e 20 69 74 73 20  tion within its 
22f50 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  unixShmNode */. 
22f60 20 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b   u16 sharedMask;
22f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
22f80 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f  ask of shared lo
22f90 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31  cks held */.  u1
22fa0 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20  6 exclMask;     
22fb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
22fc0 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   of exclusive lo
22fd0 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 7d 3b 0a 0a  cks held */.};..
22fe0 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20  /*.** Constants 
22ff0 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
23000 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58  .*/.#define UNIX
23010 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32  _SHM_BASE   ((22
23020 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
23030 4b 29 2a 34 29 20 20 20 20 20 20 20 20 20 2f 2a  K)*4)         /*
23040 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65   first lock byte
23050 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
23060 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 55 4e 49  _SHM_DMS    (UNI
23070 58 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54  X_SHM_BASE+SQLIT
23080 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a  E_SHM_NLOCK)  /*
23090 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20   deadman switch 
230a0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20  */../*.** Apply 
230b0 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c  posix advisory l
230c0 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62 79 74  ocks for all byt
230d0 65 73 20 66 72 6f 6d 20 6f 66 73 74 20 74 68 72  es from ofst thr
230e0 6f 75 67 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a 2a  ough ofst+n-1..*
230f0 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b  *.** Locks block
23100 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69 73 20   if the mask is 
23110 65 78 61 63 74 6c 79 20 55 4e 49 58 5f 53 48 4d  exactly UNIX_SHM
23120 5f 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e 2d 62  _C and are non-b
23130 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65 72  locking.** other
23140 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
23150 69 6e 74 20 75 6e 69 78 53 68 6d 53 79 73 74 65  int unixShmSyste
23160 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 46 69 6c  mLock(.  unixFil
23170 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
23180 2f 2a 20 4f 70 65 6e 20 63 6f 6e 6e 65 63 74 69  /* Open connecti
23190 6f 6e 20 74 6f 20 74 68 65 20 57 41 4c 20 66 69  on to the WAL fi
231a0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b  le */.  int lock
231b0 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Type,          /
231c0 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c  * F_UNLCK, F_RDL
231d0 43 4b 2c 20 6f 72 20 46 5f 57 52 4c 43 4b 20 2a  CK, or F_WRLCK *
231e0 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
231f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
23200 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
23210 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 2a 2f  locking range */
23220 0a 20 20 69 6e 74 20 6e 20 20 20 20 20 20 20 20  .  int n        
23230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
23240 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
23250 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  lock */.){.  uni
23260 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
23270 64 65 3b 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63  de; /* Apply loc
23280 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20  ks to this open 
23290 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
232a0 67 6d 65 6e 74 20 2a 2f 0a 20 20 73 74 72 75 63  gment */.  struc
232b0 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20 20 20 20  t flock f;      
232c0 20 20 2f 2a 20 54 68 65 20 70 6f 73 69 78 20 61    /* The posix a
232d0 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e 67 20  dvisory locking 
232e0 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
232f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
23300 4b 3b 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20  K;    /* Result 
23310 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e 74 6c 28  code form fcntl(
23320 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73  ) */..  /* Acces
23330 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53 68 6d  s to the unixShm
23340 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73  Node object is s
23350 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65  erialized by the
23360 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 70 53 68   caller */.  pSh
23370 6d 4e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  mNode = pFile->p
23380 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
23390 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
233a0 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20  ode->nRef==0 || 
233b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
233c0 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ld(pShmNode->mut
233d0 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 68 61  ex) );..  /* Sha
233e0 72 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65 72 20  red locks never 
233f0 73 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f  span more than o
23400 6e 65 20 62 79 74 65 20 2a 2f 0a 20 20 61 73 73  ne byte */.  ass
23410 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63  ert( n==1 || loc
23420 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b 20 29  kType!=F_RDLCK )
23430 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20 61 72  ;..  /* Locks ar
23440 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 20 2a  e within range *
23450 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31  /.  assert( n>=1
23460 20 26 26 20 6e 3c 3d 53 51 4c 49 54 45 5f 53 48   && n<=SQLITE_SH
23470 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66  M_NLOCK );..  if
23480 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
23490 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69   ){.    /* Initi
234a0 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e  alize the lockin
234b0 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  g parameters */.
234c0 20 20 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c      f.l_type = l
234d0 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20 66 2e 6c  ockType;.    f.l
234e0 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
234f0 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73 74 61 72  ET;.    f.l_star
23500 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20 20 66 2e  t = ofst;.    f.
23510 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 20 20 20 20 72  l_len = n;.    r
23520 63 20 3d 20 6f 73 53 65 74 50 6f 73 69 78 41 64  c = osSetPosixAd
23530 76 69 73 6f 72 79 4c 6f 63 6b 28 70 53 68 6d 4e  visoryLock(pShmN
23540 6f 64 65 2d 3e 68 2c 20 26 66 2c 20 70 46 69 6c  ode->h, &f, pFil
23550 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 28 72 63  e);.    rc = (rc
23560 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45  !=(-1)) ? SQLITE
23570 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53  _OK : SQLITE_BUS
23580 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64  Y;.  }..  /* Upd
23590 61 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c  ate the global l
235a0 6f 63 6b 20 73 74 61 74 65 20 61 6e 64 20 64 6f  ock state and do
235b0 20 64 65 62 75 67 20 74 72 61 63 69 6e 67 20 2a   debug tracing *
235c0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
235d0 44 45 42 55 47 0a 20 20 7b 20 75 31 36 20 6d 61  DEBUG.  { u16 ma
235e0 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  sk;.  OSTRACE(("
235f0 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20 20  SHM-LOCK "));.  
23600 6d 61 73 6b 20 3d 20 6f 66 73 74 3e 33 31 20 3f  mask = ofst>31 ?
23610 20 30 78 66 66 66 66 20 3a 20 28 31 3c 3c 28 6f   0xffff : (1<<(o
23620 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66  fst+n)) - (1<<of
23630 73 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  st);.  if( rc==S
23640 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23650 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
23660 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  UNLCK ){.      O
23670 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20  STRACE(("unlock 
23680 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a  %d ok", ofst));.
23690 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
236a0 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
236b0 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  k;.      pShmNod
236c0 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d  e->sharedMask &=
236d0 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73   ~mask;.    }els
236e0 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  e if( lockType==
236f0 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
23700 20 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d   OSTRACE(("read-
23710 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73  lock %d ok", ofs
23720 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  t));.      pShmN
23730 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d  ode->exclMask &=
23740 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53   ~mask;.      pS
23750 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
23760 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
23770 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
23780 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46  ert( lockType==F
23790 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20  _WRLCK );.      
237a0 4f 53 54 52 41 43 45 28 28 22 77 72 69 74 65 2d  OSTRACE(("write-
237b0 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73  lock %d ok", ofs
237c0 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  t));.      pShmN
237d0 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d  ode->exclMask |=
237e0 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68   mask;.      pSh
237f0 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
23800 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
23810 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
23820 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55  f( lockType==F_U
23830 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  NLCK ){.      OS
23840 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25  TRACE(("unlock %
23850 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29  d failed", ofst)
23860 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
23870 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c   lockType==F_RDL
23880 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
23890 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20  ACE(("read-lock 
238a0 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d  failed"));.    }
238b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
238c0 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  rt( lockType==F_
238d0 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f  WRLCK );.      O
238e0 53 54 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c  STRACE(("write-l
238f0 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20  ock %d failed", 
23900 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ofst));.    }.  
23910 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 20 2d  }.  OSTRACE((" -
23920 20 61 66 74 65 72 77 61 72 64 73 20 25 30 33 78   afterwards %03x
23930 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20  ,%03x\n",.      
23940 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
23950 68 61 72 65 64 4d 61 73 6b 2c 20 70 53 68 6d 4e  haredMask, pShmN
23960 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b  ode->exclMask));
23970 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
23980 65 74 75 72 6e 20 72 63 3b 20 20 20 20 20 20 20  eturn rc;       
23990 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   .}../*.** Retur
239a0 6e 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6e 75  n the minimum nu
239b0 6d 62 65 72 20 6f 66 20 33 32 4b 42 20 73 68 6d  mber of 32KB shm
239c0 20 72 65 67 69 6f 6e 73 20 74 68 61 74 20 73 68   regions that sh
239d0 6f 75 6c 64 20 62 65 20 6d 61 70 70 65 64 20 61  ould be mapped a
239e0 74 0a 2a 2a 20 61 20 74 69 6d 65 2c 20 61 73 73  t.** a time, ass
239f0 75 6d 69 6e 67 20 74 68 61 74 20 65 61 63 68 20  uming that each 
23a00 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20  mapping must be 
23a10 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
23a20 70 6c 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75  ple of the.** cu
23a30 72 72 65 6e 74 20 73 79 73 74 65 6d 20 70 61 67  rrent system pag
23a40 65 2d 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 55 73  e-size..**.** Us
23a50 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 31  ually, this is 1
23a60 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20  . The exception 
23a70 73 65 65 6d 73 20 74 6f 20 62 65 20 73 79 73 74  seems to be syst
23a80 65 6d 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e  ems that are con
23a90 66 69 67 75 72 65 64 0a 2a 2a 20 74 6f 20 75 73  figured.** to us
23aa0 65 20 36 34 4b 42 20 70 61 67 65 73 20 2d 20 69  e 64KB pages - i
23ab0 6e 20 74 68 69 73 20 63 61 73 65 20 65 61 63 68  n this case each
23ac0 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 63 6f   mapping must co
23ad0 76 65 72 20 61 74 20 6c 65 61 73 74 20 74 77 6f  ver at least two
23ae0 0a 2a 2a 20 73 68 6d 20 72 65 67 69 6f 6e 73 2e  .** shm regions.
23af0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
23b00 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d  nixShmRegionPerM
23b10 61 70 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20  ap(void){.  int 
23b20 73 68 6d 73 7a 20 3d 20 33 32 2a 31 30 32 34 3b  shmsz = 32*1024;
23b30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
23b40 48 4d 20 72 65 67 69 6f 6e 20 73 69 7a 65 20 2a  HM region size *
23b50 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 6f  /.  int pgsz = o
23b60 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 3b 20  sGetpagesize(); 
23b70 20 20 2f 2a 20 53 79 73 74 65 6d 20 70 61 67 65    /* System page
23b80 20 73 69 7a 65 20 2a 2f 0a 20 20 61 73 73 65 72   size */.  asser
23b90 74 28 20 28 28 70 67 73 7a 2d 31 29 26 70 67 73  t( ((pgsz-1)&pgs
23ba0 7a 29 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 50 61  z)==0 );   /* Pa
23bb0 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
23bc0 61 20 70 6f 77 65 72 20 6f 66 20 32 20 2a 2f 0a  a power of 2 */.
23bd0 20 20 69 66 28 20 70 67 73 7a 3c 73 68 6d 73 7a    if( pgsz<shmsz
23be0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
23bf0 65 74 75 72 6e 20 70 67 73 7a 2f 73 68 6d 73 7a  eturn pgsz/shmsz
23c00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65  ;.}../*.** Purge
23c10 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
23c20 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c  List list of all
23c30 20 65 6e 74 72 69 65 73 20 77 69 74 68 20 75 6e   entries with un
23c40 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d  ixShmNode.nRef==
23c50 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  0..**.** This is
23c60 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72 65   not a VFS share
23c70 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b  d-memory method;
23c80 20 69 74 20 69 73 20 61 20 75 74 69 6c 69 74 79   it is a utility
23c90 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
23ca0 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72 65  .** by VFS share
23cb0 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73  d-memory methods
23cc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
23cd0 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 75 6e   unixShmPurge(un
23ce0 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20  ixFile *pFd){.  
23cf0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 20 3d  unixShmNode *p =
23d00 20 70 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53   pFd->pInode->pS
23d10 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  hmNode;.  assert
23d20 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
23d30 29 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  ) );.  if( p && 
23d40 41 4c 57 41 59 53 28 70 2d 3e 6e 52 65 66 3d 3d  ALWAYS(p->nRef==
23d50 30 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53  0) ){.    int nS
23d60 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e 69 78 53  hmPerMap = unixS
23d70 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 29  hmRegionPerMap()
23d80 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
23d90 20 61 73 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f   assert( p->pIno
23da0 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65 20  de==pFd->pInode 
23db0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
23dc0 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74  utex_free(p->mut
23dd0 65 78 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ex);.    for(i=0
23de0 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20  ; i<p->nRegion; 
23df0 69 2b 3d 6e 53 68 6d 50 65 72 4d 61 70 29 7b 0a  i+=nShmPerMap){.
23e00 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d        if( p->h>=
23e10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d  0 ){.        osM
23e20 75 6e 6d 61 70 28 70 2d 3e 61 70 52 65 67 69 6f  unmap(p->apRegio
23e30 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f  n[i], p->szRegio
23e40 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
23e50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23e60 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f  _free(p->apRegio
23e70 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  n[i]);.      }. 
23e80 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
23e90 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f  _free(p->apRegio
23ea0 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 68  n);.    if( p->h
23eb0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62  >=0 ){.      rob
23ec0 75 73 74 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70  ust_close(pFd, p
23ed0 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  ->h, __LINE__);.
23ee0 20 20 20 20 20 20 70 2d 3e 68 20 3d 20 2d 31 3b        p->h = -1;
23ef0 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49  .    }.    p->pI
23f00 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d  node->pShmNode =
23f10 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
23f20 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(p);.  }.}..
23f30 2f 2a 0a 2a 2a 20 54 68 65 20 44 4d 53 20 6c 6f  /*.** The DMS lo
23f40 63 6b 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  ck has not yet b
23f50 65 65 6e 20 74 61 6b 65 6e 20 6f 6e 20 73 68 6d  een taken on shm
23f60 20 66 69 6c 65 20 70 53 68 6d 4e 6f 64 65 2e 20   file pShmNode. 
23f70 41 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 74 61  Attempt to.** ta
23f80 6b 65 20 69 74 20 6e 6f 77 2e 20 52 65 74 75 72  ke it now. Retur
23f90 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
23fa0 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
23fb0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a   SQLite error.**
23fc0 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
23fd0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 44 4d  .**.** If the DM
23fe0 53 20 63 61 6e 6e 6f 74 20 62 65 20 6c 6f 63 6b  S cannot be lock
23ff0 65 64 20 62 65 63 61 75 73 65 20 74 68 69 73 20  ed because this 
24000 69 73 20 61 20 72 65 61 64 6f 6e 6c 79 5f 73 68  is a readonly_sh
24010 6d 3d 31 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  m=1 .** connecti
24020 6f 6e 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  on and no other 
24030 70 72 6f 63 65 73 73 20 61 6c 72 65 61 64 79 20  process already 
24040 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 2c 20 72 65  holds a lock, re
24050 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 52  turn.** SQLITE_R
24060 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54  EADONLY_CANTINIT
24070 20 61 6e 64 20 73 65 74 20 70 53 68 6d 4e 6f 64   and set pShmNod
24080 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64 3d 31 2e  e->isUnlocked=1.
24090 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
240a0 6e 69 78 4c 6f 63 6b 53 68 61 72 65 64 4d 65 6d  nixLockSharedMem
240b0 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a 70 44  ory(unixFile *pD
240c0 62 46 64 2c 20 75 6e 69 78 53 68 6d 4e 6f 64 65  bFd, unixShmNode
240d0 20 2a 70 53 68 6d 4e 6f 64 65 29 7b 0a 20 20 73   *pShmNode){.  s
240e0 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
240f0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
24100 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 55 73  ITE_OK;..  /* Us
24110 65 20 46 5f 47 45 54 4c 4b 20 74 6f 20 64 65 74  e F_GETLK to det
24120 65 72 6d 69 6e 65 20 74 68 65 20 6c 6f 63 6b 73  ermine the locks
24130 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
24140 20 61 72 65 20 68 6f 6c 64 69 6e 67 0a 20 20 2a   are holding.  *
24150 2a 20 6f 6e 20 74 68 65 20 44 4d 53 20 62 79 74  * on the DMS byt
24160 65 2e 20 49 66 20 69 74 20 69 6e 64 69 63 61 74  e. If it indicat
24170 65 73 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20  es that another 
24180 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
24190 6e 67 0a 20 20 2a 2a 20 61 20 53 48 41 52 45 44  ng.  ** a SHARED
241a0 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 69 73   lock, then this
241b0 20 70 72 6f 63 65 73 73 20 6d 61 79 20 61 6c 73   process may als
241c0 6f 20 74 61 6b 65 20 61 20 53 48 41 52 45 44 20  o take a SHARED 
241d0 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 70 72  lock.  ** and pr
241e0 6f 63 65 65 64 20 77 69 74 68 20 6f 70 65 6e 69  oceed with openi
241f0 6e 67 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c  ng the *-shm fil
24200 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72  e. .  **.  ** Or
24210 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 70 72  , if no other pr
24220 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
24230 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20   any lock, then 
24240 74 68 69 73 20 70 72 6f 63 65 73 73 0a 20 20 2a  this process.  *
24250 2a 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74  * is the first t
24260 6f 20 6f 70 65 6e 20 69 74 2e 20 49 6e 20 74 68  o open it. In th
24270 69 73 20 63 61 73 65 20 74 61 6b 65 20 61 6e 20  is case take an 
24280 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
24290 6e 20 74 68 65 0a 20 20 2a 2a 20 44 4d 53 20 62  n the.  ** DMS b
242a0 79 74 65 20 61 6e 64 20 74 72 75 6e 63 61 74 65  yte and truncate
242b0 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c 65 20   the *-shm file 
242c0 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
242d0 20 73 69 7a 65 2e 20 54 68 65 6e 0a 20 20 2a 2a   size. Then.  **
242e0 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20   downgrade to a 
242f0 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
24300 68 65 20 44 4d 53 20 62 79 74 65 2e 0a 20 20 2a  he DMS byte..  *
24310 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 6f 74 68 65  *.  ** If anothe
24320 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  r process is hol
24330 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ding an EXCLUSIV
24340 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 44 4d  E lock on the DM
24350 53 20 62 79 74 65 2c 0a 20 20 2a 2a 20 72 65 74  S byte,.  ** ret
24360 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  urn SQLITE_BUSY 
24370 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 28 69  to the caller (i
24380 74 20 77 69 6c 6c 20 74 72 79 20 61 67 61 69 6e  t will try again
24390 29 2e 20 41 6e 20 65 61 72 6c 69 65 72 0a 20 20  ). An earlier.  
243a0 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  ** version of th
243b0 69 73 20 63 6f 64 65 20 61 74 74 65 6d 70 74 65  is code attempte
243c0 64 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63  d the SHARED loc
243d0 6b 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e  k at this point.
243e0 20 42 75 74 0a 20 20 2a 2a 20 74 68 69 73 20 69   But.  ** this i
243f0 6e 74 72 6f 64 75 63 65 64 20 61 20 73 75 62 74  ntroduced a subt
24400 6c 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  le race conditio
24410 6e 3a 20 69 66 20 74 68 65 20 70 72 6f 63 65 73  n: if the proces
24420 73 20 68 6f 6c 64 69 6e 67 0a 20 20 2a 2a 20 45  s holding.  ** E
24430 58 43 4c 55 53 49 56 45 20 66 61 69 6c 65 64 20  XCLUSIVE failed 
24440 6a 75 73 74 20 62 65 66 6f 72 65 20 74 72 75 6e  just before trun
24450 63 61 74 69 6e 67 20 74 68 65 20 2a 2d 73 68 6d  cating the *-shm
24460 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 69 73   file, then this
24470 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6d 69  .  ** process mi
24480 67 68 74 20 6f 70 65 6e 20 61 6e 64 20 75 73 65  ght open and use
24490 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c 65 20   the *-shm file 
244a0 77 69 74 68 6f 75 74 20 74 72 75 6e 63 61 74 69  without truncati
244b0 6e 67 20 69 74 2e 0a 20 20 2a 2a 20 41 6e 64 20  ng it..  ** And 
244c0 69 66 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c  if the *-shm fil
244d0 65 20 68 61 73 20 62 65 65 6e 20 63 6f 72 72 75  e has been corru
244e0 70 74 65 64 20 62 79 20 61 20 70 6f 77 65 72 20  pted by a power 
244f0 66 61 69 6c 75 72 65 20 6f 72 0a 20 20 2a 2a 20  failure or.  ** 
24500 73 79 73 74 65 6d 20 63 72 61 73 68 2c 20 74 68  system crash, th
24510 65 20 64 61 74 61 62 61 73 65 20 69 74 73 65 6c  e database itsel
24520 66 20 6d 61 79 20 61 6c 73 6f 20 62 65 63 6f 6d  f may also becom
24530 65 20 63 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20  e corrupt.  */. 
24540 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
24550 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63   SEEK_SET;.  loc
24560 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 55 4e 49 58  k.l_start = UNIX
24570 5f 53 48 4d 5f 44 4d 53 3b 0a 20 20 6c 6f 63 6b  _SHM_DMS;.  lock
24580 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f  .l_len = 1;.  lo
24590 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
245a0 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e  LCK;.  if( osFcn
245b0 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  tl(pShmNode->h, 
245c0 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21  F_GETLK, &lock)!
245d0 3d 30 20 29 20 7b 0a 20 20 20 20 72 63 20 3d 20  =0 ) {.    rc = 
245e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
245f0 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  K;.  }else if( l
24600 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e  ock.l_type==F_UN
24610 4c 43 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  LCK ){.    if( p
24620 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f  ShmNode->isReado
24630 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 70 53 68  nly ){.      pSh
24640 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65  mNode->isUnlocke
24650 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20  d = 1;.      rc 
24660 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
24670 59 5f 43 41 4e 54 49 4e 49 54 3b 0a 20 20 20 20  Y_CANTINIT;.    
24680 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
24690 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
246a0 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 57 52 4c  ock(pDbFd, F_WRL
246b0 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53  CK, UNIX_SHM_DMS
246c0 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
246d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
246e0 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
246f0 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 30  e(pShmNode->h, 0
24700 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
24710 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
24720 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f  QLITE_IOERR_SHMO
24730 50 45 4e 2c 22 66 74 72 75 6e 63 61 74 65 22 2c  PEN,"ftruncate",
24740 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
24750 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
24760 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
24770 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57  lock.l_type==F_W
24780 52 4c 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  RLCK ){.    rc =
24790 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
247a0 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
247b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
247c0 73 65 72 74 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70  sert( lock.l_typ
247d0 65 3d 3d 46 5f 55 4e 4c 43 4b 20 7c 7c 20 6c 6f  e==F_UNLCK || lo
247e0 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c  ck.l_type==F_RDL
247f0 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 75  CK );.    rc = u
24800 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
24810 28 70 44 62 46 64 2c 20 46 5f 52 44 4c 43 4b 2c  (pDbFd, F_RDLCK,
24820 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31   UNIX_SHM_DMS, 1
24830 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
24840 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  rc;.}../*.** Ope
24850 6e 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  n a shared-memor
24860 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74 65  y area associate
24870 64 20 77 69 74 68 20 6f 70 65 6e 20 64 61 74 61  d with open data
24880 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e  base file pDbFd.
24890 20 20 0a 2a 2a 20 54 68 69 73 20 70 61 72 74 69    .** This parti
248a0 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61  cular implementa
248b0 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61 70 70 65  tion uses mmappe
248c0 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  d files..**.** T
248d0 68 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f 20  he file used to 
248e0 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61 72 65 64  implement shared
248f0 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20 74 68  -memory is in th
24900 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
24910 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70 65 6e 20  .** as the open 
24920 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
24930 64 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e  d has the same n
24940 61 6d 65 20 61 73 20 74 68 65 20 6f 70 65 6e 20  ame as the open 
24950 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
24960 20 77 69 74 68 20 74 68 65 20 22 2d 73 68 6d 22   with the "-shm"
24970 20 73 75 66 66 69 78 20 61 64 64 65 64 2e 20 20   suffix added.  
24980 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
24990 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
249a0 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65 2f 75  e.** is "/home/u
249b0 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 22 20  ser1/config.db" 
249c0 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 74 68  then the file th
249d0 61 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  at is created an
249e0 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20 66 6f 72  d mmapped.** for
249f0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77   shared memory w
24a00 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 22 2f  ill be called "/
24a10 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69  home/user1/confi
24a20 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a  g.db-shm".  .**.
24a30 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70 70 72 6f  ** Another appro
24a40 61 63 68 20 74 6f 20 69 73 20 74 6f 20 75 73 65  ach to is to use
24a50 20 66 69 6c 65 73 20 69 6e 20 2f 64 65 76 2f 73   files in /dev/s
24a60 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d 70 20 6f  hm or /dev/tmp o
24a70 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68  r an.** some oth
24a80 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e 74 2e 20  er tmpfs mount. 
24a90 42 75 74 20 69 66 20 61 20 66 69 6c 65 20 69 6e  But if a file in
24aa0 20 61 20 64 69 66 66 65 72 65 6e 74 20 64 69 72   a different dir
24ab0 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20 74  ectory.** from t
24ac0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24ad0 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e 20 64   is used, then d
24ae0 69 66 66 65 72 69 6e 67 20 61 63 63 65 73 73 20  iffering access 
24af0 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f  permissions.** o
24b00 72 20 61 20 63 68 72 6f 6f 74 28 29 20 6d 69 67  r a chroot() mig
24b10 68 74 20 63 61 75 73 65 20 74 77 6f 20 64 69 66  ht cause two dif
24b20 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 65 73  ferent processes
24b30 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   on the same.** 
24b40 64 61 74 61 62 61 73 65 20 74 6f 20 65 6e 64 20  database to end 
24b50 75 70 20 75 73 69 6e 67 20 64 69 66 66 65 72 65  up using differe
24b60 6e 74 20 66 69 6c 65 73 20 66 6f 72 20 73 68 61  nt files for sha
24b70 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a  red memory - .**
24b80 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68   meaning that th
24b90 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f 75 6c 64  eir memory would
24ba0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 73   not really be s
24bb0 68 61 72 65 64 20 2d 20 72 65 73 75 6c 74 69 6e  hared - resultin
24bc0 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65  g.** in database
24bd0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 4e 65   corruption.  Ne
24be0 76 65 72 74 68 65 6c 65 73 73 2c 20 74 68 69 73  vertheless, this
24bf0 20 74 6d 70 66 73 20 66 69 6c 65 20 75 73 61 67   tmpfs file usag
24c00 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65 6e 61 62  e.** can be enab
24c10 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  led at compile-t
24c20 69 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49  ime using -DSQLI
24c30 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
24c40 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f  ="/dev/shm".** o
24c50 72 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  r the equivalent
24c60 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 74 68  .  The use of th
24c70 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  e SQLITE_SHM_DIR
24c80 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74  ECTORY compile-t
24c90 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72 65  ime.** option re
24ca0 73 75 6c 74 73 20 69 6e 20 61 6e 20 69 6e 63 6f  sults in an inco
24cb0 6d 70 61 74 69 62 6c 65 20 62 75 69 6c 64 20 6f  mpatible build o
24cc0 66 20 53 51 4c 69 74 65 3b 20 20 62 75 69 6c 64  f SQLite;  build
24cd0 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a 20 74  s of SQLite.** t
24ce0 68 61 74 20 77 69 74 68 20 64 69 66 66 65 72 69  hat with differi
24cf0 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  ng SQLITE_SHM_DI
24d00 52 45 43 54 4f 52 59 20 73 65 74 74 69 6e 67 73  RECTORY settings
24d10 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
24d20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64 61 74 61  the.** same data
24d30 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
24d40 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 61 74 61   same time, data
24d50 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
24d60 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72  will likely.** r
24d70 65 73 75 6c 74 2e 20 54 68 65 20 53 51 4c 49 54  esult. The SQLIT
24d80 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
24d90 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
24da0 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ion is considere
24db0 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72 74 65  d.** "unsupporte
24dc0 64 22 20 61 6e 64 20 6d 61 79 20 67 6f 20 61 77  d" and may go aw
24dd0 61 79 20 69 6e 20 61 20 66 75 74 75 72 65 20 53  ay in a future S
24de0 51 4c 69 74 65 20 72 65 6c 65 61 73 65 2e 0a 2a  QLite release..*
24df0 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e  *.** When openin
24e00 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d  g a new shared-m
24e10 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e  emory file, if n
24e20 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65  o other instance
24e30 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c  s of that.** fil
24e40 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  e are currently 
24e50 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72  open, in this pr
24e60 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65  ocess or in othe
24e70 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65  r processes, the
24e80 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75  n.** the file mu
24e90 73 74 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  st be truncated 
24ea0 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f  to zero length o
24eb0 72 20 68 61 76 65 20 69 74 73 20 68 65 61 64 65  r have its heade
24ec0 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a  r cleared..**.**
24ed0 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   If the original
24ee0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
24ef0 70 44 62 46 64 29 20 69 73 20 75 73 69 6e 67 20  pDbFd) is using 
24f00 74 68 65 20 22 75 6e 69 78 2d 65 78 63 6c 22 20  the "unix-excl" 
24f10 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e  VFS.** that mean
24f20 73 20 74 68 61 74 20 61 6e 20 65 78 63 6c 75 73  s that an exclus
24f30 69 76 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ive lock is held
24f40 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
24f50 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 61   file and.** tha
24f60 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65  t no other proce
24f70 73 73 65 73 20 61 72 65 20 61 62 6c 65 20 74 6f  sses are able to
24f80 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
24f90 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e  he database.  In
24fa0 0a 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20 77  .** that case, w
24fb0 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e do not really 
24fc0 6e 65 65 64 20 73 68 61 72 65 64 20 6d 65 6d 6f  need shared memo
24fd0 72 79 2e 20 20 4e 6f 20 73 68 61 72 65 64 20 6d  ry.  No shared m
24fe0 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65 20 69 73  emory.** file is
24ff0 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 73   created.  The s
25000 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c  hared memory wil
25010 6c 20 62 65 20 73 69 6d 75 6c 61 74 65 64 20 77  l be simulated w
25020 69 74 68 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e  ith heap memory.
25030 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
25040 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  nixOpenSharedMem
25050 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a 70 44  ory(unixFile *pD
25060 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20 75  bFd){.  struct u
25070 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20  nixShm *p = 0;  
25080 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
25090 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
250a0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  opened */.  stru
250b0 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  ct unixShmNode *
250c0 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54  pShmNode;   /* T
250d0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d  he underlying mm
250e0 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20  apped file */.  
250f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
25100 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
25110 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
25120 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
25130 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20  o *pInode;      
25140 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65      /* The inode
25150 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68 61 72   of fd */.  char
25160 20 2a 7a 53 68 6d 3b 20 20 20 20 20 20 20 20 20   *zShm;         
25170 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
25180 68 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  he file used for
25190 20 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53   SHM */.  int nS
251a0 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  hmFilename;     
251b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
251c0 65 20 6f 66 20 74 68 65 20 53 48 4d 20 66 69 6c  e of the SHM fil
251d0 65 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a  ename in bytes *
251e0 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
251f0 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   space for the n
25200 65 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63  ew unixShm objec
25210 74 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69  t. */.  p = sqli
25220 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69  te3_malloc64( si
25230 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
25240 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
25250 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
25260 54 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  T;.  memset(p, 0
25270 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
25280 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e   assert( pDbFd->
25290 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  pShm==0 );..  /*
252a0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
252b0 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f   a unixShmNode o
252c0 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65 78  bject already ex
252d0 69 73 74 73 2e 20 52 65 75 73 65 20 61 6e 20 65  ists. Reuse an e
252e0 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65  xisting.  ** one
252f0 20 69 66 20 70 72 65 73 65 6e 74 2e 20 43 72 65   if present. Cre
25300 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
25310 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
25320 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 46  .  assert( unixF
25330 69 6c 65 4d 75 74 65 78 4e 6f 74 68 65 6c 64 28  ileMutexNotheld(
25340 70 44 62 46 64 29 20 29 3b 0a 20 20 75 6e 69 78  pDbFd) );.  unix
25350 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
25360 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e  pInode = pDbFd->
25370 70 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e 6f  pInode;.  pShmNo
25380 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53 68  de = pInode->pSh
25390 6d 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70 53 68  mNode;.  if( pSh
253a0 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  mNode==0 ){.    
253b0 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
253c0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
253d0 20 20 20 2f 2a 20 66 73 74 61 74 28 29 20 69 6e     /* fstat() in
253e0 66 6f 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  fo for database 
253f0 66 69 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  file */.#ifndef 
25400 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
25410 54 4f 52 59 0a 20 20 20 20 63 6f 6e 73 74 20 63  TORY.    const c
25420 68 61 72 20 2a 7a 42 61 73 65 50 61 74 68 20 3d  har *zBasePath =
25430 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 3b 0a 23   pDbFd->zPath;.#
25440 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 61  endif..    /* Ca
25450 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20 66 69  ll fstat() to fi
25460 67 75 72 65 20 6f 75 74 20 74 68 65 20 70 65 72  gure out the per
25470 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20  missions on the 
25480 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
25490 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77 20 2a  f.    ** a new *
254a0 2d 73 68 6d 20 66 69 6c 65 20 69 73 20 63 72 65  -shm file is cre
254b0 61 74 65 64 2c 20 61 6e 20 61 74 74 65 6d 70 74  ated, an attempt
254c0 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f   will be made to
254d0 20 63 72 65 61 74 65 20 69 74 0a 20 20 20 20 2a   create it.    *
254e0 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  * with the same 
254f0 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 20 20 20  permissions..   
25500 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46 73   */.    if( osFs
25510 74 61 74 28 70 44 62 46 64 2d 3e 68 2c 20 26 73  tat(pDbFd->h, &s
25520 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 72  Stat) ){.      r
25530 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
25540 5f 46 53 54 41 54 3b 0a 20 20 20 20 20 20 67 6f  _FSTAT;.      go
25550 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
25560 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
25570 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
25580 4f 52 59 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65  ORY.    nShmFile
25590 6e 61 6d 65 20 3d 20 73 69 7a 65 6f 66 28 53 51  name = sizeof(SQ
255a0 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
255b0 52 59 29 20 2b 20 33 31 3b 0a 23 65 6c 73 65 0a  RY) + 31;.#else.
255c0 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65      nShmFilename
255d0 20 3d 20 36 20 2b 20 28 69 6e 74 29 73 74 72 6c   = 6 + (int)strl
255e0 65 6e 28 7a 42 61 73 65 50 61 74 68 29 3b 0a 23  en(zBasePath);.#
255f0 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f  endif.    pShmNo
25600 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  de = sqlite3_mal
25610 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70  loc64( sizeof(*p
25620 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53 68 6d 46  ShmNode) + nShmF
25630 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 20 20 69  ilename );.    i
25640 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29  f( pShmNode==0 )
25650 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
25660 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
25670 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
25680 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20  pen_err;.    }. 
25690 20 20 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f     memset(pShmNo
256a0 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  de, 0, sizeof(*p
256b0 53 68 6d 4e 6f 64 65 29 2b 6e 53 68 6d 46 69 6c  ShmNode)+nShmFil
256c0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 53 68 6d  ename);.    zShm
256d0 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69   = pShmNode->zFi
256e0 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
256f0 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69  &pShmNode[1];.#i
25700 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f  fdef SQLITE_SHM_
25710 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71  DIRECTORY.    sq
25720 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
25730 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68  ShmFilename, zSh
25740 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  m, .            
25750 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
25760 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 22 2f  SHM_DIRECTORY "/
25770 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25 78  sqlite-shm-%x-%x
25780 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
25790 20 20 20 20 20 20 20 20 28 75 33 32 29 73 53 74          (u32)sSt
257a0 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32 29  at.st_ino, (u32)
257b0 73 53 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a 23  sStat.st_dev);.#
257c0 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33  else.    sqlite3
257d0 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69  _snprintf(nShmFi
257e0 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 2c 20 22 25  lename, zShm, "%
257f0 73 2d 73 68 6d 22 2c 20 7a 42 61 73 65 50 61 74  s-shm", zBasePat
25800 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  h);.    sqlite3F
25810 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46 64  ileSuffix3(pDbFd
25820 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 29 3b 0a  ->zPath, zShm);.
25830 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e  #endif.    pShmN
25840 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20  ode->h = -1;.   
25850 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
25860 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e  pShmNode = pShmN
25870 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ode;.    pShmNod
25880 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70 44 62 46  e->pInode = pDbF
25890 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69  d->pInode;.    i
258a0 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
258b0 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
258c0 78 20 29 7b 0a 20 20 20 20 20 20 70 53 68 6d 4e  x ){.      pShmN
258d0 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  ode->mutex = sql
258e0 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
258f0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
25900 53 54 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ST);.      if( p
25910 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d  ShmNode->mutex==
25920 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
25930 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
25940 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  KPT;.        got
25950 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
25960 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
25970 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62     if( pInode->b
25980 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
25990 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73  {.      if( 0==s
259a0 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
259b0 61 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c  an(pDbFd->zPath,
259c0 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c   "readonly_shm",
259d0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70   0) ){.        p
259e0 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62  ShmNode->h = rob
259f0 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 2c 20 4f  ust_open(zShm, O
25a00 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 28  _RDWR|O_CREAT, (
25a10 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 26 30 37  sStat.st_mode&07
25a20 37 37 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  77));.      }.  
25a30 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
25a40 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ->h<0 ){.       
25a50 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72   pShmNode->h = r
25a60 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 2c  obust_open(zShm,
25a70 20 4f 5f 52 44 4f 4e 4c 59 2c 20 28 73 53 74 61   O_RDONLY, (sSta
25a80 74 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 29  t.st_mode&0777))
25a90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
25aa0 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20  hmNode->h<0 ){. 
25ab0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
25ac0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
25ad0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
25ae0 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d 29 3b 0a   "open", zShm);.
25af0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
25b00 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
25b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
25b20 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f  ShmNode->isReado
25b30 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  nly = 1;.      }
25b40 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
25b50 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 72 75  is process is ru
25b60 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2c 20 6d  nning as root, m
25b70 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
25b80 65 20 53 48 4d 20 66 69 6c 65 0a 20 20 20 20 20  e SHM file.     
25b90 20 2a 2a 20 69 73 20 6f 77 6e 65 64 20 62 79 20   ** is owned by 
25ba0 74 68 65 20 73 61 6d 65 20 75 73 65 72 20 74 68  the same user th
25bb0 61 74 20 6f 77 6e 73 20 74 68 65 20 6f 72 69 67  at owns the orig
25bc0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 20 20  inal database.  
25bd0 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20  Otherwise,.     
25be0 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   ** the original
25bf0 20 6f 77 6e 65 72 20 77 69 6c 6c 20 6e 6f 74 20   owner will not 
25c00 62 65 20 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65  be able to conne
25c10 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ct..      */.   
25c20 20 20 20 72 6f 62 75 73 74 46 63 68 6f 77 6e 28     robustFchown(
25c30 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53 74  pShmNode->h, sSt
25c40 61 74 2e 73 74 5f 75 69 64 2c 20 73 53 74 61 74  at.st_uid, sStat
25c50 2e 73 74 5f 67 69 64 29 3b 0a 0a 20 20 20 20 20  .st_gid);..     
25c60 20 72 63 20 3d 20 75 6e 69 78 4c 6f 63 6b 53 68   rc = unixLockSh
25c70 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64  aredMemory(pDbFd
25c80 2c 20 70 53 68 6d 4e 6f 64 65 29 3b 0a 20 20 20  , pShmNode);.   
25c90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
25ca0 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
25cb0 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54  TE_READONLY_CANT
25cc0 49 4e 49 54 20 29 20 67 6f 74 6f 20 73 68 6d 5f  INIT ) goto shm_
25cd0 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
25ce0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74    }..  /* Make t
25cf0 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f  he new connectio
25d00 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65  n a child of the
25d10 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a   unixShmNode */.
25d20 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20    p->pShmNode = 
25d30 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66  pShmNode;.#ifdef
25d40 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
25d50 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65  p->id = pShmNode
25d60 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23  ->nextShmId++;.#
25d70 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65  endif.  pShmNode
25d80 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46  ->nRef++;.  pDbF
25d90 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75  d->pShm = p;.  u
25da0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
25db0 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72  ..  /* The refer
25dc0 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53  ence count on pS
25dd0 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61  hmNode has alrea
25de0 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e  dy been incremen
25df0 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74  ted under.  ** t
25e00 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20  he cover of the 
25e10 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
25e20 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70   mutex and the p
25e30 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a  ointer from the.
25e40 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74    ** new (struct
25e50 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a 65 63 74   unixShm) object
25e60 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65   to the pShmNode
25e70 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41   has been set. A
25e80 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  ll that is.  ** 
25e90 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f  left to do is to
25ea0 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62   link the new ob
25eb0 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  ject into the li
25ec0 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69  nked list starti
25ed0 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e  ng.  ** at pShmN
25ee0 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69  ode->pFirst. Thi
25ef0 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77  s must be done w
25f00 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  hile holding the
25f10 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
25f20 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20   .  ** mutex..  
25f30 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
25f40 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
25f50 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e  e->mutex);.  p->
25f60 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65  pNext = pShmNode
25f70 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d  ->pFirst;.  pShm
25f80 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70  Node->pFirst = p
25f90 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
25fa0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
25fb0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
25fc0 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  rn rc;..  /* Jum
25fd0 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72  p here on any er
25fe0 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f  ror */.shm_open_
25ff0 65 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75  err:.  unixShmPu
26000 72 67 65 28 70 44 62 46 64 29 3b 20 20 20 20 20  rge(pDbFd);     
26010 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66    /* This call f
26020 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66  rees pShmNode if
26030 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73   required */.  s
26040 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
26050 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
26060 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
26070 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
26080 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
26090 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f  d to obtain a po
260a0 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20  inter to region 
260b0 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a  iRegion of the .
260c0 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
260d0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
260e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
260f0 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65  le fd. Shared-me
26100 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a  mory regions .**
26110 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74   are numbered st
26120 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f  arting from zero
26130 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65  . Each shared-me
26140 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73  mory region is s
26150 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65  zRegion .** byte
26160 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
26170 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
26180 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
26190 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
261a0 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  nd *pp is set to
261b0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68   NULL..**.** Oth
261c0 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 62  erwise, if the b
261d0 45 78 74 65 6e 64 20 70 61 72 61 6d 65 74 65 72  Extend parameter
261e0 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65   is 0 and the re
261f0 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d  quested shared-m
26200 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20  emory.** region 
26210 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
26220 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63  ocated (by any c
26230 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67  lient, including
26240 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20   one running in 
26250 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72  a.** separate pr
26260 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70  ocess), then *pp
26270 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
26280 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
26290 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62  turned. If .** b
262a0 45 78 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65  Extend is non-ze
262b0 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65  ro and the reque
262c0 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
262d0 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ry region has no
262e0 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61  t yet .** been a
262f0 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20  llocated, it is 
26300 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
26310 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
26320 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d  * If the shared-
26330 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
26340 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
26350 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61  llocated or is a
26360 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
26370 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63  his call as desc
26380 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65  ribed above, the
26390 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69  n it is mapped i
263a0 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
263b0 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73  es .** address s
263c0 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e  pace (if it is n
263d0 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70  ot already), *pp
263e0 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
263f0 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a   to the mapped .
26400 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51  ** memory and SQ
26410 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
26420 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26430 75 6e 69 78 53 68 6d 4d 61 70 28 0a 20 20 73 71  unixShmMap(.  sq
26440 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
26450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26460 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20   Handle open on 
26470 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
26480 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20  .  int iRegion, 
26490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264a0 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20     /* Region to 
264b0 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e  retrieve */.  in
264c0 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20  t szRegion,     
264d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
264e0 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73   Size of regions
264f0 20 2a 2f 0a 20 20 69 6e 74 20 62 45 78 74 65 6e   */.  int bExten
26500 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
26510 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
26520 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20   extend file if 
26530 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76  necessary */.  v
26540 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70  oid volatile **p
26550 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
26560 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65  * OUT: Mapped me
26570 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  mory */.){.  uni
26580 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  xFile *pDbFd = (
26590 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20  unixFile*)fd;.  
265a0 75 6e 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e  unixShm *p;.  un
265b0 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
265c0 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ode;.  int rc = 
265d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
265e0 20 6e 53 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e   nShmPerMap = un
265f0 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61  ixShmRegionPerMa
26600 70 28 29 3b 0a 20 20 69 6e 74 20 6e 52 65 71 52  p();.  int nReqR
26610 65 67 69 6f 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20  egion;..  /* If 
26620 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  the shared-memor
26630 79 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  y file has not y
26640 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
26650 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a  open it now. */.
26660 20 20 69 66 28 20 70 44 62 46 64 2d 3e 70 53 68    if( pDbFd->pSh
26670 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  m==0 ){.    rc =
26680 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d   unixOpenSharedM
26690 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20  emory(pDbFd);.  
266a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
266b0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
266c0 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46  .  }..  p = pDbF
266d0 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e  d->pShm;.  pShmN
266e0 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
266f0 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  e;.  sqlite3_mut
26700 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
26710 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  e->mutex);.  if(
26720 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c   pShmNode->isUnl
26730 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 72 63 20  ocked ){.    rc 
26740 3d 20 75 6e 69 78 4c 6f 63 6b 53 68 61 72 65 64  = unixLockShared
26750 4d 65 6d 6f 72 79 28 70 44 62 46 64 2c 20 70 53  Memory(pDbFd, pS
26760 68 6d 4e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28  hmNode);.    if(
26770 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26780 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
26790 74 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  t;.    pShmNode-
267a0 3e 69 73 55 6e 6c 6f 63 6b 65 64 20 3d 20 30 3b  >isUnlocked = 0;
267b0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
267c0 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
267d0 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
267e0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
267f0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
26800 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
26810 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
26820 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
26830 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20  hmNode->h>=0 || 
26840 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
26850 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29  ProcessLock==1 )
26860 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
26870 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62  Node->h<0 || pDb
26880 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
26890 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a  cessLock==0 );..
268a0 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75 6d    /* Minimum num
268b0 62 65 72 20 6f 66 20 72 65 67 69 6f 6e 73 20 72  ber of regions r
268c0 65 71 75 69 72 65 64 20 74 6f 20 62 65 20 6d 61  equired to be ma
268d0 70 70 65 64 2e 20 2a 2f 0a 20 20 6e 52 65 71 52  pped. */.  nReqR
268e0 65 67 69 6f 6e 20 3d 20 28 28 69 52 65 67 69 6f  egion = ((iRegio
268f0 6e 2b 6e 53 68 6d 50 65 72 4d 61 70 29 20 2f 20  n+nShmPerMap) / 
26900 6e 53 68 6d 50 65 72 4d 61 70 29 20 2a 20 6e 53  nShmPerMap) * nS
26910 68 6d 50 65 72 4d 61 70 3b 0a 0a 20 20 69 66 28  hmPerMap;..  if(
26920 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
26930 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b  on<nReqRegion ){
26940 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e 65  .    char **apNe
26950 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
26960 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61          /* New a
26970 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20  pRegion[] array 
26980 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
26990 20 3d 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73 7a   = nReqRegion*sz
269a0 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 4d 69 6e  Region;   /* Min
269b0 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69  imum required fi
269c0 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  le size */.    s
269d0 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
269e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
269f0 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66 73 74    /* Used by fst
26a00 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70 53 68  at() */..    pSh
26a10 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
26a20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20  = szRegion;..   
26a30 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
26a40 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  >=0 ){.      /* 
26a50 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  The requested re
26a60 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70  gion is not mapp
26a70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  ed into this pro
26a80 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
26a90 70 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a 20 43  pace..      ** C
26aa0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
26ab0 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  t has been alloc
26ac0 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68  ated (i.e. if th
26ad0 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65  e wal-index file
26ae0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72   is.      ** lar
26af0 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e  ge enough to con
26b00 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  tain the request
26b10 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20  ed region)..    
26b20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f    */.      if( o
26b30 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d  sFstat(pShmNode-
26b40 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  >h, &sStat) ){. 
26b50 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
26b60 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
26b70 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
26b80 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
26b90 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28    }.  .      if(
26ba0 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e   sStat.st_size<n
26bb0 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Byte ){.        
26bc0 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
26bd0 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64   memory region d
26be0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49  oes not exist. I
26bf0 66 20 62 45 78 74 65 6e 64 20 69 73 20 73 65 74  f bExtend is set
26c00 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   to.        ** f
26c10 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72 6c 79  alse, exit early
26c20 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65  . *pp will be se
26c30 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
26c40 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
26c50 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
26c60 20 20 20 20 20 69 66 28 20 21 62 45 78 74 65 6e       if( !bExten
26c70 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  d ){.          g
26c80 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
26c90 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
26ca0 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69      /* Alternati
26cb0 76 65 6c 79 2c 20 69 66 20 62 45 78 74 65 6e 64  vely, if bExtend
26cc0 20 69 73 20 74 72 75 65 2c 20 65 78 74 65 6e 64   is true, extend
26cd0 20 74 68 65 20 66 69 6c 65 2e 20 44 6f 20 74 68   the file. Do th
26ce0 69 73 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a  is by.        **
26cf0 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c   writing a singl
26d00 65 20 62 79 74 65 20 74 6f 20 74 68 65 20 65 6e  e byte to the en
26d10 64 20 6f 66 20 65 61 63 68 20 28 4f 53 29 20 70  d of each (OS) p
26d20 61 67 65 20 62 65 69 6e 67 0a 20 20 20 20 20 20  age being.      
26d30 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 6f    ** allocated o
26d40 72 20 65 78 74 65 6e 64 65 64 2e 20 54 65 63 68  r extended. Tech
26d50 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6e 65 65 64  nically, we need
26d60 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 6f 20 74   only write to t
26d70 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 61  he.        ** la
26d80 73 74 20 70 61 67 65 20 69 6e 20 6f 72 64 65 72  st page in order
26d90 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 66   to extend the f
26da0 69 6c 65 2e 20 42 75 74 20 77 72 69 74 69 6e 67  ile. But writing
26db0 20 74 6f 20 61 6c 6c 20 6e 65 77 0a 20 20 20 20   to all new.    
26dc0 20 20 20 20 2a 2a 20 70 61 67 65 73 20 66 6f 72      ** pages for
26dd0 63 65 73 20 74 68 65 20 4f 53 20 74 6f 20 61 6c  ces the OS to al
26de0 6c 6f 63 61 74 65 20 74 68 65 6d 20 69 6d 6d 65  locate them imme
26df0 64 69 61 74 65 6c 79 2c 20 77 68 69 63 68 20 72  diately, which r
26e00 65 64 75 63 65 73 0a 20 20 20 20 20 20 20 20 2a  educes.        *
26e10 2a 20 74 68 65 20 63 68 61 6e 63 65 73 20 6f 66  * the chances of
26e20 20 53 49 47 42 55 53 20 77 68 69 6c 65 20 61 63   SIGBUS while ac
26e30 63 65 73 73 69 6e 67 20 74 68 65 20 6d 61 70 70  cessing the mapp
26e40 65 64 20 72 65 67 69 6f 6e 20 6c 61 74 65 72 20  ed region later 
26e50 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  on..        */. 
26e60 20 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20 20         else{.   
26e70 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
26e80 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 34  nst int pgsz = 4
26e90 30 39 36 3b 0a 20 20 20 20 20 20 20 20 20 20 69  096;.          i
26ea0 6e 74 20 69 50 67 3b 0a 0a 20 20 20 20 20 20 20  nt iPg;..       
26eb0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74     /* Write to t
26ec0 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20  he last byte of 
26ed0 65 61 63 68 20 6e 65 77 6c 79 20 61 6c 6c 6f 63  each newly alloc
26ee0 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65 64  ated or extended
26ef0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
26f00 20 20 20 61 73 73 65 72 74 28 20 28 6e 42 79 74     assert( (nByt
26f10 65 20 25 20 70 67 73 7a 29 3d 3d 30 20 29 3b 0a  e % pgsz)==0 );.
26f20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 50            for(iP
26f30 67 3d 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  g=(sStat.st_size
26f40 2f 70 67 73 7a 29 3b 20 69 50 67 3c 28 6e 42 79  /pgsz); iPg<(nBy
26f50 74 65 2f 70 67 73 7a 29 3b 20 69 50 67 2b 2b 29  te/pgsz); iPg++)
26f60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
26f70 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t x = 0;.       
26f80 20 20 20 20 20 69 66 28 20 73 65 65 6b 41 6e 64       if( seekAnd
26f90 57 72 69 74 65 46 64 28 70 53 68 6d 4e 6f 64 65  WriteFd(pShmNode
26fa0 2d 3e 68 2c 20 69 50 67 2a 70 67 73 7a 20 2b 20  ->h, iPg*pgsz + 
26fb0 70 67 73 7a 2d 31 2c 20 22 22 2c 20 31 2c 20 26  pgsz-1, "", 1, &
26fc0 78 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  x)!=1 ){.       
26fd0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
26fe0 72 20 2a 7a 46 69 6c 65 20 3d 20 70 53 68 6d 4e  r *zFile = pShmN
26ff0 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a  ode->zFilename;.
27000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
27010 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
27020 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
27030 53 49 5a 45 2c 20 22 77 72 69 74 65 22 2c 20 7a  SIZE, "write", z
27040 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
27050 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
27060 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20  e_out;.         
27070 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
27080 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27090 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
270a0 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 74   Map the request
270b0 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
270c0 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
270d0 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61  sses address spa
270e0 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77  ce. */.    apNew
270f0 20 3d 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69   = (char **)sqli
27100 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20  te3_realloc(.   
27110 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
27120 70 52 65 67 69 6f 6e 2c 20 6e 52 65 71 52 65 67  pRegion, nReqReg
27130 69 6f 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 20  ion*sizeof(char 
27140 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  *).    );.    if
27150 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20  ( !apNew ){.    
27160 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
27170 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
27180 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
27190 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
271a0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65    pShmNode->apRe
271b0 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 20 20  gion = apNew;.  
271c0 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64    while( pShmNod
271d0 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52  e->nRegion<nReqR
271e0 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 69  egion ){.      i
271f0 6e 74 20 6e 4d 61 70 20 3d 20 73 7a 52 65 67 69  nt nMap = szRegi
27200 6f 6e 2a 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20  on*nShmPerMap;. 
27210 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
27220 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20    void *pMem;.  
27230 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
27240 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
27250 20 20 70 4d 65 6d 20 3d 20 6f 73 4d 6d 61 70 28    pMem = osMmap(
27260 30 2c 20 6e 4d 61 70 2c 0a 20 20 20 20 20 20 20  0, nMap,.       
27270 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69       pShmNode->i
27280 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50 52 4f 54  sReadonly ? PROT
27290 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f 52 45 41  _READ : PROT_REA
272a0 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20  D|PROT_WRITE, . 
272b0 20 20 20 20 20 20 20 20 20 20 20 4d 41 50 5f 53             MAP_S
272c0 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d  HARED, pShmNode-
272d0 3e 68 2c 20 73 7a 52 65 67 69 6f 6e 2a 28 69 36  >h, szRegion*(i6
272e0 34 29 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  4)pShmNode->nReg
272f0 69 6f 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ion.        );. 
27300 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d         if( pMem=
27310 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20  =MAP_FAILED ){. 
27320 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
27330 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
27340 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20  E_IOERR_SHMMAP, 
27350 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65  "mmap", pShmNode
27360 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
27370 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
27380 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
27390 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
273a0 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20  .        pMem = 
273b0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
273c0 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  (szRegion);.    
273d0 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30 20      if( pMem==0 
273e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
273f0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
27400 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
27410 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
27420 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27430 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20     memset(pMem, 
27440 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20  0, szRegion);.  
27450 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72      }..      for
27460 28 69 3d 30 3b 20 69 3c 6e 53 68 6d 50 65 72 4d  (i=0; i<nShmPerM
27470 61 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ap; i++){.      
27480 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65    pShmNode->apRe
27490 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e  gion[pShmNode->n
274a0 52 65 67 69 6f 6e 2b 69 5d 20 3d 20 26 28 28 63  Region+i] = &((c
274b0 68 61 72 2a 29 70 4d 65 6d 29 5b 73 7a 52 65 67  har*)pMem)[szReg
274c0 69 6f 6e 2a 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  ion*i];.      }.
274d0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
274e0 6e 52 65 67 69 6f 6e 20 2b 3d 20 6e 53 68 6d 50  nRegion += nShmP
274f0 65 72 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  erMap;.    }.  }
27500 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20  ..shmpage_out:. 
27510 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
27520 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29  Region>iRegion )
27530 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 53 68 6d  {.    *pp = pShm
27540 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69  Node->apRegion[i
27550 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65  Region];.  }else
27560 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20  {.    *pp = 0;. 
27570 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64   }.  if( pShmNod
27580 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26 26  e->isReadonly &&
27590 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
275a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
275b0 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33  DONLY;.  sqlite3
275c0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
275d0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
275e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
275f0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
27600 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61  lock state for a
27610 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
27620 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  egment..**.** No
27630 74 65 20 74 68 61 74 20 74 68 65 20 72 65 6c 61  te that the rela
27640 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e  tionship between
27650 20 53 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c   SHAREd and EXCL
27660 55 53 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61  USIVE locks is a
27670 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65   little.** diffe
27680 72 65 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69  rent here than i
27690 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68  n posix.  In xSh
276a0 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e  mLock(), one can
276b0 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65   go from unlocke
276c0 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61  d.** to shared a
276d0 6e 64 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20  nd back or from 
276e0 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c  unlocked to excl
276f0 75 73 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20  usive and back. 
27700 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20   But one may.** 
27710 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72  not go from shar
27720 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
27730 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76  or from exclusiv
27740 65 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a  e to shared..*/.
27750 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
27760 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65  hmLock(.  sqlite
27770 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
27780 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
27790 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68   file holding th
277a0 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
277b0 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
277c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277d0 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f  /* First lock to
277e0 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
277f0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20  ase */.  int n, 
27800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27810 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
27820 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72   locks to acquir
27830 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
27840 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
27850 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27860 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
27870 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  the lock */.){. 
27880 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64   unixFile *pDbFd
27890 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
278a0 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  ;      /* Connec
278b0 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61  tion holding sha
278c0 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
278d0 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62  unixShm *p = pDb
278e0 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20  Fd->pShm;       
278f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
27900 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67  red memory being
27910 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69   locked */.  uni
27920 78 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20  xShm *pX;       
27930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27940 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
27950 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69  g over all sibli
27960 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ngs */.  unixShm
27970 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d  Node *pShmNode =
27980 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f   p->pShmNode;  /
27990 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
279a0 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20   file iNode */. 
279b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
279c0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
279d0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
279e0 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d   code */.  u16 m
279f0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
27a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a10 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
27a20 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c  s to take or rel
27a30 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ease */..  asser
27a40 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62  t( pShmNode==pDb
27a50 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
27a60 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Node );.  assert
27a70 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f  ( pShmNode->pIno
27a80 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
27a90 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  e );.  assert( o
27aa0 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e  fst>=0 && ofst+n
27ab0 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  <=SQLITE_SHM_NLO
27ac0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
27ad0 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  n>=1 );.  assert
27ae0 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  ( flags==(SQLITE
27af0 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
27b00 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
27b10 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
27b20 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
27b30 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
27b40 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20  CLUSIVE).       
27b50 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
27b60 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
27b70 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
27b80 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
27b90 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
27ba0 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
27bb0 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b  HM_EXCLUSIVE) );
27bc0 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
27bd0 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  || (flags & SQLI
27be0 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
27bf0 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )!=0 );.  assert
27c00 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
27c10 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
27c20 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
27c30 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
27c40 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c  pShmNode->h<0 ||
27c50 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
27c60 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
27c70 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c  );..  mask = (1<
27c80 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c  <(ofst+n)) - (1<
27c90 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73 65 72 74  <ofst);.  assert
27ca0 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28  ( n>1 || mask==(
27cb0 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71  1<<ofst) );.  sq
27cc0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
27cd0 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
27ce0 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  x);.  if( flags 
27cf0 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  & SQLITE_SHM_UNL
27d00 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61  OCK ){.    u16 a
27d10 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d  llMask = 0; /* M
27d20 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ask of locks hel
27d30 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f  d by siblings */
27d40 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20  ..    /* See if 
27d50 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c  any siblings hol
27d60 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b  d this same lock
27d70 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
27d80 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
27d90 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
27da0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58  t){.      if( pX
27db0 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==p ) continue;.
27dc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
27dd0 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70  X->exclMask & (p
27de0 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68  ->exclMask|p->sh
27df0 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b  aredMask))==0 );
27e00 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c  .      allMask |
27e10 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
27e20 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
27e30 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65  Unlock the syste
27e40 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f  m-level locks */
27e50 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26  .    if( (mask &
27e60 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a   allMask)==0 ){.
27e70 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
27e80 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62  hmSystemLock(pDb
27e90 46 64 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73  Fd, F_UNLCK, ofs
27ea0 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c  t+UNIX_SHM_BASE,
27eb0 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
27ec0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
27ed0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  E_OK;.    }..   
27ee0 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63   /* Undo the loc
27ef0 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  al locks */.    
27f00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27f10 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78  K ){.      p->ex
27f20 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
27f30 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
27f40 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
27f50 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66     } .  }else if
27f60 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
27f70 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20  _SHM_SHARED ){. 
27f80 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64     u16 allShared
27f90 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20   = 0;  /* Union 
27fa0 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
27fb0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
27fc0 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a  er than "p" */..
27fd0 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20      /* Find out 
27fe0 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63  which shared loc
27ff0 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68  ks are already h
28000 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63  eld by sibling c
28010 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20  onnections..    
28020 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e  ** If any siblin
28030 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20  g already holds 
28040 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
28050 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  k, go ahead and 
28060 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51  return.    ** SQ
28070 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a  LITE_BUSY..    *
28080 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
28090 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
280a0 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
280b0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
280c0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
280d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
280e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
280f0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
28100 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
28110 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e  llShared |= pX->
28120 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
28130 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68  }..    /* Get sh
28140 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68  ared locks at th
28150 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20  e system level, 
28160 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
28170 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28180 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
28190 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20  f( (allShared & 
281a0 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
281b0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
281c0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64  SystemLock(pDbFd
281d0 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b  , F_RDLCK, ofst+
281e0 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
281f0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
28200 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
28210 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
28220 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
28230 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72  t the local shar
28240 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  ed locks */.    
28250 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28260 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68  K ){.      p->sh
28270 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  aredMask |= mask
28280 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
28290 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
282a0 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e  e no sibling con
282b0 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f  nections hold lo
282c0 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c  cks that will bl
282d0 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ock this.    ** 
282e0 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f  lock.  If any do
282f0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
28300 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e  BUSY right away.
28310 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
28320 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
28330 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
28340 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
28350 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
28360 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70  & mask)!=0 || (p
28370 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  X->sharedMask & 
28380 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  mask)!=0 ){.    
28390 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
283a0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72  BUSY;.        br
283b0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
283c0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74   }.  .    /* Get
283d0 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
283e0 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
283f0 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20  em level.  Then 
28400 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20  if successful.  
28410 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74    ** also mark t
28420 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74  he local connect
28430 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63  ion as being loc
28440 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ked..    */.    
28450 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28460 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
28470 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
28480 6b 28 70 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b  k(pDbFd, F_WRLCK
28490 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f  , ofst+UNIX_SHM_
284a0 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
284b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
284c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
284d0 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d  ert( (p->sharedM
284e0 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
284f0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63  ;.        p->exc
28500 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
28510 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
28520 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
28530 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
28540 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41  >mutex);.  OSTRA
28550 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68  CE(("SHM-LOCK sh
28560 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67  mid-%d, pid-%d g
28570 6f 74 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c  ot %03x,%03x\n",
28580 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69  .           p->i
28590 64 2c 20 6f 73 47 65 74 70 69 64 28 30 29 2c 20  d, osGetpid(0), 
285a0 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70  p->sharedMask, p
285b0 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20  ->exclMask));.  
285c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
285d0 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20  .** Implement a 
285e0 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f  memory barrier o
285f0 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f  r memory fence o
28600 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e  n shared memory.
28610 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61    .**.** All loa
28620 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65  ds and stores be
28630 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62  gun before the b
28640 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70  arrier must comp
28650 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61  lete before.** a
28660 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65  ny load or store
28670 20 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65   begun after the
28680 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61   barrier..*/.sta
28690 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d  tic void unixShm
286a0 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74  Barrier(.  sqlit
286b0 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20  e3_file *fd     
286c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
286d0 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64  tabase file hold
286e0 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
286f0 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e  emory */.){.  UN
28700 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
28710 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 65 6d  d);.  sqlite3Mem
28720 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20 20 20  oryBarrier();   
28730 20 20 20 20 20 20 2f 2a 20 63 6f 6d 70 69 6c 65        /* compile
28740 72 2d 64 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79  r-defined memory
28750 20 62 61 72 72 69 65 72 20 2a 2f 0a 20 20 61 73   barrier */.  as
28760 73 65 72 74 28 20 66 64 2d 3e 70 4d 65 74 68 6f  sert( fd->pMetho
28770 64 73 2d 3e 78 4c 6f 63 6b 3d 3d 6e 6f 6c 6f 63  ds->xLock==noloc
28780 6b 4c 6f 63 6b 20 0a 20 20 20 20 20 20 20 7c 7c  kLock .       ||
28790 20 75 6e 69 78 46 69 6c 65 4d 75 74 65 78 4e 6f   unixFileMutexNo
287a0 74 68 65 6c 64 28 28 75 6e 69 78 46 69 6c 65 2a  theld((unixFile*
287b0 29 66 64 29 20 0a 20 20 29 3b 0a 20 20 75 6e 69  )fd) .  );.  uni
287c0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 20  xEnterMutex();  
287d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
287e0 41 6c 73 6f 20 6d 75 74 65 78 2c 20 66 6f 72 20  Also mutex, for 
287f0 72 65 64 75 6e 64 61 6e 63 79 20 2a 2f 0a 20 20  redundancy */.  
28800 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
28810 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
28820 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
28830 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20   shared-memory. 
28840 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65   Delete the unde
28850 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61  rlying .** stora
28860 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67  ge if deleteFlag
28870 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20   is true..**.** 
28880 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  If there is no s
28890 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73  hared memory ass
288a0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
288b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65 6e   connection then
288c0 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
288d0 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
288e0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
288f0 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70  int unixShmUnmap
28900 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
28910 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20   *fd,           
28920 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
28930 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
28940 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c  ile */.  int del
28950 65 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20  eteFlag         
28960 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65           /* Dele
28970 74 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  te shared-memory
28980 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
28990 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20 20   unixShm *p;    
289a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289b0 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
289c0 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20  on to be closed 
289d0 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  */.  unixShmNode
289e0 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
289f0 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
28a00 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65  rlying shared-me
28a10 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75  mory file */.  u
28a20 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20  nixShm **pp;    
28a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28a40 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
28a50 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  er sibling conne
28a60 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78  ctions */.  unix
28a70 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20  File *pDbFd;    
28a80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
28a90 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
28aa0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
28ab0 20 20 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46    pDbFd = (unixF
28ac0 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70  ile*)fd;.  p = p
28ad0 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66  DbFd->pShm;.  if
28ae0 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
28af0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68  SQLITE_OK;.  pSh
28b00 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
28b10 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ode;..  assert( 
28b20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d  pShmNode==pDbFd-
28b30 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
28b40 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
28b50 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d  ShmNode->pInode=
28b60 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29  =pDbFd->pInode )
28b70 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63  ;..  /* Remove c
28b80 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d  onnection p from
28b90 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e   the set of conn
28ba0 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74  ections associat
28bb0 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68  ed.  ** with pSh
28bc0 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74  mNode */.  sqlit
28bd0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
28be0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
28bf0 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e  .  for(pp=&pShmN
28c00 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70  ode->pFirst; (*p
28c10 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70  p)!=p; pp = &(*p
28c20 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a  p)->pNext){}.  *
28c30 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a  pp = p->pNext;..
28c40 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f    /* Free the co
28c50 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20  nnection p */.  
28c60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
28c70 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d  .  pDbFd->pShm =
28c80 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   0;.  sqlite3_mu
28c90 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
28ca0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f  de->mutex);..  /
28cb0 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  * If pShmNode->n
28cc0 52 65 66 20 68 61 73 20 72 65 61 63 68 65 64 20  Ref has reached 
28cd0 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68  0, then close th
28ce0 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a  e underlying.  *
28cf0 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  * shared-memory 
28d00 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 61  file, too */.  a
28d10 73 73 65 72 74 28 20 75 6e 69 78 46 69 6c 65 4d  ssert( unixFileM
28d20 75 74 65 78 4e 6f 74 68 65 6c 64 28 70 44 62 46  utexNotheld(pDbF
28d30 64 29 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65  d) );.  unixEnte
28d40 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65  rMutex();.  asse
28d50 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  rt( pShmNode->nR
28d60 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f  ef>0 );.  pShmNo
28d70 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  de->nRef--;.  if
28d80 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
28d90 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64  ==0 ){.    if( d
28da0 65 6c 65 74 65 46 6c 61 67 20 26 26 20 70 53 68  eleteFlag && pSh
28db0 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  mNode->h>=0 ){. 
28dc0 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 53       osUnlink(pS
28dd0 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
28de0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e  e);.    }.    un
28df0 69 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  ixShmPurge(pDbFd
28e00 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61  );.  }.  unixLea
28e10 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65  veMutex();..  re
28e20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
28e30 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }...#else.# defi
28e40 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20  ne unixShmMap   
28e50 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69    0.# define uni
28e60 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20  xShmLock    0.# 
28e70 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 42 61  define unixShmBa
28e80 72 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65  rrier 0.# define
28e90 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20   unixShmUnmap   
28ea0 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  0.#endif /* #ifn
28eb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
28ec0 57 41 4c 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49  WAL */..#if SQLI
28ed0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
28ee0 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69  >0./*.** If it i
28ef0 73 20 63 75 72 72 65 6e 74 6c 79 20 6d 65 6d 6f  s currently memo
28f00 72 79 20 6d 61 70 70 65 64 2c 20 75 6e 6d 61 70  ry mapped, unmap
28f10 20 66 69 6c 65 20 70 46 64 2e 0a 2a 2f 0a 73 74   file pFd..*/.st
28f20 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 55 6e  atic void unixUn
28f30 6d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65  mapfile(unixFile
28f40 20 2a 70 46 64 29 7b 0a 20 20 61 73 73 65 72 74   *pFd){.  assert
28f50 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  ( pFd->nFetchOut
28f60 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 64  ==0 );.  if( pFd
28f70 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a  ->pMapRegion ){.
28f80 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 46 64      osMunmap(pFd
28f90 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 20 70 46  ->pMapRegion, pF
28fa0 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d->mmapSizeActua
28fb0 6c 29 3b 0a 20 20 20 20 70 46 64 2d 3e 70 4d 61  l);.    pFd->pMa
28fc0 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 20  pRegion = 0;.   
28fd0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d   pFd->mmapSize =
28fe0 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61   0;.    pFd->mma
28ff0 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b  pSizeActual = 0;
29000 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  .  }.}../*.** At
29010 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65  tempt to set the
29020 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 65 6d   size of the mem
29030 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 69 6e  ory mapping main
29040 74 61 69 6e 65 64 20 62 79 20 66 69 6c 65 20 0a  tained by file .
29050 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  ** descriptor pF
29060 64 20 74 6f 20 6e 4e 65 77 20 62 79 74 65 73 2e  d to nNew bytes.
29070 20 41 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61   Any existing ma
29080 70 70 69 6e 67 20 69 73 20 64 69 73 63 61 72 64  pping is discard
29090 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  ed..**.** If suc
290a0 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 66 75  cessful, this fu
290b0 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20  nction sets the 
290c0 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
290d0 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  les:.**.**      
290e0 20 75 6e 69 78 46 69 6c 65 2e 70 4d 61 70 52 65   unixFile.pMapRe
290f0 67 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 75 6e  gion.**       un
29100 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65 0a  ixFile.mmapSize.
29110 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c  **       unixFil
29120 65 2e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  e.mmapSizeActual
29130 0a 2a 2a 0a 2a 2a 20 49 66 20 75 6e 73 75 63 63  .**.** If unsucc
29140 65 73 73 66 75 6c 2c 20 61 6e 20 65 72 72 6f 72  essful, an error
29150 20 6d 65 73 73 61 67 65 20 69 73 20 6c 6f 67 67   message is logg
29160 65 64 20 76 69 61 20 73 71 6c 69 74 65 33 5f 6c  ed via sqlite3_l
29170 6f 67 28 29 20 61 6e 64 0a 2a 2a 20 74 68 65 20  og() and.** the 
29180 74 68 72 65 65 20 76 61 72 69 61 62 6c 65 73 20  three variables 
29190 61 62 6f 76 65 20 61 72 65 20 7a 65 72 6f 65 64  above are zeroed
291a0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 53  . In this case S
291b0 51 4c 69 74 65 20 73 68 6f 75 6c 64 0a 2a 2a 20  QLite should.** 
291c0 63 6f 6e 74 69 6e 75 65 20 61 63 63 65 73 73 69  continue accessi
291d0 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
291e0 75 73 69 6e 67 20 74 68 65 20 78 52 65 61 64 28  using the xRead(
291f0 29 20 61 6e 64 20 78 57 72 69 74 65 28 29 0a 2a  ) and xWrite().*
29200 2a 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74  * methods..*/.st
29210 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 52 65  atic void unixRe
29220 6d 61 70 66 69 6c 65 28 0a 20 20 75 6e 69 78 46  mapfile(.  unixF
29230 69 6c 65 20 2a 70 46 64 2c 20 20 20 20 20 20 20  ile *pFd,       
29240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
29250 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 62  le descriptor ob
29260 6a 65 63 74 20 2a 2f 0a 20 20 69 36 34 20 6e 4e  ject */.  i64 nN
29270 65 77 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ew              
29280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71            /* Req
29290 75 69 72 65 64 20 6d 61 70 70 69 6e 67 20 73 69  uired mapping si
292a0 7a 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ze */.){.  const
292b0 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 22 6d   char *zErr = "m
292c0 6d 61 70 22 3b 0a 20 20 69 6e 74 20 68 20 3d 20  map";.  int h = 
292d0 70 46 64 2d 3e 68 3b 20 20 20 20 20 20 20 20 20  pFd->h;         
292e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
292f0 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
29300 6f 70 65 6e 20 6f 6e 20 64 62 20 66 69 6c 65 20  open on db file 
29310 2a 2f 0a 20 20 75 38 20 2a 70 4f 72 69 67 20 3d  */.  u8 *pOrig =
29320 20 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70   (u8 *)pFd->pMap
29330 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 50 6f 69  Region;   /* Poi
29340 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20  nter to current 
29350 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 2a 2f 0a  file mapping */.
29360 20 20 69 36 34 20 6e 4f 72 69 67 20 3d 20 70 46    i64 nOrig = pF
29370 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d->mmapSizeActua
29380 6c 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  l;     /* Size o
29390 66 20 70 4f 72 69 67 20 72 65 67 69 6f 6e 20 69  f pOrig region i
293a0 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 38 20  n bytes */.  u8 
293b0 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20  *pNew = 0;      
293c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293d0 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 6f 66    /* Location of
293e0 20 6e 65 77 20 6d 61 70 70 69 6e 67 20 2a 2f 0a   new mapping */.
293f0 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 50 52    int flags = PR
29400 4f 54 5f 52 45 41 44 3b 20 20 20 20 20 20 20 20  OT_READ;        
29410 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
29420 74 6f 20 70 61 73 73 20 74 6f 20 6d 6d 61 70 28  to pass to mmap(
29430 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  ) */..  assert( 
29440 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  pFd->nFetchOut==
29450 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
29460 4e 65 77 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  New>pFd->mmapSiz
29470 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  e );.  assert( n
29480 4e 65 77 3c 3d 70 46 64 2d 3e 6d 6d 61 70 53 69  New<=pFd->mmapSi
29490 7a 65 4d 61 78 20 29 3b 0a 20 20 61 73 73 65 72  zeMax );.  asser
294a0 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 61  t( nNew>0 );.  a
294b0 73 73 65 72 74 28 20 70 46 64 2d 3e 6d 6d 61 70  ssert( pFd->mmap
294c0 53 69 7a 65 41 63 74 75 61 6c 3e 3d 70 46 64 2d  SizeActual>=pFd-
294d0 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20 61  >mmapSize );.  a
294e0 73 73 65 72 74 28 20 4d 41 50 5f 46 41 49 4c 45  ssert( MAP_FAILE
294f0 44 21 3d 30 20 29 3b 0a 0a 23 69 66 64 65 66 20  D!=0 );..#ifdef 
29500 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41 44  SQLITE_MMAP_READ
29510 57 52 49 54 45 0a 20 20 69 66 28 20 28 70 46 64  WRITE.  if( (pFd
29520 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
29530 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d  IXFILE_RDONLY)==
29540 30 20 29 20 66 6c 61 67 73 20 7c 3d 20 50 52 4f  0 ) flags |= PRO
29550 54 5f 57 52 49 54 45 3b 0a 23 65 6e 64 69 66 0a  T_WRITE;.#endif.
29560 0a 20 20 69 66 28 20 70 4f 72 69 67 20 29 7b 0a  .  if( pOrig ){.
29570 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a  #if HAVE_MREMAP.
29580 20 20 20 20 69 36 34 20 6e 52 65 75 73 65 20 3d      i64 nReuse =
29590 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3b 0a   pFd->mmapSize;.
295a0 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20  #else.    const 
295b0 69 6e 74 20 73 7a 53 79 73 70 61 67 65 20 3d 20  int szSyspage = 
295c0 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 3b  osGetpagesize();
295d0 0a 20 20 20 20 69 36 34 20 6e 52 65 75 73 65 20  .    i64 nReuse 
295e0 3d 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  = (pFd->mmapSize
295f0 20 26 20 7e 28 73 7a 53 79 73 70 61 67 65 2d 31   & ~(szSyspage-1
29600 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 75  ));.#endif.    u
29610 38 20 2a 70 52 65 71 20 3d 20 26 70 4f 72 69 67  8 *pReq = &pOrig
29620 5b 6e 52 65 75 73 65 5d 3b 0a 0a 20 20 20 20 2f  [nReuse];..    /
29630 2a 20 55 6e 6d 61 70 20 61 6e 79 20 70 61 67 65  * Unmap any page
29640 73 20 6f 66 20 74 68 65 20 65 78 69 73 74 69 6e  s of the existin
29650 67 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20 63  g mapping that c
29660 61 6e 6e 6f 74 20 62 65 20 72 65 75 73 65 64 2e  annot be reused.
29670 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 75   */.    if( nReu
29680 73 65 21 3d 6e 4f 72 69 67 20 29 7b 0a 20 20 20  se!=nOrig ){.   
29690 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 52 65 71     osMunmap(pReq
296a0 2c 20 6e 4f 72 69 67 2d 6e 52 65 75 73 65 29 3b  , nOrig-nReuse);
296b0 0a 20 20 20 20 7d 0a 0a 23 69 66 20 48 41 56 45  .    }..#if HAVE
296c0 5f 4d 52 45 4d 41 50 0a 20 20 20 20 70 4e 65 77  _MREMAP.    pNew
296d0 20 3d 20 6f 73 4d 72 65 6d 61 70 28 70 4f 72 69   = osMremap(pOri
296e0 67 2c 20 6e 52 65 75 73 65 2c 20 6e 4e 65 77 2c  g, nReuse, nNew,
296f0 20 4d 52 45 4d 41 50 5f 4d 41 59 4d 4f 56 45 29   MREMAP_MAYMOVE)
29700 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20 22 6d 72  ;.    zErr = "mr
29710 65 6d 61 70 22 3b 0a 23 65 6c 73 65 0a 20 20 20  emap";.#else.   
29720 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28 70   pNew = osMmap(p
29730 52 65 71 2c 20 6e 4e 65 77 2d 6e 52 65 75 73 65  Req, nNew-nReuse
29740 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41  , flags, MAP_SHA
29750 52 45 44 2c 20 68 2c 20 6e 52 65 75 73 65 29 3b  RED, h, nReuse);
29760 0a 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d 4d  .    if( pNew!=M
29770 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20  AP_FAILED ){.   
29780 20 20 20 69 66 28 20 70 4e 65 77 21 3d 70 52 65     if( pNew!=pRe
29790 71 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d  q ){.        osM
297a0 75 6e 6d 61 70 28 70 4e 65 77 2c 20 6e 4e 65 77  unmap(pNew, nNew
297b0 20 2d 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20   - nReuse);.    
297c0 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
297d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
297e0 20 20 20 70 4e 65 77 20 3d 20 70 4f 72 69 67 3b     pNew = pOrig;
297f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
29800 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68  endif..    /* Th
29810 65 20 61 74 74 65 6d 70 74 20 74 6f 20 65 78 74  e attempt to ext
29820 65 6e 64 20 74 68 65 20 65 78 69 73 74 69 6e 67  end the existing
29830 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2e   mapping failed.
29840 20 46 72 65 65 20 69 74 2e 20 2a 2f 0a 20 20 20   Free it. */.   
29850 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46   if( pNew==MAP_F
29860 41 49 4c 45 44 20 7c 7c 20 70 4e 65 77 3d 3d 30  AILED || pNew==0
29870 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d   ){.      osMunm
29880 61 70 28 70 4f 72 69 67 2c 20 6e 52 65 75 73 65  ap(pOrig, nReuse
29890 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
298a0 2f 2a 20 49 66 20 70 4e 65 77 20 69 73 20 73 74  /* If pNew is st
298b0 69 6c 6c 20 4e 55 4c 4c 2c 20 74 72 79 20 74 6f  ill NULL, try to
298c0 20 63 72 65 61 74 65 20 61 6e 20 65 6e 74 69 72   create an entir
298d0 65 6c 79 20 6e 65 77 20 6d 61 70 70 69 6e 67 2e  ely new mapping.
298e0 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   */.  if( pNew==
298f0 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  0 ){.    pNew = 
29900 6f 73 4d 6d 61 70 28 30 2c 20 6e 4e 65 77 2c 20  osMmap(0, nNew, 
29910 66 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41 52 45  flags, MAP_SHARE
29920 44 2c 20 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  D, h, 0);.  }.. 
29930 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46   if( pNew==MAP_F
29940 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 70 4e 65  AILED ){.    pNe
29950 77 20 3d 20 30 3b 0a 20 20 20 20 6e 4e 65 77 20  w = 0;.    nNew 
29960 3d 20 30 3b 0a 20 20 20 20 75 6e 69 78 4c 6f 67  = 0;.    unixLog
29970 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4f 4b 2c  Error(SQLITE_OK,
29980 20 7a 45 72 72 2c 20 70 46 64 2d 3e 7a 50 61 74   zErr, pFd->zPat
29990 68 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  h);..    /* If t
299a0 68 65 20 6d 6d 61 70 28 29 20 61 62 6f 76 65 20  he mmap() above 
299b0 66 61 69 6c 65 64 2c 20 61 73 73 75 6d 65 20 74  failed, assume t
299c0 68 61 74 20 61 6c 6c 20 73 75 62 73 65 71 75 65  hat all subseque
299d0 6e 74 20 6d 6d 61 70 28 29 20 63 61 6c 6c 73 0a  nt mmap() calls.
299e0 20 20 20 20 2a 2a 20 77 69 6c 6c 20 70 72 6f 62      ** will prob
299f0 61 62 6c 79 20 66 61 69 6c 20 74 6f 6f 2e 20 46  ably fail too. F
29a00 61 6c 6c 20 62 61 63 6b 20 74 6f 20 75 73 69 6e  all back to usin
29a10 67 20 78 52 65 61 64 2f 78 57 72 69 74 65 20 65  g xRead/xWrite e
29a20 78 63 6c 75 73 69 76 65 6c 79 0a 20 20 20 20 2a  xclusively.    *
29a30 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  * in this case. 
29a40 20 2a 2f 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61   */.    pFd->mma
29a50 70 53 69 7a 65 4d 61 78 20 3d 20 30 3b 0a 20 20  pSizeMax = 0;.  
29a60 7d 0a 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67  }.  pFd->pMapReg
29a70 69 6f 6e 20 3d 20 28 76 6f 69 64 20 2a 29 70 4e  ion = (void *)pN
29a80 65 77 3b 0a 20 20 70 46 64 2d 3e 6d 6d 61 70 53  ew;.  pFd->mmapS
29a90 69 7a 65 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53  ize = pFd->mmapS
29aa0 69 7a 65 41 63 74 75 61 6c 20 3d 20 6e 4e 65 77  izeActual = nNew
29ab0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72  ;.}../*.** Memor
29ac0 79 20 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74  y map or remap t
29ad0 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62  he file opened b
29ae0 79 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  y file-descripto
29af0 72 20 70 46 64 20 28 69 66 20 74 68 65 20 66 69  r pFd (if the fi
29b00 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79  le.** is already
29b10 20 6d 61 70 70 65 64 2c 20 74 68 65 20 65 78 69   mapped, the exi
29b20 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73  sting mapping is
29b30 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65   replaced by the
29b40 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a   new). Or, if .*
29b50 2a 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 20  * there already 
29b60 65 78 69 73 74 73 20 61 20 6d 61 70 70 69 6e 67  exists a mapping
29b70 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
29b80 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 73 74  and there are st
29b90 69 6c 6c 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64  ill .** outstand
29ba0 69 6e 67 20 78 46 65 74 63 68 28 29 20 72 65 66  ing xFetch() ref
29bb0 65 72 65 6e 63 65 73 20 74 6f 20 69 74 2c 20 74  erences to it, t
29bc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
29bd0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
29be0 66 20 70 61 72 61 6d 65 74 65 72 20 6e 42 79 74  f parameter nByt
29bf0 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  e is non-negativ
29c00 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  e, then it is th
29c10 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  e requested size
29c20 20 6f 66 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70   of .** the mapp
29c30 69 6e 67 20 74 6f 20 63 72 65 61 74 65 2e 20 4f  ing to create. O
29c40 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 42 79  therwise, if nBy
29c50 74 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  te is less than 
29c60 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a  zero, then the .
29c70 2a 2a 20 72 65 71 75 65 73 74 65 64 20 73 69 7a  ** requested siz
29c80 65 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  e is the size of
29c90 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
29ca0 6b 2e 20 54 68 65 20 61 63 74 75 61 6c 20 73 69  k. The actual si
29cb0 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65  ze of the.** cre
29cc0 61 74 65 64 20 6d 61 70 70 69 6e 67 20 69 73 20  ated mapping is 
29cd0 65 69 74 68 65 72 20 74 68 65 20 72 65 71 75 65  either the reque
29ce0 73 74 65 64 20 73 69 7a 65 20 6f 72 20 74 68 65  sted size or the
29cf0 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65   value configure
29d00 64 20 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49  d .** using SQLI
29d10 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 4c 49  TE_FCNTL_MMAP_LI
29d20 4d 49 54 2c 20 77 68 69 63 68 65 76 65 72 20 69  MIT, whichever i
29d30 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  s smaller..**.**
29d40 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
29d50 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
29d60 6f 72 20 6f 63 63 75 72 73 20 28 65 76 65 6e 20  or occurs (even 
29d70 69 66 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69  if the mapping i
29d80 73 20 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74  s not.** recreat
29d90 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ed as a result o
29da0 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  f outstanding re
29db0 66 65 72 65 6e 63 65 73 29 20 6f 72 20 61 6e 20  ferences) or an 
29dc0 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20  SQLite error.** 
29dd0 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
29de0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
29df0 69 78 4d 61 70 66 69 6c 65 28 75 6e 69 78 46 69  ixMapfile(unixFi
29e00 6c 65 20 2a 70 46 64 2c 20 69 36 34 20 6e 4d 61  le *pFd, i64 nMa
29e10 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6e 4d  p){.  assert( nM
29e20 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46  ap>=0 || pFd->nF
29e30 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20  etchOut==0 );.  
29e40 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 30 20 7c  assert( nMap>0 |
29e50 7c 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  | (pFd->mmapSize
29e60 3d 3d 30 20 26 26 20 70 46 64 2d 3e 70 4d 61 70  ==0 && pFd->pMap
29e70 52 65 67 69 6f 6e 3d 3d 30 29 20 29 3b 0a 20 20  Region==0) );.  
29e80 69 66 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f  if( pFd->nFetchO
29e90 75 74 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51  ut>0 ) return SQ
29ea0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
29eb0 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20 73 74  nMap<0 ){.    st
29ec0 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75  ruct stat statbu
29ed0 66 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  f;          /* L
29ee0 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e  ow-level file in
29ef0 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  formation */.   
29f00 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 46 64   if( osFstat(pFd
29f10 2d 3e 68 2c 20 26 73 74 61 74 62 75 66 29 20 29  ->h, &statbuf) )
29f20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
29f30 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
29f40 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61  T;.    }.    nMa
29f50 70 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 73  p = statbuf.st_s
29f60 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  ize;.  }.  if( n
29f70 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  Map>pFd->mmapSiz
29f80 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70  eMax ){.    nMap
29f90 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65   = pFd->mmapSize
29fa0 4d 61 78 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  Max;.  }..  asse
29fb0 72 74 28 20 6e 4d 61 70 3e 30 20 7c 7c 20 28 70  rt( nMap>0 || (p
29fc0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3d 3d 30 20  Fd->mmapSize==0 
29fd0 26 26 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69  && pFd->pMapRegi
29fe0 6f 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20  on==0) );.  if( 
29ff0 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53  nMap!=pFd->mmapS
2a000 69 7a 65 20 29 7b 0a 20 20 20 20 75 6e 69 78 52  ize ){.    unixR
2a010 65 6d 61 70 66 69 6c 65 28 70 46 64 2c 20 6e 4d  emapfile(pFd, nM
2a020 61 70 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ap);.  }..  retu
2a030 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2a040 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2a050 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
2a060 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f   */../*.** If po
2a070 73 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61  ssible, return a
2a080 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61   pointer to a ma
2a090 70 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64  pping of file fd
2a0a0 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66   starting at off
2a0b0 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65  set.** iOff. The
2a0c0 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65   mapping must be
2a0d0 20 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65   valid for at le
2a0e0 61 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a  ast nAmt bytes..
2a0f0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20  **.** If such a 
2a100 70 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f  pointer can be o
2a110 62 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69  btained, store i
2a120 74 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74  t in *pp and ret
2a130 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
2a140 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e  * Or, if one can
2a150 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  not but no error
2a160 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70   occurs, set *pp
2a170 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e   to 0 and return
2a180 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46   SQLITE_OK..** F
2a190 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72  inally, if an er
2a1a0 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  ror does occur, 
2a1b0 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
2a1c0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65   error code. The
2a1d0 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20   final.** value 
2a1e0 6f 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69  of *pp is undefi
2a1f0 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ned in this case
2a200 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
2a210 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65  function does re
2a220 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20  turn a pointer, 
2a230 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  the caller must 
2a240 65 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72  eventually .** r
2a250 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72  elease the refer
2a260 65 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  ence by calling 
2a270 75 6e 69 78 55 6e 66 65 74 63 68 28 29 2e 0a 2a  unixUnfetch()..*
2a280 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2a290 78 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66  xFetch(sqlite3_f
2a2a0 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66  ile *fd, i64 iOf
2a2b0 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69  f, int nAmt, voi
2a2c0 64 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c  d **pp){.#if SQL
2a2d0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
2a2e0 45 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  E>0.  unixFile *
2a2f0 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  pFd = (unixFile 
2a300 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75  *)fd;   /* The u
2a310 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
2a320 73 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69  se file */.#endi
2a330 66 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 23 69  f.  *pp = 0;..#i
2a340 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
2a350 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70  P_SIZE>0.  if( p
2a360 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e  Fd->mmapSizeMax>
2a370 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 64  0 ){.    if( pFd
2a380 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20  ->pMapRegion==0 
2a390 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
2a3a0 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46  = unixMapfile(pF
2a3b0 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66  d, -1);.      if
2a3c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2a3d0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2a3e0 20 7d 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e   }.    if( pFd->
2a3f0 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66  mmapSize >= iOff
2a400 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a  +nAmt ){.      *
2a410 70 70 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64  pp = &((u8 *)pFd
2a420 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f  ->pMapRegion)[iO
2a430 66 66 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e  ff];.      pFd->
2a440 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20  nFetchOut++;.   
2a450 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
2a460 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2a470 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
2a480 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
2a490 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68   is non-NULL, th
2a4a0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
2a4b0 20 72 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20   releases a .** 
2a4c0 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e  reference obtain
2a4d0 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
2a4e0 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 65 74   call to unixFet
2a4f0 63 68 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64  ch(). The second
2a500 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73  .** argument pas
2a510 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
2a520 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65  tion must be the
2a530 20 73 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72   same as the cor
2a540 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72  responding.** ar
2a550 67 75 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20  gument that was 
2a560 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 75 6e  passed to the un
2a570 69 78 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61  ixFetch() invoca
2a580 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c  tion. .**.** Or,
2a590 20 69 66 20 74 68 65 20 74 68 69 72 64 20 61 72   if the third ar
2a5a0 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20  gument is NULL, 
2a5b0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
2a5c0 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  on is being call
2a5d0 65 64 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d  ed .** to inform
2a5e0 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 74   the VFS layer t
2a5f0 68 61 74 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  hat, according t
2a600 6f 20 50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69  o POSIX, any exi
2a610 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a  sting mapping .*
2a620 2a 20 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e 76  * may now be inv
2a630 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20  alid and should 
2a640 62 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a  be unmapped..*/.
2a650 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55  static int unixU
2a660 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66  nfetch(sqlite3_f
2a670 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66  ile *fd, i64 iOf
2a680 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66  f, void *p){.#if
2a690 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
2a6a0 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69  _SIZE>0.  unixFi
2a6b0 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46  le *pFd = (unixF
2a6c0 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54  ile *)fd;   /* T
2a6d0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
2a6e0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2a6f0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2a700 52 28 69 4f 66 66 29 3b 0a 0a 20 20 2f 2a 20 49  R(iOff);..  /* I
2a710 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68  f p==0 (unmap th
2a720 65 20 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74  e entire file) t
2a730 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
2a740 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
2a750 20 0a 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65   .  ** xFetch re
2a760 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66  ferences. Or, if
2a770 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69   p!=0 (meaning i
2a780 74 20 69 73 20 61 6e 20 78 46 65 74 63 68 20 72  t is an xFetch r
2a790 65 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20  eference),.  ** 
2a7a0 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
2a7b0 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
2a7c0 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f  outstanding.  */
2a7d0 0a 20 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30  .  assert( (p==0
2a7e0 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f  )==(pFd->nFetchO
2a7f0 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  ut==0) );..  /* 
2a800 49 66 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74  If p!=0, it must
2a810 20 6d 61 74 63 68 20 74 68 65 20 69 4f 66 66 20   match the iOff 
2a820 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65  value. */.  asse
2a830 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26  rt( p==0 || p==&
2a840 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70  ((u8 *)pFd->pMap
2a850 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b  Region)[iOff] );
2a860 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ..  if( p ){.   
2a870 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d   pFd->nFetchOut-
2a880 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  -;.  }else{.    
2a890 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46  unixUnmapfile(pF
2a8a0 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  d);.  }..  asser
2a8b0 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  t( pFd->nFetchOu
2a8c0 74 3e 3d 30 20 29 3b 0a 23 65 6c 73 65 0a 20 20  t>=0 );.#else.  
2a8d0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2a8e0 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  (fd);.  UNUSED_P
2a8f0 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 55  ARAMETER(p);.  U
2a900 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2a910 69 4f 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20  iOff);.#endif.  
2a920 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2a930 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20  ;.}../*.** Here 
2a940 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ends the impleme
2a950 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73  ntation of all s
2a960 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68  qlite3_file meth
2a970 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ods..**.********
2a980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
2a990 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nd sqlite3_file 
2a9a0 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  Methods ********
2a9b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a9c0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
2a9d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a9e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a9f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa10 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  ******/../*.** T
2aa20 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  his division con
2aa30 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e  tains definition
2aa40 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f  s of sqlite3_io_
2aa50 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20  methods objects 
2aa60 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  that.** implemen
2aa70 74 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20 6c  t various file l
2aa80 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65  ocking strategie
2aa90 73 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74  s.  It also cont
2aaa0 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73  ains definitions
2aab0 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22 20  .** of "finder" 
2aac0 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66 69  functions.  A fi
2aad0 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73  nder-function is
2aae0 20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20   used to locate 
2aaf0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a  the appropriate.
2ab00 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  ** sqlite3_io_me
2ab10 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f 72  thods object for
2ab20 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
2ab30 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
2ab40 65 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66 69  e pAppData.** fi
2ab50 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74  eld of the sqlit
2ab60 65 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65 63  e3_vfs VFS objec
2ab70 74 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a  ts are initializ
2ab80 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65 72  ed to be pointer
2ab90 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72  s to.** the corr
2aba0 65 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  ect finder-funct
2abb0 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46 53  ion for that VFS
2abc0 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e  ..**.** Most fin
2abd0 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  der functions re
2abe0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
2abf0 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69 74 65  o a fixed sqlite
2ac00 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20  3_io_methods.** 
2ac10 6f 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c  object.  The onl
2ac20 79 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66 69  y interesting fi
2ac30 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73  nder-function is
2ac40 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
2ac50 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b  r, which.** look
2ac60 73 20 61 74 20 74 68 65 20 66 69 6c 65 73 79 73  s at the filesys
2ac70 74 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72 69  tem type and tri
2ac80 65 73 20 74 6f 20 67 75 65 73 73 20 74 68 65 20  es to guess the 
2ac90 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  best locking.** 
2aca0 73 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74 68  strategy from th
2acb0 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69  at..**.** For fi
2acc0 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 46 2c  nder-function F,
2acd0 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65   two objects are
2ace0 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20   created:.**.** 
2acf0 20 20 20 28 31 29 20 54 68 65 20 72 65 61 6c 20     (1) The real 
2ad00 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
2ad10 6e 61 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e  named "FImpt()".
2ad20 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20  .**.**    (2) A 
2ad30 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72  constant pointer
2ad40 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
2ad50 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22  n named just "F"
2ad60 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69  ..**.**.** A poi
2ad70 6e 74 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f  nter to the F po
2ad80 69 6e 74 65 72 20 69 73 20 75 73 65 64 20 61 73  inter is used as
2ad90 20 74 68 65 20 70 41 70 70 44 61 74 61 20 76 61   the pAppData va
2ada0 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f  lue for VFS.** o
2adb0 62 6a 65 63 74 73 2e 20 20 57 65 20 68 61 76 65  bjects.  We have
2adc0 20 74 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74   to do this inst
2add0 65 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70  ead of letting p
2ade0 41 70 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a  AppData point.**
2adf0 20 64 69 72 65 63 74 6c 79 20 61 74 20 74 68 65   directly at the
2ae00 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
2ae10 20 73 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73   since C90 rules
2ae20 20 70 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a   prevent a void*
2ae30 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74  .** from be cast
2ae40 20 69 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e   into a function
2ae50 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a   pointer..**.**.
2ae60 2a 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65  ** Each instance
2ae70 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67   of this macro g
2ae80 65 6e 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a  enerates two obj
2ae90 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ects:.**.**   * 
2aea0 20 41 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69   A constant sqli
2aeb0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
2aec0 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f  bject call METHO
2aed0 44 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69  D that has locki
2aee0 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f  ng.**      metho
2aef0 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20  ds CLOSE, LOCK, 
2af00 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43  UNLOCK, CKRESLOC
2af10 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e  K..**.**   *  An
2af20 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64   I/O method find
2af30 65 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  er function call
2af40 65 64 20 46 49 4e 44 45 52 20 74 68 61 74 20 72  ed FINDER that r
2af50 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
2af60 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
2af70 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e  METHOD object in
2af80 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 75   the previous bu
2af90 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  llet..*/.#define
2afa0 20 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45   IOMETHODS(FINDE
2afb0 52 2c 4d 45 54 48 4f 44 2c 56 45 52 53 49 4f 4e  R,METHOD,VERSION
2afc0 2c 43 4c 4f 53 45 2c 4c 4f 43 4b 2c 55 4e 4c 4f  ,CLOSE,LOCK,UNLO
2afd0 43 4b 2c 43 4b 4c 4f 43 4b 2c 53 48 4d 4d 41 50  CK,CKLOCK,SHMMAP
2afe0 29 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63  )     \.static c
2aff0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
2b000 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d  methods METHOD =
2b010 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
2b020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b030 20 20 20 20 20 5c 0a 20 20 20 56 45 52 53 49 4f       \.   VERSIO
2b040 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N,              
2b050 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
2b060 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  n */            
2b070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b080 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20      \.   CLOSE, 
2b090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0a0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a       /* xClose *
2b0b0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0d0 20 20 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64     \.   unixRead
2b0e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b0f0 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20      /* xRead */ 
2b100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b120 20 20 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65    \.   unixWrite
2b130 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b140 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20     /* xWrite */ 
2b150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b170 20 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61   \.   unixTrunca
2b180 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
2b190 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a    /* xTruncate *
2b1a0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2b1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1c0 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20  \.   unixSync,  
2b1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1e0 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20   /* xSync */    
2b1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2b210 0a 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65  .   unixFileSize
2b220 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b230 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20  /* xFileSize */ 
2b240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2b260 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20     LOCK,        
2b270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b280 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  * xLock */      
2b290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2b2b0 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20    UNLOCK,       
2b2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b2d0 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20   xUnlock */     
2b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2f0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2b300 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20   CKLOCK,        
2b310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b320 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
2b330 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
2b340 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
2b350 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c  unixFileControl,
2b360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b370 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20  FileControl */  
2b380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b390 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
2b3a0 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20  nixSectorSize,  
2b3b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
2b3c0 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20  ectorSize */    
2b3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3e0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
2b3f0 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ixDeviceCharacte
2b400 72 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65  ristics,  /* xDe
2b410 76 69 63 65 43 61 70 61 62 69 6c 69 74 69 65 73  viceCapabilities
2b420 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2b430 20 20 20 20 20 20 20 20 5c 0a 20 20 20 53 48 4d          \.   SHM
2b440 4d 41 50 2c 20 20 20 20 20 20 20 20 20 20 20 20  MAP,            
2b450 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
2b460 4d 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20  Map */          
2b470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b480 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
2b490 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ShmLock,        
2b4a0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c          /* xShmL
2b4b0 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
2b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4d0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
2b4e0 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20  hmBarrier,      
2b4f0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61         /* xShmBa
2b500 72 72 69 65 72 20 2a 2f 20 20 20 20 20 20 20 20  rrier */        
2b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b520 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
2b530 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20  mUnmap,         
2b540 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d        /* xShmUnm
2b550 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ap */           
2b560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b570 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 65 74      \.   unixFet
2b580 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ch,             
2b590 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a       /* xFetch *
2b5a0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2b5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b5c0 20 20 20 5c 0a 20 20 20 75 6e 69 78 55 6e 66 65     \.   unixUnfe
2b5d0 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  tch,            
2b5e0 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20      /* xUnfetch 
2b5f0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
2b600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b610 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20    \.};          
2b620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b660 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20   \.static const 
2b670 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2b680 64 73 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c  ds *FINDER##Impl
2b690 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
2b6a0 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20 20 20  unixFile *p){   
2b6b0 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  \.  UNUSED_PARAM
2b6c0 45 54 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f  ETER(z); UNUSED_
2b6d0 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20  PARAMETER(p);   
2b6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2b700 0a 20 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f  .  return &METHO
2b710 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D;              
2b720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2b750 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
2b760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b790 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73               \.s
2b7a0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
2b7b0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
2b7c0 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28  (*const FINDER)(
2b7d0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
2b7e0 46 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20 20  File *p)    \.  
2b7f0 20 20 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c    = FINDER##Impl
2b800 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72  ;../*.** Here ar
2b810 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c  e all of the sql
2b820 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2b830 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68  objects for each
2b840 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69   of the.** locki
2b850 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20  ng strategies.  
2b860 46 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72  Functions that r
2b870 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74  eturn pointers t
2b880 6f 20 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a  o these methods.
2b890 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61  ** are also crea
2b8a0 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44  ted..*/.IOMETHOD
2b8b0 53 28 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64  S(.  posixIoFind
2b8c0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
2b8d0 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
2b8e0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69  n name */.  posi
2b8f0 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  xIoMethods,     
2b900 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
2b910 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
2b920 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20  ct name */.  3, 
2b930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b940 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
2b950 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6d 6d 61 70   memory and mmap
2b960 20 61 72 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   are enabled */.
2b970 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20    unixClose,    
2b980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b990 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
2b9a0 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20    unixLock,     
2b9b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b9c0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
2b9d0 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20   unixUnlock,    
2b9e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
2b9f0 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
2ba00 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72    unixCheckReser
2ba10 76 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78  vedLock,    /* x
2ba20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2ba30 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
2ba40 69 78 53 68 6d 4d 61 70 20 20 20 20 20 20 20 20  ixShmMap        
2ba50 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
2ba60 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49  ap method */.).I
2ba70 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f  OMETHODS(.  nolo
2ba80 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ckIoFinder,     
2ba90 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
2baa0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
2bab0 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  .  nolockIoMetho
2bac0 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ds,          /* 
2bad0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2bae0 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
2baf0 2f 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20 20  /.  3,          
2bb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bb10 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61   shared memory a
2bb20 6e 64 20 6d 6d 61 70 20 61 72 65 20 65 6e 61 62  nd mmap are enab
2bb30 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43  led */.  nolockC
2bb40 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
2bb50 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
2bb60 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c  hod */.  nolockL
2bb70 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2bb80 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
2bb90 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e  od */.  nolockUn
2bba0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
2bbb0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
2bbc0 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43  hod */.  nolockC
2bbd0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2bbe0 2c 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65  ,  /* xCheckRese
2bbf0 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
2bc00 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
2bc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bc20 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64  * xShmMap method
2bc30 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28   */.).IOMETHODS(
2bc40 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64  .  dotlockIoFind
2bc50 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  er,          /* 
2bc60 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
2bc70 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  name */.  dotloc
2bc80 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  kIoMethods,     
2bc90 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
2bca0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
2bcb0 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
2bcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bcd0 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
2bce0 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
2bcf0 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c  d */.  dotlockCl
2bd00 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
2bd10 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
2bd20 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f  d */.  dotlockLo
2bd30 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
2bd40 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
2bd50 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c   */.  dotlockUnl
2bd60 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2bd70 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
2bd80 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68  d */.  dotlockCh
2bd90 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
2bda0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
2bdb0 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
2bdc0 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  .  0            
2bdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bde0 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
2bdf0 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  /.)..#if SQLITE_
2be00 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2be10 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  TYLE.IOMETHODS(.
2be20 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c    flockIoFinder,
2be30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2be40 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
2be50 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f  ame */.  flockIo
2be60 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
2be70 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
2be80 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
2be90 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
2bea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2beb0 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
2bec0 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
2bed0 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65   */.  flockClose
2bee0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2bef0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
2bf00 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c   */.  flockLock,
2bf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
2bf30 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b  */.  flockUnlock
2bf40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2bf50 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
2bf60 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b   */.  flockCheck
2bf70 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
2bf80 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
2bf90 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
2bfa0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
2bfb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2bfc0 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
2bfd0 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f  .).#endif..#if O
2bfe0 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48  S_VXWORKS.IOMETH
2bff0 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64  ODS(.  semIoFind
2c000 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
2c010 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
2c020 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65  ion name */.  se
2c030 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  mIoMethods,     
2c040 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
2c050 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
2c060 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
2c070 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2c080 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
2c090 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
2c0a0 61 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 58 43  abled */.  semXC
2c0b0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
2c0c0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
2c0d0 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 4c  ethod */.  semXL
2c0e0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2c0f0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
2c100 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 55 6e  thod */.  semXUn
2c110 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
2c120 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
2c130 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 43  ethod */.  semXC
2c140 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2c150 2c 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  ,    /* xCheckRe
2c160 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
2c170 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
2c180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c190 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
2c1a0 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
2c1b0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
2c1c0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
2c1d0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2c1e0 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28  STYLE.IOMETHODS(
2c1f0 0a 20 20 61 66 70 49 6f 46 69 6e 64 65 72 2c 20  .  afpIoFinder, 
2c200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c210 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
2c220 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d  name */.  afpIoM
2c230 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
2c240 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
2c250 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
2c260 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
2c270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c280 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
2c290 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
2c2a0 64 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c  d */.  afpClose,
2c2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c2c0 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
2c2d0 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20  d */.  afpLock, 
2c2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c2f0 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
2c300 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c   */.  afpUnlock,
2c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c320 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
2c330 64 20 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b 52  d */.  afpCheckR
2c340 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
2c350 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
2c360 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
2c370 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  .  0            
2c380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c390 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
2c3a0 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  /.).#endif../*.*
2c3b0 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  * The proxy lock
2c3c0 69 6e 67 20 6d 65 74 68 6f 64 20 69 73 20 61 20  ing method is a 
2c3d0 22 73 75 70 65 72 2d 6d 65 74 68 6f 64 22 20 69  "super-method" i
2c3e0 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68 61 74  n the sense that
2c3f0 20 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63   it.** opens sec
2c400 6f 6e 64 61 72 79 20 66 69 6c 65 20 64 65 73 63  ondary file desc
2c410 72 69 70 74 6f 72 73 20 66 6f 72 20 74 68 65 20  riptors for the 
2c420 63 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66  conch and lock f
2c430 69 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75  iles and.** it u
2c440 73 65 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66  ses proxy, dot-f
2c450 69 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c  ile, AFP, and fl
2c460 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65  ock() locking me
2c470 74 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a  thods on those.*
2c480 2a 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65  * secondary file
2c490 73 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65 61  s.  For this rea
2c4a0 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f  son, the divisio
2c4b0 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  n that implement
2c4c0 73 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69  s.** proxy locki
2c4d0 6e 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6d 75  ng is located mu
2c4e0 63 68 20 66 75 72 74 68 65 72 20 64 6f 77 6e 20  ch further down 
2c4f0 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 42 75  in the file.  Bu
2c500 74 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20  t we need.** to 
2c510 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64 65 66  go ahead and def
2c520 69 6e 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ine the sqlite3_
2c530 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20 66  io_methods and f
2c540 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a  inder function.*
2c550 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b  * for proxy lock
2c560 69 6e 67 20 68 65 72 65 2e 20 20 53 6f 20 77 65  ing here.  So we
2c570 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 65   forward declare
2c580 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73   the I/O methods
2c590 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
2c5a0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
2c5b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2c5c0 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74 69  KING_STYLE.stati
2c5d0 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65  c int proxyClose
2c5e0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b  (sqlite3_file*);
2c5f0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2c600 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  yLock(sqlite3_fi
2c610 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69  le*, int);.stati
2c620 63 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63  c int proxyUnloc
2c630 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
2c640 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e   int);.static in
2c650 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65  t proxyCheckRese
2c660 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
2c670 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49  _file*, int*);.I
2c680 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 72 6f 78  OMETHODS(.  prox
2c690 79 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  yIoFinder,      
2c6a0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
2c6b0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
2c6c0 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64  .  proxyIoMethod
2c6d0 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
2c6e0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2c6f0 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
2c700 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
2c710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c720 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
2c730 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
2c740 70 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20 20  proxyClose,     
2c750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
2c760 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
2c770 70 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20  proxyLock,      
2c780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
2c790 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70  ck method */.  p
2c7a0 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  roxyUnlock,     
2c7b0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
2c7c0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2c7d0 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76  proxyCheckReserv
2c7e0 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78 43 68  edLock,   /* xCh
2c7f0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
2c800 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20  method */.  0   
2c810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c820 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
2c830 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
2c840 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b  dif../* nfs lock
2c850 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64  d on OSX 10.3+ d
2c860 6f 65 73 6e 27 74 20 63 6c 65 61 72 20 77 72 69  oesn't clear wri
2c870 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20  te locks when a 
2c880 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74  read lock is set
2c890 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
2c8a0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
2c8b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2c8c0 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48  ING_STYLE.IOMETH
2c8d0 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64  ODS(.  nfsIoFind
2c8e0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
2c8f0 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
2c900 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e  tion name */.  n
2c910 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  fsIoMethods,    
2c920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
2c930 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2c940 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
2c950 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
2c960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2c970 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
2c980 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e  disabled */.  un
2c990 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ixClose,        
2c9a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
2c9b0 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  se method */.  u
2c9c0 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  nixLock,        
2c9d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
2c9e0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e  ck method */.  n
2c9f0 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  fsUnlock,       
2ca00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
2ca10 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
2ca20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
2ca30 65 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78  edLock,     /* x
2ca40 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2ca50 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
2ca60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca70 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
2ca80 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  Map method */.).
2ca90 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
2caa0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
2cab0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
2cac0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
2cad0 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65   .** This "finde
2cae0 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  r" function atte
2caf0 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e  mpts to determin
2cb00 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69  e the best locki
2cb10 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20  ng strategy .** 
2cb20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
2cb30 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22   file "filePath"
2cb40 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72  .  It then retur
2cb50 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ns the sqlite3_i
2cb60 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
2cb70 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ect that impleme
2cb80 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67  nts that strateg
2cb90 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  y..**.** This is
2cba0 20 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79   for MacOSX only
2cbb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
2cbc0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
2cbd0 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f  hods *autolockIo
2cbe0 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f  FinderImpl(.  co
2cbf0 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61  nst char *filePa
2cc00 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f  th,    /* name o
2cc10 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2cc20 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ile */.  unixFil
2cc30 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20  e *pNew         
2cc40 20 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f    /* open file o
2cc50 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 64 61  bject for the da
2cc60 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29  tabase file */.)
2cc70 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
2cc80 20 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20   struct Mapping 
2cc90 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2cca0 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 20   *zFilesystem;  
2ccb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2ccc0 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 6e  ilesystem type n
2ccd0 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ame */.    const
2cce0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2ccf0 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20  ods *pMethods;  
2cd00 20 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65 20   /* Appropriate 
2cd10 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a  locking method *
2cd20 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b  /.  } aMap[] = {
2cd30 0a 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20  .    { "hfs",   
2cd40 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
2cd50 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22 2c   },.    { "ufs",
2cd60 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68      &posixIoMeth
2cd70 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66  ods },.    { "af
2cd80 70 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74  pfs",  &afpIoMet
2cd90 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73  hods },.    { "s
2cda0 6d 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65  mbfs",  &afpIoMe
2cdb0 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22  thods },.    { "
2cdc0 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b  webdav", &nolock
2cdd0 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
2cde0 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20   { 0, 0 }.  };. 
2cdf0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
2ce00 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a   statfs fsInfo;.
2ce10 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
2ce20 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20  ockInfo;..  if( 
2ce30 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20  !filePath ){.   
2ce40 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d   /* If filePath=
2ce50 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
2ce60 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
2ce70 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74  with a transient
2ce80 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61   file.    ** tha
2ce90 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
2cea0 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f  to be locked. */
2ceb0 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c  .    return &nol
2cec0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
2ced0 7d 0a 20 20 69 66 28 20 73 74 61 74 66 73 28 66  }.  if( statfs(f
2cee0 69 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f  ilePath, &fsInfo
2cef0 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69  ) != -1 ){.    i
2cf00 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67  f( fsInfo.f_flag
2cf10 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29  s & MNT_RDONLY )
2cf20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  {.      return &
2cf30 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
2cf40 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
2cf50 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c  =0; aMap[i].zFil
2cf60 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20  esystem; i++){. 
2cf70 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
2cf80 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
2cf90 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69  ame, aMap[i].zFi
2cfa0 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a  lesystem)==0 ){.
2cfb0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
2cfc0 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b  Map[i].pMethods;
2cfd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2cfe0 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74   }..  /* Default
2cff0 20 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20   case. Handles, 
2d000 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20  amongst others, 
2d010 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74  "nfs"..  ** Test
2d020 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
2d030 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20   using fcntl(). 
2d040 49 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63 63  If the call succ
2d050 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75  eeds, .  ** assu
2d060 6d 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  me that the file
2d070 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73  -system supports
2d080 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63   POSIX style loc
2d090 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b  ks. .  */.  lock
2d0a0 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  Info.l_len = 1;.
2d0b0 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61    lockInfo.l_sta
2d0c0 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e  rt = 0;.  lockIn
2d0d0 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  fo.l_whence = SE
2d0e0 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e  EK_SET;.  lockIn
2d0f0 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  fo.l_type = F_RD
2d100 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e  LCK;.  if( osFcn
2d110 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45  tl(pNew->h, F_GE
2d120 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21  TLK, &lockInfo)!
2d130 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 66 28 20  =-1 ) {.    if( 
2d140 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
2d150 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73  fstypename, "nfs
2d160 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ")==0 ){.      r
2d170 65 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68  eturn &nfsIoMeth
2d180 6f 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ods;.    } else 
2d190 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  {.      return &
2d1a0 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a  posixIoMethods;.
2d1b0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2d1c0 20 20 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f     return &dotlo
2d1d0 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
2d1e0 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .}.static const 
2d1f0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2d200 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61  ds .  *(*const a
2d210 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29  utolockIoFinder)
2d220 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69  (const char*,uni
2d230 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f  xFile*) = autolo
2d240 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a  ckIoFinderImpl;.
2d250 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
2d260 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
2d270 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2d280 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
2d290 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
2d2a0 2f 2a 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64  /*.** This "find
2d2b0 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  er" function for
2d2c0 20 56 78 57 6f 72 6b 73 20 63 68 65 63 6b 73 20   VxWorks checks 
2d2d0 74 6f 20 73 65 65 20 69 66 20 70 6f 73 69 78 20  to see if posix 
2d2e0 61 64 76 69 73 6f 72 79 0a 2a 2a 20 6c 6f 63 6b  advisory.** lock
2d2f0 69 6e 67 20 77 6f 72 6b 73 2e 20 20 49 66 20 69  ing works.  If i
2d300 74 20 64 6f 65 73 2c 20 74 68 65 6e 20 74 68 61  t does, then tha
2d310 74 20 69 73 20 77 68 61 74 20 69 73 20 75 73 65  t is what is use
2d320 64 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e  d.  If it does n
2d330 6f 74 0a 2a 2a 20 77 6f 72 6b 2c 20 74 68 65 6e  ot.** work, then
2d340 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20 6e 61 6d   fallback to nam
2d350 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
2d360 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
2d370 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2d380 5f 6d 65 74 68 6f 64 73 20 2a 76 78 77 6f 72 6b  _methods *vxwork
2d390 73 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20  sIoFinderImpl(. 
2d3a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c   const char *fil
2d3b0 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d  ePath,    /* nam
2d3c0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2d3d0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
2d3e0 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20  File *pNew      
2d3f0 20 20 20 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e       /* the open
2d400 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a   file object */.
2d410 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  ){.  struct floc
2d420 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69  k lockInfo;..  i
2d430 66 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a  f( !filePath ){.
2d440 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61      /* If filePa
2d450 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65  th==NULL that me
2d460 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69  ans we are deali
2d470 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69  ng with a transi
2d480 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  ent file.    ** 
2d490 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
2d4a0 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e  ed to be locked.
2d4b0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26   */.    return &
2d4c0 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
2d4d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20  .  }..  /* Test 
2d4e0 69 66 20 66 63 6e 74 6c 28 29 20 69 73 20 73 75  if fcntl() is su
2d4f0 70 70 6f 72 74 65 64 20 61 6e 64 20 75 73 65 20  pported and use 
2d500 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b  POSIX style lock
2d510 73 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  s..  ** Otherwis
2d520 65 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  e fall back to t
2d530 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f  he named semapho
2d540 72 65 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a  re method..  */.
2d550 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e    lockInfo.l_len
2d560 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 1;.  lockInfo
2d570 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  .l_start = 0;.  
2d580 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63  lockInfo.l_whenc
2d590 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
2d5a0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20  lockInfo.l_type 
2d5b0 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28  = F_RDLCK;.  if(
2d5c0 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68   osFcntl(pNew->h
2d5d0 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_GETLK, &lock
2d5e0 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20  Info)!=-1 ) {.  
2d5f0 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49    return &posixI
2d600 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73  oMethods;.  }els
2d610 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 73  e{.    return &s
2d620 65 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  emIoMethods;.  }
2d630 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .}.static const 
2d640 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2d650 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 76  ds .  *(*const v
2d660 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72 29 28  xworksIoFinder)(
2d670 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
2d680 46 69 6c 65 2a 29 20 3d 20 76 78 77 6f 72 6b 73  File*) = vxworks
2d690 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23  IoFinderImpl;..#
2d6a0 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
2d6b0 52 4b 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  RKS */../*.** An
2d6c0 20 61 62 73 74 72 61 63 74 20 74 79 70 65 20 66   abstract type f
2d6d0 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  or a pointer to 
2d6e0 61 6e 20 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e  an IO method fin
2d6f0 64 65 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f  der function:.*/
2d700 0a 74 79 70 65 64 65 66 20 63 6f 6e 73 74 20 73  .typedef const s
2d710 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2d720 73 20 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70 65  s *(*finder_type
2d730 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
2d740 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a  ixFile*);.../***
2d750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d790 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
2d7a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d7b0 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  ****** sqlite3_v
2d7c0 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  fs methods *****
2d7d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d7e0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
2d7f0 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
2d800 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ains the impleme
2d810 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f  ntation of metho
2d820 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c  ds on the.** sql
2d830 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e  ite3_vfs object.
2d840 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  .*/../*.** Initi
2d850 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e  alize the conten
2d860 74 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69  ts of the unixFi
2d870 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  le structure poi
2d880 6e 74 65 64 20 74 6f 20 62 79 20 70 49 64 2e 0a  nted to by pId..
2d890 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
2d8a0 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20  llInUnixFile(.  
2d8b0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2d8c0 73 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  s,      /* Point
2d8d0 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74  er to vfs object
2d8e0 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20   */.  int h,    
2d8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d900 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   Open file descr
2d910 69 70 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65  iptor of file be
2d920 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  ing opened */.  
2d930 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49  sqlite3_file *pI
2d940 64 2c 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  d,      /* Write
2d950 20 74 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65   to the unixFile
2d960 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
2d970 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2d980 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20  *zFilename,  /* 
2d990 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
2d9a0 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f   being opened */
2d9b0 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73  .  int ctrlFlags
2d9c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65             /* Ze
2d9d0 72 6f 20 6f 72 20 6d 6f 72 65 20 55 4e 49 58 46  ro or more UNIXF
2d9e0 49 4c 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ILE_* values */.
2d9f0 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  ){.  const sqlit
2da00 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70  e3_io_methods *p
2da10 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
2da20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d  unixFile *pNew =
2da30 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64   (unixFile *)pId
2da40 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2da50 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
2da60 74 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d  t( pNew->pInode=
2da70 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 4e  =NULL );..  /* N
2da80 6f 20 6c 6f 63 6b 69 6e 67 20 6f 63 63 75 72 73  o locking occurs
2da90 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 66 69   in temporary fi
2daa0 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  les */.  assert(
2dab0 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c   zFilename!=0 ||
2dac0 20 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e   (ctrlFlags & UN
2dad0 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 29 21 3d  IXFILE_NOLOCK)!=
2dae0 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  0 );..  OSTRACE(
2daf0 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25  ("OPEN    %-3d %
2db00 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61  s\n", h, zFilena
2db10 6d 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20  me));.  pNew->h 
2db20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 70 56 66  = h;.  pNew->pVf
2db30 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 4e 65 77  s = pVfs;.  pNew
2db40 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e  ->zPath = zFilen
2db50 61 6d 65 3b 0a 20 20 70 4e 65 77 2d 3e 63 74 72  ame;.  pNew->ctr
2db60 6c 46 6c 61 67 73 20 3d 20 28 75 38 29 63 74 72  lFlags = (u8)ctr
2db70 6c 46 6c 61 67 73 3b 0a 23 69 66 20 53 51 4c 49  lFlags;.#if SQLI
2db80 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
2db90 3e 30 0a 20 20 70 4e 65 77 2d 3e 6d 6d 61 70 53  >0.  pNew->mmapS
2dba0 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33  izeMax = sqlite3
2dbb0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d  GlobalConfig.szM
2dbc0 6d 61 70 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  map;.#endif.  if
2dbd0 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  ( sqlite3_uri_bo
2dbe0 6f 6c 65 61 6e 28 28 28 63 74 72 6c 46 6c 61 67  olean(((ctrlFlag
2dbf0 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 55 52 49  s & UNIXFILE_URI
2dc00 29 20 3f 20 7a 46 69 6c 65 6e 61 6d 65 20 3a 20  ) ? zFilename : 
2dc10 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0),.            
2dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2dc30 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f  psow", SQLITE_PO
2dc40 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
2dc50 45 29 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  E) ){.    pNew->
2dc60 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
2dc70 58 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a  XFILE_PSOW;.  }.
2dc80 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 56 66    if( strcmp(pVf
2dc90 73 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d 65  s->zName,"unix-e
2dca0 78 63 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  xcl")==0 ){.    
2dcb0 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20  pNew->ctrlFlags 
2dcc0 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c  |= UNIXFILE_EXCL
2dcd0 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58  ;.  }..#if OS_VX
2dce0 57 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49  WORKS.  pNew->pI
2dcf0 64 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64 46  d = vxworksFindF
2dd00 69 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29  ileId(zFilename)
2dd10 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49  ;.  if( pNew->pI
2dd20 64 3d 3d 30 20 29 7b 0a 20 20 20 20 63 74 72 6c  d==0 ){.    ctrl
2dd30 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
2dd40 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63  E_NOLOCK;.    rc
2dd50 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
2dd60 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
2dd70 0a 0a 20 20 69 66 28 20 63 74 72 6c 46 6c 61 67  ..  if( ctrlFlag
2dd80 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c  s & UNIXFILE_NOL
2dd90 4f 43 4b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  OCK ){.    pLock
2dda0 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f  ingStyle = &nolo
2ddb0 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
2ddc0 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69  else{.    pLocki
2ddd0 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69  ngStyle = (**(fi
2dde0 6e 64 65 72 5f 74 79 70 65 2a 29 70 56 66 73 2d  nder_type*)pVfs-
2ddf0 3e 70 41 70 70 44 61 74 61 29 28 7a 46 69 6c 65  >pAppData)(zFile
2de00 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66  name, pNew);.#if
2de10 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2de20 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
2de30 20 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c 65 6e   /* Cache zFilen
2de40 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  ame in the locki
2de50 6e 67 20 63 6f 6e 74 65 78 74 20 28 41 46 50 20  ng context (AFP 
2de60 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72  and dotlock over
2de70 72 69 64 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a  ride) for.    **
2de80 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76   proxyLock activ
2de90 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c  ation is possibl
2dea0 65 20 28 72 65 6d 6f 74 65 20 70 72 6f 78 79 20  e (remote proxy 
2deb0 69 73 20 62 61 73 65 64 20 6f 6e 20 64 62 20 6e  is based on db n
2dec0 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c  ame).    ** zFil
2ded0 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20 76 61  ename remains va
2dee0 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c 65 20 69  lid until file i
2def0 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70  s closed, to sup
2df00 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77  port */.    pNew
2df10 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2df20 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e   = (void*)zFilen
2df30 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  ame;.#endif.  }.
2df40 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  .  if( pLockingS
2df50 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f  tyle == &posixIo
2df60 4d 65 74 68 6f 64 73 0a 23 69 66 20 64 65 66 69  Methods.#if defi
2df70 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
2df80 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
2df90 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2dfa0 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79    || pLockingSty
2dfb0 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68  le == &nfsIoMeth
2dfc0 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a  ods.#endif.  ){.
2dfd0 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
2dfe0 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66  ex();.    rc = f
2dff0 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65  indInodeInfo(pNe
2e000 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  w, &pNew->pInode
2e010 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2e020 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e030 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
2e040 20 6f 63 63 75 72 72 65 64 20 69 6e 20 66 69 6e   occurred in fin
2e050 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20 63 6c  dInodeInfo(), cl
2e060 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ose the file des
2e070 63 72 69 70 74 6f 72 0a 20 20 20 20 20 20 2a 2a  criptor.      **
2e080 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62 65   immediately, be
2e090 66 6f 72 65 20 72 65 6c 65 61 73 69 6e 67 20 74  fore releasing t
2e0a0 68 65 20 6d 75 74 65 78 2e 20 66 69 6e 64 49 6e  he mutex. findIn
2e0b0 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79 20 66 61  odeInfo() may fa
2e0c0 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  il.      ** in t
2e0d0 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20 20  wo scenarios:.  
2e0e0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2e0f0 20 20 28 61 29 20 41 20 63 61 6c 6c 20 74 6f 20    (a) A call to 
2e100 66 73 74 61 74 28 29 20 66 61 69 6c 65 64 2e 0a  fstat() failed..
2e110 20 20 20 20 20 20 2a 2a 20 20 20 28 62 29 20 41        **   (b) A
2e120 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e 0a   malloc failed..
2e130 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2e140 2a 20 53 63 65 6e 61 72 69 6f 20 28 62 29 20 6d  * Scenario (b) m
2e150 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66  ay only occur if
2e160 20 74 68 65 20 70 72 6f 63 65 73 73 20 69 73 20   the process is 
2e170 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65 72  holding no other
2e180 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 64  .      ** file d
2e190 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 20  escriptors open 
2e1a0 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  on the same file
2e1b0 2e 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20  . If there were 
2e1c0 6f 74 68 65 72 20 66 69 6c 65 0a 20 20 20 20 20  other file.     
2e1d0 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 73 20   ** descriptors 
2e1e0 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68  on this file, th
2e1f0 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75  en no malloc wou
2e200 6c 64 20 62 65 20 72 65 71 75 69 72 65 64 20 62  ld be required b
2e210 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e 64 49  y.      ** findI
2e220 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66 20 74  nodeInfo(). If t
2e230 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
2e240 20 69 74 20 69 73 20 71 75 69 74 65 20 73 61 66   it is quite saf
2e250 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20 20  e to close.     
2e260 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20 61   ** handle h - a
2e270 73 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  s it is guarante
2e280 65 64 20 74 68 61 74 20 6e 6f 20 70 6f 73 69 78  ed that no posix
2e290 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20 72   locks will be r
2e2a0 65 6c 65 61 73 65 64 0a 20 20 20 20 20 20 2a 2a  eleased.      **
2e2b0 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20 20   by doing so..  
2e2c0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2e2d0 49 66 20 73 63 65 6e 61 72 69 6f 20 28 61 29 20  If scenario (a) 
2e2e0 63 61 75 73 65 64 20 74 68 65 20 65 72 72 6f 72  caused the error
2e2f0 20 74 68 65 6e 20 74 68 69 6e 67 73 20 61 72 65   then things are
2e300 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20 54 68   not so safe. Th
2e310 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 69  e.      ** impli
2e320 63 69 74 20 61 73 73 75 6d 70 74 69 6f 6e 20 68  cit assumption h
2e330 65 72 65 20 69 73 20 74 68 61 74 20 69 66 20 66  ere is that if f
2e340 73 74 61 74 28 29 20 66 61 69 6c 73 2c 20 74 68  stat() fails, th
2e350 69 6e 67 73 20 61 72 65 20 69 6e 0a 20 20 20 20  ings are in.    
2e360 20 20 2a 2a 20 73 75 63 68 20 62 61 64 20 73 68    ** such bad sh
2e370 61 70 65 20 74 68 61 74 20 64 72 6f 70 70 69 6e  ape that droppin
2e380 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f 20  g a lock or two 
2e390 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 6d  doesn't matter m
2e3a0 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  uch..      */.  
2e3b0 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
2e3c0 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45  (pNew, h, __LINE
2e3d0 5f 5f 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 2d  __);.      h = -
2e3e0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69  1;.    }.    uni
2e3f0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
2e400 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45   }..#if SQLITE_E
2e410 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2e420 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
2e430 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73 65  _APPLE__).  else
2e440 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
2e450 6c 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68  le == &afpIoMeth
2e460 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46  ods ){.    /* AF
2e470 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74  P locking uses t
2e480 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20  he file path so 
2e490 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69  it needs to be i
2e4a0 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a  ncluded in.    *
2e4b0 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67  * the afpLocking
2e4c0 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a  Context..    */.
2e4d0 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f      afpLockingCo
2e4e0 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 20  ntext *pCtx;.   
2e4f0 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f   pNew->lockingCo
2e500 6e 74 65 78 74 20 3d 20 70 43 74 78 20 3d 20 73  ntext = pCtx = s
2e510 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
2e520 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29   sizeof(*pCtx) )
2e530 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 3d 3d  ;.    if( pCtx==
2e540 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
2e550 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
2e560 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
2e570 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65      /* NB: zFile
2e580 6e 61 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20  name exists and 
2e590 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e  remains valid un
2e5a0 74 69 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20  til the file is 
2e5b0 63 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  closed.      ** 
2e5c0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71  according to req
2e5d0 75 69 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e  uirement F11141.
2e5e0 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e    So we do not n
2e5f0 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20  eed to make a.  
2e600 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74      ** copy of t
2e610 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a  he filename. */.
2e620 20 20 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61        pCtx->dbPa
2e630 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  th = zFilename;.
2e640 20 20 20 20 20 20 70 43 74 78 2d 3e 72 65 73 65        pCtx->rese
2e650 72 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rved = 0;.      
2e660 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20  srandomdev();.  
2e670 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
2e680 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ex();.      rc =
2e690 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70   findInodeInfo(p
2e6a0 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f  New, &pNew->pIno
2e6b0 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  de);.      if( r
2e6c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2e6d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2e6e0 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69  free(pNew->locki
2e6f0 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  ngContext);.    
2e700 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
2e710 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45  (pNew, h, __LINE
2e720 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 68 20 3d  __);.        h =
2e730 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
2e740 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
2e750 78 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20  x();        .   
2e760 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
2e770 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
2e780 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c  ngStyle == &dotl
2e790 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  ockIoMethods ){.
2e7a0 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c      /* Dotfile l
2e7b0 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
2e7c0 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
2e7d0 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c  needs to be incl
2e7e0 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74  uded in.    ** t
2e7f0 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  he dotlockLockin
2e800 67 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f  gContext .    */
2e810 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  .    char *zLock
2e820 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46  File;.    int nF
2e830 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 61 73 73  ilename;.    ass
2e840 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d  ert( zFilename!=
2e850 30 20 29 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61  0 );.    nFilena
2e860 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  me = (int)strlen
2e870 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b  (zFilename) + 6;
2e880 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d  .    zLockFile =
2e890 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
2e8a0 5f 6d 61 6c 6c 6f 63 36 34 28 6e 46 69 6c 65 6e  _malloc64(nFilen
2e8b0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c  ame);.    if( zL
2e8c0 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  ockFile==0 ){.  
2e8d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2e8e0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
2e8f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
2e900 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46  ite3_snprintf(nF
2e910 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69  ilename, zLockFi
2e920 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b  le, "%s" DOTLOCK
2e930 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61  _SUFFIX, zFilena
2e940 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
2e950 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
2e960 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b  ext = zLockFile;
2e970 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57  .  }..#if OS_VXW
2e980 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66 28 20  ORKS.  else if( 
2e990 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
2e9a0 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29   &semIoMethods )
2e9b0 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73  {.    /* Named s
2e9c0 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
2e9d0 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
2e9e0 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
2e9f0 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e 63  to be.    ** inc
2ea00 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73 65 6d  luded in the sem
2ea10 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20  LockingContext. 
2ea20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e     */.    unixEn
2ea30 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
2ea40 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e  rc = findInodeIn
2ea50 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e  fo(pNew, &pNew->
2ea60 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28  pInode);.    if(
2ea70 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29   (rc==SQLITE_OK)
2ea80 20 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f 64   && (pNew->pInod
2ea90 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29  e->pSem==NULL) )
2eaa0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53  {.      char *zS
2eab0 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70  emName = pNew->p
2eac0 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b  Inode->aSemName;
2ead0 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
2eae0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2eaf0 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d  intf(MAX_PATHNAM
2eb00 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25  E, zSemName, "/%
2eb10 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20 20 20  s.sem",.        
2eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2eb30 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e  New->pId->zCanon
2eb40 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20  icalName);.     
2eb50 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e   for( n=1; zSemN
2eb60 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20  ame[n]; n++ ).  
2eb70 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d 4e 61        if( zSemNa
2eb80 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65  me[n]=='/' ) zSe
2eb90 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a  mName[n] = '_';.
2eba0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f        pNew->pIno
2ebb0 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f  de->pSem = sem_o
2ebc0 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f  pen(zSemName, O_
2ebd0 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31 29 3b  CREAT, 0666, 1);
2ebe0 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d  .      if( pNew-
2ebf0 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d  >pInode->pSem ==
2ec00 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20   SEM_FAILED ){. 
2ec10 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2ec20 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
2ec30 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e         pNew->pIn
2ec40 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d  ode->aSemName[0]
2ec50 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d   = '\0';.      }
2ec60 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c  .    }.    unixL
2ec70 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
2ec80 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 73 74 6f  .#endif.  .  sto
2ec90 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 4e 65 77  reLastErrno(pNew
2eca0 2c 20 30 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57  , 0);.#if OS_VXW
2ecb0 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53  ORKS.  if( rc!=S
2ecc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ecd0 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73  if( h>=0 ) robus
2ece0 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c  t_close(pNew, h,
2ecf0 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
2ed00 68 20 3d 20 2d 31 3b 0a 20 20 20 20 6f 73 55 6e  h = -1;.    osUn
2ed10 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  link(zFilename);
2ed20 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46  .    pNew->ctrlF
2ed30 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
2ed40 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 0a 23 65 6e  _DELETE;.  }.#en
2ed50 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51  dif.  if( rc!=SQ
2ed60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2ed70 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74  f( h>=0 ) robust
2ed80 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20  _close(pNew, h, 
2ed90 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c  __LINE__);.  }el
2eda0 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d  se{.    pNew->pM
2edb0 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67  ethod = pLocking
2edc0 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43  Style;.    OpenC
2edd0 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 20 20  ounter(+1);.    
2ede0 76 65 72 69 66 79 44 62 46 69 6c 65 28 70 4e 65  verifyDbFile(pNe
2edf0 77 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  w);.  }.  return
2ee00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
2ee10 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
2ee20 20 61 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20   a directory in 
2ee30 77 68 69 63 68 20 74 6f 20 70 75 74 20 74 65 6d  which to put tem
2ee40 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a  porary files..**
2ee50 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20   If no suitable 
2ee60 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 64  temporary file d
2ee70 69 72 65 63 74 6f 72 79 20 63 61 6e 20 62 65 20  irectory can be 
2ee80 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e 55  found, return NU
2ee90 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  LL..*/.static co
2eea0 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54 65  nst char *unixTe
2eeb0 6d 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29 7b  mpFileDir(void){
2eec0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
2eed0 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d  char *azDirs[] =
2eee0 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20   {.     0,.     
2eef0 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d  0,.     "/var/tm
2ef00 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74  p",.     "/usr/t
2ef10 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22  mp",.     "/tmp"
2ef20 2c 0a 20 20 20 20 20 22 2e 22 0a 20 20 7d 3b 0a  ,.     ".".  };.
2ef30 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
2ef40 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 73   = 0;.  struct s
2ef50 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74  tat buf;.  const
2ef60 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 73 71   char *zDir = sq
2ef70 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
2ef80 74 6f 72 79 3b 0a 0a 20 20 69 66 28 20 21 61 7a  tory;..  if( !az
2ef90 44 69 72 73 5b 30 5d 20 29 20 61 7a 44 69 72 73  Dirs[0] ) azDirs
2efa0 5b 30 5d 20 3d 20 67 65 74 65 6e 76 28 22 53 51  [0] = getenv("SQ
2efb0 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20  LITE_TMPDIR");. 
2efc0 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20   if( !azDirs[1] 
2efd0 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65  ) azDirs[1] = ge
2efe0 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a  tenv("TMPDIR");.
2eff0 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20    while(1){.    
2f000 69 66 28 20 7a 44 69 72 21 3d 30 0a 20 20 20 20  if( zDir!=0.    
2f010 20 26 26 20 6f 73 53 74 61 74 28 7a 44 69 72 2c   && osStat(zDir,
2f020 20 26 62 75 66 29 3d 3d 30 0a 20 20 20 20 20 26   &buf)==0.     &
2f030 26 20 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74  & S_ISDIR(buf.st
2f040 5f 6d 6f 64 65 29 0a 20 20 20 20 20 26 26 20 6f  _mode).     && o
2f050 73 41 63 63 65 73 73 28 7a 44 69 72 2c 20 30 33  sAccess(zDir, 03
2f060 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )==0.    ){.    
2f070 20 20 72 65 74 75 72 6e 20 7a 44 69 72 3b 0a 20    return zDir;. 
2f080 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d     }.    if( i>=
2f090 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73  sizeof(azDirs)/s
2f0a0 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29  izeof(azDirs[0])
2f0b0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a 44   ) break;.    zD
2f0c0 69 72 20 3d 20 61 7a 44 69 72 73 5b 69 2b 2b 5d  ir = azDirs[i++]
2f0d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
2f0e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
2f0f0 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  e a temporary fi
2f100 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e  le name in zBuf.
2f110 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 61    zBuf must be a
2f120 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74  llocated.** by t
2f130 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
2f140 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 62  ss and must be b
2f150 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
2f160 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70 56  d at least.** pV
2f170 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 62  fs->mxPathname b
2f180 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ytes..*/.static 
2f190 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e  int unixGetTempn
2f1a0 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68  ame(int nBuf, ch
2f1b0 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 63 6f 6e  ar *zBuf){.  con
2f1c0 73 74 20 63 68 61 72 20 2a 7a 44 69 72 3b 0a 20  st char *zDir;. 
2f1d0 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b   int iLimit = 0;
2f1e0 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20  ..  /* It's odd 
2f1f0 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69  to simulate an i
2f200 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75  o-error here, bu
2f210 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73  t really this is
2f220 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67   just.  ** using
2f230 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e   the io-error in
2f240 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20  frastructure to 
2f250 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65  test that SQLite
2f260 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20   handles this.  
2f270 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c  ** function fail
2f280 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 7a 42 75  ing. .  */.  zBu
2f290 66 5b 30 5d 20 3d 20 30 3b 0a 20 20 53 69 6d 75  f[0] = 0;.  Simu
2f2a0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
2f2b0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2f2c0 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20 75 6e   );..  zDir = un
2f2d0 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 29 3b  ixTempFileDir();
2f2e0 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29  .  if( zDir==0 )
2f2f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2f300 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48  OERR_GETTEMPPATH
2f310 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 36 34 20  ;.  do{.    u64 
2f320 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  r;.    sqlite3_r
2f330 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
2f340 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20 61 73  (r), &r);.    as
2f350 73 65 72 74 28 20 6e 42 75 66 3e 32 20 29 3b 0a  sert( nBuf>2 );.
2f360 20 20 20 20 7a 42 75 66 5b 6e 42 75 66 2d 32 5d      zBuf[nBuf-2]
2f370 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
2f380 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c  3_snprintf(nBuf,
2f390 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51 4c 49   zBuf, "%s/"SQLI
2f3a0 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  TE_TEMP_FILE_PRE
2f3b0 46 49 58 22 25 6c 6c 78 25 63 22 2c 0a 20 20 20  FIX"%llx%c",.   
2f3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f3d0 20 20 7a 44 69 72 2c 20 72 2c 20 30 29 3b 0a 20    zDir, r, 0);. 
2f3e0 20 20 20 69 66 28 20 7a 42 75 66 5b 6e 42 75 66     if( zBuf[nBuf
2f3f0 2d 32 5d 21 3d 30 20 7c 7c 20 28 69 4c 69 6d 69  -2]!=0 || (iLimi
2f400 74 2b 2b 29 3e 31 30 20 29 20 72 65 74 75 72 6e  t++)>10 ) return
2f410 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2f420 20 7d 77 68 69 6c 65 28 20 6f 73 41 63 63 65 73   }while( osAcces
2f430 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a  s(zBuf,0)==0 );.
2f440 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2f450 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  OK;.}..#if SQLIT
2f460 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2f470 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
2f480 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a  d(__APPLE__)./*.
2f490 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72  ** Routine to tr
2f4a0 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69  ansform a unixFi
2f4b0 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d  le into a proxy-
2f4c0 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65  locking unixFile
2f4d0 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  ..** Implementat
2f4e0 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79  ion in the proxy
2f4f0 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20  -lock division, 
2f500 62 75 74 20 75 73 65 64 20 62 79 20 75 6e 69 78  but used by unix
2f510 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c  Open().** if SQL
2f520 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
2f530 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69  _LOCKING is defi
2f540 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
2f550 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72  nt proxyTransfor
2f560 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69  mUnixFile(unixFi
2f570 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  le*, const char*
2f580 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  );.#endif../*.**
2f590 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75   Search for an u
2f5a0 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
2f5b0 69 70 74 6f 72 20 74 68 61 74 20 77 61 73 20 6f  iptor that was o
2f5c0 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74  pened on the dat
2f5d0 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28  abase .** file (
2f5e0 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72  not a journal or
2f5f0 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
2f600 66 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65 64  file) identified
2f610 20 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20   by pathname.** 
2f620 7a 50 61 74 68 20 77 69 74 68 20 53 51 4c 49 54  zPath with SQLIT
2f630 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73  E_OPEN_XXX flags
2f640 20 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65 20   matching those 
2f650 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
2f660 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  cond.** argument
2f670 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
2f680 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20  n..**.** Such a 
2f690 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2f6a0 6d 61 79 20 65 78 69 73 74 20 69 66 20 61 20 64  may exist if a d
2f6b0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2f6c0 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a  on was closed.**
2f6d0 20 62 75 74 20 74 68 65 20 61 73 73 6f 63 69 61   but the associa
2f6e0 74 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  ted file descrip
2f6f0 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  tor could not be
2f700 20 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65 20   closed because 
2f710 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69  some.** other fi
2f720 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70  le descriptor op
2f730 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66  en on the same f
2f740 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  ile is holding a
2f750 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52   file-lock..** R
2f760 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73  efer to comments
2f770 20 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f 73   in the unixClos
2f780 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  e() function and
2f790 20 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d   the lengthy com
2f7a0 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62 69  ment.** describi
2f7b0 6e 67 20 22 50 6f 73 69 78 20 41 64 76 69 73 6f  ng "Posix Adviso
2f7c0 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74  ry Locking" at t
2f7d0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73  he start of this
2f7e0 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75   file for .** fu
2f7f0 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20 41  rther details. A
2f800 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30 31  lso, ticket #401
2f810 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75  8..**.** If a su
2f820 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63  itable file desc
2f830 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c  riptor is found,
2f840 20 74 68 65 6e 20 69 74 20 69 73 20 72 65 74 75   then it is retu
2f850 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73  rned. If no.** s
2f860 75 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70  uch file descrip
2f870 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c 20  tor is located, 
2f880 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  -1 is returned..
2f890 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55 6e  */.static UnixUn
2f8a0 75 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75 73  usedFd *findReus
2f8b0 61 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68 61  ableFd(const cha
2f8c0 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c  r *zPath, int fl
2f8d0 61 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73  ags){.  UnixUnus
2f8e0 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20  edFd *pUnused = 
2f8f0 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  0;..  /* Do not 
2f900 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e  search for an un
2f910 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
2f920 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e  ptor on vxworks.
2f930 20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20 2a   Not because.  *
2f940 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20  * vxworks would 
2f950 6e 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f 6d  not benefit from
2f960 20 74 68 65 20 63 68 61 6e 67 65 20 28 69 74 20   the change (it 
2f970 6d 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f 74  might, we're not
2f980 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74   sure),.  ** but
2f990 20 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79 20   because no way 
2f9a0 74 6f 20 74 65 73 74 20 69 74 20 69 73 20 63 75  to test it is cu
2f9b0 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c  rrently availabl
2f9c0 65 2e 20 49 74 20 69 73 20 62 65 74 74 65 72 20  e. It is better 
2f9d0 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73  .  ** not to ris
2f9e0 6b 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f 72  k breaking vxwor
2f9f0 6b 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74  ks support for t
2fa00 68 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68 20  he sake of such 
2fa10 61 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a  an obscure .  **
2fa20 20 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69   feature.  */.#i
2fa30 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  f !OS_VXWORKS.  
2fa40 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
2fa50 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2fa60 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20       /* Results 
2fa70 6f 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20 2a  of stat() call *
2fa80 2f 0a 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  /..  unixEnterMu
2fa90 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 41 20 73  tex();..  /* A s
2faa0 74 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66  tat() call may f
2fab0 61 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20  ail for various 
2fac0 72 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73  reasons. If this
2fad0 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a   happens, it is.
2fae0 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74    ** almost cert
2faf0 61 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e  ain that an open
2fb00 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73  () call on the s
2fb10 61 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c  ame path will al
2fb20 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f  so fail..  ** Fo
2fb30 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69  r this reason, i
2fb40 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2fb50 73 20 69 6e 20 74 68 65 20 73 74 61 74 28 29 20  s in the stat() 
2fb60 63 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73  call here, it is
2fb70 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e  .  ** ignored an
2fb80 64 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64  d -1 is returned
2fb90 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
2fba0 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20  l try to open a 
2fbb0 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65  new file.  ** de
2fbc0 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20  scriptor on the 
2fbd0 73 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c  same path, fail,
2fbe0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65   and return an e
2fbf0 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a  rror to SQLite..
2fc00 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69    **.  ** Even i
2fc10 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f  f a subsequent o
2fc20 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20  pen() call does 
2fc30 73 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e  succeed, the con
2fc40 73 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a  sequences of.  *
2fc50 2a 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20  * not searching 
2fc60 66 6f 72 20 61 20 72 65 75 73 61 62 6c 65 20 66  for a reusable f
2fc70 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
2fc80 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f  re not dire.  */
2fc90 0a 20 20 69 66 28 20 69 6e 6f 64 65 4c 69 73 74  .  if( inodeList
2fca0 21 3d 30 20 26 26 20 30 3d 3d 6f 73 53 74 61 74  !=0 && 0==osStat
2fcb0 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29 20  (zPath, &sStat) 
2fcc0 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65  ){.    unixInode
2fcd0 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20  Info *pInode;.. 
2fce0 20 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64     pInode = inod
2fcf0 65 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65  eList;.    while
2fd00 28 20 70 49 6e 6f 64 65 20 26 26 20 28 70 49 6e  ( pInode && (pIn
2fd10 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21  ode->fileId.dev!
2fd20 3d 73 53 74 61 74 2e 73 74 5f 64 65 76 0a 20 20  =sStat.st_dev.  
2fd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd40 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69     || pInode->fi
2fd50 6c 65 49 64 2e 69 6e 6f 21 3d 28 75 36 34 29 73  leId.ino!=(u64)s
2fd60 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a  Stat.st_ino) ){.
2fd70 20 20 20 20 20 20 20 70 49 6e 6f 64 65 20 3d 20         pInode = 
2fd80 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20  pInode->pNext;. 
2fd90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e     }.    if( pIn
2fda0 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 55 6e 69  ode ){.      Uni
2fdb0 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a  xUnusedFd **pp;.
2fdc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
2fdd0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68  lite3_mutex_noth
2fde0 65 6c 64 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63  eld(pInode->pLoc
2fdf0 6b 4d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 20  kMutex) );.     
2fe00 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
2fe10 6e 74 65 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f  nter(pInode->pLo
2fe20 63 6b 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ckMutex);.      
2fe30 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e  for(pp=&pInode->
2fe40 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26 20  pUnused; *pp && 
2fe50 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c  (*pp)->flags!=fl
2fe60 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d  ags; pp=&((*pp)-
2fe70 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20  >pNext));.      
2fe80 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20  pUnused = *pp;. 
2fe90 20 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64       if( pUnused
2fea0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20   ){.        *pp 
2feb0 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74  = pUnused->pNext
2fec0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2fed0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
2fee0 61 76 65 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63  ave(pInode->pLoc
2fef0 6b 4d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20  kMutex);.    }. 
2ff00 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
2ff10 74 65 78 28 29 3b 0a 23 65 6e 64 69 66 20 20 20  tex();.#endif   
2ff20 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58 57 4f 52   /* if !OS_VXWOR
2ff30 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  KS */.  return p
2ff40 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Unused;.}../*.**
2ff50 20 46 69 6e 64 20 74 68 65 20 6d 6f 64 65 2c 20   Find the mode, 
2ff60 75 69 64 20 61 6e 64 20 67 69 64 20 6f 66 20 66  uid and gid of f
2ff70 69 6c 65 20 7a 46 69 6c 65 2e 20 0a 2a 2f 0a 73  ile zFile. .*/.s
2ff80 74 61 74 69 63 20 69 6e 74 20 67 65 74 46 69 6c  tatic int getFil
2ff90 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 63  eMode(.  const c
2ffa0 68 61 72 20 2a 7a 46 69 6c 65 2c 20 20 20 20 20  har *zFile,     
2ffb0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
2ffc0 20 6e 61 6d 65 20 2a 2f 0a 20 20 6d 6f 64 65 5f   name */.  mode_
2ffd0 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20 20  t *pMode,       
2ffe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
2fff0 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 6f  T: Permissions o
30000 66 20 7a 46 69 6c 65 20 2a 2f 0a 20 20 75 69 64  f zFile */.  uid
30010 5f 74 20 2a 70 55 69 64 2c 20 20 20 20 20 20 20  _t *pUid,       
30020 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30030 4f 55 54 3a 20 75 69 64 20 6f 66 20 7a 46 69 6c  OUT: uid of zFil
30040 65 2e 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a 70  e. */.  gid_t *p
30050 47 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20  Gid             
30060 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
30070 67 69 64 20 6f 66 20 7a 46 69 6c 65 2e 20 2a 2f  gid of zFile. */
30080 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61  .){.  struct sta
30090 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
300a0 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
300b0 6f 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74  of stat() on dat
300c0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
300d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
300e0 4f 4b 3b 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53  OK;.  if( 0==osS
300f0 74 61 74 28 7a 46 69 6c 65 2c 20 26 73 53 74 61  tat(zFile, &sSta
30100 74 29 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65  t) ){.    *pMode
30110 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65   = sStat.st_mode
30120 20 26 20 30 37 37 37 3b 0a 20 20 20 20 2a 70 55   & 0777;.    *pU
30130 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 75 69  id = sStat.st_ui
30140 64 3b 0a 20 20 20 20 2a 70 47 69 64 20 3d 20 73  d;.    *pGid = s
30150 53 74 61 74 2e 73 74 5f 67 69 64 3b 0a 20 20 7d  Stat.st_gid;.  }
30160 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
30170 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
30180 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
30190 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
301a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
301b0 6c 6c 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e  lled by unixOpen
301c0 28 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  () to determine 
301d0 74 68 65 20 75 6e 69 78 20 70 65 72 6d 69 73 73  the unix permiss
301e0 69 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74  ions.** to creat
301f0 65 20 6e 65 77 20 66 69 6c 65 73 20 77 69 74 68  e new files with
30200 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  . If no error oc
30210 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54  curs, then SQLIT
30220 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
30230 0a 2a 2a 20 61 6e 64 20 61 20 76 61 6c 75 65 20  .** and a value 
30240 73 75 69 74 61 62 6c 65 20 66 6f 72 20 70 61 73  suitable for pas
30250 73 69 6e 67 20 61 73 20 74 68 65 20 74 68 69 72  sing as the thir
30260 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70  d argument to op
30270 65 6e 28 32 29 20 69 73 0a 2a 2a 20 77 72 69 74  en(2) is.** writ
30280 74 65 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49  ten to *pMode. I
30290 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
302a0 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20  curs, an SQLite 
302b0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a  error code is .*
302c0 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  * returned and t
302d0 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f  he value of *pMo
302e0 64 65 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69  de is not modifi
302f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73  ed..**.** In mos
30300 74 20 63 61 73 65 73 2c 20 74 68 69 73 20 72 6f  t cases, this ro
30310 75 74 69 6e 65 20 73 65 74 73 20 2a 70 4d 6f 64  utine sets *pMod
30320 65 20 74 6f 20 30 2c 20 77 68 69 63 68 20 77 69  e to 0, which wi
30330 6c 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20  ll become.** an 
30340 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20 72 6f  indication to ro
30350 62 75 73 74 5f 6f 70 65 6e 28 29 20 74 6f 20 63  bust_open() to c
30360 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 20 75  reate the file u
30370 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  sing.** SQLITE_D
30380 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
30390 49 53 53 49 4f 4e 53 20 61 64 6a 75 73 74 65 64  ISSIONS adjusted
303a0 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a   by the umask..*
303b0 2a 20 42 75 74 20 69 66 20 74 68 65 20 66 69 6c  * But if the fil
303c0 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69  e being opened i
303d0 73 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75 6c  s a WAL or regul
303e0 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ar journal file,
303f0 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66   then .** this f
30400 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73 20  unction queries 
30410 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
30420 66 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73 69  for the permissi
30430 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63  ons on the .** c
30440 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74  orresponding dat
30450 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 73  abase file and s
30460 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68  ets *pMode to th
30470 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65 76  is value. Whenev
30480 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c  er .** possible,
30490 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c   WAL and journal
304a0 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74   files are creat
304b0 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ed using the sam
304c0 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a  e permissions .*
304d0 2a 20 61 73 20 74 68 65 20 61 73 73 6f 63 69 61  * as the associa
304e0 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ted database fil
304f0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
30500 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f  SQLITE_ENABLE_8_
30510 33 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69  3_NAMES option i
30520 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20  s enabled, then 
30530 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
30540 66 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e 61 76  filename is unav
30550 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 38 5f  ailable.  But 8_
30560 33 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20  3_NAMES is only 
30570 75 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20  used for.** FAT 
30580 66 69 6c 65 73 79 73 74 65 6d 73 20 61 6e 64 20  filesystems and 
30590 70 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e  permissions do n
305a0 6f 74 20 6d 61 74 74 65 72 20 74 68 65 72 65 2c  ot matter there,
305b0 20 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20   so just use.** 
305c0 74 68 65 20 64 65 66 61 75 6c 74 20 70 65 72 6d  the default perm
305d0 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74  issions..*/.stat
305e0 69 63 20 69 6e 74 20 66 69 6e 64 43 72 65 61 74  ic int findCreat
305f0 65 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e  eFileMode(.  con
30600 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
30610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30620 50 61 74 68 20 6f 66 20 66 69 6c 65 20 28 70 6f  Path of file (po
30630 73 73 69 62 6c 79 29 20 62 65 69 6e 67 20 63 72  ssibly) being cr
30640 65 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66  eated */.  int f
30650 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
30660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
30670 61 67 73 20 70 61 73 73 65 64 20 61 73 20 34 74  ags passed as 4t
30680 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f  h argument to xO
30690 70 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f  pen() */.  mode_
306a0 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20 20  t *pMode,       
306b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
306c0 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74  T: Permissions t
306d0 6f 20 6f 70 65 6e 20 66 69 6c 65 20 77 69 74 68  o open file with
306e0 20 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55 69   */.  uid_t *pUi
306f0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
30700 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69        /* OUT: ui
30710 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65 20  d to set on the 
30720 66 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20  file */.  gid_t 
30730 2a 70 47 69 64 20 20 20 20 20 20 20 20 20 20 20  *pGid           
30740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
30750 3a 20 67 69 64 20 74 6f 20 73 65 74 20 6f 6e 20  : gid to set on 
30760 74 68 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  the file */.){. 
30770 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
30780 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
30790 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
307a0 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 30 3b  */.  *pMode = 0;
307b0 0a 20 20 2a 70 55 69 64 20 3d 20 30 3b 0a 20 20  .  *pUid = 0;.  
307c0 2a 70 47 69 64 20 3d 20 30 3b 0a 20 20 69 66 28  *pGid = 0;.  if(
307d0 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45   flags & (SQLITE
307e0 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45  _OPEN_WAL|SQLITE
307f0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
30800 41 4c 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20  AL) ){.    char 
30810 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  zDb[MAX_PATHNAME
30820 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61 74 61  +1];     /* Data
30830 62 61 73 65 20 66 69 6c 65 20 70 61 74 68 20 2a  base file path *
30840 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b 20 20  /.    int nDb;  
30850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30860 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
30870 20 76 61 6c 69 64 20 62 79 74 65 73 20 69 6e 20   valid bytes in 
30880 7a 44 62 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a  zDb */..    /* z
30890 50 61 74 68 20 69 73 20 61 20 70 61 74 68 20 74  Path is a path t
308a0 6f 20 61 20 57 41 4c 20 6f 72 20 6a 6f 75 72 6e  o a WAL or journ
308b0 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 66 6f 6c  al file. The fol
308c0 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 64 65 72  lowing block der
308d0 69 76 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  ives.    ** the 
308e0 70 61 74 68 20 74 6f 20 74 68 65 20 61 73 73 6f  path to the asso
308f0 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
30900 66 69 6c 65 20 66 72 6f 6d 20 7a 50 61 74 68 2e  file from zPath.
30910 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64   This block hand
30920 6c 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66  les.    ** the f
30930 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e 67 20  ollowing naming 
30940 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20 20 20  conventions:.   
30950 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70   **.    **   "<p
30960 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e  ath to db>-journ
30970 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70  al".    **   "<p
30980 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 22 0a  ath to db>-wal".
30990 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20      **   "<path 
309a0 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e  to db>-journalNN
309b0 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74  ".    **   "<pat
309c0 68 20 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a  h to db>-walNN".
309d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68      **.    ** wh
309e0 65 72 65 20 4e 4e 20 69 73 20 61 20 64 65 63 69  ere NN is a deci
309f0 6d 61 6c 20 6e 75 6d 62 65 72 2e 20 54 68 65 20  mal number. The 
30a00 4e 4e 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65  NN naming scheme
30a10 73 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 75 73  s are .    ** us
30a20 65 64 20 62 79 20 74 68 65 20 74 65 73 74 5f 6d  ed by the test_m
30a30 75 6c 74 69 70 6c 65 78 2e 63 20 6d 6f 64 75 6c  ultiplex.c modul
30a40 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 44  e..    */.    nD
30a50 62 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  b = sqlite3Strle
30a60 6e 33 30 28 7a 50 61 74 68 29 20 2d 20 31 3b 20  n30(zPath) - 1; 
30a70 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 50 61 74  .    while( zPat
30a80 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 7b 0a 20  h[nDb]!='-' ){. 
30a90 20 20 20 20 20 2f 2a 20 49 6e 20 6e 6f 72 6d 61       /* In norma
30aa0 6c 20 6f 70 65 72 61 74 69 6f 6e 2c 20 74 68 65  l operation, the
30ab0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
30ac0 6d 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 63  me will always c
30ad0 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ontain.      ** 
30ae0 61 20 27 2d 27 20 63 68 61 72 61 63 74 65 72 2e  a '-' character.
30af0 20 20 48 6f 77 65 76 65 72 20 69 6e 20 38 2b 33    However in 8+3
30b00 20 66 69 6c 65 6e 61 6d 65 20 6d 6f 64 65 2c 20   filename mode, 
30b10 6f 72 20 69 66 20 61 20 63 6f 72 72 75 70 74 0a  or if a corrupt.
30b20 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63        ** rollbac
30b30 6b 20 6a 6f 75 72 6e 61 6c 20 73 70 65 63 69 66  k journal specif
30b40 69 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ies a master jou
30b50 72 6e 61 6c 20 77 69 74 68 20 61 20 67 6f 6f 66  rnal with a goof
30b60 79 20 6e 61 6d 65 2c 20 74 68 65 6e 0a 20 20 20  y name, then.   
30b70 20 20 20 2a 2a 20 74 68 65 20 27 2d 27 20 6d 69     ** the '-' mi
30b80 67 68 74 20 62 65 20 6d 69 73 73 69 6e 67 2e 20  ght be missing. 
30b90 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 44 62  */.      if( nDb
30ba0 3d 3d 30 20 7c 7c 20 7a 50 61 74 68 5b 6e 44 62  ==0 || zPath[nDb
30bb0 5d 3d 3d 27 2e 27 20 29 20 72 65 74 75 72 6e 20  ]=='.' ) return 
30bc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
30bd0 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20   nDb--;.    }.  
30be0 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50    memcpy(zDb, zP
30bf0 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a  ath, nDb);.    z
30c00 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a  Db[nDb] = '\0';.
30c10 0a 20 20 20 20 72 63 20 3d 20 67 65 74 46 69 6c  .    rc = getFil
30c20 65 4d 6f 64 65 28 7a 44 62 2c 20 70 4d 6f 64 65  eMode(zDb, pMode
30c30 2c 20 70 55 69 64 2c 20 70 47 69 64 29 3b 0a 20  , pUid, pGid);. 
30c40 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
30c50 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
30c60 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a  ELETEONCLOSE ){.
30c70 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30      *pMode = 060
30c80 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  0;.  }else if( f
30c90 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
30ca0 45 4e 5f 55 52 49 20 29 7b 0a 20 20 20 20 2f 2a  EN_URI ){.    /*
30cb0 20 49 66 20 74 68 69 73 20 69 73 20 61 20 6d 61   If this is a ma
30cc0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
30cd0 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 77 61   and the file wa
30ce0 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 61  s opened using a
30cf0 20 55 52 49 0a 20 20 20 20 2a 2a 20 66 69 6c 65   URI.    ** file
30d00 6e 61 6d 65 2c 20 63 68 65 63 6b 20 66 6f 72 20  name, check for 
30d10 74 68 65 20 22 6d 6f 64 65 6f 66 22 20 70 61 72  the "modeof" par
30d20 61 6d 65 74 65 72 2e 20 49 66 20 70 72 65 73 65  ameter. If prese
30d30 6e 74 2c 20 69 6e 74 65 72 70 72 65 74 0a 20 20  nt, interpret.  
30d40 20 20 2a 2a 20 69 74 73 20 76 61 6c 75 65 20 61    ** its value a
30d50 73 20 61 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64  s a filename and
30d60 20 74 72 79 20 74 6f 20 63 6f 70 79 20 74 68 65   try to copy the
30d70 20 6d 6f 64 65 2c 20 75 69 64 20 61 6e 64 20 67   mode, uid and g
30d80 69 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  id from.    ** t
30d90 68 61 74 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20  hat file.  */.  
30da0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
30db0 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61  = sqlite3_uri_pa
30dc0 72 61 6d 65 74 65 72 28 7a 50 61 74 68 2c 20 22  rameter(zPath, "
30dd0 6d 6f 64 65 6f 66 22 29 3b 0a 20 20 20 20 69 66  modeof");.    if
30de0 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ( z ){.      rc 
30df0 3d 20 67 65 74 46 69 6c 65 4d 6f 64 65 28 7a 2c  = getFileMode(z,
30e00 20 70 4d 6f 64 65 2c 20 70 55 69 64 2c 20 70 47   pMode, pUid, pG
30e10 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  id);.    }.  }. 
30e20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
30e30 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69  *.** Open the fi
30e40 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a  le zPath..** .**
30e50 20 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65   Previously, the
30e60 20 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72   SQLite OS layer
30e70 20 75 73 65 64 20 74 68 72 65 65 20 66 75 6e 63   used three func
30e80 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f  tions in place o
30e90 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a  f this.** one:.*
30ea0 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  *.**     sqlite3
30eb0 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28  OsOpenReadWrite(
30ec0 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  );.**     sqlite
30ed0 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28  3OsOpenReadOnly(
30ee0 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  );.**     sqlite
30ef0 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  3OsOpenExclusive
30f00 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ();.**.** These 
30f10 63 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64  calls correspond
30f20 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
30f30 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f  g combinations o
30f40 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20  f flags:.**.**  
30f50 20 20 20 52 65 61 64 57 72 69 74 65 28 29 20 2d     ReadWrite() -
30f60 3e 20 20 20 20 20 28 52 45 41 44 57 52 49 54 45  >     (READWRITE
30f70 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20   | CREATE).**   
30f80 20 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e    ReadOnly()  ->
30f90 20 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20       (READONLY) 
30fa0 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c  .**     OpenExcl
30fb0 75 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44  usive() -> (READ
30fc0 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c  WRITE | CREATE |
30fd0 20 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a   EXCLUSIVE).**.*
30fe0 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78  * The old OpenEx
30ff0 63 6c 75 73 69 76 65 28 29 20 61 63 63 65 70 74  clusive() accept
31000 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67  ed a boolean arg
31010 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67  ument - "delFlag
31020 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74  ". If.** true, t
31030 68 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66  he file was conf
31040 69 67 75 72 65 64 20 74 6f 20 62 65 20 61 75 74  igured to be aut
31050 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
31060 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66  ed when the.** f
31070 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65  ile handle close
31080 64 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74 68  d. To achieve th
31090 65 20 73 61 6d 65 20 65 66 66 65 63 74 20 75 73  e same effect us
310a0 69 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a  ing this new .**
310b0 20 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20   interface, add 
310c0 74 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  the DELETEONCLOS
310d0 45 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20  E flag to those 
310e0 73 70 65 63 69 66 69 65 64 20 61 62 6f 76 65 20  specified above 
310f0 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c  for .** OpenExcl
31100 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  usive()..*/.stat
31110 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28  ic int unixOpen(
31120 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
31130 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  pVfs,           
31140 2f 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20 77  /* The VFS for w
31150 68 69 63 68 20 74 68 69 73 20 69 73 20 74 68 65  hich this is the
31160 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f   xOpen method */
31170 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
31180 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
31190 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66  /* Pathname of f
311a0 69 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  ile to be opened
311b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
311c0 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20  le *pFile,      
311d0 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
311e0 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20  escriptor to be 
311f0 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69  filled in */.  i
31200 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
31210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
31220 6e 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f  nput flags to co
31230 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e  ntrol the openin
31240 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74  g */.  int *pOut
31250 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
31260 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c      /* Output fl
31270 61 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20  ags returned to 
31280 53 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29  SQLite core */.)
31290 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20  {.  unixFile *p 
312a0 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 46  = (unixFile *)pF
312b0 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20  ile;.  int fd = 
312c0 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  -1;             
312d0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
312e0 73 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65  scriptor returne
312f0 64 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20  d by open() */. 
31300 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d   int openFlags =
31310 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
31320 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73  /* Flags to pass
31330 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20   to open() */.  
31340 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67  int eType = flag
31350 73 26 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f  s&0xFFFFFF00;  /
31360 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74  * Type of file t
31370 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
31380 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20  noLock;         
31390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
313a0 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69  ue to omit locki
313b0 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 2a 2f  ng primitives */
313c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
313d0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
313e0 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65    /* Function Re
313f0 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69  turn Code */.  i
31400 6e 74 20 63 74 72 6c 46 6c 61 67 73 20 3d 20 30  nt ctrlFlags = 0
31410 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
31420 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66 6c 61 67   UNIXFILE_* flag
31430 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78  s */..  int isEx
31440 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67  clusive  = (flag
31450 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
31460 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e  EXCLUSIVE);.  in
31470 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d  t isDelete     =
31480 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
31490 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
314a0 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72  OSE);.  int isCr
314b0 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67  eate     = (flag
314c0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
314d0 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69  CREATE);.  int i
314e0 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66  sReadonly   = (f
314f0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
31500 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
31510 69 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20  int isReadWrite 
31520 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
31530 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
31540 45 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  E);.#if SQLITE_E
31550 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
31560 59 4c 45 0a 20 20 69 6e 74 20 69 73 41 75 74 6f  YLE.  int isAuto
31570 50 72 6f 78 79 20 20 3d 20 28 66 6c 61 67 73 20  Proxy  = (flags 
31580 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55  & SQLITE_OPEN_AU
31590 54 4f 50 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66  TOPROXY);.#endif
315a0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
315b0 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54  PPLE__) || SQLIT
315c0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
315d0 5f 53 54 59 4c 45 0a 20 20 73 74 72 75 63 74 20  _STYLE.  struct 
315e0 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 23  statfs fsInfo;.#
315f0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 63  endif..  /* If c
31600 72 65 61 74 69 6e 67 20 61 20 6d 61 73 74 65 72  reating a master
31610 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f   or main-file jo
31620 75 72 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e 63  urnal, this func
31630 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20  tion will open. 
31640 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73 63 72   ** a file-descr
31650 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 64 69 72  iptor on the dir
31660 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20  ectory too. The 
31670 66 69 72 73 74 20 74 69 6d 65 20 75 6e 69 78 53  first time unixS
31680 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20 63 61  ync().  ** is ca
31690 6c 6c 65 64 20 74 68 65 20 64 69 72 65 63 74 6f  lled the directo
316a0 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
316b0 6f 72 20 77 69 6c 6c 20 62 65 20 66 73 79 6e 63  or will be fsync
316c0 28 29 65 64 20 61 6e 64 20 63 6c 6f 73 65 28 29  ()ed and close()
316d0 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 73  d..  */.  int is
316e0 4e 65 77 4a 72 6e 6c 20 3d 20 28 69 73 43 72 65  NewJrnl = (isCre
316f0 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20  ate && (.       
31700 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
31710 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
31720 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
31730 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
31740 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  AIN_JOURNAL .   
31750 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
31760 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29  TE_OPEN_WAL.  ))
31770 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d  ;..  /* If argum
31780 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e  ent zPath is a N
31790 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69  ULL pointer, thi
317a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  s function is re
317b0 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20  quired to open. 
317c0 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20   ** a temporary 
317d0 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62  file. Use this b
317e0 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74  uffer to store t
317f0 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e  he file name in.
31800 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d  .  */.  char zTm
31810 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41  pname[MAX_PATHNA
31820 4d 45 2b 32 5d 3b 0a 20 20 63 6f 6e 73 74 20 63  ME+2];.  const c
31830 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61  har *zName = zPa
31840 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  th;..  /* Check 
31850 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
31860 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75  atements are tru
31870 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  e: .  **.  **   
31880 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20  (a) Exactly one 
31890 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45  of the READWRITE
318a0 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c   and READONLY fl
318b0 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c  ags must be set,
318c0 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29   and .  **   (b)
318d0 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65   if CREATE is se
318e0 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54  t, then READWRIT
318f0 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
31900 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28  et, and.  **   (
31910 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20  c) if EXCLUSIVE 
31920 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
31930 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
31940 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29   set..  **   (d)
31950 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53   if DELETEONCLOS
31960 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
31970 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
31980 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  be set..  */.  a
31990 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c  ssert((isReadonl
319a0 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  y==0 || isReadWr
319b0 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65  ite==0) && (isRe
319c0 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61  adWrite || isRea
319d0 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72  donly));.  asser
319e0 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c  t(isCreate==0 ||
319f0 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20   isReadWrite);. 
31a00 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73   assert(isExclus
31a10 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ive==0 || isCrea
31a20 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
31a30 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43  Delete==0 || isC
31a40 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  reate);..  /* Th
31a50 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20  e main DB, main 
31a60 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c  journal, WAL fil
31a70 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75  e and master jou
31a80 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a  rnal are never .
31a90 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
31aa0 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20  ly deleted. Nor 
31ab0 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65  are they ever te
31ac0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20  mporary files.  
31ad0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  */.  assert( (!i
31ae0 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
31af0 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
31b00 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
31b10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
31b20 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
31b30 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
31b40 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
31b50 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
31b60 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
31b70 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
31b80 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
31b90 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  TER_JOURNAL );. 
31ba0 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
31bb0 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
31bc0 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
31bd0 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a  PEN_WAL );..  /*
31be0 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
31bf0 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73   upper layer has
31c00 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20   set one of the 
31c10 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67  "file-type" flag
31c20 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  s. */.  assert( 
31c30 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
31c40 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20  EN_MAIN_DB      
31c50 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
31c60 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20  _OPEN_TEMP_DB . 
31c70 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
31c80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
31c90 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70  _JOURNAL || eTyp
31ca0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
31cb0 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  EMP_JOURNAL .   
31cc0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
31cd0 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
31ce0 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d  RNAL   || eType=
31cf0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
31d00 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
31d10 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
31d20 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
31d30 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d  ENT_DB || eType=
31d40 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
31d50 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 74 65  .  );..  /* Dete
31d60 63 74 20 61 20 70 69 64 20 63 68 61 6e 67 65 20  ct a pid change 
31d70 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50 52  and reset the PR
31d80 4e 47 2e 20 20 54 68 65 72 65 20 69 73 20 61 20  NG.  There is a 
31d90 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 0a 20  race condition. 
31da0 20 2a 2a 20 68 65 72 65 20 73 75 63 68 20 74 68   ** here such th
31db0 61 74 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74  at two or more t
31dc0 68 72 65 61 64 73 20 61 6c 6c 20 74 72 79 69 6e  hreads all tryin
31dd0 67 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61  g to open databa
31de0 73 65 73 20 61 74 0a 20 20 2a 2a 20 74 68 65 20  ses at.  ** the 
31df0 73 61 6d 65 20 69 6e 73 74 61 6e 74 20 6d 69 67  same instant mig
31e00 68 74 20 61 6c 6c 20 72 65 73 65 74 20 74 68 65  ht all reset the
31e10 20 50 52 4e 47 2e 20 20 42 75 74 20 6d 75 6c 74   PRNG.  But mult
31e20 69 70 6c 65 20 72 65 73 65 74 73 0a 20 20 2a 2a  iple resets.  **
31e30 20 61 72 65 20 68 61 72 6d 6c 65 73 73 2e 0a 20   are harmless.. 
31e40 20 2a 2f 0a 20 20 69 66 28 20 72 61 6e 64 6f 6d   */.  if( random
31e50 6e 65 73 73 50 69 64 21 3d 6f 73 47 65 74 70 69  nessPid!=osGetpi
31e60 64 28 30 29 20 29 7b 0a 20 20 20 20 72 61 6e 64  d(0) ){.    rand
31e70 6f 6d 6e 65 73 73 50 69 64 20 3d 20 6f 73 47 65  omnessPid = osGe
31e80 74 70 69 64 28 30 29 3b 0a 20 20 20 20 73 71 6c  tpid(0);.    sql
31e90 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
31ea0 30 2c 30 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  0,0);.  }.  mems
31eb0 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
31ec0 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69  unixFile));..  i
31ed0 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  f( eType==SQLITE
31ee0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b  _OPEN_MAIN_DB ){
31ef0 0a 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46  .    UnixUnusedF
31f00 64 20 2a 70 55 6e 75 73 65 64 3b 0a 20 20 20 20  d *pUnused;.    
31f10 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65  pUnused = findRe
31f20 75 73 61 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20  usableFd(zName, 
31f30 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  flags);.    if( 
31f40 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20  pUnused ){.     
31f50 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66   fd = pUnused->f
31f60 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  d;.    }else{.  
31f70 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71      pUnused = sq
31f80 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73  lite3_malloc64(s
31f90 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29  izeof(*pUnused))
31fa0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 55 6e  ;.      if( !pUn
31fb0 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  used ){.        
31fc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
31fd0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
31fe0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70  }.    }.    p->p
31ff0 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73  PreallocatedUnus
32000 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 0a 20  ed = pUnused;.. 
32010 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
32020 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 64 6f 75  ilenames are dou
32030 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61  ble-zero termina
32040 74 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20  ted if they are 
32050 6e 6f 74 0a 20 20 20 20 2a 2a 20 55 52 49 73 20  not.    ** URIs 
32060 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 73 2e  with parameters.
32070 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20 63 61    Hence, they ca
32080 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61 73 73  n always be pass
32090 65 64 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 73  ed into.    ** s
320a0 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
320b0 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61  eter(). */.    a
320c0 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
320d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
320e0 20 7c 7c 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e   || zName[strlen
320f0 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b  (zName)+1]==0 );
32100 0a 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 7a  ..  }else if( !z
32110 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Name ){.    /* I
32120 66 20 7a 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c  f zName is NULL,
32130 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
32140 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 20 61   is requesting a
32150 20 74 65 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20   temp file. */. 
32160 20 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65     assert(isDele
32170 74 65 20 26 26 20 21 69 73 4e 65 77 4a 72 6e 6c  te && !isNewJrnl
32180 29 3b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78  );.    rc = unix
32190 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56 66 73  GetTempname(pVfs
321a0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54  ->mxPathname, zT
321b0 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  mpname);.    if(
321c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
321d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
321e0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61  c;.    }.    zNa
321f0 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 0a  me = zTmpname;..
32200 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 64      /* Generated
32210 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e   temporary filen
32220 61 6d 65 73 20 61 72 65 20 61 6c 77 61 79 73 20  ames are always 
32230 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d  double-zero term
32240 69 6e 61 74 65 64 0a 20 20 20 20 2a 2a 20 66 6f  inated.    ** fo
32250 72 20 75 73 65 20 62 79 20 73 71 6c 69 74 65 33  r use by sqlite3
32260 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29  _uri_parameter()
32270 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
32280 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e   zName[strlen(zN
32290 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 20 20  ame)+1]==0 );.  
322a0 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e  }..  /* Determin
322b0 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
322c0 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
322d0 65 72 20 70 61 73 73 65 64 20 74 6f 20 50 4f 53  er passed to POS
322e0 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  IX function.  **
322f0 20 6f 70 65 6e 28 29 2e 20 54 68 65 73 65 20 6d   open(). These m
32300 75 73 74 20 62 65 20 63 61 6c 63 75 6c 61 74 65  ust be calculate
32310 64 20 65 76 65 6e 20 69 66 20 6f 70 65 6e 28 29  d even if open()
32320 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20   is not called, 
32330 61 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61 79  as.  ** they may
32340 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 70 61   be stored as pa
32350 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68  rt of the file h
32360 61 6e 64 6c 65 20 61 6e 64 20 75 73 65 64 20 62  andle and used b
32370 79 20 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e  y the .  ** 'con
32380 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67  ch file' locking
32390 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72   functions later
323a0 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69   on.  */.  if( i
323b0 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65  sReadonly )  ope
323c0 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e  nFlags |= O_RDON
323d0 4c 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64  LY;.  if( isRead
323e0 57 72 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67  Write ) openFlag
323f0 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69  s |= O_RDWR;.  i
32400 66 28 20 69 73 43 72 65 61 74 65 20 29 20 20 20  f( isCreate )   
32410 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
32420 43 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45  CREAT;.  if( isE
32430 78 63 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46  xclusive ) openF
32440 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c  lags |= (O_EXCL|
32450 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f  O_NOFOLLOW);.  o
32460 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c  penFlags |= (O_L
32470 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52  ARGEFILE|O_BINAR
32480 59 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c 30 20  Y);..  if( fd<0 
32490 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70  ){.    mode_t op
324a0 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  enMode;         
324b0 20 20 20 20 20 2f 2a 20 50 65 72 6d 69 73 73 69       /* Permissi
324c0 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 20 66 69  ons to create fi
324d0 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 20 20 75  le with */.    u
324e0 69 64 5f 74 20 75 69 64 3b 20 20 20 20 20 20 20  id_t uid;       
324f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32500 55 73 65 72 69 64 20 66 6f 72 20 74 68 65 20 66  Userid for the f
32510 69 6c 65 20 2a 2f 0a 20 20 20 20 67 69 64 5f 74  ile */.    gid_t
32520 20 67 69 64 3b 20 20 20 20 20 20 20 20 20 20 20   gid;           
32530 20 20 20 20 20 20 20 20 20 2f 2a 20 47 72 6f 75           /* Grou
32540 70 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65  pid for the file
32550 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 69 6e   */.    rc = fin
32560 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28  dCreateFileMode(
32570 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 26 6f  zName, flags, &o
32580 70 65 6e 4d 6f 64 65 2c 20 26 75 69 64 2c 20 26  penMode, &uid, &
32590 67 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gid);.    if( rc
325a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
325b0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d       assert( !p-
325c0 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e  >pPreallocatedUn
325d0 75 73 65 64 20 29 3b 0a 20 20 20 20 20 20 61 73  used );.      as
325e0 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
325f0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20  ITE_OPEN_WAL || 
32600 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
32610 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
32620 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
32630 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 64  rc;.    }.    fd
32640 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a   = robust_open(z
32650 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  Name, openFlags,
32660 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20   openMode);.    
32670 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 58 20  OSTRACE(("OPENX 
32680 20 20 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22    %-3d %s 0%o\n"
32690 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65  , fd, zName, ope
326a0 6e 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 61 73  nFlags));.    as
326b0 73 65 72 74 28 20 21 69 73 45 78 63 6c 75 73 69  sert( !isExclusi
326c0 76 65 20 7c 7c 20 28 6f 70 65 6e 46 6c 61 67 73  ve || (openFlags
326d0 20 26 20 4f 5f 43 52 45 41 54 29 21 3d 30 20 29   & O_CREAT)!=0 )
326e0 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29  ;.    if( fd<0 )
326f0 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 4e 65  {.      if( isNe
32700 77 4a 72 6e 6c 20 26 26 20 65 72 72 6e 6f 3d 3d  wJrnl && errno==
32710 45 41 43 43 45 53 20 26 26 20 6f 73 41 63 63 65  EACCES && osAcce
32720 73 73 28 7a 4e 61 6d 65 2c 20 46 5f 4f 4b 29 20  ss(zName, F_OK) 
32730 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
32740 20 75 6e 61 62 6c 65 20 74 6f 20 63 72 65 61 74   unable to creat
32750 65 20 61 20 6a 6f 75 72 6e 61 6c 20 62 65 63 61  e a journal beca
32760 75 73 65 20 74 68 65 20 64 69 72 65 63 74 6f 72  use the director
32770 79 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20  y is not.       
32780 20 2a 2a 20 77 72 69 74 61 62 6c 65 2c 20 63 68   ** writable, ch
32790 61 6e 67 65 20 74 68 65 20 65 72 72 6f 72 20 63  ange the error c
327a0 6f 64 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ode to indicate 
327b0 74 68 61 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  that. */.       
327c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
327d0 44 4f 4e 4c 59 5f 44 49 52 45 43 54 4f 52 59 3b  DONLY_DIRECTORY;
327e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
327f0 20 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26   errno!=EISDIR &
32800 26 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b  & isReadWrite ){
32810 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  .        /* Fail
32820 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66  ed to open the f
32830 69 6c 65 20 66 6f 72 20 72 65 61 64 2f 77 72 69  ile for read/wri
32840 74 65 20 61 63 63 65 73 73 2e 20 54 72 79 20 72  te access. Try r
32850 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20  ead-only. */.   
32860 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28       flags &= ~(
32870 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
32880 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
32890 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20  N_CREATE);.     
328a0 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20     openFlags &= 
328b0 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  ~(O_RDWR|O_CREAT
328c0 29 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  );.        flags
328d0 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
328e0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
328f0 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f    openFlags |= O
32900 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20  _RDONLY;.       
32910 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b   isReadonly = 1;
32920 0a 20 20 20 20 20 20 20 20 66 64 20 3d 20 72 6f  .        fd = ro
32930 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c  bust_open(zName,
32940 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e   openFlags, open
32950 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Mode);.      }. 
32960 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3c     }.    if( fd<
32970 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  0 ){.      int r
32980 63 32 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  c2 = unixLogErro
32990 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
329a0 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20  N_BKPT, "open", 
329b0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  zName);.      if
329c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
329d0 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20  ) rc = rc2;.    
329e0 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
329f0 73 68 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  shed;.    }..   
32a00 20 2f 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63   /* If this proc
32a10 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61  ess is running a
32a20 73 20 72 6f 6f 74 20 61 6e 64 20 69 66 20 63 72  s root and if cr
32a30 65 61 74 69 6e 67 20 61 20 6e 65 77 20 72 6f 6c  eating a new rol
32a40 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75  lback.    ** jou
32a50 72 6e 61 6c 20 6f 72 20 57 41 4c 20 66 69 6c 65  rnal or WAL file
32a60 2c 20 73 65 74 20 74 68 65 20 6f 77 6e 65 72 73  , set the owners
32a70 68 69 70 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  hip of the journ
32a80 61 6c 20 6f 72 20 57 41 4c 20 74 6f 20 62 65 0a  al or WAL to be.
32a90 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20      ** the same 
32aa0 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  as the original 
32ab0 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f  database..    */
32ac0 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26  .    if( flags &
32ad0 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41   (SQLITE_OPEN_WA
32ae0 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  L|SQLITE_OPEN_MA
32af0 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20  IN_JOURNAL) ){. 
32b00 20 20 20 20 20 72 6f 62 75 73 74 46 63 68 6f 77       robustFchow
32b10 6e 28 66 64 2c 20 75 69 64 2c 20 67 69 64 29 3b  n(fd, uid, gid);
32b20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
32b30 65 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20  ert( fd>=0 );.  
32b40 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b  if( pOutFlags ){
32b50 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20  .    *pOutFlags 
32b60 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20  = flags;.  }..  
32b70 69 66 28 20 70 2d 3e 70 50 72 65 61 6c 6c 6f 63  if( p->pPrealloc
32b80 61 74 65 64 55 6e 75 73 65 64 20 29 7b 0a 20 20  atedUnused ){.  
32b90 20 20 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74    p->pPreallocat
32ba0 65 64 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66  edUnused->fd = f
32bb0 64 3b 0a 20 20 20 20 70 2d 3e 70 50 72 65 61 6c  d;.    p->pPreal
32bc0 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 2d 3e 66  locatedUnused->f
32bd0 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
32be0 7d 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74  }..  if( isDelet
32bf0 65 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  e ){.#if OS_VXWO
32c00 52 4b 53 0a 20 20 20 20 7a 50 61 74 68 20 3d 20  RKS.    zPath = 
32c10 7a 4e 61 6d 65 3b 0a 23 65 6c 69 66 20 64 65 66  zName;.#elif def
32c20 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 4e 4c 49  ined(SQLITE_UNLI
32c30 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45 29 0a  NK_AFTER_CLOSE).
32c40 20 20 20 20 7a 50 61 74 68 20 3d 20 73 71 6c 69      zPath = sqli
32c50 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
32c60 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , zName);.    if
32c70 28 20 7a 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20  ( zPath==0 ){.  
32c80 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
32c90 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  (p, fd, __LINE__
32ca0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
32cb0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
32cc0 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  T;.    }.#else. 
32cd0 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4e 61 6d     osUnlink(zNam
32ce0 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  e);.#endif.  }.#
32cf0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
32d00 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
32d10 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70   else{.    p->op
32d20 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c  enFlags = openFl
32d30 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ags;.  }.#endif.
32d40 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f    .#if defined(_
32d50 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c  _APPLE__) || SQL
32d60 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
32d70 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 66  NG_STYLE.  if( f
32d80 73 74 61 74 66 73 28 66 64 2c 20 26 66 73 49 6e  statfs(fd, &fsIn
32d90 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20  fo) == -1 ){.   
32da0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
32db0 70 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72  p, errno);.    r
32dc0 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66  obust_close(p, f
32dd0 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
32de0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32df0 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20  IOERR_ACCESS;.  
32e00 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72  }.  if (0 == str
32e10 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66 73  ncmp("msdos", fs
32e20 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
32e30 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75  e, 5)) {.    ((u
32e40 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d  nixFile*)pFile)-
32e50 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49  >fsFlags |= SQLI
32e60 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53  TE_FSFLAGS_IS_MS
32e70 44 4f 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30  DOS;.  }.  if (0
32e80 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 65 78 66   == strncmp("exf
32e90 61 74 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73  at", fsInfo.f_fs
32ea0 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a  typename, 5)) {.
32eb0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
32ec0 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20  pFile)->fsFlags 
32ed0 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47  |= SQLITE_FSFLAG
32ee0 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a  S_IS_MSDOS;.  }.
32ef0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74  #endif..  /* Set
32f00 20 75 70 20 61 70 70 72 6f 70 72 69 61 74 65 20   up appropriate 
32f10 63 74 72 6c 46 6c 61 67 73 20 2a 2f 0a 20 20 69  ctrlFlags */.  i
32f20 66 28 20 69 73 44 65 6c 65 74 65 20 29 20 20 20  f( isDelete )   
32f30 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72               ctr
32f40 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
32f50 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20 69 66 28  LE_DELETE;.  if(
32f60 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 20   isReadonly )   
32f70 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46             ctrlF
32f80 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
32f90 5f 52 44 4f 4e 4c 59 3b 0a 20 20 6e 6f 4c 6f 63  _RDONLY;.  noLoc
32fa0 6b 20 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54  k = eType!=SQLIT
32fb0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a  E_OPEN_MAIN_DB;.
32fc0 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 20 20    if( noLock )  
32fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32fe0 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
32ff0 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20  XFILE_NOLOCK;.  
33000 69 66 28 20 69 73 4e 65 77 4a 72 6e 6c 20 29 20  if( isNewJrnl ) 
33010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74                ct
33020 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
33030 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20 69  ILE_DIRSYNC;.  i
33040 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
33050 45 5f 4f 50 45 4e 5f 55 52 49 20 29 20 63 74 72  E_OPEN_URI ) ctr
33060 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
33070 4c 45 5f 55 52 49 3b 0a 0a 23 69 66 20 53 51 4c  LE_URI;..#if SQL
33080 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
33090 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20 53 51 4c  NG_STYLE.#if SQL
330a0 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
330b0 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41 75 74  _LOCKING.  isAut
330c0 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65 6e 64  oProxy = 1;.#end
330d0 69 66 0a 20 20 69 66 28 20 69 73 41 75 74 6f 50  if.  if( isAutoP
330e0 72 6f 78 79 20 26 26 20 28 7a 50 61 74 68 21 3d  roxy && (zPath!=
330f0 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c 6f 63  NULL) && (!noLoc
33100 6b 29 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65  k) && pVfs->xOpe
33110 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 65  n ){.    char *e
33120 6e 76 66 6f 72 63 65 20 3d 20 67 65 74 65 6e 76  nvforce = getenv
33130 28 22 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  ("SQLITE_FORCE_P
33140 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a  ROXY_LOCKING");.
33150 20 20 20 20 69 6e 74 20 75 73 65 50 72 6f 78 79      int useProxy
33160 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 51   = 0;..    /* SQ
33170 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
33180 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e  _LOCKING==1 mean
33190 73 20 66 6f 72 63 65 20 61 6c 77 61 79 73 20 75  s force always u
331a0 73 65 20 70 72 6f 78 79 2c 20 30 20 6d 65 61 6e  se proxy, 0 mean
331b0 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72 20  s .    ** never 
331c0 75 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20  use proxy, NULL 
331d0 6d 65 61 6e 73 20 75 73 65 20 70 72 6f 78 79 20  means use proxy 
331e0 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69  for non-local fi
331f0 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20  les only.  */.  
33200 20 20 69 66 28 20 65 6e 76 66 6f 72 63 65 21 3d    if( envforce!=
33210 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75 73  NULL ){.      us
33220 65 50 72 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e  eProxy = atoi(en
33230 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d  vforce)>0;.    }
33240 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 73 65 50  else{.      useP
33250 72 6f 78 79 20 3d 20 21 28 66 73 49 6e 66 6f 2e  roxy = !(fsInfo.
33260 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41  f_flags&MNT_LOCA
33270 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  L);.    }.    if
33280 28 20 75 73 65 50 72 6f 78 79 20 29 7b 0a 20 20  ( useProxy ){.  
33290 20 20 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55      rc = fillInU
332a0 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64  nixFile(pVfs, fd
332b0 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20  , pFile, zPath, 
332c0 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20  ctrlFlags);.    
332d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
332e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
332f0 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f  c = proxyTransfo
33300 72 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 78  rmUnixFile((unix
33310 46 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61  File*)pFile, ":a
33320 75 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20 20  uto:");.        
33330 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
33340 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  K ){.          /
33350 2a 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65 20  * Use unixClose 
33360 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20  to clean up the 
33370 72 65 73 6f 75 72 63 65 73 20 61 64 64 65 64 20  resources added 
33380 69 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c  in fillInUnixFil
33390 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
333a0 61 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74 68  and clear all th
333b0 65 20 73 74 72 75 63 74 75 72 65 27 73 20 72 65  e structure's re
333c0 66 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63 69  ferences.  Speci
333d0 66 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20  fically, .      
333e0 20 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d      ** pFile->pM
333f0 65 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e  ethods will be N
33400 55 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f 73  ULL so sqlite3Os
33410 43 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61 20  Close will be a 
33420 6e 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20 20  no-op .         
33430 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e   */.          un
33440 69 78 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a  ixClose(pFile);.
33450 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
33460 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
33470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
33480 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b  o open_finished;
33490 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
334a0 66 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 7a  f.  .  assert( z
334b0 50 61 74 68 3d 3d 30 20 7c 7c 20 7a 50 61 74 68  Path==0 || zPath
334c0 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20 20 20  [0]=='/' .      
334d0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
334e0 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
334f0 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53  RNAL || eType==S
33500 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
33510 4a 4f 55 52 4e 41 4c 20 0a 20 20 29 3b 0a 20 20  JOURNAL .  );.  
33520 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46  rc = fillInUnixF
33530 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 70 46  ile(pVfs, fd, pF
33540 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c  ile, zPath, ctrl
33550 46 6c 61 67 73 29 3b 0a 0a 6f 70 65 6e 5f 66 69  Flags);..open_fi
33560 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 63  nished:.  if( rc
33570 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
33580 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
33590 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64  p->pPreallocated
335a0 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72  Unused);.  }.  r
335b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
335c0 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66  .** Delete the f
335d0 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66  ile at zPath. If
335e0 20 74 68 65 20 64 69 72 53 79 6e 63 20 61 72 67   the dirSync arg
335f0 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66  ument is true, f
33600 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69  sync().** the di
33610 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65  rectory after de
33620 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e  leting the file.
33630 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
33640 6e 69 78 44 65 6c 65 74 65 28 0a 20 20 73 71 6c  nixDelete(.  sql
33650 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
33660 64 2c 20 20 20 20 20 2f 2a 20 56 46 53 20 63 6f  d,     /* VFS co
33670 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 61 73  ntaining this as
33680 20 74 68 65 20 78 44 65 6c 65 74 65 20 6d 65 74   the xDelete met
33690 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
336a0 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
336b0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
336c0 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  le to be deleted
336d0 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53 79 6e   */.  int dirSyn
336e0 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
336f0 2f 2a 20 49 66 20 74 72 75 65 2c 20 66 73 79 6e  /* If true, fsyn
33700 63 28 29 20 64 69 72 65 63 74 6f 72 79 20 61 66  c() directory af
33710 74 65 72 20 64 65 6c 65 74 69 6e 67 20 66 69 6c  ter deleting fil
33720 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
33730 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
33740 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
33750 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d  (NotUsed);.  Sim
33760 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
33770 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
33780 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69 66 28 20  _DELETE);.  if( 
33790 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d  osUnlink(zPath)=
337a0 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 69 66 28  =(-1) ){.    if(
337b0 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 0a 23   errno==ENOENT.#
337c0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
337d0 20 20 20 20 20 20 7c 7c 20 6f 73 41 63 63 65 73        || osAcces
337e0 73 28 7a 50 61 74 68 2c 30 29 21 3d 30 0a 23 65  s(zPath,0)!=0.#e
337f0 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20 20  ndif.    ){.    
33800 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
33810 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
33820 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
33830 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
33840 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
33850 52 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c 69 6e  R_DELETE, "unlin
33860 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20  k", zPath);.    
33870 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
33880 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
33890 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53  ITE_DISABLE_DIRS
338a0 59 4e 43 0a 20 20 69 66 28 20 28 64 69 72 53 79  YNC.  if( (dirSy
338b0 6e 63 20 26 20 31 29 21 3d 30 20 29 7b 0a 20 20  nc & 1)!=0 ){.  
338c0 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63    int fd;.    rc
338d0 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f   = osOpenDirecto
338e0 72 79 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a  ry(zPath, &fd);.
338f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
33900 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
33910 66 28 20 66 75 6c 6c 5f 66 73 79 6e 63 28 66 64  f( full_fsync(fd
33920 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 20  ,0,0) ){.       
33930 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
33940 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
33950 44 49 52 5f 46 53 59 4e 43 2c 20 22 66 73 79 6e  DIR_FSYNC, "fsyn
33960 63 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20  c", zPath);.    
33970 20 20 7d 0a 20 20 20 20 20 20 72 6f 62 75 73 74    }.      robust
33980 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f  _close(0, fd, __
33990 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c  LINE__);.    }el
339a0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
339b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
339c0 54 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 72  TOPEN );.      r
339d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
339e0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
339f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
33a00 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 65  /*.** Test the e
33a10 78 69 73 74 65 6e 63 65 20 6f 66 20 6f 72 20 61  xistence of or a
33a20 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
33a30 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68 2e  s of file zPath.
33a40 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65 72   The.** test per
33a50 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20 6f  formed depends o
33a60 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 66  n the value of f
33a70 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lags:.**.**     
33a80 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
33a90 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20 69  ISTS: Return 1 i
33aa0 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74  f the file exist
33ab0 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  s.**     SQLITE_
33ac0 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
33ad0 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
33ae0 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 20 61  e file is read a
33af0 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20  nd writable..** 
33b00 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
33b10 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75  S_READONLY: Retu
33b20 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  rn 1 if the file
33b30 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a   is readable..**
33b40 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65  .** Otherwise re
33b50 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
33b60 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73 73  c int unixAccess
33b70 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
33b80 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a 20 54  *NotUsed,   /* T
33b90 68 65 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e  he VFS containin
33ba0 67 20 74 68 69 73 20 78 41 63 63 65 73 73 20 6d  g this xAccess m
33bb0 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ethod */.  const
33bc0 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
33bd0 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 74 68     /* Path of th
33be0 65 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e  e file to examin
33bf0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
33c00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
33c10 2a 20 57 68 61 74 20 64 6f 20 77 65 20 77 61 6e  * What do we wan
33c20 74 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f 75 74  t to learn about
33c30 20 74 68 65 20 7a 50 61 74 68 20 66 69 6c 65 3f   the zPath file?
33c40 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f   */.  int *pResO
33c50 75 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ut            /*
33c60 20 57 72 69 74 65 20 72 65 73 75 6c 74 20 62 6f   Write result bo
33c70 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a 29 7b  olean here */.){
33c80 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
33c90 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
33ca0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
33cb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
33cc0 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a  OERR_ACCESS; );.
33cd0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 4f 75    assert( pResOu
33ce0 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  t!=0 );..  /* Th
33cf0 65 20 73 70 65 63 20 73 61 79 73 20 74 68 65 72  e spec says ther
33d00 65 20 61 72 65 20 74 68 72 65 65 20 70 6f 73 73  e are three poss
33d10 69 62 6c 65 20 76 61 6c 75 65 73 20 66 6f 72 20  ible values for 
33d20 66 6c 61 67 73 2e 20 20 42 75 74 20 6f 6e 6c 79  flags.  But only
33d30 0a 20 20 2a 2a 20 74 77 6f 20 6f 66 20 74 68 65  .  ** two of the
33d40 6d 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 75  m are actually u
33d50 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  sed */.  assert(
33d60 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41   flags==SQLITE_A
33d70 43 43 45 53 53 5f 45 58 49 53 54 53 20 7c 7c 20  CCESS_EXISTS || 
33d80 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43  flags==SQLITE_AC
33d90 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 20 29  CESS_READWRITE )
33da0 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 3d 3d  ;..  if( flags==
33db0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
33dc0 49 53 54 53 20 29 7b 0a 20 20 20 20 73 74 72 75  ISTS ){.    stru
33dd0 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20  ct stat buf;.   
33de0 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 30 3d 3d   *pResOut = (0==
33df0 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26 62  osStat(zPath, &b
33e00 75 66 29 20 26 26 20 62 75 66 2e 73 74 5f 73 69  uf) && buf.st_si
33e10 7a 65 3e 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ze>0);.  }else{.
33e20 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 6f      *pResOut = o
33e30 73 41 63 63 65 73 73 28 7a 50 61 74 68 2c 20 57  sAccess(zPath, W
33e40 5f 4f 4b 7c 52 5f 4f 4b 29 3d 3d 30 3b 0a 20 20  _OK|R_OK)==0;.  
33e50 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
33e60 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a  E_OK;.}../*.**.*
33e70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6b 46  /.static int mkF
33e80 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 63  ullPathname(.  c
33e90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
33ea0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
33eb0 2a 20 49 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a  * Input path */.
33ec0 20 20 63 68 61 72 20 2a 7a 4f 75 74 2c 20 20 20    char *zOut,   
33ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33ee0 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66    /* Output buff
33ef0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74  er */.  int nOut
33f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f10 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
33f20 61 74 65 64 20 73 69 7a 65 20 6f 66 20 62 75 66  ated size of buf
33f30 66 65 72 20 7a 4f 75 74 20 2a 2f 0a 29 7b 0a 20  fer zOut */.){. 
33f40 20 69 6e 74 20 6e 50 61 74 68 20 3d 20 73 71 6c   int nPath = sql
33f50 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
33f60 74 68 29 3b 0a 20 20 69 6e 74 20 69 4f 66 66 20  th);.  int iOff 
33f70 3d 20 30 3b 0a 20 20 69 66 28 20 7a 50 61 74 68  = 0;.  if( zPath
33f80 5b 30 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [0]!='/' ){.    
33f90 69 66 28 20 6f 73 47 65 74 63 77 64 28 7a 4f 75  if( osGetcwd(zOu
33fa0 74 2c 20 6e 4f 75 74 2d 32 29 3d 3d 30 20 29 7b  t, nOut-2)==0 ){
33fb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e  .      return un
33fc0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
33fd0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
33fe0 20 22 67 65 74 63 77 64 22 2c 20 7a 50 61 74 68   "getcwd", zPath
33ff0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f 66  );.    }.    iOf
34000 66 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  f = sqlite3Strle
34010 6e 33 30 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7a  n30(zOut);.    z
34020 4f 75 74 5b 69 4f 66 66 2b 2b 5d 20 3d 20 27 2f  Out[iOff++] = '/
34030 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 4f  ';.  }.  if( (iO
34040 66 66 2b 6e 50 61 74 68 2b 31 29 3e 6e 4f 75 74  ff+nPath+1)>nOut
34050 20 29 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 69 74   ){.    /* SQLit
34060 65 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 78  e assumes that x
34070 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 6e  FullPathname() n
34080 75 6c 2d 74 65 72 6d 69 6e 61 74 65 73 20 74 68  ul-terminates th
34090 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 0a  e output buffer.
340a0 20 20 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 69      ** even if i
340b0 74 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  t returns an err
340c0 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 7a 4f 75 74  or.  */.    zOut
340d0 5b 69 4f 66 66 5d 20 3d 20 27 5c 30 27 3b 0a 20  [iOff] = '\0';. 
340e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
340f0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
34100 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e    }.  sqlite3_sn
34110 70 72 69 6e 74 66 28 6e 4f 75 74 2d 69 4f 66 66  printf(nOut-iOff
34120 2c 20 26 7a 4f 75 74 5b 69 4f 66 66 5d 2c 20 22  , &zOut[iOff], "
34130 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 72  %s", zPath);.  r
34140 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
34150 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61  .}../*.** Turn a
34160 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
34170 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70  me into a full p
34180 61 74 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c  athname. The rel
34190 61 74 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73  ative path.** is
341a0 20 73 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c   stored as a nul
341b0 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
341c0 6e 67 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  ng in the buffer
341d0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a   pointed to by.*
341e0 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20  * zPath. .**.** 
341f0 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  zOut points to a
34200 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65   buffer of at le
34210 61 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  ast sqlite3_vfs.
34220 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73  mxPathname bytes
34230 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61   .** (in this ca
34240 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45  se, MAX_PATHNAME
34250 20 62 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c   bytes). The ful
34260 6c 2d 70 61 74 68 20 69 73 20 77 72 69 74 74 65  l-path is writte
34270 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66  n to.** this buf
34280 66 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72  fer before retur
34290 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
342a0 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68  int unixFullPath
342b0 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  name(.  sqlite3_
342c0 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
342d0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
342e0 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a   to vfs object *
342f0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
34300 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
34310 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65    /* Possibly re
34320 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74  lative input pat
34330 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c  h */.  int nOut,
34340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34350 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
34360 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e  output buffer in
34370 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72   bytes */.  char
34380 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20   *zOut          
34390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
343a0 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b  put buffer */.){
343b0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 48 41  .#if !defined(HA
343c0 56 45 5f 52 45 41 44 4c 49 4e 4b 29 20 7c 7c 20  VE_READLINK) || 
343d0 21 64 65 66 69 6e 65 64 28 48 41 56 45 5f 4c 53  !defined(HAVE_LS
343e0 54 41 54 29 0a 20 20 72 65 74 75 72 6e 20 6d 6b  TAT).  return mk
343f0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 50 61  FullPathname(zPa
34400 74 68 2c 20 7a 4f 75 74 2c 20 6e 4f 75 74 29 3b  th, zOut, nOut);
34410 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 20  .#else.  int rc 
34420 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
34430 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
34440 6e 4c 69 6e 6b 20 3d 20 31 3b 20 20 20 20 20 20  nLink = 1;      
34450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
34460 62 65 72 20 6f 66 20 73 79 6d 62 6f 6c 69 63 20  ber of symbolic 
34470 6c 69 6e 6b 73 20 66 6f 6c 6c 6f 77 65 64 20 73  links followed s
34480 6f 20 66 61 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  o far */.  const
34490 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 7a 50 61   char *zIn = zPa
344a0 74 68 3b 20 20 20 20 20 20 2f 2a 20 49 6e 70 75  th;      /* Inpu
344b0 74 20 70 61 74 68 20 66 6f 72 20 65 61 63 68 20  t path for each 
344c0 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 6c 6f 6f  iteration of loo
344d0 70 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65  p */.  char *zDe
344e0 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  l = 0;..  assert
344f0 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ( pVfs->mxPathna
34500 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45  me==MAX_PATHNAME
34510 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
34520 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20  AMETER(pVfs);.. 
34530 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
34540 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
34550 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
34560 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
34570 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
34580 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
34590 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
345a0 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
345b0 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
345c0 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
345d0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
345e0 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66  could fail if, f
345f0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a  or example, the.
34600 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72    ** current wor
34610 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68  king directory h
34620 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64  as been unlinked
34630 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
34640 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
34650 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
34660 0a 0a 20 20 64 6f 20 7b 0a 0a 20 20 20 20 2f 2a  ..  do {..    /*
34670 20 43 61 6c 6c 20 73 74 61 74 28 29 20 6f 6e 20   Call stat() on 
34680 70 61 74 68 20 7a 49 6e 2e 20 53 65 74 20 62 4c  path zIn. Set bL
34690 69 6e 6b 20 74 6f 20 74 72 75 65 20 69 66 20 74  ink to true if t
346a0 68 65 20 70 61 74 68 20 69 73 20 61 20 73 79 6d  he path is a sym
346b0 62 6f 6c 69 63 0a 20 20 20 20 2a 2a 20 6c 69 6e  bolic.    ** lin
346c0 6b 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65  k, or false othe
346d0 72 77 69 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69  rwise.  */.    i
346e0 6e 74 20 62 4c 69 6e 6b 20 3d 20 30 3b 0a 20 20  nt bLink = 0;.  
346f0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
34700 66 3b 0a 20 20 20 20 69 66 28 20 6f 73 4c 73 74  f;.    if( osLst
34710 61 74 28 7a 49 6e 2c 20 26 62 75 66 29 21 3d 30  at(zIn, &buf)!=0
34720 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72   ){.      if( er
34730 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20  rno!=ENOENT ){. 
34740 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
34750 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
34760 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22  CANTOPEN_BKPT, "
34770 6c 73 74 61 74 22 2c 20 7a 49 6e 29 3b 0a 20 20  lstat", zIn);.  
34780 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
34790 0a 20 20 20 20 20 20 62 4c 69 6e 6b 20 3d 20 53  .      bLink = S
347a0 5f 49 53 4c 4e 4b 28 62 75 66 2e 73 74 5f 6d 6f  _ISLNK(buf.st_mo
347b0 64 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  de);.    }..    
347c0 69 66 28 20 62 4c 69 6e 6b 20 29 7b 0a 20 20 20  if( bLink ){.   
347d0 20 20 20 69 66 28 20 7a 44 65 6c 3d 3d 30 20 29     if( zDel==0 )
347e0 7b 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 20 3d  {.        zDel =
347f0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
34800 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 69  nOut);.        i
34810 66 28 20 7a 44 65 6c 3d 3d 30 20 29 20 72 63 20  f( zDel==0 ) rc 
34820 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
34830 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  KPT;.      }else
34840 20 69 66 28 20 2b 2b 6e 4c 69 6e 6b 3e 53 51 4c   if( ++nLink>SQL
34850 49 54 45 5f 4d 41 58 5f 53 59 4d 4c 49 4e 4b 53  ITE_MAX_SYMLINKS
34860 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
34870 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
34880 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 0a  _BKPT;.      }..
34890 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
348a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
348b0 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 52 65 61     nByte = osRea
348c0 64 6c 69 6e 6b 28 7a 49 6e 2c 20 7a 44 65 6c 2c  dlink(zIn, zDel,
348d0 20 6e 4f 75 74 2d 31 29 3b 0a 20 20 20 20 20 20   nOut-1);.      
348e0 20 20 69 66 28 20 6e 42 79 74 65 3c 30 20 29 7b    if( nByte<0 ){
348f0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
34900 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
34910 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
34920 54 2c 20 22 72 65 61 64 6c 69 6e 6b 22 2c 20 7a  T, "readlink", z
34930 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  In);.        }el
34940 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
34950 28 20 7a 44 65 6c 5b 30 5d 21 3d 27 2f 27 20 29  ( zDel[0]!='/' )
34960 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
34970 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t n;.           
34980 20 66 6f 72 28 6e 20 3d 20 73 71 6c 69 74 65 33   for(n = sqlite3
34990 53 74 72 6c 65 6e 33 30 28 7a 49 6e 29 3b 20 6e  Strlen30(zIn); n
349a0 3e 30 20 26 26 20 7a 49 6e 5b 6e 2d 31 5d 21 3d  >0 && zIn[n-1]!=
349b0 27 2f 27 3b 20 6e 2d 2d 29 3b 0a 20 20 20 20 20  '/'; n--);.     
349c0 20 20 20 20 20 20 20 69 66 28 20 6e 42 79 74 65         if( nByte
349d0 2b 6e 2b 31 3e 6e 4f 75 74 20 29 7b 0a 20 20 20  +n+1>nOut ){.   
349e0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
349f0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
34a00 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
34a10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
34a20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26         memmove(&
34a30 7a 44 65 6c 5b 6e 5d 2c 20 7a 44 65 6c 2c 20 6e  zDel[n], zDel, n
34a40 42 79 74 65 2b 31 29 3b 0a 20 20 20 20 20 20 20  Byte+1);.       
34a50 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 44         memcpy(zD
34a60 65 6c 2c 20 7a 49 6e 2c 20 6e 29 3b 0a 20 20 20  el, zIn, n);.   
34a70 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65             nByte
34a80 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20   += n;.         
34a90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
34aa0 0a 20 20 20 20 20 20 20 20 20 20 7a 44 65 6c 5b  .          zDel[
34ab0 6e 42 79 74 65 5d 20 3d 20 27 5c 30 27 3b 0a 20  nByte] = '\0';. 
34ac0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
34ad0 0a 0a 20 20 20 20 20 20 7a 49 6e 20 3d 20 7a 44  ..      zIn = zD
34ae0 65 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  el;.    }..    a
34af0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
34b00 45 5f 4f 4b 20 7c 7c 20 7a 49 6e 21 3d 7a 4f 75  E_OK || zIn!=zOu
34b10 74 20 7c 7c 20 7a 49 6e 5b 30 5d 3d 3d 27 2f 27  t || zIn[0]=='/'
34b20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
34b30 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 49 6e  SQLITE_OK && zIn
34b40 21 3d 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20  !=zOut ){.      
34b50 72 63 20 3d 20 6d 6b 46 75 6c 6c 50 61 74 68 6e  rc = mkFullPathn
34b60 61 6d 65 28 7a 49 6e 2c 20 7a 4f 75 74 2c 20 6e  ame(zIn, zOut, n
34b70 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Out);.    }.    
34b80 69 66 28 20 62 4c 69 6e 6b 3d 3d 30 20 29 20 62  if( bLink==0 ) b
34b90 72 65 61 6b 3b 0a 20 20 20 20 7a 49 6e 20 3d 20  reak;.    zIn = 
34ba0 7a 4f 75 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20  zOut;.  }while( 
34bb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
34bc0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
34bd0 28 7a 44 65 6c 29 3b 0a 20 20 72 65 74 75 72 6e  (zDel);.  return
34be0 20 72 63 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a   rc;.#endif   /*
34bf0 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 4b 20 26   HAVE_READLINK &
34c00 26 20 48 41 56 45 5f 4c 53 54 41 54 20 2a 2f 0a  & HAVE_LSTAT */.
34c10 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
34c20 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
34c30 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74  ENSION./*.** Int
34c40 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e  erfaces for open
34c50 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62  ing a shared lib
34c60 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e  rary, finding en
34c70 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69  try points.** wi
34c80 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  thin the shared 
34c90 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f  library, and clo
34ca0 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  sing the shared 
34cb0 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63  library..*/.#inc
34cc0 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73  lude <dlfcn.h>.s
34cd0 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78  tatic void *unix
34ce0 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  DlOpen(sqlite3_v
34cf0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e  fs *NotUsed, con
34d00 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
34d10 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  me){.  UNUSED_PA
34d20 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
34d30 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70 65  ;.  return dlope
34d40 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c  n(zFilename, RTL
34d50 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f  D_NOW | RTLD_GLO
34d60 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  BAL);.}../*.** S
34d70 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73  QLite calls this
34d80 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69   function immedi
34d90 61 74 65 6c 79 20 61 66 74 65 72 20 61 20 63 61  ately after a ca
34da0 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28  ll to unixDlSym(
34db0 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70  ) or.** unixDlOp
34dc0 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74 75  en() fails (retu
34dd0 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74  rns a null point
34de0 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20 64  er). If a more d
34df0 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a  etailed error.**
34e00 20 6d 65 73 73 61 67 65 20 69 73 20 61 76 61 69   message is avai
34e10 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72 69  lable, it is wri
34e20 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e  tten to zBufOut.
34e30 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73   If no error mes
34e40 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c  sage.** is avail
34e50 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69 73  able, zBufOut is
34e60 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64   left unmodified
34e70 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65 73   and SQLite uses
34e80 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72   a default.** er
34e90 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a  ror message..*/.
34ea0 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
34eb0 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  DlError(sqlite3_
34ec0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
34ed0 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
34ee0 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20  ufOut){.  const 
34ef0 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e  char *zErr;.  UN
34f00 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
34f10 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 45  otUsed);.  unixE
34f20 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a  nterMutex();.  z
34f30 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b  Err = dlerror();
34f40 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20  .  if( zErr ){. 
34f50 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
34f60 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75  ntf(nBuf, zBufOu
34f70 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a  t, "%s", zErr);.
34f80 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d    }.  unixLeaveM
34f90 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63  utex();.}.static
34fa0 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53 79   void (*unixDlSy
34fb0 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  m(sqlite3_vfs *N
34fc0 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c  otUsed, void *p,
34fd0 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d   const char*zSym
34fe0 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a  ))(void){.  /* .
34ff0 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20 2d 70    ** GCC with -p
35000 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 73  edantic-errors s
35010 61 79 73 20 74 68 61 74 20 43 39 30 20 64 6f 65  ays that C90 doe
35020 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f  s not allow a vo
35030 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63  id* to be.  ** c
35040 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74  ast into a point
35050 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
35060 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65 20 6c  .  And yet the l
35070 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29 20 72  ibrary dlsym() r
35080 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75  outine.  ** retu
35090 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68 69 63  rns a void* whic
350a0 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f  h is really a po
350b0 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
350c0 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20  ion.  So how do 
350d0 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73 79  we.  ** use dlsy
350e0 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61 6e 74  m() with -pedant
350f0 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a  ic-errors?.  **.
35100 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 78 20    ** Variable x 
35110 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e 65 64  below is defined
35120 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74 65 72   to be a pointer
35130 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74   to a function t
35140 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d  aking.  ** param
35150 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e 64 20  eters void* and 
35160 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e 64 20  const char* and 
35170 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e  returning a poin
35180 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
35190 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74 69  n..  ** We initi
351a0 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73 69 67  alize x by assig
351b0 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e 74 65  ning it a pointe
351c0 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28 29  r to the dlsym()
351d0 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20   function..  ** 
351e0 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65 6e 74  (That assignment
351f0 20 72 65 71 75 69 72 65 73 20 61 20 63 61 73 74   requires a cast
35200 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61 6c 6c  .)  Then we call
35210 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 68   the function th
35220 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73  at.  ** x points
35230 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a   to.  .  **.  **
35240 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e   This work-aroun
35250 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f  d is unlikely to
35260 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20   work correctly 
35270 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20 77 68  on any system wh
35280 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61  ere.  ** you rea
35290 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73 74 20  lly cannot cast 
352a0 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  a function point
352b0 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20  er into void*.  
352c0 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65  But then, on the
352d0 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64  .  ** other hand
352e0 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e  , dlsym() will n
352f0 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20  ot work on such 
35300 61 20 73 79 73 74 65 6d 20 65 69 74 68 65 72 2c  a system either,
35310 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20 2a 2a   so we have.  **
35320 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74   not really lost
35330 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a   anything..  */.
35340 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f    void (*(*x)(vo
35350 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  id*,const char*)
35360 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45  )(void);.  UNUSE
35370 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
35380 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69  sed);.  x = (voi
35390 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e  d(*(*)(void*,con
353a0 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29  st char*))(void)
353b0 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e  )dlsym;.  return
353c0 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a   (*x)(p, zSym);.
353d0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  }.static void un
353e0 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65  ixDlClose(sqlite
353f0 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
35400 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a  void *pHandle){.
35410 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
35420 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64  ER(NotUsed);.  d
35430 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b  lclose(pHandle);
35440 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53  .}.#else /* if S
35450 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
35460 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66  EXTENSION is def
35470 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69  ined: */.  #defi
35480 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30  ne unixDlOpen  0
35490 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
354a0 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69  lError 0.  #defi
354b0 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30  ne unixDlSym   0
354c0 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
354d0 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a  lClose 0.#endif.
354e0 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75  ./*.** Write nBu
354f0 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f  f bytes of rando
35500 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20 73 75  m data to the su
35510 70 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42  pplied buffer zB
35520 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  uf..*/.static in
35530 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73  t unixRandomness
35540 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
35550 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c  tUsed, int nBuf,
35560 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
35570 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
35580 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73  (NotUsed);.  ass
35590 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75 66  ert((size_t)nBuf
355a0 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74  >=(sizeof(time_t
355b0 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b  )+sizeof(int)));
355c0 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74  ..  /* We have t
355d0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75  o initialize zBu
355e0 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c  f to prevent val
355f0 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72  grind from repor
35600 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73  ting.  ** errors
35610 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73 20 69  .  The reports i
35620 73 73 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e  ssued by valgrin
35630 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20  d are incorrect 
35640 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20  - we would.  ** 
35650 70 72 65 66 65 72 20 74 68 61 74 20 74 68 65 20  prefer that the 
35660 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e  randomness be in
35670 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e  creased by makin
35680 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  g use of the.  *
35690 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  * uninitialized 
356a0 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20  space in zBuf - 
356b0 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72  but valgrind err
356c0 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72  ors tend to worr
356d0 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72  y.  ** some user
356e0 73 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e 20  s.  Rather than 
356f0 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20  argue, it seems 
35700 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69  easier just to i
35710 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74  nitialize.  ** t
35720 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61  he whole array a
35730 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72  nd silence valgr
35740 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61  ind, even if tha
35750 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e  t means less ran
35760 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20  domness.  ** in 
35770 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e  the random seed.
35780 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
35790 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c  testing, initial
357a0 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20  izing zBuf[] to 
357b0 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64  zero is all we d
357c0 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20  o.  That means. 
357d0 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61   ** that we alwa
357e0 79 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  ys use the same 
357f0 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65  random number se
35800 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61  quence.  This ma
35810 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73  kes the.  ** tes
35820 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20  ts repeatable.. 
35830 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75   */.  memset(zBu
35840 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 20 20 72  f, 0, nBuf);.  r
35850 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20 6f  andomnessPid = o
35860 73 47 65 74 70 69 64 28 30 29 3b 20 20 0a 23 69  sGetpid(0);  .#i
35870 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
35880 45 5f 54 45 53 54 29 20 26 26 20 21 64 65 66 69  E_TEST) && !defi
35890 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
358a0 52 41 4e 44 4f 4d 4e 45 53 53 29 0a 20 20 7b 0a  RANDOMNESS).  {.
358b0 20 20 20 20 69 6e 74 20 66 64 2c 20 67 6f 74 3b      int fd, got;
358c0 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
358d0 5f 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e  _open("/dev/uran
358e0 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20  dom", O_RDONLY, 
358f0 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30  0);.    if( fd<0
35900 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74   ){.      time_t
35910 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26   t;.      time(&
35920 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  t);.      memcpy
35930 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f  (zBuf, &t, sizeo
35940 66 28 74 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d  f(t));.      mem
35950 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66  cpy(&zBuf[sizeof
35960 28 74 29 5d 2c 20 26 72 61 6e 64 6f 6d 6e 65 73  (t)], &randomnes
35970 73 50 69 64 2c 20 73 69 7a 65 6f 66 28 72 61 6e  sPid, sizeof(ran
35980 64 6f 6d 6e 65 73 73 50 69 64 29 29 3b 0a 20 20  domnessPid));.  
35990 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
359a0 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 72 61 6e  of(t)+sizeof(ran
359b0 64 6f 6d 6e 65 73 73 50 69 64 29 3c 3d 28 73 69  domnessPid)<=(si
359c0 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20  ze_t)nBuf );.   
359d0 20 20 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66     nBuf = sizeof
359e0 28 74 29 20 2b 20 73 69 7a 65 6f 66 28 72 61 6e  (t) + sizeof(ran
359f0 64 6f 6d 6e 65 73 73 50 69 64 29 3b 0a 20 20 20  domnessPid);.   
35a00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f   }else{.      do
35a10 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 66  { got = osRead(f
35a20 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20  d, zBuf, nBuf); 
35a30 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26  }while( got<0 &&
35a40 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
35a50 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
35a60 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e  ose(0, fd, __LIN
35a70 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E__);.    }.  }.
35a80 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
35a90 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nBuf;.}.../*.** 
35aa0 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
35ab0 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
35ac0 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
35ad0 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54  time slept..** T
35ae0 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
35af0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63  he number of mic
35b00 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e  roseconds we wan
35b10 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54  t to sleep..** T
35b20 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
35b30 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
35b40 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66   microseconds of
35b50 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a   sleep actually.
35b60 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f  ** requested fro
35b70 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  m the underlying
35b80 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
35b90 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63  m, a number whic
35ba0 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72  h.** might be gr
35bb0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
35bc0 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d  ual to the argum
35bd0 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73  ent, but not les
35be0 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72  s.** than the ar
35bf0 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
35c00 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28  c int unixSleep(
35c10 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
35c20 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73  Used, int micros
35c30 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f  econds){.#if OS_
35c40 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
35c50 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20   timespec sp;.. 
35c60 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63   sp.tv_sec = mic
35c70 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30  roseconds / 1000
35c80 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65  000;.  sp.tv_nse
35c90 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64  c = (microsecond
35ca0 73 20 25 20 31 30 30 30 30 30 30 29 20 2a 20 31  s % 1000000) * 1
35cb0 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70  000;.  nanosleep
35cc0 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55  (&sp, NULL);.  U
35cd0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
35ce0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
35cf0 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b  rn microseconds;
35d00 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48  .#elif defined(H
35d10 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48  AVE_USLEEP) && H
35d20 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c  AVE_USLEEP.  usl
35d30 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73  eep(microseconds
35d40 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
35d50 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
35d60 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65    return microse
35d70 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69  conds;.#else.  i
35d80 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69  nt seconds = (mi
35d90 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39  croseconds+99999
35da0 39 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c  9)/1000000;.  sl
35db0 65 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20  eep(seconds);.  
35dc0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
35dd0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
35de0 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30  urn seconds*1000
35df0 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  000;.#endif.}../
35e00 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
35e10 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20  ng variable, if 
35e20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  set to a non-zer
35e30 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65  o value, is inte
35e40 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68  rpreted as.** th
35e50 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f  e number of seco
35e60 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61  nds since 1970 a
35e70 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65  nd is used to se
35e80 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  t the result of.
35e90 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72  ** sqlite3OsCurr
35ea0 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67  entTime() during
35eb0 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66   testing..*/.#if
35ec0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
35ed0 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72  int sqlite3_curr
35ee0 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f  ent_time = 0;  /
35ef0 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69  * Fake system ti
35f00 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69  me in seconds si
35f10 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e  nce 1970. */.#en
35f20 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  dif../*.** Find 
35f30 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
35f40 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
35f50 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
35f60 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
35f70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72  iNow.** the curr
35f80 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
35f90 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
35fa0 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38  y number times 8
35fb0 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a  6_400_000.  In.*
35fc0 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  * other words, w
35fd0 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
35fe0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
35ff0 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63  illiseconds sinc
36000 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20  e the Julian.** 
36010 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e  epoch of noon in
36020 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f   Greenwich on No
36030 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20  vember 24, 4714 
36040 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  B.C according to
36050 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69   the.** prolepti
36060 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65  c Gregorian cale
36070 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  ndar..**.** On s
36080 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53  uccess, return S
36090 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72  QLITE_OK.  Retur
360a0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69  n SQLITE_ERROR i
360b0 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
360c0 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ate .** cannot b
360d0 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
360e0 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65  ic int unixCurre
360f0 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69  ntTimeInt64(sqli
36100 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
36110 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
36120 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69  *piNow){.  stati
36130 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
36140 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20  int64 unixEpoch 
36150 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69  = 24405875*(sqli
36160 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
36170 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
36180 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 20 64 65 66  LITE_OK;.#if def
36190 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a  ined(NO_GETTOD).
361a0 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69    time_t t;.  ti
361b0 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77  me(&t);.  *piNow
361c0 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74   = ((sqlite3_int
361d0 36 34 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69  64)t)*1000 + uni
361e0 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53  xEpoch;.#elif OS
361f0 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
36200 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b  t timespec sNow;
36210 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65  .  clock_gettime
36220 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c  (CLOCK_REALTIME,
36230 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f   &sNow);.  *piNo
36240 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20  w = unixEpoch + 
36250 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
36260 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20  t64)sNow.tv_sec 
36270 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31  + sNow.tv_nsec/1
36280 30 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20  000000;.#else.  
36290 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73  struct timeval s
362a0 4e 6f 77 3b 0a 20 20 28 76 6f 69 64 29 67 65 74  Now;.  (void)get
362b0 74 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c  timeofday(&sNow,
362c0 20 30 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20   0);  /* Cannot 
362d0 66 61 69 6c 20 67 69 76 65 6e 20 76 61 6c 69 64  fail given valid
362e0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
362f0 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f  *piNow = unixEpo
36300 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74  ch + 1000*(sqlit
36310 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76  e3_int64)sNow.tv
36320 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75  _sec + sNow.tv_u
36330 73 65 63 2f 31 30 30 30 3b 0a 23 65 6e 64 69 66  sec/1000;.#endif
36340 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
36350 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74  TEST.  if( sqlit
36360 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
36370 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20  ){.    *piNow = 
36380 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
36390 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72  t64)sqlite3_curr
363a0 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45  ent_time + unixE
363b0 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  poch;.  }.#endif
363c0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
363d0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
363e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
363f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
36400 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a  T_DEPRECATED./*.
36410 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
36420 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
36430 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
36440 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
36450 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
36460 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
36470 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
36480 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77  mber into *prNow
36490 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30   and.** return 0
364a0 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
364b0 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
364c0 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
364d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
364e0 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28  unixCurrentTime(
364f0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
36500 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72  Used, double *pr
36510 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Now){.  sqlite3_
36520 69 6e 74 36 34 20 69 20 3d 20 30 3b 0a 20 20 69  int64 i = 0;.  i
36530 6e 74 20 72 63 3b 0a 20 20 55 4e 55 53 45 44 5f  nt rc;.  UNUSED_
36540 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
36550 64 29 3b 0a 20 20 72 63 20 3d 20 75 6e 69 78 43  d);.  rc = unixC
36560 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
36570 30 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77  0, &i);.  *prNow
36580 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b   = i/86400000.0;
36590 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
365a0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75  #else.# define u
365b0 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 20 30  nixCurrentTime 0
365c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
365d0 68 65 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  he xGetLastError
365e0 28 29 20 6d 65 74 68 6f 64 20 69 73 20 64 65 73  () method is des
365f0 69 67 6e 65 64 20 74 6f 20 72 65 74 75 72 6e 20  igned to return 
36600 61 20 62 65 74 74 65 72 0a 2a 2a 20 6c 6f 77 2d  a better.** low-
36610 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d 65 73 73  level error mess
36620 61 67 65 20 77 68 65 6e 20 6f 70 65 72 61 74 69  age when operati
36630 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f 62 6c 65  ng-system proble
36640 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75  ms come up.** du
36650 72 69 6e 67 20 53 51 4c 69 74 65 20 6f 70 65 72  ring SQLite oper
36660 61 74 69 6f 6e 2e 20 20 4f 6e 6c 79 20 74 68 65  ation.  Only the
36670 20 69 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20   integer return 
36680 63 6f 64 65 20 69 73 20 63 75 72 72 65 6e 74 6c  code is currentl
36690 79 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 73 74  y.** used..*/.st
366a0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74  atic int unixGet
366b0 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65  LastError(sqlite
366c0 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
366d0 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20 63 68  int NotUsed2, ch
366e0 61 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20  ar *NotUsed3){. 
366f0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
36700 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e  R(NotUsed);.  UN
36710 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
36720 6f 74 55 73 65 64 32 29 3b 0a 20 20 55 4e 55 53  otUsed2);.  UNUS
36730 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
36740 55 73 65 64 33 29 3b 0a 20 20 72 65 74 75 72 6e  Used3);.  return
36750 20 65 72 72 6e 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   errno;.}.../*.*
36760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36770 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73  ******* End of s
36780 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f  qlite3_vfs metho
36790 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
367a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
367b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
367c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
367d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
367e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
367f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
36800 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
36810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
36850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
36870 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a   Proxy Locking *
36880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
368a0 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b  **.** Proxy lock
368b0 69 6e 67 20 69 73 20 61 20 22 75 62 65 72 2d 6c  ing is a "uber-l
368c0 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69  ocking-method" i
368d0 6e 20 74 68 69 73 20 73 65 6e 73 65 3a 20 20 49  n this sense:  I
368e0 74 20 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74  t uses the.** ot
368f0 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  her locking meth
36900 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79  ods on secondary
36910 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50 72   lock files.  Pr
36920 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61  oxy locking is a
36930 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f  .** meta-layer o
36940 76 65 72 20 74 6f 70 20 6f 66 20 74 68 65 20 70  ver top of the p
36950 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67  rimitive locking
36960 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f   implemented abo
36970 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73  ve.  For.** this
36980 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76   reason, the div
36990 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65  ision that imple
369a0 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78 79 20 6c  ments of proxy l
369b0 6f 63 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72  ocking is deferr
369c0 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65  ed.** until late
369d0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 28 68 65   in the file (he
369e0 72 65 29 20 61 66 74 65 72 20 61 6c 6c 20 6f 66  re) after all of
369f0 20 74 68 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d   the other I/O m
36a00 65 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62  ethods have.** b
36a10 65 65 6e 20 64 65 66 69 6e 65 64 20 2d 20 73 6f  een defined - so
36a20 20 74 68 61 74 20 74 68 65 20 70 72 69 6d 69 74   that the primit
36a30 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  ive locking meth
36a40 6f 64 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c  ods are availabl
36a50 65 0a 2a 2a 20 61 73 20 73 65 72 76 69 63 65 73  e.** as services
36a60 20 74 6f 20 68 65 6c 70 20 77 69 74 68 20 74 68   to help with th
36a70 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
36a80 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e   of proxy lockin
36a90 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  g..**.****.**.**
36aa0 20 54 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63   The default loc
36ab0 6b 69 6e 67 20 73 63 68 65 6d 65 73 20 69 6e 20  king schemes in 
36ac0 53 51 4c 69 74 65 20 75 73 65 20 62 79 74 65 2d  SQLite use byte-
36ad0 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74  range locks on t
36ae0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
36af0 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74  ile to coordinat
36b00 65 20 73 61 66 65 2c 20 63 6f 6e 63 75 72 72 65  e safe, concurre
36b10 6e 74 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c  nt access by mul
36b20 74 69 70 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a  tiple readers.**
36b30 20 61 6e 64 20 77 72 69 74 65 72 73 20 5b 68 74   and writers [ht
36b40 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f  tp://sqlite.org/
36b50 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e  lockingv3.html].
36b60 20 20 54 68 65 20 66 69 76 65 20 66 69 6c 65 20    The five file 
36b70 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65  locking.** state
36b80 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e  s (UNLOCKED, PEN
36b90 44 49 4e 47 2c 20 53 48 41 52 45 44 2c 20 52 45  DING, SHARED, RE
36ba0 53 45 52 56 45 44 2c 20 45 58 43 4c 55 53 49 56  SERVED, EXCLUSIV
36bb0 45 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  E) are implement
36bc0 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20 72  ed.** as POSIX r
36bd0 65 61 64 20 26 20 77 72 69 74 65 20 6c 6f 63 6b  ead & write lock
36be0 73 20 6f 76 65 72 20 66 69 78 65 64 20 73 65 74  s over fixed set
36bf0 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76   of locations (v
36c00 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e  ia fsctl),.** on
36c10 20 41 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c   AFP and SMB onl
36c20 79 20 65 78 63 6c 75 73 69 76 65 20 62 79 74 65  y exclusive byte
36c30 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65  -range locks are
36c40 20 61 76 61 69 6c 61 62 6c 65 20 76 69 61 20 66   available via f
36c50 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f  sctl.** with _IO
36c60 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75  WR('z', 23, stru
36c70 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
36c80 50 42 32 29 20 74 6f 20 74 72 61 63 6b 20 74 68  PB2) to track th
36c90 65 20 73 61 6d 65 20 35 20 73 74 61 74 65 73 2e  e same 5 states.
36ca0 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65 20  .** To simulate 
36cb0 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65  a F_RDLCK on the
36cc0 20 73 68 61 72 65 64 20 72 61 6e 67 65 2c 20 6f   shared range, o
36cd0 6e 20 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79  n AFP a randomly
36ce0 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64   selected.** add
36cf0 72 65 73 73 20 69 6e 20 74 68 65 20 73 68 61 72  ress in the shar
36d00 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65  ed range is take
36d10 6e 20 66 6f 72 20 61 20 53 48 41 52 45 44 20 6c  n for a SHARED l
36d20 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69 72 65 0a  ock, the entire.
36d30 2a 2a 20 73 68 61 72 65 64 20 72 61 6e 67 65 20  ** shared range 
36d40 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20  is taken for an 
36d50 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a  EXCLUSIVE lock):
36d60 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44  .**.**      PEND
36d70 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20 20 20  ING_BYTE        
36d80 30 78 34 30 30 30 30 30 30 30 0a 2a 2a 20 20 20  0x40000000.**   
36d90 20 20 20 52 45 53 45 52 56 45 44 5f 42 59 54 45     RESERVED_BYTE
36da0 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
36db0 31 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44  1.**      SHARED
36dc0 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20 30 78  _RANGE        0x
36dd0 34 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30  40000002 -> 0x40
36de0 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69  000200.**.** Thi
36df0 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20  s works well on 
36e00 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73  the local file s
36e10 79 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73  ystem, but shows
36e20 20 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a   a nearly 100x.*
36e30 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65  * slowdown in re
36e40 61 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  ad performance o
36e50 6e 20 41 46 50 20 62 65 63 61 75 73 65 20 74 68  n AFP because th
36e60 65 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73  e AFP client dis
36e70 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61  ables.** the rea
36e80 64 20 63 61 63 68 65 20 77 68 65 6e 20 62 79 74  d cache when byt
36e90 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72  e-range locks ar
36ea0 65 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62  e present.  Enab
36eb0 6c 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a  ling the read.**
36ec0 20 63 61 63 68 65 20 65 78 70 6f 73 65 73 20 61   cache exposes a
36ed0 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79   cache coherency
36ee0 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73   problem that is
36ef0 20 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20   present on all 
36f00 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65  OS X.** supporte
36f10 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73  d network file s
36f20 79 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64  ystems.  NFS and
36f30 20 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76   AFP both observ
36f40 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74  e the.** close-t
36f50 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73  o-open semantics
36f60 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61   for ensuring ca
36f70 63 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a  che coherency.**
36f80 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75   [http://nfs.sou
36f90 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61  rceforge.net/#fa
36fa0 71 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65  q_a8], which doe
36fb0 73 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c  s not effectivel
36fc0 79 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65  y.** address the
36fd0 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f   requirements fo
36fe0 72 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74  r concurrent dat
36ff0 61 62 61 73 65 20 61 63 63 65 73 73 20 62 79 20  abase access by 
37000 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64  multiple.** read
37010 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a  ers and writers.
37020 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e  ** [http://www.n
37030 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65  abble.com/SQLite
37040 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f  -on-NFS-cache-co
37050 68 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37  herency-td156557
37060 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20  01.html]..**.** 
37070 54 6f 20 61 64 64 72 65 73 73 20 74 68 65 20 70  To address the p
37080 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63  erformance and c
37090 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69  ache coherency i
370a0 73 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c  ssues, proxy fil
370b0 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61  e locking.** cha
370c0 6e 67 65 73 20 74 68 65 20 77 61 79 20 64 61 74  nges the way dat
370d0 61 62 61 73 65 20 61 63 63 65 73 73 20 69 73 20  abase access is 
370e0 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69  controlled by li
370f0 6d 69 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f  miting access to
37100 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73   a.** single hos
37110 74 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20  t at a time and 
37120 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b  moving file lock
37130 73 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74  s off of the dat
37140 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e  abase file.** an
37150 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66  d onto a proxy f
37160 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ile on the local
37170 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a   file system.  .
37180 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70  **.**.** Using p
37190 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d  roxy locks.** --
371a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
371b0 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a  **.** C APIs.**.
371c0 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  **  sqlite3_file
371d0 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e  _control(db, dbn
371e0 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  ame, SQLITE_FCNT
371f0 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  L_SET_LOCKPROXYF
37200 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ILE,.**         
37210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 70                <p
37220 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61  roxy_path> | ":a
37230 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69  uto:");.**  sqli
37240 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
37250 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c  (db, dbname, SQL
37260 49 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f  ITE_FCNTL_GET_LO
37270 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20  CKPROXYFILE,.** 
37280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37290 20 20 20 20 20 20 26 3c 70 72 6f 78 79 5f 70 61        &<proxy_pa
372a0 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53  th>);.**.**.** S
372b0 51 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a  QL pragmas.**.**
372c0 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61    PRAGMA [databa
372d0 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66  se.]lock_proxy_f
372e0 69 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68 3e  ile=<proxy_path>
372f0 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50 52   | :auto:.**  PR
37300 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d  AGMA [database.]
37310 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a  lock_proxy_file.
37320 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e 67  **.** Specifying
37330 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73 20   ":auto:" means 
37340 74 68 61 74 20 69 66 20 74 68 65 72 65 20 69 73  that if there is
37350 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69   a conch file wi
37360 74 68 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a 2a  th a matching.**
37370 20 68 6f 73 74 20 49 44 20 69 6e 20 69 74 2c 20   host ID in it, 
37380 74 68 65 20 70 72 6f 78 79 20 70 61 74 68 20 69  the proxy path i
37390 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
373a0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 6f   will be used, o
373b0 74 68 65 72 77 69 73 65 0a 2a 2a 20 61 20 70 72  therwise.** a pr
373c0 6f 78 79 20 70 61 74 68 20 62 61 73 65 64 20 6f  oxy path based o
373d0 6e 20 74 68 65 20 75 73 65 72 27 73 20 74 65 6d  n the user's tem
373e0 70 20 64 69 72 0a 2a 2a 20 28 76 69 61 20 63 6f  p dir.** (via co
373f0 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e  nfstr(_CS_DARWIN
37400 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 2e  _USER_TEMP_DIR,.
37410 2e 2e 29 29 20 77 69 6c 6c 20 62 65 20 75 73 65  ..)) will be use
37420 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61 63 74  d and the.** act
37430 75 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 20 6e  ual proxy file n
37440 61 6d 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ame is generated
37450 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65 20 61   from the name a
37460 6e 64 20 70 61 74 68 20 6f 66 20 74 68 65 0a 2a  nd path of the.*
37470 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
37480 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a    For example:.*
37490 2a 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72 20 64  *.**       For d
374a0 61 74 61 62 61 73 65 20 70 61 74 68 20 22 2f 55  atabase path "/U
374b0 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20  sers/me/foo.db" 
374c0 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20 6c 6f  .**       The lo
374d0 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20  ck path will be 
374e0 22 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69 74 65  "<tmpdir>/sqlite
374f0 70 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f 6d 65  plocks/_Users_me
37500 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22 29 0a  _foo.db:auto:").
37510 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f 63  **.** Once a loc
37520 6b 20 70 72 6f 78 79 20 69 73 20 63 6f 6e 66 69  k proxy is confi
37530 67 75 72 65 64 20 66 6f 72 20 61 20 64 61 74 61  gured for a data
37540 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c  base connection,
37550 20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62   it can not.** b
37560 65 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77 65 76  e removed, howev
37570 65 72 20 69 74 20 6d 61 79 20 62 65 20 73 77 69  er it may be swi
37580 74 63 68 65 64 20 74 6f 20 61 20 64 69 66 66 65  tched to a diffe
37590 72 65 6e 74 20 70 72 6f 78 79 20 70 61 74 68 20  rent proxy path 
375a0 76 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f 76 65  via.** the above
375b0 20 41 50 49 73 20 28 61 73 73 75 6d 69 6e 67 20   APIs (assuming 
375c0 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69  the conch file i
375d0 73 20 6e 6f 74 20 62 65 69 6e 67 20 68 65 6c 64  s not being held
375e0 20 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 63   by another.** c
375f0 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72 6f  onnection or pro
37600 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a  cess). .**.**.**
37610 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b 69   How proxy locki
37620 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d  ng works.** ----
37630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37640 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20  ---.**.** Proxy 
37650 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c  file locking rel
37660 69 65 73 20 70 72 69 6d 61 72 69 6c 79 20 6f 6e  ies primarily on
37670 20 74 77 6f 20 6e 65 77 20 73 75 70 70 6f 72 74   two new support
37680 69 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a  ing files: .**.*
37690 2a 20 20 20 2a 20 20 63 6f 6e 63 68 20 66 69 6c  *   *  conch fil
376a0 65 20 74 6f 20 6c 69 6d 69 74 20 61 63 63 65 73  e to limit acces
376b0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
376c0 65 20 66 69 6c 65 20 74 6f 20 61 20 73 69 6e 67  e file to a sing
376d0 6c 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20 20 20  le host.**      
376e0 61 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20  at a time.**.** 
376f0 20 20 2a 20 20 70 72 6f 78 79 20 66 69 6c 65 20    *  proxy file 
37700 74 6f 20 61 63 74 20 61 73 20 61 20 70 72 6f 78  to act as a prox
37710 79 20 66 6f 72 20 74 68 65 20 61 64 76 69 73 6f  y for the adviso
37720 72 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c  ry locks normall
37730 79 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65 6e 20  y.**      taken 
37740 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
37750 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63 68 20  **.** The conch 
37760 66 69 6c 65 20 2d 20 74 6f 20 75 73 65 20 61 20  file - to use a 
37770 70 72 6f 78 79 20 66 69 6c 65 2c 20 73 71 6c 69  proxy file, sqli
37780 74 65 20 6d 75 73 74 20 66 69 72 73 74 20 22 68  te must first "h
37790 6f 6c 64 20 74 68 65 20 63 6f 6e 63 68 22 0a 2a  old the conch".*
377a0 2a 20 62 79 20 74 61 6b 69 6e 67 20 61 6e 20 73  * by taking an s
377b0 71 6c 69 74 65 2d 73 74 79 6c 65 20 73 68 61 72  qlite-style shar
377c0 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63  ed lock on the c
377d0 6f 6e 63 68 20 66 69 6c 65 2c 20 72 65 61 64 69  onch file, readi
377e0 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  ng the.** conten
377f0 74 73 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e 67  ts and comparing
37800 20 74 68 65 20 68 6f 73 74 27 73 20 75 6e 69 71   the host's uniq
37810 75 65 20 68 6f 73 74 20 49 44 20 28 73 65 65 20  ue host ID (see 
37820 62 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b 0a  below) and lock.
37830 2a 2a 20 70 72 6f 78 79 20 70 61 74 68 20 61 67  ** proxy path ag
37840 61 69 6e 73 74 20 74 68 65 20 76 61 6c 75 65 73  ainst the values
37850 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63   stored in the c
37860 6f 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e 63 68  onch.  The conch
37870 20 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74 6f 72   file is.** stor
37880 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ed in the same d
37890 69 72 65 63 74 6f 72 79 20 61 73 20 74 68 65 20  irectory as the 
378a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
378b0 64 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 0a  d the file name.
378c0 2a 2a 20 69 73 20 70 61 74 74 65 72 6e 65 64 20  ** is patterned 
378d0 61 66 74 65 72 20 74 68 65 20 64 61 74 61 62 61  after the databa
378e0 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20  se file name as 
378f0 22 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d 65 3e  ".<databasename>
37900 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66 20 74  -conch"..** If t
37910 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 6f  he conch file do
37920 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72  es not exist, or
37930 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f   its contents do
37940 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 0a 2a   not match the.*
37950 2a 20 68 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72  * host ID and/or
37960 20 70 72 6f 78 79 20 70 61 74 68 2c 20 74 68 65   proxy path, the
37970 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 65 73  n the lock is es
37980 63 61 6c 61 74 65 64 20 74 6f 20 61 6e 20 65 78  calated to an ex
37990 63 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20  clusive.** lock 
379a0 61 6e 64 20 74 68 65 20 63 6f 6e 63 68 20 66 69  and the conch fi
379b0 6c 65 20 63 6f 6e 74 65 6e 74 73 20 69 73 20 75  le contents is u
379c0 70 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20  pdated with the 
379d0 68 6f 73 74 20 49 44 20 61 6e 64 20 70 72 6f 78  host ID and prox
379e0 79 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20 74 68  y.** path and th
379f0 65 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72  e lock is downgr
37a00 61 64 65 64 20 74 6f 20 61 20 73 68 61 72 65 64  aded to a shared
37a10 20 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20 49 66   lock again.  If
37a20 20 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73   the conch.** is
37a30 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72   held by another
37a40 20 70 72 6f 63 65 73 73 20 28 77 69 74 68 20 61   process (with a
37a50 20 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74   shared lock), t
37a60 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
37a70 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61  k.** will fail a
37a80 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  nd SQLITE_BUSY i
37a90 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
37aa0 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65  * The proxy file
37ab0 20 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65   - a single-byte
37ac0 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 61   file used for a
37ad0 6c 6c 20 61 64 76 69 73 6f 72 79 20 66 69 6c 65  ll advisory file
37ae0 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c   locks.** normal
37af0 6c 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20  ly taken on the 
37b00 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
37b10 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72   This allows for
37b20 20 73 61 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a   safe sharing.**
37b30 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
37b40 20 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70   file for multip
37b50 6c 65 20 72 65 61 64 65 72 73 20 61 6e 64 20 77  le readers and w
37b60 72 69 74 65 72 73 20 6f 6e 20 74 68 65 20 73 61  riters on the sa
37b70 6d 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68 65 20  me.** host (the 
37b80 63 6f 6e 63 68 20 65 6e 73 75 72 65 73 20 74 68  conch ensures th
37b90 61 74 20 74 68 65 79 20 61 6c 6c 20 75 73 65 20  at they all use 
37ba0 74 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c  the same local l
37bb0 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a  ock file)..**.**
37bc0 20 52 65 71 75 65 73 74 69 6e 67 20 74 68 65 20   Requesting the 
37bd0 6c 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65 73 20  lock proxy does 
37be0 6e 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  not immediately 
37bf0 74 61 6b 65 20 74 68 65 20 63 6f 6e 63 68 2c 20  take the conch, 
37c00 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61  it is.** only ta
37c10 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 66 69 72  ken when the fir
37c20 73 74 20 72 65 71 75 65 73 74 20 74 6f 20 6c 6f  st request to lo
37c30 63 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ck database file
37c40 20 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54   is made.  .** T
37c50 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20  his matches the 
37c60 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 74 68 65  semantics of the
37c70 20 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63   traditional loc
37c80 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 2c 20 77  king behavior, w
37c90 68 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20  here.** opening 
37ca0 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
37cb0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
37cc0 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20 61 20  does not take a 
37cd0 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54  lock on it..** T
37ce0 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61  he shared lock a
37cf0 6e 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  nd an open file 
37d00 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6d  descriptor are m
37d10 61 69 6e 74 61 69 6e 65 64 20 75 6e 74 69 6c 20  aintained until 
37d20 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  .** the connecti
37d30 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  on to the databa
37d40 73 65 20 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a  se is closed. .*
37d50 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66  *.** The proxy f
37d60 69 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ile and the lock
37d70 20 66 69 6c 65 20 61 72 65 20 6e 65 76 65 72 20   file are never 
37d80 64 65 6c 65 74 65 64 20 73 6f 20 74 68 65 79 20  deleted so they 
37d90 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20  only need.** to 
37da0 62 65 20 63 72 65 61 74 65 64 20 74 68 65 20 66  be created the f
37db0 69 72 73 74 20 74 69 6d 65 20 74 68 65 79 20 61  irst time they a
37dc0 72 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43  re used..**.** C
37dd0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74  onfiguration opt
37de0 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  ions.** --------
37df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
37e00 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 45 46  .**  SQLITE_PREF
37e10 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
37e20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44 61 74  .**.**       Dat
37e30 61 62 61 73 65 20 66 69 6c 65 73 20 61 63 63 65  abase files acce
37e40 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61  ssed on non-loca
37e50 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 61  l file systems a
37e60 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 6f  re.**       auto
37e70 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67  matically config
37e80 75 72 65 64 20 66 6f 72 20 70 72 6f 78 79 20 6c  ured for proxy l
37e90 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c  ocking, lock fil
37ea0 65 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20  es are.**       
37eb0 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61  named automatica
37ec0 6c 6c 79 20 75 73 69 6e 67 20 74 68 65 20 73 61  lly using the sa
37ed0 6d 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20  me logic as.**  
37ee0 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b       PRAGMA lock
37ef0 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75  _proxy_file=":au
37f00 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20  to:".**    .**  
37f10 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42  SQLITE_PROXY_DEB
37f20 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45  UG.**.**       E
37f30 6e 61 62 6c 65 73 20 74 68 65 20 6c 6f 67 67 69  nables the loggi
37f40 6e 67 20 6f 66 20 65 72 72 6f 72 20 6d 65 73 73  ng of error mess
37f50 61 67 65 73 20 64 75 72 69 6e 67 20 68 6f 73 74  ages during host
37f60 20 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20   id file.**     
37f70 20 20 72 65 74 72 69 65 76 61 6c 20 61 6e 64 20    retrieval and 
37f80 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20  creation.**.**  
37f90 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a  LOCKPROXYDIR.**.
37fa0 2a 2a 20 20 20 20 20 20 20 4f 76 65 72 72 69 64  **       Overrid
37fb0 65 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 64  es the default d
37fc0 69 72 65 63 74 6f 72 79 20 75 73 65 64 20 66 6f  irectory used fo
37fd0 72 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c  r lock proxy fil
37fe0 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  es that.**      
37ff0 20 61 72 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d   are named autom
38000 61 74 69 63 61 6c 6c 79 20 76 69 61 20 74 68 65  atically via the
38010 20 22 3a 61 75 74 6f 3a 22 20 73 65 74 74 69 6e   ":auto:" settin
38020 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f  g.**.**  SQLITE_
38030 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
38040 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a  _PERMISSIONS.**.
38050 2a 2a 20 20 20 20 20 20 20 50 65 72 6d 69 73 73  **       Permiss
38060 69 6f 6e 73 20 74 6f 20 75 73 65 20 77 68 65 6e  ions to use when
38070 20 63 72 65 61 74 69 6e 67 20 61 20 64 69 72 65   creating a dire
38080 63 74 6f 72 79 20 66 6f 72 20 73 74 6f 72 69 6e  ctory for storin
38090 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c  g the.**       l
380a0 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 2c  ock proxy files,
380b0 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20   only used when 
380c0 4c 4f 43 4b 50 52 4f 58 59 44 49 52 20 69 73 20  LOCKPROXYDIR is 
380d0 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a  not set..**    .
380e0 2a 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e  **    .** As men
380f0 74 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20 77 68  tioned above, wh
38100 65 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  en compiled with
38110 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
38120 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a  ROXY_LOCKING,.**
38130 20 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 76   setting the env
38140 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c  ironment variabl
38150 65 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  e SQLITE_FORCE_P
38160 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20  ROXY_LOCKING to 
38170 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20  1 will.** force 
38180 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f  proxy locking to
38190 20 62 65 20 75 73 65 64 20 66 6f 72 20 65 76 65   be used for eve
381a0 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
381b0 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a   opened, and 0.*
381c0 2a 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 75 74  * will force aut
381d0 6f 6d 61 74 69 63 20 70 72 6f 78 79 20 6c 6f 63  omatic proxy loc
381e0 6b 69 6e 67 20 74 6f 20 62 65 20 64 69 73 61 62  king to be disab
381f0 6c 65 64 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  led for all data
38200 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65  base.** files (e
38210 78 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c 69 6e  xplicitly callin
38220 67 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  g the SQLITE_FCN
38230 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TL_SET_LOCKPROXY
38240 46 49 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a  FILE pragma or.*
38250 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f  * sqlite_file_co
38260 6e 74 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74  ntrol API is not
38270 20 61 66 66 65 63 74 65 64 20 62 79 20 53 51 4c   affected by SQL
38280 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
38290 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a  LOCKING)..*/../*
382a0 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e  .** Proxy lockin
382b0 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  g is only availa
382c0 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a  ble on MacOSX .*
382d0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
382e0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
382f0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
38300 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54  G_STYLE../*.** T
38310 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  he proxyLockingC
38320 6f 6e 74 65 78 74 20 68 61 73 20 74 68 65 20 70  ontext has the p
38330 61 74 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72  ath and file str
38340 75 63 74 75 72 65 73 20 66 6f 72 20 74 68 65 20  uctures for the 
38350 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c  remote .** and l
38360 6f 63 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73  ocal proxy files
38370 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65   in it.*/.typede
38380 66 20 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f  f struct proxyLo
38390 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f  ckingContext pro
383a0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
383b0 3b 0a 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f  ;.struct proxyLo
383c0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20  ckingContext {. 
383d0 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
383e0 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  File;         /*
383f0 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65   Open conch file
38400 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63   */.  char *conc
38410 68 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20  hFilePath;      
38420 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
38430 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a  e conch file */.
38440 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b    unixFile *lock
38450 50 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f  Proxy;         /
38460 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63  * Open proxy loc
38470 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  k file */.  char
38480 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b   *lockProxyPath;
38490 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
384a0 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f   of the proxy lo
384b0 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  ck file */.  cha
384c0 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20  r *dbPath;      
384d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
384e0 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69  e of the open fi
384f0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63  le */.  int conc
38500 68 48 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20  hHeld;          
38510 20 20 20 20 20 2f 2a 20 31 20 69 66 20 74 68 65       /* 1 if the
38520 20 63 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c 20   conch is held, 
38530 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a  -1 if lockless *
38540 2f 0a 20 20 69 6e 74 20 6e 46 61 69 6c 73 3b 20  /.  int nFails; 
38550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38560 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
38570 6e 63 68 20 74 61 6b 69 6e 67 20 66 61 69 6c 75  nch taking failu
38580 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f  res */.  void *o
38590 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ldLockingContext
385a0 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
385b0 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74  l lockingcontext
385c0 20 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63   to restore on c
385d0 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lose */.  sqlite
385e0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e  3_io_methods con
385f