/ Hex Artifact Content
Login

Artifact dfde7d33c446e89dd9a277c036f2c4cc564b3138:


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 7d 77 68 69 6c  ile->h);.  }whil
4990: 65 28 20 72 63 3d 3d 30 20 26 26 20 2b 2b 63 6e  e( rc==0 && ++cn
49a0: 74 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54  t < MX_CLOSE_ATT
49b0: 45 4d 50 54 20 26 26 20 28 53 6c 65 65 70 28 31  EMPT && (Sleep(1
49c0: 30 30 29 2c 20 31 29 20 29 3b 0a 23 69 66 20 53  00), 1) );.#if S
49d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23  QLITE_OS_WINCE.#
49e0: 64 65 66 69 6e 65 20 57 49 4e 43 45 5f 44 45 4c  define WINCE_DEL
49f0: 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33  ETION_ATTEMPTS 3
4a00: 0a 20 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c  .  winceDestroyL
4a10: 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  ock(pFile);.  if
4a20: 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65  ( pFile->zDelete
4a30: 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20 20 69  OnClose ){.    i
4a40: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
4a50: 77 68 69 6c 65 28 0a 20 20 20 20 20 20 20 20 20  while(.         
4a60: 20 20 44 65 6c 65 74 65 46 69 6c 65 57 28 70 46    DeleteFileW(pF
4a70: 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
4a80: 6f 73 65 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  ose)==0.        
4a90: 26 26 20 47 65 74 46 69 6c 65 41 74 74 72 69 62  && GetFileAttrib
4aa0: 75 74 65 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65  utesW(pFile->zDe
4ab0: 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78  leteOnClose)!=0x
4ac0: 66 66 66 66 66 66 66 66 20 0a 20 20 20 20 20 20  ffffffff .      
4ad0: 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20 57 49 4e    && cnt++ < WIN
4ae0: 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45  CE_DELETION_ATTE
4af0: 4d 50 54 53 0a 20 20 20 20 29 7b 0a 20 20 20 20  MPTS.    ){.    
4b00: 20 20 20 53 6c 65 65 70 28 31 30 30 29 3b 20 20     Sleep(100);  
4b10: 2f 2a 20 57 61 69 74 20 61 20 6c 69 74 74 6c 65  /* Wait a little
4b20: 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 61   before trying a
4b30: 67 61 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  gain */.    }.  
4b40: 20 20 66 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44    free(pFile->zD
4b50: 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20  eleteOnClose);. 
4b60: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52   }.#endif.  OSTR
4b70: 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 20 25  ACE(("CLOSE %d %
4b80: 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  s\n", pFile->h, 
4b90: 72 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  rc ? "ok" : "fai
4ba0: 6c 65 64 22 29 29 3b 0a 20 20 4f 70 65 6e 43 6f  led"));.  OpenCo
4bb0: 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 72 65 74  unter(-1);.  ret
4bc0: 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f  urn rc ? SQLITE_
4bd0: 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52  OK : SQLITE_IOER
4be0: 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  R;.}../*.** Some
4bf0: 20 6d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69   microsoft compi
4c00: 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64  lers lack this d
4c10: 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  efinition..*/.#i
4c20: 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45  fndef INVALID_SE
4c30: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23  T_FILE_POINTER.#
4c40: 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f   define INVALID_
4c50: 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
4c60: 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e   ((DWORD)-1).#en
4c70: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
4c80: 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65  data from a file
4c90: 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20   into a buffer. 
4ca0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
4cb0: 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65  K if all.** byte
4cc0: 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63  s were read succ
4cd0: 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c  essfully and SQL
4ce0: 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79  ITE_IOERR if any
4cf0: 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
4d00: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
4d10: 6e 74 20 77 69 6e 52 65 61 64 28 0a 20 20 73 71  nt winRead(.  sq
4d20: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
4d30: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
4d40: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
4d50: 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4d70: 20 57 72 69 74 65 20 63 6f 6e 74 65 6e 74 20 69   Write content i
4d80: 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
4d90: 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20  */.  int amt,   
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4db0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
4dc0: 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20  es to read */.  
4dd0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
4de0: 66 73 65 74 20 20 20 20 20 20 20 2f 2a 20 42 65  fset       /* Be
4df0: 67 69 6e 20 72 65 61 64 69 6e 67 20 61 74 20 74  gin reading at t
4e00: 68 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b  his offset */.){
4e10: 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74  .  LONG upperBit
4e20: 73 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73  s = (LONG)((offs
4e30: 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66  et>>32) & 0x7fff
4e40: 66 66 66 66 29 3b 0a 20 20 4c 4f 4e 47 20 6c 6f  ffff);.  LONG lo
4e50: 77 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29  werBits = (LONG)
4e60: 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  (offset & 0xffff
4e70: 66 66 66 66 29 3b 0a 20 20 44 57 4f 52 44 20 72  ffff);.  DWORD r
4e80: 63 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  c;.  winFile *pF
4e90: 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
4ea0: 69 64 3b 0a 20 20 44 57 4f 52 44 20 65 72 72 6f  id;.  DWORD erro
4eb0: 72 3b 0a 20 20 44 57 4f 52 44 20 67 6f 74 3b 0a  r;.  DWORD got;.
4ec0: 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
4ed0: 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
4ee0: 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
4ef0: 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b  ITE_IOERR_READ);
4f00: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
4f10: 44 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c  D %d lock=%d\n",
4f20: 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
4f30: 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20  ->locktype));.  
4f40: 72 63 20 3d 20 53 65 74 46 69 6c 65 50 6f 69 6e  rc = SetFilePoin
4f50: 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  ter(pFile->h, lo
4f60: 77 65 72 42 69 74 73 2c 20 26 75 70 70 65 72 42  werBits, &upperB
4f70: 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29  its, FILE_BEGIN)
4f80: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 49 4e 56 41  ;.  if( rc==INVA
4f90: 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
4fa0: 4e 54 45 52 20 26 26 20 28 65 72 72 6f 72 3d 47  NTER && (error=G
4fb0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d  etLastError())!=
4fc0: 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  NO_ERROR ){.    
4fd0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
4fe0: 20 3d 20 65 72 72 6f 72 3b 0a 20 20 20 20 72 65   = error;.    re
4ff0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
5000: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 52 65 61  ;.  }.  if( !Rea
5010: 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  dFile(pFile->h, 
5020: 70 42 75 66 2c 20 61 6d 74 2c 20 26 67 6f 74 2c  pBuf, amt, &got,
5030: 20 30 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65   0) ){.    pFile
5040: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65  ->lastErrno = Ge
5050: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
5060: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5070: 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 0a  IOERR_READ;.  }.
5080: 20 20 69 66 28 20 67 6f 74 3d 3d 28 44 57 4f 52    if( got==(DWOR
5090: 44 29 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74  D)amt ){.    ret
50a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
50b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 55   }else{.    /* U
50c0: 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20 74  nread parts of t
50d0: 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62  he buffer must b
50e0: 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f  e zero-filled */
50f0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63  .    memset(&((c
5100: 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c  har*)pBuf)[got],
5110: 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20   0, amt-got);.  
5120: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5130: 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
5140: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  ;.  }.}../*.** W
5150: 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61  rite data from a
5160: 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66   buffer into a f
5170: 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ile.  Return SQL
5180: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
5190: 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68  s.** or some oth
51a0: 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e  er error code on
51b0: 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
51c0: 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69 74 65  tic int winWrite
51d0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
51e0: 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a   *id,         /*
51f0: 20 46 69 6c 65 20 74 6f 20 77 72 69 74 65 20 69   File to write i
5200: 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  nto */.  const v
5210: 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
5220: 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 73 20     /* The bytes 
5230: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f  to be written */
5240: 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20  .  int amt,     
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5260: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
5270: 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 73 71  to write */.  sq
5280: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
5290: 65 74 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  et      /* Offse
52a0: 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20  t into the file 
52b0: 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67  to begin writing
52c0: 20 61 74 20 2a 2f 0a 29 7b 0a 20 20 4c 4f 4e 47   at */.){.  LONG
52d0: 20 75 70 70 65 72 42 69 74 73 20 3d 20 28 4c 4f   upperBits = (LO
52e0: 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29  NG)((offset>>32)
52f0: 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a   & 0x7fffffff);.
5300: 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73    LONG lowerBits
5310: 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74   = (LONG)(offset
5320: 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
5330: 20 20 44 57 4f 52 44 20 72 63 3b 0a 20 20 77 69    DWORD rc;.  wi
5340: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
5350: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44  winFile*)id;.  D
5360: 57 4f 52 44 20 65 72 72 6f 72 3b 0a 20 20 44 57  WORD error;.  DW
5370: 4f 52 44 20 77 72 6f 74 65 20 3d 20 30 3b 0a 0a  ORD wrote = 0;..
5380: 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
5390: 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
53a0: 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
53b0: 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 29 3b  TE_IOERR_WRITE);
53c0: 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
53d0: 75 6c 6c 45 72 72 6f 72 28 72 65 74 75 72 6e 20  ullError(return 
53e0: 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 20 20  SQLITE_FULL);.  
53f0: 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20  OSTRACE(("WRITE 
5400: 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70  %d lock=%d\n", p
5410: 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
5420: 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 72 63  locktype));.  rc
5430: 20 3d 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65   = SetFilePointe
5440: 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65  r(pFile->h, lowe
5450: 72 42 69 74 73 2c 20 26 75 70 70 65 72 42 69 74  rBits, &upperBit
5460: 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a  s, FILE_BEGIN);.
5470: 20 20 69 66 28 20 72 63 3d 3d 49 4e 56 41 4c 49    if( rc==INVALI
5480: 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
5490: 45 52 20 26 26 20 28 65 72 72 6f 72 3d 47 65 74  ER && (error=Get
54a0: 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f  LastError())!=NO
54b0: 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 70 46  _ERROR ){.    pF
54c0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
54d0: 20 65 72 72 6f 72 3b 0a 20 20 20 20 72 65 74 75   error;.    retu
54e0: 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
54f0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 61 6d    }.  assert( am
5500: 74 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 0a  t>0 );.  while(.
5510: 20 20 20 20 20 61 6d 74 3e 30 0a 20 20 20 20 20       amt>0.     
5520: 26 26 20 28 72 63 20 3d 20 57 72 69 74 65 46 69  && (rc = WriteFi
5530: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75  le(pFile->h, pBu
5540: 66 2c 20 61 6d 74 2c 20 26 77 72 6f 74 65 2c 20  f, amt, &wrote, 
5550: 30 29 29 21 3d 30 0a 20 20 20 20 20 26 26 20 77  0))!=0.     && w
5560: 72 6f 74 65 3e 30 0a 20 20 29 7b 0a 20 20 20 20  rote>0.  ){.    
5570: 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20  amt -= wrote;.  
5580: 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72    pBuf = &((char
5590: 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a  *)pBuf)[wrote];.
55a0: 20 20 7d 0a 20 20 69 66 28 20 21 72 63 20 7c 7c    }.  if( !rc ||
55b0: 20 61 6d 74 3e 28 69 6e 74 29 77 72 6f 74 65 20   amt>(int)wrote 
55c0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
55d0: 73 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73  stErrno = GetLas
55e0: 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 65  tError();.    re
55f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
5600: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
5610: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
5620: 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f  ** Truncate an o
5630: 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70  pen file to a sp
5640: 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a  ecified size.*/.
5650: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 54 72  static int winTr
5660: 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
5670: 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33  ile *id, sqlite3
5680: 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20  _int64 nByte){. 
5690: 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73 20   LONG upperBits 
56a0: 3d 20 28 4c 4f 4e 47 29 28 28 6e 42 79 74 65 3e  = (LONG)((nByte>
56b0: 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66  >32) & 0x7ffffff
56c0: 66 29 3b 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65 72  f);.  LONG lower
56d0: 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 6e 42  Bits = (LONG)(nB
56e0: 79 74 65 20 26 20 30 78 66 66 66 66 66 66 66 66  yte & 0xffffffff
56f0: 29 3b 0a 20 20 44 57 4f 52 44 20 64 77 52 65 74  );.  DWORD dwRet
5700: 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  ;.  winFile *pFi
5710: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
5720: 64 3b 0a 20 20 44 57 4f 52 44 20 65 72 72 6f 72  d;.  DWORD error
5730: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
5740: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
5750: 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f 53  t( id!=0 );.  OS
5760: 54 52 41 43 45 28 28 22 54 52 55 4e 43 41 54 45  TRACE(("TRUNCATE
5770: 20 25 64 20 25 6c 6c 64 5c 6e 22 2c 20 70 46 69   %d %lld\n", pFi
5780: 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 29 3b 0a  le->h, nByte));.
5790: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
57a0: 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
57b0: 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 29 3b  IOERR_TRUNCATE);
57c0: 0a 20 20 64 77 52 65 74 20 3d 20 53 65 74 46 69  .  dwRet = SetFi
57d0: 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d  lePointer(pFile-
57e0: 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26  >h, lowerBits, &
57f0: 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f  upperBits, FILE_
5800: 42 45 47 49 4e 29 3b 0a 20 20 69 66 28 20 64 77  BEGIN);.  if( dw
5810: 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54  Ret==INVALID_SET
5820: 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 26 26  _FILE_POINTER &&
5830: 20 28 65 72 72 6f 72 3d 47 65 74 4c 61 73 74 45   (error=GetLastE
5840: 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f  rror())!=NO_ERRO
5850: 52 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  R ){.    pFile->
5860: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6f  lastErrno = erro
5870: 72 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  r;.    rc = SQLI
5880: 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
5890: 45 3b 0a 20 20 2f 2a 20 53 65 74 45 6e 64 4f 66  E;.  /* SetEndOf
58a0: 46 69 6c 65 20 77 69 6c 6c 20 66 61 69 6c 20 69  File will fail i
58b0: 66 20 6e 42 79 74 65 20 69 73 20 6e 65 67 61 74  f nByte is negat
58c0: 69 76 65 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69  ive */.  }else i
58d0: 66 28 20 21 53 65 74 45 6e 64 4f 66 46 69 6c 65  f( !SetEndOfFile
58e0: 28 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20 20  (pFile->h) ){.  
58f0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
5900: 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f  no = GetLastErro
5910: 72 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  r();.    rc = SQ
5920: 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
5930: 41 54 45 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  ATE;.  }.  OSTRA
5940: 43 45 28 28 22 54 52 55 4e 43 41 54 45 20 25 64  CE(("TRUNCATE %d
5950: 20 25 6c 6c 64 20 25 73 5c 6e 22 2c 20 70 46 69   %lld %s\n", pFi
5960: 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 72 63  le->h, nByte, rc
5970: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
5980: 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
5990: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
59a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
59b0: 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  EST./*.** Count 
59c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75  the number of fu
59d0: 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d  llsyncs and norm
59e0: 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20  al syncs.  This 
59f0: 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a  is used to test.
5a00: 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e  ** that syncs an
5a10: 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20  d fullsyncs are 
5a20: 6f 63 63 75 72 69 6e 67 20 61 74 20 74 68 65 20  occuring at the 
5a30: 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a  right times..*/.
5a40: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  int sqlite3_sync
5a50: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20  _count = 0;.int 
5a60: 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
5a70: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
5a80: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  if../*.** Make s
5a90: 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74  ure all writes t
5aa0: 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66  o a particular f
5ab0: 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65  ile are committe
5ac0: 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74  d to disk..*/.st
5ad0: 61 74 69 63 20 69 6e 74 20 77 69 6e 53 79 6e 63  atic int winSync
5ae0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
5af0: 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 23  d, int flags){.#
5b00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  ifndef SQLITE_NO
5b10: 5f 53 59 4e 43 0a 20 20 77 69 6e 46 69 6c 65 20  _SYNC.  winFile 
5b20: 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
5b30: 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74  e*)id;..  assert
5b40: 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54  ( id!=0 );.  OST
5b50: 52 41 43 45 28 28 22 53 59 4e 43 20 25 64 20 6c  RACE(("SYNC %d l
5b60: 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ock=%d\n", pFile
5b70: 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
5b80: 74 79 70 65 29 29 3b 0a 23 65 6c 73 65 0a 20 20  type));.#else.  
5b90: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
5ba0: 28 69 64 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  (id);.#endif.#if
5bb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  ndef SQLITE_TEST
5bc0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
5bd0: 54 45 52 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73  TER(flags);.#els
5be0: 65 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  e.  if( flags & 
5bf0: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
5c00: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
5c10: 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  fullsync_count++
5c20: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
5c30: 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  sync_count++;.#e
5c40: 6e 64 69 66 0a 20 20 2f 2a 20 49 66 20 77 65 20  ndif.  /* If we 
5c50: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68  compiled with th
5c60: 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
5c70: 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63   flag, then sync
5c80: 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f  ing is a.  ** no
5c90: 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  -op.  */.#ifdef 
5ca0: 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20  SQLITE_NO_SYNC. 
5cb0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5cc0: 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  _OK;.#else.  if(
5cd0: 20 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72   FlushFileBuffer
5ce0: 73 28 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20  s(pFile->h) ){. 
5cf0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5d00: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
5d10: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
5d20: 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f  no = GetLastErro
5d30: 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  r();.    return 
5d40: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
5d50: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
5d60: 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
5d70: 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
5d80: 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a  a file in bytes.
5d90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
5da0: 6e 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  nFileSize(sqlite
5db0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69  3_file *id, sqli
5dc0: 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65  te3_int64 *pSize
5dd0: 29 7b 0a 20 20 44 57 4f 52 44 20 75 70 70 65 72  ){.  DWORD upper
5de0: 42 69 74 73 3b 0a 20 20 44 57 4f 52 44 20 6c 6f  Bits;.  DWORD lo
5df0: 77 65 72 42 69 74 73 3b 0a 20 20 77 69 6e 46 69  werBits;.  winFi
5e00: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
5e10: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52  File*)id;.  DWOR
5e20: 44 20 65 72 72 6f 72 3b 0a 0a 20 20 61 73 73 65  D error;..  asse
5e30: 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53  rt( id!=0 );.  S
5e40: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
5e50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
5e60: 52 52 5f 46 53 54 41 54 29 3b 0a 20 20 6c 6f 77  RR_FSTAT);.  low
5e70: 65 72 42 69 74 73 20 3d 20 47 65 74 46 69 6c 65  erBits = GetFile
5e80: 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26  Size(pFile->h, &
5e90: 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20 69 66  upperBits);.  if
5ea0: 28 20 20 20 28 6c 6f 77 65 72 42 69 74 73 20 3d  (   (lowerBits =
5eb0: 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 53  = INVALID_FILE_S
5ec0: 49 5a 45 29 0a 20 20 20 20 20 26 26 20 28 28 65  IZE).     && ((e
5ed0: 72 72 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72  rror = GetLastEr
5ee0: 72 6f 72 28 29 29 20 21 3d 20 4e 4f 5f 45 52 52  ror()) != NO_ERR
5ef0: 4f 52 29 20 29 0a 20 20 7b 0a 20 20 20 20 70 46  OR) ).  {.    pF
5f00: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
5f10: 20 65 72 72 6f 72 3b 0a 20 20 20 20 72 65 74 75   error;.    retu
5f20: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
5f30: 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53  FSTAT;.  }.  *pS
5f40: 69 7a 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33  ize = (((sqlite3
5f50: 5f 69 6e 74 36 34 29 75 70 70 65 72 42 69 74 73  _int64)upperBits
5f60: 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69  )<<32) + lowerBi
5f70: 74 73 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ts;.  return SQL
5f80: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
5f90: 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
5fa0: 4d 4d 45 44 49 41 54 45 4c 59 20 69 73 20 75 6e  MMEDIATELY is un
5fb0: 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d 65 20  defined on some 
5fc0: 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e  Windows systems.
5fd0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b  .*/.#ifndef LOCK
5fe0: 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
5ff0: 41 54 45 4c 59 0a 23 20 64 65 66 69 6e 65 20 4c  ATELY.# define L
6000: 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
6010: 45 44 49 41 54 45 4c 59 20 31 0a 23 65 6e 64 69  EDIATELY 1.#endi
6020: 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  f../*.** Acquire
6030: 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a   a reader lock..
6040: 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50 49  ** Different API
6050: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61   routines are ca
6060: 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f  lled depending o
6070: 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
6080: 20 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39   this.** is Win9
6090: 35 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73  5 or WinNT..*/.s
60a0: 74 61 74 69 63 20 69 6e 74 20 67 65 74 52 65 61  tatic int getRea
60b0: 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70  dLock(winFile *p
60c0: 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73  File){.  int res
60d0: 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  ;.  if( isNT() )
60e0: 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44  {.    OVERLAPPED
60f0: 20 6f 76 6c 70 3b 0a 20 20 20 20 6f 76 6c 70 2e   ovlp;.    ovlp.
6100: 4f 66 66 73 65 74 20 3d 20 53 48 41 52 45 44 5f  Offset = SHARED_
6110: 46 49 52 53 54 3b 0a 20 20 20 20 6f 76 6c 70 2e  FIRST;.    ovlp.
6120: 4f 66 66 73 65 74 48 69 67 68 20 3d 20 30 3b 0a  OffsetHigh = 0;.
6130: 20 20 20 20 6f 76 6c 70 2e 68 45 76 65 6e 74 20      ovlp.hEvent 
6140: 3d 20 30 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c  = 0;.    res = L
6150: 6f 63 6b 46 69 6c 65 45 78 28 70 46 69 6c 65 2d  ockFileEx(pFile-
6160: 3e 68 2c 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49  >h, LOCKFILE_FAI
6170: 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 2c 0a 20  L_IMMEDIATELY,. 
6180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6190: 20 20 20 20 30 2c 20 53 48 41 52 45 44 5f 53 49      0, SHARED_SI
61a0: 5a 45 2c 20 30 2c 20 26 6f 76 6c 70 29 3b 0a 2f  ZE, 0, &ovlp);./
61b0: 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66  * isNT() is 1 if
61c0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
61d0: 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73  ==1, so this els
61e0: 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75  e is never execu
61f0: 74 65 64 2e 20 0a 2a 2f 0a 23 69 66 20 53 51 4c  ted. .*/.#if SQL
6200: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a  ITE_OS_WINCE==0.
6210: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
6220: 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   lk;.    sqlite3
6230: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
6240: 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20  of(lk), &lk);.  
6250: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c    pFile->sharedL
6260: 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72 74  ockByte = (short
6270: 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66  )((lk & 0x7fffff
6280: 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45  ff)%(SHARED_SIZE
6290: 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73 20   - 1));.    res 
62a0: 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65  = LockFile(pFile
62b0: 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
62c0: 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  T+pFile->sharedL
62d0: 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30  ockByte, 0, 1, 0
62e0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
62f0: 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29 7b 0a  if( res == 0 ){.
6300: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
6310: 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72  rrno = GetLastEr
6320: 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ror();.  }.  ret
6330: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
6340: 2a 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63  * Undo a readloc
6350: 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  k.*/.static int 
6360: 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77  unlockReadLock(w
6370: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
6380: 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 66 28    int res;.  if(
6390: 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72   isNT() ){.    r
63a0: 65 73 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 28  es = UnlockFile(
63b0: 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
63c0: 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45  _FIRST, 0, SHARE
63d0: 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 2f 2a 20 69  D_SIZE, 0);./* i
63e0: 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51  sNT() is 1 if SQ
63f0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31  LITE_OS_WINCE==1
6400: 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69  , so this else i
6410: 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64  s never executed
6420: 2e 20 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  . .*/.#if SQLITE
6430: 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d  _OS_WINCE==0.  }
6440: 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20  else{.    res = 
6450: 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65  UnlockFile(pFile
6460: 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
6470: 54 20 2b 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  T + pFile->share
6480: 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c  dLockByte, 0, 1,
6490: 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a   0);.#endif.  }.
64a0: 20 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29    if( res == 0 )
64b0: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
64c0: 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74  tErrno = GetLast
64d0: 45 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 72  Error();.  }.  r
64e0: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
64f0: 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
6500: 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
6510: 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
6520: 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20  ameter locktype 
6530: 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
6540: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
6550: 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
6560: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
6570: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
6580: 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
6590: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
65a0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
65b0: 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
65c0: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
65d0: 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
65e0: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
65f0: 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
6600: 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
6610: 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
6620: 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
6630: 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
6640: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
6650: 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
6660: 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
6670: 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
6680: 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
6690: 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
66a0: 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
66b0: 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
66c0: 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
66d0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
66e0: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
66f0: 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
6700: 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
6710: 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
6720: 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
6730: 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
6740: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
6750: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
6760: 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
6770: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
6780: 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
6790: 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
67a0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
67b0: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
67c0: 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54  rease a lock.  T
67d0: 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72  he winUnlock() r
67e0: 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73  outine.** erases
67f0: 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e   all locks at on
6800: 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 75  ce and returns u
6810: 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  s immediately to
6820: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30   locking level 0
6830: 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70  ..** It is not p
6840: 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72  ossible to lower
6850: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
6860: 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 20 61  el one step at a
6870: 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d   time.  You.** m
6880: 75 73 74 20 67 6f 20 73 74 72 61 69 67 68 74 20  ust go straight 
6890: 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  to locking level
68a0: 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
68b0: 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74 65  t winLock(sqlite
68c0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
68d0: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
68e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
68f0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
6900: 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69  de from subrouti
6910: 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  nes */.  int res
6920: 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
6930: 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 20 77  /* Result of a w
6940: 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c  indows lock call
6950: 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63   */.  int newLoc
6960: 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20  ktype;       /* 
6970: 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  Set pFile->lockt
6980: 79 70 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ype to this valu
6990: 65 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  e before exiting
69a0: 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e   */.  int gotPen
69b0: 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20  dingLock = 0;/* 
69c0: 54 72 75 65 20 69 66 20 77 65 20 61 63 71 75 69  True if we acqui
69d0: 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  red a PENDING lo
69e0: 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a  ck this time */.
69f0: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
6a00: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
6a10: 0a 20 20 44 57 4f 52 44 20 65 72 72 6f 72 20 3d  .  DWORD error =
6a20: 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73   NO_ERROR;..  as
6a30: 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
6a40: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
6a50: 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 29  %d %d was %d(%d)
6a60: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
6a70: 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79  pFile->h, lockty
6a80: 70 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  pe, pFile->lockt
6a90: 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72  ype, pFile->shar
6aa0: 65 64 4c 6f 63 6b 42 79 74 65 29 29 3b 0a 0a 20  edLockByte));.. 
6ab0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
6ac0: 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
6ad0: 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d  f this type or m
6ae0: 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20  ore restrictive 
6af0: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69  on the.  ** OsFi
6b00: 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
6b10: 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e  Don't use the en
6b20: 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
6b30: 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74  h, as.  ** sqlit
6b40: 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29  e3OsEnterMutex()
6b50: 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
6b60: 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  led yet..  */.  
6b70: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
6b80: 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ype>=locktype ){
6b90: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6ba0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
6bb0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
6bc0: 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20  ocking sequence 
6bd0: 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a  is correct.  */.
6be0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
6bf0: 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f  >locktype!=NO_LO
6c00: 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK || locktype==
6c10: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
6c20: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
6c30: 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  e!=PENDING_LOCK 
6c40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
6c50: 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f  ktype!=RESERVED_
6c60: 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c  LOCK || pFile->l
6c70: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
6c80: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  LOCK );..  /* Lo
6c90: 63 6b 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c  ck the PENDING_L
6ca0: 4f 43 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e  OCK byte if we n
6cb0: 65 65 64 20 74 6f 20 61 63 71 75 69 72 65 20 61  eed to acquire a
6cc0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72   PENDING lock or
6cd0: 0a 20 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c  .  ** a SHARED l
6ce0: 6f 63 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20  ock.  If we are 
6cf0: 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52  acquiring a SHAR
6d00: 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71  ED lock, the acq
6d10: 75 69 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a  uisition of.  **
6d20: 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   the PENDING_LOC
6d30: 4b 20 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72  K byte is tempor
6d40: 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c  ary..  */.  newL
6d50: 6f 63 6b 74 79 70 65 20 3d 20 70 46 69 6c 65 2d  ocktype = pFile-
6d60: 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28  >locktype;.  if(
6d70: 20 20 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74     (pFile->lockt
6d80: 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20  ype==NO_LOCK).  
6d90: 20 20 20 7c 7c 20 28 20 20 20 28 6c 6f 63 6b 74     || (   (lockt
6da0: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
6db0: 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20 26 26  OCK).         &&
6dc0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70   (pFile->locktyp
6dd0: 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e==RESERVED_LOCK
6de0: 29 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  )).  ){.    int 
6df0: 63 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77 68 69  cnt = 3;.    whi
6e00: 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28  le( cnt-->0 && (
6e10: 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70  res = LockFile(p
6e20: 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47  File->h, PENDING
6e30: 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29  _BYTE, 0, 1, 0))
6e40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
6e50: 54 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67  Try 3 times to g
6e60: 65 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c  et the pending l
6e70: 6f 63 6b 2e 20 20 54 68 65 20 70 65 6e 64 69 6e  ock.  The pendin
6e80: 67 20 6c 6f 63 6b 20 6d 69 67 68 74 20 62 65 0a  g lock might be.
6e90: 20 20 20 20 20 20 2a 2a 20 68 65 6c 64 20 62 79        ** held by
6ea0: 20 61 6e 6f 74 68 65 72 20 72 65 61 64 65 72 20   another reader 
6eb0: 70 72 6f 63 65 73 73 20 77 68 6f 20 77 69 6c 6c  process who will
6ec0: 20 72 65 6c 65 61 73 65 20 69 74 20 6d 6f 6d 65   release it mome
6ed0: 6e 74 61 72 69 6c 79 2e 0a 20 20 20 20 20 20 2a  ntarily..      *
6ee0: 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  /.      OSTRACE(
6ef0: 28 22 63 6f 75 6c 64 20 6e 6f 74 20 67 65 74 20  ("could not get 
6f00: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 20  a PENDING lock. 
6f10: 63 6e 74 3d 25 64 5c 6e 22 2c 20 63 6e 74 29 29  cnt=%d\n", cnt))
6f20: 3b 0a 20 20 20 20 20 20 53 6c 65 65 70 28 31 29  ;.      Sleep(1)
6f30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 50  ;.    }.    gotP
6f40: 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73  endingLock = res
6f50: 3b 0a 20 20 20 20 69 66 28 20 21 72 65 73 20 29  ;.    if( !res )
6f60: 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20  {.      error = 
6f70: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
6f80: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
6f90: 41 63 71 75 69 72 65 20 61 20 73 68 61 72 65 64  Acquire a shared
6fa0: 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28   lock.  */.  if(
6fb0: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
6fc0: 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  D_LOCK && res ){
6fd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
6fe0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  le->locktype==NO
6ff0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73  _LOCK );.    res
7000: 20 3d 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70   = getReadLock(p
7010: 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72  File);.    if( r
7020: 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
7030: 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44  ocktype = SHARED
7040: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
7050: 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20  {.      error = 
7060: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
7070: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
7080: 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56  Acquire a RESERV
7090: 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  ED lock.  */.  i
70a0: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53  f( locktype==RES
70b0: 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65  ERVED_LOCK && re
70c0: 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  s ){.    assert(
70d0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
70e0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
70f0: 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46  .    res = LockF
7100: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45  ile(pFile->h, RE
7110: 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
7120: 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
7130: 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
7140: 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56  ocktype = RESERV
7150: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
7160: 73 65 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20  se{.      error 
7170: 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  = GetLastError()
7180: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
7190: 2a 20 41 63 71 75 69 72 65 20 61 20 50 45 4e 44  * Acquire a PEND
71a0: 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  ING lock.  */.  
71b0: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
71c0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
71d0: 72 65 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c 6f  res ){.    newLo
71e0: 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47  cktype = PENDING
71f0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50 65  _LOCK;.    gotPe
7200: 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ndingLock = 0;. 
7210: 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
7220: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
7230: 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
7240: 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
7250: 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  E_LOCK && res ){
7260: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
7270: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48  le->locktype>=SH
7280: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
7290: 20 72 65 73 20 3d 20 75 6e 6c 6f 63 6b 52 65 61   res = unlockRea
72a0: 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
72b0: 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 72 65    OSTRACE(("unre
72c0: 61 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e 22 2c 20  adlock = %d\n", 
72d0: 72 65 73 29 29 3b 0a 20 20 20 20 72 65 73 20 3d  res));.    res =
72e0: 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d   LockFile(pFile-
72f0: 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
7300: 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  , 0, SHARED_SIZE
7310: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65  , 0);.    if( re
7320: 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  s ){.      newLo
7330: 63 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49  cktype = EXCLUSI
7340: 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  VE_LOCK;.    }el
7350: 73 65 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20  se{.      error 
7360: 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  = GetLastError()
7370: 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
7380: 28 22 65 72 72 6f 72 2d 63 6f 64 65 20 3d 20 25  ("error-code = %
7390: 64 5c 6e 22 2c 20 65 72 72 6f 72 29 29 3b 0a 20  d\n", error));. 
73a0: 20 20 20 20 20 67 65 74 52 65 61 64 4c 6f 63 6b       getReadLock
73b0: 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
73c0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61   }..  /* If we a
73d0: 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e  re holding a PEN
73e0: 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f  DING lock that o
73f0: 75 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61  ught to be relea
7400: 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72  sed, then.  ** r
7410: 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20  elease it now.. 
7420: 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e   */.  if( gotPen
7430: 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b  dingLock && lock
7440: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
7450: 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46  K ){.    UnlockF
7460: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45  ile(pFile->h, PE
7470: 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31  NDING_BYTE, 0, 1
7480: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
7490: 55 70 64 61 74 65 20 74 68 65 20 73 74 61 74 65  Update the state
74a0: 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61 73   of the lock has
74b0: 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69 6c   held in the fil
74c0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 65  e descriptor the
74d0: 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68  n.  ** return th
74e0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72 65  e appropriate re
74f0: 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  sult code..  */.
7500: 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
7510: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
7520: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 53  .  }else{.    OS
7530: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 46 41 49  TRACE(("LOCK FAI
7540: 4c 45 44 20 25 64 20 74 72 79 69 6e 67 20 66 6f  LED %d trying fo
7550: 72 20 25 64 20 62 75 74 20 67 6f 74 20 25 64 5c  r %d but got %d\
7560: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
7570: 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70           locktyp
7580: 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29 29  e, newLocktype))
7590: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  ;.    pFile->las
75a0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a  tErrno = error;.
75b0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
75c0: 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 46 69 6c  BUSY;.  }.  pFil
75d0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75  e->locktype = (u
75e0: 38 29 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20  8)newLocktype;. 
75f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7600: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7610: 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
7620: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
7630: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
7640: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
7650: 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
7660: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
7670: 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
7680: 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a  is held, return.
7690: 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68  ** non-zero, oth
76a0: 65 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a  erwise zero..*/.
76b0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 68  static int winCh
76c0: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
76d0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
76e0: 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
76f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 77 69 6e  .  int rc;.  win
7700: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
7710: 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61  inFile*)id;..  a
7720: 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
7730: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
7740: 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f  ktype>=RESERVED_
7750: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  LOCK ){.    rc =
7760: 20 31 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   1;.    OSTRACE(
7770: 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
7780: 64 20 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c  d %d (local)\n",
7790: 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b   pFile->h, rc));
77a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
77b0: 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c   = LockFile(pFil
77c0: 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
77d0: 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
77e0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
77f0: 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46     UnlockFile(pF
7800: 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44  ile->h, RESERVED
7810: 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
7820: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
7830: 21 72 63 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  !rc;.    OSTRACE
7840: 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
7850: 25 64 20 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e  %d %d (remote)\n
7860: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29  ", pFile->h, rc)
7870: 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75  );.  }.  *pResOu
7880: 74 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e  t = rc;.  return
7890: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
78a0: 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
78b0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
78c0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
78d0: 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20  id to locktype. 
78e0: 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73   locktype.** mus
78f0: 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
7900: 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
7910: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
7920: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
7930: 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
7940: 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
7950: 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
7960: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
7970: 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
7980: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
7990: 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  o-op..**.** It i
79a0: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
79b0: 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  or this routine 
79c0: 74 6f 20 66 61 69 6c 20 69 66 20 74 68 65 20 73  to fail if the s
79d0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a  econd argument.*
79e0: 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49  * is NO_LOCK.  I
79f0: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
7a00: 75 6d 65 6e 74 20 69 73 20 53 48 41 52 45 44 5f  ument is SHARED_
7a10: 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69 73 20 72  LOCK then this r
7a20: 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20  outine.** might 
7a30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
7a40: 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ERR;.*/.static i
7a50: 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c  nt winUnlock(sql
7a60: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
7a70: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
7a80: 69 6e 74 20 74 79 70 65 3b 0a 20 20 77 69 6e 46  int type;.  winF
7a90: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
7aa0: 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  nFile*)id;.  int
7ab0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
7ac0: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
7ad0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
7ae0: 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45   locktype<=SHARE
7af0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f 53 54 52  D_LOCK );.  OSTR
7b00: 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 64 20  ACE(("UNLOCK %d 
7b10: 74 6f 20 25 64 20 77 61 73 20 25 64 28 25 64 29  to %d was %d(%d)
7b20: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c  \n", pFile->h, l
7b30: 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 20  ocktype,.       
7b40: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
7b50: 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  pe, pFile->share
7b60: 64 4c 6f 63 6b 42 79 74 65 29 29 3b 0a 20 20 74  dLockByte));.  t
7b70: 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63  ype = pFile->loc
7b80: 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 74 79 70  ktype;.  if( typ
7b90: 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e>=EXCLUSIVE_LOC
7ba0: 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46  K ){.    UnlockF
7bb0: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48  ile(pFile->h, SH
7bc0: 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53  ARED_FIRST, 0, S
7bd0: 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
7be0: 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65      if( locktype
7bf0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
7c00: 20 21 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46   !getReadLock(pF
7c10: 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ile) ){.      /*
7c20: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76   This should nev
7c30: 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20 73  er happen.  We s
7c40: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
7c50: 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  able to.      **
7c60: 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
7c70: 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ead lock */.    
7c80: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
7c90: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_UNLOCK;.    
7ca0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65  }.  }.  if( type
7cb0: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
7cc0: 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c  ){.    UnlockFil
7cd0: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45  e(pFile->h, RESE
7ce0: 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
7cf0: 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c   0);.  }.  if( l
7d00: 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
7d10: 20 26 26 20 74 79 70 65 3e 3d 53 48 41 52 45 44   && type>=SHARED
7d20: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 6e 6c  _LOCK ){.    unl
7d30: 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  ockReadLock(pFil
7d40: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 79  e);.  }.  if( ty
7d50: 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  pe>=PENDING_LOCK
7d60: 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69   ){.    UnlockFi
7d70: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e  le(pFile->h, PEN
7d80: 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c  DING_BYTE, 0, 1,
7d90: 20 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65   0);.  }.  pFile
7da0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38  ->locktype = (u8
7db0: 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74  )locktype;.  ret
7dc0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7dd0: 20 43 6f 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65   Control and que
7de0: 72 79 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66  ry of the open f
7df0: 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ile handle..*/.s
7e00: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c  tatic int winFil
7e10: 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
7e20: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f  _file *id, int o
7e30: 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  p, void *pArg){.
7e40: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
7e50: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7e60: 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a  FCNTL_LOCKSTATE:
7e70: 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
7e80: 70 41 72 67 20 3d 20 28 28 77 69 6e 46 69 6c 65  pArg = ((winFile
7e90: 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 3b  *)id)->locktype;
7ea0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
7eb0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
7ec0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c     case SQLITE_L
7ed0: 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20  AST_ERRNO: {.   
7ee0: 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
7ef0: 20 28 69 6e 74 29 28 28 77 69 6e 46 69 6c 65 2a   (int)((winFile*
7f00: 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  )id)->lastErrno;
7f10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
7f20: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
7f30: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
7f40: 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20  CNTL_SIZE_HINT: 
7f50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
7f60: 69 6e 74 36 34 20 73 7a 20 3d 20 2a 28 73 71 6c  int64 sz = *(sql
7f70: 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 41 72 67  ite3_int64*)pArg
7f80: 3b 0a 20 20 20 20 20 20 77 69 6e 54 72 75 6e 63  ;.      winTrunc
7f90: 61 74 65 28 69 64 2c 20 73 7a 29 3b 0a 20 20 20  ate(id, sz);.   
7fa0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7fb0: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
7fc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
7fd0: 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  RROR;.}../*.** R
7fe0: 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
7ff0: 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
8000: 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
8010: 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
8020: 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
8030: 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
8040: 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
8050: 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
8060: 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
8070: 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
8080: 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
8090: 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
80a0: 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
80b0: 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
80c0: 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
80d0: 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
80e0: 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
80f0: 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
8100: 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
8110: 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
8120: 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
8130: 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74  e) that the sect
8140: 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
8150: 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20  the.** same for 
8160: 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  both..*/.static 
8170: 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53 69 7a  int winSectorSiz
8180: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
8190: 69 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  id){.  assert( i
81a0: 64 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  d!=0 );.  return
81b0: 20 28 69 6e 74 29 28 28 28 77 69 6e 46 69 6c 65   (int)(((winFile
81c0: 2a 29 69 64 29 2d 3e 73 65 63 74 6f 72 53 69 7a  *)id)->sectorSiz
81d0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  e);.}../*.** Ret
81e0: 75 72 6e 20 61 20 76 65 63 74 6f 72 20 6f 66 20  urn a vector of 
81f0: 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
8200: 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74 61 74 69  istics..*/.stati
8210: 63 20 69 6e 74 20 77 69 6e 44 65 76 69 63 65 43  c int winDeviceC
8220: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73  haracteristics(s
8230: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
8240: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
8250: 45 54 45 52 28 69 64 29 3b 0a 20 20 72 65 74 75  ETER(id);.  retu
8260: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  rn 0;.}../******
8270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82b0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
82c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82d0: 2a 2a 2a 2a 2a 2a 2a 2a 20 53 68 61 72 65 64 20  ******** Shared 
82e0: 4d 65 6d 6f 72 79 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  Memory *********
82f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8300: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ****.**.** The n
8310: 65 78 74 20 73 75 62 64 69 76 69 73 69 6f 6e 20  ext subdivision 
8320: 6f 66 20 63 6f 64 65 20 6d 61 6e 61 67 65 73 20  of code manages 
8330: 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  the shared-memor
8340: 79 20 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2f  y primitives..*/
8350: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8360: 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20  OMIT_WAL../*.** 
8370: 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73  Helper functions
8380: 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72   to obtain and r
8390: 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c  elinquish the gl
83a0: 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a  obal mutex. The.
83b0: 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  ** global mutex 
83c0: 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65  is used to prote
83d0: 63 74 20 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e  ct the winLockIn
83e0: 66 6f 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20  fo objects used 
83f0: 62 79 20 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65  by .** this file
8400: 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d  , all of which m
8410: 61 79 20 62 65 20 73 68 61 72 65 64 20 62 79 20  ay be shared by 
8420: 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73  multiple threads
8430: 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ..**.** Function
8440: 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
8450: 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 73  () is used to as
8460: 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
8470: 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a  global mutex .**
8480: 20 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65   is held when re
8490: 71 75 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e  quired. This fun
84a0: 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ction is only us
84b0: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
84c0: 73 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65  sert() .** state
84d0: 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a  ments. e.g..**.*
84e0: 2a 20 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  *   winShmEnterM
84f0: 75 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73  utex().**     as
8500: 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65  sert( winShmMute
8510: 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20  xHeld() );.**   
8520: 77 69 6e 45 6e 74 65 72 4c 65 61 76 65 28 29 0a  winEnterLeave().
8530: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
8540: 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
8550: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
8560: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c  _mutex_enter(sql
8570: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
8580: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
8590: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73  IC_MASTER));.}.s
85a0: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
85b0: 6d 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64  mLeaveMutex(void
85c0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
85d0: 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
85e0: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
85f0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
8600: 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65  ASTER));.}.#ifde
8610: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
8620: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
8630: 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20  MutexHeld(void) 
8640: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
8650: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71  e3_mutex_held(sq
8660: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
8670: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
8680: 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a  TIC_MASTER));.}.
8690: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62  #endif../*.** Ob
86a0: 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70  ject used to rep
86b0: 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65 20  resent a single 
86c0: 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64 20  file opened and 
86d0: 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76 69  mmapped to provi
86e0: 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65 6d  de.** shared mem
86f0: 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74 69  ory.  When multi
8700: 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20  ple threads all 
8710: 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61  reference the sa
8720: 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72  me.** log-summar
8730: 79 2c 20 65 61 63 68 20 74 68 72 65 61 64 20 68  y, each thread h
8740: 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e 46 69  as its own winFi
8750: 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74  le object, but t
8760: 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74  hey all.** point
8770: 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73   to a single ins
8780: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
8790: 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20  ject.  In other 
87a0: 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c  words, each.** l
87b0: 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f 70  og-summary is op
87c0: 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70  ened only once p
87d0: 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  er process..**.*
87e0: 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  * winShmMutexHel
87f0: 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65  d() must be true
8800: 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f   when creating o
8810: 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20  r destroying.** 
8820: 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77  this object or w
8830: 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20  hile reading or 
8840: 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c  writing the foll
8850: 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a  owing fields:.**
8860: 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a  .**      nRef.**
8870: 20 20 20 20 20 20 70 4e 65 78 74 20 0a 2a 2a 0a        pNext .**.
8880: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
8890: 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
88a0: 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20  -only after the 
88b0: 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
88c0: 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66  d:.** .**      f
88d0: 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65  id.**      zFile
88e0: 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65  name.**.** Eithe
88f0: 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74  r winShmNode.mut
8900: 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  ex must be held 
8910: 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52  or winShmNode.nR
8920: 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 6e  ef==0 and.** win
8930: 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69  ShmMutexHeld() i
8940: 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64  s true when read
8950: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61  ing or writing a
8960: 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a  ny other field.*
8970: 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  * in this struct
8980: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  ure..**.** To av
8990: 6f 69 64 20 64 65 61 64 6c 6f 63 6b 73 2c 20 6d  oid deadlocks, m
89a0: 75 74 65 78 20 61 6e 64 20 6d 75 74 65 78 42 75  utex and mutexBu
89b0: 66 20 61 72 65 20 61 6c 77 61 79 73 20 72 65 6c  f are always rel
89c0: 65 61 73 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  eased in the.** 
89d0: 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 74 68  reverse order th
89e0: 61 74 20 74 68 65 79 20 61 72 65 20 61 63 71 75  at they are acqu
89f0: 69 72 65 64 2e 20 20 6d 75 74 65 78 42 75 66 20  ired.  mutexBuf 
8a00: 69 73 20 61 6c 77 61 79 73 20 61 63 71 75 69 72  is always acquir
8a10: 65 64 0a 2a 2a 20 66 69 72 73 74 20 61 6e 64 20  ed.** first and 
8a20: 72 65 6c 65 61 73 65 64 20 6c 61 73 74 2e 20 20  released last.  
8a30: 54 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69  This invariant i
8a40: 73 20 63 68 65 63 6b 20 62 79 20 61 73 73 65 72  s check by asser
8a50: 74 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  ting.** sqlite3_
8a60: 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 29 20  mutex_notheld() 
8a70: 6f 6e 20 6d 75 74 65 78 20 77 68 65 6e 65 76 65  on mutex wheneve
8a80: 72 20 6d 75 74 65 78 42 75 66 20 69 73 20 61 63  r mutexBuf is ac
8a90: 71 75 69 72 65 64 20 6f 72 0a 2a 2a 20 72 65 6c  quired or.** rel
8aa0: 65 61 73 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74  eased..*/.struct
8ab0: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20 20   winShmNode {.  
8ac0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
8ad0: 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75  utex;      /* Mu
8ae0: 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68  tex to access th
8af0: 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  is object */.  c
8b00: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
8b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
8b20: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f  e of the file */
8b30: 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69 6c 65  .  winFile hFile
8b40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
8b50: 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f   File handle fro
8b60: 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20  m winOpen */..  
8b70: 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20  int szRegion;   
8b80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
8b90: 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d  ze of shared-mem
8ba0: 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20  ory regions */. 
8bb0: 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20   int nRegion;   
8bc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8bd0: 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52  ize of array apR
8be0: 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63  egion */.  struc
8bf0: 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a 20 20  t ShmRegion {.  
8c00: 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20    HANDLE hMap;  
8c10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8c20: 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 43  le handle from C
8c30: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
8c40: 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4d   */.    void *pM
8c50: 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69 6f 6e  ap;.  } *aRegion
8c60: 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
8c70: 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rno;           /
8c80: 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72  * The Windows er
8c90: 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73  rno from the las
8ca0: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a  t I/O error */..
8cb0: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
8cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8cd0: 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53 68 6d  Number of winShm
8ce0: 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
8cf0: 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77  g to this */.  w
8d00: 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20  inShm *pFirst;  
8d10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
8d20: 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20   winShm objects 
8d30: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
8d40: 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65   */.  winShmNode
8d50: 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
8d60: 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73 74   /* Next in list
8d70: 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f   of all winShmNo
8d80: 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69  de objects */.#i
8d90: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
8da0: 47 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64  G.  u8 nextShmId
8db0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
8dc0: 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65  * Next available
8dd0: 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75 65   winShm.id value
8de0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
8df0: 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72  *.** A global ar
8e00: 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68  ray of all winSh
8e10: 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a 2a  mNode objects..*
8e20: 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d 4d  *.** The winShmM
8e30: 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20  utexHeld() must 
8e40: 62 65 20 74 72 75 65 20 77 68 69 6c 65 20 72 65  be true while re
8e50: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
8e60: 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73   this list..*/.s
8e70: 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64 65  tatic winShmNode
8e80: 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74   *winShmNodeList
8e90: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72   = 0;../*.** Str
8ea0: 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74 65  ucture used inte
8eb0: 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56  rnally by this V
8ec0: 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  FS to record the
8ed0: 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20   state of an.** 
8ee0: 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  open shared memo
8ef0: 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ry connection..*
8f00: 2a 0a 2a 2a 20 77 69 6e 53 68 6d 2e 70 46 69 6c  *.** winShm.pFil
8f10: 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  e->mutex must be
8f20: 20 68 65 6c 64 20 77 68 69 6c 65 20 72 65 61 64   held while read
8f30: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
8f40: 68 65 0a 2a 2a 20 77 69 6e 53 68 6d 2e 70 4e 65  he.** winShm.pNe
8f50: 78 74 20 61 6e 64 20 77 69 6e 53 68 6d 2e 6c 6f  xt and winShm.lo
8f60: 63 6b 73 5b 5d 20 65 6c 65 6d 65 6e 74 73 2e 0a  cks[] elements..
8f70: 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d  **.** The winShm
8f80: 2e 70 46 69 6c 65 20 65 6c 65 6d 65 6e 74 20 69  .pFile element i
8f90: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68  s initialized wh
8fa0: 65 6e 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73  en the object is
8fb0: 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
8fc0: 69 73 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65  is read-only the
8fd0: 72 65 61 66 74 65 72 2e 0a 2a 2f 0a 73 74 72 75  reafter..*/.stru
8fe0: 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20 77 69  ct winShm {.  wi
8ff0: 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  nShmNode *pShmNo
9000: 64 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  de;      /* The 
9010: 75 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e 53 68  underlying winSh
9020: 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  mNode object */.
9030: 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78 74 3b    winShm *pNext;
9040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9050: 4e 65 78 74 20 77 69 6e 53 68 6d 20 77 69 74 68  Next winShm with
9060: 20 74 68 65 20 73 61 6d 65 20 77 69 6e 53 68 6d   the same winShm
9070: 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73  Node */.  u8 has
9080: 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20  Mutex;          
9090: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
90a0: 68 6f 6c 64 69 6e 67 20 74 68 65 20 77 69 6e 53  holding the winS
90b0: 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a  hmNode mutex */.
90c0: 20 20 75 38 20 68 61 73 4d 75 74 65 78 42 75 66    u8 hasMutexBuf
90d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
90e0: 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20  True if holding 
90f0: 70 46 69 6c 65 2d 3e 6d 75 74 65 78 42 75 66 20  pFile->mutexBuf 
9100: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
9110: 5f 44 45 42 55 47 0a 20 20 75 38 20 69 64 3b 20  _DEBUG.  u8 id; 
9120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9130: 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69      /* Id of thi
9140: 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  s connection wit
9150: 68 20 69 74 73 20 77 69 6e 53 68 6d 4e 6f 64 65  h its winShmNode
9160: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
9170: 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75  *.** Constants u
9180: 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a  sed for locking.
9190: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53  */.#define WIN_S
91a0: 48 4d 5f 42 41 53 45 20 20 20 28 28 31 38 2b 53  HM_BASE   ((18+S
91b0: 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29  QLITE_SHM_NLOCK)
91c0: 2a 34 29 20 20 20 20 20 20 20 20 2f 2a 20 66 69  *4)        /* fi
91d0: 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f  rst lock byte */
91e0: 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d  .#define WIN_SHM
91f0: 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f 53 48 4d  _DMS    (WIN_SHM
9200: 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d  _BASE+SQLITE_SHM
9210: 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64  _NLOCK)  /* dead
9220: 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f  man switch */../
9230: 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76 69 73  *.** Apply advis
9240: 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c  ory locks for al
9250: 6c 20 6e 20 62 79 74 65 73 20 62 65 67 69 6e 6e  l n bytes beginn
9260: 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a  ing at ofst..*/.
9270: 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c  #define _SHM_UNL
9280: 43 4b 20 20 31 0a 23 64 65 66 69 6e 65 20 5f 53  CK  1.#define _S
9290: 48 4d 5f 52 44 4c 43 4b 20 20 32 0a 23 64 65 66  HM_RDLCK  2.#def
92a0: 69 6e 65 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 20  ine _SHM_WRLCK  
92b0: 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  3.static int win
92c0: 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20  ShmSystemLock(. 
92d0: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69   winShmNode *pFi
92e0: 6c 65 2c 20 20 20 20 2f 2a 20 41 70 70 6c 79 20  le,    /* Apply 
92f0: 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70  locks to this op
9300: 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  en shared-memory
9310: 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   segment */.  in
9320: 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20  t lockType,     
9330: 20 20 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43      /* _SHM_UNLC
9340: 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f  K, _SHM_RDLCK, o
9350: 72 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a  r _SHM_WRLCK */.
9360: 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20    int ofst,     
9370: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
9380: 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20  t to first byte 
9390: 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c  to be locked/unl
93a0: 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ocked */.  int n
93b0: 42 79 74 65 20 20 20 20 20 20 20 20 20 20 20 20  Byte            
93c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
93d0: 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75  tes to lock or u
93e0: 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 4f 56  nlock */.){.  OV
93f0: 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20  ERLAPPED ovlp;. 
9400: 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 3b 0a   DWORD dwFlags;.
9410: 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20    int rc = 0;   
9420: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
9430: 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c 6f 63 6b  t code form Lock
9440: 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20  /UnlockFileEx() 
9450: 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20  */..  /* Access 
9460: 74 6f 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64  to the winShmNod
9470: 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69  e object is seri
9480: 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63 61  alized by the ca
9490: 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74  ller */.  assert
94a0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
94b0: 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65  held(pFile->mute
94c0: 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52 65  x) || pFile->nRe
94d0: 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e  f==0 );..  /* In
94e0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63  itialize the loc
94f0: 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  king parameters 
9500: 2a 2f 0a 20 20 64 77 46 6c 61 67 73 20 3d 20 4c  */.  dwFlags = L
9510: 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
9520: 45 44 49 41 54 45 4c 59 3b 0a 20 20 69 66 28 20  EDIATELY;.  if( 
9530: 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d  lockType == _SHM
9540: 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c 61 67 73  _WRLCK ) dwFlags
9550: 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43   |= LOCKFILE_EXC
9560: 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 0a 20 20  LUSIVE_LOCK;..  
9570: 2f 2a 20 46 69 6e 64 20 74 68 65 20 66 69 72 73  /* Find the firs
9580: 74 20 62 69 74 20 69 6e 20 6c 6f 63 6b 4d 61 73  t bit in lockMas
9590: 6b 20 74 68 61 74 20 69 73 20 73 65 74 20 2a 2f  k that is set */
95a0: 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c  .  memset(&ovlp,
95b0: 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c   0, sizeof(OVERL
95c0: 41 50 50 45 44 29 29 3b 0a 20 20 6f 76 6c 70 2e  APPED));.  ovlp.
95d0: 4f 66 66 73 65 74 20 3d 20 6f 66 73 74 3b 0a 0a  Offset = ofst;..
95e0: 20 20 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63 71    /* Release/Acq
95f0: 75 69 72 65 20 74 68 65 20 73 79 73 74 65 6d 2d  uire the system-
9600: 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20  level lock */.  
9610: 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53  if( lockType==_S
9620: 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  HM_UNLCK ){.    
9630: 72 63 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 45  rc = UnlockFileE
9640: 78 28 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68  x(pFile->hFile.h
9650: 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 2c 20 26  , 0, nByte, 0, &
9660: 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ovlp);.  }else{.
9670: 20 20 20 20 72 63 20 3d 20 4c 6f 63 6b 46 69 6c      rc = LockFil
9680: 65 45 78 28 70 46 69 6c 65 2d 3e 68 46 69 6c 65  eEx(pFile->hFile
9690: 2e 68 2c 20 64 77 46 6c 61 67 73 2c 20 30 2c 20  .h, dwFlags, 0, 
96a0: 6e 42 79 74 65 2c 20 30 2c 20 26 6f 76 6c 70 29  nByte, 0, &ovlp)
96b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 72 63 20  ;.  }.  if( !rc 
96c0: 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
96d0: 22 53 48 4d 2d 4c 4f 43 4b 20 25 64 20 25 73 20  "SHM-LOCK %d %s 
96e0: 45 52 52 4f 52 20 30 78 25 30 38 6c 78 5c 6e 22  ERROR 0x%08lx\n"
96f0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
9700: 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a  pFile->hFile.h,.
9710: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63               loc
9720: 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43  kType==_SHM_UNLC
9730: 4b 20 3f 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45  K ? "UnlockFileE
9740: 78 22 20 3a 20 22 4c 6f 63 6b 46 69 6c 65 45 78  x" : "LockFileEx
9750: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
9760: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29  GetLastError()))
9770: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 28 72 63  ;.  }.  rc = (rc
9780: 21 3d 30 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  !=0) ? SQLITE_OK
9790: 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   : SQLITE_BUSY;.
97a0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
97b0: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
97c0: 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 6d 65  rences to VFS me
97d0: 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63 20  thods */.static 
97e0: 69 6e 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c 69  int winOpen(sqli
97f0: 74 65 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20 63  te3_vfs*,const c
9800: 68 61 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69 6c  har*,sqlite3_fil
9810: 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74  e*,int,int*);.st
9820: 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65  atic int winDele
9830: 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  te(sqlite3_vfs *
9840: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  ,const char*,int
9850: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20  );../*.** Purge 
9860: 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69  the winShmNodeLi
9870: 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65  st list of all e
9880: 6e 74 72 69 65 73 20 77 69 74 68 20 77 69 6e 53  ntries with winS
9890: 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a  hmNode.nRef==0..
98a0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
98b0: 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d  t a VFS shared-m
98c0: 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74  emory method; it
98d0: 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 75   is a utility fu
98e0: 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a  nction called.**
98f0: 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d   by VFS shared-m
9900: 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a  emory methods..*
9910: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
9920: 6e 53 68 6d 50 75 72 67 65 28 73 71 6c 69 74 65  nShmPurge(sqlite
9930: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
9940: 20 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20 20   deleteFlag){.  
9950: 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b  winShmNode **pp;
9960: 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
9970: 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e 53  ;.  assert( winS
9980: 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  hmMutexHeld() );
9990: 0a 20 20 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e  .  pp = &winShmN
99a0: 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65  odeList;.  while
99b0: 28 20 28 70 20 3d 20 2a 70 70 29 21 3d 30 20 29  ( (p = *pp)!=0 )
99c0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65  {.    if( p->nRe
99d0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  f==0 ){.      in
99e0: 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t i;.      if( p
99f0: 2d 3e 6d 75 74 65 78 20 29 20 73 71 6c 69 74 65  ->mutex ) sqlite
9a00: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e  3_mutex_free(p->
9a10: 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 66 6f  mutex);.      fo
9a20: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67  r(i=0; i<p->nReg
9a30: 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ion; i++){.     
9a40: 20 20 20 55 6e 6d 61 70 56 69 65 77 4f 66 46 69     UnmapViewOfFi
9a50: 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d  le(p->aRegion[i]
9a60: 2e 70 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  .pMap);.        
9a70: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61  CloseHandle(p->a
9a80: 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b  Region[i].hMap);
9a90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9aa0: 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68 20 21 3d  f( p->hFile.h !=
9ab0: 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f   INVALID_HANDLE_
9ac0: 56 41 4c 55 45 20 29 20 7b 0a 20 20 20 20 20 20  VALUE ) {.      
9ad0: 20 20 77 69 6e 43 6c 6f 73 65 28 28 73 71 6c 69    winClose((sqli
9ae0: 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 2d 3e 68  te3_file *)&p->h
9af0: 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  File);.      }. 
9b00: 20 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46       if( deleteF
9b10: 6c 61 67 20 29 20 77 69 6e 44 65 6c 65 74 65 28  lag ) winDelete(
9b20: 70 56 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61  pVfs, p->zFilena
9b30: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 2a 70  me, 0);.      *p
9b40: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
9b50: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9b60: 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b 0a 20 20  (p->aRegion);.  
9b70: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9b80: 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (p);.    }else{.
9b90: 20 20 20 20 20 20 70 70 20 3d 20 26 70 2d 3e 70        pp = &p->p
9ba0: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
9bb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
9bc0: 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72  shared-memory ar
9bd0: 65 61 2e 20 20 54 68 69 73 20 70 61 72 74 69 63  ea.  This partic
9be0: 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74  ular implementat
9bf0: 69 6f 6e 20 75 73 65 73 0a 2a 2a 20 6d 6d 61 70  ion uses.** mmap
9c00: 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ped files..**.**
9c10: 20 7a 4e 61 6d 65 20 69 73 20 61 20 66 69 6c 65   zName is a file
9c20: 6e 61 6d 65 20 75 73 65 64 20 74 6f 20 69 64 65  name used to ide
9c30: 6e 74 69 66 79 20 74 68 65 20 73 68 61 72 65 64  ntify the shared
9c40: 2d 6d 65 6d 6f 72 79 20 61 72 65 61 2e 20 20 54  -memory area.  T
9c50: 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  he.** implementa
9c60: 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 28 61  tion does not (a
9c70: 6e 64 20 70 65 72 68 61 70 73 20 73 68 6f 75 6c  nd perhaps shoul
9c80: 64 20 6e 6f 74 29 20 75 73 65 20 74 68 69 73 20  d not) use this 
9c90: 6e 61 6d 65 0a 2a 2a 20 64 69 72 65 63 74 6c 79  name.** directly
9ca0: 2c 20 62 75 74 20 72 61 74 68 65 72 20 75 73 65  , but rather use
9cb0: 20 69 74 20 61 73 20 61 20 74 65 6d 70 6c 61 74   it as a templat
9cc0: 65 20 66 6f 72 20 66 69 6e 64 69 6e 67 20 61 6e  e for finding an
9cd0: 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
9ce0: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 73 68 61  name for the sha
9cf0: 72 65 64 2d 6d 65 6d 6f 72 79 20 73 74 6f 72 61  red-memory stora
9d00: 67 65 2e 20 20 49 6e 20 74 68 69 73 20 69 6d 70  ge.  In this imp
9d10: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65  lementation, the
9d20: 0a 2a 2a 20 73 74 72 69 6e 67 20 22 2d 69 6e 64  .** string "-ind
9d30: 65 78 22 20 69 73 20 61 70 70 65 6e 64 65 64 20  ex" is appended 
9d40: 74 6f 20 7a 4e 61 6d 65 20 61 6e 64 20 75 73 65  to zName and use
9d50: 64 20 61 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  d as the name of
9d60: 20 74 68 65 0a 2a 2a 20 6d 6d 61 70 70 65 64 20   the.** mmapped 
9d70: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  file..**.** When
9d80: 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73   opening a new s
9d90: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
9da0: 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69  e, if no other i
9db0: 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74  nstances of that
9dc0: 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72  .** file are cur
9dd0: 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20  rently open, in 
9de0: 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20  this process or 
9df0: 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  in other process
9e00: 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  es, then.** the 
9e10: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75  file must be tru
9e20: 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c  ncated to zero l
9e30: 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74  ength or have it
9e40: 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64  s header cleared
9e50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9e60: 77 69 6e 53 68 6d 4f 70 65 6e 28 0a 20 20 73 71  winShmOpen(.  sq
9e70: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20  lite3_file *fd  
9e80: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
9e90: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 74 74 61  to which to atta
9ea0: 63 68 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ch shared memory
9eb0: 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
9ec0: 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 3b 20  winFile *pDbFd; 
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
9ee0: 61 74 61 62 61 73 65 20 74 6f 20 77 68 69 63 68  atabase to which
9ef0: 20 74 6f 20 61 74 74 61 63 68 20 53 48 4d 20 2a   to attach SHM *
9f00: 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68  /.  struct winSh
9f10: 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  m *p;           
9f20: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
9f30: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f  nnection to be o
9f40: 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  pened */.  struc
9f50: 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53  t winShmNode *pS
9f60: 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a  hmNode = 0;   /*
9f70: 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
9f80: 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a  mmapped file */.
9f90: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
9fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fb0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
9fc0: 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ode */.  struct 
9fd0: 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77  winShmNode *pNew
9fe0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
9ff0: 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 77  ewly allocated w
a000: 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69  inShmNode */.  i
a010: 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
a020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a030: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61    /* Size of zNa
a040: 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a  me in bytes */..
a050: 20 20 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69    pDbFd = (winFi
a060: 6c 65 2a 29 66 64 3b 0a 20 20 61 73 73 65 72 74  le*)fd;.  assert
a070: 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30  ( pDbFd->pShm==0
a080: 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 70 72   );    /* Not pr
a090: 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20  eviously opened 
a0a0: 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
a0b0: 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
a0c0: 6e 65 77 20 73 71 6c 69 74 65 33 5f 73 68 6d 20  new sqlite3_shm 
a0d0: 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20 73 70  object.  Also sp
a0e0: 65 63 75 6c 61 74 69 76 65 6c 79 0a 20 20 2a 2a  eculatively.  **
a0f0: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
a100: 66 6f 72 20 61 20 6e 65 77 20 77 69 6e 53 68 6d  for a new winShm
a110: 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e 61 6d  Node and filenam
a120: 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71  e..  */.  p = sq
a130: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
a140: 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
a150: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
a160: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
a170: 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
a180: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 6e 4e 61 6d  eof(*p));.  nNam
a190: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
a1a0: 6e 33 30 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  n30(pDbFd->zPath
a1b0: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
a1c0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
a1d0: 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20  of(*pShmNode) + 
a1e0: 6e 4e 61 6d 65 20 2b 20 31 35 20 29 3b 0a 20 20  nName + 15 );.  
a1f0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
a200: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
a210: 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
a220: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
a230: 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20  .  memset(pNew, 
a240: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  0, sizeof(*pNew)
a250: 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 46 69 6c 65  );.  pNew->zFile
a260: 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
a270: 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69 74 65  New[1];.  sqlite
a280: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61 6d 65  3_snprintf(nName
a290: 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65  +15, pNew->zFile
a2a0: 6e 61 6d 65 2c 20 22 25 73 2d 77 61 6c 2d 69 6e  name, "%s-wal-in
a2b0: 64 65 78 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  dex", pDbFd->zPa
a2c0: 74 68 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  th);..  /* Look 
a2d0: 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
a2e0: 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 77  is an existing w
a2f0: 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74 20 63  inShmNode that c
a300: 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a  an be used..  **
a310: 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20   If no matching 
a320: 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72 72 65  winShmNode curre
a330: 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63 72 65  ntly exists, cre
a340: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20  ate a new one.. 
a350: 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65   */.  winShmEnte
a360: 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28  rMutex();.  for(
a370: 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e 53 68  pShmNode = winSh
a380: 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68 6d 4e  mNodeList; pShmN
a390: 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d 70 53  ode; pShmNode=pS
a3a0: 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29 7b 0a  hmNode->pNext){.
a3b0: 20 20 20 20 2f 2a 20 54 42 44 20 6e 65 65 64 20      /* TBD need 
a3c0: 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74 68 20  to come up with 
a3d0: 62 65 74 74 65 72 20 6d 61 74 63 68 20 68 65 72  better match her
a3e0: 65 2e 20 20 50 65 72 68 61 70 73 0a 20 20 20 20  e.  Perhaps.    
a3f0: 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49 44 5f 42  ** use FILE_ID_B
a400: 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53 74 72  OTH_DIR_INFO Str
a410: 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ucture..    */. 
a420: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
a430: 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65 2d 3e  rICmp(pShmNode->
a440: 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 2d  zFilename, pNew-
a450: 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 29  >zFilename)==0 )
a460: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
a470: 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20  ( pShmNode ){.  
a480: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
a490: 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  New);.  }else{. 
a4a0: 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 4e     pShmNode = pN
a4b0: 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30  ew;.    pNew = 0
a4c0: 3b 0a 20 20 20 20 28 28 77 69 6e 46 69 6c 65 2a  ;.    ((winFile*
a4d0: 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  )(&pShmNode->hFi
a4e0: 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41 4c 49  le))->h = INVALI
a4f0: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a  D_HANDLE_VALUE;.
a500: 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e      pShmNode->pN
a510: 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65  ext = winShmNode
a520: 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e 53 68 6d  List;.    winShm
a530: 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68 6d 4e  NodeList = pShmN
a540: 6f 64 65 3b 0a 0a 20 20 20 20 70 53 68 6d 4e 6f  ode;..    pShmNo
a550: 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  de->mutex = sqli
a560: 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
a570: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
a580: 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d  T);.    if( pShm
a590: 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29  Node->mutex==0 )
a5a0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
a5b0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
a5c0: 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
a5d0: 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rr;.    }.    rc
a5e0: 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62 46 64   = winOpen(pDbFd
a5f0: 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20 20 20 20  ->pVfs,.        
a600: 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
a610: 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  e->zFilename,   
a620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
a630: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55  e of the file (U
a640: 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20 20 20 20  TF-8) */.       
a650: 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
a660: 65 33 5f 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f  e3_file*)&pShmNo
a670: 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a 20 46  de->hFile,  /* F
a680: 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20  ile handle here 
a690: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
a6a0: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
a6b0: 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
a6c0: 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
a6d0: 2f 2a 20 4d 6f 64 65 20 66 6c 61 67 73 20 2a 2f  /* Mode flags */
a6e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a6f0: 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 53 51    0);.    if( SQ
a700: 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20  LITE_OK!=rc ){. 
a710: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
a720: 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
a730: 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
a740: 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  pen_err;.    }..
a750: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
a760: 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70  see if another p
a770: 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
a780: 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73  g the dead-man s
a790: 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66  witch..    ** If
a7a0: 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74   not, truncate t
a7b0: 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  he file to zero 
a7c0: 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f 0a  length. .    */.
a7d0: 20 20 20 20 69 66 28 20 77 69 6e 53 68 6d 53 79      if( winShmSy
a7e0: 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
a7f0: 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 57  e, _SHM_WRLCK, W
a800: 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d  IN_SHM_DMS, 1)==
a810: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a820: 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63     rc = winTrunc
a830: 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ate((sqlite3_fil
a840: 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  e *)&pShmNode->h
a850: 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  File, 0);.    }.
a860: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
a870: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77  TE_OK ){.      w
a880: 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
a890: 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55  pShmNode, _SHM_U
a8a0: 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  NLCK, WIN_SHM_DM
a8b0: 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 63 20  S, 1);.      rc 
a8c0: 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  = winShmSystemLo
a8d0: 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
a8e0: 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d  M_RDLCK, WIN_SHM
a8f0: 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  _DMS, 1);.    }.
a900: 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
a910: 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
a920: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74    }..  /* Make t
a930: 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f  he new connectio
a940: 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65  n a child of the
a950: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20   winShmNode */. 
a960: 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70   p->pShmNode = p
a970: 53 68 6d 4e 6f 64 65 3b 0a 20 20 70 2d 3e 70 4e  ShmNode;.  p->pN
a980: 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ext = pShmNode->
a990: 70 46 69 72 73 74 3b 0a 23 69 66 64 65 66 20 53  pFirst;.#ifdef S
a9a0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d  QLITE_DEBUG.  p-
a9b0: 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  >id = pShmNode->
a9c0: 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e  nextShmId++;.#en
a9d0: 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  dif.  pShmNode->
a9e0: 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 70 53  pFirst = p;.  pS
a9f0: 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a  hmNode->nRef++;.
aa00: 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
aa10: 70 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65  p;.  winShmLeave
aa20: 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
aa30: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
aa40: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20  /* Jump here on 
aa50: 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d  any error */.shm
aa60: 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e  _open_err:.  win
aa70: 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
aa80: 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c  hmNode, _SHM_UNL
aa90: 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
aaa0: 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72   1);.  winShmPur
aab0: 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20  ge(pDbFd->pVfs, 
aac0: 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73  0);      /* This
aad0: 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d   call frees pShm
aae0: 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64  Node if required
aaf0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
ab00: 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ee(p);.  sqlite3
ab10: 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77  _free(pNew);.  w
ab20: 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
ab30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
ab40: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
ab50: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73   connection to s
ab60: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44  hared-memory.  D
ab70: 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c  elete the underl
ab80: 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65  ying .** storage
ab90: 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69   if deleteFlag i
aba0: 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69  s true..*/.stati
abb0: 63 20 69 6e 74 20 77 69 6e 53 68 6d 43 6c 6f 73  c int winShmClos
abc0: 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  e(.  sqlite3_fil
abd0: 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
abe0: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
abf0: 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ing shared memor
ac00: 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74  y */.  int delet
ac10: 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  eFlag           
ac20: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74 65    /* Delete afte
ac30: 72 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72 75  r closing if tru
ac40: 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  e */.){.  winFil
ac50: 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20  e *pDbFd;       
ac60: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
ac70: 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ing shared-memor
ac80: 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  y */.  winShm *p
ac90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
aca0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  The connection t
acb0: 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20  o be closed */. 
acc0: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
acd0: 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e  mNode; /* The un
ace0: 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d  derlying shared-
acf0: 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20  memory file */. 
ad00: 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20   winShm **pp;   
ad10: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
ad20: 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69  oping over sibli
ad30: 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  ng connections *
ad40: 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77 69  /..  pDbFd = (wi
ad50: 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d  nFile*)fd;.  p =
ad60: 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
ad70: 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
ad80: 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65  hmNode;..  /* Re
ad90: 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  move connection 
ada0: 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f  p from the set o
adb0: 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73  f connections as
adc0: 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69  sociated.  ** wi
add0: 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  th pShmNode */. 
ade0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
adf0: 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
ae00: 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d  utex);.  for(pp=
ae10: 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  &pShmNode->pFirs
ae20: 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20  t; (*pp)!=p; pp 
ae30: 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  = &(*pp)->pNext)
ae40: 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e  {}.  *pp = p->pN
ae50: 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  ext;..  /* Free 
ae60: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  the connection p
ae70: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
ae80: 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e  ee(p);.  pDbFd->
ae90: 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  pShm = 0;.  sqli
aea0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
aeb0: 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
aec0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e  ;..  /* If pShmN
aed0: 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65  ode->nRef has re
aee0: 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c  ached 0, then cl
aef0: 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ose the underlyi
af00: 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d  ng.  ** shared-m
af10: 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20  emory file, too 
af20: 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72  */.  winShmEnter
af30: 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72  Mutex();.  asser
af40: 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  t( pShmNode->nRe
af50: 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64  f>0 );.  pShmNod
af60: 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  e->nRef--;.  if(
af70: 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d   pShmNode->nRef=
af80: 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d  =0 ){.    winShm
af90: 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66  Purge(pDbFd->pVf
afa0: 73 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a  s, deleteFlag);.
afb0: 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76    }.  winShmLeav
afc0: 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74  eMutex();..  ret
afd0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
afe0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
aff0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
b000: 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e  to obtain a poin
b010: 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52  ter to region iR
b020: 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a  egion of the .**
b030: 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
b040: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
b050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
b060: 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f   fd. Shared-memo
b070: 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61  ry regions .** a
b080: 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72  re numbered star
b090: 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20  ting from zero. 
b0a0: 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f  Each shared-memo
b0b0: 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52  ry region is szR
b0c0: 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20  egion .** bytes 
b0d0: 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  in size..**.** I
b0e0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
b0f0: 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
b100: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
b110: 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e   *pp is set to N
b120: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ULL..**.** Other
b130: 77 69 73 65 2c 20 69 66 20 74 68 65 20 69 73 57  wise, if the isW
b140: 72 69 74 65 20 70 61 72 61 6d 65 74 65 72 20 69  rite parameter i
b150: 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75  s 0 and the requ
b160: 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
b170: 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61  ory.** region ha
b180: 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
b190: 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69  ated (by any cli
b1a0: 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f  ent, including o
b1b0: 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a  ne running in a.
b1c0: 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63  ** separate proc
b1d0: 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69  ess), then *pp i
b1e0: 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  s set to NULL an
b1f0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
b200: 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 69 73 57  rned. If .** isW
b210: 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  rite is non-zero
b220: 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
b230: 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
b240: 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20   region has not 
b250: 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c  yet .** been all
b260: 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c  ocated, it is al
b270: 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
b280: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
b290: 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  If the shared-me
b2a0: 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20  mory region has 
b2b0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
b2c0: 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c  ocated or is all
b2d0: 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69  ocated by.** thi
b2e0: 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69  s call as descri
b2f0: 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  bed above, then 
b300: 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74  it is mapped int
b310: 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
b320: 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61   .** address spa
b330: 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  ce (if it is not
b340: 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69   already), *pp i
b350: 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
b360: 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a  o the mapped .**
b370: 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49   memory and SQLI
b380: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
b390: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
b3a0: 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74  nShmMap(.  sqlit
b3b0: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
b3c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
b3d0: 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74  ndle open on dat
b3e0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
b3f0: 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20  int iRegion,    
b400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b410: 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74  /* Region to ret
b420: 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73  rieve */.  int s
b430: 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  zRegion,        
b440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
b450: 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f  ze of regions */
b460: 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c 20  .  int isWrite, 
b470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b480: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78     /* True to ex
b490: 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63  tend file if nec
b4a0: 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64  essary */.  void
b4b0: 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20   volatile **pp  
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
b4d0: 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72  UT: Mapped memor
b4e0: 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  y */.){.  winFil
b4f0: 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46  e *pDbFd = (winF
b500: 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53 68  ile*)fd;.  winSh
b510: 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  m *p = pDbFd->pS
b520: 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  hm;.  winShmNode
b530: 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e   *pShmNode = p->
b540: 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20  pShmNode;.  int 
b550: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
b560: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
b570: 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
b580: 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
b590: 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68  t( szRegion==pSh
b5a0: 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
b5b0: 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  || pShmNode->nRe
b5c0: 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  gion==0 );..  if
b5d0: 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
b5e0: 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a  ion<=iRegion ){.
b5f0: 20 20 20 20 73 74 72 75 63 74 20 53 68 6d 52 65      struct ShmRe
b600: 67 69 6f 6e 20 2a 61 70 4e 65 77 3b 20 20 20 20  gion *apNew;    
b610: 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 52         /* New aR
b620: 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f  egion[] array */
b630: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
b640: 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52   (iRegion+1)*szR
b650: 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d  egion;  /* Minim
b660: 75 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c 65  um required file
b670: 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c   size */.    sql
b680: 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 20 20  ite3_int64 sz;  
b690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6a0: 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65 20  /* Current size 
b6b0: 6f 66 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c  of wal-index fil
b6c0: 65 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f  e */..    pShmNo
b6d0: 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73  de->szRegion = s
b6e0: 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a  zRegion;..    /*
b6f0: 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72   The requested r
b700: 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70  egion is not map
b710: 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ped into this pr
b720: 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20  ocesses address 
b730: 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 43 68  space..    ** Ch
b740: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74  eck to see if it
b750: 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
b760: 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65  ted (i.e. if the
b770: 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20   wal-index file 
b780: 69 73 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 20  is.    ** large 
b790: 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69  enough to contai
b7a0: 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
b7b0: 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a  region)..    */.
b7c0: 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c 65      rc = winFile
b7d0: 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66 69  Size((sqlite3_fi
b7e0: 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  le *)&pShmNode->
b7f0: 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a 20 20 20  hFile, &sz);.   
b800: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b810: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
b820: 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
b830: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c    }..    if( sz<
b840: 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 2f  nByte ){.      /
b850: 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
b860: 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f  memory region do
b870: 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66  es not exist. If
b880: 20 69 73 57 72 69 74 65 20 69 73 20 73 65 74 20   isWrite is set 
b890: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  to.      ** zero
b8a0: 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70  , exit early. *p
b8b0: 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  p will be set to
b8c0: 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45   NULL and SQLITE
b8d0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20  _OK returned..  
b8e0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
b8f0: 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69  Alternatively, i
b900: 66 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e  f isWrite is non
b910: 2d 7a 65 72 6f 2c 20 75 73 65 20 66 74 72 75 6e  -zero, use ftrun
b920: 63 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61  cate() to alloca
b930: 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  te.      ** the 
b940: 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
b950: 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a   region..      *
b960: 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 57  /.      if( !isW
b970: 72 69 74 65 20 29 20 67 6f 74 6f 20 73 68 6d 70  rite ) goto shmp
b980: 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72  age_out;.      r
b990: 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28  c = winTruncate(
b9a0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
b9b0: 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
b9c0: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
b9d0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b9e0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
b9f0: 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
ba00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
ba10: 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71    /* Map the req
ba20: 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
ba30: 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70  gion into this p
ba40: 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73  rocesses address
ba50: 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61   space. */.    a
ba60: 70 4e 65 77 20 3d 20 28 73 74 72 75 63 74 20 53  pNew = (struct S
ba70: 68 6d 52 65 67 69 6f 6e 20 2a 29 73 71 6c 69 74  hmRegion *)sqlit
ba80: 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20  e3_realloc(.    
ba90: 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52      pShmNode->aR
baa0: 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b  egion, (iRegion+
bab0: 31 29 2a 73 69 7a 65 6f 66 28 61 70 4e 65 77 5b  1)*sizeof(apNew[
bac0: 30 5d 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  0]).    );.    i
bad0: 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20  f( !apNew ){.   
bae0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
baf0: 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
bb00: 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
bb10: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  ut;.    }.    pS
bb20: 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 20  hmNode->aRegion 
bb30: 3d 20 61 70 4e 65 77 3b 0a 0a 20 20 20 20 77 68  = apNew;..    wh
bb40: 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ile( pShmNode->n
bb50: 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20  Region<=iRegion 
bb60: 29 7b 0a 20 20 20 20 20 20 48 41 4e 44 4c 45 20  ){.      HANDLE 
bb70: 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  hMap;           
bb80: 20 20 20 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70       /* file-map
bb90: 70 69 6e 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  ping handle */. 
bba0: 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 20       void *pMap 
bbb0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
bbc0: 20 2f 2a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72   /* Mapped memor
bbd0: 79 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 20 20  y region */.    
bbe0: 20 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 43   .      hMap = C
bbf0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
bc00: 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  (pShmNode->hFile
bc10: 2e 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 4e  .h, .          N
bc20: 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52  ULL, PAGE_READWR
bc30: 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e  ITE, 0, nByte, N
bc40: 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ULL.      );.   
bc50: 20 20 20 69 66 28 20 68 4d 61 70 20 29 7b 0a 20     if( hMap ){. 
bc60: 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20 4d 61         pMap = Ma
bc70: 70 56 69 65 77 4f 66 46 69 6c 65 28 68 4d 61 70  pViewOfFile(hMap
bc80: 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45  , FILE_MAP_WRITE
bc90: 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44   | FILE_MAP_READ
bca0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 30 2c  ,.            0,
bcb0: 20 30 2c 20 6e 42 79 74 65 0a 20 20 20 20 20 20   0, nByte.      
bcc0: 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
bcd0: 20 20 20 69 66 28 20 21 70 4d 61 70 20 29 7b 0a     if( !pMap ){.
bce0: 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
bcf0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65  ->lastErrno = Ge
bd00: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
bd10: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
bd20: 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20  E_IOERR;.       
bd30: 20 69 66 28 20 68 4d 61 70 20 29 20 43 6c 6f 73   if( hMap ) Clos
bd40: 65 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20  eHandle(hMap);. 
bd50: 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
bd60: 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  age_out;.      }
bd70: 0a 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ..      pShmNode
bd80: 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f  ->aRegion[pShmNo
bd90: 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61  de->nRegion].pMa
bda0: 70 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20 20  p = pMap;.      
bdb0: 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
bdc0: 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  n[pShmNode->nReg
bdd0: 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70  ion].hMap = hMap
bde0: 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
bdf0: 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20  ->nRegion++;.   
be00: 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f   }.  }..shmpage_
be10: 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e  out:.  if( pShmN
be20: 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65  ode->nRegion>iRe
be30: 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  gion ){.    char
be40: 20 2a 70 20 3d 20 28 63 68 61 72 20 2a 29 70 53   *p = (char *)pS
be50: 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b  hmNode->aRegion[
be60: 69 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b 0a 20  iRegion].pMap;. 
be70: 20 20 20 2a 70 70 20 3d 20 28 76 6f 69 64 20 2a     *pp = (void *
be80: 29 26 70 5b 69 52 65 67 69 6f 6e 2a 73 7a 52 65  )&p[iRegion*szRe
be90: 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gion];.  }else{.
bea0: 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d      *pp = 0;.  }
beb0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
bec0: 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
bed0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
bee0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
bef0: 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73  hange the lock s
bf00: 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65  tate for a share
bf10: 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
bf20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bf30: 77 69 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71  winShmLock(.  sq
bf40: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
bf50: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
bf60: 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e  base file holdin
bf70: 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
bf80: 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  ory */.  int ofs
bf90: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
bfa0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63      /* First loc
bfb0: 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  k to acquire or 
bfc0: 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
bfd0: 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   n,             
bfe0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
bff0: 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63  r of locks to ac
c000: 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65  quire or release
c010: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
c040: 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a  ith the lock */.
c050: 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44  ){.  winFile *pD
c060: 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  bFd = (winFile*)
c070: 66 64 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20  fd;.  winShm *p 
c080: 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
c090: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
c0a0: 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
c0b0: 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ode;.  int rc = 
c0c0: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b  SQLITE_PROTOCOL;
c0d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74  ..  assert( ofst
c0e0: 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53  >=0 && ofst+n<=S
c0f0: 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20  QLITE_SHM_NLOCK 
c100: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d  );.  assert( n>=
c110: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66  1 );.  assert( f
c120: 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
c130: 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  M_LOCK | SQLITE_
c140: 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20  SHM_SHARED).    
c150: 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
c160: 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
c170: 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
c180: 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20  SIVE).       || 
c190: 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
c1a0: 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
c1b0: 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
c1c0: 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
c1d0: 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  (SQLITE_SHM_UNLO
c1e0: 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
c1f0: 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20  EXCLUSIVE) );.  
c200: 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20  assert( n==1 || 
c210: 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
c220: 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  SHM_EXCLUSIVE)!=
c230: 30 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  0 );..  sqlite3_
c240: 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
c250: 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
c260: 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
c270: 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b  TE_SHM_UNLOCK ){
c280: 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d  .    rc = winShm
c290: 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
c2a0: 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c  ode, _SHM_UNLCK,
c2b0: 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41   ofst+WIN_SHM_BA
c2c0: 53 45 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 20  SE, n);.  }else 
c2d0: 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
c2e0: 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b  TE_SHM_SHARED ){
c2f0: 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d  .    rc = winShm
c300: 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
c310: 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c  ode, _SHM_RDLCK,
c320: 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41   ofst+WIN_SHM_BA
c330: 53 45 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b  SE, n);.  }else{
c340: 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d  .    rc = winShm
c350: 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
c360: 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c  ode, _SHM_WRLCK,
c370: 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41   ofst+WIN_SHM_BA
c380: 53 45 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20 73 71  SE, n);.  }.  sq
c390: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
c3a0: 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
c3b0: 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  x);.  OSTRACE(("
c3c0: 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25  SHM-LOCK shmid-%
c3d0: 64 2c 20 70 69 64 2d 25 64 20 25 73 5c 6e 22 2c  d, pid-%d %s\n",
c3e0: 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69  .           p->i
c3f0: 64 2c 20 28 69 6e 74 29 47 65 74 43 75 72 72 65  d, (int)GetCurre
c400: 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 72  ntProcessId(), r
c410: 63 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22  c ? "failed" : "
c420: 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ok"));.  return 
c430: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  rc;.}../*.** Imp
c440: 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20  lement a memory 
c450: 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72  barrier or memor
c460: 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65  y fence on share
c470: 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a  d memory.  .**.*
c480: 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20  * All loads and 
c490: 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66  stores begun bef
c4a0: 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20  ore the barrier 
c4b0: 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65  must complete be
c4c0: 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64  fore.** any load
c4d0: 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20   or store begun 
c4e0: 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65  after the barrie
c4f0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
c500: 64 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 28  d winShmBarrier(
c510: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
c520: 2a 66 64 20 20 20 20 20 20 20 20 20 20 2f 2a 20  *fd          /* 
c530: 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
c540: 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
c550: 72 79 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 4d 65  ry */.){.  /* Me
c560: 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20 2f  moryBarrier(); /
c570: 2f 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  / does not work 
c580: 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 77  -- do not know w
c590: 68 79 20 6e 6f 74 20 2a 2f 0a 20 20 77 69 6e 53  hy not */.  winS
c5a0: 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  hmEnterMutex();.
c5b0: 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74    winShmLeaveMut
c5c0: 65 78 28 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23  ex();.}..#else.#
c5d0: 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4f 70   define winShmOp
c5e0: 65 6e 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  en    0.# define
c5f0: 20 77 69 6e 53 68 6d 4d 61 70 20 20 20 20 20 30   winShmMap     0
c600: 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
c610: 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69  Lock    0.# defi
c620: 6e 65 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72  ne winShmBarrier
c630: 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53   0.# define winS
c640: 68 6d 43 6c 6f 73 65 20 20 20 30 0a 23 65 6e 64  hmClose   0.#end
c650: 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
c660: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
c670: 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./*.************
c680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c690: 2a 20 45 6e 64 20 53 68 61 72 65 64 20 4d 65 6d  * End Shared Mem
c6a0: 6f 72 79 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ory ************
c6b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c6c0: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
c6d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
c710: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74  ./*.** This vect
c720: 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74  or defines all t
c730: 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20  he methods that 
c740: 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61  can operate on a
c750: 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c  n.** sqlite3_fil
c760: 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a  e for win32..*/.
c770: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
c780: 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
c790: 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a  winIoMethod = {.
c7a0: 20 20 32 2c 20 20 20 20 20 20 20 20 20 20 20 20    2,            
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
c7c0: 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e  Version */.  win
c7d0: 43 6c 6f 73 65 2c 0a 20 20 77 69 6e 52 65 61 64  Close,.  winRead
c7e0: 2c 0a 20 20 77 69 6e 57 72 69 74 65 2c 0a 20 20  ,.  winWrite,.  
c7f0: 77 69 6e 54 72 75 6e 63 61 74 65 2c 0a 20 20 77  winTruncate,.  w
c800: 69 6e 53 79 6e 63 2c 0a 20 20 77 69 6e 46 69 6c  inSync,.  winFil
c810: 65 53 69 7a 65 2c 0a 20 20 77 69 6e 4c 6f 63 6b  eSize,.  winLock
c820: 2c 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 0a 20  ,.  winUnlock,. 
c830: 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65   winCheckReserve
c840: 64 4c 6f 63 6b 2c 0a 20 20 77 69 6e 46 69 6c 65  dLock,.  winFile
c850: 43 6f 6e 74 72 6f 6c 2c 0a 20 20 77 69 6e 53 65  Control,.  winSe
c860: 63 74 6f 72 53 69 7a 65 2c 0a 20 20 77 69 6e 44  ctorSize,.  winD
c870: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
c880: 74 69 63 73 2c 0a 20 20 77 69 6e 53 68 6d 4f 70  tics,.  winShmOp
c890: 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
c8a0: 20 2f 2a 20 78 53 68 6d 4f 70 65 6e 20 2a 2f 0a   /* xShmOpen */.
c8b0: 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20    winShmLock,   
c8c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
c8d0: 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53  hmLock */.  winS
c8e0: 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20  hmMap,          
c8f0: 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
c900: 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72 72 69  */.  winShmBarri
c910: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er,           /*
c920: 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a   xShmBarrier */.
c930: 20 20 77 69 6e 53 68 6d 43 6c 6f 73 65 20 20 20    winShmClose   
c940: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
c950: 68 6d 43 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f  hmClose */.};../
c960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c9a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 48  ***********.** H
c9b0: 65 72 65 20 65 6e 64 73 20 74 68 65 20 49 2f 4f  ere ends the I/O
c9c0: 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 66 6f   methods that fo
c9d0: 72 6d 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  rm the sqlite3_i
c9e0: 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
c9f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74  ..**.** The next
ca00: 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69   block of code i
ca10: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 56 46  mplements the VF
ca20: 53 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 2a 2a 2a  S methods..*****
ca30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ca40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ca50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ca60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ca70: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
ca80: 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20  Convert a UTF-8 
ca90: 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 77 68  filename into wh
caa0: 61 74 65 76 65 72 20 66 6f 72 6d 20 74 68 65 20  atever form the 
cab0: 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70  underlying.** op
cac0: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 77  erating system w
cad0: 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73 20 69  ants filenames i
cae0: 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  n.  Space to hol
caf0: 64 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  d the result.** 
cb00: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
cb10: 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74   malloc and must
cb20: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
cb30: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
cb40: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
cb50: 76 6f 69 64 20 2a 63 6f 6e 76 65 72 74 55 74 66  void *convertUtf
cb60: 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20  8Filename(const 
cb70: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
cb80: 7b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  {.  void *zConve
cb90: 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20  rted = 0;.  if( 
cba0: 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43  isNT() ){.    zC
cbb0: 6f 6e 76 65 72 74 65 64 20 3d 20 75 74 66 38 54  onverted = utf8T
cbc0: 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
cbd0: 6d 65 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69  me);./* isNT() i
cbe0: 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53  s 1 if SQLITE_OS
cbf0: 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68  _WINCE==1, so th
cc00: 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72  is else is never
cc10: 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2f 0a 23   executed. .*/.#
cc20: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
cc30: 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20  CE==0.  }else{. 
cc40: 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
cc50: 75 74 66 38 54 6f 4d 62 63 73 28 7a 46 69 6c 65  utf8ToMbcs(zFile
cc60: 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  name);.#endif.  
cc70: 7d 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69  }.  /* caller wi
cc80: 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ll handle out of
cc90: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74   memory */.  ret
cca0: 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  urn zConverted;.
ccb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
ccc0: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
ccd0: 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20   name in zBuf.  
cce0: 7a 42 75 66 20 6d 75 73 74 20 62 65 20 62 69 67  zBuf must be big
ccf0: 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20 68 6f   enough to.** ho
cd00: 6c 64 20 61 74 20 70 56 66 73 2d 3e 6d 78 50 61  ld at pVfs->mxPa
cd10: 74 68 6e 61 6d 65 20 63 68 61 72 61 63 74 65 72  thname character
cd20: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
cd30: 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74   getTempname(int
cd40: 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
cd50: 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  f){.  static cha
cd60: 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20  r zChars[] =.   
cd70: 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e   "abcdefghijklmn
cd80: 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20  opqrstuvwxyz".  
cd90: 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d    "ABCDEFGHIJKLM
cda0: 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20  NOPQRSTUVWXYZ". 
cdb0: 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b     "0123456789";
cdc0: 0a 20 20 73 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a  .  size_t i, j;.
cdd0: 20 20 63 68 61 72 20 7a 54 65 6d 70 50 61 74 68    char zTempPath
cde0: 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 0a 20 20  [MAX_PATH+1];.  
cdf0: 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 6d 70  if( sqlite3_temp
ce00: 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20  _directory ){.  
ce10: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
ce20: 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20  tf(MAX_PATH-30, 
ce30: 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c  zTempPath, "%s",
ce40: 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69   sqlite3_temp_di
ce50: 72 65 63 74 6f 72 79 29 3b 0a 20 20 7d 65 6c 73  rectory);.  }els
ce60: 65 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a  e if( isNT() ){.
ce70: 20 20 20 20 63 68 61 72 20 2a 7a 4d 75 6c 74 69      char *zMulti
ce80: 3b 0a 20 20 20 20 57 43 48 41 52 20 7a 57 69 64  ;.    WCHAR zWid
ce90: 65 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b  ePath[MAX_PATH];
cea0: 0a 20 20 20 20 47 65 74 54 65 6d 70 50 61 74 68  .    GetTempPath
ceb0: 57 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a  W(MAX_PATH-30, z
cec0: 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 7a  WidePath);.    z
ced0: 4d 75 6c 74 69 20 3d 20 75 6e 69 63 6f 64 65 54  Multi = unicodeT
cee0: 6f 55 74 66 38 28 7a 57 69 64 65 50 61 74 68 29  oUtf8(zWidePath)
cef0: 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c 74 69  ;.    if( zMulti
cf00: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
cf10: 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
cf20: 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74  ATH-30, zTempPat
cf30: 68 2c 20 22 25 73 22 2c 20 7a 4d 75 6c 74 69 29  h, "%s", zMulti)
cf40: 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 4d 75  ;.      free(zMu
cf50: 6c 74 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  lti);.    }else{
cf60: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
cf70: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
cf80: 7d 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31  }./* isNT() is 1
cf90: 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   if SQLITE_OS_WI
cfa0: 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20  NCE==1, so this 
cfb0: 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78  else is never ex
cfc0: 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63  ecuted. .** Sinc
cfd0: 65 20 74 68 65 20 41 53 43 49 49 20 76 65 72 73  e the ASCII vers
cfe0: 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e  ion of these Win
cff0: 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20  dows API do not 
d000: 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c  exist for WINCE,
d010: 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61  .** it's importa
d020: 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65  nt to not refere
d030: 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e  nce them for WIN
d040: 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69  CE builds..*/.#i
d050: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
d060: 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E==0.  }else{.  
d070: 20 20 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a 20    char *zUtf8;. 
d080: 20 20 20 63 68 61 72 20 7a 4d 62 63 73 50 61 74     char zMbcsPat
d090: 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20  h[MAX_PATH];.   
d0a0: 20 47 65 74 54 65 6d 70 50 61 74 68 41 28 4d 41   GetTempPathA(MA
d0b0: 58 5f 50 41 54 48 2d 33 30 2c 20 7a 4d 62 63 73  X_PATH-30, zMbcs
d0c0: 50 61 74 68 29 3b 0a 20 20 20 20 7a 55 74 66 38  Path);.    zUtf8
d0d0: 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
d0e0: 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 4d  _mbcs_to_utf8(zM
d0f0: 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20 69 66  bcsPath);.    if
d100: 28 20 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20  ( zUtf8 ){.     
d110: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
d120: 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a  f(MAX_PATH-30, z
d130: 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20  TempPath, "%s", 
d140: 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 66 72  zUtf8);.      fr
d150: 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d  ee(zUtf8);.    }
d160: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
d170: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
d180: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
d190: 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  }.  for(i=sqlite
d1a0: 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 50  3Strlen30(zTempP
d1b0: 61 74 68 29 3b 20 69 3e 30 20 26 26 20 7a 54 65  ath); i>0 && zTe
d1c0: 6d 70 50 61 74 68 5b 69 2d 31 5d 3d 3d 27 5c 5c  mpPath[i-1]=='\\
d1d0: 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a 54 65 6d  '; i--){}.  zTem
d1e0: 70 50 61 74 68 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPath[i] = 0;.  
d1f0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
d200: 28 6e 42 75 66 2d 33 30 2c 20 7a 42 75 66 2c 0a  (nBuf-30, zBuf,.
d210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d220: 20 20 20 22 25 73 5c 5c 22 53 51 4c 49 54 45 5f     "%s\\"SQLITE_
d230: 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
d240: 2c 20 7a 54 65 6d 70 50 61 74 68 29 3b 0a 20 20  , zTempPath);.  
d250: 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  j = sqlite3Strle
d260: 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 73 71 6c  n30(zBuf);.  sql
d270: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
d280: 32 30 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20  20, &zBuf[j]);. 
d290: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 30 3b 20   for(i=0; i<20; 
d2a0: 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a  i++, j++){.    z
d2b0: 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a  Buf[j] = (char)z
d2c0: 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65  Chars[ ((unsigne
d2d0: 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25  d char)zBuf[j])%
d2e0: 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d  (sizeof(zChars)-
d2f0: 31 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66  1) ];.  }.  zBuf
d300: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41  [j] = 0;.  OSTRA
d310: 43 45 28 28 22 54 45 4d 50 20 46 49 4c 45 4e 41  CE(("TEMP FILENA
d320: 4d 45 3a 20 25 73 5c 6e 22 2c 20 7a 42 75 66 29  ME: %s\n", zBuf)
d330: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
d340: 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  TE_OK; .}../*.**
d350: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
d360: 65 20 6f 66 20 67 65 74 4c 61 73 74 45 72 72 6f  e of getLastErro
d370: 72 4d 73 67 0a 2a 2a 20 69 73 20 7a 65 72 6f 20  rMsg.** is zero 
d380: 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  if the error mes
d390: 73 61 67 65 20 66 69 74 73 20 69 6e 20 74 68 65  sage fits in the
d3a0: 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d   buffer, or non-
d3b0: 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73  zero.** otherwis
d3c0: 65 20 28 69 66 20 74 68 65 20 6d 65 73 73 61 67  e (if the messag
d3d0: 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 29  e was truncated)
d3e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d3f0: 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28  getLastErrorMsg(
d400: 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
d410: 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d  zBuf){.  /* Form
d420: 61 74 4d 65 73 73 61 67 65 20 72 65 74 75 72 6e  atMessage return
d430: 73 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20  s 0 on failure. 
d440: 20 4f 74 68 65 72 77 69 73 65 20 69 74 0a 20 20   Otherwise it.  
d450: 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ** returns the n
d460: 75 6d 62 65 72 20 6f 66 20 54 43 48 41 52 73 20  umber of TCHARs 
d470: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f  written to the o
d480: 75 74 70 75 74 0a 20 20 2a 2a 20 62 75 66 66 65  utput.  ** buffe
d490: 72 2c 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65  r, excluding the
d4a0: 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c   terminating nul
d4b0: 6c 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44  l char..  */.  D
d4c0: 57 4f 52 44 20 65 72 72 6f 72 20 3d 20 47 65 74  WORD error = Get
d4d0: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 44  LastError();.  D
d4e0: 57 4f 52 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a  WORD dwLen = 0;.
d4f0: 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30    char *zOut = 0
d500: 3b 0a 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  ;..  if( isNT() 
d510: 29 7b 0a 20 20 20 20 57 43 48 41 52 20 2a 7a 54  ){.    WCHAR *zT
d520: 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a  empWide = NULL;.
d530: 20 20 20 20 64 77 4c 65 6e 20 3d 20 46 6f 72 6d      dwLen = Form
d540: 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41  atMessageW(FORMA
d550: 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41  T_MESSAGE_ALLOCA
d560: 54 45 5f 42 55 46 46 45 52 20 7c 20 46 4f 52 4d  TE_BUFFER | FORM
d570: 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f  AT_MESSAGE_FROM_
d580: 53 59 53 54 45 4d 20 7c 20 46 4f 52 4d 41 54 5f  SYSTEM | FORMAT_
d590: 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49  MESSAGE_IGNORE_I
d5a0: 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20  NSERTS,.        
d5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5c0: 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20     NULL,.       
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5e0: 20 20 20 20 65 72 72 6f 72 2c 0a 20 20 20 20 20      error,.     
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d600: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
d610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d620: 20 20 20 20 28 4c 50 57 53 54 52 29 20 26 7a 54      (LPWSTR) &zT
d630: 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20  empWide,.       
d640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d650: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
d660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d670: 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 77    0);.    if( dw
d680: 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20  Len > 0 ){.     
d690: 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62   /* allocate a b
d6a0: 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72  uffer and conver
d6b0: 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20  t to UTF8 */.   
d6c0: 20 20 20 7a 4f 75 74 20 3d 20 75 6e 69 63 6f 64     zOut = unicod
d6d0: 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 57 69 64  eToUtf8(zTempWid
d6e0: 65 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72 65  e);.      /* fre
d6f0: 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75 66  e the system buf
d700: 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  fer allocated by
d710: 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a   FormatMessage *
d720: 2f 0a 20 20 20 20 20 20 4c 6f 63 61 6c 46 72 65  /.      LocalFre
d730: 65 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20 20  e(zTempWide);.  
d740: 20 20 7d 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73    }./* isNT() is
d750: 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f   1 if SQLITE_OS_
d760: 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69  WINCE==1, so thi
d770: 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20  s else is never 
d780: 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69  executed. .** Si
d790: 6e 63 65 20 74 68 65 20 41 53 43 49 49 20 76 65  nce the ASCII ve
d7a0: 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57  rsion of these W
d7b0: 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f  indows API do no
d7c0: 74 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43  t exist for WINC
d7d0: 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72  E,.** it's impor
d7e0: 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65  tant to not refe
d7f0: 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57  rence them for W
d800: 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a  INCE builds..*/.
d810: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
d820: 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a  NCE==0.  }else{.
d830: 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 20      char *zTemp 
d840: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65  = NULL;.    dwLe
d850: 6e 20 3d 20 46 6f 72 6d 61 74 4d 65 73 73 61 67  n = FormatMessag
d860: 65 41 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47  eA(FORMAT_MESSAG
d870: 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45  E_ALLOCATE_BUFFE
d880: 52 20 7c 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41  R | FORMAT_MESSA
d890: 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c  GE_FROM_SYSTEM |
d8a0: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
d8b0: 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a  IGNORE_INSERTS,.
d8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8d0: 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c             NULL,
d8e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
d900: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
d910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
d920: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d930: 20 20 20 20 20 20 20 20 20 20 20 20 28 4c 50 53              (LPS
d940: 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20 20  TR) &zTemp,.    
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d960: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
d970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d980: 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28       0);.    if(
d990: 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20   dwLen > 0 ){.  
d9a0: 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20      /* allocate 
d9b0: 61 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e  a buffer and con
d9c0: 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a  vert to UTF8 */.
d9d0: 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c        zOut = sql
d9e0: 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f  ite3_win32_mbcs_
d9f0: 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a  to_utf8(zTemp);.
da00: 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68        /* free th
da10: 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72 20  e system buffer 
da20: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72  allocated by For
da30: 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20  matMessage */.  
da40: 20 20 20 20 4c 6f 63 61 6c 46 72 65 65 28 7a 54      LocalFree(zT
da50: 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  emp);.    }.#end
da60: 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 30 20 3d  if.  }.  if( 0 =
da70: 3d 20 64 77 4c 65 6e 20 29 7b 0a 20 20 20 20 73  = dwLen ){.    s
da80: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
da90: 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 4f 73 45  nBuf, zBuf, "OsE
daa0: 72 72 6f 72 20 30 78 25 78 20 28 25 75 29 22 2c  rror 0x%x (%u)",
dab0: 20 65 72 72 6f 72 2c 20 65 72 72 6f 72 29 3b 0a   error, error);.
dac0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
dad0: 63 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d 20 6f  copy a maximum o
dae0: 66 20 6e 42 75 66 20 63 68 61 72 73 20 74 6f 20  f nBuf chars to 
daf0: 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  output buffer */
db00: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
db10: 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
db20: 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20  , "%s", zOut);. 
db30: 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 55     /* free the U
db40: 54 46 38 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  TF8 buffer */.  
db50: 20 20 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20    free(zOut);.  
db60: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
db70: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69  ./*.** Open a fi
db80: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
db90: 74 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c  t winOpen(.  sql
dba0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
dbb0: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73         /* Not us
dbc0: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
dbd0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
dbe0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
dbf0: 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f   file (UTF-8) */
dc00: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
dc10: 2a 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *id,         /* 
dc20: 57 72 69 74 65 20 74 68 65 20 53 51 4c 69 74 65  Write the SQLite
dc30: 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72   file handle her
dc40: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
dc50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
dc60: 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c   /* Open mode fl
dc70: 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f  ags */.  int *pO
dc80: 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  utFlags         
dc90: 20 20 20 2f 2a 20 53 74 61 74 75 73 20 72 65 74     /* Status ret
dca0: 75 72 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  urn flags */.){.
dcb0: 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57    HANDLE h;.  DW
dcc0: 4f 52 44 20 64 77 44 65 73 69 72 65 64 41 63 63  ORD dwDesiredAcc
dcd0: 65 73 73 3b 0a 20 20 44 57 4f 52 44 20 64 77 53  ess;.  DWORD dwS
dce0: 68 61 72 65 4d 6f 64 65 3b 0a 20 20 44 57 4f 52  hareMode;.  DWOR
dcf0: 44 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70  D dwCreationDisp
dd00: 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 57 4f 52 44  osition;.  DWORD
dd10: 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
dd20: 62 75 74 65 73 20 3d 20 30 3b 0a 23 69 66 20 53  butes = 0;.#if S
dd30: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
dd40: 20 69 6e 74 20 69 73 54 65 6d 70 20 3d 20 30 3b   int isTemp = 0;
dd50: 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c  .#endif.  winFil
dd60: 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
dd70: 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20  ile*)id;.  void 
dd80: 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20 20 20 20  *zConverted;    
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dda0: 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20 65  Filename in OS e
ddb0: 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e  ncoding */.  con
ddc0: 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38 4e 61  st char *zUtf8Na
ddd0: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 20 20 20 2f  me = zName;    /
dde0: 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54  * Filename in UT
ddf0: 46 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a  F-8 encoding */.
de00: 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b    char zTmpname[
de10: 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 20 20 20 20  MAX_PATH+1];    
de20: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73      /* Buffer us
de30: 65 64 20 74 6f 20 63 72 65 61 74 65 20 74 65 6d  ed to create tem
de40: 70 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 0a 20  p filename */.. 
de50: 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
de60: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
de70: 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 70  ETER(pVfs);..  p
de80: 46 69 6c 65 2d 3e 68 20 3d 20 49 4e 56 41 4c 49  File->h = INVALI
de90: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a  D_HANDLE_VALUE;.
dea0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63  .  /* If the sec
deb0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
dec0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
ded0: 20 4e 55 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20   NULL, generate 
dee0: 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72  a .  ** temporar
def0: 79 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75  y file name to u
df00: 73 65 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  se .  */.  if( !
df10: 7a 55 74 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20  zUtf8Name ){.   
df20: 20 69 6e 74 20 72 63 20 3d 20 67 65 74 54 65 6d   int rc = getTem
df30: 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 2b 31  pname(MAX_PATH+1
df40: 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  , zTmpname);.   
df50: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
df60: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
df70: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
df80: 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d   zUtf8Name = zTm
df90: 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pname;.  }..  /*
dfa0: 20 43 6f 6e 76 65 72 74 20 74 68 65 20 66 69 6c   Convert the fil
dfb0: 65 6e 61 6d 65 20 74 6f 20 74 68 65 20 73 79 73  ename to the sys
dfc0: 74 65 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f  tem encoding. */
dfd0: 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
dfe0: 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e  convertUtf8Filen
dff0: 61 6d 65 28 7a 55 74 66 38 4e 61 6d 65 29 3b 0a  ame(zUtf8Name);.
e000: 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
e010: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
e020: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
e030: 20 20 7d 0a 0a 20 20 69 66 28 20 66 6c 61 67 73    }..  if( flags
e040: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
e050: 45 41 44 57 52 49 54 45 20 29 7b 0a 20 20 20 20  EADWRITE ){.    
e060: 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 20  dwDesiredAccess 
e070: 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c  = GENERIC_READ |
e080: 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a   GENERIC_WRITE;.
e090: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 44    }else{.    dwD
e0a0: 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47  esiredAccess = G
e0b0: 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d  ENERIC_READ;.  }
e0c0: 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50 45  .  /* SQLITE_OPE
e0d0: 4e 5f 45 58 43 4c 55 53 49 56 45 20 69 73 20 75  N_EXCLUSIVE is u
e0e0: 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  sed to make sure
e0f0: 20 74 68 61 74 20 61 20 6e 65 77 20 66 69 6c 65   that a new file
e100: 20 69 73 20 0a 20 20 2a 2a 20 63 72 65 61 74 65   is .  ** create
e110: 64 2e 20 53 51 4c 69 74 65 20 64 6f 65 73 6e 27  d. SQLite doesn'
e120: 74 20 75 73 65 20 69 74 20 74 6f 20 69 6e 64 69  t use it to indi
e130: 63 61 74 65 20 22 65 78 63 6c 75 73 69 76 65 20  cate "exclusive 
e140: 61 63 63 65 73 73 22 20 0a 20 20 2a 2a 20 61 73  access" .  ** as
e150: 20 69 74 20 69 73 20 75 73 75 61 6c 6c 79 20 75   it is usually u
e160: 6e 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a  nderstood..  */.
e170: 20 20 61 73 73 65 72 74 28 21 28 66 6c 61 67 73    assert(!(flags
e180: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45   & SQLITE_OPEN_E
e190: 58 43 4c 55 53 49 56 45 29 20 7c 7c 20 28 66 6c  XCLUSIVE) || (fl
e1a0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
e1b0: 4e 5f 43 52 45 41 54 45 29 29 3b 0a 20 20 69 66  N_CREATE));.  if
e1c0: 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
e1d0: 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
e1e0: 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ){.    /* Create
e1f0: 73 20 61 20 6e 65 77 20 66 69 6c 65 2c 20 6f 6e  s a new file, on
e200: 6c 79 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  ly if it does no
e210: 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e  t already exist.
e220: 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   */.    /* If th
e230: 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 69  e file exists, i
e240: 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20  t fails. */.    
e250: 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
e260: 69 74 69 6f 6e 20 3d 20 43 52 45 41 54 45 5f 4e  ition = CREATE_N
e270: 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EW;.  }else if( 
e280: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
e290: 50 45 4e 5f 43 52 45 41 54 45 20 29 7b 0a 20 20  PEN_CREATE ){.  
e2a0: 20 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74 69    /* Open existi
e2b0: 6e 67 20 66 69 6c 65 2c 20 6f 72 20 63 72 65 61  ng file, or crea
e2c0: 74 65 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74  te if it doesn't
e2d0: 20 65 78 69 73 74 20 2a 2f 0a 20 20 20 20 64 77   exist */.    dw
e2e0: 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
e2f0: 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59  ion = OPEN_ALWAY
e300: 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  S;.  }else{.    
e310: 2f 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c  /* Opens a file,
e320: 20 6f 6e 6c 79 20 69 66 20 69 74 20 65 78 69 73   only if it exis
e330: 74 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65  ts. */.    dwCre
e340: 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
e350: 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47   = OPEN_EXISTING
e360: 3b 0a 20 20 7d 0a 20 20 64 77 53 68 61 72 65 4d  ;.  }.  dwShareM
e370: 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48 41 52 45  ode = FILE_SHARE
e380: 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48 41  _READ | FILE_SHA
e390: 52 45 5f 57 52 49 54 45 3b 0a 20 20 69 66 28 20  RE_WRITE;.  if( 
e3a0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
e3b0: 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
e3c0: 45 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  E ){.#if SQLITE_
e3d0: 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 64 77 46  OS_WINCE.    dwF
e3e0: 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
e3f0: 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s = FILE_ATTRIBU
e400: 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20 20 20 69  TE_HIDDEN;.    i
e410: 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65 6c 73 65  sTemp = 1;.#else
e420: 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41  .    dwFlagsAndA
e430: 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45  ttributes = FILE
e440: 5f 41 54 54 52 49 42 55 54 45 5f 54 45 4d 50 4f  _ATTRIBUTE_TEMPO
e450: 52 41 52 59 0a 20 20 20 20 20 20 20 20 20 20 20  RARY.           
e460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e470: 20 20 20 20 7c 20 46 49 4c 45 5f 41 54 54 52 49      | FILE_ATTRI
e480: 42 55 54 45 5f 48 49 44 44 45 4e 0a 20 20 20 20  BUTE_HIDDEN.    
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4a0: 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c             | FIL
e4b0: 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e  E_FLAG_DELETE_ON
e4c0: 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69 66 0a 20  _CLOSE;.#endif. 
e4d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 46 6c   }else{.    dwFl
e4e0: 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
e4f0: 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   = FILE_ATTRIBUT
e500: 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20  E_NORMAL;.  }.  
e510: 2f 2a 20 52 65 70 6f 72 74 73 20 66 72 6f 6d 20  /* Reports from 
e520: 74 68 65 20 69 6e 74 65 72 6e 65 74 20 61 72 65  the internet are
e530: 20 74 68 61 74 20 70 65 72 66 6f 72 6d 61 6e 63   that performanc
e540: 65 20 69 73 20 61 6c 77 61 79 73 0a 20 20 2a 2a  e is always.  **
e550: 20 62 65 74 74 65 72 20 69 66 20 46 49 4c 45 5f   better if FILE_
e560: 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45  FLAG_RANDOM_ACCE
e570: 53 53 20 69 73 20 75 73 65 64 2e 20 20 54 69 63  SS is used.  Tic
e580: 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f 0a 23 69  ket #2699. */.#i
e590: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
e5a0: 45 0a 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74  E.  dwFlagsAndAt
e5b0: 74 72 69 62 75 74 65 73 20 7c 3d 20 46 49 4c 45  tributes |= FILE
e5c0: 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43  _FLAG_RANDOM_ACC
e5d0: 45 53 53 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  ESS;.#endif.  if
e5e0: 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
e5f0: 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 57 28  h = CreateFileW(
e600: 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74  (WCHAR*)zConvert
e610: 65 64 2c 0a 20 20 20 20 20 20 20 64 77 44 65 73  ed,.       dwDes
e620: 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20  iredAccess,.    
e630: 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a     dwShareMode,.
e640: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20         NULL,.   
e650: 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
e660: 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20  sposition,.     
e670: 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
e680: 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 4e  ibutes,.       N
e690: 55 4c 4c 0a 20 20 20 20 29 3b 0a 2f 2a 20 69 73  ULL.    );./* is
e6a0: 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c  NT() is 1 if SQL
e6b0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c  ITE_OS_WINCE==1,
e6c0: 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73   so this else is
e6d0: 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e   never executed.
e6e0: 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41   .** Since the A
e6f0: 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f 66 20  SCII version of 
e700: 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50  these Windows AP
e710: 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66  I do not exist f
e720: 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27  or WINCE,.** it'
e730: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e  s important to n
e740: 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ot reference the
e750: 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c  m for WINCE buil
e760: 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ds..*/.#if SQLIT
e770: 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20  E_OS_WINCE==0.  
e780: 7d 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20 43  }else{.    h = C
e790: 72 65 61 74 65 46 69 6c 65 41 28 28 63 68 61 72  reateFileA((char
e7a0: 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  *)zConverted,.  
e7b0: 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63       dwDesiredAc
e7c0: 63 65 73 73 2c 0a 20 20 20 20 20 20 20 64 77 53  cess,.       dwS
e7d0: 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20 20  hareMode,.      
e7e0: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 64 77   NULL,.       dw
e7f0: 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
e800: 69 6f 6e 2c 0a 20 20 20 20 20 20 20 64 77 46 6c  ion,.       dwFl
e810: 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
e820: 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20  ,.       NULL.  
e830: 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a    );.#endif.  }.
e840: 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
e850: 20 25 64 20 25 73 20 30 78 25 6c 78 20 25 73 5c   %d %s 0x%lx %s\
e860: 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  n", .           
e870: 68 2c 20 7a 4e 61 6d 65 2c 20 64 77 44 65 73 69  h, zName, dwDesi
e880: 72 65 64 41 63 63 65 73 73 2c 20 0a 20 20 20 20  redAccess, .    
e890: 20 20 20 20 20 20 20 68 3d 3d 49 4e 56 41 4c 49         h==INVALI
e8a0: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 3f  D_HANDLE_VALUE ?
e8b0: 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22   "failed" : "ok"
e8c0: 29 29 3b 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56  ));.  if( h==INV
e8d0: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
e8e0: 45 20 29 7b 0a 20 20 20 20 66 72 65 65 28 7a 43  E ){.    free(zC
e8f0: 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 69  onverted);.    i
e900: 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
e910: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
e920: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
e930: 20 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a   winOpen(pVfs, z
e940: 4e 61 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20 20  Name, id, .     
e950: 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 7c          ((flags|
e960: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
e970: 4f 4e 4c 59 29 26 7e 53 51 4c 49 54 45 5f 4f 50  ONLY)&~SQLITE_OP
e980: 45 4e 5f 52 45 41 44 57 52 49 54 45 29 2c 20 70  EN_READWRITE), p
e990: 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d  OutFlags);.    }
e9a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
e9b0: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
e9c0: 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
e9d0: 20 7d 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61   }.  if( pOutFla
e9e0: 67 73 20 29 7b 0a 20 20 20 20 69 66 28 20 66 6c  gs ){.    if( fl
e9f0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
ea00: 4e 5f 52 45 41 44 57 52 49 54 45 20 29 7b 0a 20  N_READWRITE ){. 
ea10: 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20       *pOutFlags 
ea20: 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
ea30: 41 44 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c  ADWRITE;.    }el
ea40: 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46  se{.      *pOutF
ea50: 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
ea60: 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  EN_READONLY;.   
ea70: 20 7d 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28   }.  }.  memset(
ea80: 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66  pFile, 0, sizeof
ea90: 28 2a 70 46 69 6c 65 29 29 3b 0a 20 20 70 46 69  (*pFile));.  pFi
eaa0: 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 77  le->pMethod = &w
eab0: 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 70 46  inIoMethod;.  pF
eac0: 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 46  ile->h = h;.  pF
ead0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
eae0: 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69   NO_ERROR;.  pFi
eaf0: 6c 65 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  le->pVfs = pVfs;
eb00: 0a 20 20 70 46 69 6c 65 2d 3e 70 53 68 6d 20 3d  .  pFile->pShm =
eb10: 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 7a 50 61   0;.  pFile->zPa
eb20: 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 46  th = zName;.  pF
eb30: 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
eb40: 3d 20 67 65 74 53 65 63 74 6f 72 53 69 7a 65 28  = getSectorSize(
eb50: 70 56 66 73 2c 20 7a 55 74 66 38 4e 61 6d 65 29  pVfs, zUtf8Name)
eb60: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
eb70: 57 49 4e 43 45 0a 20 20 69 66 28 20 28 66 6c 61  WINCE.  if( (fla
eb80: 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs & (SQLITE_OPE
eb90: 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
eba0: 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29  TE_OPEN_MAIN_DB)
ebb0: 29 20 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20  ) ==.           
ebc0: 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
ebd0: 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
ebe0: 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 0a  E_OPEN_MAIN_DB).
ebf0: 20 20 20 20 20 20 20 26 26 20 21 77 69 6e 63 65         && !wince
ec00: 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65  CreateLock(zName
ec10: 2c 20 70 46 69 6c 65 29 0a 20 20 29 7b 0a 20 20  , pFile).  ){.  
ec20: 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29    CloseHandle(h)
ec30: 3b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76  ;.    free(zConv
ec40: 65 72 74 65 64 29 3b 0a 20 20 20 20 72 65 74 75  erted);.    retu
ec50: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
ec60: 45 4e 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  EN_BKPT;.  }.  i
ec70: 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  f( isTemp ){.   
ec80: 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f   pFile->zDeleteO
ec90: 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72  nClose = zConver
eca0: 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  ted;.  }else.#en
ecb0: 64 69 66 0a 20 20 7b 0a 20 20 20 20 66 72 65 65  dif.  {.    free
ecc0: 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
ecd0: 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  }.  OpenCounter(
ece0: 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  +1);.  return SQ
ecf0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
ed00: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6e 61 6d  * Delete the nam
ed10: 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e  ed file..**.** N
ed20: 6f 74 65 20 74 68 61 74 20 77 69 6e 64 6f 77 73  ote that windows
ed30: 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20   does not allow 
ed40: 61 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c  a file to be del
ed50: 65 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68  eted if some oth
ed60: 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 68 61  er.** process ha
ed70: 73 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f 6d 65  s it open.  Some
ed80: 74 69 6d 65 73 20 61 20 76 69 72 75 73 20 73 63  times a virus sc
ed90: 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78 69 6e  anner or indexin
eda0: 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c  g program.** wil
edb0: 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c  l open a journal
edc0: 20 66 69 6c 65 20 73 68 6f 72 74 6c 79 20 61 66   file shortly af
edd0: 74 65 72 20 69 74 20 69 73 20 63 72 65 61 74 65  ter it is create
ede0: 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f  d in order to do
edf0: 0a 2a 2a 20 77 68 61 74 65 76 65 72 20 69 74 20  .** whatever it 
ee00: 64 6f 65 73 2e 20 20 57 68 69 6c 65 20 74 68 69  does.  While thi
ee10: 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  s other process 
ee20: 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 2a  is holding the.*
ee30: 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77 65 20  * file open, we 
ee40: 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65 20 74  will be unable t
ee50: 6f 20 64 65 6c 65 74 65 20 69 74 2e 20 20 54 6f  o delete it.  To
ee60: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
ee70: 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20 77 65  s.** problem, we
ee80: 20 64 65 6c 61 79 20 31 30 30 20 6d 69 6c 6c 69   delay 100 milli
ee90: 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20  seconds and try 
eea0: 74 6f 20 64 65 6c 65 74 65 20 61 67 61 69 6e 2e  to delete again.
eeb0: 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45    Up.** to MX_DE
eec0: 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 73 20  LETION_ATTEMPTs 
eed0: 64 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d 70 74  deletion attempt
eee0: 73 20 61 72 65 20 72 75 6e 20 62 65 66 6f 72 65  s are run before
eef0: 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20 61 6e   giving.** up an
ef00: 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  d returning an e
ef10: 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rror..*/.#define
ef20: 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54   MX_DELETION_ATT
ef30: 45 4d 50 54 53 20 35 0a 73 74 61 74 69 63 20 69  EMPTS 5.static i
ef40: 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 0a 20 20  nt winDelete(.  
ef50: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
ef60: 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  s,          /* N
ef70: 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32  ot used on win32
ef80: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
ef90: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20   *zFilename,    
efa0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
efb0: 65 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  e to delete */. 
efc0: 20 69 6e 74 20 73 79 6e 63 44 69 72 20 20 20 20   int syncDir    
efd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
efe0: 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33  Not used on win3
eff0: 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 6e  2 */.){.  int cn
f000: 74 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 72  t = 0;.  DWORD r
f010: 63 3b 0a 20 20 44 57 4f 52 44 20 65 72 72 6f 72  c;.  DWORD error
f020: 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a 43   = 0;.  void *zC
f030: 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65  onverted = conve
f040: 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  rtUtf8Filename(z
f050: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55  Filename);.  UNU
f060: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
f070: 66 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  fs);.  UNUSED_PA
f080: 52 41 4d 45 54 45 52 28 73 79 6e 63 44 69 72 29  RAMETER(syncDir)
f090: 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  ;.  if( zConvert
f0a0: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ed==0 ){.    ret
f0b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
f0c0: 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65  ;.  }.  Simulate
f0d0: 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
f0e0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
f0f0: 54 45 29 3b 0a 20 20 69 66 28 20 69 73 4e 54 28  TE);.  if( isNT(
f100: 29 20 29 7b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  ) ){.    do{.   
f110: 20 20 20 44 65 6c 65 74 65 46 69 6c 65 57 28 7a     DeleteFileW(z
f120: 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
f130: 7d 77 68 69 6c 65 28 20 20 20 28 20 20 20 28 28  }while(   (   ((
f140: 72 63 20 3d 20 47 65 74 46 69 6c 65 41 74 74 72  rc = GetFileAttr
f150: 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65 72 74  ibutesW(zConvert
f160: 65 64 29 29 20 21 3d 20 49 4e 56 41 4c 49 44 5f  ed)) != INVALID_
f170: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 29  FILE_ATTRIBUTES)
f180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f190: 7c 7c 20 28 28 65 72 72 6f 72 20 3d 20 47 65 74  || ((error = Get
f1a0: 4c 61 73 74 45 72 72 6f 72 28 29 29 20 3d 3d 20  LastError()) == 
f1b0: 45 52 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e  ERROR_ACCESS_DEN
f1c0: 49 45 44 29 29 0a 20 20 20 20 20 20 20 20 20 20  IED)).          
f1d0: 20 26 26 20 28 2b 2b 63 6e 74 20 3c 20 4d 58 5f   && (++cnt < MX_
f1e0: 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54  DELETION_ATTEMPT
f1f0: 53 29 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  S).           &&
f200: 20 28 53 6c 65 65 70 28 31 30 30 29 2c 20 31 29   (Sleep(100), 1)
f210: 20 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73   );./* isNT() is
f220: 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f   1 if SQLITE_OS_
f230: 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69  WINCE==1, so thi
f240: 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20  s else is never 
f250: 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69  executed. .** Si
f260: 6e 63 65 20 74 68 65 20 41 53 43 49 49 20 76 65  nce the ASCII ve
f270: 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57  rsion of these W
f280: 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f  indows API do no
f290: 74 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43  t exist for WINC
f2a0: 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72  E,.** it's impor
f2b0: 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65  tant to not refe
f2c0: 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57  rence them for W
f2d0: 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a  INCE builds..*/.
f2e0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
f2f0: 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a  NCE==0.  }else{.
f300: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 44 65      do{.      De
f310: 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65  leteFileA(zConve
f320: 72 74 65 64 29 3b 0a 20 20 20 20 7d 77 68 69 6c  rted);.    }whil
f330: 65 28 20 20 20 28 20 20 20 28 28 72 63 20 3d 20  e(   (   ((rc = 
f340: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
f350: 73 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 29 20  sA(zConverted)) 
f360: 21 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  != INVALID_FILE_
f370: 41 54 54 52 49 42 55 54 45 53 29 0a 20 20 20 20  ATTRIBUTES).    
f380: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28             || ((
f390: 65 72 72 6f 72 20 3d 20 47 65 74 4c 61 73 74 45  error = GetLastE
f3a0: 72 72 6f 72 28 29 29 20 3d 3d 20 45 52 52 4f 52  rror()) == ERROR
f3b0: 5f 41 43 43 45 53 53 5f 44 45 4e 49 45 44 29 29  _ACCESS_DENIED))
f3c0: 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
f3d0: 2b 2b 63 6e 74 20 3c 20 4d 58 5f 44 45 4c 45 54  ++cnt < MX_DELET
f3e0: 49 4f 4e 5f 41 54 54 45 4d 50 54 53 29 0a 20 20  ION_ATTEMPTS).  
f3f0: 20 20 20 20 20 20 20 20 20 26 26 20 28 53 6c 65           && (Sle
f400: 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23  ep(100), 1) );.#
f410: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 66 72 65 65  endif.  }.  free
f420: 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
f430: 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45 54 45  OSTRACE(("DELETE
f440: 20 5c 22 25 73 5c 22 20 25 73 5c 6e 22 2c 20 7a   \"%s\" %s\n", z
f450: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
f460: 20 28 20 28 72 63 3d 3d 49 4e 56 41 4c 49 44 5f   ( (rc==INVALID_
f470: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 29  FILE_ATTRIBUTES)
f480: 20 26 26 20 28 65 72 72 6f 72 3d 3d 45 52 52 4f   && (error==ERRO
f490: 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44  R_FILE_NOT_FOUND
f4a0: 29 29 20 3f 0a 20 20 20 20 20 20 20 20 20 22 6f  )) ?.         "o
f4b0: 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 20 29 29  k" : "failed" ))
f4c0: 3b 0a 20 0a 20 20 72 65 74 75 72 6e 20 28 20 20  ;. .  return (  
f4d0: 20 28 72 63 20 3d 3d 20 49 4e 56 41 4c 49 44 5f   (rc == INVALID_
f4e0: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 29  FILE_ATTRIBUTES)
f4f0: 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28   .          && (
f500: 65 72 72 6f 72 20 3d 3d 20 45 52 52 4f 52 5f 46  error == ERROR_F
f510: 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 29 29 20  ILE_NOT_FOUND)) 
f520: 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51  ? SQLITE_OK : SQ
f530: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
f540: 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  E;.}../*.** Chec
f550: 6b 20 74 68 65 20 65 78 69 73 74 61 6e 63 65 20  k the existance 
f560: 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20 61 20  and status of a 
f570: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
f580: 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28 0a 20  int winAccess(. 
f590: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
f5a0: 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  fs,         /* N
f5b0: 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32  ot used on win32
f5c0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
f5d0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20   *zFilename,    
f5e0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
f5f0: 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69   to check */.  i
f600: 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
f610: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70            /* Typ
f620: 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d 61 6b  e of test to mak
f630: 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  e on this file *
f640: 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  /.  int *pResOut
f650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f660: 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f  * OUT: Result */
f670: 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72  .){.  DWORD attr
f680: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
f690: 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
f6a0: 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38  ed = convertUtf8
f6b0: 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Filename(zFilena
f6c0: 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  me);.  UNUSED_PA
f6d0: 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
f6e0: 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
f6f0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
f700: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
f710: 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20   }.  if( isNT() 
f720: 29 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 47 65  ){.    attr = Ge
f730: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
f740: 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72  ((WCHAR*)zConver
f750: 74 65 64 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20  ted);./* isNT() 
f760: 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f  is 1 if SQLITE_O
f770: 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74  S_WINCE==1, so t
f780: 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65  his else is neve
f790: 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20  r executed. .** 
f7a0: 53 69 6e 63 65 20 74 68 65 20 41 53 43 49 49 20  Since the ASCII 
f7b0: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65  version of these
f7c0: 20 57 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20   Windows API do 
f7d0: 6e 6f 74 20 65 78 69 73 74 20 66 6f 72 20 57 49  not exist for WI
f7e0: 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70  NCE,.** it's imp
f7f0: 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65  ortant to not re
f800: 66 65 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72  ference them for
f810: 20 57 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a   WINCE builds..*
f820: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
f830: 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65  WINCE==0.  }else
f840: 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 47 65 74  {.    attr = Get
f850: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28  FileAttributesA(
f860: 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
f870: 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  d);.#endif.  }. 
f880: 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64   free(zConverted
f890: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61  );.  switch( fla
f8a0: 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  gs ){.    case S
f8b0: 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
f8c0: 44 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  D:.    case SQLI
f8d0: 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
f8e0: 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74 74  :.      rc = att
f8f0: 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r!=INVALID_FILE_
f900: 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20  ATTRIBUTES;.    
f910: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
f920: 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
f930: 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20  READWRITE:.     
f940: 20 72 63 20 3d 20 28 61 74 74 72 20 26 20 46 49   rc = (attr & FI
f950: 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45 41  LE_ATTRIBUTE_REA
f960: 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 20  DONLY)==0;.     
f970: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
f980: 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72  ult:.      asser
f990: 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67  t(!"Invalid flag
f9a0: 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20  s argument");.  
f9b0: 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  }.  *pResOut = r
f9c0: 63 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  c;.  return SQLI
f9d0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
f9e0: 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65   Turn a relative
f9f0: 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61   pathname into a
fa00: 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20   full pathname. 
fa10: 20 57 72 69 74 65 20 74 68 65 20 66 75 6c 6c 0a   Write the full.
fa20: 2a 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f  ** pathname into
fa30: 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d   zOut[].  zOut[]
fa40: 20 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 61 73   will be at leas
fa50: 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  t pVfs->mxPathna
fa60: 6d 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  me.** bytes in s
fa70: 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
fa80: 6e 74 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61  nt winFullPathna
fa90: 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  me(.  sqlite3_vf
faa0: 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
fab0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
fac0: 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a  o vfs object */.
fad0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52    const char *zR
fae0: 65 6c 61 74 69 76 65 2c 20 20 20 20 20 20 20 20  elative,        
faf0: 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61  /* Possibly rela
fb00: 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20  tive input path 
fb10: 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c 20  */.  int nFull, 
fb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb30: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75     /* Size of ou
fb40: 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62  tput buffer in b
fb50: 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ytes */.  char *
fb60: 7a 46 75 6c 6c 20 20 20 20 20 20 20 20 20 20 20  zFull           
fb70: 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
fb80: 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20  t buffer */.){. 
fb90: 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f   .#if defined(__
fba0: 43 59 47 57 49 4e 5f 5f 29 0a 20 20 55 4e 55 53  CYGWIN__).  UNUS
fbb0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75  ED_PARAMETER(nFu
fbc0: 6c 6c 29 3b 0a 20 20 63 79 67 77 69 6e 5f 63 6f  ll);.  cygwin_co
fbd0: 6e 76 5f 74 6f 5f 66 75 6c 6c 5f 77 69 6e 33 32  nv_to_full_win32
fbe0: 5f 70 61 74 68 28 7a 52 65 6c 61 74 69 76 65 2c  _path(zRelative,
fbf0: 20 7a 46 75 6c 6c 29 3b 0a 20 20 72 65 74 75 72   zFull);.  retur
fc00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
fc10: 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
fc20: 4f 53 5f 57 49 4e 43 45 0a 20 20 55 4e 55 53 45  OS_WINCE.  UNUSE
fc30: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c  D_PARAMETER(nFul
fc40: 6c 29 3b 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68  l);.  /* WinCE h
fc50: 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66  as no concept of
fc60: 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
fc70: 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d  name, or so I am
fc80: 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 73 71 6c 69   told. */.  sqli
fc90: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 70 56 66  te3_snprintf(pVf
fca0: 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a  s->mxPathname, z
fcb0: 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52 65 6c  Full, "%s", zRel
fcc0: 61 74 69 76 65 29 3b 0a 20 20 72 65 74 75 72 6e  ative);.  return
fcd0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
fce0: 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  if..#if !SQLITE_
fcf0: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64 65 66  OS_WINCE && !def
fd00: 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
fd10: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
fd20: 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
fd30: 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a  ;.  char *zOut;.
fd40: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
fd50: 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 7a 43 6f  ER(nFull);.  zCo
fd60: 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72  nverted = conver
fd70: 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52  tUtf8Filename(zR
fd80: 65 6c 61 74 69 76 65 29 3b 0a 20 20 69 66 28 20  elative);.  if( 
fd90: 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 57 43  isNT() ){.    WC
fda0: 48 41 52 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20  HAR *zTemp;.    
fdb0: 6e 42 79 74 65 20 3d 20 47 65 74 46 75 6c 6c 50  nByte = GetFullP
fdc0: 61 74 68 4e 61 6d 65 57 28 28 57 43 48 41 52 2a  athNameW((WCHAR*
fdd0: 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20  )zConverted, 0, 
fde0: 30 2c 20 30 29 20 2b 20 33 3b 0a 20 20 20 20 7a  0, 0) + 3;.    z
fdf0: 54 65 6d 70 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  Temp = malloc( n
fe00: 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d  Byte*sizeof(zTem
fe10: 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  p[0]) );.    if(
fe20: 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20   zTemp==0 ){.   
fe30: 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74     free(zConvert
fe40: 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ed);.      retur
fe50: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
fe60: 20 20 20 20 7d 0a 20 20 20 20 47 65 74 46 75 6c      }.    GetFul
fe70: 6c 50 61 74 68 4e 61 6d 65 57 28 28 57 43 48 41  lPathNameW((WCHA
fe80: 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e  R*)zConverted, n
fe90: 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b  Byte, zTemp, 0);
fea0: 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65  .    free(zConve
feb0: 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20  rted);.    zOut 
fec0: 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  = unicodeToUtf8(
fed0: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 66 72 65 65  zTemp);.    free
fee0: 28 7a 54 65 6d 70 29 3b 0a 2f 2a 20 69 73 4e 54  (zTemp);./* isNT
fef0: 28 29 20 69 73 20 31 20 69 66 20 53 51 4c 49 54  () is 1 if SQLIT
ff00: 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73  E_OS_WINCE==1, s
ff10: 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e  o this else is n
ff20: 65 76 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a  ever executed. .
ff30: 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41 53 43  ** Since the ASC
ff40: 49 49 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  II version of th
ff50: 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50 49 20  ese Windows API 
ff60: 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66 6f 72  do not exist for
ff70: 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20   WINCE,.** it's 
ff80: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74  important to not
ff90: 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 6d 20   reference them 
ffa0: 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c 64 73  for WINCE builds
ffb0: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
ffc0: 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65  OS_WINCE==0.  }e
ffd0: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
ffe0: 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20  Temp;.    nByte 
fff0: 3d 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  = GetFullPathNam
10000 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  eA((char*)zConve
10010 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 20 2b  rted, 0, 0, 0) +
10020 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20   3;.    zTemp = 
10030 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69  malloc( nByte*si
10040 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29  zeof(zTemp[0]) )
10050 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d  ;.    if( zTemp=
10060 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  =0 ){.      free
10070 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
10080 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10090 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
100a0 20 20 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61     GetFullPathNa
100b0 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  meA((char*)zConv
100c0 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54  erted, nByte, zT
100d0 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 66 72 65  emp, 0);.    fre
100e0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
100f0 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65     zOut = sqlite
10100 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
10110 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20  utf8(zTemp);.   
10120 20 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 23 65   free(zTemp);.#e
10130 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 7a  ndif.  }.  if( z
10140 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Out ){.    sqlit
10150 65 33 5f 73 6e 70 72 69 6e 74 66 28 70 56 66 73  e3_snprintf(pVfs
10160 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 46  ->mxPathname, zF
10170 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29  ull, "%s", zOut)
10180 3b 0a 20 20 20 20 66 72 65 65 28 7a 4f 75 74 29  ;.    free(zOut)
10190 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
101a0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
101b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
101c0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65  TE_NOMEM;.  }.#e
101d0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ndif.}../*.** Ge
101e0 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  t the sector siz
101f0 65 20 6f 66 20 74 68 65 20 64 65 76 69 63 65 20  e of the device 
10200 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a  used to store.**
10210 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
10220 20 69 6e 74 20 67 65 74 53 65 63 74 6f 72 53 69   int getSectorSi
10230 7a 65 28 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ze(.    sqlite3_
10240 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 20 20 63  vfs *pVfs,.    c
10250 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61  onst char *zRela
10260 74 69 76 65 20 20 20 20 20 2f 2a 20 55 54 46 2d  tive     /* UTF-
10270 38 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 29  8 file name */.)
10280 7b 0a 20 20 44 57 4f 52 44 20 62 79 74 65 73 50  {.  DWORD bytesP
10290 65 72 53 65 63 74 6f 72 20 3d 20 53 51 4c 49 54  erSector = SQLIT
102a0 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52  E_DEFAULT_SECTOR
102b0 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 47 65 74 44  _SIZE;.  /* GetD
102c0 69 73 6b 46 72 65 65 53 70 61 63 65 20 69 73 20  iskFreeSpace is 
102d0 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 75 6e  not supported un
102e0 64 65 72 20 57 49 4e 43 45 20 2a 2f 0a 23 69 66  der WINCE */.#if
102f0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
10300 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
10310 54 45 52 28 70 56 66 73 29 3b 0a 20 20 55 4e 55  TER(pVfs);.  UNU
10320 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 52  SED_PARAMETER(zR
10330 65 6c 61 74 69 76 65 29 3b 0a 23 65 6c 73 65 0a  elative);.#else.
10340 20 20 63 68 61 72 20 7a 46 75 6c 6c 70 61 74 68    char zFullpath
10350 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 0a 20 20  [MAX_PATH+1];.  
10360 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52 44 20  int rc;.  DWORD 
10370 64 77 52 65 74 20 3d 20 30 3b 0a 20 20 44 57 4f  dwRet = 0;.  DWO
10380 52 44 20 64 77 44 75 6d 6d 79 3b 0a 0a 20 20 2f  RD dwDummy;..  /
10390 2a 0a 20 20 2a 2a 20 57 65 20 6e 65 65 64 20 74  *.  ** We need t
103a0 6f 20 67 65 74 20 74 68 65 20 66 75 6c 6c 20 70  o get the full p
103b0 61 74 68 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ath name of the 
103c0 66 69 6c 65 0a 20 20 2a 2a 20 74 6f 20 67 65 74  file.  ** to get
103d0 20 74 68 65 20 64 72 69 76 65 20 6c 65 74 74 65   the drive lette
103e0 72 20 74 6f 20 6c 6f 6f 6b 20 75 70 20 74 68 65  r to look up the
103f0 20 73 65 63 74 6f 72 0a 20 20 2a 2a 20 73 69 7a   sector.  ** siz
10400 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 77  e..  */.  rc = w
10410 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70  inFullPathname(p
10420 56 66 73 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20  Vfs, zRelative, 
10430 4d 41 58 5f 50 41 54 48 2c 20 7a 46 75 6c 6c 70  MAX_PATH, zFullp
10440 61 74 68 29 3b 0a 20 20 69 66 28 20 72 63 20 3d  ath);.  if( rc =
10450 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 0a 20 20  = SQLITE_OK ).  
10460 7b 0a 20 20 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  {.    void *zCon
10470 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74  verted = convert
10480 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 75  Utf8Filename(zFu
10490 6c 6c 70 61 74 68 29 3b 0a 20 20 20 20 69 66 28  llpath);.    if(
104a0 20 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20   zConverted ){. 
104b0 20 20 20 20 20 69 66 28 20 69 73 4e 54 28 29 20       if( isNT() 
104c0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 74 72  ){.        /* tr
104d0 69 6d 20 70 61 74 68 20 74 6f 20 6a 75 73 74 20  im path to just 
104e0 64 72 69 76 65 20 72 65 66 65 72 65 6e 63 65 20  drive reference 
104f0 2a 2f 0a 20 20 20 20 20 20 20 20 57 43 48 41 52  */.        WCHAR
10500 20 2a 70 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64   *p = zConverted
10510 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 2a  ;.        for(;*
10520 70 3b 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  p;p++){.        
10530 20 20 69 66 28 20 2a 70 20 3d 3d 20 27 5c 5c 27    if( *p == '\\'
10540 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
10550 2a 70 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  *p = '\0';.     
10560 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10570 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10580 20 20 7d 0a 20 20 20 20 20 20 20 20 64 77 52 65    }.        dwRe
10590 74 20 3d 20 47 65 74 44 69 73 6b 46 72 65 65 53  t = GetDiskFreeS
105a0 70 61 63 65 57 28 28 57 43 48 41 52 2a 29 7a 43  paceW((WCHAR*)zC
105b0 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
105c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105d0 20 20 20 20 20 20 20 20 20 20 20 20 26 64 77 44              &dwD
105e0 75 6d 6d 79 2c 0a 20 20 20 20 20 20 20 20 20 20  ummy,.          
105f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10600 20 20 20 20 20 20 20 20 26 62 79 74 65 73 50 65          &bytesPe
10610 72 53 65 63 74 6f 72 2c 0a 20 20 20 20 20 20 20  rSector,.       
10620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10630 20 20 20 20 20 20 20 20 20 20 20 26 64 77 44 75             &dwDu
10640 6d 6d 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mmy,.           
10650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10660 20 20 20 20 20 20 20 26 64 77 44 75 6d 6d 79 29         &dwDummy)
10670 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
10680 20 20 20 20 20 20 20 2f 2a 20 74 72 69 6d 20 70         /* trim p
10690 61 74 68 20 74 6f 20 6a 75 73 74 20 64 72 69 76  ath to just driv
106a0 65 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 20  e reference */. 
106b0 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 20 3d         char *p =
106c0 20 28 63 68 61 72 20 2a 29 7a 43 6f 6e 76 65 72   (char *)zConver
106d0 74 65 64 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ted;.        for
106e0 28 3b 2a 70 3b 70 2b 2b 29 7b 0a 20 20 20 20 20  (;*p;p++){.     
106f0 20 20 20 20 20 69 66 28 20 2a 70 20 3d 3d 20 27       if( *p == '
10700 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  \\' ){.         
10710 20 20 20 2a 70 20 3d 20 27 5c 30 27 3b 0a 20 20     *p = '\0';.  
10720 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
10730 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
10740 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64       }.        d
10750 77 52 65 74 20 3d 20 47 65 74 44 69 73 6b 46 72  wRet = GetDiskFr
10760 65 65 53 70 61 63 65 41 28 28 63 68 61 72 2a 29  eeSpaceA((char*)
10770 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
10780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 64                &d
107a0 77 44 75 6d 6d 79 2c 0a 20 20 20 20 20 20 20 20  wDummy,.        
107b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107c0 20 20 20 20 20 20 20 20 20 20 26 62 79 74 65 73            &bytes
107d0 50 65 72 53 65 63 74 6f 72 2c 0a 20 20 20 20 20  PerSector,.     
107e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107f0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 64 77               &dw
10800 44 75 6d 6d 79 2c 0a 20 20 20 20 20 20 20 20 20  Dummy,.         
10810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10820 20 20 20 20 20 20 20 20 20 26 64 77 44 75 6d 6d           &dwDumm
10830 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  y);.      }.    
10840 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65    free(zConverte
10850 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  d);.    }.    if
10860 28 20 21 64 77 52 65 74 20 29 7b 0a 20 20 20 20  ( !dwRet ){.    
10870 20 20 62 79 74 65 73 50 65 72 53 65 63 74 6f 72    bytesPerSector
10880 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
10890 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  T_SECTOR_SIZE;. 
108a0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
108b0 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 20 62    return (int) b
108c0 79 74 65 73 50 65 72 53 65 63 74 6f 72 3b 20 0a  ytesPerSector; .
108d0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
108e0 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
108f0 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  NSION./*.** Inte
10900 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69  rfaces for openi
10910 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72  ng a shared libr
10920 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74  ary, finding ent
10930 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74  ry points.** wit
10940 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  hin the shared l
10950 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73  ibrary, and clos
10960 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
10970 69 62 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a  ibrary..*/./*.**
10980 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20   Interfaces for 
10990 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64  opening a shared
109a0 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e   library, findin
109b0 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a  g entry points.*
109c0 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61  * within the sha
109d0 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64  red library, and
109e0 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61   closing the sha
109f0 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a  red library..*/.
10a00 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e  static void *win
10a10 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  DlOpen(sqlite3_v
10a20 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20  fs *pVfs, const 
10a30 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
10a40 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20  {.  HANDLE h;.  
10a50 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
10a60 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69   = convertUtf8Fi
10a70 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  lename(zFilename
10a80 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
10a90 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 69  METER(pVfs);.  i
10aa0 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
10ab0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
10ac0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54  ;.  }.  if( isNT
10ad0 28 29 20 29 7b 0a 20 20 20 20 68 20 3d 20 4c 6f  () ){.    h = Lo
10ae0 61 64 4c 69 62 72 61 72 79 57 28 28 57 43 48 41  adLibraryW((WCHA
10af0 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  R*)zConverted);.
10b00 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69  /* isNT() is 1 i
10b10 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
10b20 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c  E==1, so this el
10b30 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63  se is never exec
10b40 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20  uted. .** Since 
10b50 74 68 65 20 41 53 43 49 49 20 76 65 72 73 69 6f  the ASCII versio
10b60 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f  n of these Windo
10b70 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78  ws API do not ex
10b80 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a  ist for WINCE,.*
10b90 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74  * it's important
10ba0 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63   to not referenc
10bb0 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45  e them for WINCE
10bc0 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20   builds..*/.#if 
10bd0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
10be0 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  =0.  }else{.    
10bf0 68 20 3d 20 4c 6f 61 64 4c 69 62 72 61 72 79 41  h = LoadLibraryA
10c00 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
10c10 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  ed);.#endif.  }.
10c20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65    free(zConverte
10c30 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  d);.  return (vo
10c40 69 64 2a 29 68 3b 0a 7d 0a 73 74 61 74 69 63 20  id*)h;.}.static 
10c50 76 6f 69 64 20 77 69 6e 44 6c 45 72 72 6f 72 28  void winDlError(
10c60 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
10c70 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
10c80 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 55  r *zBufOut){.  U
10c90 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
10ca0 70 56 66 73 29 3b 0a 20 20 67 65 74 4c 61 73 74  pVfs);.  getLast
10cb0 45 72 72 6f 72 4d 73 67 28 6e 42 75 66 2c 20 7a  ErrorMsg(nBuf, z
10cc0 42 75 66 4f 75 74 29 3b 0a 7d 0a 76 6f 69 64 20  BufOut);.}.void 
10cd0 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74  (*winDlSym(sqlit
10ce0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f  e3_vfs *pVfs, vo
10cf0 69 64 20 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e  id *pHandle, con
10d00 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c  st char *zSymbol
10d10 29 29 28 76 6f 69 64 29 7b 0a 20 20 55 4e 55 53  ))(void){.  UNUS
10d20 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
10d30 73 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  s);.#if SQLITE_O
10d40 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 20 54 68 65  S_WINCE.  /* The
10d50 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41   GetProcAddressA
10d60 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  () routine is on
10d70 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
10d80 77 69 6e 63 65 2e 20 2a 2f 0a 20 20 72 65 74 75  wince. */.  retu
10d90 72 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64  rn (void(*)(void
10da0 29 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  ))GetProcAddress
10db0 41 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c  A((HANDLE)pHandl
10dc0 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 23 65 6c  e, zSymbol);.#el
10dd0 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65  se.  /* All othe
10de0 72 20 77 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f  r windows platfo
10df0 72 6d 73 20 65 78 70 65 63 74 20 47 65 74 50 72  rms expect GetPr
10e00 6f 63 41 64 64 72 65 73 73 28 29 20 74 6f 20 74  ocAddress() to t
10e10 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 6e 73 69  ake.  ** an Ansi
10e20 20 73 74 72 69 6e 67 20 72 65 67 61 72 64 6c 65   string regardle
10e30 73 73 20 6f 66 20 74 68 65 20 5f 55 4e 49 43 4f  ss of the _UNICO
10e40 44 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20  DE setting */.  
10e50 72 65 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28  return (void(*)(
10e60 76 6f 69 64 29 29 47 65 74 50 72 6f 63 41 64 64  void))GetProcAdd
10e70 72 65 73 73 28 28 48 41 4e 44 4c 45 29 70 48 61  ress((HANDLE)pHa
10e80 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a  ndle, zSymbol);.
10e90 23 65 6e 64 69 66 0a 7d 0a 76 6f 69 64 20 77 69  #endif.}.void wi
10ea0 6e 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  nDlClose(sqlite3
10eb0 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64  _vfs *pVfs, void
10ec0 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e   *pHandle){.  UN
10ed0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
10ee0 56 66 73 29 3b 0a 20 20 46 72 65 65 4c 69 62 72  Vfs);.  FreeLibr
10ef0 61 72 79 28 28 48 41 4e 44 4c 45 29 70 48 61 6e  ary((HANDLE)pHan
10f00 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  dle);.}.#else /*
10f10 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
10f20 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69  LOAD_EXTENSION i
10f30 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20  s defined: */.  
10f40 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65  #define winDlOpe
10f50 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77  n  0.  #define w
10f60 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64  inDlError 0.  #d
10f70 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20  efine winDlSym  
10f80 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e   0.  #define win
10f90 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66  DlClose 0.#endif
10fa0 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75  .../*.** Write u
10fb0 70 20 74 6f 20 6e 42 75 66 20 62 79 74 65 73 20  p to nBuf bytes 
10fc0 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e  of randomness in
10fd0 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74  to zBuf..*/.stat
10fe0 69 63 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d  ic int winRandom
10ff0 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73  ness(sqlite3_vfs
11000 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
11010 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
11020 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 55 4e   int n = 0;.  UN
11030 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
11040 56 66 73 29 3b 0a 23 69 66 20 64 65 66 69 6e 65  Vfs);.#if define
11050 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20  d(SQLITE_TEST). 
11060 20 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d 65 6d   n = nBuf;.  mem
11070 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75  set(zBuf, 0, nBu
11080 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  f);.#else.  if( 
11090 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54 49 4d  sizeof(SYSTEMTIM
110a0 45 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20  E)<=nBuf-n ){.  
110b0 20 20 53 59 53 54 45 4d 54 49 4d 45 20 78 3b 0a    SYSTEMTIME x;.
110c0 20 20 20 20 47 65 74 53 79 73 74 65 6d 54 69 6d      GetSystemTim
110d0 65 28 26 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70  e(&x);.    memcp
110e0 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c 20  y(&zBuf[n], &x, 
110f0 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20  sizeof(x));.    
11100 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 78 29 3b 0a  n += sizeof(x);.
11110 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66    }.  if( sizeof
11120 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20  (DWORD)<=nBuf-n 
11130 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 70 69 64  ){.    DWORD pid
11140 20 3d 20 47 65 74 43 75 72 72 65 6e 74 50 72 6f   = GetCurrentPro
11150 63 65 73 73 49 64 28 29 3b 0a 20 20 20 20 6d 65  cessId();.    me
11160 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26  mcpy(&zBuf[n], &
11170 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29  pid, sizeof(pid)
11180 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65  );.    n += size
11190 6f 66 28 70 69 64 29 3b 0a 20 20 7d 0a 20 20 69  of(pid);.  }.  i
111a0 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29  f( sizeof(DWORD)
111b0 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20  <=nBuf-n ){.    
111c0 44 57 4f 52 44 20 63 6e 74 20 3d 20 47 65 74 54  DWORD cnt = GetT
111d0 69 63 6b 43 6f 75 6e 74 28 29 3b 0a 20 20 20 20  ickCount();.    
111e0 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c  memcpy(&zBuf[n],
111f0 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e   &cnt, sizeof(cn
11200 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69  t));.    n += si
11210 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 20  zeof(cnt);.  }. 
11220 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 41 52 47   if( sizeof(LARG
11230 45 5f 49 4e 54 45 47 45 52 29 3c 3d 6e 42 75 66  E_INTEGER)<=nBuf
11240 2d 6e 20 29 7b 0a 20 20 20 20 4c 41 52 47 45 5f  -n ){.    LARGE_
11250 49 4e 54 45 47 45 52 20 69 3b 0a 20 20 20 20 51  INTEGER i;.    Q
11260 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43  ueryPerformanceC
11270 6f 75 6e 74 65 72 28 26 69 29 3b 0a 20 20 20 20  ounter(&i);.    
11280 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c  memcpy(&zBuf[n],
11290 20 26 69 2c 20 73 69 7a 65 6f 66 28 69 29 29 3b   &i, sizeof(i));
112a0 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66  .    n += sizeof
112b0 28 69 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  (i);.  }.#endif.
112c0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a    return n;.}...
112d0 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
112e0 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
112f0 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
11300 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
11310 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11320 77 69 6e 53 6c 65 65 70 28 73 71 6c 69 74 65 33  winSleep(sqlite3
11330 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
11340 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20 53 6c 65  microsec){.  Sle
11350 65 70 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39  ep((microsec+999
11360 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55 53 45  )/1000);.  UNUSE
11370 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
11380 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6d 69  );.  return ((mi
11390 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30  crosec+999)/1000
113a0 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )*1000;.}../*.**
113b0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
113c0 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20  ariable, if set 
113d0 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
113e0 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65  lue, is interpre
113f0 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75  ted as.** the nu
11400 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20  mber of seconds 
11410 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69  since 1970 and i
11420 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68  s used to set th
11430 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73  e result of.** s
11440 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
11450 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73  ime() during tes
11460 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ting..*/.#ifdef 
11470 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
11480 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
11490 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61  time = 0;  /* Fa
114a0 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69  ke system time i
114b0 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  n seconds since 
114c0 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  1970. */.#endif.
114d0 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
114e0 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
114f0 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
11500 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
11510 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
11520 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
11530 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
11540 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
11550 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30  mber times 86_40
11560 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74  0_000.  In.** ot
11570 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65  her words, write
11580 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65   into *piNow the
11590 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
115a0 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68  seconds since th
115b0 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63  e Julian.** epoc
115c0 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65  h of noon in Gre
115d0 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62  enwich on Novemb
115e0 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20  er 24, 4714 B.C 
115f0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
11600 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72  .** proleptic Gr
11610 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72  egorian calendar
11620 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
11630 73 73 2c 20 72 65 74 75 72 6e 20 30 2e 20 20 52  ss, return 0.  R
11640 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
11650 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
11660 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
11670 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43  .static int winC
11680 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
11690 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
116a0 73 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  s, sqlite3_int64
116b0 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46   *piNow){.  /* F
116c0 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74 75 72  ILETIME structur
116d0 65 20 69 73 20 61 20 36 34 2d 62 69 74 20 76 61  e is a 64-bit va
116e0 6c 75 65 20 72 65 70 72 65 73 65 6e 74 69 6e 67  lue representing
116f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a   the number of .
11700 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65 63       100-nanosec
11710 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73 20 73 69  ond intervals si
11720 6e 63 65 20 4a 61 6e 75 61 72 79 20 31 2c 20 31  nce January 1, 1
11730 36 30 31 20 28 3d 20 4a 44 20 32 33 30 35 38 31  601 (= JD 230581
11740 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20 20 46 49  3.5). .  */.  FI
11750 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 73 74 61  LETIME ft;.  sta
11760 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
11770 33 5f 69 6e 74 36 34 20 77 69 6e 46 69 6c 65 74  3_int64 winFilet
11780 69 6d 65 45 70 6f 63 68 20 3d 20 32 33 30 35 38  imeEpoch = 23058
11790 31 33 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  135*(sqlite3_int
117a0 36 34 29 38 36 34 30 30 30 30 3b 0a 23 69 66 64  64)8640000;.#ifd
117b0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
117c0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
117d0 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78  lite3_int64 unix
117e0 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35  Epoch = 24405875
117f0 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
11800 38 36 34 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a  8640000;.#endif.
11810 20 20 2f 2a 20 32 5e 33 32 20 2d 20 74 6f 20 61    /* 2^32 - to a
11820 76 6f 69 64 20 75 73 65 20 6f 66 20 4c 4c 20 61  void use of LL a
11830 6e 64 20 77 61 72 6e 69 6e 67 73 20 69 6e 20 67  nd warnings in g
11840 63 63 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63  cc */.  static c
11850 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74  onst sqlite3_int
11860 36 34 20 6d 61 78 33 32 42 69 74 56 61 6c 75 65  64 max32BitValue
11870 20 3d 20 0a 20 20 20 20 20 20 28 73 71 6c 69 74   = .      (sqlit
11880 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30  e3_int64)2000000
11890 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f 69  000 + (sqlite3_i
118a0 6e 74 36 34 29 32 30 30 30 30 30 30 30 30 30 20  nt64)2000000000 
118b0 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  + (sqlite3_int64
118c0 29 32 39 34 39 36 37 32 39 36 3b 0a 0a 23 69 66  )294967296;..#if
118d0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
118e0 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69  .  SYSTEMTIME ti
118f0 6d 65 3b 0a 20 20 47 65 74 53 79 73 74 65 6d 54  me;.  GetSystemT
11900 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f 2a  ime(&time);.  /*
11910 20 69 66 20 53 79 73 74 65 6d 54 69 6d 65 54 6f   if SystemTimeTo
11920 46 69 6c 65 54 69 6d 65 28 29 20 66 61 69 6c 73  FileTime() fails
11930 2c 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72  , it returns zer
11940 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21 53 79 73  o. */.  if (!Sys
11950 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d  temTimeToFileTim
11960 65 28 26 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20  e(&time,&ft)){. 
11970 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
11980 0a 23 65 6c 73 65 0a 20 20 47 65 74 53 79 73 74  .#else.  GetSyst
11990 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
119a0 28 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a  ( &ft );.#endif.
119b0 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46  .  *piNow = winF
119c0 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20  iletimeEpoch +. 
119d0 20 20 20 20 20 20 20 20 20 20 20 28 28 28 28 73             ((((s
119e0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e  qlite3_int64)ft.
119f0 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 29 2a  dwHighDateTime)*
11a00 6d 61 78 33 32 42 69 74 56 61 6c 75 65 29 20 2b  max32BitValue) +
11a10 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
11a20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
11a30 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65  ft.dwLowDateTime
11a40 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  )/(sqlite3_int64
11a50 29 31 30 30 30 3b 0a 0a 23 69 66 64 65 66 20 53  )1000;..#ifdef S
11a60 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
11a70 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
11a80 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69  _time ){.    *pi
11a90 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69  Now = 1000*(sqli
11aa0 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65  te3_int64)sqlite
11ab0 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b  3_current_time +
11ac0 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a   unixEpoch;.  }.
11ad0 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f  #endif.  UNUSED_
11ae0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
11af0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
11b00 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  /*.** Find the c
11b10 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20  urrent time (in 
11b20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69  Universal Coordi
11b30 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72  nated Time).  Wr
11b40 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65  ite the.** curre
11b50 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
11b60 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
11b70 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72   number into *pr
11b80 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  Now and.** retur
11b90 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69  n 0.  Return 1 i
11ba0 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
11bb0 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  ate cannot be fo
11bc0 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 77 69 6e 43  und..*/.int winC
11bd0 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74  urrentTime(sqlit
11be0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f  e3_vfs *pVfs, do
11bf0 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20  uble *prNow){.  
11c00 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
11c10 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72 63 20  3_int64 i;.  rc 
11c20 3d 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65  = winCurrentTime
11c30 49 6e 74 36 34 28 70 56 66 73 2c 20 26 69 29 3b  Int64(pVfs, &i);
11c40 0a 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20  .  if( !rc ){.  
11c50 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34    *prNow = i/864
11c60 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 72  00000.0;.  }.  r
11c70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11c80 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74  ** The idea is t
11c90 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hat this functio
11ca0 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20 63  n works like a c
11cb0 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a  ombination of.**
11cc0 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20   GetLastError() 
11cd0 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73 61 67  and FormatMessag
11ce0 65 28 29 20 6f 6e 20 77 69 6e 64 6f 77 73 20 28  e() on windows (
11cf0 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20  or errno and.** 
11d00 73 74 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e 20  strerror_r() on 
11d10 75 6e 69 78 29 2e 20 41 66 74 65 72 20 61 6e 20  unix). After an 
11d20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
11d30 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 75  d by an OS.** fu
11d40 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20 63  nction, SQLite c
11d50 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69  alls this functi
11d60 6f 6e 20 77 69 74 68 20 7a 42 75 66 20 70 6f 69  on with zBuf poi
11d70 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 75  nting to.** a bu
11d80 66 66 65 72 20 6f 66 20 6e 42 75 66 20 62 79 74  ffer of nBuf byt
11d90 65 73 2e 20 54 68 65 20 4f 53 20 6c 61 79 65 72  es. The OS layer
11da0 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65   should populate
11db0 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 20 77   the.** buffer w
11dc0 69 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e  ith a nul-termin
11dd0 61 74 65 64 20 55 54 46 2d 38 20 65 6e 63 6f 64  ated UTF-8 encod
11de0 65 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ed error message
11df0 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 74  .** describing t
11e00 68 65 20 6c 61 73 74 20 49 4f 20 65 72 72 6f 72  he last IO error
11e10 20 74 6f 20 68 61 76 65 20 6f 63 63 75 72 72 65   to have occurre
11e20 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c  d within the cal
11e30 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e 0a  ling.** thread..
11e40 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 72 72  **.** If the err
11e50 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 74 6f  or message is to
11e60 6f 20 6c 61 72 67 65 20 66 6f 72 20 74 68 65 20  o large for the 
11e70 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 2c  supplied buffer,
11e80 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20 62 65  .** it should be
11e90 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65 20   truncated. The 
11ea0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
11eb0 78 47 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a 2a  xGetLastError.**
11ec0 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20   is zero if the 
11ed0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69  error message fi
11ee0 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  ts in the buffer
11ef0 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a  , or non-zero.**
11f00 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74   otherwise (if t
11f10 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74  he message was t
11f20 72 75 6e 63 61 74 65 64 29 2e 20 49 66 20 6e 6f  runcated). If no
11f30 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  n-zero is return
11f40 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69  ed,.** then it i
11f50 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
11f60 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  to include the n
11f70 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63 68  ul-terminator ch
11f80 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68  aracter.** in th
11f90 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e  e output buffer.
11fa0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 6c  .**.** Not suppl
11fb0 79 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d 65  ying an error me
11fc0 73 73 61 67 65 20 77 69 6c 6c 20 68 61 76 65 20  ssage will have 
11fd0 6e 6f 20 61 64 76 65 72 73 65 20 65 66 66 65 63  no adverse effec
11fe0 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e 20  t.** on SQLite. 
11ff0 49 74 20 69 73 20 66 69 6e 65 20 74 6f 20 68 61  It is fine to ha
12000 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ve an implementa
12010 74 69 6f 6e 20 74 68 61 74 20 6e 65 76 65 72 0a  tion that never.
12020 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  ** returns an er
12030 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a  ror message:.**.
12040 2a 2a 20 20 20 69 6e 74 20 78 47 65 74 4c 61 73  **   int xGetLas
12050 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
12060 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
12070 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
12080 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 7a  .**     assert(z
12090 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a  Buf[0]=='\0');.*
120a0 2a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  *     return 0;.
120b0 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77  **   }.**.** How
120c0 65 76 65 72 20 69 66 20 61 6e 20 65 72 72 6f 72  ever if an error
120d0 20 6d 65 73 73 61 67 65 20 69 73 20 73 75 70 70   message is supp
120e0 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65  lied, it will be
120f0 20 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a 2a   incorporated.**
12100 20 62 79 20 73 71 6c 69 74 65 20 69 6e 74 6f 20   by sqlite into 
12110 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
12120 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  e available to t
12130 68 65 20 75 73 65 72 20 75 73 69 6e 67 0a 2a 2a  he user using.**
12140 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
12150 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b 69  ), possibly maki
12160 6e 67 20 49 4f 20 65 72 72 6f 72 73 20 65 61 73  ng IO errors eas
12170 69 65 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a 2f  ier to debug..*/
12180 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47  .static int winG
12190 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
121a0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
121b0 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
121c0 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  Buf){.  UNUSED_P
121d0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
121e0 20 20 72 65 74 75 72 6e 20 67 65 74 4c 61 73 74    return getLast
121f0 45 72 72 6f 72 4d 73 67 28 6e 42 75 66 2c 20 7a  ErrorMsg(nBuf, z
12200 42 75 66 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  Buf);.}..../*.**
12210 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20   Initialize and 
12220 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  deinitialize the
12230 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
12240 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  m interface..*/.
12250 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69  int sqlite3_os_i
12260 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  nit(void){.  sta
12270 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20  tic sqlite3_vfs 
12280 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20 32  winVfs = {.    2
12290 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
122a0 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
122b0 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69  */.    sizeof(wi
122c0 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73  nFile),     /* s
122d0 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 4d  zOsFile */.    M
122e0 41 58 5f 50 41 54 48 2c 20 20 20 20 20 20 20 20  AX_PATH,        
122f0 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d      /* mxPathnam
12300 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
12310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12320 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77   pNext */.    "w
12330 69 6e 33 32 22 2c 20 20 20 20 20 20 20 20 20 20  in32",          
12340 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20     /* zName */. 
12350 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
12360 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44          /* pAppD
12370 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70  ata */.    winOp
12380 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
12390 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20  /* xOpen */.    
123a0 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20  winDelete,      
123b0 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20       /* xDelete 
123c0 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73  */.    winAccess
123d0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
123e0 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  Access */.    wi
123f0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  nFullPathname,  
12400 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e     /* xFullPathn
12410 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ame */.    winDl
12420 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
12430 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20  /* xDlOpen */.  
12440 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20    winDlError,   
12450 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72         /* xDlErr
12460 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53  or */.    winDlS
12470 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ym,            /
12480 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20  * xDlSym */.    
12490 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20  winDlClose,     
124a0 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65       /* xDlClose
124b0 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f   */.    winRando
124c0 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20  mness,       /* 
124d0 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20  xRandomness */. 
124e0 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20     winSleep,    
124f0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65          /* xSlee
12500 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72  p */.    winCurr
12510 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a  entTime,      /*
12520 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f   xCurrentTime */
12530 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45  .    winGetLastE
12540 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47 65  rror,     /* xGe
12550 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20  tLastError */.  
12560 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
12570 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d         /* xRenam
12580 65 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72  e */.    winCurr
12590 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a  entTimeInt64, /*
125a0 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74   xCurrentTimeInt
125b0 36 34 20 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 73 71  64 */.  };..  sq
125c0 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
125d0 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29 3b 0a  er(&winVfs, 1);.
125e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
125f0 4f 4b 3b 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  OK; .}.int sqlit
12600 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b  e3_os_end(void){
12610 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
12620 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  E_OK;.}..#endif 
12630 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  /* SQLITE_OS_WIN
12640 20 2a 2f 0a                                       */.