/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 48f67798969ba983487fed5691059ade7fff2ef7:


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 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rn SQLITE_IOCAP_
8270: 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
8280: 5f 4f 50 45 4e 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  _OPEN;.}../*****
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 2a 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 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
82e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 53 68 61 72 65 64  ********* Shared
8300: 20 4d 65 6d 6f 72 79 20 2a 2a 2a 2a 2a 2a 2a 2a   Memory ********
8310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8320: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  *****.**.** The 
8330: 6e 65 78 74 20 73 75 62 64 69 76 69 73 69 6f 6e  next subdivision
8340: 20 6f 66 20 63 6f 64 65 20 6d 61 6e 61 67 65 73   of code manages
8350: 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
8360: 72 79 20 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a  ry primitives..*
8370: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
8380: 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a  _OMIT_WAL../*.**
8390: 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
83a0: 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20  s to obtain and 
83b0: 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67  relinquish the g
83c0: 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65  lobal mutex. The
83d0: 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  .** global mutex
83e0: 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74   is used to prot
83f0: 65 63 74 20 74 68 65 20 77 69 6e 4c 6f 63 6b 49  ect the winLockI
8400: 6e 66 6f 20 6f 62 6a 65 63 74 73 20 75 73 65 64  nfo objects used
8410: 20 62 79 20 0a 2a 2a 20 74 68 69 73 20 66 69 6c   by .** this fil
8420: 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20  e, all of which 
8430: 6d 61 79 20 62 65 20 73 68 61 72 65 64 20 62 79  may be shared by
8440: 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
8450: 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f  s..**.** Functio
8460: 6e 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  n winShmMutexHel
8470: 64 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61  d() is used to a
8480: 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65  ssert() that the
8490: 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a   global mutex .*
84a0: 2a 20 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72  * is held when r
84b0: 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 66 75  equired. This fu
84c0: 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  nction is only u
84d0: 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  sed as part of a
84e0: 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74  ssert() .** stat
84f0: 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a  ements. e.g..**.
8500: 2a 2a 20 20 20 77 69 6e 53 68 6d 45 6e 74 65 72  **   winShmEnter
8510: 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61  Mutex().**     a
8520: 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74  ssert( winShmMut
8530: 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20  exHeld() );.**  
8540: 20 77 69 6e 45 6e 74 65 72 4c 65 61 76 65 28 29   winEnterLeave()
8550: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8560: 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
8570: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
8580: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71  3_mutex_enter(sq
8590: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
85a0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
85b0: 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a  TIC_MASTER));.}.
85c0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
85d0: 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69  hmLeaveMutex(voi
85e0: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
85f0: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
8600: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
8610: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
8620: 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64  MASTER));.}.#ifd
8630: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
8640: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
8650: 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29  mMutexHeld(void)
8660: 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   {.  return sqli
8670: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73  te3_mutex_held(s
8680: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
8690: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
86a0: 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
86b0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
86c0: 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65  bject used to re
86d0: 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65  present a single
86e0: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64   file opened and
86f0: 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76   mmapped to prov
8700: 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65  ide.** shared me
8710: 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74  mory.  When mult
8720: 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
8730: 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
8740: 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61  ame.** log-summa
8750: 72 79 2c 20 65 61 63 68 20 74 68 72 65 61 64 20  ry, each thread 
8760: 68 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e 46  has its own winF
8770: 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20  ile object, but 
8780: 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e  they all.** poin
8790: 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e  t to a single in
87a0: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f  stance of this o
87b0: 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72  bject.  In other
87c0: 20 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20   words, each.** 
87d0: 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f  log-summary is o
87e0: 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20  pened only once 
87f0: 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  per process..**.
8800: 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  ** winShmMutexHe
8810: 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
8820: 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
8830: 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
8840: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
8850: 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
8860: 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
8870: 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
8880: 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
8890: 2a 20 20 20 20 20 20 70 4e 65 78 74 20 0a 2a 2a  *      pNext .**
88a0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
88b0: 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  g fields are rea
88c0: 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65  d-only after the
88d0: 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
88e0: 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20  ed:.** .**      
88f0: 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c  fid.**      zFil
8900: 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68  ename.**.** Eith
8910: 65 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75  er winShmNode.mu
8920: 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
8930: 20 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e   or winShmNode.n
8940: 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69  Ref==0 and.** wi
8950: 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
8960: 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61  is true when rea
8970: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
8980: 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a  any other field.
8990: 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ** in this struc
89a0: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  ture..**.** To a
89b0: 76 6f 69 64 20 64 65 61 64 6c 6f 63 6b 73 2c 20  void deadlocks, 
89c0: 6d 75 74 65 78 20 61 6e 64 20 6d 75 74 65 78 42  mutex and mutexB
89d0: 75 66 20 61 72 65 20 61 6c 77 61 79 73 20 72 65  uf are always re
89e0: 6c 65 61 73 65 64 20 69 6e 20 74 68 65 0a 2a 2a  leased in the.**
89f0: 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 74   reverse order t
8a00: 68 61 74 20 74 68 65 79 20 61 72 65 20 61 63 71  hat they are acq
8a10: 75 69 72 65 64 2e 20 20 6d 75 74 65 78 42 75 66  uired.  mutexBuf
8a20: 20 69 73 20 61 6c 77 61 79 73 20 61 63 71 75 69   is always acqui
8a30: 72 65 64 0a 2a 2a 20 66 69 72 73 74 20 61 6e 64  red.** first and
8a40: 20 72 65 6c 65 61 73 65 64 20 6c 61 73 74 2e 20   released last. 
8a50: 20 54 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20   This invariant 
8a60: 69 73 20 63 68 65 63 6b 20 62 79 20 61 73 73 65  is check by asse
8a70: 72 74 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  rting.** sqlite3
8a80: 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 29  _mutex_notheld()
8a90: 20 6f 6e 20 6d 75 74 65 78 20 77 68 65 6e 65 76   on mutex whenev
8aa0: 65 72 20 6d 75 74 65 78 42 75 66 20 69 73 20 61  er mutexBuf is a
8ab0: 63 71 75 69 72 65 64 20 6f 72 0a 2a 2a 20 72 65  cquired or.** re
8ac0: 6c 65 61 73 65 64 2e 0a 2a 2f 0a 73 74 72 75 63  leased..*/.struc
8ad0: 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20  t winShmNode {. 
8ae0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
8af0: 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d  mutex;      /* M
8b00: 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74  utex to access t
8b10: 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  his object */.  
8b20: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
8b30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
8b40: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a  me of the file *
8b50: 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69 6c  /.  winFile hFil
8b60: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
8b70: 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72  * File handle fr
8b80: 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20  om winOpen */.. 
8b90: 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20   int szRegion;  
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8bb0: 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65  ize of shared-me
8bc0: 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  mory regions */.
8bd0: 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20    int nRegion;  
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8bf0: 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70  Size of array ap
8c00: 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75  Region */.  stru
8c10: 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a 20  ct ShmRegion {. 
8c20: 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20     HANDLE hMap; 
8c30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8c40: 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20  ile handle from 
8c50: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
8c60: 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70  g */.    void *p
8c70: 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69 6f  Map;.  } *aRegio
8c80: 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  n;.  DWORD lastE
8c90: 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
8ca0: 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65  /* The Windows e
8cb0: 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61  rrno from the la
8cc0: 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a  st I/O error */.
8cd0: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
8ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8cf0: 20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53 68   Number of winSh
8d00: 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69  m objects pointi
8d10: 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20  ng to this */.  
8d20: 77 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b 20  winShm *pFirst; 
8d30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
8d40: 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73  l winShm objects
8d50: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
8d60: 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  s */.  winShmNod
8d70: 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  e *pNext;       
8d80: 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73    /* Next in lis
8d90: 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e  t of all winShmN
8da0: 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23  ode objects */.#
8db0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
8dc0: 55 47 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49  UG.  u8 nextShmI
8dd0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
8de0: 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c  /* Next availabl
8df0: 65 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75  e winShm.id valu
8e00: 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
8e10: 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61  /*.** A global a
8e20: 72 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53  rray of all winS
8e30: 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a  hmNode objects..
8e40: 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d  **.** The winShm
8e50: 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74  MutexHeld() must
8e60: 20 62 65 20 74 72 75 65 20 77 68 69 6c 65 20 72   be true while r
8e70: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
8e80: 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a  g this list..*/.
8e90: 73 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64  static winShmNod
8ea0: 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73  e *winShmNodeLis
8eb0: 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74  t = 0;../*.** St
8ec0: 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74  ructure used int
8ed0: 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20  ernally by this 
8ee0: 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68  VFS to record th
8ef0: 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a  e state of an.**
8f00: 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d   open shared mem
8f10: 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ory connection..
8f20: 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d 2e 70 46 69  **.** winShm.pFi
8f30: 6c 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62  le->mutex must b
8f40: 65 20 68 65 6c 64 20 77 68 69 6c 65 20 72 65 61  e held while rea
8f50: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
8f60: 74 68 65 0a 2a 2a 20 77 69 6e 53 68 6d 2e 70 4e  the.** winShm.pN
8f70: 65 78 74 20 61 6e 64 20 77 69 6e 53 68 6d 2e 6c  ext and winShm.l
8f80: 6f 63 6b 73 5b 5d 20 65 6c 65 6d 65 6e 74 73 2e  ocks[] elements.
8f90: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68  .**.** The winSh
8fa0: 6d 2e 70 46 69 6c 65 20 65 6c 65 6d 65 6e 74 20  m.pFile element 
8fb0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77  is initialized w
8fc0: 68 65 6e 20 74 68 65 20 6f 62 6a 65 63 74 20 69  hen the object i
8fd0: 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
8fe0: 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68   is read-only th
8ff0: 65 72 65 61 66 74 65 72 2e 0a 2a 2f 0a 73 74 72  ereafter..*/.str
9000: 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20 77  uct winShm {.  w
9010: 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
9020: 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  ode;      /* The
9030: 20 75 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e 53   underlying winS
9040: 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f  hmNode object */
9050: 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78 74  .  winShm *pNext
9060: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
9070: 20 4e 65 78 74 20 77 69 6e 53 68 6d 20 77 69 74   Next winShm wit
9080: 68 20 74 68 65 20 73 61 6d 65 20 77 69 6e 53 68  h the same winSh
9090: 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61  mNode */.  u8 ha
90a0: 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20  sMutex;         
90b0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
90c0: 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 77 69 6e   holding the win
90d0: 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f  ShmNode mutex */
90e0: 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 42 75  .  u8 hasMutexBu
90f0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  f;            /*
9100: 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67   True if holding
9110: 20 70 46 69 6c 65 2d 3e 6d 75 74 65 78 42 75 66   pFile->mutexBuf
9120: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
9130: 45 5f 44 45 42 55 47 0a 20 20 75 38 20 69 64 3b  E_DEBUG.  u8 id;
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9150: 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68       /* Id of th
9160: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  is connection wi
9170: 74 68 20 69 74 73 20 77 69 6e 53 68 6d 4e 6f 64  th its winShmNod
9180: 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
9190: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20  /*.** Constants 
91a0: 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
91b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f  .*/.#define WIN_
91c0: 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b  SHM_BASE   ((22+
91d0: 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
91e0: 29 2a 34 29 20 20 20 20 20 20 20 20 2f 2a 20 66  )*4)        /* f
91f0: 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a  irst lock byte *
9200: 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48  /.#define WIN_SH
9210: 4d 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f 53 48  M_DMS    (WIN_SH
9220: 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48  M_BASE+SQLITE_SH
9230: 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61  M_NLOCK)  /* dea
9240: 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a  dman switch */..
9250: 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76 69  /*.** Apply advi
9260: 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61  sory locks for a
9270: 6c 6c 20 6e 20 62 79 74 65 73 20 62 65 67 69 6e  ll n bytes begin
9280: 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a 2f  ning at ofst..*/
9290: 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 55 4e  .#define _SHM_UN
92a0: 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e 65 20 5f  LCK  1.#define _
92b0: 53 48 4d 5f 52 44 4c 43 4b 20 20 32 0a 23 64 65  SHM_RDLCK  2.#de
92c0: 66 69 6e 65 20 5f 53 48 4d 5f 57 52 4c 43 4b 20  fine _SHM_WRLCK 
92d0: 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69   3.static int wi
92e0: 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a  nShmSystemLock(.
92f0: 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 46    winShmNode *pF
9300: 69 6c 65 2c 20 20 20 20 2f 2a 20 41 70 70 6c 79  ile,    /* Apply
9310: 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f   locks to this o
9320: 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  pen shared-memor
9330: 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69  y segment */.  i
9340: 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20  nt lockType,    
9350: 20 20 20 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c       /* _SHM_UNL
9360: 43 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20  CK, _SHM_RDLCK, 
9370: 6f 72 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f  or _SHM_WRLCK */
9380: 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20  .  int ofst,    
9390: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
93a0: 65 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65  et to first byte
93b0: 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2f 75 6e   to be locked/un
93c0: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20  locked */.  int 
93d0: 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20 20  nByte           
93e0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
93f0: 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f 72 20  ytes to lock or 
9400: 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 4f  unlock */.){.  O
9410: 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a  VERLAPPED ovlp;.
9420: 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 3b    DWORD dwFlags;
9430: 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20  .  int rc = 0;  
9440: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
9450: 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c 6f 63  lt code form Loc
9460: 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 29  k/UnlockFileEx()
9470: 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73   */..  /* Access
9480: 20 74 6f 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f   to the winShmNo
9490: 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72  de object is ser
94a0: 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63  ialized by the c
94b0: 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72  aller */.  asser
94c0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
94d0: 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74  _held(pFile->mut
94e0: 65 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52  ex) || pFile->nR
94f0: 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ef==0 );..  /* I
9500: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f  nitialize the lo
9510: 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73  cking parameters
9520: 20 2a 2f 0a 20 20 64 77 46 6c 61 67 73 20 3d 20   */.  dwFlags = 
9530: 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
9540: 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20 69 66 28  MEDIATELY;.  if(
9550: 20 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48   lockType == _SH
9560: 4d 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c 61 67  M_WRLCK ) dwFlag
9570: 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58  s |= LOCKFILE_EX
9580: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 0a 20  CLUSIVE_LOCK;.. 
9590: 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 66 69 72   /* Find the fir
95a0: 73 74 20 62 69 74 20 69 6e 20 6c 6f 63 6b 4d 61  st bit in lockMa
95b0: 73 6b 20 74 68 61 74 20 69 73 20 73 65 74 20 2a  sk that is set *
95c0: 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70  /.  memset(&ovlp
95d0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52  , 0, sizeof(OVER
95e0: 4c 41 50 50 45 44 29 29 3b 0a 20 20 6f 76 6c 70  LAPPED));.  ovlp
95f0: 2e 4f 66 66 73 65 74 20 3d 20 6f 66 73 74 3b 0a  .Offset = ofst;.
9600: 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63  .  /* Release/Ac
9610: 71 75 69 72 65 20 74 68 65 20 73 79 73 74 65 6d  quire the system
9620: 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20  -level lock */. 
9630: 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f   if( lockType==_
9640: 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  SHM_UNLCK ){.   
9650: 20 72 63 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65   rc = UnlockFile
9660: 45 78 28 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e  Ex(pFile->hFile.
9670: 68 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 2c 20  h, 0, nByte, 0, 
9680: 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  &ovlp);.  }else{
9690: 0a 20 20 20 20 72 63 20 3d 20 4c 6f 63 6b 46 69  .    rc = LockFi
96a0: 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 46 69 6c  leEx(pFile->hFil
96b0: 65 2e 68 2c 20 64 77 46 6c 61 67 73 2c 20 30 2c  e.h, dwFlags, 0,
96c0: 20 6e 42 79 74 65 2c 20 30 2c 20 26 6f 76 6c 70   nByte, 0, &ovlp
96d0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 72 63  );.  }.  if( !rc
96e0: 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
96f0: 28 22 53 48 4d 2d 4c 4f 43 4b 20 25 64 20 25 73  ("SHM-LOCK %d %s
9700: 20 45 52 52 4f 52 20 30 78 25 30 38 6c 78 5c 6e   ERROR 0x%08lx\n
9710: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
9720: 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c   pFile->hFile.h,
9730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f  .             lo
9740: 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c  ckType==_SHM_UNL
9750: 43 4b 20 3f 20 22 55 6e 6c 6f 63 6b 46 69 6c 65  CK ? "UnlockFile
9760: 45 78 22 20 3a 20 22 4c 6f 63 6b 46 69 6c 65 45  Ex" : "LockFileE
9770: 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  x",.            
9780: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29   GetLastError())
9790: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 28 72  );.  }.  rc = (r
97a0: 63 21 3d 30 29 20 3f 20 53 51 4c 49 54 45 5f 4f  c!=0) ? SQLITE_O
97b0: 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  K : SQLITE_BUSY;
97c0: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
97d0: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
97e0: 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 6d  erences to VFS m
97f0: 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63  ethods */.static
9800: 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c   int winOpen(sql
9810: 69 74 65 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20  ite3_vfs*,const 
9820: 63 68 61 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69  char*,sqlite3_fi
9830: 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73  le*,int,int*);.s
9840: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c  tatic int winDel
9850: 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ete(sqlite3_vfs 
9860: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  *,const char*,in
9870: 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65  t);../*.** Purge
9880: 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 4c   the winShmNodeL
9890: 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ist list of all 
98a0: 65 6e 74 72 69 65 73 20 77 69 74 68 20 77 69 6e  entries with win
98b0: 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e  ShmNode.nRef==0.
98c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
98d0: 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d  ot a VFS shared-
98e0: 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69  memory method; i
98f0: 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  t is a utility f
9900: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a  unction called.*
9910: 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d  * by VFS shared-
9920: 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a  memory methods..
9930: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
9940: 69 6e 53 68 6d 50 75 72 67 65 28 73 71 6c 69 74  inShmPurge(sqlit
9950: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
9960: 74 20 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20  t deleteFlag){. 
9970: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70 70   winShmNode **pp
9980: 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  ;.  winShmNode *
9990: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e  p;.  assert( win
99a0: 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29  ShmMutexHeld() )
99b0: 3b 0a 20 20 70 70 20 3d 20 26 77 69 6e 53 68 6d  ;.  pp = &winShm
99c0: 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c  NodeList;.  whil
99d0: 65 28 20 28 70 20 3d 20 2a 70 70 29 21 3d 30 20  e( (p = *pp)!=0 
99e0: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52  ){.    if( p->nR
99f0: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ef==0 ){.      i
9a00: 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20  nt i;.      if( 
9a10: 70 2d 3e 6d 75 74 65 78 20 29 20 73 71 6c 69 74  p->mutex ) sqlit
9a20: 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d  e3_mutex_free(p-
9a30: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 66  >mutex);.      f
9a40: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65  or(i=0; i<p->nRe
9a50: 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  gion; i++){.    
9a60: 20 20 20 20 55 6e 6d 61 70 56 69 65 77 4f 66 46      UnmapViewOfF
9a70: 69 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69  ile(p->aRegion[i
9a80: 5d 2e 70 4d 61 70 29 3b 0a 20 20 20 20 20 20 20  ].pMap);.       
9a90: 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e   CloseHandle(p->
9aa0: 61 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29  aRegion[i].hMap)
9ab0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9ac0: 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68 20 21  if( p->hFile.h !
9ad0: 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  = INVALID_HANDLE
9ae0: 5f 56 41 4c 55 45 20 29 20 7b 0a 20 20 20 20 20  _VALUE ) {.     
9af0: 20 20 20 77 69 6e 43 6c 6f 73 65 28 28 73 71 6c     winClose((sql
9b00: 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 2d 3e  ite3_file *)&p->
9b10: 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  hFile);.      }.
9b20: 20 20 20 20 20 20 69 66 28 20 64 65 6c 65 74 65        if( delete
9b30: 46 6c 61 67 20 29 20 77 69 6e 44 65 6c 65 74 65  Flag ) winDelete
9b40: 28 70 56 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e  (pVfs, p->zFilen
9b50: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 2a  ame, 0);.      *
9b60: 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  pp = p->pNext;. 
9b70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
9b80: 65 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b 0a 20  e(p->aRegion);. 
9b90: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
9ba0: 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e(p);.    }else{
9bb0: 0a 20 20 20 20 20 20 70 70 20 3d 20 26 70 2d 3e  .      pp = &p->
9bc0: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
9bd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
9be0: 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
9bf0: 72 65 61 2e 20 20 54 68 69 73 20 70 61 72 74 69  rea.  This parti
9c00: 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61  cular implementa
9c10: 74 69 6f 6e 20 75 73 65 73 0a 2a 2a 20 6d 6d 61  tion uses.** mma
9c20: 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  pped files..**.*
9c30: 2a 20 7a 4e 61 6d 65 20 69 73 20 61 20 66 69 6c  * zName is a fil
9c40: 65 6e 61 6d 65 20 75 73 65 64 20 74 6f 20 69 64  ename used to id
9c50: 65 6e 74 69 66 79 20 74 68 65 20 73 68 61 72 65  entify the share
9c60: 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 2e 20 20  d-memory area.  
9c70: 54 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  The.** implement
9c80: 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 28  ation does not (
9c90: 61 6e 64 20 70 65 72 68 61 70 73 20 73 68 6f 75  and perhaps shou
9ca0: 6c 64 20 6e 6f 74 29 20 75 73 65 20 74 68 69 73  ld not) use this
9cb0: 20 6e 61 6d 65 0a 2a 2a 20 64 69 72 65 63 74 6c   name.** directl
9cc0: 79 2c 20 62 75 74 20 72 61 74 68 65 72 20 75 73  y, but rather us
9cd0: 65 20 69 74 20 61 73 20 61 20 74 65 6d 70 6c 61  e it as a templa
9ce0: 74 65 20 66 6f 72 20 66 69 6e 64 69 6e 67 20 61  te for finding a
9cf0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  n appropriate.**
9d00: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 73 68   name for the sh
9d10: 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 74 6f 72  ared-memory stor
9d20: 61 67 65 2e 20 20 49 6e 20 74 68 69 73 20 69 6d  age.  In this im
9d30: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68  plementation, th
9d40: 65 0a 2a 2a 20 73 74 72 69 6e 67 20 22 2d 69 6e  e.** string "-in
9d50: 64 65 78 22 20 69 73 20 61 70 70 65 6e 64 65 64  dex" is appended
9d60: 20 74 6f 20 7a 4e 61 6d 65 20 61 6e 64 20 75 73   to zName and us
9d70: 65 64 20 61 73 20 74 68 65 20 6e 61 6d 65 20 6f  ed as the name o
9d80: 66 20 74 68 65 0a 2a 2a 20 6d 6d 61 70 70 65 64  f the.** mmapped
9d90: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65   file..**.** Whe
9da0: 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20  n opening a new 
9db0: 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
9dc0: 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20  le, if no other 
9dd0: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61  instances of tha
9de0: 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75  t.** file are cu
9df0: 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e  rrently open, in
9e00: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
9e10: 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73   in other proces
9e20: 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ses, then.** the
9e30: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72   file must be tr
9e40: 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
9e50: 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69  length or have i
9e60: 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65  ts header cleare
9e70: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
9e80: 20 77 69 6e 53 68 6d 4f 70 65 6e 28 0a 20 20 73   winShmOpen(.  s
9e90: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20  qlite3_file *fd 
9ea0: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
9eb0: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 74 74   to which to att
9ec0: 61 63 68 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ach shared memor
9ed0: 79 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  y */.){.  struct
9ee0: 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 3b   winFile *pDbFd;
9ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9f00: 44 61 74 61 62 61 73 65 20 74 6f 20 77 68 69 63  Database to whic
9f10: 68 20 74 6f 20 61 74 74 61 63 68 20 53 48 4d 20  h to attach SHM 
9f20: 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53  */.  struct winS
9f30: 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  hm *p;          
9f40: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
9f50: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
9f60: 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  opened */.  stru
9f70: 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  ct winShmNode *p
9f80: 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f  ShmNode = 0;   /
9f90: 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
9fa0: 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f   mmapped file */
9fb0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fd0: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
9fe0: 63 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  code */.  struct
9ff0: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65   winShmNode *pNe
a000: 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  w;           /* 
a010: 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  Newly allocated 
a020: 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  winShmNode */.  
a030: 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
a040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a050: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e     /* Size of zN
a060: 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ame in bytes */.
a070: 0a 20 20 70 44 62 46 64 20 3d 20 28 77 69 6e 46  .  pDbFd = (winF
a080: 69 6c 65 2a 29 66 64 3b 0a 20 20 61 73 73 65 72  ile*)fd;.  asser
a090: 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d  t( pDbFd->pShm==
a0a0: 30 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 70  0 );    /* Not p
a0b0: 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64  reviously opened
a0c0: 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
a0d0: 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
a0e0: 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 73 68 6d   new sqlite3_shm
a0f0: 20 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20 73   object.  Also s
a100: 70 65 63 75 6c 61 74 69 76 65 6c 79 0a 20 20 2a  peculatively.  *
a110: 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * allocate space
a120: 20 66 6f 72 20 61 20 6e 65 77 20 77 69 6e 53 68   for a new winSh
a130: 6d 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e 61  mNode and filena
a140: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73  me..  */.  p = s
a150: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
a160: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
a170: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
a180: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
a190: 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
a1a0: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 6e 4e 61  zeof(*p));.  nNa
a1b0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
a1c0: 65 6e 33 30 28 70 44 62 46 64 2d 3e 7a 50 61 74  en30(pDbFd->zPat
a1d0: 68 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  h);.  pNew = sql
a1e0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
a1f0: 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b  eof(*pShmNode) +
a200: 20 6e 4e 61 6d 65 20 2b 20 31 35 20 29 3b 0a 20   nName + 15 );. 
a210: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
a220: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
a230: 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
a240: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
a250: 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c  }.  memset(pNew,
a260: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77   0, sizeof(*pNew
a270: 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 46 69 6c  ));.  pNew->zFil
a280: 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  ename = (char*)&
a290: 70 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69 74  pNew[1];.  sqlit
a2a0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61 6d  e3_snprintf(nNam
a2b0: 65 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c  e+15, pNew->zFil
a2c0: 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c  ename, "%s-shm",
a2d0: 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
a2e0: 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65  .  /* Look to se
a2f0: 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  e if there is an
a300: 20 65 78 69 73 74 69 6e 67 20 77 69 6e 53 68 6d   existing winShm
a310: 4e 6f 64 65 20 74 68 61 74 20 63 61 6e 20 62 65  Node that can be
a320: 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6e   used..  ** If n
a330: 6f 20 6d 61 74 63 68 69 6e 67 20 77 69 6e 53 68  o matching winSh
a340: 6d 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20  mNode currently 
a350: 65 78 69 73 74 73 2c 20 63 72 65 61 74 65 20 61  exists, create a
a360: 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20   new one..  */. 
a370: 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
a380: 78 28 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d 4e  x();.  for(pShmN
a390: 6f 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65  ode = winShmNode
a3a0: 4c 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b 20  List; pShmNode; 
a3b0: 70 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64  pShmNode=pShmNod
a3c0: 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f  e->pNext){.    /
a3d0: 2a 20 54 42 44 20 6e 65 65 64 20 74 6f 20 63 6f  * TBD need to co
a3e0: 6d 65 20 75 70 20 77 69 74 68 20 62 65 74 74 65  me up with bette
a3f0: 72 20 6d 61 74 63 68 20 68 65 72 65 2e 20 20 50  r match here.  P
a400: 65 72 68 61 70 73 0a 20 20 20 20 2a 2a 20 75 73  erhaps.    ** us
a410: 65 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f 44  e FILE_ID_BOTH_D
a420: 49 52 5f 49 4e 46 4f 20 53 74 72 75 63 74 75 72  IR_INFO Structur
a430: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
a440: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
a450: 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65  (pShmNode->zFile
a460: 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c  name, pNew->zFil
a470: 65 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  ename)==0 ) brea
a480: 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68  k;.  }.  if( pSh
a490: 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c  mNode ){.    sql
a4a0: 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
a4b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53  .  }else{.    pS
a4c0: 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a 20  hmNode = pNew;. 
a4d0: 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20     pNew = 0;.   
a4e0: 20 28 28 77 69 6e 46 69 6c 65 2a 29 28 26 70 53   ((winFile*)(&pS
a4f0: 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29 2d  hmNode->hFile))-
a500: 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e  >h = INVALID_HAN
a510: 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20 70  DLE_VALUE;.    p
a520: 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d  ShmNode->pNext =
a530: 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b   winShmNodeList;
a540: 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65 4c  .    winShmNodeL
a550: 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a  ist = pShmNode;.
a560: 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d  .    pShmNode->m
a570: 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  utex = sqlite3_m
a580: 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
a590: 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
a5a0: 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
a5b0: 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
a5c0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
a5d0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
a5e0: 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
a5f0: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 77 69     }.    rc = wi
a600: 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e 70 56 66  nOpen(pDbFd->pVf
a610: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
a620: 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46      pShmNode->zF
a630: 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20  ilename,        
a640: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
a650: 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29  the file (UTF-8)
a660: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
a670: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69       (sqlite3_fi
a680: 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  le*)&pShmNode->h
a690: 46 69 6c 65 2c 20 20 2f 2a 20 46 69 6c 65 20 68  File,  /* File h
a6a0: 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20  andle here */.  
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
a6c0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
a6d0: 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
a6e0: 45 4e 5f 43 52 45 41 54 45 2c 20 2f 2a 20 4d 6f  EN_CREATE, /* Mo
a6f0: 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 20 20  de flags */.    
a700: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b               0);
a710: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
a720: 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20  OK!=rc ){.      
a730: 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
a740: 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OPEN_BKPT;.     
a750: 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
a760: 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rr;.    }..    /
a770: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
a780: 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  f another proces
a790: 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  s is holding the
a7a0: 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68   dead-man switch
a7b0: 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c  ..    ** If not,
a7c0: 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   truncate the fi
a7d0: 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  le to zero lengt
a7e0: 68 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  h. .    */.    i
a7f0: 66 28 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c  f( winShmSystemL
a800: 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
a810: 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f 53 48  HM_WRLCK, WIN_SH
a820: 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54  M_DMS, 1)==SQLIT
a830: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
a840: 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28   = winTruncate((
a850: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
a860: 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c  pShmNode->hFile,
a870: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
a880: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
a890: 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 53 68 6d   ){.      winShm
a8a0: 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
a8b0: 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c  ode, _SHM_UNLCK,
a8c0: 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29   WIN_SHM_DMS, 1)
a8d0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
a8e0: 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
a8f0: 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c  hmNode, _SHM_RDL
a900: 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
a910: 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   1);.    }.    i
a920: 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d  f( rc ) goto shm
a930: 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a  _open_err;.  }..
a940: 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65    /* Make the ne
a950: 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63  w connection a c
a960: 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69 6e 53  hild of the winS
a970: 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70  hmNode */.  p->p
a980: 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f  ShmNode = pShmNo
a990: 64 65 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d  de;.  p->pNext =
a9a0: 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
a9b0: 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  t;.#ifdef SQLITE
a9c0: 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d  _DEBUG.  p->id =
a9d0: 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53   pShmNode->nextS
a9e0: 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  hmId++;.#endif. 
a9f0: 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
aa00: 74 20 3d 20 70 3b 0a 20 20 70 53 68 6d 4e 6f 64  t = p;.  pShmNod
aa10: 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62  e->nRef++;.  pDb
aa20: 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20  Fd->pShm = p;.  
aa30: 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
aa40: 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ();.  return SQL
aa50: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75  ITE_OK;..  /* Ju
aa60: 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65  mp here on any e
aa70: 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e  rror */.shm_open
aa80: 5f 65 72 72 3a 0a 20 20 77 69 6e 53 68 6d 53 79  _err:.  winShmSy
aa90: 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
aaa0: 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57  e, _SHM_UNLCK, W
aab0: 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a  IN_SHM_DMS, 1);.
aac0: 20 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44    winShmPurge(pD
aad0: 62 46 64 2d 3e 70 56 66 73 2c 20 30 29 3b 20 20  bFd->pVfs, 0);  
aae0: 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
aaf0: 20 66 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20   frees pShmNode 
ab00: 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  if required */. 
ab10: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
ab20: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
ab30: 28 70 4e 65 77 29 3b 0a 20 20 77 69 6e 53 68 6d  (pNew);.  winShm
ab40: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
ab50: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
ab60: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e  .** Close a conn
ab70: 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64  ection to shared
ab80: 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65  -memory.  Delete
ab90: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
aba0: 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64  .** storage if d
abb0: 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72 75  eleteFlag is tru
abc0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
abd0: 20 77 69 6e 53 68 6d 43 6c 6f 73 65 28 0a 20 20   winShmClose(.  
abe0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
abf0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ,          /* Da
ac00: 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 73  tabase holding s
ac10: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
ac20: 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67    int deleteFlag
ac30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ac40: 44 65 6c 65 74 65 20 61 66 74 65 72 20 63 6c 6f  Delete after clo
ac50: 73 69 6e 67 20 69 66 20 74 72 75 65 20 2a 2f 0a  sing if true */.
ac60: 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44  ){.  winFile *pD
ac70: 62 46 64 3b 20 20 20 20 20 20 20 2f 2a 20 44 61  bFd;       /* Da
ac80: 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 73  tabase holding s
ac90: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a  hared-memory */.
aca0: 20 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20    winShm *p;    
acb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
acc0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
acd0: 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 77 69 6e 53  closed */.  winS
ace0: 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
acf0: 3b 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79  ; /* The underly
ad00: 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ing shared-memor
ad10: 79 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 53  y file */.  winS
ad20: 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20  hm **pp;        
ad30: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
ad40: 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f   over sibling co
ad50: 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  nnections */..  
ad60: 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65  pDbFd = (winFile
ad70: 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46  *)fd;.  p = pDbF
ad80: 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e  d->pShm;.  pShmN
ad90: 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
ada0: 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20  e;..  /* Remove 
adb0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f  connection p fro
adc0: 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e  m the set of con
add0: 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61  nections associa
ade0: 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53  ted.  ** with pS
adf0: 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  hmNode */.  sqli
ae00: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
ae10: 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
ae20: 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d  ;.  for(pp=&pShm
ae30: 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a  Node->pFirst; (*
ae40: 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a  pp)!=p; pp = &(*
ae50: 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  pp)->pNext){}.  
ae60: 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  *pp = p->pNext;.
ae70: 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63  .  /* Free the c
ae80: 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20  onnection p */. 
ae90: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
aea0: 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20  ;.  pDbFd->pShm 
aeb0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
aec0: 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
aed0: 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20  ode->mutex);..  
aee0: 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e  /* If pShmNode->
aef0: 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65 64  nRef has reached
af00: 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74   0, then close t
af10: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20  he underlying.  
af20: 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
af30: 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20   file, too */.  
af40: 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
af50: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ();.  assert( pS
af60: 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29  hmNode->nRef>0 )
af70: 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ;.  pShmNode->nR
af80: 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d  ef--;.  if( pShm
af90: 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  Node->nRef==0 ){
afa0: 0a 20 20 20 20 77 69 6e 53 68 6d 50 75 72 67 65  .    winShmPurge
afb0: 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 64 65  (pDbFd->pVfs, de
afc0: 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20 7d 0a 20  leteFlag);.  }. 
afd0: 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
afe0: 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  x();..  return S
aff0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
b000: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
b010: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
b020: 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
b030: 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e  o region iRegion
b040: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72   of the .** shar
b050: 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ed-memory associ
b060: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64 61  ated with the da
b070: 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20  tabase file fd. 
b080: 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  Shared-memory re
b090: 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75  gions .** are nu
b0a0: 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20  mbered starting 
b0b0: 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20  from zero. Each 
b0c0: 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
b0d0: 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e  gion is szRegion
b0e0: 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69   .** bytes in si
b0f0: 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ze..**.** If an 
b100: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
b110: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
b120: 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20  eturned and *pp 
b130: 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
b140: 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
b150: 20 69 66 20 74 68 65 20 69 73 57 72 69 74 65 20   if the isWrite 
b160: 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 61  parameter is 0 a
b170: 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
b180: 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a   shared-memory.*
b190: 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  * region has not
b1a0: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
b1b0: 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20  (by any client, 
b1c0: 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75  including one ru
b1d0: 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65  nning in a.** se
b1e0: 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c  parate process),
b1f0: 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74   then *pp is set
b200: 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c   to NULL and SQL
b210: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
b220: 20 49 66 20 0a 2a 2a 20 69 73 57 72 69 74 65 20   If .** isWrite 
b230: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20  is non-zero and 
b240: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68  the requested sh
b250: 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
b260: 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a  on has not yet .
b270: 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ** been allocate
b280: 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74  d, it is allocat
b290: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
b2a0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ion..**.** If th
b2b0: 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
b2c0: 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  region has alrea
b2d0: 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
b2e0: 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  d or is allocate
b2f0: 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c  d by.** this cal
b300: 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  l as described a
b310: 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73  bove, then it is
b320: 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69   mapped into thi
b330: 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20  s processes .** 
b340: 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28 69  address space (i
b350: 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
b360: 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74  ady), *pp is set
b370: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
b380: 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f   mapped .** memo
b390: 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ry and SQLITE_OK
b3a0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
b3b0: 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d  atic int winShmM
b3c0: 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
b3d0: 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
b3e0: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
b3f0: 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65  open on database
b400: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69   file */.  int i
b410: 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20  Region,         
b420: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
b430: 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65  gion to retrieve
b440: 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69   */.  int szRegi
b450: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
b460: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
b470: 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   regions */.  in
b480: 74 20 69 73 57 72 69 74 65 2c 20 20 20 20 20 20  t isWrite,      
b490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b4a0: 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20   True to extend 
b4b0: 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72  file if necessar
b4c0: 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61  y */.  void vola
b4d0: 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20  tile **pp       
b4e0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d         /* OUT: M
b4f0: 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  apped memory */.
b500: 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44  ){.  winFile *pD
b510: 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  bFd = (winFile*)
b520: 66 64 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20  fd;.  winShm *p 
b530: 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
b540: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
b550: 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
b560: 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ode;.  int rc = 
b570: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71  SQLITE_OK;..  sq
b580: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
b590: 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
b5a0: 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a  x);.  assert( sz
b5b0: 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65  Region==pShmNode
b5c0: 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53  ->szRegion || pS
b5d0: 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d  hmNode->nRegion=
b5e0: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68  =0 );..  if( pSh
b5f0: 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d  mNode->nRegion<=
b600: 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73  iRegion ){.    s
b610: 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20  truct ShmRegion 
b620: 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20  *apNew;         
b630: 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e    /* New aRegion
b640: 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  [] array */.    
b650: 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65  int nByte = (iRe
b660: 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e  gion+1)*szRegion
b670: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65  ;  /* Minimum re
b680: 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65  quired file size
b690: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
b6a0: 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20 20  int64 sz;       
b6b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
b6c0: 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77 61  rrent size of wa
b6d0: 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a  l-index file */.
b6e0: 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73  .    pShmNode->s
b6f0: 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69  zRegion = szRegi
b700: 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  on;..    /* The 
b710: 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
b720: 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69   is not mapped i
b730: 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
b740: 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
b750: 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74  ..    ** Check t
b760: 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20  o see if it has 
b770: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28  been allocated (
b780: 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d  i.e. if the wal-
b790: 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20  index file is.  
b7a0: 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67    ** large enoug
b7b0: 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  h to contain the
b7c0: 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
b7d0: 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  n)..    */.    r
b7e0: 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28  c = winFileSize(
b7f0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
b800: 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
b810: 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28 20  , &sz);.    if( 
b820: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
b830: 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70  .      goto shmp
b840: 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a  age_out;.    }..
b850: 20 20 20 20 69 66 28 20 73 7a 3c 6e 42 79 74 65      if( sz<nByte
b860: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
b870: 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
b880: 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f  y region does no
b890: 74 20 65 78 69 73 74 2e 20 49 66 20 69 73 57 72  t exist. If isWr
b8a0: 69 74 65 20 69 73 20 73 65 74 20 74 6f 0a 20 20  ite is set to.  
b8b0: 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65 78 69      ** zero, exi
b8c0: 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c  t early. *pp wil
b8d0: 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c  l be set to NULL
b8e0: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
b8f0: 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 2a  eturned..      *
b900: 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72  *.      ** Alter
b910: 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 69 73 57  natively, if isW
b920: 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  rite is non-zero
b930: 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74 65 28  , use ftruncate(
b940: 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20  ) to allocate.  
b950: 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65      ** the reque
b960: 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
b970: 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
b980: 20 20 20 69 66 28 20 21 69 73 57 72 69 74 65 20     if( !isWrite 
b990: 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f  ) goto shmpage_o
b9a0: 75 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ut;.      rc = w
b9b0: 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c 69  inTruncate((sqli
b9c0: 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d  te3_file *)&pShm
b9d0: 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e 42 79  Node->hFile, nBy
b9e0: 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  te);.      if( r
b9f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
ba00: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
ba10: 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
ba20: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
ba30: 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 74 65  Map the requeste
ba40: 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d memory region 
ba50: 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
ba60: 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
ba70: 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20  e. */.    apNew 
ba80: 3d 20 28 73 74 72 75 63 74 20 53 68 6d 52 65 67  = (struct ShmReg
ba90: 69 6f 6e 20 2a 29 73 71 6c 69 74 65 33 5f 72 65  ion *)sqlite3_re
baa0: 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70  alloc(.        p
bab0: 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
bac0: 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69  , (iRegion+1)*si
bad0: 7a 65 6f 66 28 61 70 4e 65 77 5b 30 5d 29 0a 20  zeof(apNew[0]). 
bae0: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61     );.    if( !a
baf0: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63  pNew ){.      rc
bb00: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
bb10: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
bb20: 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
bb30: 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64     }.    pShmNod
bb40: 65 2d 3e 61 52 65 67 69 6f 6e 20 3d 20 61 70 4e  e->aRegion = apN
bb50: 65 77 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  ew;..    while( 
bb60: 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
bb70: 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20  n<=iRegion ){.  
bb80: 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b      HANDLE hMap;
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bba0: 2f 2a 20 66 69 6c 65 2d 6d 61 70 70 69 6e 67 20  /* file-mapping 
bbb0: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20  handle */.      
bbc0: 76 6f 69 64 20 2a 70 4d 61 70 20 3d 20 30 3b 20  void *pMap = 0; 
bbd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
bbe0: 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  apped memory reg
bbf0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 0a 20 20 20  ion */.     .   
bc00: 20 20 20 68 4d 61 70 20 3d 20 43 72 65 61 74 65     hMap = Create
bc10: 46 69 6c 65 4d 61 70 70 69 6e 67 28 70 53 68 6d  FileMapping(pShm
bc20: 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 0a  Node->hFile.h, .
bc30: 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20            NULL, 
bc40: 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20  PAGE_READWRITE, 
bc50: 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20  0, nByte, NULL. 
bc60: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
bc70: 28 20 68 4d 61 70 20 29 7b 0a 20 20 20 20 20 20  ( hMap ){.      
bc80: 20 20 70 4d 61 70 20 3d 20 4d 61 70 56 69 65 77    pMap = MapView
bc90: 4f 66 46 69 6c 65 28 68 4d 61 70 2c 20 46 49 4c  OfFile(hMap, FIL
bca0: 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49  E_MAP_WRITE | FI
bcb0: 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20  LE_MAP_READ,.   
bcc0: 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 6e           0, 0, n
bcd0: 42 79 74 65 0a 20 20 20 20 20 20 20 20 29 3b 0a  Byte.        );.
bce0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
bcf0: 28 20 21 70 4d 61 70 20 29 7b 0a 20 20 20 20 20  ( !pMap ){.     
bd00: 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73     pShmNode->las
bd10: 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74  tErrno = GetLast
bd20: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20  Error();.       
bd30: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
bd40: 52 52 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  RR;.        if( 
bd50: 68 4d 61 70 20 29 20 43 6c 6f 73 65 48 61 6e 64  hMap ) CloseHand
bd60: 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20 20 20 20  le(hMap);.      
bd70: 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
bd80: 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ut;.      }..   
bd90: 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65     pShmNode->aRe
bda0: 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e  gion[pShmNode->n
bdb0: 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70  Region].pMap = p
bdc0: 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  Map;.      pShmN
bdd0: 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68  ode->aRegion[pSh
bde0: 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e  mNode->nRegion].
bdf0: 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20 20  hMap = hMap;.   
be00: 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65     pShmNode->nRe
be10: 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  gion++;.    }.  
be20: 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a  }..shmpage_out:.
be30: 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
be40: 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20  nRegion>iRegion 
be50: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d  ){.    char *p =
be60: 20 28 63 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64   (char *)pShmNod
be70: 65 2d 3e 61 52 65 67 69 6f 6e 5b 69 52 65 67 69  e->aRegion[iRegi
be80: 6f 6e 5d 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70  on].pMap;.    *p
be90: 70 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 69  p = (void *)&p[i
bea0: 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 5d  Region*szRegion]
beb0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
bec0: 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  pp = 0;.  }.  sq
bed0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
bee0: 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
bef0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
bf00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
bf10: 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
bf20: 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d  for a shared-mem
bf30: 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a  ory segment..*/.
bf40: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
bf50: 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33  mLock(.  sqlite3
bf60: 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
bf70: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
bf80: 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  file holding the
bf90: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
bfa0: 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
bfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bfc0: 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20  * First lock to 
bfd0: 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61  acquire or relea
bfe0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20  se */.  int n,  
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c000: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c010: 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65  locks to acquire
c020: 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   or release */. 
c030: 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
c040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
c050: 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
c060: 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20  he lock */.){.  
c070: 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d  winFile *pDbFd =
c080: 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20   (winFile*)fd;. 
c090: 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62   winShm *p = pDb
c0a0: 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77 69 6e 53  Fd->pShm;.  winS
c0b0: 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
c0c0: 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a   = p->pShmNode;.
c0d0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c0e0: 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 0a 20 20 61  E_PROTOCOL;..  a
c0f0: 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26  ssert( ofst>=0 &
c100: 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45  & ofst+n<=SQLITE
c110: 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20  _SHM_NLOCK );.  
c120: 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a  assert( n>=1 );.
c130: 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
c140: 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43  =(SQLITE_SHM_LOC
c150: 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  K | SQLITE_SHM_S
c160: 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c  HARED).       ||
c170: 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
c180: 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
c190: 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
c1a0: 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
c1b0: 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
c1c0: 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
c1d0: 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
c1e0: 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
c1f0: 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20  TE_SHM_UNLOCK | 
c200: 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
c210: 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72  SIVE) );.  asser
c220: 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67  t( n==1 || (flag
c230: 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  s & SQLITE_SHM_E
c240: 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a  XCLUSIVE)!=0 );.
c250: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
c260: 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
c270: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66  >mutex);.  if( f
c280: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
c290: 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  M_UNLOCK ){.    
c2a0: 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
c2b0: 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
c2c0: 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74  _SHM_UNLCK, ofst
c2d0: 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  +WIN_SHM_BASE, n
c2e0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  );.  }else if( f
c2f0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
c300: 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20  M_SHARED ){.    
c310: 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
c320: 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
c330: 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73 74  _SHM_RDLCK, ofst
c340: 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  +WIN_SHM_BASE, n
c350: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
c360: 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
c370: 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
c380: 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74  _SHM_WRLCK, ofst
c390: 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  +WIN_SHM_BASE, n
c3a0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
c3b0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
c3c0: 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
c3d0: 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
c3e0: 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69  OCK shmid-%d, pi
c3f0: 64 2d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  d-%d %s\n",.    
c400: 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 28 69         p->id, (i
c410: 6e 74 29 47 65 74 43 75 72 72 65 6e 74 50 72 6f  nt)GetCurrentPro
c420: 63 65 73 73 49 64 28 29 2c 20 72 63 20 3f 20 22  cessId(), rc ? "
c430: 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29  failed" : "ok"))
c440: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
c450: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
c460: 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69  t a memory barri
c470: 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e  er or memory fen
c480: 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d  ce on shared mem
c490: 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c  ory.  .**.** All
c4a0: 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65   loads and store
c4b0: 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74  s begun before t
c4c0: 68 65 20 62 61 72 72 69 65 72 20 6d 75 73 74 20  he barrier must 
c4d0: 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a  complete before.
c4e0: 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73  ** any load or s
c4f0: 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65 72  tore begun after
c500: 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f   the barrier..*/
c510: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
c520: 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71  ShmBarrier(.  sq
c530: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20  lite3_file *fd  
c540: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
c550: 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ase holding the 
c560: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
c570: 0a 29 7b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42  .){.  /* MemoryB
c580: 61 72 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65  arrier(); // doe
c590: 73 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f  s not work -- do
c5a0: 20 6e 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f   not know why no
c5b0: 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74  t */.  winShmEnt
c5c0: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 77 69 6e  erMutex();.  win
c5d0: 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
c5e0: 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  .}..#else.# defi
c5f0: 6e 65 20 77 69 6e 53 68 6d 4f 70 65 6e 20 20 20  ne winShmOpen   
c600: 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53   0.# define winS
c610: 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65  hmMap     0.# de
c620: 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20  fine winShmLock 
c630: 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69     0.# define wi
c640: 6e 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20  nShmBarrier 0.# 
c650: 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 43 6c 6f  define winShmClo
c660: 73 65 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a  se   0.#endif /*
c670: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
c680: 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 2f 2a 0a 2a  OMIT_WAL */./*.*
c690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c6a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
c6b0: 20 53 68 61 72 65 64 20 4d 65 6d 6f 72 79 20 2a   Shared Memory *
c6c0: 2a 2a 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 0a 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 2a 2a  ****************
c710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
c730: 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65  * This vector de
c740: 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65  fines all the me
c750: 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f  thods that can o
c760: 70 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20  perate on an.** 
c770: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f 72  sqlite3_file for
c780: 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69   win32..*/.stati
c790: 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
c7a0: 69 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f  io_methods winIo
c7b0: 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 32 2c 20  Method = {.  2, 
c7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7d0: 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
c7e0: 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65  on */.  winClose
c7f0: 2c 0a 20 20 77 69 6e 52 65 61 64 2c 0a 20 20 77  ,.  winRead,.  w
c800: 69 6e 57 72 69 74 65 2c 0a 20 20 77 69 6e 54 72  inWrite,.  winTr
c810: 75 6e 63 61 74 65 2c 0a 20 20 77 69 6e 53 79 6e  uncate,.  winSyn
c820: 63 2c 0a 20 20 77 69 6e 46 69 6c 65 53 69 7a 65  c,.  winFileSize
c830: 2c 0a 20 20 77 69 6e 4c 6f 63 6b 2c 0a 20 20 77  ,.  winLock,.  w
c840: 69 6e 55 6e 6c 6f 63 6b 2c 0a 20 20 77 69 6e 43  inUnlock,.  winC
c850: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
c860: 2c 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72  ,.  winFileContr
c870: 6f 6c 2c 0a 20 20 77 69 6e 53 65 63 74 6f 72 53  ol,.  winSectorS
c880: 69 7a 65 2c 0a 20 20 77 69 6e 44 65 76 69 63 65  ize,.  winDevice
c890: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2c  Characteristics,
c8a0: 0a 20 20 77 69 6e 53 68 6d 4f 70 65 6e 2c 20 20  .  winShmOpen,  
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
c8c0: 53 68 6d 4f 70 65 6e 20 2a 2f 0a 20 20 77 69 6e  ShmOpen */.  win
c8d0: 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ShmLock,        
c8e0: 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63        /* xShmLoc
c8f0: 6b 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70  k */.  winShmMap
c900: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c910: 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20  /* xShmMap */.  
c920: 77 69 6e 53 68 6d 42 61 72 72 69 65 72 2c 20 20  winShmBarrier,  
c930: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
c940: 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e  Barrier */.  win
c950: 53 68 6d 43 6c 6f 73 65 20 20 20 20 20 20 20 20  ShmClose        
c960: 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 43 6c 6f        /* xShmClo
c970: 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a  se */.};../*****
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 2a 2a 2a 2a 2a  ****************
c9b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c9c0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 48 65 72 65 20 65  ******.** Here e
c9d0: 6e 64 73 20 74 68 65 20 49 2f 4f 20 6d 65 74 68  nds the I/O meth
c9e0: 6f 64 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68  ods that form th
c9f0: 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
ca00: 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  hods object..**.
ca10: 2a 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63  ** The next bloc
ca20: 6b 20 6f 66 20 63 6f 64 65 20 69 6d 70 6c 65 6d  k of code implem
ca30: 65 6e 74 73 20 74 68 65 20 56 46 53 20 6d 65 74  ents the VFS met
ca40: 68 6f 64 73 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods..**********
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 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ca80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ca90: 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  **/../*.** Conve
caa0: 72 74 20 61 20 55 54 46 2d 38 20 66 69 6c 65 6e  rt a UTF-8 filen
cab0: 61 6d 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65  ame into whateve
cac0: 72 20 66 6f 72 6d 20 74 68 65 20 75 6e 64 65 72  r form the under
cad0: 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69  lying.** operati
cae0: 6e 67 20 73 79 73 74 65 6d 20 77 61 6e 74 73 20  ng system wants 
caf0: 66 69 6c 65 6e 61 6d 65 73 20 69 6e 2e 20 20 53  filenames in.  S
cb00: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
cb10: 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6f 62   result.** is ob
cb20: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
cb30: 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  oc and must be f
cb40: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
cb50: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  ing.** function.
cb60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
cb70: 2a 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65  *convertUtf8File
cb80: 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20  name(const char 
cb90: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76  *zFilename){.  v
cba0: 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20  oid *zConverted 
cbb0: 3d 20 30 3b 0a 20 20 69 66 28 20 69 73 4e 54 28  = 0;.  if( isNT(
cbc0: 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72  ) ){.    zConver
cbd0: 74 65 64 20 3d 20 75 74 66 38 54 6f 55 6e 69 63  ted = utf8ToUnic
cbe0: 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
cbf0: 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69  /* isNT() is 1 i
cc00: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
cc10: 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c  E==1, so this el
cc20: 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63  se is never exec
cc30: 75 74 65 64 2e 20 0a 2a 2f 0a 23 69 66 20 53 51  uted. .*/.#if SQ
cc40: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30  LITE_OS_WINCE==0
cc50: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 43  .  }else{.    zC
cc60: 6f 6e 76 65 72 74 65 64 20 3d 20 75 74 66 38 54  onverted = utf8T
cc70: 6f 4d 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65 29  oMbcs(zFilename)
cc80: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 2f  ;.#endif.  }.  /
cc90: 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61  * caller will ha
cca0: 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f  ndle out of memo
ccb0: 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a  ry */.  return z
ccc0: 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a  Converted;.}../*
ccd0: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d  .** Create a tem
cce0: 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
ccf0: 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20   in zBuf.  zBuf 
cd00: 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75  must be big enou
cd10: 67 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74  gh to.** hold at
cd20: 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
cd30: 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f  e characters..*/
cd40: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 54  .static int getT
cd50: 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66  empname(int nBuf
cd60: 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
cd70: 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 43 68   static char zCh
cd80: 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63  ars[] =.    "abc
cd90: 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
cda0: 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42  tuvwxyz".    "AB
cdb0: 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
cdc0: 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30  STUVWXYZ".    "0
cdd0: 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69  123456789";.  si
cde0: 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61  ze_t i, j;.  cha
cdf0: 72 20 7a 54 65 6d 70 50 61 74 68 5b 4d 41 58 5f  r zTempPath[MAX_
ce00: 50 41 54 48 2b 31 5d 3b 0a 20 20 69 66 28 20 73  PATH+1];.  if( s
ce10: 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
ce20: 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73 71 6c  ctory ){.    sql
ce30: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
ce40: 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70  X_PATH-30, zTemp
ce50: 50 61 74 68 2c 20 22 25 73 22 2c 20 73 71 6c 69  Path, "%s", sqli
ce60: 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
ce70: 72 79 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ry);.  }else if(
ce80: 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 63   isNT() ){.    c
ce90: 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20  har *zMulti;.   
cea0: 20 57 43 48 41 52 20 7a 57 69 64 65 50 61 74 68   WCHAR zWidePath
ceb0: 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20  [MAX_PATH];.    
cec0: 47 65 74 54 65 6d 70 50 61 74 68 57 28 4d 41 58  GetTempPathW(MAX
ced0: 5f 50 41 54 48 2d 33 30 2c 20 7a 57 69 64 65 50  _PATH-30, zWideP
cee0: 61 74 68 29 3b 0a 20 20 20 20 7a 4d 75 6c 74 69  ath);.    zMulti
cef0: 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38   = unicodeToUtf8
cf00: 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20  (zWidePath);.   
cf10: 20 69 66 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20   if( zMulti ){. 
cf20: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
cf30: 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33  rintf(MAX_PATH-3
cf40: 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25  0, zTempPath, "%
cf50: 73 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20  s", zMulti);.   
cf60: 20 20 20 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b     free(zMulti);
cf70: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
cf80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cf90: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 2f 2a 20  NOMEM;.    }./* 
cfa0: 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53  isNT() is 1 if S
cfb0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
cfc0: 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20  1, so this else 
cfd0: 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  is never execute
cfe0: 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65  d. .** Since the
cff0: 20 41 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f   ASCII version o
d000: 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20  f these Windows 
d010: 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  API do not exist
d020: 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69   for WINCE,.** i
d030: 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f  t's important to
d040: 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74   not reference t
d050: 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75  hem for WINCE bu
d060: 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  ilds..*/.#if SQL
d070: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a  ITE_OS_WINCE==0.
d080: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
d090: 72 20 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63 68  r *zUtf8;.    ch
d0a0: 61 72 20 7a 4d 62 63 73 50 61 74 68 5b 4d 41 58  ar zMbcsPath[MAX
d0b0: 5f 50 41 54 48 5d 3b 0a 20 20 20 20 47 65 74 54  _PATH];.    GetT
d0c0: 65 6d 70 50 61 74 68 41 28 4d 41 58 5f 50 41 54  empPathA(MAX_PAT
d0d0: 48 2d 33 30 2c 20 7a 4d 62 63 73 50 61 74 68 29  H-30, zMbcsPath)
d0e0: 3b 0a 20 20 20 20 7a 55 74 66 38 20 3d 20 73 71  ;.    zUtf8 = sq
d0f0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
d100: 5f 74 6f 5f 75 74 66 38 28 7a 4d 62 63 73 50 61  _to_utf8(zMbcsPa
d110: 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 55 74  th);.    if( zUt
d120: 66 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  f8 ){.      sqli
d130: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58  te3_snprintf(MAX
d140: 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50  _PATH-30, zTempP
d150: 61 74 68 2c 20 22 25 73 22 2c 20 7a 55 74 66 38  ath, "%s", zUtf8
d160: 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 55  );.      free(zU
d170: 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tf8);.    }else{
d180: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
d190: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
d1a0: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 66  }.#endif.  }.  f
d1b0: 6f 72 28 69 3d 73 71 6c 69 74 65 33 53 74 72 6c  or(i=sqlite3Strl
d1c0: 65 6e 33 30 28 7a 54 65 6d 70 50 61 74 68 29 3b  en30(zTempPath);
d1d0: 20 69 3e 30 20 26 26 20 7a 54 65 6d 70 50 61 74   i>0 && zTempPat
d1e0: 68 5b 69 2d 31 5d 3d 3d 27 5c 5c 27 3b 20 69 2d  h[i-1]=='\\'; i-
d1f0: 2d 29 7b 7d 0a 20 20 7a 54 65 6d 70 50 61 74 68  -){}.  zTempPath
d200: 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  [i] = 0;.  sqlit
d210: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
d220: 2d 33 30 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20  -30, zBuf,.     
d230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25                "%
d240: 73 5c 5c 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f  s\\"SQLITE_TEMP_
d250: 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 54 65  FILE_PREFIX, zTe
d260: 6d 70 50 61 74 68 29 3b 0a 20 20 6a 20 3d 20 73  mpPath);.  j = s
d270: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
d280: 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Buf);.  sqlite3_
d290: 72 61 6e 64 6f 6d 6e 65 73 73 28 32 30 2c 20 26  randomness(20, &
d2a0: 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28  zBuf[j]);.  for(
d2b0: 69 3d 30 3b 20 69 3c 32 30 3b 20 69 2b 2b 2c 20  i=0; i<20; i++, 
d2c0: 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a  j++){.    zBuf[j
d2d0: 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73  ] = (char)zChars
d2e0: 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  [ ((unsigned cha
d2f0: 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65  r)zBuf[j])%(size
d300: 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b  of(zChars)-1) ];
d310: 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d  .  }.  zBuf[j] =
d320: 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   0;.  OSTRACE(("
d330: 54 45 4d 50 20 46 49 4c 45 4e 41 4d 45 3a 20 25  TEMP FILENAME: %
d340: 73 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20 20  s\n", zBuf));.  
d350: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d360: 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ; .}../*.** The 
d370: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
d380: 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a  getLastErrorMsg.
d390: 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  ** is zero if th
d3a0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
d3b0: 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66  fits in the buff
d3c0: 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a  er, or non-zero.
d3d0: 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66  ** otherwise (if
d3e0: 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73   the message was
d3f0: 20 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a   truncated)..*/.
d400: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4c 61  static int getLa
d410: 73 74 45 72 72 6f 72 4d 73 67 28 69 6e 74 20 6e  stErrorMsg(int n
d420: 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
d430: 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73  {.  /* FormatMes
d440: 73 61 67 65 20 72 65 74 75 72 6e 73 20 30 20 6f  sage returns 0 o
d450: 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68 65  n failure.  Othe
d460: 72 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72 65  rwise it.  ** re
d470: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
d480: 20 6f 66 20 54 43 48 41 52 73 20 77 72 69 74 74   of TCHARs writt
d490: 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  en to the output
d4a0: 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65 78  .  ** buffer, ex
d4b0: 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72 6d  cluding the term
d4c0: 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61  inating null cha
d4d0: 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44 20  r..  */.  DWORD 
d4e0: 65 72 72 6f 72 20 3d 20 47 65 74 4c 61 73 74 45  error = GetLastE
d4f0: 72 72 6f 72 28 29 3b 0a 20 20 44 57 4f 52 44 20  rror();.  DWORD 
d500: 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61  dwLen = 0;.  cha
d510: 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20 20  r *zOut = 0;..  
d520: 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
d530: 20 20 57 43 48 41 52 20 2a 7a 54 65 6d 70 57 69    WCHAR *zTempWi
d540: 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64  de = NULL;.    d
d550: 77 4c 65 6e 20 3d 20 46 6f 72 6d 61 74 4d 65 73  wLen = FormatMes
d560: 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53  sageW(FORMAT_MES
d570: 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55  SAGE_ALLOCATE_BU
d580: 46 46 45 52 20 7c 20 46 4f 52 4d 41 54 5f 4d 45  FFER | FORMAT_ME
d590: 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45  SSAGE_FROM_SYSTE
d5a0: 4d 20 7c 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41  M | FORMAT_MESSA
d5b0: 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54  GE_IGNORE_INSERT
d5c0: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
d5e0: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
d600: 72 72 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20  rror,.          
d610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d620: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
d630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
d640: 4c 50 57 53 54 52 29 20 26 7a 54 65 6d 70 57 69  LPWSTR) &zTempWi
d650: 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  de,.            
d660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
d670: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d680: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b               0);
d690: 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e  .    if( dwLen >
d6a0: 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61   0 ){.      /* a
d6b0: 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65 72  llocate a buffer
d6c0: 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20   and convert to 
d6d0: 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 7a 4f  UTF8 */.      zO
d6e0: 75 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74  ut = unicodeToUt
d6f0: 66 38 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20  f8(zTempWide);. 
d700: 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65       /* free the
d710: 20 73 79 73 74 65 6d 20 62 75 66 66 65 72 20 61   system buffer a
d720: 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d  llocated by Form
d730: 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20  atMessage */.   
d740: 20 20 20 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65     LocalFree(zTe
d750: 6d 70 57 69 64 65 29 3b 0a 20 20 20 20 7d 0a 2f  mpWide);.    }./
d760: 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66  * isNT() is 1 if
d770: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
d780: 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73  ==1, so this els
d790: 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75  e is never execu
d7a0: 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74  ted. .** Since t
d7b0: 68 65 20 41 53 43 49 49 20 76 65 72 73 69 6f 6e  he ASCII version
d7c0: 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77   of these Window
d7d0: 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69  s API do not exi
d7e0: 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a  st for WINCE,.**
d7f0: 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20   it's important 
d800: 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65  to not reference
d810: 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20   them for WINCE 
d820: 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53  builds..*/.#if S
d830: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
d840: 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  0.  }else{.    c
d850: 68 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c  har *zTemp = NUL
d860: 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 46  L;.    dwLen = F
d870: 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 28 46 4f  ormatMessageA(FO
d880: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c  RMAT_MESSAGE_ALL
d890: 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 20 46  OCATE_BUFFER | F
d8a0: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52  ORMAT_MESSAGE_FR
d8b0: 4f 4d 5f 53 59 53 54 45 4d 20 7c 20 46 4f 52 4d  OM_SYSTEM | FORM
d8c0: 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52  AT_MESSAGE_IGNOR
d8d0: 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20  E_INSERTS,.     
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8f0: 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20        NULL,.    
d900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d910: 20 20 20 20 20 20 20 65 72 72 6f 72 2c 0a 20 20         error,.  
d920: 20 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 30 2c 0a 20 20 20 20           0,.    
d940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d950: 20 20 20 20 20 20 20 28 4c 50 53 54 52 29 20 26         (LPSTR) &
d960: 7a 54 65 6d 70 2c 0a 20 20 20 20 20 20 20 20 20  zTemp,.         
d970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d980: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
d990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9a0: 30 29 3b 0a 20 20 20 20 69 66 28 20 64 77 4c 65  0);.    if( dwLe
d9b0: 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f  n > 0 ){.      /
d9c0: 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66  * allocate a buf
d9d0: 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20  fer and convert 
d9e0: 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20  to UTF8 */.     
d9f0: 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f   zOut = sqlite3_
da00: 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74  win32_mbcs_to_ut
da10: 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20  f8(zTemp);.     
da20: 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79 73   /* free the sys
da30: 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  tem buffer alloc
da40: 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65  ated by FormatMe
da50: 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 4c  ssage */.      L
da60: 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b  ocalFree(zTemp);
da70: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
da80: 7d 0a 20 20 69 66 28 20 30 20 3d 3d 20 64 77 4c  }.  if( 0 == dwL
da90: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
daa0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c  3_snprintf(nBuf,
dab0: 20 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f 72 20   zBuf, "OsError 
dac0: 30 78 25 78 20 28 25 75 29 22 2c 20 65 72 72 6f  0x%x (%u)", erro
dad0: 72 2c 20 65 72 72 6f 72 29 3b 0a 20 20 7d 65 6c  r, error);.  }el
dae0: 73 65 7b 0a 20 20 20 20 2f 2a 20 63 6f 70 79 20  se{.    /* copy 
daf0: 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6e 42 75  a maximum of nBu
db00: 66 20 63 68 61 72 73 20 74 6f 20 6f 75 74 70 75  f chars to outpu
db10: 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20  t buffer */.    
db20: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
db30: 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 25 73  (nBuf, zBuf, "%s
db40: 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 2f 2a  ", zOut);.    /*
db50: 20 66 72 65 65 20 74 68 65 20 55 54 46 38 20 62   free the UTF8 b
db60: 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 66 72 65  uffer */.    fre
db70: 65 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72  e(zOut);.  }.  r
db80: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
db90: 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a  * Open a file..*
dba0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
dbb0: 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
dbc0: 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
dbd0: 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f    /* Not used */
dbe0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
dbf0: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Name,        /* 
dc00: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
dc10: 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71   (UTF-8) */.  sq
dc20: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
dc30: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
dc40: 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65   the SQLite file
dc50: 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a   handle here */.
dc60: 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
dc80: 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73 20 2a  pen mode flags *
dc90: 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61  /.  int *pOutFla
dca0: 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
dcb0: 20 53 74 61 74 75 73 20 72 65 74 75 72 6e 20 66   Status return f
dcc0: 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e  lags */.){.  HAN
dcd0: 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44 20 64  DLE h;.  DWORD d
dce0: 77 44 65 73 69 72 65 64 41 63 63 65 73 73 3b 0a  wDesiredAccess;.
dcf0: 20 20 44 57 4f 52 44 20 64 77 53 68 61 72 65 4d    DWORD dwShareM
dd00: 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20 64 77 43  ode;.  DWORD dwC
dd10: 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
dd20: 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64 77 46 6c  on;.  DWORD dwFl
dd30: 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
dd40: 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c 49 54 45   = 0;.#if SQLITE
dd50: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20  _OS_WINCE.  int 
dd60: 69 73 54 65 6d 70 20 3d 20 30 3b 0a 23 65 6e 64  isTemp = 0;.#end
dd70: 69 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  if.  winFile *pF
dd80: 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
dd90: 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  id;.  void *zCon
dda0: 76 65 72 74 65 64 3b 20 20 20 20 20 20 20 20 20  verted;         
ddb0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e          /* Filen
ddc0: 61 6d 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69  ame in OS encodi
ddd0: 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ng */.  const ch
dde0: 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20  ar *zUtf8Name = 
ddf0: 7a 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 46 69 6c  zName;    /* Fil
de00: 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d 38 20 65  ename in UTF-8 e
de10: 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 68 61  ncoding */.  cha
de20: 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50  r zTmpname[MAX_P
de30: 41 54 48 2b 31 5d 3b 20 20 20 20 20 20 20 20 2f  ATH+1];        /
de40: 2a 20 42 75 66 66 65 72 20 75 73 65 64 20 74 6f  * Buffer used to
de50: 20 63 72 65 61 74 65 20 74 65 6d 70 20 66 69 6c   create temp fil
de60: 65 6e 61 6d 65 20 2a 2f 0a 0a 20 20 61 73 73 65  ename */..  asse
de70: 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 55  rt( id!=0 );.  U
de80: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
de90: 70 56 66 73 29 3b 0a 0a 20 20 70 46 69 6c 65 2d  pVfs);..  pFile-
dea0: 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e  >h = INVALID_HAN
deb0: 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 20 20 2f 2a  DLE_VALUE;..  /*
dec0: 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
ded0: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
dee0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c  function is NULL
def0: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 0a 20 20  , generate a .  
df00: 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ** temporary fil
df10: 65 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 0a 20  e name to use . 
df20: 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74 66 38   */.  if( !zUtf8
df30: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Name ){.    int 
df40: 72 63 20 3d 20 67 65 74 54 65 6d 70 6e 61 6d 65  rc = getTempname
df50: 28 4d 41 58 5f 50 41 54 48 2b 31 2c 20 7a 54 6d  (MAX_PATH+1, zTm
df60: 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pname);.    if( 
df70: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
df80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
df90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66  ;.    }.    zUtf
dfa0: 38 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65  8Name = zTmpname
dfb0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76  ;.  }..  /* Conv
dfc0: 65 72 74 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  ert the filename
dfd0: 20 74 6f 20 74 68 65 20 73 79 73 74 65 6d 20 65   to the system e
dfe0: 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43  ncoding. */.  zC
dff0: 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65  onverted = conve
e000: 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  rtUtf8Filename(z
e010: 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66 28  Utf8Name);.  if(
e020: 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29   zConverted==0 )
e030: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
e040: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
e050: 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
e060: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
e070: 49 54 45 20 29 7b 0a 20 20 20 20 64 77 44 65 73  ITE ){.    dwDes
e080: 69 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e  iredAccess = GEN
e090: 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45  ERIC_READ | GENE
e0a0: 52 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c  RIC_WRITE;.  }el
e0b0: 73 65 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65  se{.    dwDesire
e0c0: 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49  dAccess = GENERI
e0d0: 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 20 20 2f 2a  C_READ;.  }.  /*
e0e0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
e0f0: 4c 55 53 49 56 45 20 69 73 20 75 73 65 64 20 74  LUSIVE is used t
e100: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
e110: 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73 20 0a   a new file is .
e120: 20 20 2a 2a 20 63 72 65 61 74 65 64 2e 20 53 51    ** created. SQ
e130: 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 75 73 65  Lite doesn't use
e140: 20 69 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20   it to indicate 
e150: 22 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73  "exclusive acces
e160: 73 22 20 0a 20 20 2a 2a 20 61 73 20 69 74 20 69  s" .  ** as it i
e170: 73 20 75 73 75 61 6c 6c 79 20 75 6e 64 65 72 73  s usually unders
e180: 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tood..  */.  ass
e190: 65 72 74 28 21 28 66 6c 61 67 73 20 26 20 53 51  ert(!(flags & SQ
e1a0: 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
e1b0: 49 56 45 29 20 7c 7c 20 28 66 6c 61 67 73 20 26  IVE) || (flags &
e1c0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
e1d0: 41 54 45 29 29 3b 0a 20 20 69 66 28 20 66 6c 61  ATE));.  if( fla
e1e0: 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
e1f0: 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20  _EXCLUSIVE ){.  
e200: 20 20 2f 2a 20 43 72 65 61 74 65 73 20 61 20 6e    /* Creates a n
e210: 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66  ew file, only if
e220: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72   it does not alr
e230: 65 61 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a 20  eady exist. */. 
e240: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
e250: 65 20 65 78 69 73 74 73 2c 20 69 74 20 66 61 69  e exists, it fai
e260: 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65  ls. */.    dwCre
e270: 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
e280: 20 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a 20   = CREATE_NEW;. 
e290: 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
e2a0: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   & SQLITE_OPEN_C
e2b0: 52 45 41 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20  REATE ){.    /* 
e2c0: 4f 70 65 6e 20 65 78 69 73 74 69 6e 67 20 66 69  Open existing fi
e2d0: 6c 65 2c 20 6f 72 20 63 72 65 61 74 65 20 69 66  le, or create if
e2e0: 20 69 74 20 64 6f 65 73 6e 27 74 20 65 78 69 73   it doesn't exis
e2f0: 74 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74  t */.    dwCreat
e300: 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d  ionDisposition =
e310: 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20   OPEN_ALWAYS;.  
e320: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70  }else{.    /* Op
e330: 65 6e 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79  ens a file, only
e340: 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 2a   if it exists. *
e350: 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e  /.    dwCreation
e360: 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50  Disposition = OP
e370: 45 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d  EN_EXISTING;.  }
e380: 0a 20 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d  .  dwShareMode =
e390: 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44   FILE_SHARE_READ
e3a0: 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52   | FILE_SHARE_WR
e3b0: 49 54 45 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  ITE;.  if( flags
e3c0: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
e3d0: 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a  ELETEONCLOSE ){.
e3e0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
e3f0: 4e 43 45 0a 20 20 20 20 64 77 46 6c 61 67 73 41  NCE.    dwFlagsA
e400: 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46  ndAttributes = F
e410: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49  ILE_ATTRIBUTE_HI
e420: 44 44 45 4e 3b 0a 20 20 20 20 69 73 54 65 6d 70  DDEN;.    isTemp
e430: 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20   = 1;.#else.    
e440: 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
e450: 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52  utes = FILE_ATTR
e460: 49 42 55 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a  IBUTE_TEMPORARY.
e470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
e490: 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
e4a0: 48 49 44 44 45 4e 0a 20 20 20 20 20 20 20 20 20  HIDDEN.         
e4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4c0: 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41        | FILE_FLA
e4d0: 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53  G_DELETE_ON_CLOS
e4e0: 45 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  E;.#endif.  }els
e4f0: 65 7b 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e  e{.    dwFlagsAn
e500: 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49  dAttributes = FI
e510: 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52  LE_ATTRIBUTE_NOR
e520: 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 65  MAL;.  }.  /* Re
e530: 70 6f 72 74 73 20 66 72 6f 6d 20 74 68 65 20 69  ports from the i
e540: 6e 74 65 72 6e 65 74 20 61 72 65 20 74 68 61 74  nternet are that
e550: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 73 20   performance is 
e560: 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65 74 74  always.  ** bett
e570: 65 72 20 69 66 20 46 49 4c 45 5f 46 4c 41 47 5f  er if FILE_FLAG_
e580: 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20 69 73  RANDOM_ACCESS is
e590: 20 75 73 65 64 2e 20 20 54 69 63 6b 65 74 20 23   used.  Ticket #
e5a0: 32 36 39 39 2e 20 2a 2f 0a 23 69 66 20 53 51 4c  2699. */.#if SQL
e5b0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 64  ITE_OS_WINCE.  d
e5c0: 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
e5d0: 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47  tes |= FILE_FLAG
e5e0: 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a  _RANDOM_ACCESS;.
e5f0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 69 73 4e  #endif.  if( isN
e600: 54 28 29 20 29 7b 0a 20 20 20 20 68 20 3d 20 43  T() ){.    h = C
e610: 72 65 61 74 65 46 69 6c 65 57 28 28 57 43 48 41  reateFileW((WCHA
e620: 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  R*)zConverted,. 
e630: 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
e640: 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 64 77  ccess,.       dw
e650: 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20  ShareMode,.     
e660: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 64    NULL,.       d
e670: 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
e680: 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 64 77 46  tion,.       dwF
e690: 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
e6a0: 73 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20  s,.       NULL. 
e6b0: 20 20 20 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20     );./* isNT() 
e6c0: 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f  is 1 if SQLITE_O
e6d0: 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74  S_WINCE==1, so t
e6e0: 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65  his else is neve
e6f0: 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20  r executed. .** 
e700: 53 69 6e 63 65 20 74 68 65 20 41 53 43 49 49 20  Since the ASCII 
e710: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65  version of these
e720: 20 57 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20   Windows API do 
e730: 6e 6f 74 20 65 78 69 73 74 20 66 6f 72 20 57 49  not exist for WI
e740: 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70  NCE,.** it's imp
e750: 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65  ortant to not re
e760: 66 65 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72  ference them for
e770: 20 57 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a   WINCE builds..*
e780: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
e790: 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65  WINCE==0.  }else
e7a0: 7b 0a 20 20 20 20 68 20 3d 20 43 72 65 61 74 65  {.    h = Create
e7b0: 46 69 6c 65 41 28 28 63 68 61 72 2a 29 7a 43 6f  FileA((char*)zCo
e7c0: 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
e7d0: 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c  dwDesiredAccess,
e7e0: 0a 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d  .       dwShareM
e7f0: 6f 64 65 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c  ode,.       NULL
e800: 2c 0a 20 20 20 20 20 20 20 64 77 43 72 65 61 74  ,.       dwCreat
e810: 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a  ionDisposition,.
e820: 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e         dwFlagsAn
e830: 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20  dAttributes,.   
e840: 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a      NULL.    );.
e850: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 4f 53 54  #endif.  }.  OST
e860: 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25  RACE(("OPEN %d %
e870: 73 20 30 78 25 6c 78 20 25 73 5c 6e 22 2c 20 0a  s 0x%lx %s\n", .
e880: 20 20 20 20 20 20 20 20 20 20 20 68 2c 20 7a 4e             h, zN
e890: 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64 41 63  ame, dwDesiredAc
e8a0: 63 65 73 73 2c 20 0a 20 20 20 20 20 20 20 20 20  cess, .         
e8b0: 20 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e    h==INVALID_HAN
e8c0: 44 4c 45 5f 56 41 4c 55 45 20 3f 20 22 66 61 69  DLE_VALUE ? "fai
e8d0: 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 20  led" : "ok"));. 
e8e0: 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f   if( h==INVALID_
e8f0: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a  HANDLE_VALUE ){.
e900: 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72      free(zConver
e910: 74 65 64 29 3b 0a 20 20 20 20 69 66 28 20 66 6c  ted);.    if( fl
e920: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
e930: 4e 5f 52 45 41 44 57 52 49 54 45 20 29 7b 0a 20  N_READWRITE ){. 
e940: 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4f       return winO
e950: 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61 6d 65 2c  pen(pVfs, zName,
e960: 20 69 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20   id, .          
e970: 20 20 20 28 28 66 6c 61 67 73 7c 53 51 4c 49 54     ((flags|SQLIT
e980: 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
e990: 26 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  &~SQLITE_OPEN_RE
e9a0: 41 44 57 52 49 54 45 29 2c 20 70 4f 75 74 46 6c  ADWRITE), pOutFl
e9b0: 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ags);.    }else{
e9c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
e9d0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
e9e0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  PT;.    }.  }.  
e9f0: 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b  if( pOutFlags ){
ea00: 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26  .    if( flags &
ea10: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
ea20: 44 57 52 49 54 45 20 29 7b 0a 20 20 20 20 20 20  DWRITE ){.      
ea30: 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c  *pOutFlags = SQL
ea40: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
ea50: 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  TE;.    }else{. 
ea60: 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20       *pOutFlags 
ea70: 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
ea80: 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  ADONLY;.    }.  
ea90: 7d 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65  }.  memset(pFile
eaa0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 46 69  , 0, sizeof(*pFi
eab0: 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70  le));.  pFile->p
eac0: 4d 65 74 68 6f 64 20 3d 20 26 77 69 6e 49 6f 4d  Method = &winIoM
ead0: 65 74 68 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e  ethod;.  pFile->
eae0: 68 20 3d 20 68 3b 0a 20 20 70 46 69 6c 65 2d 3e  h = h;.  pFile->
eaf0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45  lastErrno = NO_E
eb00: 52 52 4f 52 3b 0a 20 20 70 46 69 6c 65 2d 3e 70  RROR;.  pFile->p
eb10: 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 46  Vfs = pVfs;.  pF
eb20: 69 6c 65 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20  ile->pShm = 0;. 
eb30: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20   pFile->zPath = 
eb40: 7a 4e 61 6d 65 3b 0a 20 20 70 46 69 6c 65 2d 3e  zName;.  pFile->
eb50: 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 67 65 74  sectorSize = get
eb60: 53 65 63 74 6f 72 53 69 7a 65 28 70 56 66 73 2c  SectorSize(pVfs,
eb70: 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 23 69 66   zUtf8Name);.#if
eb80: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
eb90: 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20  .  if( (flags & 
eba0: 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
ebb0: 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
ebc0: 45 4e 5f 4d 41 49 4e 5f 44 42 29 29 20 3d 3d 0a  EN_MAIN_DB)) ==.
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
ebe0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
ebf0: 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
ec00: 4e 5f 4d 41 49 4e 5f 44 42 29 0a 20 20 20 20 20  N_MAIN_DB).     
ec10: 20 20 26 26 20 21 77 69 6e 63 65 43 72 65 61 74    && !winceCreat
ec20: 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69  eLock(zName, pFi
ec30: 6c 65 29 0a 20 20 29 7b 0a 20 20 20 20 43 6c 6f  le).  ){.    Clo
ec40: 73 65 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20  seHandle(h);.   
ec50: 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64   free(zConverted
ec60: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
ec70: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
ec80: 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  PT;.  }.  if( is
ec90: 54 65 6d 70 20 29 7b 0a 20 20 20 20 70 46 69 6c  Temp ){.    pFil
eca0: 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
ecb0: 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  e = zConverted;.
ecc0: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
ecd0: 20 7b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e   {.    free(zCon
ece0: 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 20 20 4f  verted);.  }.  O
ecf0: 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a  penCounter(+1);.
ed00: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ed10: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  OK;.}../*.** Del
ed20: 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69  ete the named fi
ed30: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  le..**.** Note t
ed40: 68 61 74 20 77 69 6e 64 6f 77 73 20 64 6f 65 73  hat windows does
ed50: 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c   not allow a fil
ed60: 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  e to be deleted 
ed70: 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  if some other.**
ed80: 20 70 72 6f 63 65 73 73 20 68 61 73 20 69 74 20   process has it 
ed90: 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73  open.  Sometimes
eda0: 20 61 20 76 69 72 75 73 20 73 63 61 6e 6e 65 72   a virus scanner
edb0: 20 6f 72 20 69 6e 64 65 78 69 6e 67 20 70 72 6f   or indexing pro
edc0: 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65  gram.** will ope
edd0: 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  n a journal file
ede0: 20 73 68 6f 72 74 6c 79 20 61 66 74 65 72 20 69   shortly after i
edf0: 74 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20  t is created in 
ee00: 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77  order to do.** w
ee10: 68 61 74 65 76 65 72 20 69 74 20 64 6f 65 73 2e  hatever it does.
ee20: 20 20 57 68 69 6c 65 20 74 68 69 73 20 6f 74 68    While this oth
ee30: 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  er process is ho
ee40: 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c  lding the.** fil
ee50: 65 20 6f 70 65 6e 2c 20 77 65 20 77 69 6c 6c 20  e open, we will 
ee60: 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c  be unable to del
ee70: 65 74 65 20 69 74 2e 20 20 54 6f 20 77 6f 72 6b  ete it.  To work
ee80: 20 61 72 6f 75 6e 64 20 74 68 69 73 0a 2a 2a 20   around this.** 
ee90: 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 65 6c 61  problem, we dela
eea0: 79 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e  y 100 millisecon
eeb0: 64 73 20 61 6e 64 20 74 72 79 20 74 6f 20 64 65  ds and try to de
eec0: 6c 65 74 65 20 61 67 61 69 6e 2e 20 20 55 70 0a  lete again.  Up.
eed0: 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c 45 54 49 4f  ** to MX_DELETIO
eee0: 4e 5f 41 54 54 45 4d 50 54 73 20 64 65 6c 65 74  N_ATTEMPTs delet
eef0: 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 61 72 65  ion attempts are
ef00: 20 72 75 6e 20 62 65 66 6f 72 65 20 67 69 76 69   run before givi
ef10: 6e 67 0a 2a 2a 20 75 70 20 61 6e 64 20 72 65 74  ng.** up and ret
ef20: 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e  urning an error.
ef30: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 44  .*/.#define MX_D
ef40: 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53  ELETION_ATTEMPTS
ef50: 20 35 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69   5.static int wi
ef60: 6e 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74  nDelete(.  sqlit
ef70: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
ef80: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73         /* Not us
ef90: 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20  ed on win32 */. 
efa0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
efb0: 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20  lename,      /* 
efc0: 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Name of file to 
efd0: 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20  delete */.  int 
efe0: 73 79 6e 63 44 69 72 20 20 20 20 20 20 20 20 20  syncDir         
eff0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75          /* Not u
f000: 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a  sed on win32 */.
f010: 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  ){.  int cnt = 0
f020: 3b 0a 20 20 44 57 4f 52 44 20 72 63 3b 0a 20 20  ;.  DWORD rc;.  
f030: 44 57 4f 52 44 20 65 72 72 6f 72 20 3d 20 30 3b  DWORD error = 0;
f040: 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
f050: 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66  ted = convertUtf
f060: 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e  8Filename(zFilen
f070: 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ame);.  UNUSED_P
f080: 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
f090: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
f0a0: 45 52 28 73 79 6e 63 44 69 72 29 3b 0a 20 20 69  ER(syncDir);.  i
f0b0: 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
f0c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
f0d0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
f0e0: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
f0f0: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
f100: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a  _IOERR_DELETE);.
f110: 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
f120: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 44 65      do{.      De
f130: 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e 76 65  leteFileW(zConve
f140: 72 74 65 64 29 3b 0a 20 20 20 20 7d 77 68 69 6c  rted);.    }whil
f150: 65 28 20 20 20 28 20 20 20 28 28 72 63 20 3d 20  e(   (   ((rc = 
f160: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
f170: 73 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 29 20  sW(zConverted)) 
f180: 21 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  != INVALID_FILE_
f190: 41 54 54 52 49 42 55 54 45 53 29 0a 20 20 20 20  ATTRIBUTES).    
f1a0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28             || ((
f1b0: 65 72 72 6f 72 20 3d 20 47 65 74 4c 61 73 74 45  error = GetLastE
f1c0: 72 72 6f 72 28 29 29 20 3d 3d 20 45 52 52 4f 52  rror()) == ERROR
f1d0: 5f 41 43 43 45 53 53 5f 44 45 4e 49 45 44 29 29  _ACCESS_DENIED))
f1e0: 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
f1f0: 2b 2b 63 6e 74 20 3c 20 4d 58 5f 44 45 4c 45 54  ++cnt < MX_DELET
f200: 49 4f 4e 5f 41 54 54 45 4d 50 54 53 29 0a 20 20  ION_ATTEMPTS).  
f210: 20 20 20 20 20 20 20 20 20 26 26 20 28 53 6c 65           && (Sle
f220: 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 2f  ep(100), 1) );./
f230: 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66  * isNT() is 1 if
f240: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
f250: 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73  ==1, so this els
f260: 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75  e is never execu
f270: 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74  ted. .** Since t
f280: 68 65 20 41 53 43 49 49 20 76 65 72 73 69 6f 6e  he ASCII version
f290: 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77   of these Window
f2a0: 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69  s API do not exi
f2b0: 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a  st for WINCE,.**
f2c0: 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20   it's important 
f2d0: 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65  to not reference
f2e0: 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20   them for WINCE 
f2f0: 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53  builds..*/.#if S
f300: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
f310: 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  0.  }else{.    d
f320: 6f 7b 0a 20 20 20 20 20 20 44 65 6c 65 74 65 46  o{.      DeleteF
f330: 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65 64 29  ileA(zConverted)
f340: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 20 20  ;.    }while(   
f350: 28 20 20 20 28 28 72 63 20 3d 20 47 65 74 46 69  (   ((rc = GetFi
f360: 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 7a 43  leAttributesA(zC
f370: 6f 6e 76 65 72 74 65 64 29 29 20 21 3d 20 49 4e  onverted)) != IN
f380: 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
f390: 42 55 54 45 53 29 0a 20 20 20 20 20 20 20 20 20  BUTES).         
f3a0: 20 20 20 20 20 20 7c 7c 20 28 28 65 72 72 6f 72        || ((error
f3b0: 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28   = GetLastError(
f3c0: 29 29 20 3d 3d 20 45 52 52 4f 52 5f 41 43 43 45  )) == ERROR_ACCE
f3d0: 53 53 5f 44 45 4e 49 45 44 29 29 0a 20 20 20 20  SS_DENIED)).    
f3e0: 20 20 20 20 20 20 20 26 26 20 28 2b 2b 63 6e 74         && (++cnt
f3f0: 20 3c 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41   < MX_DELETION_A
f400: 54 54 45 4d 50 54 53 29 0a 20 20 20 20 20 20 20  TTEMPTS).       
f410: 20 20 20 20 26 26 20 28 53 6c 65 65 70 28 31 30      && (Sleep(10
f420: 30 29 2c 20 31 29 20 29 3b 0a 23 65 6e 64 69 66  0), 1) );.#endif
f430: 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a 43 6f 6e  .  }.  free(zCon
f440: 76 65 72 74 65 64 29 3b 0a 20 20 4f 53 54 52 41  verted);.  OSTRA
f450: 43 45 28 28 22 44 45 4c 45 54 45 20 5c 22 25 73  CE(("DELETE \"%s
f460: 5c 22 20 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e  \" %s\n", zFilen
f470: 61 6d 65 2c 0a 20 20 20 20 20 20 20 28 20 28 72  ame,.       ( (r
f480: 63 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  c==INVALID_FILE_
f490: 41 54 54 52 49 42 55 54 45 53 29 20 26 26 20 28  ATTRIBUTES) && (
f4a0: 65 72 72 6f 72 3d 3d 45 52 52 4f 52 5f 46 49 4c  error==ERROR_FIL
f4b0: 45 5f 4e 4f 54 5f 46 4f 55 4e 44 29 29 20 3f 0a  E_NOT_FOUND)) ?.
f4c0: 20 20 20 20 20 20 20 20 20 22 6f 6b 22 20 3a 20           "ok" : 
f4d0: 22 66 61 69 6c 65 64 22 20 29 29 3b 0a 20 0a 20  "failed" ));. . 
f4e0: 20 72 65 74 75 72 6e 20 28 20 20 20 28 72 63 20   return (   (rc 
f4f0: 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  == INVALID_FILE_
f500: 41 54 54 52 49 42 55 54 45 53 29 20 0a 20 20 20  ATTRIBUTES) .   
f510: 20 20 20 20 20 20 20 26 26 20 28 65 72 72 6f 72         && (error
f520: 20 3d 3d 20 45 52 52 4f 52 5f 46 49 4c 45 5f 4e   == ERROR_FILE_N
f530: 4f 54 5f 46 4f 55 4e 44 29 29 20 3f 20 53 51 4c  OT_FOUND)) ? SQL
f540: 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f  ITE_OK : SQLITE_
f550: 49 4f 45 52 52 5f 44 45 4c 45 54 45 3b 0a 7d 0a  IOERR_DELETE;.}.
f560: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65  ./*.** Check the
f570: 20 65 78 69 73 74 61 6e 63 65 20 61 6e 64 20 73   existance and s
f580: 74 61 74 75 73 20 6f 66 20 61 20 66 69 6c 65 2e  tatus of a file.
f590: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
f5a0: 69 6e 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69  inAccess(.  sqli
f5b0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
f5c0: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73         /* Not us
f5d0: 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20  ed on win32 */. 
f5e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
f5f0: 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e  lename,     /* N
f600: 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 63  ame of file to c
f610: 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  heck */.  int fl
f620: 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
f630: 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
f640: 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 6f 6e 20  test to make on 
f650: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69  this file */.  i
f660: 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20  nt *pResOut     
f670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
f680: 3a 20 52 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20  : Result */.){. 
f690: 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69   DWORD attr;.  i
f6a0: 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 76 6f 69  nt rc = 0;.  voi
f6b0: 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  d *zConverted = 
f6c0: 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e  convertUtf8Filen
f6d0: 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
f6e0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
f6f0: 45 52 28 70 56 66 73 29 3b 0a 20 20 69 66 28 20  ER(pVfs);.  if( 
f700: 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
f710: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f720: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
f730: 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
f740: 20 20 61 74 74 72 20 3d 20 47 65 74 46 69 6c 65    attr = GetFile
f750: 41 74 74 72 69 62 75 74 65 73 57 28 28 57 43 48  AttributesW((WCH
f760: 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b  AR*)zConverted);
f770: 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20  ./* isNT() is 1 
f780: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
f790: 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65  CE==1, so this e
f7a0: 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65  lse is never exe
f7b0: 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65  cuted. .** Since
f7c0: 20 74 68 65 20 41 53 43 49 49 20 76 65 72 73 69   the ASCII versi
f7d0: 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64  on of these Wind
f7e0: 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65  ows API do not e
f7f0: 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a  xist for WINCE,.
f800: 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e  ** it's importan
f810: 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e  t to not referen
f820: 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43  ce them for WINC
f830: 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66  E builds..*/.#if
f840: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
f850: 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ==0.  }else{.   
f860: 20 61 74 74 72 20 3d 20 47 65 74 46 69 6c 65 41   attr = GetFileA
f870: 74 74 72 69 62 75 74 65 73 41 28 28 63 68 61 72  ttributesA((char
f880: 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23  *)zConverted);.#
f890: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 66 72 65 65  endif.  }.  free
f8a0: 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
f8b0: 73 77 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b  switch( flags ){
f8c0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
f8d0: 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20  _ACCESS_READ:.  
f8e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
f8f0: 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20  CESS_EXISTS:.   
f900: 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e     rc = attr!=IN
f910: 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
f920: 42 55 54 45 53 3b 0a 20 20 20 20 20 20 62 72 65  BUTES;.      bre
f930: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
f940: 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
f950: 52 49 54 45 3a 0a 20 20 20 20 20 20 72 63 20 3d  RITE:.      rc =
f960: 20 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54   (attr & FILE_AT
f970: 54 52 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59  TRIBUTE_READONLY
f980: 29 3d 3d 30 3b 0a 20 20 20 20 20 20 62 72 65 61  )==0;.      brea
f990: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
f9a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49        assert(!"I
f9b0: 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67  nvalid flags arg
f9c0: 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a  ument");.  }.  *
f9d0: 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20  pResOut = rc;.  
f9e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f9f0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e  ;.}.../*.** Turn
fa00: 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
fa10: 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c  name into a full
fa20: 20 70 61 74 68 6e 61 6d 65 2e 20 20 57 72 69 74   pathname.  Writ
fa30: 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61  e the full.** pa
fa40: 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74  thname into zOut
fa50: 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c  [].  zOut[] will
fa60: 20 62 65 20 61 74 20 6c 65 61 73 74 20 70 56 66   be at least pVf
fa70: 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a  s->mxPathname.**
fa80: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
fa90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
faa0: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20  nFullPathname(. 
fab0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
fac0: 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  fs,            /
fad0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
fae0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
faf0: 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69  st char *zRelati
fb00: 76 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ve,        /* Po
fb10: 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20  ssibly relative 
fb20: 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20  input path */.  
fb30: 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20  int nFull,      
fb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fb50: 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20   Size of output 
fb60: 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20  buffer in bytes 
fb70: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c  */.  char *zFull
fb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb90: 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66     /* Output buf
fba0: 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 0a 23 69 66  fer */.){.  .#if
fbb0: 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49   defined(__CYGWI
fbc0: 4e 5f 5f 29 0a 20 20 55 4e 55 53 45 44 5f 50 41  N__).  UNUSED_PA
fbd0: 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a  RAMETER(nFull);.
fbe0: 20 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 74 6f    cygwin_conv_to
fbf0: 5f 66 75 6c 6c 5f 77 69 6e 33 32 5f 70 61 74 68  _full_win32_path
fc00: 28 7a 52 65 6c 61 74 69 76 65 2c 20 7a 46 75 6c  (zRelative, zFul
fc10: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  l);.  return SQL
fc20: 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a  ITE_OK;.#endif..
fc30: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
fc40: 4e 43 45 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  NCE.  UNUSED_PAR
fc50: 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20  AMETER(nFull);. 
fc60: 20 2f 2a 20 57 69 6e 43 45 20 68 61 73 20 6e 6f   /* WinCE has no
fc70: 20 63 6f 6e 63 65 70 74 20 6f 66 20 61 20 72 65   concept of a re
fc80: 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2c  lative pathname,
fc90: 20 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64   or so I am told
fca0: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  . */.  sqlite3_s
fcb0: 6e 70 72 69 6e 74 66 28 70 56 66 73 2d 3e 6d 78  nprintf(pVfs->mx
fcc0: 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 2c  Pathname, zFull,
fcd0: 20 22 25 73 22 2c 20 7a 52 65 6c 61 74 69 76 65   "%s", zRelative
fce0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
fcf0: 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23  TE_OK;.#endif..#
fd00: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
fd10: 4e 43 45 20 26 26 20 21 64 65 66 69 6e 65 64 28  NCE && !defined(
fd20: 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 69 6e  __CYGWIN__).  in
fd30: 74 20 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64 20  t nByte;.  void 
fd40: 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 63  *zConverted;.  c
fd50: 68 61 72 20 2a 7a 4f 75 74 3b 0a 20 20 55 4e 55  har *zOut;.  UNU
fd60: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46  SED_PARAMETER(nF
fd70: 75 6c 6c 29 3b 0a 20 20 7a 43 6f 6e 76 65 72 74  ull);.  zConvert
fd80: 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38  ed = convertUtf8
fd90: 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74 69  Filename(zRelati
fda0: 76 65 29 3b 0a 20 20 69 66 28 20 69 73 4e 54 28  ve);.  if( isNT(
fdb0: 29 20 29 7b 0a 20 20 20 20 57 43 48 41 52 20 2a  ) ){.    WCHAR *
fdc0: 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65  zTemp;.    nByte
fdd0: 20 3d 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   = GetFullPathNa
fde0: 6d 65 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e  meW((WCHAR*)zCon
fdf0: 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29  verted, 0, 0, 0)
fe00: 20 2b 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20   + 3;.    zTemp 
fe10: 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a  = malloc( nByte*
fe20: 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29  sizeof(zTemp[0])
fe30: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d   );.    if( zTem
fe40: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72  p==0 ){.      fr
fe50: 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
fe60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
fe70: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
fe80: 0a 20 20 20 20 47 65 74 46 75 6c 6c 50 61 74 68  .    GetFullPath
fe90: 4e 61 6d 65 57 28 28 57 43 48 41 52 2a 29 7a 43  NameW((WCHAR*)zC
fea0: 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c  onverted, nByte,
feb0: 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20   zTemp, 0);.    
fec0: 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
fed0: 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 75 6e 69  ;.    zOut = uni
fee0: 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70  codeToUtf8(zTemp
fef0: 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 54 65 6d  );.    free(zTem
ff00: 70 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73  p);./* isNT() is
ff10: 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f   1 if SQLITE_OS_
ff20: 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69  WINCE==1, so thi
ff30: 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20  s else is never 
ff40: 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69  executed. .** Si
ff50: 6e 63 65 20 74 68 65 20 41 53 43 49 49 20 76 65  nce the ASCII ve
ff60: 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57  rsion of these W
ff70: 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f  indows API do no
ff80: 74 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43  t exist for WINC
ff90: 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72  E,.** it's impor
ffa0: 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65  tant to not refe
ffb0: 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57  rence them for W
ffc0: 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a  INCE builds..*/.
ffd0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
ffe0: 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a  NCE==0.  }else{.
fff0: 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 3b      char *zTemp;
10000 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 47 65 74  .    nByte = Get
10010 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63  FullPathNameA((c
10020 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c  har*)zConverted,
10030 20 30 2c 20 30 2c 20 30 29 20 2b 20 33 3b 0a 20   0, 0, 0) + 3;. 
10040 20 20 20 7a 54 65 6d 70 20 3d 20 6d 61 6c 6c 6f     zTemp = mallo
10050 63 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28  c( nByte*sizeof(
10060 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20  zTemp[0]) );.   
10070 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b   if( zTemp==0 ){
10080 0a 20 20 20 20 20 20 66 72 65 65 28 7a 43 6f 6e  .      free(zCon
10090 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72  verted);.      r
100a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
100b0 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 47 65  EM;.    }.    Ge
100c0 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28  tFullPathNameA((
100d0 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
100e0 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20  , nByte, zTemp, 
100f0 30 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f  0);.    free(zCo
10100 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f  nverted);.    zO
10110 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  ut = sqlite3_win
10120 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
10130 7a 54 65 6d 70 29 3b 0a 20 20 20 20 66 72 65 65  zTemp);.    free
10140 28 7a 54 65 6d 70 29 3b 0a 23 65 6e 64 69 66 0a  (zTemp);.#endif.
10150 20 20 7d 0a 20 20 69 66 28 20 7a 4f 75 74 20 29    }.  if( zOut )
10160 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
10170 70 72 69 6e 74 66 28 70 56 66 73 2d 3e 6d 78 50  printf(pVfs->mxP
10180 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 2c 20  athname, zFull, 
10190 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20  "%s", zOut);.   
101a0 20 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20   free(zOut);.   
101b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
101c0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
101d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
101e0 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  MEM;.  }.#endif.
101f0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74 68 65  }../*.** Get the
10200 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   sector size of 
10210 74 68 65 20 64 65 76 69 63 65 20 75 73 65 64 20  the device used 
10220 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 66 69 6c 65  to store.** file
10230 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10240 67 65 74 53 65 63 74 6f 72 53 69 7a 65 28 0a 20  getSectorSize(. 
10250 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
10260 70 56 66 73 2c 0a 20 20 20 20 63 6f 6e 73 74 20  pVfs,.    const 
10270 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76 65 20  char *zRelative 
10280 20 20 20 20 2f 2a 20 55 54 46 2d 38 20 66 69 6c      /* UTF-8 fil
10290 65 20 6e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 44  e name */.){.  D
102a0 57 4f 52 44 20 62 79 74 65 73 50 65 72 53 65 63  WORD bytesPerSec
102b0 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  tor = SQLITE_DEF
102c0 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
102d0 3b 0a 20 20 2f 2a 20 47 65 74 44 69 73 6b 46 72  ;.  /* GetDiskFr
102e0 65 65 53 70 61 63 65 20 69 73 20 6e 6f 74 20 73  eeSpace is not s
102f0 75 70 70 6f 72 74 65 64 20 75 6e 64 65 72 20 57  upported under W
10300 49 4e 43 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49  INCE */.#if SQLI
10310 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 55 4e  TE_OS_WINCE.  UN
10320 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
10330 56 66 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Vfs);.  UNUSED_P
10340 41 52 41 4d 45 54 45 52 28 7a 52 65 6c 61 74 69  ARAMETER(zRelati
10350 76 65 29 3b 0a 23 65 6c 73 65 0a 20 20 63 68 61  ve);.#else.  cha
10360 72 20 7a 46 75 6c 6c 70 61 74 68 5b 4d 41 58 5f  r zFullpath[MAX_
10370 50 41 54 48 2b 31 5d 3b 0a 20 20 69 6e 74 20 72  PATH+1];.  int r
10380 63 3b 0a 20 20 44 57 4f 52 44 20 64 77 52 65 74  c;.  DWORD dwRet
10390 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 64 77   = 0;.  DWORD dw
103a0 44 75 6d 6d 79 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  Dummy;..  /*.  *
103b0 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 67 65 74  * We need to get
103c0 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 6e   the full path n
103d0 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a  ame of the file.
103e0 20 20 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20    ** to get the 
103f0 64 72 69 76 65 20 6c 65 74 74 65 72 20 74 6f 20  drive letter to 
10400 6c 6f 6f 6b 20 75 70 20 74 68 65 20 73 65 63 74  look up the sect
10410 6f 72 0a 20 20 2a 2a 20 73 69 7a 65 2e 0a 20 20  or.  ** size..  
10420 2a 2f 0a 20 20 72 63 20 3d 20 77 69 6e 46 75 6c  */.  rc = winFul
10430 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
10440 7a 52 65 6c 61 74 69 76 65 2c 20 4d 41 58 5f 50  zRelative, MAX_P
10450 41 54 48 2c 20 7a 46 75 6c 6c 70 61 74 68 29 3b  ATH, zFullpath);
10460 0a 20 20 69 66 28 20 72 63 20 3d 3d 20 53 51 4c  .  if( rc == SQL
10470 49 54 45 5f 4f 4b 20 29 0a 20 20 7b 0a 20 20 20  ITE_OK ).  {.   
10480 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
10490 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46  d = convertUtf8F
104a0 69 6c 65 6e 61 6d 65 28 7a 46 75 6c 6c 70 61 74  ilename(zFullpat
104b0 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 43 6f 6e  h);.    if( zCon
104c0 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20  verted ){.      
104d0 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
104e0 20 20 20 20 20 20 2f 2a 20 74 72 69 6d 20 70 61        /* trim pa
104f0 74 68 20 74 6f 20 6a 75 73 74 20 64 72 69 76 65  th to just drive
10500 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 20 20   reference */.  
10510 20 20 20 20 20 20 57 43 48 41 52 20 2a 70 20 3d        WCHAR *p =
10520 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 20   zConverted;.   
10530 20 20 20 20 20 66 6f 72 28 3b 2a 70 3b 70 2b 2b       for(;*p;p++
10540 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
10550 20 2a 70 20 3d 3d 20 27 5c 5c 27 20 29 7b 0a 20   *p == '\\' ){. 
10560 20 20 20 20 20 20 20 20 20 20 20 2a 70 20 3d 20             *p = 
10570 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20  '\0';.          
10580 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
10590 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
105a0 20 20 20 20 20 20 20 64 77 52 65 74 20 3d 20 47         dwRet = G
105b0 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57  etDiskFreeSpaceW
105c0 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72  ((WCHAR*)zConver
105d0 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ted,.           
105e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105f0 20 20 20 20 20 20 20 26 64 77 44 75 6d 6d 79 2c         &dwDummy,
10600 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10620 20 20 20 26 62 79 74 65 73 50 65 72 53 65 63 74     &bytesPerSect
10630 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  or,.            
10640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10650 20 20 20 20 20 20 26 64 77 44 75 6d 6d 79 2c 0a        &dwDummy,.
10660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10680 20 20 26 64 77 44 75 6d 6d 79 29 3b 0a 20 20 20    &dwDummy);.   
10690 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
106a0 20 20 2f 2a 20 74 72 69 6d 20 70 61 74 68 20 74    /* trim path t
106b0 6f 20 6a 75 73 74 20 64 72 69 76 65 20 72 65 66  o just drive ref
106c0 65 72 65 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20  erence */.      
106d0 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63 68 61    char *p = (cha
106e0 72 20 2a 29 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  r *)zConverted;.
106f0 20 20 20 20 20 20 20 20 66 6f 72 28 3b 2a 70 3b          for(;*p;
10700 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  p++){.          
10710 69 66 28 20 2a 70 20 3d 3d 20 27 5c 5c 27 20 29  if( *p == '\\' )
10720 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
10730 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20   = '\0';.       
10740 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10750 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10760 7d 0a 20 20 20 20 20 20 20 20 64 77 52 65 74 20  }.        dwRet 
10770 3d 20 47 65 74 44 69 73 6b 46 72 65 65 53 70 61  = GetDiskFreeSpa
10780 63 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  ceA((char*)zConv
10790 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
107a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107b0 20 20 20 20 20 20 20 20 20 26 64 77 44 75 6d 6d           &dwDumm
107c0 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
107d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107e0 20 20 20 20 20 26 62 79 74 65 73 50 65 72 53 65       &bytesPerSe
107f0 63 74 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20  ctor,.          
10800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10810 20 20 20 20 20 20 20 20 26 64 77 44 75 6d 6d 79          &dwDummy
10820 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10840 20 20 20 20 26 64 77 44 75 6d 6d 79 29 3b 0a 20      &dwDummy);. 
10850 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 72 65       }.      fre
10860 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
10870 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 77     }.    if( !dw
10880 52 65 74 20 29 7b 0a 20 20 20 20 20 20 62 79 74  Ret ){.      byt
10890 65 73 50 65 72 53 65 63 74 6f 72 20 3d 20 53 51  esPerSector = SQ
108a0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43  LITE_DEFAULT_SEC
108b0 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a  TOR_SIZE;.    }.
108c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
108d0 75 72 6e 20 28 69 6e 74 29 20 62 79 74 65 73 50  urn (int) bytesP
108e0 65 72 53 65 63 74 6f 72 3b 20 0a 7d 0a 0a 23 69  erSector; .}..#i
108f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10900 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
10910 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
10920 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20  s for opening a 
10930 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
10940 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f  finding entry po
10950 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ints.** within t
10960 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
10970 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74  y, and closing t
10980 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
10990 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  y..*/./*.** Inte
109a0 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69  rfaces for openi
109b0 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72  ng a shared libr
109c0 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74  ary, finding ent
109d0 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74  ry points.** wit
109e0 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  hin the shared l
109f0 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73  ibrary, and clos
10a00 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
10a10 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  ibrary..*/.stati
10a20 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65  c void *winDlOpe
10a30 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  n(sqlite3_vfs *p
10a40 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Vfs, const char 
10a50 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48  *zFilename){.  H
10a60 41 4e 44 4c 45 20 68 3b 0a 20 20 76 6f 69 64 20  ANDLE h;.  void 
10a70 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f  *zConverted = co
10a80 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d  nvertUtf8Filenam
10a90 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
10aa0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
10ab0 28 70 56 66 73 29 3b 0a 20 20 69 66 28 20 7a 43  (pVfs);.  if( zC
10ac0 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
10ad0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
10ae0 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
10af0 0a 20 20 20 20 68 20 3d 20 4c 6f 61 64 4c 69 62  .    h = LoadLib
10b00 72 61 72 79 57 28 28 57 43 48 41 52 2a 29 7a 43  raryW((WCHAR*)zC
10b10 6f 6e 76 65 72 74 65 64 29 3b 0a 2f 2a 20 69 73  onverted);./* is
10b20 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c  NT() is 1 if SQL
10b30 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c  ITE_OS_WINCE==1,
10b40 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73   so this else is
10b50 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e   never executed.
10b60 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41   .** Since the A
10b70 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f 66 20  SCII version of 
10b80 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50  these Windows AP
10b90 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66  I do not exist f
10ba0 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27  or WINCE,.** it'
10bb0 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e  s important to n
10bc0 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ot reference the
10bd0 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c  m for WINCE buil
10be0 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ds..*/.#if SQLIT
10bf0 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20  E_OS_WINCE==0.  
10c00 7d 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20 4c  }else{.    h = L
10c10 6f 61 64 4c 69 62 72 61 72 79 41 28 28 63 68 61  oadLibraryA((cha
10c20 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  r*)zConverted);.
10c30 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 66 72 65  #endif.  }.  fre
10c40 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
10c50 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 68   return (void*)h
10c60 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
10c70 77 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c 69 74  winDlError(sqlit
10c80 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
10c90 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
10ca0 75 66 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44  ufOut){.  UNUSED
10cb0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
10cc0 3b 0a 20 20 67 65 74 4c 61 73 74 45 72 72 6f 72  ;.  getLastError
10cd0 4d 73 67 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75  Msg(nBuf, zBufOu
10ce0 74 29 3b 0a 7d 0a 76 6f 69 64 20 28 2a 77 69 6e  t);.}.void (*win
10cf0 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66  DlSym(sqlite3_vf
10d00 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70  s *pVfs, void *p
10d10 48 61 6e 64 6c 65 2c 20 63 6f 6e 73 74 20 63 68  Handle, const ch
10d20 61 72 20 2a 7a 53 79 6d 62 6f 6c 29 29 28 76 6f  ar *zSymbol))(vo
10d30 69 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  id){.  UNUSED_PA
10d40 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 23  RAMETER(pVfs);.#
10d50 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
10d60 43 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 74 50  CE.  /* The GetP
10d70 72 6f 63 41 64 64 72 65 73 73 41 28 29 20 72 6f  rocAddressA() ro
10d80 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76  utine is only av
10d90 61 69 6c 61 62 6c 65 20 6f 6e 20 77 69 6e 63 65  ailable on wince
10da0 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 76  . */.  return (v
10db0 6f 69 64 28 2a 29 28 76 6f 69 64 29 29 47 65 74  oid(*)(void))Get
10dc0 50 72 6f 63 41 64 64 72 65 73 73 41 28 28 48 41  ProcAddressA((HA
10dd0 4e 44 4c 45 29 70 48 61 6e 64 6c 65 2c 20 7a 53  NDLE)pHandle, zS
10de0 79 6d 62 6f 6c 29 3b 0a 23 65 6c 73 65 0a 20 20  ymbol);.#else.  
10df0 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 77 69 6e  /* All other win
10e00 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 20 65  dows platforms e
10e10 78 70 65 63 74 20 47 65 74 50 72 6f 63 41 64 64  xpect GetProcAdd
10e20 72 65 73 73 28 29 20 74 6f 20 74 61 6b 65 0a 20  ress() to take. 
10e30 20 2a 2a 20 61 6e 20 41 6e 73 69 20 73 74 72 69   ** an Ansi stri
10e40 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  ng regardless of
10e50 20 74 68 65 20 5f 55 4e 49 43 4f 44 45 20 73 65   the _UNICODE se
10e60 74 74 69 6e 67 20 2a 2f 0a 20 20 72 65 74 75 72  tting */.  retur
10e70 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 29  n (void(*)(void)
10e80 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 28  )GetProcAddress(
10e90 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 2c  (HANDLE)pHandle,
10ea0 20 7a 53 79 6d 62 6f 6c 29 3b 0a 23 65 6e 64 69   zSymbol);.#endi
10eb0 66 0a 7d 0a 76 6f 69 64 20 77 69 6e 44 6c 43 6c  f.}.void winDlCl
10ec0 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ose(sqlite3_vfs 
10ed0 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61  *pVfs, void *pHa
10ee0 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ndle){.  UNUSED_
10ef0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
10f00 0a 20 20 46 72 65 65 4c 69 62 72 61 72 79 28 28  .  FreeLibrary((
10f10 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b  HANDLE)pHandle);
10f20 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53  .}.#else /* if S
10f30 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
10f40 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66  EXTENSION is def
10f50 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69  ined: */.  #defi
10f60 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a  ne winDlOpen  0.
10f70 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 45    #define winDlE
10f80 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65  rror 0.  #define
10f90 20 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20   winDlSym   0.  
10fa0 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f  #define winDlClo
10fb0 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  se 0.#endif.../*
10fc0 0a 2a 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20  .** Write up to 
10fd0 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61  nBuf bytes of ra
10fe0 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42  ndomness into zB
10ff0 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  uf..*/.static in
11000 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28  t winRandomness(
11010 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
11020 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
11030 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 6e 74 20  r *zBuf){.  int 
11040 6e 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f  n = 0;.  UNUSED_
11050 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
11060 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
11070 49 54 45 5f 54 45 53 54 29 0a 20 20 6e 20 3d 20  ITE_TEST).  n = 
11080 6e 42 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 7a  nBuf;.  memset(z
11090 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23  Buf, 0, nBuf);.#
110a0 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f  else.  if( sizeo
110b0 66 28 53 59 53 54 45 4d 54 49 4d 45 29 3c 3d 6e  f(SYSTEMTIME)<=n
110c0 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 53 59 53  Buf-n ){.    SYS
110d0 54 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20 20 47  TEMTIME x;.    G
110e0 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26 78 29  etSystemTime(&x)
110f0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42  ;.    memcpy(&zB
11100 75 66 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a 65 6f  uf[n], &x, sizeo
11110 66 28 78 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  f(x));.    n += 
11120 73 69 7a 65 6f 66 28 78 29 3b 0a 20 20 7d 0a 20  sizeof(x);.  }. 
11130 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52   if( sizeof(DWOR
11140 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20  D)<=nBuf-n ){.  
11150 20 20 44 57 4f 52 44 20 70 69 64 20 3d 20 47 65    DWORD pid = Ge
11160 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
11170 64 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  d();.    memcpy(
11180 26 7a 42 75 66 5b 6e 5d 2c 20 26 70 69 64 2c 20  &zBuf[n], &pid, 
11190 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20  sizeof(pid));.  
111a0 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 70 69    n += sizeof(pi
111b0 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69  d);.  }.  if( si
111c0 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75  zeof(DWORD)<=nBu
111d0 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44  f-n ){.    DWORD
111e0 20 63 6e 74 20 3d 20 47 65 74 54 69 63 6b 43 6f   cnt = GetTickCo
111f0 75 6e 74 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70  unt();.    memcp
11200 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74  y(&zBuf[n], &cnt
11210 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a  , sizeof(cnt));.
11220 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
11230 63 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  cnt);.  }.  if( 
11240 73 69 7a 65 6f 66 28 4c 41 52 47 45 5f 49 4e 54  sizeof(LARGE_INT
11250 45 47 45 52 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b  EGER)<=nBuf-n ){
11260 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47  .    LARGE_INTEG
11270 45 52 20 69 3b 0a 20 20 20 20 51 75 65 72 79 50  ER i;.    QueryP
11280 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65  erformanceCounte
11290 72 28 26 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70  r(&i);.    memcp
112a0 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c 20  y(&zBuf[n], &i, 
112b0 73 69 7a 65 6f 66 28 69 29 29 3b 0a 20 20 20 20  sizeof(i));.    
112c0 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 69 29 3b 0a  n += sizeof(i);.
112d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
112e0 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn n;.}.../*.**
112f0 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74   Sleep for a lit
11300 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75  tle while.  Retu
11310 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  rn the amount of
11320 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a   time slept..*/.
11330 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 6c  static int winSl
11340 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20  eep(sqlite3_vfs 
11350 2a 70 56 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f  *pVfs, int micro
11360 73 65 63 29 7b 0a 20 20 53 6c 65 65 70 28 28 6d  sec){.  Sleep((m
11370 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30  icrosec+999)/100
11380 30 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  0);.  UNUSED_PAR
11390 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
113a0 72 65 74 75 72 6e 20 28 28 6d 69 63 72 6f 73 65  return ((microse
113b0 63 2b 39 39 39 29 2f 31 30 30 30 29 2a 31 30 30  c+999)/1000)*100
113c0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  0;.}../*.** The 
113d0 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
113e0 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20  le, if set to a 
113f0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20  non-zero value, 
11400 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
11410 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  s.** the number 
11420 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  of seconds since
11430 20 31 39 37 30 20 61 6e 64 20 69 73 20 75 73 65   1970 and is use
11440 64 20 74 6f 20 73 65 74 20 74 68 65 20 72 65 73  d to set the res
11450 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  ult of.** sqlite
11460 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29  3OsCurrentTime()
11470 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e   during testing.
11480 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
11490 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
114a0 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
114b0 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79  = 0;  /* Fake sy
114c0 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63  stem time in sec
114d0 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e  onds since 1970.
114e0 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   */.#endif../*.*
114f0 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
11500 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
11510 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
11520 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
11530 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74  into *piNow.** t
11540 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
11550 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75  and date as a Ju
11560 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20  lian Day number 
11570 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30  times 86_400_000
11580 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77  .  In.** other w
11590 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f  ords, write into
115a0 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62   *piNow the numb
115b0 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
115c0 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c  ds since the Jul
115d0 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20  ian.** epoch of 
115e0 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63  noon in Greenwic
115f0 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34  h on November 24
11600 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72  , 4714 B.C accor
11610 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70  ding to the.** p
11620 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69  roleptic Gregori
11630 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a  an calendar..**.
11640 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72  ** On success, r
11650 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e  eturn 0.  Return
11660 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61   1 if the time a
11670 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62  nd date cannot b
11680 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
11690 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e  ic int winCurren
116a0 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74  tTimeInt64(sqlit
116b0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73 71  e3_vfs *pVfs, sq
116c0 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e  lite3_int64 *piN
116d0 6f 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49  ow){.  /* FILETI
116e0 4d 45 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ME structure is 
116f0 61 20 36 34 2d 62 69 74 20 76 61 6c 75 65 20 72  a 64-bit value r
11700 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
11710 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20 20 20 20  number of .     
11720 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69  100-nanosecond i
11730 6e 74 65 72 76 61 6c 73 20 73 69 6e 63 65 20 4a  ntervals since J
11740 61 6e 75 61 72 79 20 31 2c 20 31 36 30 31 20 28  anuary 1, 1601 (
11750 3d 20 4a 44 20 32 33 30 35 38 31 33 2e 35 29 2e  = JD 2305813.5).
11760 20 0a 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d   .  */.  FILETIM
11770 45 20 66 74 3b 0a 20 20 73 74 61 74 69 63 20 63  E ft;.  static c
11780 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74  onst sqlite3_int
11790 36 34 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70  64 winFiletimeEp
117a0 6f 63 68 20 3d 20 32 33 30 35 38 31 33 35 2a 28  och = 23058135*(
117b0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36  sqlite3_int64)86
117c0 34 30 30 30 30 3b 0a 23 69 66 64 65 66 20 53 51  40000;.#ifdef SQ
117d0 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 74 61 74  LITE_TEST.  stat
117e0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
117f0 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68  _int64 unixEpoch
11800 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c   = 24405875*(sql
11810 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30  ite3_int64)86400
11820 30 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20  00;.#endif.  /* 
11830 32 5e 33 32 20 2d 20 74 6f 20 61 76 6f 69 64 20  2^32 - to avoid 
11840 75 73 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61  use of LL and wa
11850 72 6e 69 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f  rnings in gcc */
11860 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
11870 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 61  sqlite3_int64 ma
11880 78 33 32 42 69 74 56 61 6c 75 65 20 3d 20 0a 20  x32BitValue = . 
11890 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e       (sqlite3_in
118a0 74 36 34 29 32 30 30 30 30 30 30 30 30 30 20 2b  t64)2000000000 +
118b0 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
118c0 32 30 30 30 30 30 30 30 30 30 20 2b 20 28 73 71  2000000000 + (sq
118d0 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 39 34 39  lite3_int64)2949
118e0 36 37 32 39 36 3b 0a 0a 23 69 66 20 53 51 4c 49  67296;..#if SQLI
118f0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59  TE_OS_WINCE.  SY
11900 53 54 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20  STEMTIME time;. 
11910 20 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26   GetSystemTime(&
11920 74 69 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53  time);.  /* if S
11930 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
11940 69 6d 65 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ime() fails, it 
11950 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f  returns zero. */
11960 0a 20 20 69 66 20 28 21 53 79 73 74 65 6d 54 69  .  if (!SystemTi
11970 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 26 74 69  meToFileTime(&ti
11980 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20 20 72 65  me,&ft)){.    re
11990 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6c 73  turn 1;.  }.#els
119a0 65 0a 20 20 47 65 74 53 79 73 74 65 6d 54 69 6d  e.  GetSystemTim
119b0 65 41 73 46 69 6c 65 54 69 6d 65 28 20 26 66 74  eAsFileTime( &ft
119c0 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70   );.#endif..  *p
119d0 69 4e 6f 77 20 3d 20 77 69 6e 46 69 6c 65 74 69  iNow = winFileti
119e0 6d 65 45 70 6f 63 68 20 2b 0a 20 20 20 20 20 20  meEpoch +.      
119f0 20 20 20 20 20 20 28 28 28 28 73 71 6c 69 74 65        ((((sqlite
11a00 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 48 69 67  3_int64)ft.dwHig
11a10 68 44 61 74 65 54 69 6d 65 29 2a 6d 61 78 33 32  hDateTime)*max32
11a20 42 69 74 56 61 6c 75 65 29 20 2b 20 0a 20 20 20  BitValue) + .   
11a30 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
11a40 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77  ite3_int64)ft.dw
11a50 4c 6f 77 44 61 74 65 54 69 6d 65 29 2f 28 73 71  LowDateTime)/(sq
11a60 6c 69 74 65 33 5f 69 6e 74 36 34 29 31 30 30 30  lite3_int64)1000
11a70 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0;..#ifdef SQLIT
11a80 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c  E_TEST.  if( sql
11a90 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
11aa0 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20  e ){.    *piNow 
11ab0 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  = 1000*(sqlite3_
11ac0 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75  int64)sqlite3_cu
11ad0 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69  rrent_time + uni
11ae0 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64  xEpoch;.  }.#end
11af0 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  if.  UNUSED_PARA
11b00 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72  METER(pVfs);.  r
11b10 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
11b20 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
11b30 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
11b40 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
11b50 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
11b60 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74  the.** current t
11b70 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
11b80 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
11b90 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20  ber into *prNow 
11ba0 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e  and.** return 0.
11bb0 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
11bc0 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  e time and date 
11bd0 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
11be0 0a 2a 2f 0a 69 6e 74 20 77 69 6e 43 75 72 72 65  .*/.int winCurre
11bf0 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76  ntTime(sqlite3_v
11c00 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65  fs *pVfs, double
11c10 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 69 6e 74 20   *prNow){.  int 
11c20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  rc;.  sqlite3_in
11c30 74 36 34 20 69 3b 0a 20 20 72 63 20 3d 20 77 69  t64 i;.  rc = wi
11c40 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  nCurrentTimeInt6
11c50 34 28 70 56 66 73 2c 20 26 69 29 3b 0a 20 20 69  4(pVfs, &i);.  i
11c60 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 2a 70  f( !rc ){.    *p
11c70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30  rNow = i/8640000
11c80 30 2e 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  0.0;.  }.  retur
11c90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
11ca0 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20  he idea is that 
11cb0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f  this function wo
11cc0 72 6b 73 20 6c 69 6b 65 20 61 20 63 6f 6d 62 69  rks like a combi
11cd0 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74  nation of.** Get
11ce0 4c 61 73 74 45 72 72 6f 72 28 29 20 61 6e 64 20  LastError() and 
11cf0 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 28 29 20  FormatMessage() 
11d00 6f 6e 20 77 69 6e 64 6f 77 73 20 28 6f 72 20 65  on windows (or e
11d10 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73 74 72 65  rrno and.** stre
11d20 72 72 6f 72 5f 72 28 29 20 6f 6e 20 75 6e 69 78  rror_r() on unix
11d30 29 2e 20 41 66 74 65 72 20 61 6e 20 65 72 72 6f  ). After an erro
11d40 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79  r is returned by
11d50 20 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e 63 74 69   an OS.** functi
11d60 6f 6e 2c 20 53 51 4c 69 74 65 20 63 61 6c 6c 73  on, SQLite calls
11d70 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
11d80 69 74 68 20 7a 42 75 66 20 70 6f 69 6e 74 69 6e  ith zBuf pointin
11d90 67 20 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72  g to.** a buffer
11da0 20 6f 66 20 6e 42 75 66 20 62 79 74 65 73 2e 20   of nBuf bytes. 
11db0 54 68 65 20 4f 53 20 6c 61 79 65 72 20 73 68 6f  The OS layer sho
11dc0 75 6c 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65  uld populate the
11dd0 0a 2a 2a 20 62 75 66 66 65 72 20 77 69 74 68 20  .** buffer with 
11de0 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
11df0 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 65   UTF-8 encoded e
11e00 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
11e10 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 6c  describing the l
11e20 61 73 74 20 49 4f 20 65 72 72 6f 72 20 74 6f 20  ast IO error to 
11e30 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 77 69  have occurred wi
11e40 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67  thin the calling
11e50 0a 2a 2a 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a  .** thread..**.*
11e60 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6d  * If the error m
11e70 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c 61  essage is too la
11e80 72 67 65 20 66 6f 72 20 74 68 65 20 73 75 70 70  rge for the supp
11e90 6c 69 65 64 20 62 75 66 66 65 72 2c 0a 2a 2a 20  lied buffer,.** 
11ea0 69 74 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  it should be tru
11eb0 6e 63 61 74 65 64 2e 20 54 68 65 20 72 65 74 75  ncated. The retu
11ec0 72 6e 20 76 61 6c 75 65 20 6f 66 20 78 47 65 74  rn value of xGet
11ed0 4c 61 73 74 45 72 72 6f 72 0a 2a 2a 20 69 73 20  LastError.** is 
11ee0 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f  zero if the erro
11ef0 72 20 6d 65 73 73 61 67 65 20 66 69 74 73 20 69  r message fits i
11f00 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72  n the buffer, or
11f10 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68   non-zero.** oth
11f20 65 72 77 69 73 65 20 28 69 66 20 74 68 65 20 6d  erwise (if the m
11f30 65 73 73 61 67 65 20 77 61 73 20 74 72 75 6e 63  essage was trunc
11f40 61 74 65 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65  ated). If non-ze
11f50 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a  ro is returned,.
11f60 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f  ** then it is no
11f70 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 69  t necessary to i
11f80 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 2d 74  nclude the nul-t
11f90 65 72 6d 69 6e 61 74 6f 72 20 63 68 61 72 61 63  erminator charac
11fa0 74 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 75  ter.** in the ou
11fb0 74 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  tput buffer..**.
11fc0 2a 2a 20 4e 6f 74 20 73 75 70 70 6c 79 69 6e 67  ** Not supplying
11fd0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
11fe0 65 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20 61  e will have no a
11ff0 64 76 65 72 73 65 20 65 66 66 65 63 74 0a 2a 2a  dverse effect.**
12000 20 6f 6e 20 53 51 4c 69 74 65 2e 20 49 74 20 69   on SQLite. It i
12010 73 20 66 69 6e 65 20 74 6f 20 68 61 76 65 20 61  s fine to have a
12020 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
12030 20 74 68 61 74 20 6e 65 76 65 72 0a 2a 2a 20 72   that never.** r
12040 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
12050 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20  message:.**.**  
12060 20 69 6e 74 20 78 47 65 74 4c 61 73 74 45 72 72   int xGetLastErr
12070 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
12080 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20  pVfs, int nBuf, 
12090 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20  char *zBuf){.** 
120a0 20 20 20 20 61 73 73 65 72 74 28 7a 42 75 66 5b      assert(zBuf[
120b0 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20 20  0]=='\0');.**   
120c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 20 20    return 0;.**  
120d0 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72   }.**.** However
120e0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6d 65 73   if an error mes
120f0 73 61 67 65 20 69 73 20 73 75 70 70 6c 69 65 64  sage is supplied
12100 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 69 6e 63  , it will be inc
12110 6f 72 70 6f 72 61 74 65 64 0a 2a 2a 20 62 79 20  orporated.** by 
12120 73 71 6c 69 74 65 20 69 6e 74 6f 20 74 68 65 20  sqlite into the 
12130 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 76  error message av
12140 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75  ailable to the u
12150 73 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c  ser using.** sql
12160 69 74 65 33 5f 65 72 72 6d 73 67 28 29 2c 20 70  ite3_errmsg(), p
12170 6f 73 73 69 62 6c 79 20 6d 61 6b 69 6e 67 20 49  ossibly making I
12180 4f 20 65 72 72 6f 72 73 20 65 61 73 69 65 72 20  O errors easier 
12190 74 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a 73 74 61  to debug..*/.sta
121a0 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61  tic int winGetLa
121b0 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  stError(sqlite3_
121c0 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
121d0 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
121e0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
121f0 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65  ETER(pVfs);.  re
12200 74 75 72 6e 20 67 65 74 4c 61 73 74 45 72 72 6f  turn getLastErro
12210 72 4d 73 67 28 6e 42 75 66 2c 20 7a 42 75 66 29  rMsg(nBuf, zBuf)
12220 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  ;.}..../*.** Ini
12230 74 69 61 6c 69 7a 65 20 61 6e 64 20 64 65 69 6e  tialize and dein
12240 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65  itialize the ope
12250 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e  rating system in
12260 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20  terface..*/.int 
12270 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28  sqlite3_os_init(
12280 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
12290 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 56  sqlite3_vfs winV
122a0 66 73 20 3d 20 7b 0a 20 20 20 20 32 2c 20 20 20  fs = {.    2,   
122b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122c0 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
122d0 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c     sizeof(winFil
122e0 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46  e),     /* szOsF
122f0 69 6c 65 20 2a 2f 0a 20 20 20 20 4d 41 58 5f 50  ile */.    MAX_P
12300 41 54 48 2c 20 20 20 20 20 20 20 20 20 20 20 20  ATH,            
12310 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f  /* mxPathname */
12320 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
12330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
12340 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32  xt */.    "win32
12350 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ",             /
12360 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30  * zName */.    0
12370 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12380 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20      /* pAppData 
12390 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20  */.    winOpen, 
123a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
123b0 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44  Open */.    winD
123c0 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20  elete,          
123d0 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20   /* xDelete */. 
123e0 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20     winAccess,   
123f0 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65          /* xAcce
12400 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c  ss */.    winFul
12410 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f  lPathname,     /
12420 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  * xFullPathname 
12430 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e  */.    winDlOpen
12440 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
12450 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69  DlOpen */.    wi
12460 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20  nDlError,       
12470 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a     /* xDlError *
12480 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20  /.    winDlSym, 
12490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
124a0 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44  lSym */.    winD
124b0 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  lClose,         
124c0 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a   /* xDlClose */.
124d0 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73      winRandomnes
124e0 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e  s,       /* xRan
124f0 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77  domness */.    w
12500 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20  inSleep,        
12510 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f      /* xSleep */
12520 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54  .    winCurrentT
12530 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75  ime,      /* xCu
12540 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20  rrentTime */.   
12550 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
12560 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73  ,     /* xGetLas
12570 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 30 2c  tError */.    0,
12580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12590 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2a 2f     /* xRename */
125a0 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54  .    winCurrentT
125b0 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75  imeInt64, /* xCu
125c0 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a  rrentTimeInt64 *
125d0 2f 0a 20 20 7d 3b 0a 0a 20 20 73 71 6c 69 74 65  /.  };..  sqlite
125e0 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
125f0 77 69 6e 56 66 73 2c 20 31 29 3b 0a 20 20 72 65  winVfs, 1);.  re
12600 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
12610 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  .}.int sqlite3_o
12620 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 20 20  s_end(void){ .  
12630 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12640 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ;.}..#endif /* S
12650 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a  QLITE_OS_WIN */.