/ Hex Artifact Content
Login

Artifact 04c8828e4c5c2e7d5abcb9ce170ae6bfb02aa98d:


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 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 77 69 6e 64 6f 77 73 2e  ific to windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 77 69 6e 64 6f 77 73 20 6f 6e 6c 79  for windows only
0210: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 41 20 4e 6f   */.../*.** A No
0220: 74 65 20 41 62 6f 75 74 20 4d 65 6d 6f 72 79 20  te About Memory 
0230: 41 6c 6c 6f 63 61 74 69 6f 6e 3a 0a 2a 2a 0a 2a  Allocation:.**.*
0240: 2a 20 54 68 69 73 20 64 72 69 76 65 72 20 75 73  * This driver us
0250: 65 73 20 6d 61 6c 6c 6f 63 28 29 2f 66 72 65 65  es malloc()/free
0260: 28 29 20 64 69 72 65 63 74 6c 79 20 72 61 74 68  () directly rath
0270: 65 72 20 74 68 61 6e 20 67 6f 69 6e 67 20 74 68  er than going th
0280: 72 6f 75 67 68 0a 2a 2a 20 74 68 65 20 53 51 4c  rough.** the SQL
0290: 69 74 65 2d 77 72 61 70 70 65 72 73 20 73 71 6c  ite-wrappers sql
02a0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2f 73 71  ite3_malloc()/sq
02b0: 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 20 20 54  lite3_free().  T
02c0: 68 6f 73 65 20 77 72 61 70 70 65 72 73 0a 2a 2a  hose wrappers.**
02d0: 20 61 72 65 20 64 65 73 69 67 6e 65 64 20 66 6f   are designed fo
02e0: 72 20 75 73 65 20 6f 6e 20 65 6d 62 65 64 64 65  r use on embedde
02f0: 64 20 73 79 73 74 65 6d 73 20 77 68 65 72 65 20  d systems where 
0300: 6d 65 6d 6f 72 79 20 69 73 20 73 63 61 72 63 65  memory is scarce
0310: 20 61 6e 64 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 66   and.** malloc f
0320: 61 69 6c 75 72 65 73 20 68 61 70 70 65 6e 20 66  ailures happen f
0330: 72 65 71 75 65 6e 74 6c 79 2e 20 20 57 69 6e 33  requently.  Win3
0340: 32 20 64 6f 65 73 20 6e 6f 74 20 74 79 70 69 63  2 does not typic
0350: 61 6c 6c 79 20 72 75 6e 20 6f 6e 0a 2a 2a 20 65  ally run on.** e
0360: 6d 62 65 64 64 65 64 20 73 79 73 74 65 6d 73 2c  mbedded systems,
0370: 20 61 6e 64 20 77 68 65 6e 20 69 74 20 64 6f 65   and when it doe
0380: 73 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73  s the developers
0390: 20 6e 6f 72 6d 61 6c 6c 79 20 68 61 76 65 20 62   normally have b
03a0: 69 67 67 65 72 0a 2a 2a 20 70 72 6f 62 6c 65 6d  igger.** problem
03b0: 73 20 74 6f 20 77 6f 72 72 79 20 61 62 6f 75 74  s to worry about
03c0: 20 74 68 61 6e 20 72 75 6e 6e 69 6e 67 20 6f 75   than running ou
03d0: 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 20 53 6f  t of memory.  So
03e0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 0a 2a 2a   there is not.**
03f0: 20 61 20 63 6f 6d 70 65 6c 6c 69 6e 67 20 6e 65   a compelling ne
0400: 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 77 72  ed to use the wr
0410: 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 42 75  appers..**.** Bu
0420: 74 20 74 68 65 72 65 20 69 73 20 61 20 67 6f 6f  t there is a goo
0430: 64 20 72 65 61 73 6f 6e 20 74 6f 20 6e 6f 74 20  d reason to not 
0440: 75 73 65 20 74 68 65 20 77 72 61 70 70 65 72 73  use the wrappers
0450: 2e 20 20 49 66 20 77 65 20 75 73 65 20 74 68 65  .  If we use the
0460: 0a 2a 2a 20 77 72 61 70 70 65 72 73 20 74 68 65  .** wrappers the
0470: 6e 20 77 65 20 77 69 6c 6c 20 67 65 74 20 73 69  n we will get si
0480: 6d 75 6c 61 74 65 64 20 6d 61 6c 6c 6f 63 28 29  mulated malloc()
0490: 20 66 61 69 6c 75 72 65 73 20 77 69 74 68 69 6e   failures within
04a0: 20 74 68 69 73 0a 2a 2a 20 64 72 69 76 65 72 2e   this.** driver.
04b0: 20 20 41 6e 64 20 74 68 61 74 20 63 61 75 73 65    And that cause
04c0: 73 20 61 6c 6c 20 6b 69 6e 64 73 20 6f 66 20 70  s all kinds of p
04d0: 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 75 72 20  roblems for our 
04e0: 74 65 73 74 73 2e 20 20 57 65 0a 2a 2a 20 63 6f  tests.  We.** co
04f0: 75 6c 64 20 65 6e 68 61 6e 63 65 20 53 51 4c 69  uld enhance SQLi
0500: 74 65 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  te to deal with 
0510: 73 69 6d 75 6c 61 74 65 64 20 6d 61 6c 6c 6f 63  simulated malloc
0520: 20 66 61 69 6c 75 72 65 73 20 77 69 74 68 69 6e   failures within
0530: 0a 2a 2a 20 74 68 65 20 4f 53 20 64 72 69 76 65  .** the OS drive
0540: 72 2c 20 62 75 74 20 74 68 65 20 63 6f 64 65 20  r, but the code 
0550: 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 6f  to deal with tho
0560: 73 65 20 66 61 69 6c 75 72 65 20 77 6f 75 6c 64  se failure would
0570: 20 6e 6f 74 0a 2a 2a 20 62 65 20 65 78 65 72 63   not.** be exerc
0580: 69 73 65 64 20 6f 6e 20 4c 69 6e 75 78 20 28 77  ised on Linux (w
0590: 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 6e 65  hich does not ne
05a0: 65 64 20 74 6f 20 6d 61 6c 6c 6f 63 28 29 20 69  ed to malloc() i
05b0: 6e 20 74 68 65 20 64 72 69 76 65 72 29 0a 2a 2a  n the driver).**
05c0: 20 61 6e 64 20 73 6f 20 77 65 20 77 6f 75 6c 64   and so we would
05d0: 20 68 61 76 65 20 64 69 66 66 69 63 75 6c 74 79   have difficulty
05e0: 20 77 72 69 74 69 6e 67 20 63 6f 76 65 72 61 67   writing coverag
05f0: 65 20 74 65 73 74 73 20 66 6f 72 20 74 68 61 74  e tests for that
0600: 0a 2a 2a 20 63 6f 64 65 2e 20 20 42 65 74 74 65  .** code.  Bette
0610: 72 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20 63  r to leave the c
0620: 6f 64 65 20 6f 75 74 2c 20 77 65 20 74 68 69 6e  ode out, we thin
0630: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  k..**.** The poi
0640: 6e 74 20 6f 66 20 74 68 69 73 20 64 69 73 63 75  nt of this discu
0650: 73 73 69 6f 6e 20 69 73 20 61 73 20 66 6f 6c 6c  ssion is as foll
0660: 6f 77 73 3a 20 20 57 68 65 6e 20 63 72 65 61 74  ows:  When creat
0670: 69 6e 67 20 61 20 6e 65 77 0a 2a 2a 20 4f 53 20  ing a new.** OS 
0680: 6c 61 79 65 72 20 66 6f 72 20 61 6e 20 65 6d 62  layer for an emb
0690: 65 64 64 65 64 20 73 79 73 74 65 6d 2c 20 69 66  edded system, if
06a0: 20 79 6f 75 20 75 73 65 20 74 68 69 73 20 66 69   you use this fi
06b0: 6c 65 20 61 73 20 61 6e 20 65 78 61 6d 70 6c 65  le as an example
06c0: 2c 0a 2a 2a 20 61 76 6f 69 64 20 74 68 65 20 75  ,.** avoid the u
06d0: 73 65 20 6f 66 20 6d 61 6c 6c 6f 63 28 29 2f 66  se of malloc()/f
06e0: 72 65 65 28 29 2e 20 20 54 68 6f 73 65 20 72 6f  ree().  Those ro
06f0: 75 74 69 6e 65 73 20 77 6f 72 6b 20 6f 6b 20 6f  utines work ok o
0700: 6e 20 77 69 6e 64 6f 77 73 0a 2a 2a 20 64 65 73  n windows.** des
0710: 6b 74 6f 70 73 20 62 75 74 20 6e 6f 74 20 73 6f  ktops but not so
0720: 20 77 65 6c 6c 20 69 6e 20 65 6d 62 65 64 64 65   well in embedde
0730: 64 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 0a 23  d systems..*/..#
0740: 69 6e 63 6c 75 64 65 20 3c 77 69 6e 62 61 73 65  include <winbase
0750: 2e 68 3e 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59  .h>..#ifdef __CY
0760: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0770: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0780: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
0790: 63 72 6f 73 20 75 73 65 64 20 74 6f 20 64 65 74  cros used to det
07a0: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
07b0: 72 20 6e 6f 74 20 74 6f 20 75 73 65 20 74 68 72  r not to use thr
07c0: 65 61 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  eads..*/.#if def
07d0: 69 6e 65 64 28 54 48 52 45 41 44 53 41 46 45 29  ined(THREADSAFE)
07e0: 20 26 26 20 54 48 52 45 41 44 53 41 46 45 0a 23   && THREADSAFE.#
07f0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
0800: 33 32 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e  32_THREADS 1.#en
0810: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75  dif../*.** Inclu
0820: 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20  de code that is 
0830: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73  common to all os
0840: 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69  _*.c files.*/.#i
0850: 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f  nclude "os_commo
0860: 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  n.h"../*.** Some
0870: 20 6d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69   microsoft compi
0880: 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64  lers lack this d
0890: 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  efinition..*/.#i
08a0: 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 46 49  fndef INVALID_FI
08b0: 4c 45 5f 41 54 54 52 49 42 55 54 45 53 0a 23 20  LE_ATTRIBUTES.# 
08c0: 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 46  define INVALID_F
08d0: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 28  ILE_ATTRIBUTES (
08e0: 28 44 57 4f 52 44 29 2d 31 29 20 0a 23 65 6e 64  (DWORD)-1) .#end
08f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  if../*.** Determ
0900: 69 6e 65 20 69 66 20 77 65 20 61 72 65 20 64 65  ine if we are de
0910: 61 6c 69 6e 67 20 77 69 74 68 20 57 69 6e 64 6f  aling with Windo
0920: 77 73 43 45 20 2d 20 77 68 69 63 68 20 68 61 73  wsCE - which has
0930: 20 61 20 6d 75 63 68 0a 2a 2a 20 72 65 64 75 63   a much.** reduc
0940: 65 64 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 20 53  ed API..*/.#if S
0950: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23  QLITE_OS_WINCE.#
0960: 20 64 65 66 69 6e 65 20 41 72 65 46 69 6c 65 41   define AreFileA
0970: 70 69 73 41 4e 53 49 28 29 20 31 0a 23 20 64 65  pisANSI() 1.# de
0980: 66 69 6e 65 20 46 6f 72 6d 61 74 4d 65 73 73 61  fine FormatMessa
0990: 67 65 57 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 2c  geW(a,b,c,d,e,f,
09a0: 67 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  g) 0.#endif../* 
09b0: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
09c0: 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  es */.typedef st
09d0: 72 75 63 74 20 77 69 6e 53 68 6d 20 77 69 6e 53  ruct winShm winS
09e0: 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  hm;           /*
09f0: 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   A connection to
0a00: 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a   shared-memory *
0a10: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0a20: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 77 69 6e 53   winShmNode winS
0a30: 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 41 20 72  hmNode;   /* A r
0a40: 65 67 69 6f 6e 20 6f 66 20 73 68 61 72 65 64 2d  egion of shared-
0a50: 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  memory */../*.**
0a60: 20 57 69 6e 43 45 20 6c 61 63 6b 73 20 6e 61 74   WinCE lacks nat
0a70: 69 76 65 20 73 75 70 70 6f 72 74 20 66 6f 72 20  ive support for 
0a80: 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 6f 20  file locking so 
0a90: 77 65 20 68 61 76 65 20 74 6f 20 66 61 6b 65 20  we have to fake 
0aa0: 69 74 0a 2a 2a 20 77 69 74 68 20 73 6f 6d 65 20  it.** with some 
0ab0: 63 6f 64 65 20 6f 66 20 6f 75 72 20 6f 77 6e 2e  code of our own.
0ac0: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
0ad0: 53 5f 57 49 4e 43 45 0a 74 79 70 65 64 65 66 20  S_WINCE.typedef 
0ae0: 73 74 72 75 63 74 20 77 69 6e 63 65 4c 6f 63 6b  struct winceLock
0af0: 20 7b 0a 20 20 69 6e 74 20 6e 52 65 61 64 65 72   {.  int nReader
0b00: 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  s;       /* Numb
0b10: 65 72 20 6f 66 20 72 65 61 64 65 72 20 6c 6f 63  er of reader loc
0b20: 6b 73 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20  ks obtained */. 
0b30: 20 42 4f 4f 4c 20 62 50 65 6e 64 69 6e 67 3b 20   BOOL bPending; 
0b40: 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65       /* Indicate
0b50: 73 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  s a pending lock
0b60: 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e   has been obtain
0b70: 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65  ed */.  BOOL bRe
0b80: 73 65 72 76 65 64 3b 20 20 20 20 20 2f 2a 20 49  served;     /* I
0b90: 6e 64 69 63 61 74 65 73 20 61 20 72 65 73 65 72  ndicates a reser
0ba0: 76 65 64 20 6c 6f 63 6b 20 68 61 73 20 62 65 65  ved lock has bee
0bb0: 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20  n obtained */.  
0bc0: 42 4f 4f 4c 20 62 45 78 63 6c 75 73 69 76 65 3b  BOOL bExclusive;
0bd0: 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73      /* Indicates
0be0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
0bf0: 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61  ck has been obta
0c00: 69 6e 65 64 20 2a 2f 0a 7d 20 77 69 6e 63 65 4c  ined */.} winceL
0c10: 6f 63 6b 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ock;.#endif../*.
0c20: 2a 2a 20 54 68 65 20 77 69 6e 46 69 6c 65 20 73  ** The winFile s
0c30: 74 72 75 63 74 75 72 65 20 69 73 20 61 20 73 75  tructure is a su
0c40: 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65  bclass of sqlite
0c50: 33 5f 66 69 6c 65 2a 20 73 70 65 63 69 66 69 63  3_file* specific
0c60: 20 74 6f 20 74 68 65 20 77 69 6e 33 32 0a 2a 2a   to the win32.**
0c70: 20 70 6f 72 74 61 62 69 6c 69 74 79 20 6c 61 79   portability lay
0c80: 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  er..*/.typedef s
0c90: 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20 77 69  truct winFile wi
0ca0: 6e 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 77 69  nFile;.struct wi
0cb0: 6e 46 69 6c 65 20 7b 0a 20 20 63 6f 6e 73 74 20  nFile {.  const 
0cc0: 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
0cd0: 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20 2f 2a 2a  ds *pMethod; /**
0ce0: 2a 20 4d 75 73 74 20 62 65 20 66 69 72 73 74 20  * Must be first 
0cf0: 2a 2a 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  ***/.  sqlite3_v
0d00: 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 2f  fs *pVfs;      /
0d10: 2a 20 54 68 65 20 56 46 53 20 75 73 65 64 20 74  * The VFS used t
0d20: 6f 20 6f 70 65 6e 20 74 68 69 73 20 66 69 6c 65  o open this file
0d30: 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b 20   */.  HANDLE h; 
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0d50: 20 48 61 6e 64 6c 65 20 66 6f 72 20 61 63 63 65   Handle for acce
0d60: 73 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20 2a  ssing the file *
0d70: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
0d80: 72 20 6c 6f 63 6b 74 79 70 65 3b 20 2f 2a 20 54  r locktype; /* T
0d90: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63 75 72 72  ype of lock curr
0da0: 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 20 74 68  ently held on th
0db0: 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 73 68 6f  is file */.  sho
0dc0: 72 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  rt sharedLockByt
0dd0: 65 3b 20 20 20 2f 2a 20 52 61 6e 64 6f 6d 6c 79  e;   /* Randomly
0de0: 20 63 68 6f 73 65 6e 20 62 79 74 65 20 75 73 65   chosen byte use
0df0: 64 20 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f  d as a shared lo
0e00: 63 6b 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61  ck */.  DWORD la
0e10: 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20  stErrno;        
0e20: 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65  /* The Windows e
0e30: 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61  rrno from the la
0e40: 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a  st I/O error */.
0e50: 20 20 44 57 4f 52 44 20 73 65 63 74 6f 72 53 69    DWORD sectorSi
0e60: 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 63  ze;       /* Sec
0e70: 74 6f 72 20 73 69 7a 65 20 6f 66 20 74 68 65 20  tor size of the 
0e80: 64 65 76 69 63 65 20 66 69 6c 65 20 69 73 20 6f  device file is o
0e90: 6e 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  n */.  winShm *p
0ea0: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Shm;           /
0eb0: 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20 73 68  * Instance of sh
0ec0: 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e 20 74  ared memory on t
0ed0: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f  his file */.  co
0ee0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b  nst char *zPath;
0ef0: 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61        /* Full pa
0f00: 74 68 6e 61 6d 65 20 6f 66 20 74 68 69 73 20 66  thname of this f
0f10: 69 6c 65 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ile */.#if SQLIT
0f20: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 57 43 48  E_OS_WINCE.  WCH
0f30: 41 52 20 2a 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  AR *zDeleteOnClo
0f40: 73 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  se;  /* Name of 
0f50: 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 77  file to delete w
0f60: 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20  hen closing */. 
0f70: 20 48 41 4e 44 4c 45 20 68 4d 75 74 65 78 3b 20   HANDLE hMutex; 
0f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 74 65           /* Mute
0f90: 78 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f  x used to contro
0fa0: 6c 20 61 63 63 65 73 73 20 74 6f 20 73 68 61 72  l access to shar
0fb0: 65 64 20 6c 6f 63 6b 20 2a 2f 20 20 0a 20 20 48  ed lock */  .  H
0fc0: 41 4e 44 4c 45 20 68 53 68 61 72 65 64 3b 20 20  ANDLE hShared;  
0fd0: 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
0fe0: 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20   memory segment 
0ff0: 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
1000: 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20   */.  winceLock 
1010: 6c 6f 63 61 6c 3b 20 20 20 20 20 20 20 20 2f 2a  local;        /*
1020: 20 4c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20   Locks obtained 
1030: 62 79 20 74 68 69 73 20 69 6e 73 74 61 6e 63 65  by this instance
1040: 20 6f 66 20 77 69 6e 46 69 6c 65 20 2a 2f 0a 20   of winFile */. 
1050: 20 77 69 6e 63 65 4c 6f 63 6b 20 2a 73 68 61 72   winceLock *shar
1060: 65 64 3b 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62  ed;      /* Glob
1070: 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6d  al shared lock m
1080: 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 66 69  emory for the fi
1090: 6c 65 20 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  le  */.#endif.};
10a0: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20  ../*.** Forward 
10b0: 70 72 6f 74 6f 74 79 70 65 73 2e 0a 2a 2f 0a 73  prototypes..*/.s
10c0: 74 61 74 69 63 20 69 6e 74 20 67 65 74 53 65 63  tatic int getSec
10d0: 74 6f 72 53 69 7a 65 28 0a 20 20 20 20 73 71 6c  torSize(.    sql
10e0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a  ite3_vfs *pVfs,.
10f0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1100: 7a 52 65 6c 61 74 69 76 65 20 20 20 20 20 2f 2a  zRelative     /*
1110: 20 55 54 46 2d 38 20 66 69 6c 65 20 6e 61 6d 65   UTF-8 file name
1120: 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.);../*.** Th
1130: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
1140: 61 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c  able is (normall
1150: 79 29 20 73 65 74 20 6f 6e 63 65 20 61 6e 64 20  y) set once and 
1160: 6e 65 76 65 72 20 63 68 61 6e 67 65 73 0a 2a 2a  never changes.**
1170: 20 74 68 65 72 65 61 66 74 65 72 2e 20 20 49 74   thereafter.  It
1180: 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72   records whether
1190: 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
11a0: 79 73 74 65 6d 20 69 73 20 57 69 6e 39 35 0a 2a  ystem is Win95.*
11b0: 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a  * or WinNT..**.*
11c0: 2a 20 30 3a 20 20 20 4f 70 65 72 61 74 69 6e 67  * 0:   Operating
11d0: 20 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e   system unknown.
11e0: 0a 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61 74 69  .** 1:   Operati
11f0: 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e  ng system is Win
1200: 39 35 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65 72  95..** 2:   Oper
1210: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20  ating system is 
1220: 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  WinNT..**.** In 
1230: 6f 72 64 65 72 20 74 6f 20 66 61 63 69 6c 69 74  order to facilit
1240: 61 74 65 20 74 65 73 74 69 6e 67 20 6f 6e 20 61  ate testing on a
1250: 20 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20 74   WinNT system, t
1260: 68 65 20 74 65 73 74 20 66 69 78 74 75 72 65 0a  he test fixture.
1270: 2a 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79 20  ** can manually 
1280: 73 65 74 20 74 68 69 73 20 76 61 6c 75 65 20 74  set this value t
1290: 6f 20 31 20 74 6f 20 65 6d 75 6c 61 74 65 20 57  o 1 to emulate W
12a0: 69 6e 39 38 20 62 65 68 61 76 69 6f 72 2e 0a 2a  in98 behavior..*
12b0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
12c0: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
12d0: 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65  _os_type = 0;.#e
12e0: 6c 73 65 0a 73 74 61 74 69 63 20 69 6e 74 20 73  lse.static int s
12f0: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d  qlite3_os_type =
1300: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
1310: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e  * Return true (n
1320: 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 77 65 20 61  on-zero) if we a
1330: 72 65 20 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72  re running under
1340: 20 57 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57   WinNT, Win2K, W
1350: 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43  inXP,.** or WinC
1360: 45 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  E.  Return false
1370: 20 28 7a 65 72 6f 29 20 66 6f 72 20 57 69 6e 39   (zero) for Win9
1380: 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e  5, Win98, or Win
1390: 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69  ME..**.** Here i
13a0: 73 20 61 6e 20 69 6e 74 65 72 65 73 74 69 6e 67  s an interesting
13b0: 20 6f 62 73 65 72 76 61 74 69 6f 6e 3a 20 20 57   observation:  W
13c0: 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64  in95, Win98, and
13d0: 20 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74   WinME lack.** t
13e0: 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20  he LockFileEx() 
13f0: 41 50 49 2e 20 20 42 75 74 20 77 65 20 63 61 6e  API.  But we can
1400: 20 73 74 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c   still staticall
1410: 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20 74  y link against t
1420: 68 61 74 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f  hat.** API as lo
1430: 6e 67 20 61 73 20 77 65 20 64 6f 6e 27 74 20 63  ng as we don't c
1440: 61 6c 6c 20 69 74 20 77 68 65 6e 20 72 75 6e 6e  all it when runn
1450: 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e  ing Win95/98/ME.
1460: 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74    A call to.** t
1470: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
1480: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
1490: 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 73 20   if the host is 
14a0: 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a  Win95/98/ME or.*
14b0: 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f  * WinNT/2K/XP so
14c0: 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e   that we will kn
14d0: 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ow whether or no
14e0: 74 20 77 65 20 63 61 6e 20 73 61 66 65 6c 79 20  t we can safely 
14f0: 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b  call.** the Lock
1500: 46 69 6c 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f  FileEx() API..*/
1510: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1520: 49 4e 43 45 0a 23 20 64 65 66 69 6e 65 20 69 73  INCE.# define is
1530: 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 73 65 0a  NT()  (1).#else.
1540: 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 73 4e    static int isN
1550: 54 28 76 6f 69 64 29 7b 0a 20 20 20 20 69 66 28  T(void){.    if(
1560: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
1570: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f 53 56  ==0 ){.      OSV
1580: 45 52 53 49 4f 4e 49 4e 46 4f 20 73 49 6e 66 6f  ERSIONINFO sInfo
1590: 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f 2e 64 77  ;.      sInfo.dw
15a0: 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a  OSVersionInfoSiz
15b0: 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f  e = sizeof(sInfo
15c0: 29 3b 0a 20 20 20 20 20 20 47 65 74 56 65 72 73  );.      GetVers
15d0: 69 6f 6e 45 78 28 26 73 49 6e 66 6f 29 3b 0a 20  ionEx(&sInfo);. 
15e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f       sqlite3_os_
15f0: 74 79 70 65 20 3d 20 73 49 6e 66 6f 2e 64 77 50  type = sInfo.dwP
1600: 6c 61 74 66 6f 72 6d 49 64 3d 3d 56 45 52 5f 50  latformId==VER_P
1610: 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54  LATFORM_WIN32_NT
1620: 20 3f 20 32 20 3a 20 31 3b 0a 20 20 20 20 7d 0a   ? 2 : 1;.    }.
1630: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1640: 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 3b 0a 20  e3_os_type==2;. 
1650: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
1660: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a  ITE_OS_WINCE */.
1670: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
1680: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f   UTF-8 string to
1690: 20 6d 69 63 72 6f 73 6f 66 74 20 75 6e 69 63 6f   microsoft unico
16a0: 64 65 20 28 55 54 46 2d 31 36 3f 29 2e 20 0a 2a  de (UTF-16?). .*
16b0: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
16c0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
16d0: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
16e0: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a  ed from malloc..
16f0: 2a 2f 0a 73 74 61 74 69 63 20 57 43 48 41 52 20  */.static WCHAR 
1700: 2a 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 63  *utf8ToUnicode(c
1710: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1720: 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 43 68  name){.  int nCh
1730: 61 72 3b 0a 20 20 57 43 48 41 52 20 2a 7a 57 69  ar;.  WCHAR *zWi
1740: 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e  deFilename;..  n
1750: 43 68 61 72 20 3d 20 4d 75 6c 74 69 42 79 74 65  Char = MultiByte
1760: 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55 54  ToWideChar(CP_UT
1770: 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  F8, 0, zFilename
1780: 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a  , -1, NULL, 0);.
1790: 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20    zWideFilename 
17a0: 3d 20 6d 61 6c 6c 6f 63 28 20 6e 43 68 61 72 2a  = malloc( nChar*
17b0: 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c 65  sizeof(zWideFile
17c0: 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66  name[0]) );.  if
17d0: 28 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3d  ( zWideFilename=
17e0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
17f0: 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68 61 72 20   0;.  }.  nChar 
1800: 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  = MultiByteToWid
1810: 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30  eChar(CP_UTF8, 0
1820: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
1830: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20   zWideFilename, 
1840: 6e 43 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43  nChar);.  if( nC
1850: 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 66 72  har==0 ){.    fr
1860: 65 65 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  ee(zWideFilename
1870: 29 3b 0a 20 20 20 20 7a 57 69 64 65 46 69 6c 65  );.    zWideFile
1880: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  name = 0;.  }.  
1890: 72 65 74 75 72 6e 20 7a 57 69 64 65 46 69 6c 65  return zWideFile
18a0: 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  name;.}../*.** C
18b0: 6f 6e 76 65 72 74 20 6d 69 63 72 6f 73 6f 66 74  onvert microsoft
18c0: 20 75 6e 69 63 6f 64 65 20 74 6f 20 55 54 46 2d   unicode to UTF-
18d0: 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  8.  Space to hol
18e0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
18f0: 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f 62 74 61  tring is.** obta
1900: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
1910: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ()..*/.static ch
1920: 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 55 74 66  ar *unicodeToUtf
1930: 38 28 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 7a  8(const WCHAR *z
1940: 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  WideFilename){. 
1950: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68   int nByte;.  ch
1960: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a  ar *zFilename;..
1970: 20 20 6e 42 79 74 65 20 3d 20 57 69 64 65 43 68    nByte = WideCh
1980: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50  arToMultiByte(CP
1990: 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46  _UTF8, 0, zWideF
19a0: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20  ilename, -1, 0, 
19b0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7a 46 69 6c  0, 0, 0);.  zFil
19c0: 65 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20  ename = malloc( 
19d0: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a  nByte );.  if( z
19e0: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
19f0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1a00: 0a 20 20 6e 42 79 74 65 20 3d 20 57 69 64 65 43  .  nByte = WideC
1a10: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43  harToMultiByte(C
1a20: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65  P_UTF8, 0, zWide
1a30: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46  Filename, -1, zF
1a40: 69 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a  ilename, nByte,.
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
1a70: 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65   0);.  if( nByte
1a80: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 66 72 65   == 0 ){.    fre
1a90: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
1aa0: 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b    zFilename = 0;
1ab0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46  .  }.  return zF
1ac0: 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
1ad0: 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 61 6e 73  * Convert an ans
1ae0: 69 20 73 74 72 69 6e 67 20 74 6f 20 6d 69 63 72  i string to micr
1af0: 6f 73 6f 66 74 20 75 6e 69 63 6f 64 65 2c 20 62  osoft unicode, b
1b00: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 63  ased on the.** c
1b10: 75 72 72 65 6e 74 20 63 6f 64 65 70 61 67 65 20  urrent codepage 
1b20: 73 65 74 74 69 6e 67 73 20 66 6f 72 20 66 69 6c  settings for fil
1b30: 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a 20 53  e apis..** .** S
1b40: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
1b50: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
1b60: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
1b70: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a  from malloc..*/.
1b80: 73 74 61 74 69 63 20 57 43 48 41 52 20 2a 6d 62  static WCHAR *mb
1b90: 63 73 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73  csToUnicode(cons
1ba0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1bb0: 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  e){.  int nByte;
1bc0: 0a 20 20 57 43 48 41 52 20 2a 7a 4d 62 63 73 46  .  WCHAR *zMbcsF
1bd0: 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63  ilename;.  int c
1be0: 6f 64 65 70 61 67 65 20 3d 20 41 72 65 46 69 6c  odepage = AreFil
1bf0: 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50  eApisANSI() ? CP
1c00: 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b  _ACP : CP_OEMCP;
1c10: 0a 0a 20 20 6e 42 79 74 65 20 3d 20 4d 75 6c 74  ..  nByte = Mult
1c20: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
1c30: 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69  codepage, 0, zFi
1c40: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c  lename, -1, NULL
1c50: 2c 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52  ,0)*sizeof(WCHAR
1c60: 29 3b 0a 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61  );.  zMbcsFilena
1c70: 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79  me = malloc( nBy
1c80: 74 65 2a 73 69 7a 65 6f 66 28 7a 4d 62 63 73 46  te*sizeof(zMbcsF
1c90: 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20  ilename[0]) );. 
1ca0: 20 69 66 28 20 7a 4d 62 63 73 46 69 6c 65 6e 61   if( zMbcsFilena
1cb0: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
1cc0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79  urn 0;.  }.  nBy
1cd0: 74 65 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f  te = MultiByteTo
1ce0: 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61 67  WideChar(codepag
1cf0: 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  e, 0, zFilename,
1d00: 20 2d 31 2c 20 7a 4d 62 63 73 46 69 6c 65 6e 61   -1, zMbcsFilena
1d10: 6d 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66  me, nByte);.  if
1d20: 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  ( nByte==0 ){.  
1d30: 20 20 66 72 65 65 28 7a 4d 62 63 73 46 69 6c 65    free(zMbcsFile
1d40: 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 4d 62 63 73  name);.    zMbcs
1d50: 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
1d60: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4d 62 63 73  }.  return zMbcs
1d70: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
1d80: 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 69 63 72 6f  ** Convert micro
1d90: 73 6f 66 74 20 75 6e 69 63 6f 64 65 20 74 6f 20  soft unicode to 
1da0: 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72 61 63  multibyte charac
1db0: 74 65 72 20 73 74 72 69 6e 67 2c 20 62 61 73 65  ter string, base
1dc0: 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 75 73 65 72  d on the.** user
1dd0: 27 73 20 41 6e 73 69 20 63 6f 64 65 70 61 67 65  's Ansi codepage
1de0: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
1df0: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
1e00: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
1e10: 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 6d 61  ained from.** ma
1e20: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lloc()..*/.stati
1e30: 63 20 63 68 61 72 20 2a 75 6e 69 63 6f 64 65 54  c char *unicodeT
1e40: 6f 4d 62 63 73 28 63 6f 6e 73 74 20 57 43 48 41  oMbcs(const WCHA
1e50: 52 20 2a 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  R *zWideFilename
1e60: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  ){.  int nByte;.
1e70: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
1e80: 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67  e;.  int codepag
1e90: 65 20 3d 20 41 72 65 46 69 6c 65 41 70 69 73 41  e = AreFileApisA
1ea0: 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a  NSI() ? CP_ACP :
1eb0: 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42   CP_OEMCP;..  nB
1ec0: 79 74 65 20 3d 20 57 69 64 65 43 68 61 72 54 6f  yte = WideCharTo
1ed0: 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61  MultiByte(codepa
1ee0: 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65  ge, 0, zWideFile
1ef0: 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20  name, -1, 0, 0, 
1f00: 30 2c 20 30 29 3b 0a 20 20 7a 46 69 6c 65 6e 61  0, 0);.  zFilena
1f10: 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79  me = malloc( nBy
1f20: 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c  te );.  if( zFil
1f30: 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ename==0 ){.    
1f40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1f50: 6e 42 79 74 65 20 3d 20 57 69 64 65 43 68 61 72  nByte = WideChar
1f60: 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65  ToMultiByte(code
1f70: 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69  page, 0, zWideFi
1f80: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c  lename, -1, zFil
1f90: 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20  ename, nByte,.  
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
1fc0: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d  );.  if( nByte =
1fd0: 3d 20 30 20 29 7b 0a 20 20 20 20 66 72 65 65 28  = 0 ){.    free(
1fe0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
1ff0: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  zFilename = 0;. 
2000: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c   }.  return zFil
2010: 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
2020: 43 6f 6e 76 65 72 74 20 6d 75 6c 74 69 62 79 74  Convert multibyt
2030: 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69  e character stri
2040: 6e 67 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70  ng to UTF-8.  Sp
2050: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ace to hold the.
2060: 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  ** returned stri
2070: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
2080: 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  rom malloc()..*/
2090: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77  .char *sqlite3_w
20a0: 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
20b0: 38 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  8(const char *zF
20c0: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72  ilename){.  char
20d0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b   *zFilenameUtf8;
20e0: 0a 20 20 57 43 48 41 52 20 2a 7a 54 6d 70 57 69  .  WCHAR *zTmpWi
20f0: 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20  de;..  zTmpWide 
2100: 3d 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28  = mbcsToUnicode(
2110: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
2120: 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b  ( zTmpWide==0 ){
2130: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2140: 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55 74   }.  zFilenameUt
2150: 66 38 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74  f8 = unicodeToUt
2160: 66 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  f8(zTmpWide);.  
2170: 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a  free(zTmpWide);.
2180: 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61    return zFilena
2190: 6d 65 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  meUtf8;.}../*.**
21a0: 20 43 6f 6e 76 65 72 74 20 55 54 46 2d 38 20 74   Convert UTF-8 t
21b0: 6f 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72  o multibyte char
21c0: 61 63 74 65 72 20 73 74 72 69 6e 67 2e 20 20 53  acter string.  S
21d0: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
21e0: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74   .** returned st
21f0: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
2200: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a   from malloc()..
2210: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
2220: 75 74 66 38 54 6f 4d 62 63 73 28 63 6f 6e 73 74  utf8ToMbcs(const
2230: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
2240: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  ){.  char *zFile
2250: 6e 61 6d 65 4d 62 63 73 3b 0a 20 20 57 43 48 41  nameMbcs;.  WCHA
2260: 52 20 2a 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20  R *zTmpWide;..  
2270: 7a 54 6d 70 57 69 64 65 20 3d 20 75 74 66 38 54  zTmpWide = utf8T
2280: 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
2290: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57  me);.  if( zTmpW
22a0: 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ide==0 ){.    re
22b0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46  turn 0;.  }.  zF
22c0: 69 6c 65 6e 61 6d 65 4d 62 63 73 20 3d 20 75 6e  ilenameMbcs = un
22d0: 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54 6d 70  icodeToMbcs(zTmp
22e0: 57 69 64 65 29 3b 0a 20 20 66 72 65 65 28 7a 54  Wide);.  free(zT
22f0: 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72  mpWide);.  retur
2300: 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b  n zFilenameMbcs;
2310: 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .}..#if SQLITE_O
2320: 53 5f 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a  S_WINCE./*******
2330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2370: 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 65 63 74 69  **.** This secti
2380: 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  on contains code
2390: 20 66 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e   for WinCE only.
23a0: 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77  .*/./*.** Window
23b0: 73 43 45 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  sCE does not hav
23c0: 65 20 61 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20  e a localtime() 
23d0: 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 63 72  function.  So cr
23e0: 65 61 74 65 20 61 0a 2a 2a 20 73 75 62 73 74 69  eate a.** substi
23f0: 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  tute..*/.#includ
2400: 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 72 75 63  e <time.h>.struc
2410: 74 20 74 6d 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f  t tm *__cdecl lo
2420: 63 61 6c 74 69 6d 65 28 63 6f 6e 73 74 20 74 69  caltime(const ti
2430: 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20 20 73 74 61  me_t *t).{.  sta
2440: 74 69 63 20 73 74 72 75 63 74 20 74 6d 20 79 3b  tic struct tm y;
2450: 0a 20 20 46 49 4c 45 54 49 4d 45 20 75 54 6d 2c  .  FILETIME uTm,
2460: 20 6c 54 6d 3b 0a 20 20 53 59 53 54 45 4d 54 49   lTm;.  SYSTEMTI
2470: 4d 45 20 70 54 6d 3b 0a 20 20 73 71 6c 69 74 65  ME pTm;.  sqlite
2480: 33 5f 69 6e 74 36 34 20 74 36 34 3b 0a 20 20 74  3_int64 t64;.  t
2490: 36 34 20 3d 20 2a 74 3b 0a 20 20 74 36 34 20 3d  64 = *t;.  t64 =
24a0: 20 28 74 36 34 20 2b 20 31 31 36 34 34 34 37 33   (t64 + 11644473
24b0: 36 30 30 29 2a 31 30 30 30 30 30 30 30 3b 0a 20  600)*10000000;. 
24c0: 20 75 54 6d 2e 64 77 4c 6f 77 44 61 74 65 54 69   uTm.dwLowDateTi
24d0: 6d 65 20 3d 20 28 44 57 4f 52 44 29 28 74 36 34  me = (DWORD)(t64
24e0: 20 26 20 30 78 46 46 46 46 46 46 46 46 29 3b 0a   & 0xFFFFFFFF);.
24f0: 20 20 75 54 6d 2e 64 77 48 69 67 68 44 61 74 65    uTm.dwHighDate
2500: 54 69 6d 65 3d 20 28 44 57 4f 52 44 29 28 74 36  Time= (DWORD)(t6
2510: 34 20 3e 3e 20 33 32 29 3b 0a 20 20 46 69 6c 65  4 >> 32);.  File
2520: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
2530: 69 6d 65 28 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a  ime(&uTm,&lTm);.
2540: 20 20 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74    FileTimeToSyst
2550: 65 6d 54 69 6d 65 28 26 6c 54 6d 2c 26 70 54 6d  emTime(&lTm,&pTm
2560: 29 3b 0a 20 20 79 2e 74 6d 5f 79 65 61 72 20 3d  );.  y.tm_year =
2570: 20 70 54 6d 2e 77 59 65 61 72 20 2d 20 31 39 30   pTm.wYear - 190
2580: 30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20  0;.  y.tm_mon = 
2590: 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a  pTm.wMonth - 1;.
25a0: 20 20 79 2e 74 6d 5f 77 64 61 79 20 3d 20 70 54    y.tm_wday = pT
25b0: 6d 2e 77 44 61 79 4f 66 57 65 65 6b 3b 0a 20 20  m.wDayOfWeek;.  
25c0: 79 2e 74 6d 5f 6d 64 61 79 20 3d 20 70 54 6d 2e  y.tm_mday = pTm.
25d0: 77 44 61 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75  wDay;.  y.tm_hou
25e0: 72 20 3d 20 70 54 6d 2e 77 48 6f 75 72 3b 0a 20  r = pTm.wHour;. 
25f0: 20 79 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e   y.tm_min = pTm.
2600: 77 4d 69 6e 75 74 65 3b 0a 20 20 79 2e 74 6d 5f  wMinute;.  y.tm_
2610: 73 65 63 20 3d 20 70 54 6d 2e 77 53 65 63 6f 6e  sec = pTm.wSecon
2620: 64 3b 0a 20 20 72 65 74 75 72 6e 20 26 79 3b 0a  d;.  return &y;.
2630: 7d 0a 0a 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20  }../* This will 
2640: 6e 65 76 65 72 20 62 65 20 63 61 6c 6c 65 64 2c  never be called,
2650: 20 62 75 74 20 64 65 66 69 6e 65 64 20 74 6f 20   but defined to 
2660: 6d 61 6b 65 20 74 68 65 20 63 6f 64 65 20 63 6f  make the code co
2670: 6d 70 69 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  mpile */.#define
2680: 20 47 65 74 54 65 6d 70 50 61 74 68 41 28 61 2c   GetTempPathA(a,
2690: 62 29 0a 0a 23 64 65 66 69 6e 65 20 4c 6f 63 6b  b)..#define Lock
26a0: 46 69 6c 65 28 61 2c 62 2c 63 2c 64 2c 65 29 20  File(a,b,c,d,e) 
26b0: 20 20 20 20 20 20 77 69 6e 63 65 4c 6f 63 6b 46        winceLockF
26c0: 69 6c 65 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c  ile(&a, b, c, d,
26d0: 20 65 29 0a 23 64 65 66 69 6e 65 20 55 6e 6c 6f   e).#define Unlo
26e0: 63 6b 46 69 6c 65 28 61 2c 62 2c 63 2c 64 2c 65  ckFile(a,b,c,d,e
26f0: 29 20 20 20 20 20 77 69 6e 63 65 55 6e 6c 6f 63  )     winceUnloc
2700: 6b 46 69 6c 65 28 26 61 2c 20 62 2c 20 63 2c 20  kFile(&a, b, c, 
2710: 64 2c 20 65 29 0a 23 64 65 66 69 6e 65 20 4c 6f  d, e).#define Lo
2720: 63 6b 46 69 6c 65 45 78 28 61 2c 62 2c 63 2c 64  ckFileEx(a,b,c,d
2730: 2c 65 2c 66 29 20 20 20 77 69 6e 63 65 4c 6f 63  ,e,f)   winceLoc
2740: 6b 46 69 6c 65 45 78 28 26 61 2c 20 62 2c 20 63  kFileEx(&a, b, c
2750: 2c 20 64 2c 20 65 2c 20 66 29 0a 0a 23 64 65 66  , d, e, f)..#def
2760: 69 6e 65 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49  ine HANDLE_TO_WI
2770: 4e 46 49 4c 45 28 61 29 20 28 77 69 6e 46 69 6c  NFILE(a) (winFil
2780: 65 2a 29 26 28 28 63 68 61 72 2a 29 61 29 5b 2d  e*)&((char*)a)[-
2790: 28 69 6e 74 29 6f 66 66 73 65 74 6f 66 28 77 69  (int)offsetof(wi
27a0: 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a  nFile,h)]../*.**
27b0: 20 41 63 71 75 69 72 65 20 61 20 6c 6f 63 6b 20   Acquire a lock 
27c0: 6f 6e 20 74 68 65 20 68 61 6e 64 6c 65 20 68 0a  on the handle h.
27d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
27e0: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
27f0: 28 48 41 4e 44 4c 45 20 68 29 7b 0a 20 20 20 44  (HANDLE h){.   D
2800: 57 4f 52 44 20 64 77 45 72 72 3b 0a 20 20 20 64  WORD dwErr;.   d
2810: 6f 20 7b 0a 20 20 20 20 20 64 77 45 72 72 20 3d  o {.     dwErr =
2820: 20 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62   WaitForSingleOb
2830: 6a 65 63 74 28 68 2c 20 49 4e 46 49 4e 49 54 45  ject(h, INFINITE
2840: 29 3b 0a 20 20 20 7d 20 77 68 69 6c 65 20 28 64  );.   } while (d
2850: 77 45 72 72 20 21 3d 20 57 41 49 54 5f 4f 42 4a  wErr != WAIT_OBJ
2860: 45 43 54 5f 30 20 26 26 20 64 77 45 72 72 20 21  ECT_0 && dwErr !
2870: 3d 20 57 41 49 54 5f 41 42 41 4e 44 4f 4e 45 44  = WAIT_ABANDONED
2880: 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  );.}./*.** Relea
2890: 73 65 20 61 20 6c 6f 63 6b 20 61 63 71 75 69 72  se a lock acquir
28a0: 65 64 20 62 79 20 77 69 6e 63 65 4d 75 74 65 78  ed by winceMutex
28b0: 41 63 71 75 69 72 65 28 29 0a 2a 2f 0a 23 64 65  Acquire().*/.#de
28c0: 66 69 6e 65 20 77 69 6e 63 65 4d 75 74 65 78 52  fine winceMutexR
28d0: 65 6c 65 61 73 65 28 68 29 20 52 65 6c 65 61 73  elease(h) Releas
28e0: 65 4d 75 74 65 78 28 68 29 0a 0a 2f 2a 0a 2a 2a  eMutex(h)../*.**
28f0: 20 43 72 65 61 74 65 20 74 68 65 20 6d 75 74 65   Create the mute
2900: 78 20 61 6e 64 20 73 68 61 72 65 64 20 6d 65 6d  x and shared mem
2910: 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ory used for loc
2920: 6b 69 6e 67 20 69 6e 20 74 68 65 20 66 69 6c 65  king in the file
2930: 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 70  .** descriptor p
2940: 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42  File.*/.static B
2950: 4f 4f 4c 20 77 69 6e 63 65 43 72 65 61 74 65 4c  OOL winceCreateL
2960: 6f 63 6b 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ock(const char *
2970: 7a 46 69 6c 65 6e 61 6d 65 2c 20 77 69 6e 46 69  zFilename, winFi
2980: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 57 43  le *pFile){.  WC
2990: 48 41 52 20 2a 7a 54 6f 6b 3b 0a 20 20 57 43 48  HAR *zTok;.  WCH
29a0: 41 52 20 2a 7a 4e 61 6d 65 20 3d 20 75 74 66 38  AR *zName = utf8
29b0: 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
29c0: 61 6d 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e  ame);.  BOOL bIn
29d0: 69 74 20 3d 20 54 52 55 45 3b 0a 0a 20 20 2f 2a  it = TRUE;..  /*
29e0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
29f0: 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a  local lockdata *
2a00: 2f 0a 20 20 5a 65 72 6f 4d 65 6d 6f 72 79 28 26  /.  ZeroMemory(&
2a10: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2c 20 73 69  pFile->local, si
2a20: 7a 65 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61  zeof(pFile->loca
2a30: 6c 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61  l));..  /* Repla
2a40: 63 65 20 74 68 65 20 62 61 63 6b 73 6c 61 73 68  ce the backslash
2a50: 65 73 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  es from the file
2a60: 6e 61 6d 65 20 61 6e 64 20 6c 6f 77 65 72 63 61  name and lowerca
2a70: 73 65 20 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65  se it.  ** to de
2a80: 72 69 76 65 20 61 20 6d 75 74 65 78 20 6e 61 6d  rive a mutex nam
2a90: 65 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 43  e. */.  zTok = C
2aa0: 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29  harLowerW(zName)
2ab0: 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b  ;.  for (;*zTok;
2ac0: 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20  zTok++){.    if 
2ad0: 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20  (*zTok == '\\') 
2ae0: 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d  *zTok = '_';.  }
2af0: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70  ..  /* Create/op
2b00: 65 6e 20 74 68 65 20 6e 61 6d 65 64 20 6d 75 74  en the named mut
2b10: 65 78 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68  ex */.  pFile->h
2b20: 4d 75 74 65 78 20 3d 20 43 72 65 61 74 65 4d 75  Mutex = CreateMu
2b30: 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45  texW(NULL, FALSE
2b40: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28  , zName);.  if (
2b50: 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b  !pFile->hMutex){
2b60: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
2b70: 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45  Errno = GetLastE
2b80: 72 72 6f 72 28 29 3b 0a 20 20 20 20 66 72 65 65  rror();.    free
2b90: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  (zName);.    ret
2ba0: 75 72 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a  urn FALSE;.  }..
2bb0: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65    /* Acquire the
2bc0: 20 6d 75 74 65 78 20 62 65 66 6f 72 65 20 63 6f   mutex before co
2bd0: 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77 69  ntinuing */.  wi
2be0: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
2bf0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
2c00: 20 20 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74 68    .  /* Since th
2c10: 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64  e names of named
2c20: 20 6d 75 74 65 78 65 73 2c 20 73 65 6d 61 70 68   mutexes, semaph
2c30: 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61 70 70 69  ores, file mappi
2c40: 6e 67 73 20 65 74 63 20 61 72 65 20 0a 20 20 2a  ngs etc are .  *
2c50: 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69 76 65  * case-sensitive
2c60: 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65  , take advantage
2c70: 20 6f 66 20 74 68 61 74 20 62 79 20 75 70 70 65   of that by uppe
2c80: 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65  rcasing the mute
2c90: 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20  x name.  ** and 
2ca0: 75 73 69 6e 67 20 74 68 61 74 20 61 73 20 74 68  using that as th
2cb0: 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d 61 70  e shared filemap
2cc0: 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a  ping name..  */.
2cd0: 20 20 43 68 61 72 55 70 70 65 72 57 28 7a 4e 61    CharUpperW(zNa
2ce0: 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53  me);.  pFile->hS
2cf0: 68 61 72 65 64 20 3d 20 43 72 65 61 74 65 46 69  hared = CreateFi
2d00: 6c 65 4d 61 70 70 69 6e 67 57 28 49 4e 56 41 4c  leMappingW(INVAL
2d10: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 2c  ID_HANDLE_VALUE,
2d20: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
2d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
2d50: 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c  GE_READWRITE, 0,
2d60: 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63   sizeof(winceLoc
2d70: 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  k),.            
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d90: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
2da0: 29 3b 20 20 0a 0a 20 20 2f 2a 20 53 65 74 20 61  );  ..  /* Set a
2db0: 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63   flag that indic
2dc0: 61 74 65 73 20 77 65 27 72 65 20 74 68 65 20 66  ates we're the f
2dd0: 69 72 73 74 20 74 6f 20 63 72 65 61 74 65 20 74  irst to create t
2de0: 68 65 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74 20  he memory so it 
2df0: 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a 65  .  ** must be ze
2e00: 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a  ro-initialized *
2e10: 2f 0a 20 20 69 66 20 28 47 65 74 4c 61 73 74 45  /.  if (GetLastE
2e20: 72 72 6f 72 28 29 20 3d 3d 20 45 52 52 4f 52 5f  rror() == ERROR_
2e30: 41 4c 52 45 41 44 59 5f 45 58 49 53 54 53 29 7b  ALREADY_EXISTS){
2e40: 0a 20 20 20 20 62 49 6e 69 74 20 3d 20 46 41 4c  .    bInit = FAL
2e50: 53 45 3b 0a 20 20 7d 0a 0a 20 20 66 72 65 65 28  SE;.  }..  free(
2e60: 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66  zName);..  /* If
2e70: 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e   we succeeded in
2e80: 20 6d 61 6b 69 6e 67 20 74 68 65 20 73 68 61 72   making the shar
2e90: 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65  ed memory handle
2ea0: 2c 20 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69  , map it. */.  i
2eb0: 66 20 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  f (pFile->hShare
2ec0: 64 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73  d){.    pFile->s
2ed0: 68 61 72 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f  hared = (winceLo
2ee0: 63 6b 2a 29 4d 61 70 56 69 65 77 4f 66 46 69 6c  ck*)MapViewOfFil
2ef0: 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  e(pFile->hShared
2f00: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
2f10: 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49  FILE_MAP_READ|FI
2f20: 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c  LE_MAP_WRITE, 0,
2f30: 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65   0, sizeof(wince
2f40: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49  Lock));.    /* I
2f50: 66 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65 64  f mapping failed
2f60: 2c 20 63 6c 6f 73 65 20 74 68 65 20 73 68 61 72  , close the shar
2f70: 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65  ed memory handle
2f80: 20 61 6e 64 20 65 72 61 73 65 20 69 74 20 2a 2f   and erase it */
2f90: 0a 20 20 20 20 69 66 20 28 21 70 46 69 6c 65 2d  .    if (!pFile-
2fa0: 3e 73 68 61 72 65 64 29 7b 0a 20 20 20 20 20 20  >shared){.      
2fb0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
2fc0: 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28   = GetLastError(
2fd0: 29 3b 0a 20 20 20 20 20 20 43 6c 6f 73 65 48 61  );.      CloseHa
2fe0: 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61  ndle(pFile->hSha
2ff0: 72 65 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  red);.      pFil
3000: 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 4e 55 4c  e->hShared = NUL
3010: 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  L;.    }.  }..  
3020: 2f 2a 20 49 66 20 73 68 61 72 65 64 20 6d 65 6d  /* If shared mem
3030: 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ory could not be
3040: 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63   created, then c
3050: 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20 61  lose the mutex a
3060: 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20 69 66 20  nd fail */.  if 
3070: 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20  (pFile->hShared 
3080: 3d 3d 20 4e 55 4c 4c 29 7b 0a 20 20 20 20 77 69  == NULL){.    wi
3090: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
30a0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
30b0: 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28      CloseHandle(
30c0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
30d0: 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65      pFile->hMute
30e0: 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65  x = NULL;.    re
30f0: 74 75 72 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a  turn FALSE;.  }.
3100: 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69    .  /* Initiali
3110: 7a 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ze the shared me
3120: 6d 6f 72 79 20 69 66 20 77 65 27 72 65 20 73 75  mory if we're su
3130: 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a 20 20 69  pposed to */.  i
3140: 66 20 28 62 49 6e 69 74 29 20 7b 0a 20 20 20 20  f (bInit) {.    
3150: 5a 65 72 6f 4d 65 6d 6f 72 79 28 70 46 69 6c 65  ZeroMemory(pFile
3160: 2d 3e 73 68 61 72 65 64 2c 20 73 69 7a 65 6f 66  ->shared, sizeof
3170: 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20  (winceLock));.  
3180: 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52  }..  winceMutexR
3190: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
31a0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
31b0: 54 52 55 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  TRUE;.}../*.** D
31c0: 65 73 74 72 6f 79 20 74 68 65 20 70 61 72 74 20  estroy the part 
31d0: 6f 66 20 77 69 6e 46 69 6c 65 20 74 68 61 74 20  of winFile that 
31e0: 64 65 61 6c 73 20 77 69 74 68 20 77 69 6e 63 65  deals with wince
31f0: 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63   locks.*/.static
3200: 20 76 6f 69 64 20 77 69 6e 63 65 44 65 73 74 72   void winceDestr
3210: 6f 79 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a  oyLock(winFile *
3220: 70 46 69 6c 65 29 7b 0a 20 20 69 66 20 28 70 46  pFile){.  if (pF
3230: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20  ile->hMutex){.  
3240: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65    /* Acquire the
3250: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69   mutex */.    wi
3260: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
3270: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
3280: 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
3290: 6f 77 69 6e 67 20 62 6c 6f 63 6b 73 20 73 68 6f  owing blocks sho
32a0: 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 61 73 73  uld probably ass
32b0: 65 72 74 20 69 6e 20 64 65 62 75 67 20 6d 6f 64  ert in debug mod
32c0: 65 2c 20 62 75 74 20 74 68 65 79 0a 20 20 20 20  e, but they.    
32d0: 20 20 20 61 72 65 20 74 6f 20 63 6c 65 61 6e 75     are to cleanu
32e0: 70 20 69 6e 20 63 61 73 65 20 61 6e 79 20 6c 6f  p in case any lo
32f0: 63 6b 73 20 72 65 6d 61 69 6e 65 64 20 6f 70 65  cks remained ope
3300: 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69  n */.    if (pFi
3310: 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
3320: 72 73 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  rs){.      pFile
3330: 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65  ->shared->nReade
3340: 72 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  rs --;.    }.   
3350: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
3360: 6c 2e 62 52 65 73 65 72 76 65 64 29 7b 0a 20 20  l.bReserved){.  
3370: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
3380: 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46  d->bReserved = F
3390: 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ALSE;.    }.    
33a0: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
33b0: 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20  .bPending){.    
33c0: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
33d0: 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53  >bPending = FALS
33e0: 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  E;.    }.    if 
33f0: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45  (pFile->local.bE
3400: 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20  xclusive){.     
3410: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
3420: 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c  bExclusive = FAL
3430: 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  SE;.    }..    /
3440: 2a 20 44 65 2d 72 65 66 65 72 65 6e 63 65 20 61  * De-reference a
3450: 6e 64 20 63 6c 6f 73 65 20 6f 75 72 20 63 6f 70  nd close our cop
3460: 79 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  y of the shared 
3470: 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 2a 2f  memory handle */
3480: 0a 20 20 20 20 55 6e 6d 61 70 56 69 65 77 4f 66  .    UnmapViewOf
3490: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 73 68 61 72  File(pFile->shar
34a0: 65 64 29 3b 0a 20 20 20 20 43 6c 6f 73 65 48 61  ed);.    CloseHa
34b0: 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61  ndle(pFile->hSha
34c0: 72 65 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  red);..    /* Do
34d0: 6e 65 20 77 69 74 68 20 74 68 65 20 6d 75 74 65  ne with the mute
34e0: 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75  x */.    winceMu
34f0: 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
3500: 2d 3e 68 4d 75 74 65 78 29 3b 20 20 20 20 0a 20  ->hMutex);    . 
3510: 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70     CloseHandle(p
3520: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
3530: 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78     pFile->hMutex
3540: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a   = NULL;.  }.}..
3550: 2f 2a 20 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d  /* .** An implem
3560: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
3570: 4c 6f 63 6b 46 69 6c 65 28 29 20 41 50 49 20 6f  LockFile() API o
3580: 66 20 77 69 6e 64 6f 77 73 20 66 6f 72 20 77 69  f windows for wi
3590: 6e 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f  nce.*/.static BO
35a0: 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65  OL winceLockFile
35b0: 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46 69  (.  HANDLE *phFi
35c0: 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69  le,.  DWORD dwFi
35d0: 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44  leOffsetLow,.  D
35e0: 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
35f0: 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e  tHigh,.  DWORD n
3600: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
3610: 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  ockLow,.  DWORD 
3620: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
3630: 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69  LockHigh.){.  wi
3640: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48  nFile *pFile = H
3650: 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45  ANDLE_TO_WINFILE
3660: 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c  (phFile);.  BOOL
3670: 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45   bReturn = FALSE
3680: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
3690: 4d 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73  METER(dwFileOffs
36a0: 65 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45  etHigh);.  UNUSE
36b0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d  D_PARAMETER(nNum
36c0: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
36d0: 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70  High);..  if (!p
36e0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65  File->hMutex) re
36f0: 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e  turn TRUE;.  win
3700: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
3710: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a  File->hMutex);..
3720: 20 20 2f 2a 20 57 61 6e 74 69 6e 67 20 61 6e 20    /* Wanting an 
3730: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20  exclusive lock? 
3740: 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f  */.  if (dwFileO
3750: 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
3760: 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 0a  RD)SHARED_FIRST.
3770: 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65         && nNumbe
3780: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
3790: 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
37a0: 45 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20 69 66  ED_SIZE){.    if
37b0: 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d   (pFile->shared-
37c0: 3e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 20 26  >nReaders == 0 &
37d0: 26 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d  & pFile->shared-
37e0: 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30  >bExclusive == 0
37f0: 29 7b 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ){.       pFile-
3800: 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
3810: 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ive = TRUE;.    
3820: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
3830: 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55  bExclusive = TRU
3840: 45 3b 0a 20 20 20 20 20 20 20 62 52 65 74 75 72  E;.       bRetur
3850: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
3860: 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61    }..  /* Want a
3870: 20 72 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f   read-only lock?
3880: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64   */.  else if (d
3890: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
38a0: 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
38b0: 46 49 52 53 54 20 26 26 0a 20 20 20 20 20 20 20  FIRST &&.       
38c0: 20 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74      nNumberOfByt
38d0: 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  esToLockLow == 1
38e0: 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
38f0: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
3900: 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20  sive == 0){.    
3910: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e    pFile->local.n
3920: 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20  Readers ++;.    
3930: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
3940: 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 31  al.nReaders == 1
3950: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
3960: 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65  ->shared->nReade
3970: 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  rs ++;.      }. 
3980: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
3990: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
39a0: 20 20 2f 2a 20 57 61 6e 74 20 61 20 70 65 6e 64    /* Want a pend
39b0: 69 6e 67 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65  ing lock? */.  e
39c0: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
39d0: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
39e0: 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 26  D)PENDING_BYTE &
39f0: 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
3a00: 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  ToLockLow == 1){
3a10: 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70 65  .    /* If no pe
3a20: 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62  nding lock has b
3a30: 65 65 6e 20 61 63 71 75 69 72 65 64 2c 20 74 68  een acquired, th
3a40: 65 6e 20 61 63 71 75 69 72 65 20 69 74 20 2a 2f  en acquire it */
3a50: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
3a60: 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
3a70: 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70   == 0) {.      p
3a80: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
3a90: 65 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20  ending = TRUE;. 
3aa0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
3ab0: 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55  l.bPending = TRU
3ac0: 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
3ad0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
3ae0: 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20   }..  /* Want a 
3af0: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 3f 20 2a  reserved lock? *
3b00: 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
3b10: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
3b20: 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f  (DWORD)RESERVED_
3b30: 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f  BYTE && nNumberO
3b40: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
3b50: 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
3b60: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
3b70: 65 73 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a  eserved == 0) {.
3b80: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
3b90: 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
3ba0: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69   TRUE;.      pFi
3bb0: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
3bc0: 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ved = TRUE;.    
3bd0: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
3be0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77  ;.    }.  }..  w
3bf0: 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
3c00: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
3c10: 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74 75 72  .  return bRetur
3c20: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  n;.}../*.** An i
3c30: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
3c40: 20 74 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20   the UnlockFile 
3c50: 41 50 49 20 6f 66 20 77 69 6e 64 6f 77 73 20 66  API of windows f
3c60: 6f 72 20 77 69 6e 63 65 0a 2a 2f 0a 73 74 61 74  or wince.*/.stat
3c70: 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c  ic BOOL winceUnl
3c80: 6f 63 6b 46 69 6c 65 28 0a 20 20 48 41 4e 44 4c  ockFile(.  HANDL
3c90: 45 20 2a 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f  E *phFile,.  DWO
3ca0: 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  RD dwFileOffsetL
3cb0: 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69  ow,.  DWORD dwFi
3cc0: 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20  leOffsetHigh,.  
3cd0: 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42  DWORD nNumberOfB
3ce0: 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c  ytesToUnlockLow,
3cf0: 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
3d00: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48  OfBytesToUnlockH
3d10: 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65  igh.){.  winFile
3d20: 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45   *pFile = HANDLE
3d30: 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69  _TO_WINFILE(phFi
3d40: 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74  le);.  BOOL bRet
3d50: 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20  urn = FALSE;..  
3d60: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
3d70: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67  (dwFileOffsetHig
3d80: 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  h);.  UNUSED_PAR
3d90: 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66  AMETER(nNumberOf
3da0: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67  BytesToUnlockHig
3db0: 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c  h);..  if (!pFil
3dc0: 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72  e->hMutex) retur
3dd0: 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d  n TRUE;.  winceM
3de0: 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c  utexAcquire(pFil
3df0: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f  e->hMutex);..  /
3e00: 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65  * Releasing a re
3e10: 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20 61 6e 20  ader lock or an 
3e20: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a  exclusive lock *
3e30: 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66  /.  if (dwFileOf
3e40: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
3e50: 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 29 7b  D)SHARED_FIRST){
3e60: 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 68  .    /* Did we h
3e70: 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ave an exclusive
3e80: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 69 66   lock? */.    if
3e90: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
3ea0: 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20  Exclusive){.    
3eb0: 20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72    assert(nNumber
3ec0: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
3ed0: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
3ee0: 52 45 44 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  RED_SIZE);.     
3ef0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45   pFile->local.bE
3f00: 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45  xclusive = FALSE
3f10: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  ;.      pFile->s
3f20: 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
3f30: 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  e = FALSE;.     
3f40: 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
3f50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
3f60: 69 64 20 77 65 20 6a 75 73 74 20 68 61 76 65 20  id we just have 
3f70: 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 3f 20 2a  a reader lock? *
3f80: 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 70  /.    else if (p
3f90: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
3fa0: 64 65 72 73 29 7b 0a 20 20 20 20 20 20 61 73 73  ders){.      ass
3fb0: 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ert(nNumberOfByt
3fc0: 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d  esToUnlockLow ==
3fd0: 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53   (DWORD)SHARED_S
3fe0: 49 5a 45 20 7c 7c 20 6e 4e 75 6d 62 65 72 4f 66  IZE || nNumberOf
3ff0: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
4000: 20 3d 3d 20 31 29 3b 0a 20 20 20 20 20 20 70 46   == 1);.      pF
4010: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
4020: 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 69 66  ers --;.      if
4030: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
4040: 52 65 61 64 65 72 73 20 3d 3d 20 30 29 0a 20 20  Readers == 0).  
4050: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 46      {.        pF
4060: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65  ile->shared->nRe
4070: 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20  aders --;.      
4080: 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  }.      bReturn 
4090: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
40a0: 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e  }..  /* Releasin
40b0: 67 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  g a pending lock
40c0: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64   */.  else if (d
40d0: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
40e0: 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47  = (DWORD)PENDING
40f0: 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72  _BYTE && nNumber
4100: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
4110: 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66  ow == 1){.    if
4120: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
4130: 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20  Pending){.      
4140: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
4150: 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20  nding = FALSE;. 
4160: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
4170: 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46  ed->bPending = F
4180: 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74  ALSE;.      bRet
4190: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
41a0: 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 6c 65 61  }.  }.  /* Relea
41b0: 73 69 6e 67 20 61 20 72 65 73 65 72 76 65 64 20  sing a reserved 
41c0: 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69  lock */.  else i
41d0: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
41e0: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53  ow == (DWORD)RES
41f0: 45 52 56 45 44 5f 42 59 54 45 20 26 26 20 6e 4e  ERVED_BYTE && nN
4200: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
4210: 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20  lockLow == 1){. 
4220: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
4230: 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 20 7b  cal.bReserved) {
4240: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
4250: 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20  cal.bReserved = 
4260: 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69  FALSE;.      pFi
4270: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
4280: 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  erved = FALSE;. 
4290: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
42a0: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
42b0: 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
42c0: 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
42d0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65  x);.  return bRe
42e0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  turn;.}../*.** A
42f0: 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
4300: 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65   of the LockFile
4310: 45 78 28 29 20 41 50 49 20 6f 66 20 77 69 6e 64  Ex() API of wind
4320: 6f 77 73 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2f  ows for wince.*/
4330: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
4340: 63 65 4c 6f 63 6b 46 69 6c 65 45 78 28 0a 20 20  ceLockFileEx(.  
4350: 48 41 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a  HANDLE *phFile,.
4360: 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 2c    DWORD dwFlags,
4370: 0a 20 20 44 57 4f 52 44 20 64 77 52 65 73 65 72  .  DWORD dwReser
4380: 76 65 64 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75  ved,.  DWORD nNu
4390: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
43a0: 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  kLow,.  DWORD nN
43b0: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
43c0: 63 6b 48 69 67 68 2c 0a 20 20 4c 50 4f 56 45 52  ckHigh,.  LPOVER
43d0: 4c 41 50 50 45 44 20 6c 70 4f 76 65 72 6c 61 70  LAPPED lpOverlap
43e0: 70 65 64 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ped.){.  UNUSED_
43f0: 50 41 52 41 4d 45 54 45 52 28 64 77 52 65 73 65  PARAMETER(dwRese
4400: 72 76 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  rved);.  UNUSED_
4410: 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65  PARAMETER(nNumbe
4420: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69  rOfBytesToLockHi
4430: 67 68 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  gh);..  /* If th
4440: 65 20 63 61 6c 6c 65 72 20 77 61 6e 74 73 20 61  e caller wants a
4450: 20 73 68 61 72 65 64 20 72 65 61 64 20 6c 6f 63   shared read loc
4460: 6b 2c 20 66 6f 72 77 61 72 64 20 74 68 69 73 20  k, forward this 
4470: 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 77 69 6e  call.  ** to win
4480: 63 65 4c 6f 63 6b 46 69 6c 65 20 2a 2f 0a 20 20  ceLockFile */.  
4490: 69 66 20 28 6c 70 4f 76 65 72 6c 61 70 70 65 64  if (lpOverlapped
44a0: 2d 3e 4f 66 66 73 65 74 20 3d 3d 20 28 44 57 4f  ->Offset == (DWO
44b0: 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 20  RD)SHARED_FIRST 
44c0: 26 26 0a 20 20 20 20 20 20 64 77 46 6c 61 67 73  &&.      dwFlags
44d0: 20 3d 3d 20 31 20 26 26 0a 20 20 20 20 20 20 6e   == 1 &&.      n
44e0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
44f0: 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  ockLow == (DWORD
4500: 29 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20  )SHARED_SIZE){. 
4510: 20 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 4c     return winceL
4520: 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20  ockFile(phFile, 
4530: 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
4540: 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   1, 0);.  }.  re
4550: 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 2f 2a  turn FALSE;.}./*
4560: 0a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73  .** End of the s
4570: 70 65 63 69 61 6c 20 63 6f 64 65 20 66 6f 72 20  pecial code for 
4580: 77 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  wince.**********
4590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
45a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
45b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
45c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
45d0: 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ***/.#endif /* S
45e0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a  QLITE_OS_WINCE *
45f0: 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
4600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4640: 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 72  *.** The next gr
4650: 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  oup of routines 
4660: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f  implement the I/
4670: 4f 20 6d 65 74 68 6f 64 73 20 73 70 65 63 69 66  O methods specif
4680: 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 71  ied.** by the sq
4690: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
46a0: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a   object..*******
46b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
46c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
46d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
46e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
46f0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
4700: 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a  Close a file..**
4710: 0a 2a 2a 20 49 74 20 69 73 20 72 65 70 6f 72 74  .** It is report
4720: 65 64 20 74 68 61 74 20 61 6e 20 61 74 74 65 6d  ed that an attem
4730: 70 74 20 74 6f 20 63 6c 6f 73 65 20 61 20 68 61  pt to close a ha
4740: 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65 74  ndle might somet
4750: 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54  imes.** fail.  T
4760: 68 69 73 20 69 73 20 61 20 76 65 72 79 20 75 6e  his is a very un
4770: 72 65 61 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c  reasonable resul
4780: 74 2c 20 62 75 74 20 77 69 6e 64 6f 77 73 20 69  t, but windows i
4790: 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66  s notorious.** f
47a0: 6f 72 20 62 65 69 6e 67 20 75 6e 72 65 61 73 6f  or being unreaso
47b0: 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f  nable so I do no
47c0: 74 20 64 6f 75 62 74 20 74 68 61 74 20 69 74 20  t doubt that it 
47d0: 6d 69 67 68 74 20 68 61 70 70 65 6e 2e 20 20 49  might happen.  I
47e0: 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20 66  f.** the close f
47f0: 61 69 6c 73 2c 20 77 65 20 70 61 75 73 65 20 66  ails, we pause f
4800: 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f  or 100 milliseco
4810: 6e 64 73 20 61 6e 64 20 74 72 79 20 61 67 61 69  nds and try agai
4820: 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61  n.  As.** many a
4830: 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d  s MX_CLOSE_ATTEM
4840: 50 54 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63  PT attempts to c
4850: 6c 6f 73 65 20 74 68 65 20 68 61 6e 64 6c 65 20  lose the handle 
4860: 61 72 65 20 6d 61 64 65 20 62 65 66 6f 72 65 0a  are made before.
4870: 2a 2a 20 67 69 76 69 6e 67 20 75 70 20 61 6e 64  ** giving up and
4880: 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   returning an er
4890: 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ror..*/.#define 
48a0: 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54  MX_CLOSE_ATTEMPT
48b0: 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69   3.static int wi
48c0: 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  nClose(sqlite3_f
48d0: 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20  ile *id){.  int 
48e0: 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77  rc, cnt = 0;.  w
48f0: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
4900: 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  (winFile*)id;.. 
4910: 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
4920: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ;.  assert( pFil
4930: 65 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 20 20  e->pShm==0 );.  
4940: 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
4950: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  %d\n", pFile->h)
4960: 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20  );.  do{.    rc 
4970: 3d 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  = CloseHandle(pF
4980: 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a 20  ile->h);.    /* 
4990: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
49a0: 20 72 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c   rc=0; cnt=MX_CL
49b0: 4f 53 45 5f 41 54 54 45 4d 50 54 3b 20 29 3b 20  OSE_ATTEMPT; ); 
49c0: 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  */.  }while( rc=
49d0: 3d 30 20 26 26 20 2b 2b 63 6e 74 20 3c 20 4d 58  =0 && ++cnt < MX
49e0: 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 26  _CLOSE_ATTEMPT &
49f0: 26 20 28 53 6c 65 65 70 28 31 30 30 29 2c 20 31  & (Sleep(100), 1
4a00: 29 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) );.#if SQLITE_
4a10: 4f 53 5f 57 49 4e 43 45 0a 23 64 65 66 69 6e 65  OS_WINCE.#define
4a20: 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f   WINCE_DELETION_
4a30: 41 54 54 45 4d 50 54 53 20 33 0a 20 20 77 69 6e  ATTEMPTS 3.  win
4a40: 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 70 46  ceDestroyLock(pF
4a50: 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  ile);.  if( pFil
4a60: 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
4a70: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74  e ){.    int cnt
4a80: 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
4a90: 0a 20 20 20 20 20 20 20 20 20 20 20 44 65 6c 65  .           Dele
4aa0: 74 65 46 69 6c 65 57 28 70 46 69 6c 65 2d 3e 7a  teFileW(pFile->z
4ab0: 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d  DeleteOnClose)==
4ac0: 30 0a 20 20 20 20 20 20 20 20 26 26 20 47 65 74  0.        && Get
4ad0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28  FileAttributesW(
4ae0: 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
4af0: 43 6c 6f 73 65 29 21 3d 30 78 66 66 66 66 66 66  Close)!=0xffffff
4b00: 66 66 20 0a 20 20 20 20 20 20 20 20 26 26 20 63  ff .        && c
4b10: 6e 74 2b 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c  nt++ < WINCE_DEL
4b20: 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20  ETION_ATTEMPTS. 
4b30: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 53 6c 65     ){.       Sle
4b40: 65 70 28 31 30 30 29 3b 20 20 2f 2a 20 57 61 69  ep(100);  /* Wai
4b50: 74 20 61 20 6c 69 74 74 6c 65 20 62 65 66 6f 72  t a little befor
4b60: 65 20 74 72 79 69 6e 67 20 61 67 61 69 6e 20 2a  e trying again *
4b70: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  /.    }.    free
4b80: 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f  (pFile->zDeleteO
4b90: 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 23 65 6e  nClose);.  }.#en
4ba0: 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22  dif.  OSTRACE(("
4bb0: 43 4c 4f 53 45 20 25 64 20 25 73 5c 6e 22 2c 20  CLOSE %d %s\n", 
4bc0: 70 46 69 6c 65 2d 3e 68 2c 20 72 63 20 3f 20 22  pFile->h, rc ? "
4bd0: 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
4be0: 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  ;.  OpenCounter(
4bf0: 2d 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  -1);.  return rc
4c00: 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53   ? SQLITE_OK : S
4c10: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 7d 0a 0a  QLITE_IOERR;.}..
4c20: 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 6d 69 63 72 6f  /*.** Some micro
4c30: 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c  soft compilers l
4c40: 61 63 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74  ack this definit
4c50: 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
4c60: 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
4c70: 5f 50 4f 49 4e 54 45 52 0a 23 20 64 65 66 69 6e  _POINTER.# defin
4c80: 65 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  e INVALID_SET_FI
4c90: 4c 45 5f 50 4f 49 4e 54 45 52 20 28 28 44 57 4f  LE_POINTER ((DWO
4ca0: 52 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f  RD)-1).#endif../
4cb0: 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
4cc0: 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
4cd0: 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
4ce0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
4cf0: 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
4d00: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
4d10: 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
4d20: 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
4d30: 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
4d40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
4d50: 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  Read(.  sqlite3_
4d60: 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20  file *id,       
4d70: 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65     /* File to re
4d80: 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69  ad from */.  voi
4d90: 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
4da0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
4db0: 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68   content into th
4dc0: 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  is buffer */.  i
4dd0: 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  nt amt,         
4de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4df0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
4e00: 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  read */.  sqlite
4e10: 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20  3_int64 offset  
4e20: 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65       /* Begin re
4e30: 61 64 69 6e 67 20 61 74 20 74 68 69 73 20 6f 66  ading at this of
4e40: 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 4c 4f 4e  fset */.){.  LON
4e50: 47 20 75 70 70 65 72 42 69 74 73 20 3d 20 28 4c  G upperBits = (L
4e60: 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32  ONG)((offset>>32
4e70: 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b  ) & 0x7fffffff);
4e80: 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74  .  LONG lowerBit
4e90: 73 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65  s = (LONG)(offse
4ea0: 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b  t & 0xffffffff);
4eb0: 0a 20 20 44 57 4f 52 44 20 72 63 3b 0a 20 20 77  .  DWORD rc;.  w
4ec0: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
4ed0: 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
4ee0: 44 57 4f 52 44 20 65 72 72 6f 72 3b 0a 20 20 44  DWORD error;.  D
4ef0: 57 4f 52 44 20 67 6f 74 3b 0a 0a 20 20 61 73 73  WORD got;..  ass
4f00: 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
4f10: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
4f20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
4f30: 45 52 52 5f 52 45 41 44 29 3b 0a 20 20 4f 53 54  ERR_READ);.  OST
4f40: 52 41 43 45 28 28 22 52 45 41 44 20 25 64 20 6c  RACE(("READ %d l
4f50: 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ock=%d\n", pFile
4f60: 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
4f70: 74 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 53  type));.  rc = S
4f80: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 70 46  etFilePointer(pF
4f90: 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74  ile->h, lowerBit
4fa0: 73 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20 46  s, &upperBits, F
4fb0: 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 20 20 69 66  ILE_BEGIN);.  if
4fc0: 28 20 72 63 3d 3d 49 4e 56 41 4c 49 44 5f 53 45  ( rc==INVALID_SE
4fd0: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 26  T_FILE_POINTER &
4fe0: 26 20 28 65 72 72 6f 72 3d 47 65 74 4c 61 73 74  & (error=GetLast
4ff0: 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52  Error())!=NO_ERR
5000: 4f 52 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OR ){.    pFile-
5010: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
5020: 6f 72 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  or;.    return S
5030: 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a  QLITE_FULL;.  }.
5040: 20 20 69 66 28 20 21 52 65 61 64 46 69 6c 65 28    if( !ReadFile(
5050: 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20  pFile->h, pBuf, 
5060: 61 6d 74 2c 20 26 67 6f 74 2c 20 30 29 20 29 7b  amt, &got, 0) ){
5070: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
5080: 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45  Errno = GetLastE
5090: 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 65 74 75  rror();.    retu
50a0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
50b0: 52 45 41 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20  READ;.  }.  if( 
50c0: 67 6f 74 3d 3d 28 44 57 4f 52 44 29 61 6d 74 20  got==(DWORD)amt 
50d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
50e0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
50f0: 7b 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20  {.    /* Unread 
5100: 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66  parts of the buf
5110: 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  fer must be zero
5120: 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d  -filled */.    m
5130: 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70  emset(&((char*)p
5140: 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d  Buf)[got], 0, am
5150: 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75  t-got);.    retu
5160: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
5170: 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a  SHORT_READ;.  }.
5180: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64  }../*.** Write d
5190: 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65  ata from a buffe
51a0: 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20  r into a file.  
51b0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
51c0: 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f   on success.** o
51d0: 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
51e0: 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75  or code on failu
51f0: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
5200: 74 20 77 69 6e 57 72 69 74 65 28 0a 20 20 73 71  t winWrite(.  sq
5210: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
5220: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
5230: 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f  to write into */
5240: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
5250: 42 75 66 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Buf,         /* 
5260: 54 68 65 20 62 79 74 65 73 20 74 6f 20 62 65 20  The bytes to be 
5270: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74  written */.  int
5280: 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
5290: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
52a0: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77 72 69   of bytes to wri
52b0: 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  te */.  sqlite3_
52c0: 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20 20  int64 offset    
52d0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
52e0: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 67   the file to beg
52f0: 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f  in writing at */
5300: 0a 29 7b 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72  .){.  LONG upper
5310: 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28 6f  Bits = (LONG)((o
5320: 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37  ffset>>32) & 0x7
5330: 66 66 66 66 66 66 66 29 3b 0a 20 20 4c 4f 4e 47  fffffff);.  LONG
5340: 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 28 4c 4f   lowerBits = (LO
5350: 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66  NG)(offset & 0xf
5360: 66 66 66 66 66 66 66 29 3b 0a 20 20 44 57 4f 52  fffffff);.  DWOR
5370: 44 20 72 63 3b 0a 20 20 77 69 6e 46 69 6c 65 20  D rc;.  winFile 
5380: 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
5390: 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 65  e*)id;.  DWORD e
53a0: 72 72 6f 72 3b 0a 20 20 44 57 4f 52 44 20 77 72  rror;.  DWORD wr
53b0: 6f 74 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ote = 0;..  asse
53c0: 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53  rt( id!=0 );.  S
53d0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
53e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
53f0: 52 52 5f 57 52 49 54 45 29 3b 0a 20 20 53 69 6d  RR_WRITE);.  Sim
5400: 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
5410: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
5420: 5f 46 55 4c 4c 29 3b 0a 20 20 4f 53 54 52 41 43  _FULL);.  OSTRAC
5430: 45 28 28 22 57 52 49 54 45 20 25 64 20 6c 6f 63  E(("WRITE %d loc
5440: 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  k=%d\n", pFile->
5450: 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
5460: 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 53 65 74  pe));.  rc = Set
5470: 46 69 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c  FilePointer(pFil
5480: 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c  e->h, lowerBits,
5490: 20 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c   &upperBits, FIL
54a0: 45 5f 42 45 47 49 4e 29 3b 0a 20 20 69 66 28 20  E_BEGIN);.  if( 
54b0: 72 63 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f  rc==INVALID_SET_
54c0: 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 26 26 20  FILE_POINTER && 
54d0: 28 65 72 72 6f 72 3d 47 65 74 4c 61 73 74 45 72  (error=GetLastEr
54e0: 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52  ror())!=NO_ERROR
54f0: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
5500: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6f 72  astErrno = error
5510: 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  ;.    if( pFile-
5520: 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f  >lastErrno==ERRO
5530: 52 5f 48 41 4e 44 4c 45 5f 44 49 53 4b 5f 46 55  R_HANDLE_DISK_FU
5540: 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  LL ){.      retu
5550: 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
5560: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5570: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
5580: 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20  OERR_WRITE;.    
5590: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
55a0: 61 6d 74 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65  amt>0 );.  while
55b0: 28 0a 20 20 20 20 20 61 6d 74 3e 30 0a 20 20 20  (.     amt>0.   
55c0: 20 20 26 26 20 28 72 63 20 3d 20 57 72 69 74 65    && (rc = Write
55d0: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70  File(pFile->h, p
55e0: 42 75 66 2c 20 61 6d 74 2c 20 26 77 72 6f 74 65  Buf, amt, &wrote
55f0: 2c 20 30 29 29 21 3d 30 0a 20 20 20 20 20 26 26  , 0))!=0.     &&
5600: 20 77 72 6f 74 65 3e 30 0a 20 20 29 7b 0a 20 20   wrote>0.  ){.  
5610: 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a    amt -= wrote;.
5620: 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 63 68      pBuf = &((ch
5630: 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d  ar*)pBuf)[wrote]
5640: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 72 63 20  ;.  }.  if( !rc 
5650: 7c 7c 20 61 6d 74 3e 28 69 6e 74 29 77 72 6f 74  || amt>(int)wrot
5660: 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  e ){.    pFile->
5670: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c  lastErrno = GetL
5680: 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
5690: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  if( pFile->lastE
56a0: 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44  rrno==ERROR_HAND
56b0: 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 7b 0a  LE_DISK_FULL ){.
56c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
56d0: 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 65  ITE_FULL;.    }e
56e0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
56f0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
5700: 52 49 54 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RITE;.    }.  }.
5710: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5720: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  OK;.}../*.** Tru
5730: 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69  ncate an open fi
5740: 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65  le to a specifie
5750: 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63  d size.*/.static
5760: 20 69 6e 74 20 77 69 6e 54 72 75 6e 63 61 74 65   int winTruncate
5770: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
5780: 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
5790: 20 6e 42 79 74 65 29 7b 0a 20 20 4c 4f 4e 47 20   nByte){.  LONG 
57a0: 75 70 70 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e  upperBits = (LON
57b0: 47 29 28 28 6e 42 79 74 65 3e 3e 33 32 29 20 26  G)((nByte>>32) &
57c0: 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20   0x7fffffff);.  
57d0: 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73 20 3d  LONG lowerBits =
57e0: 20 28 4c 4f 4e 47 29 28 6e 42 79 74 65 20 26 20   (LONG)(nByte & 
57f0: 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 44  0xffffffff);.  D
5800: 57 4f 52 44 20 64 77 52 65 74 3b 0a 20 20 77 69  WORD dwRet;.  wi
5810: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
5820: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44  winFile*)id;.  D
5830: 57 4f 52 44 20 65 72 72 6f 72 3b 0a 20 20 69 6e  WORD error;.  in
5840: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5850: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ;..  assert( id!
5860: 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  =0 );.  OSTRACE(
5870: 28 22 54 52 55 4e 43 41 54 45 20 25 64 20 25 6c  ("TRUNCATE %d %l
5880: 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  ld\n", pFile->h,
5890: 20 6e 42 79 74 65 29 29 3b 0a 20 20 53 69 6d 75   nByte));.  Simu
58a0: 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
58b0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
58c0: 54 52 55 4e 43 41 54 45 29 3b 0a 20 20 64 77 52  TRUNCATE);.  dwR
58d0: 65 74 20 3d 20 53 65 74 46 69 6c 65 50 6f 69 6e  et = SetFilePoin
58e0: 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  ter(pFile->h, lo
58f0: 77 65 72 42 69 74 73 2c 20 26 75 70 70 65 72 42  werBits, &upperB
5900: 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29  its, FILE_BEGIN)
5910: 3b 0a 20 20 69 66 28 20 64 77 52 65 74 3d 3d 49  ;.  if( dwRet==I
5920: 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
5930: 50 4f 49 4e 54 45 52 20 26 26 20 28 65 72 72 6f  POINTER && (erro
5940: 72 3d 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  r=GetLastError()
5950: 29 21 3d 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20  )!=NO_ERROR ){. 
5960: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
5970: 72 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a 20 20 20  rno = error;.   
5980: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
5990: 52 52 5f 54 52 55 4e 43 41 54 45 3b 0a 20 20 2f  RR_TRUNCATE;.  /
59a0: 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 20 77  * SetEndOfFile w
59b0: 69 6c 6c 20 66 61 69 6c 20 69 66 20 6e 42 79 74  ill fail if nByt
59c0: 65 20 69 73 20 6e 65 67 61 74 69 76 65 20 2a 2f  e is negative */
59d0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 53 65  .  }else if( !Se
59e0: 74 45 6e 64 4f 66 46 69 6c 65 28 70 46 69 6c 65  tEndOfFile(pFile
59f0: 2d 3e 68 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  ->h) ){.    pFil
5a00: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47  e->lastErrno = G
5a10: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
5a20: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
5a30: 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3b 0a 20  OERR_TRUNCATE;. 
5a40: 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54   }.  OSTRACE(("T
5a50: 52 55 4e 43 41 54 45 20 25 64 20 25 6c 6c 64 20  RUNCATE %d %lld 
5a60: 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
5a70: 20 6e 42 79 74 65 2c 20 72 63 3d 3d 53 51 4c 49   nByte, rc==SQLI
5a80: 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
5a90: 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74  failed"));.  ret
5aa0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
5ab0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
5ac0: 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
5ad0: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63  mber of fullsync
5ae0: 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e  s and normal syn
5af0: 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  cs.  This is use
5b00: 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61  d to test.** tha
5b10: 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c  t syncs and full
5b20: 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 69  syncs are occuri
5b30: 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20  ng at the right 
5b40: 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  times..*/.int sq
5b50: 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
5b60: 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65   = 0;.int sqlite
5b70: 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
5b80: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
5b90: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c  .** Make sure al
5ba0: 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61  l writes to a pa
5bb0: 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72  rticular file ar
5bc0: 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64  e committed to d
5bd0: 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  isk..*/.static i
5be0: 6e 74 20 77 69 6e 53 79 6e 63 28 73 71 6c 69 74  nt winSync(sqlit
5bf0: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
5c00: 20 66 6c 61 67 73 29 7b 0a 23 69 66 20 21 64 65   flags){.#if !de
5c10: 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c  fined(NDEBUG) ||
5c20: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
5c30: 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20 64 65 66  _NO_SYNC) || def
5c40: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
5c50: 47 29 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  G).  winFile *pF
5c60: 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
5c70: 69 64 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53  id;.#else.  UNUS
5c80: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64 29  ED_PARAMETER(id)
5c90: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
5ca0: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 2f  rt( pFile );.  /
5cb0: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65  * Check that one
5cc0: 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f   of SQLITE_SYNC_
5cd0: 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77  NORMAL or FULL w
5ce0: 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61  as passed */.  a
5cf0: 73 73 65 72 74 28 28 66 6c 61 67 73 26 30 78 30  ssert((flags&0x0
5d00: 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
5d10: 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20  NORMAL.      || 
5d20: 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
5d30: 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20  LITE_SYNC_FULL. 
5d40: 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   );..  OSTRACE((
5d50: 22 53 59 4e 43 20 25 64 20 6c 6f 63 6b 3d 25 64  "SYNC %d lock=%d
5d60: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
5d70: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
5d80: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
5d90: 45 5f 54 45 53 54 0a 20 20 55 4e 55 53 45 44 5f  E_TEST.  UNUSED_
5da0: 50 41 52 41 4d 45 54 45 52 28 66 6c 61 67 73 29  PARAMETER(flags)
5db0: 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 66 6c  ;.#else.  if( fl
5dc0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 59 4e  ags & SQLITE_SYN
5dd0: 43 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71  C_FULL ){.    sq
5de0: 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
5df0: 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71  ount++;.  }.  sq
5e00: 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
5e10: 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  ++;.#endif..  /*
5e20: 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75   Unix cannot, bu
5e30: 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d  t some systems m
5e40: 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
5e50: 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e  _FULL from here.
5e60: 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20   This.  ** line 
5e70: 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  is to test that 
5e80: 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f  doing so does no
5e90: 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62  t cause any prob
5ea0: 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  lems..  */.  Sim
5eb0: 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
5ec0: 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
5ed0: 45 5f 46 55 4c 4c 20 29 3b 0a 20 20 53 69 6d 75  E_FULL );.  Simu
5ee0: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
5ef0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
5f00: 3b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ; );..  /* If we
5f10: 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74   compiled with t
5f20: 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
5f30: 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e  C flag, then syn
5f40: 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e  cing is a.  ** n
5f50: 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66  o-op.  */.#ifdef
5f60: 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
5f70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5f80: 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  OK;.#else.  if( 
5f90: 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73  FlushFileBuffers
5fa0: 28 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20 20  (pFile->h) ){.  
5fb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5fc0: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
5fd0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
5fe0: 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72  o = GetLastError
5ff0: 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ();.    return S
6000: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d  QLITE_IOERR;.  }
6010: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
6020: 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63   Determine the c
6030: 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61  urrent size of a
6040: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a   file in bytes.*
6050: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
6060: 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33  FileSize(sqlite3
6070: 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74  _file *id, sqlit
6080: 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29  e3_int64 *pSize)
6090: 7b 0a 20 20 44 57 4f 52 44 20 75 70 70 65 72 42  {.  DWORD upperB
60a0: 69 74 73 3b 0a 20 20 44 57 4f 52 44 20 6c 6f 77  its;.  DWORD low
60b0: 65 72 42 69 74 73 3b 0a 20 20 77 69 6e 46 69 6c  erBits;.  winFil
60c0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
60d0: 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44  ile*)id;.  DWORD
60e0: 20 65 72 72 6f 72 3b 0a 0a 20 20 61 73 73 65 72   error;..  asser
60f0: 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53 69  t( id!=0 );.  Si
6100: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
6110: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
6120: 52 5f 46 53 54 41 54 29 3b 0a 20 20 6c 6f 77 65  R_FSTAT);.  lowe
6130: 72 42 69 74 73 20 3d 20 47 65 74 46 69 6c 65 53  rBits = GetFileS
6140: 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26 75  ize(pFile->h, &u
6150: 70 70 65 72 42 69 74 73 29 3b 0a 20 20 69 66 28  pperBits);.  if(
6160: 20 20 20 28 6c 6f 77 65 72 42 69 74 73 20 3d 3d     (lowerBits ==
6170: 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 53 49   INVALID_FILE_SI
6180: 5a 45 29 0a 20 20 20 20 20 26 26 20 28 28 65 72  ZE).     && ((er
6190: 72 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72 72  ror = GetLastErr
61a0: 6f 72 28 29 29 20 21 3d 20 4e 4f 5f 45 52 52 4f  or()) != NO_ERRO
61b0: 52 29 20 29 0a 20 20 7b 0a 20 20 20 20 70 46 69  R) ).  {.    pFi
61c0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
61d0: 65 72 72 6f 72 3b 0a 20 20 20 20 72 65 74 75 72  error;.    retur
61e0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
61f0: 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69  STAT;.  }.  *pSi
6200: 7a 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33 5f  ze = (((sqlite3_
6210: 69 6e 74 36 34 29 75 70 70 65 72 42 69 74 73 29  int64)upperBits)
6220: 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74  <<32) + lowerBit
6230: 73 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  s;.  return SQLI
6240: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6250: 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
6260: 4d 45 44 49 41 54 45 4c 59 20 69 73 20 75 6e 64  MEDIATELY is und
6270: 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57  efined on some W
6280: 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a  indows systems..
6290: 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46  */.#ifndef LOCKF
62a0: 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
62b0: 54 45 4c 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f  TELY.# define LO
62c0: 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
62d0: 44 49 41 54 45 4c 59 20 31 0a 23 65 6e 64 69 66  DIATELY 1.#endif
62e0: 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
62f0: 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a  a reader lock..*
6300: 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50 49 20  * Different API 
6310: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61 6c  routines are cal
6320: 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  led depending on
6330: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
6340: 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39 35  this.** is Win95
6350: 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74   or WinNT..*/.st
6360: 61 74 69 63 20 69 6e 74 20 67 65 74 52 65 61 64  atic int getRead
6370: 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46  Lock(winFile *pF
6380: 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b  ile){.  int res;
6390: 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
63a0: 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20  .    OVERLAPPED 
63b0: 6f 76 6c 70 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f  ovlp;.    ovlp.O
63c0: 66 66 73 65 74 20 3d 20 53 48 41 52 45 44 5f 46  ffset = SHARED_F
63d0: 49 52 53 54 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f  IRST;.    ovlp.O
63e0: 66 66 73 65 74 48 69 67 68 20 3d 20 30 3b 0a 20  ffsetHigh = 0;. 
63f0: 20 20 20 6f 76 6c 70 2e 68 45 76 65 6e 74 20 3d     ovlp.hEvent =
6400: 20 30 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f   0;.    res = Lo
6410: 63 6b 46 69 6c 65 45 78 28 70 46 69 6c 65 2d 3e  ckFileEx(pFile->
6420: 68 2c 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  h, LOCKFILE_FAIL
6430: 5f 49 4d 4d 45 44 49 41 54 45 4c 59 2c 0a 20 20  _IMMEDIATELY,.  
6440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6450: 20 20 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a     0, SHARED_SIZ
6460: 45 2c 20 30 2c 20 26 6f 76 6c 70 29 3b 0a 2f 2a  E, 0, &ovlp);./*
6470: 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20   isNT() is 1 if 
6480: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
6490: 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65  =1, so this else
64a0: 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74   is never execut
64b0: 65 64 2e 20 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  ed. .*/.#if SQLI
64c0: 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20  TE_OS_WINCE==0. 
64d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
64e0: 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  lk;.    sqlite3_
64f0: 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
6500: 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20 20  f(lk), &lk);.   
6510: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f   pFile->sharedLo
6520: 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72 74 29  ckByte = (short)
6530: 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66  ((lk & 0x7ffffff
6540: 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20  f)%(SHARED_SIZE 
6550: 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73 20 3d  - 1));.    res =
6560: 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d   LockFile(pFile-
6570: 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
6580: 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f  +pFile->sharedLo
6590: 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29  ckByte, 0, 1, 0)
65a0: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69  ;.#endif.  }.  i
65b0: 66 28 20 72 65 73 20 3d 3d 20 30 20 29 7b 0a 20  f( res == 0 ){. 
65c0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
65d0: 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72  rno = GetLastErr
65e0: 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  or();.  }.  retu
65f0: 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
6600: 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b   Undo a readlock
6610: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
6620: 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77 69  nlockReadLock(wi
6630: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
6640: 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 66 28 20   int res;.  if( 
6650: 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72 65  isNT() ){.    re
6660: 73 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70  s = UnlockFile(p
6670: 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
6680: 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44  FIRST, 0, SHARED
6690: 5f 53 49 5a 45 2c 20 30 29 3b 0a 2f 2a 20 69 73  _SIZE, 0);./* is
66a0: 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c  NT() is 1 if SQL
66b0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c  ITE_OS_WINCE==1,
66c0: 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73   so this else is
66d0: 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e   never executed.
66e0: 20 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f   .*/.#if SQLITE_
66f0: 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65  OS_WINCE==0.  }e
6700: 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 55  lse{.    res = U
6710: 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d  nlockFile(pFile-
6720: 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
6730: 20 2b 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64   + pFile->shared
6740: 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20  LockByte, 0, 1, 
6750: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  0);.#endif.  }. 
6760: 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29 7b   if( res == 0 ){
6770: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
6780: 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45  Errno = GetLastE
6790: 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 72 65  rror();.  }.  re
67a0: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
67b0: 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
67c0: 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
67d0: 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
67e0: 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d  meter locktype -
67f0: 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
6800: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
6810: 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
6820: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
6830: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
6840: 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
6850: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
6860: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
6870: 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
6880: 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
6890: 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
68a0: 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
68b0: 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
68c0: 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
68d0: 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
68e0: 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
68f0: 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
6900: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
6910: 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
6920: 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
6930: 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
6940: 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
6950: 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
6960: 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
6970: 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
6980: 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
6990: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
69a0: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
69b0: 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
69c0: 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
69d0: 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
69e0: 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
69f0: 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
6a00: 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
6a10: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
6a20: 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
6a30: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
6a40: 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
6a50: 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
6a60: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6a70: 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
6a80: 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54 68  ease a lock.  Th
6a90: 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72 6f  e winUnlock() ro
6aa0: 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73 20  utine.** erases 
6ab0: 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e 63  all locks at onc
6ac0: 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 75 73  e and returns us
6ad0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
6ae0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e  locking level 0.
6af0: 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f  .** It is not po
6b00: 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72 20  ssible to lower 
6b10: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
6b20: 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 20 61 20  l one step at a 
6b30: 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d 75  time.  You.** mu
6b40: 73 74 20 67 6f 20 73 74 72 61 69 67 68 74 20 74  st go straight t
6b50: 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  o locking level 
6b60: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
6b70: 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74 65 33   winLock(sqlite3
6b80: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
6b90: 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20  ocktype){.  int 
6ba0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
6bb0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
6bc0: 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e  e from subroutin
6bd0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20  es */.  int res 
6be0: 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 1;           /
6bf0: 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 20 77 69  * Result of a wi
6c00: 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c 20  ndows lock call 
6c10: 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63 6b  */.  int newLock
6c20: 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20 53  type;       /* S
6c30: 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  et pFile->lockty
6c40: 70 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65  pe to this value
6c50: 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20   before exiting 
6c60: 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e 64  */.  int gotPend
6c70: 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54  ingLock = 0;/* T
6c80: 72 75 65 20 69 66 20 77 65 20 61 63 71 75 69 72  rue if we acquir
6c90: 65 64 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  ed a PENDING loc
6ca0: 6b 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a 20  k this time */. 
6cb0: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
6cc0: 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
6cd0: 20 20 44 57 4f 52 44 20 65 72 72 6f 72 20 3d 20    DWORD error = 
6ce0: 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73 73  NO_ERROR;..  ass
6cf0: 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
6d00: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25  OSTRACE(("LOCK %
6d10: 64 20 25 64 20 77 61 73 20 25 64 28 25 64 29 5c  d %d was %d(%d)\
6d20: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
6d30: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
6d40: 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  e, pFile->lockty
6d50: 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  pe, pFile->share
6d60: 64 4c 6f 63 6b 42 79 74 65 29 29 3b 0a 0a 20 20  dLockByte));..  
6d70: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
6d80: 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66  lready a lock of
6d90: 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f   this type or mo
6da0: 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f  re restrictive o
6db0: 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c  n the.  ** OsFil
6dc0: 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
6dd0: 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64  on't use the end
6de0: 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
6df0: 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65  , as.  ** sqlite
6e00: 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20  3OsEnterMutex() 
6e10: 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
6e20: 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
6e30: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
6e40: 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe>=locktype ){.
6e50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6e60: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
6e70: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
6e80: 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  cking sequence i
6e90: 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20  s correct.  */. 
6ea0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
6eb0: 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43  locktype!=NO_LOC
6ec0: 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K || locktype==S
6ed0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
6ee0: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
6ef0: 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
6f00: 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
6f10: 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c  type!=RESERVED_L
6f20: 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f  OCK || pFile->lo
6f30: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
6f40: 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  OCK );..  /* Loc
6f50: 6b 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f  k the PENDING_LO
6f60: 43 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e 65  CK byte if we ne
6f70: 65 64 20 74 6f 20 61 63 71 75 69 72 65 20 61 20  ed to acquire a 
6f80: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a  PENDING lock or.
6f90: 20 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f    ** a SHARED lo
6fa0: 63 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20 61  ck.  If we are a
6fb0: 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
6fc0: 44 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75  D lock, the acqu
6fd0: 69 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20  isition of.  ** 
6fe0: 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  the PENDING_LOCK
6ff0: 20 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61   byte is tempora
7000: 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f  ry..  */.  newLo
7010: 63 6b 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e  cktype = pFile->
7020: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20  locktype;.  if( 
7030: 20 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79    (pFile->lockty
7040: 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20 20  pe==NO_LOCK).   
7050: 20 20 7c 7c 20 28 20 20 20 28 6c 6f 63 6b 74 79    || (   (lockty
7060: 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
7070: 43 4b 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  CK).         && 
7080: 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
7090: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  ==RESERVED_LOCK)
70a0: 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  ).  ){.    int c
70b0: 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c  nt = 3;.    whil
70c0: 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72  e( cnt-->0 && (r
70d0: 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46  es = LockFile(pF
70e0: 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f  ile->h, PENDING_
70f0: 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d  BYTE, 0, 1, 0))=
7100: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
7110: 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67 65  ry 3 times to ge
7120: 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f  t the pending lo
7130: 63 6b 2e 20 20 54 68 65 20 70 65 6e 64 69 6e 67  ck.  The pending
7140: 20 6c 6f 63 6b 20 6d 69 67 68 74 20 62 65 0a 20   lock might be. 
7150: 20 20 20 20 20 2a 2a 20 68 65 6c 64 20 62 79 20       ** held by 
7160: 61 6e 6f 74 68 65 72 20 72 65 61 64 65 72 20 70  another reader p
7170: 72 6f 63 65 73 73 20 77 68 6f 20 77 69 6c 6c 20  rocess who will 
7180: 72 65 6c 65 61 73 65 20 69 74 20 6d 6f 6d 65 6e  release it momen
7190: 74 61 72 69 6c 79 2e 0a 20 20 20 20 20 20 2a 2f  tarily..      */
71a0: 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
71b0: 22 63 6f 75 6c 64 20 6e 6f 74 20 67 65 74 20 61  "could not get a
71c0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 20 63   PENDING lock. c
71d0: 6e 74 3d 25 64 5c 6e 22 2c 20 63 6e 74 29 29 3b  nt=%d\n", cnt));
71e0: 0a 20 20 20 20 20 20 53 6c 65 65 70 28 31 29 3b  .      Sleep(1);
71f0: 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 50 65  .    }.    gotPe
7200: 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73 3b  ndingLock = res;
7210: 0a 20 20 20 20 69 66 28 20 21 72 65 73 20 29 7b  .    if( !res ){
7220: 0a 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 47  .      error = G
7230: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
7240: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
7250: 63 71 75 69 72 65 20 61 20 73 68 61 72 65 64 20  cquire a shared 
7260: 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
7270: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
7280: 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
7290: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
72a0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  e->locktype==NO_
72b0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20  LOCK );.    res 
72c0: 3d 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46  = getReadLock(pF
72d0: 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 65  ile);.    if( re
72e0: 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  s ){.      newLo
72f0: 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
7300: 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LOCK;.    }else{
7310: 0a 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 47  .      error = G
7320: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
7330: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
7340: 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45  cquire a RESERVE
7350: 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  D lock.  */.  if
7360: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45  ( locktype==RESE
7370: 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73  RVED_LOCK && res
7380: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
7390: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
73a0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
73b0: 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46 69      res = LockFi
73c0: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53  le(pFile->h, RES
73d0: 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31  ERVED_BYTE, 0, 1
73e0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65  , 0);.    if( re
73f0: 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  s ){.      newLo
7400: 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56 45  cktype = RESERVE
7410: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  D_LOCK;.    }els
7420: 65 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20 3d  e{.      error =
7430: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b   GetLastError();
7440: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
7450: 20 41 63 71 75 69 72 65 20 61 20 50 45 4e 44 49   Acquire a PENDI
7460: 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  NG lock.  */.  i
7470: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  f( locktype==EXC
7480: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72  LUSIVE_LOCK && r
7490: 65 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c 6f 63  es ){.    newLoc
74a0: 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f  ktype = PENDING_
74b0: 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50 65 6e  LOCK;.    gotPen
74c0: 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20  dingLock = 0;.  
74d0: 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
74e0: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
74f0: 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  k.  */.  if( loc
7500: 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
7510: 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
7520: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
7530: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48 41  e->locktype>=SHA
7540: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
7550: 72 65 73 20 3d 20 75 6e 6c 6f 63 6b 52 65 61 64  res = unlockRead
7560: 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20  Lock(pFile);.   
7570: 20 4f 53 54 52 41 43 45 28 28 22 75 6e 72 65 61   OSTRACE(("unrea
7580: 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e 22 2c 20 72  dlock = %d\n", r
7590: 65 73 29 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  es));.    res = 
75a0: 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e  LockFile(pFile->
75b0: 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  h, SHARED_FIRST,
75c0: 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c   0, SHARED_SIZE,
75d0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73   0);.    if( res
75e0: 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
75f0: 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49 56  ktype = EXCLUSIV
7600: 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  E_LOCK;.    }els
7610: 65 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20 3d  e{.      error =
7620: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b   GetLastError();
7630: 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
7640: 22 65 72 72 6f 72 2d 63 6f 64 65 20 3d 20 25 64  "error-code = %d
7650: 5c 6e 22 2c 20 65 72 72 6f 72 29 29 3b 0a 20 20  \n", error));.  
7660: 20 20 20 20 67 65 74 52 65 61 64 4c 6f 63 6b 28      getReadLock(
7670: 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pFile);.    }.  
7680: 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  }..  /* If we ar
7690: 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44  e holding a PEND
76a0: 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75  ING lock that ou
76b0: 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73  ght to be releas
76c0: 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65  ed, then.  ** re
76d0: 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20  lease it now..  
76e0: 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64  */.  if( gotPend
76f0: 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74  ingLock && lockt
7700: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
7710: 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69   ){.    UnlockFi
7720: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e  le(pFile->h, PEN
7730: 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c  DING_BYTE, 0, 1,
7740: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55   0);.  }..  /* U
7750: 70 64 61 74 65 20 74 68 65 20 73 74 61 74 65 20  pdate the state 
7760: 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20  of the lock has 
7770: 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69 6c 65  held in the file
7780: 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 65 6e   descriptor then
7790: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65  .  ** return the
77a0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 72 65 73   appropriate res
77b0: 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ult code..  */. 
77c0: 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
77d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
77e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 53 54    }else{.    OST
77f0: 52 41 43 45 28 28 22 4c 4f 43 4b 20 46 41 49 4c  RACE(("LOCK FAIL
7800: 45 44 20 25 64 20 74 72 79 69 6e 67 20 66 6f 72  ED %d trying for
7810: 20 25 64 20 62 75 74 20 67 6f 74 20 25 64 5c 6e   %d but got %d\n
7820: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
7830: 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65          locktype
7840: 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29 29 3b  , newLocktype));
7850: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
7860: 45 72 72 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a 20  Errno = error;. 
7870: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
7880: 55 53 59 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65  USY;.  }.  pFile
7890: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38  ->locktype = (u8
78a0: 29 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20 20  )newLocktype;.  
78b0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
78c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
78d0: 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
78e0: 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
78f0: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
7900: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
7910: 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
7920: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
7930: 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
7940: 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a  s held, return.*
7950: 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65  * non-zero, othe
7960: 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  rwise zero..*/.s
7970: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 68 65  tatic int winChe
7980: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
7990: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
79a0: 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
79b0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 77 69 6e 46    int rc;.  winF
79c0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
79d0: 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  nFile*)id;..  Si
79e0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
79f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
7a00: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
7a10: 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65  LOCK; );..  asse
7a20: 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 69  rt( id!=0 );.  i
7a30: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
7a40: 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe>=RESERVED_LOC
7a50: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b  K ){.    rc = 1;
7a60: 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54  .    OSTRACE(("T
7a70: 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
7a80: 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46  d (local)\n", pF
7a90: 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a 20 20  ile->h, rc));.  
7aa0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
7ab0: 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e  LockFile(pFile->
7ac0: 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  h, RESERVED_BYTE
7ad0: 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  , 0, 1, 0);.    
7ae0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
7af0: 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65  UnlockFile(pFile
7b00: 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ->h, RESERVED_BY
7b10: 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
7b20: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 21 72 63    }.    rc = !rc
7b30: 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
7b40: 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
7b50: 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20  %d (remote)\n", 
7b60: 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a  pFile->h, rc));.
7b70: 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d    }.  *pResOut =
7b80: 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 53 51   rc;.  return SQ
7b90: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
7ba0: 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
7bb0: 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
7bc0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 64 20  e descriptor id 
7bd0: 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f  to locktype.  lo
7be0: 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62  cktype.** must b
7bf0: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
7c00: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
7c10: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
7c20: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
7c30: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
7c40: 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
7c50: 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
7c60: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
7c70: 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
7c80: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
7c90: 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e  p..**.** It is n
7ca0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
7cb0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
7cc0: 66 61 69 6c 20 69 66 20 74 68 65 20 73 65 63 6f  fail if the seco
7cd0: 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
7ce0: 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74  s NO_LOCK.  If t
7cf0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
7d00: 6e 74 20 69 73 20 53 48 41 52 45 44 5f 4c 4f 43  nt is SHARED_LOC
7d10: 4b 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  K then this rout
7d20: 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74  ine.** might ret
7d30: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
7d40: 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.*/.static int 
7d50: 77 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  winUnlock(sqlite
7d60: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
7d70: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
7d80: 20 74 79 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65   type;.  winFile
7d90: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
7da0: 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
7db0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
7dc0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30  assert( pFile!=0
7dd0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
7de0: 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c  cktype<=SHARED_L
7df0: 4f 43 4b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  OCK );.  OSTRACE
7e00: 28 28 22 55 4e 4c 4f 43 4b 20 25 64 20 74 6f 20  (("UNLOCK %d to 
7e10: 25 64 20 77 61 73 20 25 64 28 25 64 29 5c 6e 22  %d was %d(%d)\n"
7e20: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b  , pFile->h, lock
7e30: 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 20 20  type,.          
7e40: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
7e50: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f   pFile->sharedLo
7e60: 63 6b 42 79 74 65 29 29 3b 0a 20 20 74 79 70 65  ckByte));.  type
7e70: 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79   = pFile->lockty
7e80: 70 65 3b 0a 20 20 69 66 28 20 74 79 70 65 3e 3d  pe;.  if( type>=
7e90: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
7ea0: 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65  {.    UnlockFile
7eb0: 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45  (pFile->h, SHARE
7ec0: 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52  D_FIRST, 0, SHAR
7ed0: 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20  ED_SIZE, 0);.   
7ee0: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
7ef0: 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21 67  HARED_LOCK && !g
7f00: 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  etReadLock(pFile
7f10: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
7f20: 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  is should never 
7f30: 68 61 70 70 65 6e 2e 20 20 57 65 20 73 68 6f 75  happen.  We shou
7f40: 6c 64 20 61 6c 77 61 79 73 20 62 65 20 61 62 6c  ld always be abl
7f50: 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65  e to.      ** re
7f60: 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
7f70: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72   lock */.      r
7f80: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
7f90: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  _UNLOCK;.    }. 
7fa0: 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 52   }.  if( type>=R
7fb0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
7fc0: 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70      UnlockFile(p
7fd0: 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45  File->h, RESERVE
7fe0: 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  D_BYTE, 0, 1, 0)
7ff0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b  ;.  }.  if( lock
8000: 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26  type==NO_LOCK &&
8010: 20 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f   type>=SHARED_LO
8020: 43 4b 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b  CK ){.    unlock
8030: 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  ReadLock(pFile);
8040: 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e  .  }.  if( type>
8050: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b  =PENDING_LOCK ){
8060: 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28  .    UnlockFile(
8070: 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e  pFile->h, PENDIN
8080: 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  G_BYTE, 0, 1, 0)
8090: 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c  ;.  }.  pFile->l
80a0: 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6c 6f  ocktype = (u8)lo
80b0: 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e  cktype;.  return
80c0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
80d0: 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20  ntrol and query 
80e0: 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
80f0: 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74   handle..*/.stat
8100: 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f  ic int winFileCo
8110: 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
8120: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20  le *id, int op, 
8130: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73  void *pArg){.  s
8140: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
8150: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
8160: 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a  TL_LOCKSTATE: {.
8170: 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
8180: 67 20 3d 20 28 28 77 69 6e 46 69 6c 65 2a 29 69  g = ((winFile*)i
8190: 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  d)->locktype;.  
81a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
81b0: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
81c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53 54  case SQLITE_LAST
81d0: 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20  _ERRNO: {.      
81e0: 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 69  *(int*)pArg = (i
81f0: 6e 74 29 28 28 77 69 6e 46 69 6c 65 2a 29 69 64  nt)((winFile*)id
8200: 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  )->lastErrno;.  
8210: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8220: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
8230: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
8240: 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20  L_SIZE_HINT: {. 
8250: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
8260: 36 34 20 73 7a 20 3d 20 2a 28 73 71 6c 69 74 65  64 sz = *(sqlite
8270: 33 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a 20  3_int64*)pArg;. 
8280: 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
8290: 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
82a0: 20 20 20 20 20 77 69 6e 54 72 75 6e 63 61 74 65       winTruncate
82b0: 28 69 64 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  (id, sz);.      
82c0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
82d0: 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
82e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
82f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
8300: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
8310: 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  R;.}../*.** Retu
8320: 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  rn the sector si
8330: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74  ze in bytes of t
8340: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c  he underlying bl
8350: 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a  ock device for.*
8360: 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  * the specified 
8370: 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
8380: 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20  most always 512 
8390: 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62  bytes, but may b
83a0: 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20  e.** larger for 
83b0: 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a  some devices..**
83c0: 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20  .** SQLite code 
83d0: 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e  assumes this fun
83e0: 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69  ction cannot fai
83f0: 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d  l. It also assum
8400: 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77  es that.** if tw
8410: 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  o files are crea
8420: 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ted in the same 
8430: 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65  file-system dire
8440: 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61  ctory (i.e..** a
8450: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74   database and it
8460: 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  s journal file) 
8470: 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20  that the sector 
8480: 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65  size will be the
8490: 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74  .** same for bot
84a0: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h..*/.static int
84b0: 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 28 73   winSectorSize(s
84c0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
84d0: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  {.  assert( id!=
84e0: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 69  0 );.  return (i
84f0: 6e 74 29 28 28 28 77 69 6e 46 69 6c 65 2a 29 69  nt)(((winFile*)i
8500: 64 29 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b  d)->sectorSize);
8510: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
8520: 20 61 20 76 65 63 74 6f 72 20 6f 66 20 64 65 76   a vector of dev
8530: 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
8540: 69 63 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ics..*/.static i
8550: 6e 74 20 77 69 6e 44 65 76 69 63 65 43 68 61 72  nt winDeviceChar
8560: 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69  acteristics(sqli
8570: 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
8580: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
8590: 52 28 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  R(id);.  return 
85a0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
85b0: 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
85c0: 45 4e 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  EN;.}..#ifndef S
85d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a  QLITE_OMIT_WAL..
85e0: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
85f0: 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e  ctions to obtain
8600: 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20   and relinquish 
8610: 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
8620: 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20  . The.** global 
8630: 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f  mutex is used to
8640: 20 70 72 6f 74 65 63 74 20 74 68 65 20 77 69 6e   protect the win
8650: 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73  LockInfo objects
8660: 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 69   used by .** thi
8670: 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77  s file, all of w
8680: 68 69 63 68 20 6d 61 79 20 62 65 20 73 68 61 72  hich may be shar
8690: 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74  ed by multiple t
86a0: 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75  hreads..**.** Fu
86b0: 6e 63 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75 74  nction winShmMut
86c0: 65 78 48 65 6c 64 28 29 20 69 73 20 75 73 65 64  exHeld() is used
86d0: 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61   to assert() tha
86e0: 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74  t the global mut
86f0: 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77  ex .** is held w
8700: 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68  hen required. Th
8710: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
8720: 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74  nly used as part
8730: 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a   of assert() .**
8740: 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67   statements. e.g
8750: 2e 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d  ..**.**   winShm
8760: 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20  EnterMutex().** 
8770: 20 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 53      assert( winS
8780: 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  hmMutexHeld() );
8790: 0a 2a 2a 20 20 20 77 69 6e 45 6e 74 65 72 4c 65  .**   winEnterLe
87a0: 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ave().*/.static 
87b0: 76 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74 65 72  void winShmEnter
87c0: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
87d0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
87e0: 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
87f0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
8800: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
8810: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
8820: 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
8830: 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
8840: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
8850: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
8860: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
8870: 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
8880: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8890: 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20  EBUG.static int 
88a0: 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
88b0: 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e  void) {.  return
88c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
88d0: 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78  eld(sqlite3Mutex
88e0: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
88f0: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
8900: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ));.}.#endif../*
8910: 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20  .** Object used 
8920: 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 73  to represent a s
8930: 69 6e 67 6c 65 20 66 69 6c 65 20 6f 70 65 6e 65  ingle file opene
8940: 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 20 74 6f  d and mmapped to
8950: 20 70 72 6f 76 69 64 65 0a 2a 2a 20 73 68 61 72   provide.** shar
8960: 65 64 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e  ed memory.  When
8970: 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
8980: 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20  s all reference 
8990: 74 68 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d  the same.** log-
89a0: 73 75 6d 6d 61 72 79 2c 20 65 61 63 68 20 74 68  summary, each th
89b0: 72 65 61 64 20 68 61 73 20 69 74 73 20 6f 77 6e  read has its own
89c0: 20 77 69 6e 46 69 6c 65 20 6f 62 6a 65 63 74 2c   winFile object,
89d0: 20 62 75 74 20 74 68 65 79 20 61 6c 6c 0a 2a 2a   but they all.**
89e0: 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67   point to a sing
89f0: 6c 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  le instance of t
8a00: 68 69 73 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20  his object.  In 
8a10: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63  other words, eac
8a20: 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79  h.** log-summary
8a30: 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 6c 79 20   is opened only 
8a40: 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73 73  once per process
8a50: 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75  ..**.** winShmMu
8a60: 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
8a70: 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65 61  e true when crea
8a80: 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69  ting or destroyi
8a90: 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63  ng.** this objec
8aa0: 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69  t or while readi
8ab0: 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
8ac0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
8ad0: 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e  ds:.**.**      n
8ae0: 52 65 66 0a 2a 2a 20 20 20 20 20 20 70 4e 65 78  Ref.**      pNex
8af0: 74 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  t .**.** The fol
8b00: 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72  lowing fields ar
8b10: 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65  e read-only afte
8b20: 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20  r the object is 
8b30: 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20  created:.** .** 
8b40: 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20       fid.**     
8b50: 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a   zFilename.**.**
8b60: 20 45 69 74 68 65 72 20 77 69 6e 53 68 6d 4e 6f   Either winShmNo
8b70: 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  de.mutex must be
8b80: 20 68 65 6c 64 20 6f 72 20 77 69 6e 53 68 6d 4e   held or winShmN
8b90: 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a  ode.nRef==0 and.
8ba0: 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  ** winShmMutexHe
8bb0: 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65  ld() is true whe
8bc0: 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  n reading or wri
8bd0: 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66  ting any other f
8be0: 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  ield.** in this 
8bf0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f  structure..**.*/
8c00: 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f  .struct winShmNo
8c10: 64 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  de {.  sqlite3_m
8c20: 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20  utex *mutex;    
8c30: 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63    /* Mutex to ac
8c40: 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74  cess this object
8c50: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
8c60: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
8c70: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
8c80: 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  file */.  winFil
8c90: 65 20 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20  e hFile;        
8ca0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e       /* File han
8cb0: 64 6c 65 20 66 72 6f 6d 20 77 69 6e 4f 70 65 6e  dle from winOpen
8cc0: 20 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a 52 65 67   */..  int szReg
8cd0: 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
8ce0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61    /* Size of sha
8cf0: 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
8d00: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67  ns */.  int nReg
8d10: 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
8d20: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72     /* Size of ar
8d30: 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a  ray apRegion */.
8d40: 20 20 73 74 72 75 63 74 20 53 68 6d 52 65 67 69    struct ShmRegi
8d50: 6f 6e 20 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20  on {.    HANDLE 
8d60: 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  hMap;           
8d70: 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65    /* File handle
8d80: 20 66 72 6f 6d 20 43 72 65 61 74 65 46 69 6c 65   from CreateFile
8d90: 4d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 20 20 76  Mapping */.    v
8da0: 6f 69 64 20 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a  oid *pMap;.  } *
8db0: 61 52 65 67 69 6f 6e 3b 0a 20 20 44 57 4f 52 44  aRegion;.  DWORD
8dc0: 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20   lastErrno;     
8dd0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e        /* The Win
8de0: 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20  dows errno from 
8df0: 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72  the last I/O err
8e00: 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52 65  or */..  int nRe
8e10: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
8e20: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8e30: 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20   winShm objects 
8e40: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
8e50: 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 46   */.  winShm *pF
8e60: 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
8e70: 20 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d 20 6f   /* All winShm o
8e80: 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20  bjects pointing 
8e90: 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e  to this */.  win
8ea0: 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74 3b 20  ShmNode *pNext; 
8eb0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
8ec0: 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 77  in list of all w
8ed0: 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
8ee0: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
8ef0: 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 6e 65  TE_DEBUG.  u8 ne
8f00: 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20  xtShmId;        
8f10: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76        /* Next av
8f20: 61 69 6c 61 62 6c 65 20 77 69 6e 53 68 6d 2e 69  ailable winShm.i
8f30: 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69  d value */.#endi
8f40: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c  f.};../*.** A gl
8f50: 6f 62 61 6c 20 61 72 72 61 79 20 6f 66 20 61 6c  obal array of al
8f60: 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a  l winShmNode obj
8f70: 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ects..**.** The 
8f80: 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
8f90: 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77  ) must be true w
8fa0: 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20  hile reading or 
8fb0: 77 72 69 74 69 6e 67 20 74 68 69 73 20 6c 69 73  writing this lis
8fc0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 77 69 6e  t..*/.static win
8fd0: 53 68 6d 4e 6f 64 65 20 2a 77 69 6e 53 68 6d 4e  ShmNode *winShmN
8fe0: 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  odeList = 0;../*
8ff0: 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73  .** Structure us
9000: 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79  ed internally by
9010: 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63   this VFS to rec
9020: 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66  ord the state of
9030: 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72   an.** open shar
9040: 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63  ed memory connec
9050: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
9060: 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
9070: 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
9080: 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63   when this objec
9090: 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
90a0: 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  .** are read-onl
90b0: 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a  y thereafter:.**
90c0: 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 70 53  .**    winShm.pS
90d0: 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20 77 69 6e  hmNode.**    win
90e0: 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c  Shm.id.**.** All
90f0: 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72   other fields ar
9100: 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54  e read/write.  T
9110: 68 65 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f  he winShm.pShmNo
9120: 64 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62  de->mutex must b
9130: 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20  e held.** while 
9140: 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65  accessing any re
9150: 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e  ad/write fields.
9160: 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68  .*/.struct winSh
9170: 6d 20 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  m {.  winShmNode
9180: 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
9190: 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
91a0: 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62  ng winShmNode ob
91b0: 6a 65 63 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  ject */.  winShm
91c0: 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
91d0: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 77 69 6e       /* Next win
91e0: 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d  Shm with the sam
91f0: 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  e winShmNode */.
9200: 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20    u8 hasMutex;  
9210: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9220: 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20  True if holding 
9230: 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6d  the winShmNode m
9240: 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20 73 68  utex */.  u16 sh
9250: 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20  aredMask;       
9260: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
9270: 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c  shared locks hel
9280: 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d  d */.  u16 exclM
9290: 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
92a0: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63    /* Mask of exc
92b0: 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c  lusive locks hel
92c0: 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d */.#ifdef SQLI
92d0: 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 69 64  TE_DEBUG.  u8 id
92e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
92f0: 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74        /* Id of t
9300: 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
9310: 69 74 68 20 69 74 73 20 77 69 6e 53 68 6d 4e 6f  ith its winShmNo
9320: 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  de */.#endif.};.
9330: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73  ./*.** Constants
9340: 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
9350: 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e  g.*/.#define WIN
9360: 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32  _SHM_BASE   ((22
9370: 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
9380: 4b 29 2a 34 29 20 20 20 20 20 20 20 20 2f 2a 20  K)*4)        /* 
9390: 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20  first lock byte 
93a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53  */.#define WIN_S
93b0: 48 4d 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f 53  HM_DMS    (WIN_S
93c0: 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53  HM_BASE+SQLITE_S
93d0: 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65  HM_NLOCK)  /* de
93e0: 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a  adman switch */.
93f0: 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76  ./*.** Apply adv
9400: 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20  isory locks for 
9410: 61 6c 6c 20 6e 20 62 79 74 65 73 20 62 65 67 69  all n bytes begi
9420: 6e 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a  nning at ofst..*
9430: 2f 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 55  /.#define _SHM_U
9440: 4e 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e 65 20  NLCK  1.#define 
9450: 5f 53 48 4d 5f 52 44 4c 43 4b 20 20 32 0a 23 64  _SHM_RDLCK  2.#d
9460: 65 66 69 6e 65 20 5f 53 48 4d 5f 57 52 4c 43 4b  efine _SHM_WRLCK
9470: 20 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77    3.static int w
9480: 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
9490: 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
94a0: 46 69 6c 65 2c 20 20 20 20 2f 2a 20 41 70 70 6c  File,    /* Appl
94b0: 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20  y locks to this 
94c0: 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f  open shared-memo
94d0: 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ry segment */.  
94e0: 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20  int lockType,   
94f0: 20 20 20 20 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e        /* _SHM_UN
9500: 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c  LCK, _SHM_RDLCK,
9510: 20 6f 72 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a   or _SHM_WRLCK *
9520: 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
9530: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
9540: 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79 74  set to first byt
9550: 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2f 75  e to be locked/u
9560: 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74  nlocked */.  int
9570: 20 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20   nByte          
9580: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9590: 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f 72  bytes to lock or
95a0: 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20   unlock */.){.  
95b0: 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b  OVERLAPPED ovlp;
95c0: 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73  .  DWORD dwFlags
95d0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20  ;.  int rc = 0; 
95e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
95f0: 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c 6f  ult code form Lo
9600: 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28  ck/UnlockFileEx(
9610: 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73  ) */..  /* Acces
9620: 73 20 74 6f 20 74 68 65 20 77 69 6e 53 68 6d 4e  s to the winShmN
9630: 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65  ode object is se
9640: 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20  rialized by the 
9650: 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65  caller */.  asse
9660: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
9670: 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75  x_held(pFile->mu
9680: 74 65 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e  tex) || pFile->n
9690: 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Ref==0 );..  /* 
96a0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c  Initialize the l
96b0: 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72  ocking parameter
96c0: 73 20 2a 2f 0a 20 20 64 77 46 6c 61 67 73 20 3d  s */.  dwFlags =
96d0: 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
96e0: 4d 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20 69 66  MMEDIATELY;.  if
96f0: 28 20 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53  ( lockType == _S
9700: 48 4d 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c 61  HM_WRLCK ) dwFla
9710: 67 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45  gs |= LOCKFILE_E
9720: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 0a  XCLUSIVE_LOCK;..
9730: 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20    memset(&ovlp, 
9740: 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41  0, sizeof(OVERLA
9750: 50 50 45 44 29 29 3b 0a 20 20 6f 76 6c 70 2e 4f  PPED));.  ovlp.O
9760: 66 66 73 65 74 20 3d 20 6f 66 73 74 3b 0a 0a 20  ffset = ofst;.. 
9770: 20 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63 71 75   /* Release/Acqu
9780: 69 72 65 20 74 68 65 20 73 79 73 74 65 6d 2d 6c  ire the system-l
9790: 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  evel lock */.  i
97a0: 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48  f( lockType==_SH
97b0: 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 72  M_UNLCK ){.    r
97c0: 63 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 45 78  c = UnlockFileEx
97d0: 28 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c  (pFile->hFile.h,
97e0: 20 30 2c 20 6e 42 79 74 65 2c 20 30 2c 20 26 6f   0, nByte, 0, &o
97f0: 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  vlp);.  }else{. 
9800: 20 20 20 72 63 20 3d 20 4c 6f 63 6b 46 69 6c 65     rc = LockFile
9810: 45 78 28 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e  Ex(pFile->hFile.
9820: 68 2c 20 64 77 46 6c 61 67 73 2c 20 30 2c 20 6e  h, dwFlags, 0, n
9830: 42 79 74 65 2c 20 30 2c 20 26 6f 76 6c 70 29 3b  Byte, 0, &ovlp);
9840: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 28 72 63 21  .  }.  rc = (rc!
9850: 3d 30 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  =0) ? SQLITE_OK 
9860: 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 0a  : SQLITE_BUSY;..
9870: 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
9880: 4c 4f 43 4b 20 25 64 20 25 73 20 25 73 20 30 78  LOCK %d %s %s 0x
9890: 25 30 38 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 20  %08lx\n", .     
98a0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69        pFile->hFi
98b0: 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  le.h,.          
98c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
98d0: 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
98e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63  ,.           loc
98f0: 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43  kType==_SHM_UNLC
9900: 4b 20 3f 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45  K ? "UnlockFileE
9910: 78 22 20 3a 20 22 4c 6f 63 6b 46 69 6c 65 45 78  x" : "LockFileEx
9920: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 47 65  ",.           Ge
9930: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b 0a  tLastError()));.
9940: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9950: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
9960: 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 6d 65  rences to VFS me
9970: 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63 20  thods */.static 
9980: 69 6e 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c 69  int winOpen(sqli
9990: 74 65 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20 63  te3_vfs*,const c
99a0: 68 61 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69 6c  har*,sqlite3_fil
99b0: 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74  e*,int,int*);.st
99c0: 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65  atic int winDele
99d0: 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  te(sqlite3_vfs *
99e0: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  ,const char*,int
99f0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20  );../*.** Purge 
9a00: 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69  the winShmNodeLi
9a10: 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65  st list of all e
9a20: 6e 74 72 69 65 73 20 77 69 74 68 20 77 69 6e 53  ntries with winS
9a30: 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a  hmNode.nRef==0..
9a40: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
9a50: 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d  t a VFS shared-m
9a60: 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74  emory method; it
9a70: 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 75   is a utility fu
9a80: 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a  nction called.**
9a90: 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d   by VFS shared-m
9aa0: 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a  emory methods..*
9ab0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
9ac0: 6e 53 68 6d 50 75 72 67 65 28 73 71 6c 69 74 65  nShmPurge(sqlite
9ad0: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
9ae0: 20 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20 20   deleteFlag){.  
9af0: 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b  winShmNode **pp;
9b00: 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
9b10: 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e 53  ;.  assert( winS
9b20: 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  hmMutexHeld() );
9b30: 0a 20 20 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e  .  pp = &winShmN
9b40: 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65  odeList;.  while
9b50: 28 20 28 70 20 3d 20 2a 70 70 29 21 3d 30 20 29  ( (p = *pp)!=0 )
9b60: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65  {.    if( p->nRe
9b70: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  f==0 ){.      in
9b80: 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t i;.      if( p
9b90: 2d 3e 6d 75 74 65 78 20 29 20 73 71 6c 69 74 65  ->mutex ) sqlite
9ba0: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e  3_mutex_free(p->
9bb0: 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 66 6f  mutex);.      fo
9bc0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67  r(i=0; i<p->nReg
9bd0: 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ion; i++){.     
9be0: 20 20 20 55 6e 6d 61 70 56 69 65 77 4f 66 46 69     UnmapViewOfFi
9bf0: 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d  le(p->aRegion[i]
9c00: 2e 70 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  .pMap);.        
9c10: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61  CloseHandle(p->a
9c20: 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b  Region[i].hMap);
9c30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9c40: 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68 20 21 3d  f( p->hFile.h !=
9c50: 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f   INVALID_HANDLE_
9c60: 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 20 20 20  VALUE ){.       
9c70: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
9c80: 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
9c90: 20 20 20 77 69 6e 43 6c 6f 73 65 28 28 73 71 6c     winClose((sql
9ca0: 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 2d 3e  ite3_file *)&p->
9cb0: 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  hFile);.        
9cc0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
9cd0: 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
9ce0: 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c 65  }.      if( dele
9cf0: 74 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  teFlag ){.      
9d00: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
9d10: 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
9d20: 20 20 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56      winDelete(pV
9d30: 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65  fs, p->zFilename
9d40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 53 69  , 0);.        Si
9d50: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
9d60: 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ign(0);.      }.
9d70: 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70        *pp = p->p
9d80: 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Next;.      sqli
9d90: 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52 65 67  te3_free(p->aReg
9da0: 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ion);.      sqli
9db0: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
9dc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70   }else{.      pp
9dd0: 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20 20   = &p->pNext;.  
9de0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
9df0: 20 4f 70 65 6e 20 61 20 73 68 61 72 65 64 2d 6d   Open a shared-m
9e00: 65 6d 6f 72 79 20 61 72 65 61 2e 20 20 54 68 69  emory area.  Thi
9e10: 73 20 70 61 72 74 69 63 75 6c 61 72 20 69 6d 70  s particular imp
9e20: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73  lementation uses
9e30: 0a 2a 2a 20 6d 6d 61 70 70 65 64 20 66 69 6c 65  .** mmapped file
9e40: 73 2e 0a 2a 2a 0a 2a 2a 20 7a 4e 61 6d 65 20 69  s..**.** zName i
9e50: 73 20 61 20 66 69 6c 65 6e 61 6d 65 20 75 73 65  s a filename use
9e60: 64 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68  d to identify th
9e70: 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
9e80: 61 72 65 61 2e 20 20 54 68 65 0a 2a 2a 20 69 6d  area.  The.** im
9e90: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65  plementation doe
9ea0: 73 20 6e 6f 74 20 28 61 6e 64 20 70 65 72 68 61  s not (and perha
9eb0: 70 73 20 73 68 6f 75 6c 64 20 6e 6f 74 29 20 75  ps should not) u
9ec0: 73 65 20 74 68 69 73 20 6e 61 6d 65 0a 2a 2a 20  se this name.** 
9ed0: 64 69 72 65 63 74 6c 79 2c 20 62 75 74 20 72 61  directly, but ra
9ee0: 74 68 65 72 20 75 73 65 20 69 74 20 61 73 20 61  ther use it as a
9ef0: 20 74 65 6d 70 6c 61 74 65 20 66 6f 72 20 66 69   template for fi
9f00: 6e 64 69 6e 67 20 61 6e 20 61 70 70 72 6f 70 72  nding an appropr
9f10: 69 61 74 65 0a 2a 2a 20 6e 61 6d 65 20 66 6f 72  iate.** name for
9f20: 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
9f30: 72 79 20 73 74 6f 72 61 67 65 2e 20 20 49 6e 20  ry storage.  In 
9f40: 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  this implementat
9f50: 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 73 74 72 69  ion, the.** stri
9f60: 6e 67 20 22 2d 69 6e 64 65 78 22 20 69 73 20 61  ng "-index" is a
9f70: 70 70 65 6e 64 65 64 20 74 6f 20 7a 4e 61 6d 65  ppended to zName
9f80: 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65   and used as the
9f90: 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20   name of the.** 
9fa0: 6d 6d 61 70 70 65 64 20 66 69 6c 65 2e 0a 2a 2a  mmapped file..**
9fb0: 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67  .** When opening
9fc0: 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65   a new shared-me
9fd0: 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f  mory file, if no
9fe0: 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73   other instances
9ff0: 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65   of that.** file
a000: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f   are currently o
a010: 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f  pen, in this pro
a020: 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72  cess or in other
a030: 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e   processes, then
a040: 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73  .** the file mus
a050: 74 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  t be truncated t
a060: 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72  o zero length or
a070: 20 68 61 76 65 20 69 74 73 20 68 65 61 64 65 72   have its header
a080: 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
a090: 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4f 70  tic int winShmOp
a0a0: 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  en(.  sqlite3_fi
a0b0: 6c 65 20 2a 66 64 20 20 20 20 20 20 2f 2a 20 54  le *fd      /* T
a0c0: 68 65 20 66 69 6c 65 20 74 6f 20 77 68 69 63 68  he file to which
a0d0: 20 74 6f 20 61 74 74 61 63 68 20 73 68 61 72 65   to attach share
a0e0: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20  d memory */.){. 
a0f0: 20 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20   struct winFile 
a100: 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 20 20  *pDbFd;         
a110: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
a120: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 74 74 61  to which to atta
a130: 63 68 20 53 48 4d 20 2a 2f 0a 20 20 73 74 72 75  ch SHM */.  stru
a140: 63 74 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20  ct winShm *p;   
a150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a160: 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
a170: 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
a180: 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  .  struct winShm
a190: 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d  Node *pShmNode =
a1a0: 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64   0;   /* The und
a1b0: 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20  erlying mmapped 
a1c0: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  file */.  int rc
a1d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a1f0: 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
a200: 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f   struct winShmNo
a210: 64 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  de *pNew;       
a220: 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c      /* Newly all
a230: 6f 63 61 74 65 64 20 77 69 6e 53 68 6d 4e 6f 64  ocated winShmNod
a240: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  e */.  int nName
a250: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
a270: 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20 62 79  e of zName in by
a280: 74 65 73 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20  tes */..  pDbFd 
a290: 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a  = (winFile*)fd;.
a2a0: 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d    assert( pDbFd-
a2b0: 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f  >pShm==0 );    /
a2c0: 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79  * Not previously
a2d0: 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a   opened */..  /*
a2e0: 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
a2f0: 66 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c 69  for the new sqli
a300: 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20  te3_shm object. 
a310: 20 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69 76   Also speculativ
a320: 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  ely.  ** allocat
a330: 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65  e space for a ne
a340: 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64  w winShmNode and
a350: 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   filename..  */.
a360: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    p = sqlite3_ma
a370: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29  lloc( sizeof(*p)
a380: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
a390: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
a3a0: 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  OMEM;.  memset(p
a3b0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
a3c0: 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69  ;.  nName = sqli
a3d0: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 62 46  te3Strlen30(pDbF
a3e0: 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65  d->zPath);.  pNe
a3f0: 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  w = sqlite3_mall
a400: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d  oc( sizeof(*pShm
a410: 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20  Node) + nName + 
a420: 31 35 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  15 );.  if( pNew
a430: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
a440: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
a450: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
a460: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  MEM;.  }.  memse
a470: 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f  t(pNew, 0, sizeo
a480: 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 70 4e 65  f(*pNew));.  pNe
a490: 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28  w->zFilename = (
a4a0: 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
a4b0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
a4c0: 74 66 28 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e 65  tf(nName+15, pNe
a4d0: 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 25  w->zFilename, "%
a4e0: 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a  s-shm", pDbFd->z
a4f0: 50 61 74 68 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  Path);..  /* Loo
a500: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  k to see if ther
a510: 65 20 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67  e is an existing
a520: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74   winShmNode that
a530: 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 20   can be used..  
a540: 2a 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e  ** If no matchin
a550: 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72  g winShmNode cur
a560: 72 65 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63  rently exists, c
a570: 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e  reate a new one.
a580: 0a 20 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e  .  */.  winShmEn
a590: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f  terMutex();.  fo
a5a0: 72 28 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e  r(pShmNode = win
a5b0: 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68  ShmNodeList; pSh
a5c0: 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d  mNode; pShmNode=
a5d0: 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29  pShmNode->pNext)
a5e0: 7b 0a 20 20 20 20 2f 2a 20 54 42 44 20 6e 65 65  {.    /* TBD nee
a5f0: 64 20 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74  d to come up wit
a600: 68 20 62 65 74 74 65 72 20 6d 61 74 63 68 20 68  h better match h
a610: 65 72 65 2e 20 20 50 65 72 68 61 70 73 0a 20 20  ere.  Perhaps.  
a620: 20 20 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49 44    ** use FILE_ID
a630: 5f 42 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53  _BOTH_DIR_INFO S
a640: 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  tructure..    */
a650: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
a660: 53 74 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65  StrICmp(pShmNode
a670: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65  ->zFilename, pNe
a680: 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30  w->zFilename)==0
a690: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
a6a0: 69 66 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a  if( pShmNode ){.
a6b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
a6c0: 28 70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pNew);.  }else{
a6d0: 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  .    pShmNode = 
a6e0: 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d  pNew;.    pNew =
a6f0: 20 30 3b 0a 20 20 20 20 28 28 77 69 6e 46 69 6c   0;.    ((winFil
a700: 65 2a 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  e*)(&pShmNode->h
a710: 46 69 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41  File))->h = INVA
a720: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
a730: 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ;.    pShmNode->
a740: 70 4e 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f  pNext = winShmNo
a750: 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e 53  deList;.    winS
a760: 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68  hmNodeList = pSh
a770: 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20 70 53 68 6d  mNode;..    pShm
a780: 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71  Node->mutex = sq
a790: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
a7a0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
a7b0: 41 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53  AST);.    if( pS
a7c0: 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30  hmNode->mutex==0
a7d0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
a7e0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
a7f0: 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
a800: 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _err;.    }.    
a810: 72 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62  rc = winOpen(pDb
a820: 46 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20 20  Fd->pVfs,.      
a830: 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e             pShmN
a840: 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ode->zFilename, 
a850: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a860: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
a870: 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20 20  (UTF-8) */.     
a880: 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
a890: 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68 6d  ite3_file*)&pShm
a8a0: 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a  Node->hFile,  /*
a8b0: 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72   File handle her
a8c0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
a8d0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
a8e0: 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
a8f0: 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
a900: 2c 20 2f 2a 20 4d 6f 64 65 20 66 6c 61 67 73 20  , /* Mode flags 
a910: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
a920: 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20      0);.    if( 
a930: 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
a940: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
a950: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
a960: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
a970: 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
a980: 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
a990: 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
a9a0: 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
a9b0: 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e  ing the dead-man
a9c0: 20 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20   switch..    ** 
a9d0: 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65  If not, truncate
a9e0: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72   the file to zer
a9f0: 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a  o length. .    *
aa00: 2f 0a 20 20 20 20 69 66 28 20 77 69 6e 53 68 6d  /.    if( winShm
aa10: 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
aa20: 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c  ode, _SHM_WRLCK,
aa30: 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29   WIN_SHM_DMS, 1)
aa40: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
aa50: 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75       rc = winTru
aa60: 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66  ncate((sqlite3_f
aa70: 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  ile *)&pShmNode-
aa80: 3e 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20  >hFile, 0);.    
aa90: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
aaa0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
aab0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
aac0: 5f 53 48 4d 4f 50 45 4e 3b 0a 20 20 20 20 20 20  _SHMOPEN;.      
aad0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
aae0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
aaf0: 0a 20 20 20 20 20 20 77 69 6e 53 68 6d 53 79 73  .      winShmSys
ab00: 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
ab10: 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49  , _SHM_UNLCK, WI
ab20: 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20  N_SHM_DMS, 1);. 
ab30: 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d       rc = winShm
ab40: 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
ab50: 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c  ode, _SHM_RDLCK,
ab60: 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29   WIN_SHM_DMS, 1)
ab70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ab80: 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70  rc ) goto shm_op
ab90: 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f  en_err;.  }..  /
aba0: 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63  * Make the new c
abb0: 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c  onnection a chil
abc0: 64 20 6f 66 20 74 68 65 20 77 69 6e 53 68 6d 4e  d of the winShmN
abd0: 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d  ode */.  p->pShm
abe0: 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  Node = pShmNode;
abf0: 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53  .  p->pNext = pS
ac00: 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a  hmNode->pFirst;.
ac10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
ac20: 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53  BUG.  p->id = pS
ac30: 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49  hmNode->nextShmI
ac40: 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53  d++;.#endif.  pS
ac50: 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d  hmNode->pFirst =
ac60: 20 70 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e   p;.  pShmNode->
ac70: 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d  nRef++;.  pDbFd-
ac80: 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e  >pShm = p;.  win
ac90: 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
aca0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
acb0: 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  _OK;..  /* Jump 
acc0: 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f  here on any erro
acd0: 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72  r */.shm_open_er
ace0: 72 3a 0a 20 20 77 69 6e 53 68 6d 53 79 73 74 65  r:.  winShmSyste
acf0: 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
ad00: 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f  _SHM_UNLCK, WIN_
ad10: 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 77  SHM_DMS, 1);.  w
ad20: 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  inShmPurge(pDbFd
ad30: 2d 3e 70 56 66 73 2c 20 30 29 3b 20 20 20 20 20  ->pVfs, 0);     
ad40: 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72   /* This call fr
ad50: 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20  ees pShmNode if 
ad60: 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71  required */.  sq
ad70: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
ad80: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
ad90: 65 77 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61  ew);.  winShmLea
ada0: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
adb0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
adc0: 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74   Close a connect
add0: 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65  ion to shared-me
ade0: 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68  mory.  Delete th
adf0: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a  e underlying .**
ae00: 20 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65   storage if dele
ae10: 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a  teFlag is true..
ae20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
ae30: 6e 53 68 6d 43 6c 6f 73 65 28 0a 20 20 73 71 6c  nShmClose(.  sql
ae40: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
ae50: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
ae60: 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ase holding shar
ae70: 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  ed memory */.  i
ae80: 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20  nt deleteFlag   
ae90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c            /* Del
aea0: 65 74 65 20 61 66 74 65 72 20 63 6c 6f 73 69 6e  ete after closin
aeb0: 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  g if true */.){.
aec0: 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64    winFile *pDbFd
aed0: 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ;       /* Datab
aee0: 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ase holding shar
aef0: 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77  ed-memory */.  w
af00: 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20  inShm *p;       
af10: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
af20: 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f  ection to be clo
af30: 73 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e  sed */.  winShmN
af40: 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f  ode *pShmNode; /
af50: 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
af60: 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
af70: 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ile */.  winShm 
af80: 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 2f  **pp;          /
af90: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
afa0: 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  er sibling conne
afb0: 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44 62  ctions */..  pDb
afc0: 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66  Fd = (winFile*)f
afd0: 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e  d;.  p = pDbFd->
afe0: 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pShm;.  if( p==0
aff0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
b000: 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20  _OK;.  pShmNode 
b010: 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a  = p->pShmNode;..
b020: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e    /* Remove conn
b030: 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68  ection p from th
b040: 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74  e set of connect
b050: 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a  ions associated.
b060: 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f    ** with pShmNo
b070: 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
b080: 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
b090: 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
b0a0: 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65  for(pp=&pShmNode
b0b0: 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21  ->pFirst; (*pp)!
b0c0: 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d  =p; pp = &(*pp)-
b0d0: 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20  >pNext){}.  *pp 
b0e0: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f  = p->pNext;..  /
b0f0: 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65  * Free the conne
b100: 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c  ction p */.  sql
b110: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
b120: 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b  pDbFd->pShm = 0;
b130: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
b140: 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
b150: 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49  >mutex);..  /* I
b160: 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  f pShmNode->nRef
b170: 20 68 61 73 20 72 65 61 63 68 65 64 20 30 2c 20   has reached 0, 
b180: 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75  then close the u
b190: 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73  nderlying.  ** s
b1a0: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
b1b0: 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53  e, too */.  winS
b1c0: 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  hmEnterMutex();.
b1d0: 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
b1e0: 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  de->nRef>0 );.  
b1f0: 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d  pShmNode->nRef--
b200: 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ;.  if( pShmNode
b210: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
b220: 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62   winShmPurge(pDb
b230: 46 64 2d 3e 70 56 66 73 2c 20 64 65 6c 65 74 65  Fd->pVfs, delete
b240: 46 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 77 69 6e  Flag);.  }.  win
b250: 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
b260: 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
b270: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
b280: 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73  hange the lock s
b290: 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65  tate for a share
b2a0: 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
b2b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b2c0: 77 69 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71  winShmLock(.  sq
b2d0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
b2e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
b2f0: 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e  base file holdin
b300: 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
b310: 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  ory */.  int ofs
b320: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
b330: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63      /* First loc
b340: 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  k to acquire or 
b350: 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
b360: 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   n,             
b370: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b380: 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63  r of locks to ac
b390: 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65  quire or release
b3a0: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
b3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3c0: 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
b3d0: 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a  ith the lock */.
b3e0: 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44  ){.  winFile *pD
b3f0: 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  bFd = (winFile*)
b400: 66 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  fd;        /* Co
b410: 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67  nnection holding
b420: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
b430: 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20  /.  winShm *p = 
b440: 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20  pDbFd->pShm;    
b450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
b460: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62   shared memory b
b470: 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20  eing locked */. 
b480: 20 77 69 6e 53 68 6d 20 2a 70 58 3b 20 20 20 20   winShm *pX;    
b490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4a0: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
b4b0: 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73  oping over all s
b4c0: 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 77 69 6e  iblings */.  win
b4d0: 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
b4e0: 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
b4f0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
b500: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
b510: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
b520: 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  lt code */.  u16
b530: 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20   mask;          
b540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b550: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f     /* Mask of lo
b560: 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72  cks to take or r
b570: 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73  elease */..  ass
b580: 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20  ert( ofst>=0 && 
b590: 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53  ofst+n<=SQLITE_S
b5a0: 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  HM_NLOCK );.  as
b5b0: 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20  sert( n>=1 );.  
b5c0: 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28  assert( flags==(
b5d0: 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
b5e0: 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  | SQLITE_SHM_SHA
b5f0: 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  RED).       || f
b600: 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
b610: 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  M_LOCK | SQLITE_
b620: 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20  SHM_EXCLUSIVE). 
b630: 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
b640: 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  (SQLITE_SHM_UNLO
b650: 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
b660: 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c  SHARED).       |
b670: 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
b680: 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
b690: 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
b6a0: 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  VE) );.  assert(
b6b0: 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20   n==1 || (flags 
b6c0: 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  & SQLITE_SHM_EXC
b6d0: 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a 20  LUSIVE)!=0 );.. 
b6e0: 20 6d 61 73 6b 20 3d 20 28 75 31 36 29 28 28 31   mask = (u16)((1
b6f0: 55 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28  U<<(ofst+n)) - (
b700: 31 55 3c 3c 6f 66 73 74 29 29 3b 0a 20 20 61 73  1U<<ofst));.  as
b710: 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73  sert( n>1 || mas
b720: 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a  k==(1<<ofst) );.
b730: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
b740: 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
b750: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c  mutex);.  if( fl
b760: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
b770: 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75  _UNLOCK ){.    u
b780: 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20  16 allMask = 0; 
b790: 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73  /* Mask of locks
b7a0: 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
b7b0: 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65  s */..    /* See
b7c0: 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73   if any siblings
b7d0: 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20   hold this same 
b7e0: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28  lock */.    for(
b7f0: 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
b800: 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
b810: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
b820: 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e  ( pX==p ) contin
b830: 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ue;.      assert
b840: 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
b850: 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70  & (p->exclMask|p
b860: 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d  ->sharedMask))==
b870: 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61  0 );.      allMa
b880: 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64  sk |= pX->shared
b890: 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Mask;.    }..   
b8a0: 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73   /* Unlock the s
b8b0: 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b  ystem-level lock
b8c0: 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61  s */.    if( (ma
b8d0: 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30  sk & allMask)==0
b8e0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
b8f0: 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
b900: 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55  pShmNode, _SHM_U
b910: 4e 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53  NLCK, ofst+WIN_S
b920: 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
b930: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
b940: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
b950: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f    }..    /* Undo
b960: 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73   the local locks
b970: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
b980: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b990: 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26     p->exclMask &
b9a0: 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  = ~mask;.      p
b9b0: 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20  ->sharedMask &= 
b9c0: 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20  ~mask;.    } .  
b9d0: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
b9e0: 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  & SQLITE_SHM_SHA
b9f0: 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61  RED ){.    u16 a
ba00: 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f  llShared = 0;  /
ba10: 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73  * Union of locks
ba20: 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
ba30: 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20  ions other than 
ba40: 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  "p" */..    /* F
ba50: 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 68  ind out which sh
ba60: 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61  ared locks are a
ba70: 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 73  lready held by s
ba80: 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
ba90: 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e  ns..    ** If an
baa0: 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64  y sibling alread
bab0: 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75  y holds an exclu
bac0: 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68  sive lock, go ah
bad0: 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  ead and return. 
bae0: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53     ** SQLITE_BUS
baf0: 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  Y..    */.    fo
bb00: 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
bb10: 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
bb20: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
bb30: 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  if( (pX->exclMas
bb40: 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a  k & mask)!=0 ){.
bb50: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
bb60: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
bb70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
bb80: 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64  .      allShared
bb90: 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
bba0: 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
bbb0: 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63  * Get shared loc
bbc0: 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d  ks at the system
bbd0: 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73   level, if neces
bbe0: 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20  sary */.    if( 
bbf0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
bc00: 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53  .      if( (allS
bc10: 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30  hared & mask)==0
bc20: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
bc30: 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
bc40: 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
bc50: 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e  _RDLCK, ofst+WIN
bc60: 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
bc70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
bc80: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
bc90: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
bca0: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68  }..    /* Get th
bcb0: 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c  e local shared l
bcc0: 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
bcd0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
bce0: 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
bcf0: 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
bd00: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
bd10: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f   /* Make sure no
bd20: 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
bd30: 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20  ions hold locks 
bd40: 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20  that will block 
bd50: 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  this.    ** lock
bd60: 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65  .  If any do, re
bd70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
bd80: 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20   right away..   
bd90: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
bda0: 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
bdb0: 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
bdc0: 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t){.      if( (p
bdd0: 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61  X->exclMask & ma
bde0: 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73  sk)!=0 || (pX->s
bdf0: 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b  haredMask & mask
be00: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
be10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
be20: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
be30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
be40: 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65   .    /* Get the
be50: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
be60: 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
be70: 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73  evel.  Then if s
be80: 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a  uccessful.    **
be90: 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c   also mark the l
bea0: 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ocal connection 
beb0: 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e  as being locked.
bec0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
bed0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
bee0: 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53  .      rc = winS
bef0: 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
bf00: 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43  mNode, _SHM_WRLC
bf10: 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f  K, ofst+WIN_SHM_
bf20: 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
bf30: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
bf40: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
bf50: 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d  ert( (p->sharedM
bf60: 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
bf70: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63  ;.        p->exc
bf80: 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
bf90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
bfa0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
bfb0: 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
bfc0: 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41  >mutex);.  OSTRA
bfd0: 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68  CE(("SHM-LOCK sh
bfe0: 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67  mid-%d, pid-%d g
bff0: 6f 74 20 25 30 33 78 2c 25 30 33 78 20 25 73 5c  ot %03x,%03x %s\
c000: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
c010: 2d 3e 69 64 2c 20 28 69 6e 74 29 47 65 74 43 75  ->id, (int)GetCu
c020: 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
c030: 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c  , p->sharedMask,
c040: 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c 0a 20 20   p->exclMask,.  
c050: 20 20 20 20 20 20 20 20 20 72 63 20 3f 20 22 66           rc ? "f
c060: 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b  ailed" : "ok"));
c070: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
c080: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
c090: 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65   a memory barrie
c0a0: 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63  r or memory fenc
c0b0: 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  e on shared memo
c0c0: 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ry.  .**.** All 
c0d0: 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73  loads and stores
c0e0: 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68   begun before th
c0f0: 65 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63  e barrier must c
c100: 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a  omplete before.*
c110: 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74  * any load or st
c120: 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20  ore begun after 
c130: 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a  the barrier..*/.
c140: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
c150: 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c  hmBarrier(.  sql
c160: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20  ite3_file *fd   
c170: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
c180: 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  se holding the s
c190: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
c1a0: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
c1b0: 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 2f 2a 20  METER(fd);.  /* 
c1c0: 4d 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b  MemoryBarrier();
c1d0: 20 2f 2f 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   // does not wor
c1e0: 6b 20 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  k -- do not know
c1f0: 20 77 68 79 20 6e 6f 74 20 2a 2f 0a 20 20 77 69   why not */.  wi
c200: 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
c210: 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  ;.  winShmLeaveM
c220: 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  utex();.}../*.**
c230: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
c240: 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
c250: 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
c260: 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f  region iRegion o
c270: 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64  f the .** shared
c280: 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74  -memory associat
c290: 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
c2a0: 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68  base file fd. Sh
c2b0: 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
c2c0: 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62  ons .** are numb
c2d0: 65 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72  ered starting fr
c2e0: 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68  om zero. Each sh
c2f0: 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
c300: 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a  on is szRegion .
c310: 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
c320: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
c330: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
c340: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
c350: 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73  urned and *pp is
c360: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
c370: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
c380: 66 20 74 68 65 20 69 73 57 72 69 74 65 20 70 61  f the isWrite pa
c390: 72 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64  rameter is 0 and
c3a0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
c3b0: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  hared-memory.** 
c3c0: 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62  region has not b
c3d0: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62  een allocated (b
c3e0: 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e  y any client, in
c3f0: 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e  cluding one runn
c400: 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61  ing in a.** sepa
c410: 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74  rate process), t
c420: 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74  hen *pp is set t
c430: 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54  o NULL and SQLIT
c440: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
c450: 66 20 0a 2a 2a 20 69 73 57 72 69 74 65 20 69 73  f .** isWrite is
c460: 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
c470: 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
c480: 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
c490: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a   has not yet .**
c4a0: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
c4b0: 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64   it is allocated
c4c0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
c4d0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
c4e0: 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
c4f0: 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  gion has already
c500: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
c510: 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  or is allocated 
c520: 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  by.** this call 
c530: 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
c540: 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d  ve, then it is m
c550: 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
c560: 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64  processes .** ad
c570: 64 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20  dress space (if 
c580: 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
c590: 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74  y), *pp is set t
c5a0: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d  o point to the m
c5b0: 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79  apped .** memory
c5c0: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
c5d0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
c5e0: 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70  ic int winShmMap
c5f0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
c600: 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20   *fd,           
c610: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70      /* Handle op
c620: 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66  en on database f
c630: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ile */.  int iRe
c640: 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
c650: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
c660: 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a  on to retrieve *
c670: 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  /.  int szRegion
c680: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c690: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
c6a0: 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
c6b0: 69 73 57 72 69 74 65 2c 20 20 20 20 20 20 20 20  isWrite,        
c6c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c6d0: 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69  rue to extend fi
c6e0: 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  le if necessary 
c6f0: 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69  */.  void volati
c700: 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20  le **pp         
c710: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70       /* OUT: Map
c720: 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  ped memory */.){
c730: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  .  winFile *pDbF
c740: 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
c750: 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20  ;.  winShm *p = 
c760: 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77  pDbFd->pShm;.  w
c770: 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
c780: 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
c790: 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
c7a0: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69  LITE_OK;..  sqli
c7b0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
c7c0: 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
c7d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52 65  ;.  assert( szRe
c7e0: 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e  gion==pShmNode->
c7f0: 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d  szRegion || pShm
c800: 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30  Node->nRegion==0
c810: 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e   );..  if( pShmN
c820: 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52  ode->nRegion<=iR
c830: 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73 74 72  egion ){.    str
c840: 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 61  uct ShmRegion *a
c850: 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
c860: 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e 5b 5d  /* New aRegion[]
c870: 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e   array */.    in
c880: 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69  t nByte = (iRegi
c890: 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20  on+1)*szRegion; 
c8a0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75   /* Minimum requ
c8b0: 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a  ired file size *
c8c0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  /.    sqlite3_in
c8d0: 74 36 34 20 73 7a 3b 20 20 20 20 20 20 20 20 20  t64 sz;         
c8e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
c8f0: 65 6e 74 20 73 69 7a 65 20 6f 66 20 77 61 6c 2d  ent size of wal-
c900: 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a 0a 20  index file */.. 
c910: 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52     pShmNode->szR
c920: 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e  egion = szRegion
c930: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  ;..    /* The re
c940: 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69  quested region i
c950: 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74  s not mapped int
c960: 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
c970: 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a   address space..
c980: 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20      ** Check to 
c990: 73 65 65 20 69 66 20 69 74 20 68 61 73 20 62 65  see if it has be
c9a0: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e  en allocated (i.
c9b0: 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e  e. if the wal-in
c9c0: 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20  dex file is.    
c9d0: 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  ** large enough 
c9e0: 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72  to contain the r
c9f0: 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29  equested region)
ca00: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
ca10: 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28 73  = winFileSize((s
ca20: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
ca30: 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
ca40: 26 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &sz);.    if( rc
ca50: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
ca60: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
ca70: 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a  _IOERR_SHMSIZE;.
ca80: 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
ca90: 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ge_out;.    }.. 
caa0: 20 20 20 69 66 28 20 73 7a 3c 6e 42 79 74 65 20     if( sz<nByte 
cab0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
cac0: 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
cad0: 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74   region does not
cae0: 20 65 78 69 73 74 2e 20 49 66 20 69 73 57 72 69   exist. If isWri
caf0: 74 65 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20  te is set to.   
cb00: 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74     ** zero, exit
cb10: 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c   early. *pp will
cb20: 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   be set to NULL 
cb30: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
cb40: 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a  turned..      **
cb50: 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e  .      ** Altern
cb60: 61 74 69 76 65 6c 79 2c 20 69 66 20 69 73 57 72  atively, if isWr
cb70: 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ite is non-zero,
cb80: 20 75 73 65 20 66 74 72 75 6e 63 61 74 65 28 29   use ftruncate()
cb90: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20   to allocate.   
cba0: 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73     ** the reques
cbb0: 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
cbc0: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
cbd0: 20 20 69 66 28 20 21 69 73 57 72 69 74 65 20 29    if( !isWrite )
cbe0: 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
cbf0: 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  t;.      rc = wi
cc00: 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c 69 74  nTruncate((sqlit
cc10: 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e  e3_file *)&pShmN
cc20: 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 74  ode->hFile, nByt
cc30: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
cc40: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
cc50: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
cc60: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
cc70: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
cc80: 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
cc90: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
cca0: 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73  * Map the reques
ccb0: 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
ccc0: 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  n into this proc
ccd0: 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70  esses address sp
cce0: 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65  ace. */.    apNe
ccf0: 77 20 3d 20 28 73 74 72 75 63 74 20 53 68 6d 52  w = (struct ShmR
cd00: 65 67 69 6f 6e 20 2a 29 73 71 6c 69 74 65 33 5f  egion *)sqlite3_
cd10: 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  realloc(.       
cd20: 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
cd30: 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a  on, (iRegion+1)*
cd40: 73 69 7a 65 6f 66 28 61 70 4e 65 77 5b 30 5d 29  sizeof(apNew[0])
cd50: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
cd60: 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  !apNew ){.      
cd70: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
cd80: 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  R_NOMEM;.      g
cd90: 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
cda0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e  .    }.    pShmN
cdb0: 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 20 3d 20 61  ode->aRegion = a
cdc0: 70 4e 65 77 3b 0a 0a 20 20 20 20 77 68 69 6c 65  pNew;..    while
cdd0: 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
cde0: 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a  ion<=iRegion ){.
cdf0: 20 20 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61        HANDLE hMa
ce00: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
ce10: 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70 70 69 6e    /* file-mappin
ce20: 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  g handle */.    
ce30: 20 20 76 6f 69 64 20 2a 70 4d 61 70 20 3d 20 30    void *pMap = 0
ce40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
ce50: 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 72   Mapped memory r
ce60: 65 67 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 0a 20  egion */.     . 
ce70: 20 20 20 20 20 68 4d 61 70 20 3d 20 43 72 65 61       hMap = Crea
ce80: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 28 70 53  teFileMapping(pS
ce90: 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c  hmNode->hFile.h,
cea0: 20 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c   .          NULL
ceb0: 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45  , PAGE_READWRITE
cec0: 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c  , 0, nByte, NULL
ced0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
cee0: 69 66 28 20 68 4d 61 70 20 29 7b 0a 20 20 20 20  if( hMap ){.    
cef0: 20 20 20 20 70 4d 61 70 20 3d 20 4d 61 70 56 69      pMap = MapVi
cf00: 65 77 4f 66 46 69 6c 65 28 68 4d 61 70 2c 20 46  ewOfFile(hMap, F
cf10: 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20  ILE_MAP_WRITE | 
cf20: 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20  FILE_MAP_READ,. 
cf30: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
cf40: 20 6e 42 79 74 65 0a 20 20 20 20 20 20 20 20 29   nByte.        )
cf50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
cf60: 69 66 28 20 21 70 4d 61 70 20 29 7b 0a 20 20 20  if( !pMap ){.   
cf70: 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c       pShmNode->l
cf80: 61 73 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61  astErrno = GetLa
cf90: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
cfa0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
cfb0: 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 69 66  OERR;.        if
cfc0: 28 20 68 4d 61 70 20 29 20 43 6c 6f 73 65 48 61  ( hMap ) CloseHa
cfd0: 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20 20  ndle(hMap);.    
cfe0: 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
cff0: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _out;.      }.. 
d000: 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
d010: 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d  Region[pShmNode-
d020: 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d  >nRegion].pMap =
d030: 20 70 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68   pMap;.      pSh
d040: 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70  mNode->aRegion[p
d050: 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
d060: 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a 20  ].hMap = hMap;. 
d070: 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e       pShmNode->n
d080: 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a  Region++;.    }.
d090: 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74    }..shmpage_out
d0a0: 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  :.  if( pShmNode
d0b0: 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f  ->nRegion>iRegio
d0c0: 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70  n ){.    char *p
d0d0: 20 3d 20 28 63 68 61 72 20 2a 29 70 53 68 6d 4e   = (char *)pShmN
d0e0: 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 69 52 65  ode->aRegion[iRe
d0f0: 67 69 6f 6e 5d 2e 70 4d 61 70 3b 0a 20 20 20 20  gion].pMap;.    
d100: 2a 70 70 20 3d 20 28 76 6f 69 64 20 2a 29 26 70  *pp = (void *)&p
d110: 5b 69 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f  [iRegion*szRegio
d120: 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  n];.  }else{.   
d130: 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   *pp = 0;.  }.  
d140: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
d150: 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
d160: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
d170: 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20 64 65  c;.}..#else.# de
d180: 66 69 6e 65 20 77 69 6e 53 68 6d 4f 70 65 6e 20  fine winShmOpen 
d190: 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69     0.# define wi
d1a0: 6e 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20  nShmLock    0.# 
d1b0: 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4d 61 70  define winShmMap
d1c0: 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20       0.# define 
d1d0: 77 69 6e 53 68 6d 42 61 72 72 69 65 72 20 30 0a  winShmBarrier 0.
d1e0: 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 43  # define winShmC
d1f0: 6c 6f 73 65 20 20 20 30 0a 23 65 6e 64 69 66 20  lose   0.#endif 
d200: 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
d210: 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f  E_OMIT_WAL */../
d220: 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74  *.** Here ends t
d230: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
d240: 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33  n of all sqlite3
d250: 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a  _file methods..*
d260: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
d270: 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c  ******** End sql
d280: 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64  ite3_file Method
d290: 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
d2a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d2b0: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
d2c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d2d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d2e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d2f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d300: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65  /../*.** This ve
d310: 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c  ctor defines all
d320: 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61   the methods tha
d330: 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e  t can operate on
d340: 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66   an.** sqlite3_f
d350: 69 6c 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a  ile for win32..*
d360: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
d370: 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
d380: 73 20 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20  s winIoMethod = 
d390: 7b 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20 20  {.  2,          
d3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d3b0: 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77   iVersion */.  w
d3c0: 69 6e 43 6c 6f 73 65 2c 0a 20 20 77 69 6e 52 65  inClose,.  winRe
d3d0: 61 64 2c 0a 20 20 77 69 6e 57 72 69 74 65 2c 0a  ad,.  winWrite,.
d3e0: 20 20 77 69 6e 54 72 75 6e 63 61 74 65 2c 0a 20    winTruncate,. 
d3f0: 20 77 69 6e 53 79 6e 63 2c 0a 20 20 77 69 6e 46   winSync,.  winF
d400: 69 6c 65 53 69 7a 65 2c 0a 20 20 77 69 6e 4c 6f  ileSize,.  winLo
d410: 63 6b 2c 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c  ck,.  winUnlock,
d420: 0a 20 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72  .  winCheckReser
d430: 76 65 64 4c 6f 63 6b 2c 0a 20 20 77 69 6e 46 69  vedLock,.  winFi
d440: 6c 65 43 6f 6e 74 72 6f 6c 2c 0a 20 20 77 69 6e  leControl,.  win
d450: 53 65 63 74 6f 72 53 69 7a 65 2c 0a 20 20 77 69  SectorSize,.  wi
d460: 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  nDeviceCharacter
d470: 69 73 74 69 63 73 2c 0a 20 20 77 69 6e 53 68 6d  istics,.  winShm
d480: 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
d490: 20 20 20 2f 2a 20 78 53 68 6d 4f 70 65 6e 20 2a     /* xShmOpen *
d4a0: 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20  /.  winShmLock, 
d4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d4c0: 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69  xShmLock */.  wi
d4d0: 6e 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20  nShmMap,        
d4e0: 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
d4f0: 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72  p */.  winShmBar
d500: 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  rier,           
d510: 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a  /* xShmBarrier *
d520: 2f 0a 20 20 77 69 6e 53 68 6d 43 6c 6f 73 65 20  /.  winShmClose 
d530: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d540: 78 53 68 6d 43 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a  xShmClose */.};.
d550: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
d560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
d5a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d5b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69  *********** sqli
d5c0: 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20  te3_vfs methods 
d5d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d5e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
d5f0: 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e  ** This division
d600: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d   contains the im
d610: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
d620: 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a  methods on the.*
d630: 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62  * sqlite3_vfs ob
d640: 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ject..*/../*.** 
d650: 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20  Convert a UTF-8 
d660: 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 77 68  filename into wh
d670: 61 74 65 76 65 72 20 66 6f 72 6d 20 74 68 65 20  atever form the 
d680: 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70  underlying.** op
d690: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 77  erating system w
d6a0: 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73 20 69  ants filenames i
d6b0: 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  n.  Space to hol
d6c0: 64 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  d the result.** 
d6d0: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
d6e0: 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74   malloc and must
d6f0: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
d700: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
d710: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
d720: 76 6f 69 64 20 2a 63 6f 6e 76 65 72 74 55 74 66  void *convertUtf
d730: 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20  8Filename(const 
d740: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
d750: 7b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  {.  void *zConve
d760: 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20  rted = 0;.  if( 
d770: 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43  isNT() ){.    zC
d780: 6f 6e 76 65 72 74 65 64 20 3d 20 75 74 66 38 54  onverted = utf8T
d790: 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
d7a0: 6d 65 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69  me);./* isNT() i
d7b0: 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53  s 1 if SQLITE_OS
d7c0: 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68  _WINCE==1, so th
d7d0: 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72  is else is never
d7e0: 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2f 0a 23   executed. .*/.#
d7f0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
d800: 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20  CE==0.  }else{. 
d810: 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
d820: 75 74 66 38 54 6f 4d 62 63 73 28 7a 46 69 6c 65  utf8ToMbcs(zFile
d830: 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  name);.#endif.  
d840: 7d 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69  }.  /* caller wi
d850: 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ll handle out of
d860: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74   memory */.  ret
d870: 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  urn zConverted;.
d880: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
d890: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
d8a0: 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20   name in zBuf.  
d8b0: 7a 42 75 66 20 6d 75 73 74 20 62 65 20 62 69 67  zBuf must be big
d8c0: 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20 68 6f   enough to.** ho
d8d0: 6c 64 20 61 74 20 70 56 66 73 2d 3e 6d 78 50 61  ld at pVfs->mxPa
d8e0: 74 68 6e 61 6d 65 20 63 68 61 72 61 63 74 65 72  thname character
d8f0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
d900: 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74   getTempname(int
d910: 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
d920: 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  f){.  static cha
d930: 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20  r zChars[] =.   
d940: 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e   "abcdefghijklmn
d950: 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20  opqrstuvwxyz".  
d960: 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d    "ABCDEFGHIJKLM
d970: 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20  NOPQRSTUVWXYZ". 
d980: 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b     "0123456789";
d990: 0a 20 20 73 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a  .  size_t i, j;.
d9a0: 20 20 63 68 61 72 20 7a 54 65 6d 70 50 61 74 68    char zTempPath
d9b0: 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 0a 0a 20  [MAX_PATH+1];.. 
d9c0: 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
d9d0: 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
d9e0: 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
d9f0: 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
da00: 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
da10: 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
da20: 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
da30: 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
da40: 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
da50: 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
da60: 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  . .  */.  Simula
da70: 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
da80: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  n SQLITE_IOERR )
da90: 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
daa0: 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
dab0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
dac0: 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
dad0: 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20  -30, zTempPath, 
dae0: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 74 65  "%s", sqlite3_te
daf0: 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20  mp_directory);. 
db00: 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 54 28   }else if( isNT(
db10: 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ) ){.    char *z
db20: 4d 75 6c 74 69 3b 0a 20 20 20 20 57 43 48 41 52  Multi;.    WCHAR
db30: 20 7a 57 69 64 65 50 61 74 68 5b 4d 41 58 5f 50   zWidePath[MAX_P
db40: 41 54 48 5d 3b 0a 20 20 20 20 47 65 74 54 65 6d  ATH];.    GetTem
db50: 70 50 61 74 68 57 28 4d 41 58 5f 50 41 54 48 2d  pPathW(MAX_PATH-
db60: 33 30 2c 20 7a 57 69 64 65 50 61 74 68 29 3b 0a  30, zWidePath);.
db70: 20 20 20 20 7a 4d 75 6c 74 69 20 3d 20 75 6e 69      zMulti = uni
db80: 63 6f 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65  codeToUtf8(zWide
db90: 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a  Path);.    if( z
dba0: 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 73  Multi ){.      s
dbb0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
dbc0: 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65  MAX_PATH-30, zTe
dbd0: 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20 7a 4d  mpPath, "%s", zM
dbe0: 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 66 72 65  ulti);.      fre
dbf0: 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 7d  e(zMulti);.    }
dc00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
dc10: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
dc20: 0a 20 20 20 20 7d 0a 2f 2a 20 69 73 4e 54 28 29  .    }./* isNT()
dc30: 20 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f   is 1 if SQLITE_
dc40: 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20  OS_WINCE==1, so 
dc50: 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76  this else is nev
dc60: 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a  er executed. .**
dc70: 20 53 69 6e 63 65 20 74 68 65 20 41 53 43 49 49   Since the ASCII
dc80: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 73   version of thes
dc90: 65 20 57 69 6e 64 6f 77 73 20 41 50 49 20 64 6f  e Windows API do
dca0: 20 6e 6f 74 20 65 78 69 73 74 20 66 6f 72 20 57   not exist for W
dcb0: 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d  INCE,.** it's im
dcc0: 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72  portant to not r
dcd0: 65 66 65 72 65 6e 63 65 20 74 68 65 6d 20 66 6f  eference them fo
dce0: 72 20 57 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a  r WINCE builds..
dcf0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
dd00: 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73  _WINCE==0.  }els
dd10: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 74  e{.    char *zUt
dd20: 66 38 3b 0a 20 20 20 20 63 68 61 72 20 7a 4d 62  f8;.    char zMb
dd30: 63 73 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d  csPath[MAX_PATH]
dd40: 3b 0a 20 20 20 20 47 65 74 54 65 6d 70 50 61 74  ;.    GetTempPat
dd50: 68 41 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20  hA(MAX_PATH-30, 
dd60: 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20  zMbcsPath);.    
dd70: 7a 55 74 66 38 20 3d 20 73 71 6c 69 74 65 33 5f  zUtf8 = sqlite3_
dd80: 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74  win32_mbcs_to_ut
dd90: 66 38 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20  f8(zMbcsPath);. 
dda0: 20 20 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a     if( zUtf8 ){.
ddb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
ddc0: 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d  printf(MAX_PATH-
ddd0: 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22  30, zTempPath, "
dde0: 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20  %s", zUtf8);.   
ddf0: 20 20 20 66 72 65 65 28 7a 55 74 66 38 29 3b 0a     free(zUtf8);.
de00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
de10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
de20: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  OMEM;.    }.#end
de30: 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  if.  }..  /* Che
de40: 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70  ck that the outp
de50: 75 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72  ut buffer is lar
de60: 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68  ge enough for th
de70: 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
de80: 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20   .  ** name. If 
de90: 69 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72  it is not, retur
dea0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  n SQLITE_ERROR..
deb0: 20 20 2a 2f 0a 20 20 69 66 28 20 28 73 71 6c 69    */.  if( (sqli
dec0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
ded0: 70 50 61 74 68 29 20 2b 20 73 71 6c 69 74 65 33  pPath) + sqlite3
dee0: 53 74 72 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f  Strlen30(SQLITE_
def0: 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
df00: 29 20 2b 20 31 37 29 20 3e 3d 20 6e 42 75 66 20  ) + 17) >= nBuf 
df10: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
df20: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
df30: 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 33  .  for(i=sqlite3
df40: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 50 61  Strlen30(zTempPa
df50: 74 68 29 3b 20 69 3e 30 20 26 26 20 7a 54 65 6d  th); i>0 && zTem
df60: 70 50 61 74 68 5b 69 2d 31 5d 3d 3d 27 5c 5c 27  pPath[i-1]=='\\'
df70: 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a 54 65 6d 70  ; i--){}.  zTemp
df80: 50 61 74 68 5b 69 5d 20 3d 20 30 3b 0a 0a 20 20  Path[i] = 0;..  
df90: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
dfa0: 28 6e 42 75 66 2d 31 37 2c 20 7a 42 75 66 2c 0a  (nBuf-17, zBuf,.
dfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfc0: 20 20 20 22 25 73 5c 5c 22 53 51 4c 49 54 45 5f     "%s\\"SQLITE_
dfd0: 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
dfe0: 2c 20 7a 54 65 6d 70 50 61 74 68 29 3b 0a 20 20  , zTempPath);.  
dff0: 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  j = sqlite3Strle
e000: 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 73 71 6c  n30(zBuf);.  sql
e010: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
e020: 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20  15, &zBuf[j]);. 
e030: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20   for(i=0; i<15; 
e040: 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a  i++, j++){.    z
e050: 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a  Buf[j] = (char)z
e060: 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65  Chars[ ((unsigne
e070: 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25  d char)zBuf[j])%
e080: 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d  (sizeof(zChars)-
e090: 31 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66  1) ];.  }.  zBuf
e0a0: 5b 6a 5d 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52  [j] = 0;..  OSTR
e0b0: 41 43 45 28 28 22 54 45 4d 50 20 46 49 4c 45 4e  ACE(("TEMP FILEN
e0c0: 41 4d 45 3a 20 25 73 5c 6e 22 2c 20 7a 42 75 66  AME: %s\n", zBuf
e0d0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
e0e0: 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  ITE_OK; .}../*.*
e0f0: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
e100: 75 65 20 6f 66 20 67 65 74 4c 61 73 74 45 72 72  ue of getLastErr
e110: 6f 72 4d 73 67 0a 2a 2a 20 69 73 20 7a 65 72 6f  orMsg.** is zero
e120: 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   if the error me
e130: 73 73 61 67 65 20 66 69 74 73 20 69 6e 20 74 68  ssage fits in th
e140: 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e  e buffer, or non
e150: 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69  -zero.** otherwi
e160: 73 65 20 28 69 66 20 74 68 65 20 6d 65 73 73 61  se (if the messa
e170: 67 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64  ge was truncated
e180: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
e190: 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67   getLastErrorMsg
e1a0: 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20  (int nBuf, char 
e1b0: 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 46 6f 72  *zBuf){.  /* For
e1c0: 6d 61 74 4d 65 73 73 61 67 65 20 72 65 74 75 72  matMessage retur
e1d0: 6e 73 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e  ns 0 on failure.
e1e0: 20 20 4f 74 68 65 72 77 69 73 65 20 69 74 0a 20    Otherwise it. 
e1f0: 20 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65 20   ** returns the 
e200: 6e 75 6d 62 65 72 20 6f 66 20 54 43 48 41 52 73  number of TCHARs
e210: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
e220: 6f 75 74 70 75 74 0a 20 20 2a 2a 20 62 75 66 66  output.  ** buff
e230: 65 72 2c 20 65 78 63 6c 75 64 69 6e 67 20 74 68  er, excluding th
e240: 65 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75  e terminating nu
e250: 6c 6c 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20 20  ll char..  */.  
e260: 44 57 4f 52 44 20 65 72 72 6f 72 20 3d 20 47 65  DWORD error = Ge
e270: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
e280: 44 57 4f 52 44 20 64 77 4c 65 6e 20 3d 20 30 3b  DWORD dwLen = 0;
e290: 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20  .  char *zOut = 
e2a0: 30 3b 0a 0a 20 20 69 66 28 20 69 73 4e 54 28 29  0;..  if( isNT()
e2b0: 20 29 7b 0a 20 20 20 20 57 43 48 41 52 20 2a 7a   ){.    WCHAR *z
e2c0: 54 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c 4c 3b  TempWide = NULL;
e2d0: 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 46 6f 72  .    dwLen = For
e2e0: 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d  matMessageW(FORM
e2f0: 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43  AT_MESSAGE_ALLOC
e300: 41 54 45 5f 42 55 46 46 45 52 20 7c 20 46 4f 52  ATE_BUFFER | FOR
e310: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d  MAT_MESSAGE_FROM
e320: 5f 53 59 53 54 45 4d 20 7c 20 46 4f 52 4d 41 54  _SYSTEM | FORMAT
e330: 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f  _MESSAGE_IGNORE_
e340: 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20  INSERTS,.       
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e360: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
e370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e380: 20 20 20 20 20 65 72 72 6f 72 2c 0a 20 20 20 20       error,.    
e390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3a0: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
e3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3c0: 20 20 20 20 20 28 4c 50 57 53 54 52 29 20 26 7a       (LPWSTR) &z
e3d0: 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20  TempWide,.      
e3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3f0: 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20       0,.        
e400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e410: 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64     0);.    if( d
e420: 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20  wLen > 0 ){.    
e430: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20    /* allocate a 
e440: 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65  buffer and conve
e450: 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20  rt to UTF8 */.  
e460: 20 20 20 20 7a 4f 75 74 20 3d 20 75 6e 69 63 6f      zOut = unico
e470: 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 57 69  deToUtf8(zTempWi
e480: 64 65 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72  de);.      /* fr
e490: 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75  ee the system bu
e4a0: 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62  ffer allocated b
e4b0: 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20  y FormatMessage 
e4c0: 2a 2f 0a 20 20 20 20 20 20 4c 6f 63 61 6c 46 72  */.      LocalFr
e4d0: 65 65 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20  ee(zTempWide);. 
e4e0: 20 20 20 7d 0a 2f 2a 20 69 73 4e 54 28 29 20 69     }./* isNT() i
e4f0: 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53  s 1 if SQLITE_OS
e500: 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68  _WINCE==1, so th
e510: 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72  is else is never
e520: 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53   executed. .** S
e530: 69 6e 63 65 20 74 68 65 20 41 53 43 49 49 20 76  ince the ASCII v
e540: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20  ersion of these 
e550: 57 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e  Windows API do n
e560: 6f 74 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e  ot exist for WIN
e570: 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f  CE,.** it's impo
e580: 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66  rtant to not ref
e590: 65 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20  erence them for 
e5a0: 57 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f  WINCE builds..*/
e5b0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
e5c0: 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b  INCE==0.  }else{
e5d0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70  .    char *zTemp
e5e0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c   = NULL;.    dwL
e5f0: 65 6e 20 3d 20 46 6f 72 6d 61 74 4d 65 73 73 61  en = FormatMessa
e600: 67 65 41 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41  geA(FORMAT_MESSA
e610: 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46  GE_ALLOCATE_BUFF
e620: 45 52 20 7c 20 46 4f 52 4d 41 54 5f 4d 45 53 53  ER | FORMAT_MESS
e630: 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20  AGE_FROM_SYSTEM 
e640: 7c 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45  | FORMAT_MESSAGE
e650: 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c  _IGNORE_INSERTS,
e660: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e670: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
e680: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e690: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
e6a0: 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  or,.            
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
e6c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4c 50               (LP
e6e0: 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20  STR) &zTemp,.   
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e700: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
e710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e720: 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66        0);.    if
e730: 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20  ( dwLen > 0 ){. 
e740: 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65       /* allocate
e750: 20 61 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f   a buffer and co
e760: 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f  nvert to UTF8 */
e770: 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 73 71  .      zOut = sq
e780: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
e790: 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b  _to_utf8(zTemp);
e7a0: 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74  .      /* free t
e7b0: 68 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72  he system buffer
e7c0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f   allocated by Fo
e7d0: 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20  rmatMessage */. 
e7e0: 20 20 20 20 20 4c 6f 63 61 6c 46 72 65 65 28 7a       LocalFree(z
e7f0: 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Temp);.    }.#en
e800: 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 30 20  dif.  }.  if( 0 
e810: 3d 3d 20 64 77 4c 65 6e 20 29 7b 0a 20 20 20 20  == dwLen ){.    
e820: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
e830: 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 4f 73  (nBuf, zBuf, "Os
e840: 45 72 72 6f 72 20 30 78 25 78 20 28 25 75 29 22  Error 0x%x (%u)"
e850: 2c 20 65 72 72 6f 72 2c 20 65 72 72 6f 72 29 3b  , error, error);
e860: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
e870: 20 63 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d 20   copy a maximum 
e880: 6f 66 20 6e 42 75 66 20 63 68 61 72 73 20 74 6f  of nBuf chars to
e890: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   output buffer *
e8a0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  /.    sqlite3_sn
e8b0: 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75  printf(nBuf, zBu
e8c0: 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a  f, "%s", zOut);.
e8d0: 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20      /* free the 
e8e0: 55 54 46 38 20 62 75 66 66 65 72 20 2a 2f 0a 20  UTF8 buffer */. 
e8f0: 20 20 20 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20     free(zOut);. 
e900: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
e910: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66  ../*.** Open a f
e920: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
e930: 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71  nt winOpen(.  sq
e940: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
e950: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75          /* Not u
e960: 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  sed */.  const c
e970: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
e980: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
e990: 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a  e file (UTF-8) *
e9a0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
e9b0: 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a   *id,         /*
e9c0: 20 57 72 69 74 65 20 74 68 65 20 53 51 4c 69 74   Write the SQLit
e9d0: 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 68 65  e file handle he
e9e0: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
e9f0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
ea00: 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66    /* Open mode f
ea10: 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  lags */.  int *p
ea20: 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20  OutFlags        
ea30: 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 72 65      /* Status re
ea40: 74 75 72 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  turn flags */.){
ea50: 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44  .  HANDLE h;.  D
ea60: 57 4f 52 44 20 64 77 44 65 73 69 72 65 64 41 63  WORD dwDesiredAc
ea70: 63 65 73 73 3b 0a 20 20 44 57 4f 52 44 20 64 77  cess;.  DWORD dw
ea80: 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20 44 57 4f  ShareMode;.  DWO
ea90: 52 44 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73  RD dwCreationDis
eaa0: 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 57 4f 52  position;.  DWOR
eab0: 44 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72  D dwFlagsAndAttr
eac0: 69 62 75 74 65 73 20 3d 20 30 3b 0a 23 69 66 20  ibutes = 0;.#if 
ead0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
eae0: 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d 20 30    int isTemp = 0
eaf0: 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69  ;.#endif.  winFi
eb00: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
eb10: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64  File*)id;.  void
eb20: 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20 20 20   *zConverted;   
eb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
eb40: 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20   Filename in OS 
eb50: 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f  encoding */.  co
eb60: 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38 4e  nst char *zUtf8N
eb70: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 20 20 20  ame = zName;    
eb80: 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55  /* Filename in U
eb90: 54 46 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f  TF-8 encoding */
eba0: 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65  .  char zTmpname
ebb0: 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 20 20 20  [MAX_PATH+1];   
ebc0: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75       /* Buffer u
ebd0: 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 74 65  sed to create te
ebe0: 6d 70 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 0a  mp filename */..
ebf0: 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
ec00: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
ec10: 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20  METER(pVfs);..  
ec20: 70 46 69 6c 65 2d 3e 68 20 3d 20 49 4e 56 41 4c  pFile->h = INVAL
ec30: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b  ID_HANDLE_VALUE;
ec40: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65  ..  /* If the se
ec50: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
ec60: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
ec70: 73 20 4e 55 4c 4c 2c 20 67 65 6e 65 72 61 74 65  s NULL, generate
ec80: 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61   a .  ** tempora
ec90: 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20  ry file name to 
eca0: 75 73 65 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  use .  */.  if( 
ecb0: 21 7a 55 74 66 38 4e 61 6d 65 20 29 7b 0a 20 20  !zUtf8Name ){.  
ecc0: 20 20 69 6e 74 20 72 63 20 3d 20 67 65 74 54 65    int rc = getTe
ecd0: 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 2b  mpname(MAX_PATH+
ece0: 31 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20  1, zTmpname);.  
ecf0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ed00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
ed10: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
ed20: 20 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54    zUtf8Name = zT
ed30: 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f  mpname;.  }..  /
ed40: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 66 69  * Convert the fi
ed50: 6c 65 6e 61 6d 65 20 74 6f 20 74 68 65 20 73 79  lename to the sy
ed60: 73 74 65 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a  stem encoding. *
ed70: 2f 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d  /.  zConverted =
ed80: 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65   convertUtf8File
ed90: 6e 61 6d 65 28 7a 55 74 66 38 4e 61 6d 65 29 3b  name(zUtf8Name);
eda0: 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
edb0: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d==0 ){.    retu
edc0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
edd0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 66 6c 61 67  .  }..  if( flag
ede0: 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
edf0: 52 45 41 44 57 52 49 54 45 20 29 7b 0a 20 20 20  READWRITE ){.   
ee00: 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
ee10: 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20   = GENERIC_READ 
ee20: 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 3b  | GENERIC_WRITE;
ee30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77  .  }else{.    dw
ee40: 44 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20  DesiredAccess = 
ee50: 47 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20 20  GENERIC_READ;.  
ee60: 7d 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50  }.  /* SQLITE_OP
ee70: 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 69 73 20  EN_EXCLUSIVE is 
ee80: 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  used to make sur
ee90: 65 20 74 68 61 74 20 61 20 6e 65 77 20 66 69 6c  e that a new fil
eea0: 65 20 69 73 20 0a 20 20 2a 2a 20 63 72 65 61 74  e is .  ** creat
eeb0: 65 64 2e 20 53 51 4c 69 74 65 20 64 6f 65 73 6e  ed. SQLite doesn
eec0: 27 74 20 75 73 65 20 69 74 20 74 6f 20 69 6e 64  't use it to ind
eed0: 69 63 61 74 65 20 22 65 78 63 6c 75 73 69 76 65  icate "exclusive
eee0: 20 61 63 63 65 73 73 22 20 0a 20 20 2a 2a 20 61   access" .  ** a
eef0: 73 20 69 74 20 69 73 20 75 73 75 61 6c 6c 79 20  s it is usually 
ef00: 75 6e 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f  understood..  */
ef10: 0a 20 20 61 73 73 65 72 74 28 21 28 66 6c 61 67  .  assert(!(flag
ef20: 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
ef30: 45 58 43 4c 55 53 49 56 45 29 20 7c 7c 20 28 66  EXCLUSIVE) || (f
ef40: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
ef50: 45 4e 5f 43 52 45 41 54 45 29 29 3b 0a 20 20 69  EN_CREATE));.  i
ef60: 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
ef70: 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
ef80: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   ){.    /* Creat
ef90: 65 73 20 61 20 6e 65 77 20 66 69 6c 65 2c 20 6f  es a new file, o
efa0: 6e 6c 79 20 69 66 20 69 74 20 64 6f 65 73 20 6e  nly if it does n
efb0: 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
efc0: 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74  . */.    /* If t
efd0: 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  he file exists, 
efe0: 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 20  it fails. */.   
eff0: 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
f000: 73 69 74 69 6f 6e 20 3d 20 43 52 45 41 54 45 5f  sition = CREATE_
f010: 4e 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NEW;.  }else if(
f020: 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
f030: 4f 50 45 4e 5f 43 52 45 41 54 45 20 29 7b 0a 20  OPEN_CREATE ){. 
f040: 20 20 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74     /* Open exist
f050: 69 6e 67 20 66 69 6c 65 2c 20 6f 72 20 63 72 65  ing file, or cre
f060: 61 74 65 20 69 66 20 69 74 20 64 6f 65 73 6e 27  ate if it doesn'
f070: 74 20 65 78 69 73 74 20 2a 2f 0a 20 20 20 20 64  t exist */.    d
f080: 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
f090: 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41  tion = OPEN_ALWA
f0a0: 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  YS;.  }else{.   
f0b0: 20 2f 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c 65   /* Opens a file
f0c0: 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 65 78 69  , only if it exi
f0d0: 73 74 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72  sts. */.    dwCr
f0e0: 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
f0f0: 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e  n = OPEN_EXISTIN
f100: 47 3b 0a 20 20 7d 0a 20 20 64 77 53 68 61 72 65  G;.  }.  dwShare
f110: 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48 41 52  Mode = FILE_SHAR
f120: 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48  E_READ | FILE_SH
f130: 41 52 45 5f 57 52 49 54 45 3b 0a 20 20 69 66 28  ARE_WRITE;.  if(
f140: 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
f150: 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
f160: 53 45 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  SE ){.#if SQLITE
f170: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 64 77  _OS_WINCE.    dw
f180: 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
f190: 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42  es = FILE_ATTRIB
f1a0: 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20 20 20  UTE_HIDDEN;.    
f1b0: 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65 6c 73  isTemp = 1;.#els
f1c0: 65 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64  e.    dwFlagsAnd
f1d0: 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c  Attributes = FIL
f1e0: 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45 4d 50  E_ATTRIBUTE_TEMP
f1f0: 4f 52 41 52 59 0a 20 20 20 20 20 20 20 20 20 20  ORARY.          
f200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f210: 20 20 20 20 20 7c 20 46 49 4c 45 5f 41 54 54 52       | FILE_ATTR
f220: 49 42 55 54 45 5f 48 49 44 44 45 4e 0a 20 20 20  IBUTE_HIDDEN.   
f230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f240: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49              | FI
f250: 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f  LE_FLAG_DELETE_O
f260: 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69 66 0a  N_CLOSE;.#endif.
f270: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 46    }else{.    dwF
f280: 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
f290: 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s = FILE_ATTRIBU
f2a0: 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20  TE_NORMAL;.  }. 
f2b0: 20 2f 2a 20 52 65 70 6f 72 74 73 20 66 72 6f 6d   /* Reports from
f2c0: 20 74 68 65 20 69 6e 74 65 72 6e 65 74 20 61 72   the internet ar
f2d0: 65 20 74 68 61 74 20 70 65 72 66 6f 72 6d 61 6e  e that performan
f2e0: 63 65 20 69 73 20 61 6c 77 61 79 73 0a 20 20 2a  ce is always.  *
f2f0: 2a 20 62 65 74 74 65 72 20 69 66 20 46 49 4c 45  * better if FILE
f300: 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43  _FLAG_RANDOM_ACC
f310: 45 53 53 20 69 73 20 75 73 65 64 2e 20 20 54 69  ESS is used.  Ti
f320: 63 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f 0a 23  cket #2699. */.#
f330: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
f340: 43 45 0a 20 20 64 77 46 6c 61 67 73 41 6e 64 41  CE.  dwFlagsAndA
f350: 74 74 72 69 62 75 74 65 73 20 7c 3d 20 46 49 4c  ttributes |= FIL
f360: 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43  E_FLAG_RANDOM_AC
f370: 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a 20 20 69  CESS;.#endif.  i
f380: 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
f390: 20 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 57   h = CreateFileW
f3a0: 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72  ((WCHAR*)zConver
f3b0: 74 65 64 2c 0a 20 20 20 20 20 20 20 64 77 44 65  ted,.       dwDe
f3c0: 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20  siredAccess,.   
f3d0: 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c      dwShareMode,
f3e0: 0a 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20  .       NULL,.  
f3f0: 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44       dwCreationD
f400: 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20  isposition,.    
f410: 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
f420: 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20  ributes,.       
f430: 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 2f 2a 20 69  NULL.    );./* i
f440: 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51  sNT() is 1 if SQ
f450: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31  LITE_OS_WINCE==1
f460: 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69  , so this else i
f470: 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64  s never executed
f480: 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20  . .** Since the 
f490: 41 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f 66  ASCII version of
f4a0: 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41   these Windows A
f4b0: 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  PI do not exist 
f4c0: 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74  for WINCE,.** it
f4d0: 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  's important to 
f4e0: 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68  not reference th
f4f0: 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69  em for WINCE bui
f500: 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  lds..*/.#if SQLI
f510: 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20  TE_OS_WINCE==0. 
f520: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20   }else{.    h = 
f530: 43 72 65 61 74 65 46 69 6c 65 41 28 28 63 68 61  CreateFileA((cha
f540: 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  r*)zConverted,. 
f550: 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
f560: 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 64 77  ccess,.       dw
f570: 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20  ShareMode,.     
f580: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 64    NULL,.       d
f590: 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
f5a0: 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 64 77 46  tion,.       dwF
f5b0: 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
f5c0: 73 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20  s,.       NULL. 
f5d0: 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d     );.#endif.  }
f5e0: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
f5f0: 4e 20 25 64 20 25 73 20 30 78 25 6c 78 20 25 73  N %d %s 0x%lx %s
f600: 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
f610: 20 68 2c 20 7a 4e 61 6d 65 2c 20 64 77 44 65 73   h, zName, dwDes
f620: 69 72 65 64 41 63 63 65 73 73 2c 20 0a 20 20 20  iredAccess, .   
f630: 20 20 20 20 20 20 20 20 68 3d 3d 49 4e 56 41 4c          h==INVAL
f640: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
f650: 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b  ? "failed" : "ok
f660: 22 29 29 3b 0a 20 20 69 66 28 20 68 3d 3d 49 4e  "));.  if( h==IN
f670: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
f680: 55 45 20 29 7b 0a 20 20 20 20 66 72 65 65 28 7a  UE ){.    free(z
f690: 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
f6a0: 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
f6b0: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
f6c0: 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E ){.      retur
f6d0: 6e 20 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20  n winOpen(pVfs, 
f6e0: 7a 4e 61 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20  zName, id, .    
f6f0: 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73           ((flags
f700: 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  |SQLITE_OPEN_REA
f710: 44 4f 4e 4c 59 29 26 7e 53 51 4c 49 54 45 5f 4f  DONLY)&~SQLITE_O
f720: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 2c 20  PEN_READWRITE), 
f730: 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 20 20  pOutFlags);.    
f740: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
f750: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
f760: 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  PEN_BKPT;.    }.
f770: 20 20 7d 0a 20 20 69 66 28 20 70 4f 75 74 46 6c    }.  if( pOutFl
f780: 61 67 73 20 29 7b 0a 20 20 20 20 69 66 28 20 66  ags ){.    if( f
f790: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
f7a0: 45 4e 5f 52 45 41 44 57 52 49 54 45 20 29 7b 0a  EN_READWRITE ){.
f7b0: 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73        *pOutFlags
f7c0: 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
f7d0: 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 7d 65  EADWRITE;.    }e
f7e0: 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74  lse{.      *pOut
f7f0: 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  Flags = SQLITE_O
f800: 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
f810: 20 20 7d 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74    }.  }.  memset
f820: 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f  (pFile, 0, sizeo
f830: 66 28 2a 70 46 69 6c 65 29 29 3b 0a 20 20 70 46  f(*pFile));.  pF
f840: 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26  ile->pMethod = &
f850: 77 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 70  winIoMethod;.  p
f860: 46 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20 20 70  File->h = h;.  p
f870: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
f880: 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 70 46  = NO_ERROR;.  pF
f890: 69 6c 65 2d 3e 70 56 66 73 20 3d 20 70 56 66 73  ile->pVfs = pVfs
f8a0: 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 53 68 6d 20  ;.  pFile->pShm 
f8b0: 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 7a 50  = 0;.  pFile->zP
f8c0: 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70  ath = zName;.  p
f8d0: 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
f8e0: 20 3d 20 67 65 74 53 65 63 74 6f 72 53 69 7a 65   = getSectorSize
f8f0: 28 70 56 66 73 2c 20 7a 55 74 66 38 4e 61 6d 65  (pVfs, zUtf8Name
f900: 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  );.#if SQLITE_OS
f910: 5f 57 49 4e 43 45 0a 20 20 69 66 28 20 28 66 6c  _WINCE.  if( (fl
f920: 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50  ags & (SQLITE_OP
f930: 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
f940: 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
f950: 29 29 20 3d 3d 0a 20 20 20 20 20 20 20 20 20 20  )) ==.          
f960: 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45       (SQLITE_OPE
f970: 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
f980: 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29  TE_OPEN_MAIN_DB)
f990: 0a 20 20 20 20 20 20 20 26 26 20 21 77 69 6e 63  .       && !winc
f9a0: 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d  eCreateLock(zNam
f9b0: 65 2c 20 70 46 69 6c 65 29 0a 20 20 29 7b 0a 20  e, pFile).  ){. 
f9c0: 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68     CloseHandle(h
f9d0: 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e  );.    free(zCon
f9e0: 76 65 72 74 65 64 29 3b 0a 20 20 20 20 72 65 74  verted);.    ret
f9f0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
fa00: 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  PEN_BKPT;.  }.  
fa10: 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20  if( isTemp ){.  
fa20: 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65    pFile->zDelete
fa30: 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65  OnClose = zConve
fa40: 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  rted;.  }else.#e
fa50: 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 66 72 65  ndif.  {.    fre
fa60: 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
fa70: 20 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72   }.  OpenCounter
fa80: 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (+1);.  return S
fa90: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
faa0: 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6e 61  ** Delete the na
fab0: 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  med file..**.** 
fac0: 4e 6f 74 65 20 74 68 61 74 20 77 69 6e 64 6f 77  Note that window
fad0: 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77  s does not allow
fae0: 20 61 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65   a file to be de
faf0: 6c 65 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  leted if some ot
fb00: 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 68  her.** process h
fb10: 61 73 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f 6d  as it open.  Som
fb20: 65 74 69 6d 65 73 20 61 20 76 69 72 75 73 20 73  etimes a virus s
fb30: 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78 69  canner or indexi
fb40: 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77 69  ng program.** wi
fb50: 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61  ll open a journa
fb60: 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c 79 20 61  l file shortly a
fb70: 66 74 65 72 20 69 74 20 69 73 20 63 72 65 61 74  fter it is creat
fb80: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64  ed in order to d
fb90: 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72 20 69 74  o.** whatever it
fba0: 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20 74 68   does.  While th
fbb0: 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  is other process
fbc0: 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a   is holding the.
fbd0: 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77 65  ** file open, we
fbe0: 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65 20   will be unable 
fbf0: 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20 20 54  to delete it.  T
fc00: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
fc10: 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20 77  is.** problem, w
fc20: 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69 6c 6c  e delay 100 mill
fc30: 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79  iseconds and try
fc40: 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61 69 6e   to delete again
fc50: 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44  .  Up.** to MX_D
fc60: 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 73  ELETION_ATTEMPTs
fc70: 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d 70   deletion attemp
fc80: 74 73 20 61 72 65 20 72 75 6e 20 62 65 66 6f 72  ts are run befor
fc90: 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20 61  e giving.** up a
fca0: 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20  nd returning an 
fcb0: 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  error..*/.#defin
fcc0: 65 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54  e MX_DELETION_AT
fcd0: 54 45 4d 50 54 53 20 35 0a 73 74 61 74 69 63 20  TEMPTS 5.static 
fce0: 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 0a 20  int winDelete(. 
fcf0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
fd00: 66 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fs,          /* 
fd10: 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33  Not used on win3
fd20: 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  2 */.  const cha
fd30: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
fd40: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
fd50: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  le to delete */.
fd60: 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20 20 20    int syncDir   
fd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fd80: 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e   Not used on win
fd90: 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63  32 */.){.  int c
fda0: 6e 74 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20  nt = 0;.  DWORD 
fdb0: 72 63 3b 0a 20 20 44 57 4f 52 44 20 65 72 72 6f  rc;.  DWORD erro
fdc0: 72 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a  r = 0;.  void *z
fdd0: 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55  Converted;.  UNU
fde0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
fdf0: 66 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  fs);.  UNUSED_PA
fe00: 52 41 4d 45 54 45 52 28 73 79 6e 63 44 69 72 29  RAMETER(syncDir)
fe10: 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
fe20: 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
fe30: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29  TE_IOERR_DELETE)
fe40: 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d  ;.  zConverted =
fe50: 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65   convertUtf8File
fe60: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
fe70: 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
fe80: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d==0 ){.    retu
fe90: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
fea0: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28  .  }.  if( isNT(
feb0: 29 20 29 7b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  ) ){.    do{.   
fec0: 20 20 20 44 65 6c 65 74 65 46 69 6c 65 57 28 7a     DeleteFileW(z
fed0: 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
fee0: 7d 77 68 69 6c 65 28 20 20 20 28 20 20 20 28 28  }while(   (   ((
fef0: 72 63 20 3d 20 47 65 74 46 69 6c 65 41 74 74 72  rc = GetFileAttr
ff00: 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65 72 74  ibutesW(zConvert
ff10: 65 64 29 29 20 21 3d 20 49 4e 56 41 4c 49 44 5f  ed)) != INVALID_
ff20: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 29  FILE_ATTRIBUTES)
ff30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ff40: 7c 7c 20 28 28 65 72 72 6f 72 20 3d 20 47 65 74  || ((error = Get
ff50: 4c 61 73 74 45 72 72 6f 72 28 29 29 20 3d 3d 20  LastError()) == 
ff60: 45 52 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e  ERROR_ACCESS_DEN
ff70: 49 45 44 29 29 0a 20 20 20 20 20 20 20 20 20 20  IED)).          
ff80: 20 26 26 20 28 2b 2b 63 6e 74 20 3c 20 4d 58 5f   && (++cnt < MX_
ff90: 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54  DELETION_ATTEMPT
ffa0: 53 29 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  S).           &&
ffb0: 20 28 53 6c 65 65 70 28 31 30 30 29 2c 20 31 29   (Sleep(100), 1)
ffc0: 20 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73   );./* isNT() is
ffd0: 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f   1 if SQLITE_OS_
ffe0: 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69  WINCE==1, so thi
fff0: 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20  s else is never 
10000 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69  executed. .** Si
10010 6e 63 65 20 74 68 65 20 41 53 43 49 49 20 76 65  nce the ASCII ve
10020 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57  rsion of these W
10030 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f  indows API do no
10040 74 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43  t exist for WINC
10050 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72  E,.** it's impor
10060 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65  tant to not refe
10070 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57  rence them for W
10080 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a  INCE builds..*/.
10090 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
100a0 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a  NCE==0.  }else{.
100b0 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 44 65      do{.      De
100c0 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65  leteFileA(zConve
100d0 72 74 65 64 29 3b 0a 20 20 20 20 7d 77 68 69 6c  rted);.    }whil
100e0 65 28 20 20 20 28 20 20 20 28 28 72 63 20 3d 20  e(   (   ((rc = 
100f0 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
10100 73 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 29 20  sA(zConverted)) 
10110 21 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  != INVALID_FILE_
10120 41 54 54 52 49 42 55 54 45 53 29 0a 20 20 20 20  ATTRIBUTES).    
10130 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28             || ((
10140 65 72 72 6f 72 20 3d 20 47 65 74 4c 61 73 74 45  error = GetLastE
10150 72 72 6f 72 28 29 29 20 3d 3d 20 45 52 52 4f 52  rror()) == ERROR
10160 5f 41 43 43 45 53 53 5f 44 45 4e 49 45 44 29 29  _ACCESS_DENIED))
10170 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
10180 2b 2b 63 6e 74 20 3c 20 4d 58 5f 44 45 4c 45 54  ++cnt < MX_DELET
10190 49 4f 4e 5f 41 54 54 45 4d 50 54 53 29 0a 20 20  ION_ATTEMPTS).  
101a0 20 20 20 20 20 20 20 20 20 26 26 20 28 53 6c 65           && (Sle
101b0 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23  ep(100), 1) );.#
101c0 65 6e 64 69 66 0a 20 20 7d 0a 20 20 66 72 65 65  endif.  }.  free
101d0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
101e0 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45 54 45  OSTRACE(("DELETE
101f0 20 5c 22 25 73 5c 22 20 25 73 5c 6e 22 2c 20 7a   \"%s\" %s\n", z
10200 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
10210 20 28 20 28 72 63 3d 3d 49 4e 56 41 4c 49 44 5f   ( (rc==INVALID_
10220 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 29  FILE_ATTRIBUTES)
10230 20 26 26 20 28 65 72 72 6f 72 3d 3d 45 52 52 4f   && (error==ERRO
10240 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44  R_FILE_NOT_FOUND
10250 29 29 20 3f 0a 20 20 20 20 20 20 20 20 20 22 6f  )) ?.         "o
10260 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 20 29 29  k" : "failed" ))
10270 3b 0a 20 0a 20 20 72 65 74 75 72 6e 20 28 20 20  ;. .  return (  
10280 20 28 72 63 20 3d 3d 20 49 4e 56 41 4c 49 44 5f   (rc == INVALID_
10290 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 29  FILE_ATTRIBUTES)
102a0 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28   .          && (
102b0 65 72 72 6f 72 20 3d 3d 20 45 52 52 4f 52 5f 46  error == ERROR_F
102c0 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 29 29 20  ILE_NOT_FOUND)) 
102d0 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51  ? SQLITE_OK : SQ
102e0 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
102f0 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  E;.}../*.** Chec
10300 6b 20 74 68 65 20 65 78 69 73 74 61 6e 63 65 20  k the existance 
10310 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20 61 20  and status of a 
10320 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
10330 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28 0a 20  int winAccess(. 
10340 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
10350 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  fs,         /* N
10360 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32  ot used on win32
10370 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
10380 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20   *zFilename,    
10390 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
103a0 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69   to check */.  i
103b0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
103c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70            /* Typ
103d0 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d 61 6b  e of test to mak
103e0 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  e on this file *
103f0 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  /.  int *pResOut
10400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10410 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f  * OUT: Result */
10420 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72  .){.  DWORD attr
10430 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
10440 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
10450 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ed;.  UNUSED_PAR
10460 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20  AMETER(pVfs);.. 
10470 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
10480 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
10490 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b  IOERR_ACCESS; );
104a0 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
104b0 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e  convertUtf8Filen
104c0 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
104d0 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
104e0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
104f0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
10500 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29    }.  if( isNT()
10510 20 29 7b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49   ){.    WIN32_FI
10520 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54  LE_ATTRIBUTE_DAT
10530 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20  A sAttrData;.   
10540 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61   memset(&sAttrDa
10550 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41  ta, 0, sizeof(sA
10560 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 69  ttrData));.    i
10570 66 28 20 47 65 74 46 69 6c 65 41 74 74 72 69 62  f( GetFileAttrib
10580 75 74 65 73 45 78 57 28 28 57 43 48 41 52 2a 29  utesExW((WCHAR*)
10590 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
105a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105b0 20 20 20 20 20 20 20 20 20 47 65 74 46 69 6c 65           GetFile
105c0 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 20  ExInfoStandard, 
105d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
105e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
105f0 41 74 74 72 44 61 74 61 29 20 29 7b 0a 20 20 20  AttrData) ){.   
10600 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c     /* For an SQL
10610 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
10620 53 20 71 75 65 72 79 2c 20 74 72 65 61 74 20 61  S query, treat a
10630 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c   zero-length fil
10640 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66  e.      ** as if
10650 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
10660 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  st..      */.   
10670 20 20 20 69 66 28 20 20 20 20 66 6c 61 67 73 3d     if(    flags=
10680 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45  =SQLITE_ACCESS_E
10690 58 49 53 54 53 0a 20 20 20 20 20 20 20 20 20 20  XISTS.          
106a0 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69  && sAttrData.nFi
106b0 6c 65 53 69 7a 65 48 69 67 68 3d 3d 30 20 0a 20  leSizeHigh==0 . 
106c0 20 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74           && sAtt
106d0 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c  rData.nFileSizeL
106e0 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ow==0 ){.       
106f0 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f   attr = INVALID_
10700 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b  FILE_ATTRIBUTES;
10710 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10720 20 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74        attr = sAt
10730 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74  trData.dwFileAtt
10740 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d  ributes;.      }
10750 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10760 20 20 69 66 28 20 47 65 74 4c 61 73 74 45 72 72    if( GetLastErr
10770 6f 72 28 29 21 3d 45 52 52 4f 52 5f 46 49 4c 45  or()!=ERROR_FILE
10780 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20  _NOT_FOUND ){.  
10790 20 20 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76        free(zConv
107a0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20  erted);.        
107b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
107c0 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20 20  ERR_ACCESS;.    
107d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
107e0 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f   attr = INVALID_
107f0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b  FILE_ATTRIBUTES;
10800 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 2f  .      }.    }./
10810 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66  * isNT() is 1 if
10820 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
10830 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73  ==1, so this els
10840 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75  e is never execu
10850 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74  ted. .** Since t
10860 68 65 20 41 53 43 49 49 20 76 65 72 73 69 6f 6e  he ASCII version
10870 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77   of these Window
10880 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69  s API do not exi
10890 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a  st for WINCE,.**
108a0 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20   it's important 
108b0 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65  to not reference
108c0 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20   them for WINCE 
108d0 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53  builds..*/.#if S
108e0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
108f0 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  0.  }else{.    a
10900 74 74 72 20 3d 20 47 65 74 46 69 6c 65 41 74 74  ttr = GetFileAtt
10910 72 69 62 75 74 65 73 41 28 28 63 68 61 72 2a 29  ributesA((char*)
10920 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e  zConverted);.#en
10930 64 69 66 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a  dif.  }.  free(z
10940 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 73 77  Converted);.  sw
10950 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20  itch( flags ){. 
10960 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
10970 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20  CCESS_READ:.    
10980 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
10990 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20  SS_EXISTS:.     
109a0 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41   rc = attr!=INVA
109b0 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
109c0 54 45 53 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  TES;.      break
109d0 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
109e0 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49  E_ACCESS_READWRI
109f0 54 45 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 28  TE:.      rc = (
10a00 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52  attr & FILE_ATTR
10a10 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59 29 3d  IBUTE_READONLY)=
10a20 3d 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  =0;.      break;
10a30 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
10a40 20 20 20 20 61 73 73 65 72 74 28 21 22 49 6e 76      assert(!"Inv
10a50 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d  alid flags argum
10a60 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52  ent");.  }.  *pR
10a70 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 72 65  esOut = rc;.  re
10a80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10a90 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61  }.../*.** Turn a
10aa0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
10ab0 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70  me into a full p
10ac0 61 74 68 6e 61 6d 65 2e 20 20 57 72 69 74 65 20  athname.  Write 
10ad0 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61 74 68  the full.** path
10ae0 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d  name into zOut[]
10af0 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20 62  .  zOut[] will b
10b00 65 20 61 74 20 6c 65 61 73 74 20 70 56 66 73 2d  e at least pVfs-
10b10 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a 20 62  >mxPathname.** b
10b20 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f  ytes in size..*/
10b30 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46  .static int winF
10b40 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73  ullPathname(.  s
10b50 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
10b60 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
10b70 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f  Pointer to vfs o
10b80 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  bject */.  const
10b90 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76 65   char *zRelative
10ba0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73  ,        /* Poss
10bb0 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e  ibly relative in
10bc0 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e  put path */.  in
10bd0 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20 20 20  t nFull,        
10be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
10bf0 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75  ize of output bu
10c00 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f  ffer in bytes */
10c10 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 20  .  char *zFull  
10c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c30 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65   /* Output buffe
10c40 72 20 2a 2f 0a 29 7b 0a 20 20 0a 23 69 66 20 64  r */.){.  .#if d
10c50 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
10c60 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  _).  SimulateIOE
10c70 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
10c80 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55  ITE_ERROR );.  U
10c90 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
10ca0 6e 46 75 6c 6c 29 3b 0a 20 20 63 79 67 77 69 6e  nFull);.  cygwin
10cb0 5f 63 6f 6e 76 5f 74 6f 5f 66 75 6c 6c 5f 77 69  _conv_to_full_wi
10cc0 6e 33 32 5f 70 61 74 68 28 7a 52 65 6c 61 74 69  n32_path(zRelati
10cd0 76 65 2c 20 7a 46 75 6c 6c 29 3b 0a 20 20 72 65  ve, zFull);.  re
10ce0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10cf0 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
10d00 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53 69  TE_OS_WINCE.  Si
10d10 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
10d20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
10d30 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  OR );.  UNUSED_P
10d40 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b  ARAMETER(nFull);
10d50 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68 61 73 20  .  /* WinCE has 
10d60 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20 61 20  no concept of a 
10d70 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
10d80 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f  e, or so I am to
10d90 6c 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ld. */.  sqlite3
10da0 5f 73 6e 70 72 69 6e 74 66 28 70 56 66 73 2d 3e  _snprintf(pVfs->
10db0 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c  mxPathname, zFul
10dc0 6c 2c 20 22 25 73 22 2c 20 7a 52 65 6c 61 74 69  l, "%s", zRelati
10dd0 76 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ve);.  return SQ
10de0 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
10df0 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
10e00 57 49 4e 43 45 20 26 26 20 21 64 65 66 69 6e 65  WINCE && !define
10e10 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
10e20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 76 6f 69  int nByte;.  voi
10e30 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
10e40 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a 20 20   char *zOut;..  
10e50 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
10e60 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
10e70 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
10e80 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
10e90 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
10ea0 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
10eb0 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
10ec0 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
10ed0 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
10ee0 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
10ef0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
10f00 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f  ould fail if, fo
10f10 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20  r example, the. 
10f20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b   ** current work
10f30 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61  ing directory ha
10f40 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e  s been unlinked.
10f50 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
10f60 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
10f70 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
10f80 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10f90 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 7a 43 6f  ER(nFull);.  zCo
10fa0 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72  nverted = conver
10fb0 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52  tUtf8Filename(zR
10fc0 65 6c 61 74 69 76 65 29 3b 0a 20 20 69 66 28 20  elative);.  if( 
10fd0 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 57 43  isNT() ){.    WC
10fe0 48 41 52 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20  HAR *zTemp;.    
10ff0 6e 42 79 74 65 20 3d 20 47 65 74 46 75 6c 6c 50  nByte = GetFullP
11000 61 74 68 4e 61 6d 65 57 28 28 57 43 48 41 52 2a  athNameW((WCHAR*
11010 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20  )zConverted, 0, 
11020 30 2c 20 30 29 20 2b 20 33 3b 0a 20 20 20 20 7a  0, 0) + 3;.    z
11030 54 65 6d 70 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  Temp = malloc( n
11040 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d  Byte*sizeof(zTem
11050 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  p[0]) );.    if(
11060 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20   zTemp==0 ){.   
11070 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74     free(zConvert
11080 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ed);.      retur
11090 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
110a0 20 20 20 20 7d 0a 20 20 20 20 47 65 74 46 75 6c      }.    GetFul
110b0 6c 50 61 74 68 4e 61 6d 65 57 28 28 57 43 48 41  lPathNameW((WCHA
110c0 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e  R*)zConverted, n
110d0 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b  Byte, zTemp, 0);
110e0 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65  .    free(zConve
110f0 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20  rted);.    zOut 
11100 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  = unicodeToUtf8(
11110 7a 54 65 6d 70 29 3b 0a 20 20 20 20 66 72 65 65  zTemp);.    free
11120 28 7a 54 65 6d 70 29 3b 0a 2f 2a 20 69 73 4e 54  (zTemp);./* isNT
11130 28 29 20 69 73 20 31 20 69 66 20 53 51 4c 49 54  () is 1 if SQLIT
11140 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73  E_OS_WINCE==1, s
11150 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e  o this else is n
11160 65 76 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a  ever executed. .
11170 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41 53 43  ** Since the ASC
11180 49 49 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  II version of th
11190 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50 49 20  ese Windows API 
111a0 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66 6f 72  do not exist for
111b0 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20   WINCE,.** it's 
111c0 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74  important to not
111d0 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 6d 20   reference them 
111e0 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c 64 73  for WINCE builds
111f0 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
11200 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65  OS_WINCE==0.  }e
11210 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
11220 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20  Temp;.    nByte 
11230 3d 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  = GetFullPathNam
11240 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  eA((char*)zConve
11250 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 20 2b  rted, 0, 0, 0) +
11260 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20   3;.    zTemp = 
11270 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69  malloc( nByte*si
11280 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29  zeof(zTemp[0]) )
11290 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d  ;.    if( zTemp=
112a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  =0 ){.      free
112b0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
112c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
112d0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
112e0 20 20 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61     GetFullPathNa
112f0 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  meA((char*)zConv
11300 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54  erted, nByte, zT
11310 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 66 72 65  emp, 0);.    fre
11320 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
11330 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65     zOut = sqlite
11340 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
11350 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20  utf8(zTemp);.   
11360 20 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 23 65   free(zTemp);.#e
11370 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 7a  ndif.  }.  if( z
11380 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Out ){.    sqlit
11390 65 33 5f 73 6e 70 72 69 6e 74 66 28 70 56 66 73  e3_snprintf(pVfs
113a0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 46  ->mxPathname, zF
113b0 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29  ull, "%s", zOut)
113c0 3b 0a 20 20 20 20 66 72 65 65 28 7a 4f 75 74 29  ;.    free(zOut)
113d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
113e0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
113f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11400 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65  TE_NOMEM;.  }.#e
11410 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ndif.}../*.** Ge
11420 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  t the sector siz
11430 65 20 6f 66 20 74 68 65 20 64 65 76 69 63 65 20  e of the device 
11440 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a  used to store.**
11450 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
11460 20 69 6e 74 20 67 65 74 53 65 63 74 6f 72 53 69   int getSectorSi
11470 7a 65 28 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ze(.    sqlite3_
11480 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 20 20 63  vfs *pVfs,.    c
11490 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61  onst char *zRela
114a0 74 69 76 65 20 20 20 20 20 2f 2a 20 55 54 46 2d  tive     /* UTF-
114b0 38 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 29  8 file name */.)
114c0 7b 0a 20 20 44 57 4f 52 44 20 62 79 74 65 73 50  {.  DWORD bytesP
114d0 65 72 53 65 63 74 6f 72 20 3d 20 53 51 4c 49 54  erSector = SQLIT
114e0 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52  E_DEFAULT_SECTOR
114f0 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 47 65 74 44  _SIZE;.  /* GetD
11500 69 73 6b 46 72 65 65 53 70 61 63 65 20 69 73 20  iskFreeSpace is 
11510 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 75 6e  not supported un
11520 64 65 72 20 57 49 4e 43 45 20 2a 2f 0a 23 69 66  der WINCE */.#if
11530 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
11540 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
11550 54 45 52 28 70 56 66 73 29 3b 0a 20 20 55 4e 55  TER(pVfs);.  UNU
11560 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 52  SED_PARAMETER(zR
11570 65 6c 61 74 69 76 65 29 3b 0a 23 65 6c 73 65 0a  elative);.#else.
11580 20 20 63 68 61 72 20 7a 46 75 6c 6c 70 61 74 68    char zFullpath
11590 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 0a 20 20  [MAX_PATH+1];.  
115a0 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52 44 20  int rc;.  DWORD 
115b0 64 77 52 65 74 20 3d 20 30 3b 0a 20 20 44 57 4f  dwRet = 0;.  DWO
115c0 52 44 20 64 77 44 75 6d 6d 79 3b 0a 0a 20 20 2f  RD dwDummy;..  /
115d0 2a 0a 20 20 2a 2a 20 57 65 20 6e 65 65 64 20 74  *.  ** We need t
115e0 6f 20 67 65 74 20 74 68 65 20 66 75 6c 6c 20 70  o get the full p
115f0 61 74 68 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ath name of the 
11600 66 69 6c 65 0a 20 20 2a 2a 20 74 6f 20 67 65 74  file.  ** to get
11610 20 74 68 65 20 64 72 69 76 65 20 6c 65 74 74 65   the drive lette
11620 72 20 74 6f 20 6c 6f 6f 6b 20 75 70 20 74 68 65  r to look up the
11630 20 73 65 63 74 6f 72 0a 20 20 2a 2a 20 73 69 7a   sector.  ** siz
11640 65 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  e..  */.  Simula
11650 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
11660 31 29 3b 0a 20 20 72 63 20 3d 20 77 69 6e 46 75  1);.  rc = winFu
11670 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
11680 20 7a 52 65 6c 61 74 69 76 65 2c 20 4d 41 58 5f   zRelative, MAX_
11690 50 41 54 48 2c 20 7a 46 75 6c 6c 70 61 74 68 29  PATH, zFullpath)
116a0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
116b0 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
116c0 69 66 28 20 72 63 20 3d 3d 20 53 51 4c 49 54 45  if( rc == SQLITE
116d0 5f 4f 4b 20 29 0a 20 20 7b 0a 20 20 20 20 76 6f  _OK ).  {.    vo
116e0 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d  id *zConverted =
116f0 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65   convertUtf8File
11700 6e 61 6d 65 28 7a 46 75 6c 6c 70 61 74 68 29 3b  name(zFullpath);
11710 0a 20 20 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  .    if( zConver
11720 74 65 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ted ){.      if(
11730 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 20   isNT() ){.     
11740 20 20 20 2f 2a 20 74 72 69 6d 20 70 61 74 68 20     /* trim path 
11750 74 6f 20 6a 75 73 74 20 64 72 69 76 65 20 72 65  to just drive re
11760 66 65 72 65 6e 63 65 20 2a 2f 0a 20 20 20 20 20  ference */.     
11770 20 20 20 57 43 48 41 52 20 2a 70 20 3d 20 7a 43     WCHAR *p = zC
11780 6f 6e 76 65 72 74 65 64 3b 0a 20 20 20 20 20 20  onverted;.      
11790 20 20 66 6f 72 28 3b 2a 70 3b 70 2b 2b 29 7b 0a    for(;*p;p++){.
117a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 70            if( *p
117b0 20 3d 3d 20 27 5c 5c 27 20 29 7b 0a 20 20 20 20   == '\\' ){.    
117c0 20 20 20 20 20 20 20 20 2a 70 20 3d 20 27 5c 30          *p = '\0
117d0 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ';.            b
117e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
117f0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
11800 20 20 20 20 64 77 52 65 74 20 3d 20 47 65 74 44      dwRet = GetD
11810 69 73 6b 46 72 65 65 53 70 61 63 65 57 28 28 57  iskFreeSpaceW((W
11820 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64  CHAR*)zConverted
11830 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11850 20 20 20 20 26 64 77 44 75 6d 6d 79 2c 0a 20 20      &dwDummy,.  
11860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11880 26 62 79 74 65 73 50 65 72 53 65 63 74 6f 72 2c  &bytesPerSector,
11890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
118a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118b0 20 20 20 26 64 77 44 75 6d 6d 79 2c 0a 20 20 20     &dwDummy,.   
118c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
118e0 64 77 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20  dwDummy);.      
118f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
11900 2a 20 74 72 69 6d 20 70 61 74 68 20 74 6f 20 6a  * trim path to j
11910 75 73 74 20 64 72 69 76 65 20 72 65 66 65 72 65  ust drive refere
11920 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  nce */.        c
11930 68 61 72 20 2a 70 20 3d 20 28 63 68 61 72 20 2a  har *p = (char *
11940 29 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 20  )zConverted;.   
11950 20 20 20 20 20 66 6f 72 28 3b 2a 70 3b 70 2b 2b       for(;*p;p++
11960 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
11970 20 2a 70 20 3d 3d 20 27 5c 5c 27 20 29 7b 0a 20   *p == '\\' ){. 
11980 20 20 20 20 20 20 20 20 20 20 20 2a 70 20 3d 20             *p = 
11990 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20  '\0';.          
119a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
119b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
119c0 20 20 20 20 20 20 20 64 77 52 65 74 20 3d 20 47         dwRet = G
119d0 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
119e0 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
119f0 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
11a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a10 20 20 20 20 20 20 26 64 77 44 75 6d 6d 79 2c 0a        &dwDummy,.
11a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a40 20 20 26 62 79 74 65 73 50 65 72 53 65 63 74 6f    &bytesPerSecto
11a50 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
11a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a70 20 20 20 20 20 26 64 77 44 75 6d 6d 79 2c 0a 20       &dwDummy,. 
11a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11aa0 20 26 64 77 44 75 6d 6d 79 29 3b 0a 20 20 20 20   &dwDummy);.    
11ab0 20 20 7d 0a 20 20 20 20 20 20 66 72 65 65 28 7a    }.      free(z
11ac0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
11ad0 7d 0a 20 20 20 20 69 66 28 20 21 64 77 52 65 74  }.    if( !dwRet
11ae0 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73 50   ){.      bytesP
11af0 65 72 53 65 63 74 6f 72 20 3d 20 53 51 4c 49 54  erSector = SQLIT
11b00 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52  E_DEFAULT_SECTOR
11b10 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _SIZE;.    }.  }
11b20 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
11b30 20 28 69 6e 74 29 20 62 79 74 65 73 50 65 72 53   (int) bytesPerS
11b40 65 63 74 6f 72 3b 20 0a 7d 0a 0a 23 69 66 6e 64  ector; .}..#ifnd
11b50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
11b60 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a  OAD_EXTENSION./*
11b70 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66  .** Interfaces f
11b80 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61  or opening a sha
11b90 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e  red library, fin
11ba0 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74  ding entry point
11bb0 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  s.** within the 
11bc0 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
11bd0 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  and closing the 
11be0 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a  shared library..
11bf0 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61  */./*.** Interfa
11c00 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20  ces for opening 
11c10 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  a shared library
11c20 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20  , finding entry 
11c30 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e  points.** within
11c40 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
11c50 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67  ary, and closing
11c60 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
11c70 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ary..*/.static v
11c80 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e 28 73  oid *winDlOpen(s
11c90 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
11ca0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
11cb0 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41 4e 44  ilename){.  HAND
11cc0 4c 45 20 68 3b 0a 20 20 76 6f 69 64 20 2a 7a 43  LE h;.  void *zC
11cd0 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65  onverted = conve
11ce0 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  rtUtf8Filename(z
11cf0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55  Filename);.  UNU
11d00 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
11d10 66 73 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  fs);.  if( zConv
11d20 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
11d30 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
11d40 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
11d50 20 20 68 20 3d 20 4c 6f 61 64 4c 69 62 72 61 72    h = LoadLibrar
11d60 79 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76  yW((WCHAR*)zConv
11d70 65 72 74 65 64 29 3b 0a 2f 2a 20 69 73 4e 54 28  erted);./* isNT(
11d80 29 20 69 73 20 31 20 69 66 20 53 51 4c 49 54 45  ) is 1 if SQLITE
11d90 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f  _OS_WINCE==1, so
11da0 20 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65   this else is ne
11db0 76 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a  ver executed. .*
11dc0 2a 20 53 69 6e 63 65 20 74 68 65 20 41 53 43 49  * Since the ASCI
11dd0 49 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  I version of the
11de0 73 65 20 57 69 6e 64 6f 77 73 20 41 50 49 20 64  se Windows API d
11df0 6f 20 6e 6f 74 20 65 78 69 73 74 20 66 6f 72 20  o not exist for 
11e00 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69  WINCE,.** it's i
11e10 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20  mportant to not 
11e20 72 65 66 65 72 65 6e 63 65 20 74 68 65 6d 20 66  reference them f
11e30 6f 72 20 57 49 4e 43 45 20 62 75 69 6c 64 73 2e  or WINCE builds.
11e40 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
11e50 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c  S_WINCE==0.  }el
11e60 73 65 7b 0a 20 20 20 20 68 20 3d 20 4c 6f 61 64  se{.    h = Load
11e70 4c 69 62 72 61 72 79 41 28 28 63 68 61 72 2a 29  LibraryA((char*)
11e80 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e  zConverted);.#en
11e90 64 69 66 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a  dif.  }.  free(z
11ea0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 72 65  Converted);.  re
11eb0 74 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d  turn (void*)h;.}
11ec0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
11ed0 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  DlError(sqlite3_
11ee0 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
11ef0 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f  Buf, char *zBufO
11f00 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ut){.  UNUSED_PA
11f10 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
11f20 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67   getLastErrorMsg
11f30 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 29 3b  (nBuf, zBufOut);
11f40 0a 7d 0a 76 6f 69 64 20 28 2a 77 69 6e 44 6c 53  .}.void (*winDlS
11f50 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ym(sqlite3_vfs *
11f60 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e  pVfs, void *pHan
11f70 64 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  dle, const char 
11f80 2a 7a 53 79 6d 62 6f 6c 29 29 28 76 6f 69 64 29  *zSymbol))(void)
11f90 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
11fa0 45 54 45 52 28 70 56 66 73 29 3b 0a 23 69 66 20  ETER(pVfs);.#if 
11fb0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
11fc0 20 20 2f 2a 20 54 68 65 20 47 65 74 50 72 6f 63    /* The GetProc
11fd0 41 64 64 72 65 73 73 41 28 29 20 72 6f 75 74 69  AddressA() routi
11fe0 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c  ne is only avail
11ff0 61 62 6c 65 20 6f 6e 20 77 69 6e 63 65 2e 20 2a  able on wince. *
12000 2f 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64  /.  return (void
12010 28 2a 29 28 76 6f 69 64 29 29 47 65 74 50 72 6f  (*)(void))GetPro
12020 63 41 64 64 72 65 73 73 41 28 28 48 41 4e 44 4c  cAddressA((HANDL
12030 45 29 70 48 61 6e 64 6c 65 2c 20 7a 53 79 6d 62  E)pHandle, zSymb
12040 6f 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20  ol);.#else.  /* 
12050 41 6c 6c 20 6f 74 68 65 72 20 77 69 6e 64 6f 77  All other window
12060 73 20 70 6c 61 74 66 6f 72 6d 73 20 65 78 70 65  s platforms expe
12070 63 74 20 47 65 74 50 72 6f 63 41 64 64 72 65 73  ct GetProcAddres
12080 73 28 29 20 74 6f 20 74 61 6b 65 0a 20 20 2a 2a  s() to take.  **
12090 20 61 6e 20 41 6e 73 69 20 73 74 72 69 6e 67 20   an Ansi string 
120a0 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  regardless of th
120b0 65 20 5f 55 4e 49 43 4f 44 45 20 73 65 74 74 69  e _UNICODE setti
120c0 6e 67 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28  ng */.  return (
120d0 76 6f 69 64 28 2a 29 28 76 6f 69 64 29 29 47 65  void(*)(void))Ge
120e0 74 50 72 6f 63 41 64 64 72 65 73 73 28 28 48 41  tProcAddress((HA
120f0 4e 44 4c 45 29 70 48 61 6e 64 6c 65 2c 20 7a 53  NDLE)pHandle, zS
12100 79 6d 62 6f 6c 29 3b 0a 23 65 6e 64 69 66 0a 7d  ymbol);.#endif.}
12110 0a 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f 73 65  .void winDlClose
12120 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
12130 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c  fs, void *pHandl
12140 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e){.  UNUSED_PAR
12150 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
12160 46 72 65 65 4c 69 62 72 61 72 79 28 28 48 41 4e  FreeLibrary((HAN
12170 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a  DLE)pHandle);.}.
12180 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49  #else /* if SQLI
12190 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
121a0 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65  ENSION is define
121b0 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  d: */.  #define 
121c0 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23  winDlOpen  0.  #
121d0 64 65 66 69 6e 65 20 77 69 6e 44 6c 45 72 72 6f  define winDlErro
121e0 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69  r 0.  #define wi
121f0 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65  nDlSym   0.  #de
12200 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f 73 65 20  fine winDlClose 
12210 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  0.#endif.../*.**
12220 20 57 72 69 74 65 20 75 70 20 74 6f 20 6e 42 75   Write up to nBu
12230 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f  f bytes of rando
12240 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75 66 2e  mness into zBuf.
12250 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
12260 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c  inRandomness(sql
12270 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
12280 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
12290 7a 42 75 66 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  zBuf){.  int n =
122a0 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   0;.  UNUSED_PAR
122b0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 23 69  AMETER(pVfs);.#i
122c0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
122d0 5f 54 45 53 54 29 0a 20 20 6e 20 3d 20 6e 42 75  _TEST).  n = nBu
122e0 66 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66  f;.  memset(zBuf
122f0 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 65 6c 73  , 0, nBuf);.#els
12300 65 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 53  e.  if( sizeof(S
12310 59 53 54 45 4d 54 49 4d 45 29 3c 3d 6e 42 75 66  YSTEMTIME)<=nBuf
12320 2d 6e 20 29 7b 0a 20 20 20 20 53 59 53 54 45 4d  -n ){.    SYSTEM
12330 54 49 4d 45 20 78 3b 0a 20 20 20 20 47 65 74 53  TIME x;.    GetS
12340 79 73 74 65 6d 54 69 6d 65 28 26 78 29 3b 0a 20  ystemTime(&x);. 
12350 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
12360 6e 5d 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78  n], &x, sizeof(x
12370 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a  ));.    n += siz
12380 65 6f 66 28 78 29 3b 0a 20 20 7d 0a 20 20 69 66  eof(x);.  }.  if
12390 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c  ( sizeof(DWORD)<
123a0 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44  =nBuf-n ){.    D
123b0 57 4f 52 44 20 70 69 64 20 3d 20 47 65 74 43 75  WORD pid = GetCu
123c0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
123d0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42  ;.    memcpy(&zB
123e0 75 66 5b 6e 5d 2c 20 26 70 69 64 2c 20 73 69 7a  uf[n], &pid, siz
123f0 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20 6e  eof(pid));.    n
12400 20 2b 3d 20 73 69 7a 65 6f 66 28 70 69 64 29 3b   += sizeof(pid);
12410 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f  .  }.  if( sizeo
12420 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e  f(DWORD)<=nBuf-n
12430 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 63 6e   ){.    DWORD cn
12440 74 20 3d 20 47 65 74 54 69 63 6b 43 6f 75 6e 74  t = GetTickCount
12450 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ();.    memcpy(&
12460 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73  zBuf[n], &cnt, s
12470 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20  izeof(cnt));.   
12480 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74   n += sizeof(cnt
12490 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a  );.  }.  if( siz
124a0 65 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45 47 45  eof(LARGE_INTEGE
124b0 52 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20  R)<=nBuf-n ){.  
124c0 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20    LARGE_INTEGER 
124d0 69 3b 0a 20 20 20 20 51 75 65 72 79 50 65 72 66  i;.    QueryPerf
124e0 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28 26  ormanceCounter(&
124f0 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  i);.    memcpy(&
12500 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a  zBuf[n], &i, siz
12510 65 6f 66 28 69 29 29 3b 0a 20 20 20 20 6e 20 2b  eof(i));.    n +
12520 3d 20 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20 7d  = sizeof(i);.  }
12530 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
12540 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c   n;.}.../*.** Sl
12550 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65  eep for a little
12560 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20   while.  Return 
12570 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  the amount of ti
12580 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61  me slept..*/.sta
12590 74 69 63 20 69 6e 74 20 77 69 6e 53 6c 65 65 70  tic int winSleep
125a0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
125b0 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63  fs, int microsec
125c0 29 7b 0a 20 20 53 6c 65 65 70 28 28 6d 69 63 72  ){.  Sleep((micr
125d0 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29 3b  osec+999)/1000);
125e0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
125f0 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74  TER(pVfs);.  ret
12600 75 72 6e 20 28 28 6d 69 63 72 6f 73 65 63 2b 39  urn ((microsec+9
12610 39 39 29 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a  99)/1000)*1000;.
12620 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
12630 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c  lowing variable,
12640 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e   if set to a non
12650 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20  -zero value, is 
12660 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a  interpreted as.*
12670 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
12680 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
12690 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20 74  70 and is used t
126a0 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74  o set the result
126b0 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73   of.** sqlite3Os
126c0 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75  CurrentTime() du
126d0 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f  ring testing..*/
126e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
126f0 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
12700 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30  current_time = 0
12710 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65  ;  /* Fake syste
12720 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64  m time in second
12730 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f  s since 1970. */
12740 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
12750 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
12760 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
12770 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
12780 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74  ime).  Write int
12790 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20  o *piNow.** the 
127a0 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64  current time and
127b0 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61   date as a Julia
127c0 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d  n Day number tim
127d0 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20  es 86_400_000.  
127e0 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64  In.** other word
127f0 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70  s, write into *p
12800 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20  iNow the number 
12810 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
12820 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e  since the Julian
12830 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f  .** epoch of noo
12840 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f  n in Greenwich o
12850 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34  n November 24, 4
12860 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e  714 B.C accordin
12870 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c  g to the.** prol
12880 65 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20  eptic Gregorian 
12890 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20  calendar..**.** 
128a0 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 75  On success, retu
128b0 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20  rn 0.  Return 1 
128c0 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
128d0 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66  date cannot be f
128e0 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
128f0 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69  int winCurrentTi
12900 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f  meInt64(sqlite3_
12910 76 66 73 20 2a 70 56 66 73 2c 20 73 71 6c 69 74  vfs *pVfs, sqlit
12920 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29  e3_int64 *piNow)
12930 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20  {.  /* FILETIME 
12940 73 74 72 75 63 74 75 72 65 20 69 73 20 61 20 36  structure is a 6
12950 34 2d 62 69 74 20 76 61 6c 75 65 20 72 65 70 72  4-bit value repr
12960 65 73 65 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d  esenting the num
12970 62 65 72 20 6f 66 20 0a 20 20 20 20 20 31 30 30  ber of .     100
12980 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65  -nanosecond inte
12990 72 76 61 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75  rvals since Janu
129a0 61 72 79 20 31 2c 20 31 36 30 31 20 28 3d 20 4a  ary 1, 1601 (= J
129b0 44 20 32 33 30 35 38 31 33 2e 35 29 2e 20 0a 20  D 2305813.5). . 
129c0 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45 20 66   */.  FILETIME f
129d0 74 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  t;.  static cons
129e0 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  t sqlite3_int64 
129f0 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68  winFiletimeEpoch
12a00 20 3d 20 32 33 30 35 38 31 33 35 2a 28 73 71 6c   = 23058135*(sql
12a10 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30  ite3_int64)86400
12a20 30 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  00;.#ifdef SQLIT
12a30 45 5f 54 45 53 54 0a 20 20 73 74 61 74 69 63 20  E_TEST.  static 
12a40 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e  const sqlite3_in
12a50 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20  t64 unixEpoch = 
12a60 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65  24405875*(sqlite
12a70 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b  3_int64)8640000;
12a80 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32 5e 33  .#endif.  /* 2^3
12a90 32 20 2d 20 74 6f 20 61 76 6f 69 64 20 75 73 65  2 - to avoid use
12aa0 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72 6e 69   of LL and warni
12ab0 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a 20 20  ngs in gcc */.  
12ac0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
12ad0 69 74 65 33 5f 69 6e 74 36 34 20 6d 61 78 33 32  ite3_int64 max32
12ae0 42 69 74 56 61 6c 75 65 20 3d 20 0a 20 20 20 20  BitValue = .    
12af0 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34    (sqlite3_int64
12b00 29 32 30 30 30 30 30 30 30 30 30 20 2b 20 28 73  )2000000000 + (s
12b10 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30  qlite3_int64)200
12b20 30 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69 74  0000000 + (sqlit
12b30 65 33 5f 69 6e 74 36 34 29 32 39 34 39 36 37 32  e3_int64)2949672
12b40 39 36 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  96;..#if SQLITE_
12b50 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59 53 54 45  OS_WINCE.  SYSTE
12b60 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20 47 65  MTIME time;.  Ge
12b70 74 53 79 73 74 65 6d 54 69 6d 65 28 26 74 69 6d  tSystemTime(&tim
12b80 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53 79 73 74  e);.  /* if Syst
12b90 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65  emTimeToFileTime
12ba0 28 29 20 66 61 69 6c 73 2c 20 69 74 20 72 65 74  () fails, it ret
12bb0 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20  urns zero. */.  
12bc0 69 66 20 28 21 53 79 73 74 65 6d 54 69 6d 65 54  if (!SystemTimeT
12bd0 6f 46 69 6c 65 54 69 6d 65 28 26 74 69 6d 65 2c  oFileTime(&time,
12be0 26 66 74 29 29 7b 0a 20 20 20 20 72 65 74 75 72  &ft)){.    retur
12bf0 6e 20 31 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  n 1;.  }.#else. 
12c00 20 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73   GetSystemTimeAs
12c10 46 69 6c 65 54 69 6d 65 28 20 26 66 74 20 29 3b  FileTime( &ft );
12c20 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70 69 4e 6f  .#endif..  *piNo
12c30 77 20 3d 20 77 69 6e 46 69 6c 65 74 69 6d 65 45  w = winFiletimeE
12c40 70 6f 63 68 20 2b 0a 20 20 20 20 20 20 20 20 20  poch +.         
12c50 20 20 20 28 28 28 28 73 71 6c 69 74 65 33 5f 69     ((((sqlite3_i
12c60 6e 74 36 34 29 66 74 2e 64 77 48 69 67 68 44 61  nt64)ft.dwHighDa
12c70 74 65 54 69 6d 65 29 2a 6d 61 78 33 32 42 69 74  teTime)*max32Bit
12c80 56 61 6c 75 65 29 20 2b 20 0a 20 20 20 20 20 20  Value) + .      
12c90 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
12ca0 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 4c 6f 77  3_int64)ft.dwLow
12cb0 44 61 74 65 54 69 6d 65 29 2f 28 73 71 6c 69 74  DateTime)/(sqlit
12cc0 65 33 5f 69 6e 74 36 34 29 31 30 30 30 30 3b 0a  e3_int64)10000;.
12cd0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
12ce0 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  EST.  if( sqlite
12cf0 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29  3_current_time )
12d00 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31  {.    *piNow = 1
12d10 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
12d20 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65  64)sqlite3_curre
12d30 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70  nt_time + unixEp
12d40 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  och;.  }.#endif.
12d50 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
12d60 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75  ER(pVfs);.  retu
12d70 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn 0;.}../*.** F
12d80 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
12d90 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
12da0 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
12db0 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65  ime).  Write the
12dc0 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65  .** current time
12dd0 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
12de0 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
12df0 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64   into *prNow and
12e00 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52  .** return 0.  R
12e10 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
12e20 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
12e30 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
12e40 0a 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54  .int winCurrentT
12e50 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ime(sqlite3_vfs 
12e60 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70  *pVfs, double *p
12e70 72 4e 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b  rNow){.  int rc;
12e80 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
12e90 20 69 3b 0a 20 20 72 63 20 3d 20 77 69 6e 43 75   i;.  rc = winCu
12ea0 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 70  rrentTimeInt64(p
12eb0 56 66 73 2c 20 26 69 29 3b 0a 20 20 69 66 28 20  Vfs, &i);.  if( 
12ec0 21 72 63 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f  !rc ){.    *prNo
12ed0 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30  w = i/86400000.0
12ee0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
12ef0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
12f00 69 64 65 61 20 69 73 20 74 68 61 74 20 74 68 69  idea is that thi
12f10 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73  s function works
12f20 20 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74   like a combinat
12f30 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73  ion of.** GetLas
12f40 74 45 72 72 6f 72 28 29 20 61 6e 64 20 46 6f 72  tError() and For
12f50 6d 61 74 4d 65 73 73 61 67 65 28 29 20 6f 6e 20  matMessage() on 
12f60 77 69 6e 64 6f 77 73 20 28 6f 72 20 65 72 72 6e  windows (or errn
12f70 6f 20 61 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f  o and.** strerro
12f80 72 5f 72 28 29 20 6f 6e 20 75 6e 69 78 29 2e 20  r_r() on unix). 
12f90 41 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 69  After an error i
12fa0 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  s returned by an
12fb0 20 4f 53 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c   OS.** function,
12fc0 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68   SQLite calls th
12fd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  is function with
12fe0 20 7a 42 75 66 20 70 6f 69 6e 74 69 6e 67 20 74   zBuf pointing t
12ff0 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 66  o.** a buffer of
13000 20 6e 42 75 66 20 62 79 74 65 73 2e 20 54 68 65   nBuf bytes. The
13010 20 4f 53 20 6c 61 79 65 72 20 73 68 6f 75 6c 64   OS layer should
13020 20 70 6f 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a   populate the.**
13030 20 62 75 66 66 65 72 20 77 69 74 68 20 61 20 6e   buffer with a n
13040 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54  ul-terminated UT
13050 46 2d 38 20 65 6e 63 6f 64 65 64 20 65 72 72 6f  F-8 encoded erro
13060 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 64 65 73  r message.** des
13070 63 72 69 62 69 6e 67 20 74 68 65 20 6c 61 73 74  cribing the last
13080 20 49 4f 20 65 72 72 6f 72 20 74 6f 20 68 61 76   IO error to hav
13090 65 20 6f 63 63 75 72 72 65 64 20 77 69 74 68 69  e occurred withi
130a0 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  n the calling.**
130b0 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49   thread..**.** I
130c0 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
130d0 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  age is too large
130e0 20 66 6f 72 20 74 68 65 20 73 75 70 70 6c 69 65   for the supplie
130f0 64 20 62 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20  d buffer,.** it 
13100 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61  should be trunca
13110 74 65 64 2e 20 54 68 65 20 72 65 74 75 72 6e 20  ted. The return 
13120 76 61 6c 75 65 20 6f 66 20 78 47 65 74 4c 61 73  value of xGetLas
13130 74 45 72 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72  tError.** is zer
13140 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d  o if the error m
13150 65 73 73 61 67 65 20 66 69 74 73 20 69 6e 20 74  essage fits in t
13160 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f  he buffer, or no
13170 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77  n-zero.** otherw
13180 69 73 65 20 28 69 66 20 74 68 65 20 6d 65 73 73  ise (if the mess
13190 61 67 65 20 77 61 73 20 74 72 75 6e 63 61 74 65  age was truncate
131a0 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20  d). If non-zero 
131b0 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20  is returned,.** 
131c0 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e  then it is not n
131d0 65 63 65 73 73 61 72 79 20 74 6f 20 69 6e 63 6c  ecessary to incl
131e0 75 64 65 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d  ude the nul-term
131f0 69 6e 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  inator character
13200 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 70 75  .** in the outpu
13210 74 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  t buffer..**.** 
13220 4e 6f 74 20 73 75 70 70 6c 79 69 6e 67 20 61 6e  Not supplying an
13230 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77   error message w
13240 69 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64 76 65  ill have no adve
13250 72 73 65 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e  rse effect.** on
13260 20 53 51 4c 69 74 65 2e 20 49 74 20 69 73 20 66   SQLite. It is f
13270 69 6e 65 20 74 6f 20 68 61 76 65 20 61 6e 20 69  ine to have an i
13280 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68  mplementation th
13290 61 74 20 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75  at never.** retu
132a0 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  rns an error mes
132b0 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e  sage:.**.**   in
132c0 74 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28  t xGetLastError(
132d0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
132e0 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
132f0 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20  r *zBuf){.**    
13300 20 61 73 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d   assert(zBuf[0]=
13310 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72  ='\0');.**     r
13320 65 74 75 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a  eturn 0;.**   }.
13330 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 20 69 66  **.** However if
13340 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
13350 65 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 69  e is supplied, i
13360 74 20 77 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70  t will be incorp
13370 6f 72 61 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c  orated.** by sql
13380 69 74 65 20 69 6e 74 6f 20 74 68 65 20 65 72 72  ite into the err
13390 6f 72 20 6d 65 73 73 61 67 65 20 61 76 61 69 6c  or message avail
133a0 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72  able to the user
133b0 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
133c0 33 5f 65 72 72 6d 73 67 28 29 2c 20 70 6f 73 73  3_errmsg(), poss
133d0 69 62 6c 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65  ibly making IO e
133e0 72 72 6f 72 73 20 65 61 73 69 65 72 20 74 6f 20  rrors easier to 
133f0 64 65 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  debug..*/.static
13400 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45   int winGetLastE
13410 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
13420 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
13430 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
13440 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
13450 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72  R(pVfs);.  retur
13460 6e 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73  n getLastErrorMs
13470 67 28 6e 42 75 66 2c 20 7a 42 75 66 29 3b 0a 7d  g(nBuf, zBuf);.}
13480 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  ..../*.** Initia
13490 6c 69 7a 65 20 61 6e 64 20 64 65 69 6e 69 74 69  lize and deiniti
134a0 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74  alize the operat
134b0 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72  ing system inter
134c0 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  face..*/.int sql
134d0 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69  ite3_os_init(voi
134e0 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c  d){.  static sql
134f0 69 74 65 33 5f 76 66 73 20 77 69 6e 56 66 73 20  ite3_vfs winVfs 
13500 3d 20 7b 0a 20 20 20 20 32 2c 20 20 20 20 20 20  = {.    2,      
13510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13520 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  iVersion */.    
13530 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c  sizeof(winFile),
13540 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65       /* szOsFile
13550 20 2a 2f 0a 20 20 20 20 4d 41 58 5f 50 41 54 48   */.    MAX_PATH
13560 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
13570 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20  mxPathname */.  
13580 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
13590 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20         /* pNext 
135a0 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22 2c 20  */.    "win32", 
135b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
135c0 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20  Name */.    0,  
135d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135e0 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a   /* pAppData */.
135f0 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20      winOpen,    
13600 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65           /* xOpe
13610 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65  n */.    winDele
13620 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te,           /*
13630 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20   xDelete */.    
13640 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20  winAccess,      
13650 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20       /* xAccess 
13660 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61  */.    winFullPa
13670 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78  thname,     /* x
13680 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  FullPathname */.
13690 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20      winDlOpen,  
136a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f           /* xDlO
136b0 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  pen */.    winDl
136c0 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20  Error,          
136d0 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20  /* xDlError */. 
136e0 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20     winDlSym,    
136f0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79          /* xDlSy
13700 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c  m */.    winDlCl
13710 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ose,          /*
13720 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20   xDlClose */.   
13730 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20   winRandomness, 
13740 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d        /* xRandom
13750 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53  ness */.    winS
13760 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20  leep,           
13770 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20   /* xSleep */.  
13780 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65    winCurrentTime
13790 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65  ,      /* xCurre
137a0 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69  ntTime */.    wi
137b0 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20  nGetLastError,  
137c0 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72     /* xGetLastEr
137d0 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75  ror */.    winCu
137e0 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20  rrentTimeInt64, 
137f0 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49  /* xCurrentTimeI
13800 6e 74 36 34 20 2a 2f 0a 20 20 7d 3b 0a 0a 20 20  nt64 */.  };..  
13810 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
13820 73 74 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29  ster(&winVfs, 1)
13830 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
13840 45 5f 4f 4b 3b 20 0a 7d 0a 69 6e 74 20 73 71 6c  E_OK; .}.int sql
13850 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64  ite3_os_end(void
13860 29 7b 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ){ .  return SQL
13870 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69  ITE_OK;.}..#endi
13880 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57  f /* SQLITE_OS_W
13890 49 4e 20 2a 2f 0a                                IN */.