/ Hex Artifact Content
Login

Artifact 88f372bf093b3257f54d2d7710f00cfcae86fb9d:


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 6e 63 6c  liteInt.h".#incl
01d0: 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 66 20 4f  ude "os.h".#if O
01e0: 53 5f 57 49 4e 20 20 20 20 20 20 20 20 20 20 20  S_WIN           
01f0: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 69 6c 65      /* This file
0200: 20 69 73 20 75 73 65 64 20 66 6f 72 20 77 69 6e   is used for win
0210: 64 6f 77 73 20 6f 6e 6c 79 20 2a 2f 0a 0a 23 69  dows only */..#i
0220: 6e 63 6c 75 64 65 20 3c 77 69 6e 62 61 73 65 2e  nclude <winbase.
0230: 68 3e 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59 47  h>..#ifdef __CYG
0240: 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65 20  WIN__.# include 
0250: 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a 23  <sys/cygwin.h>.#
0260: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63  endif../*.** Mac
0270: 72 6f 73 20 75 73 65 64 20 74 6f 20 64 65 74 65  ros used to dete
0280: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
0290: 20 6e 6f 74 20 74 6f 20 75 73 65 20 74 68 72 65   not to use thre
02a0: 61 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ads..*/.#if defi
02b0: 6e 65 64 28 54 48 52 45 41 44 53 41 46 45 29 20  ned(THREADSAFE) 
02c0: 26 26 20 54 48 52 45 41 44 53 41 46 45 0a 23 20  && THREADSAFE.# 
02d0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 33  define SQLITE_W3
02e0: 32 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64  2_THREADS 1.#end
02f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64  if../*.** Includ
0300: 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63  e code that is c
0310: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f  ommon to all os_
0320: 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e  *.c files.*/.#in
0330: 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e  clude "os_common
0340: 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  .h"../*.** Deter
0350: 6d 69 6e 65 20 69 66 20 77 65 20 61 72 65 20 64  mine if we are d
0360: 65 61 6c 69 6e 67 20 77 69 74 68 20 57 69 6e 64  ealing with Wind
0370: 6f 77 73 43 45 20 2d 20 77 68 69 63 68 20 68 61  owsCE - which ha
0380: 73 20 61 20 6d 75 63 68 0a 2a 2a 20 72 65 64 75  s a much.** redu
0390: 63 65 64 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 20  ced API..*/.#if 
03a0: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57  defined(_WIN32_W
03b0: 43 45 29 0a 23 20 64 65 66 69 6e 65 20 4f 53 5f  CE).# define OS_
03c0: 57 49 4e 43 45 20 31 0a 23 65 6c 73 65 0a 23 20  WINCE 1.#else.# 
03d0: 64 65 66 69 6e 65 20 4f 53 5f 57 49 4e 43 45 20  define OS_WINCE 
03e0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
03f0: 54 68 65 20 77 69 6e 46 69 6c 65 20 73 74 72 75  The winFile stru
0400: 63 74 75 72 65 20 69 73 20 61 20 73 75 62 63 6c  cture is a subcl
0410: 61 73 73 20 6f 66 20 4f 73 46 69 6c 65 20 73 70  ass of OsFile sp
0420: 65 63 69 66 69 63 20 74 6f 20 74 68 65 20 77 69  ecific to the wi
0430: 6e 33 32 0a 2a 2a 20 70 6f 72 74 61 62 69 6c 69  n32.** portabili
0440: 74 79 20 6c 61 79 65 72 2e 0a 2a 2f 0a 74 79 70  ty layer..*/.typ
0450: 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 46  edef struct winF
0460: 69 6c 65 20 77 69 6e 46 69 6c 65 3b 0a 73 74 72  ile winFile;.str
0470: 75 63 74 20 77 69 6e 46 69 6c 65 20 7b 0a 20 20  uct winFile {.  
0480: 49 6f 4d 65 74 68 6f 64 20 63 6f 6e 73 74 20 2a  IoMethod const *
0490: 70 4d 65 74 68 6f 64 3b 2f 2a 20 4d 75 73 74 20  pMethod;/* Must 
04a0: 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 48 41  be first */.  HA
04b0: 4e 44 4c 45 20 68 3b 20 20 20 20 20 20 20 20 20  NDLE h;         
04c0: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
04d0: 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 74 68  for accessing th
04e0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 73 69  e file */.  unsi
04f0: 67 6e 65 64 20 63 68 61 72 20 6c 6f 63 6b 74 79  gned char lockty
0500: 70 65 3b 20 2f 2a 20 54 79 70 65 20 6f 66 20 6c  pe; /* Type of l
0510: 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 68 65  ock currently he
0520: 6c 64 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20  ld on this file 
0530: 2a 2f 0a 20 20 73 68 6f 72 74 20 73 68 61 72 65  */.  short share
0540: 64 4c 6f 63 6b 42 79 74 65 3b 20 20 20 2f 2a 20  dLockByte;   /* 
0550: 52 61 6e 64 6f 6d 6c 79 20 63 68 6f 73 65 6e 20  Randomly chosen 
0560: 62 79 74 65 20 75 73 65 64 20 61 73 20 61 20 73  byte used as a s
0570: 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 69  hared lock */.#i
0580: 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20 57 43 48  f OS_WINCE.  WCH
0590: 41 52 20 2a 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  AR *zDeleteOnClo
05a0: 73 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  se;   /* Name of
05b0: 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20   file to delete 
05c0: 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a  when closing */.
05d0: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a  #endif.};.../*.*
05e0: 2a 20 44 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65  * Do not include
05f0: 20 61 6e 79 20 6f 66 20 74 68 65 20 46 69 6c 65   any of the File
0600: 20 49 2f 4f 20 69 6e 74 65 72 66 61 63 65 20 70   I/O interface p
0610: 72 6f 63 65 64 75 72 65 73 20 69 66 20 74 68 65  rocedures if the
0620: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  .** SQLITE_OMIT_
0630: 44 49 53 4b 49 4f 20 6d 61 63 72 6f 20 69 73 20  DISKIO macro is 
0640: 64 65 66 69 6e 65 64 20 28 69 6e 64 69 63 61 74  defined (indicat
0650: 69 6e 67 20 74 68 61 74 20 74 68 65 72 65 20 64  ing that there d
0660: 61 74 61 62 61 73 65 0a 2a 2a 20 77 69 6c 6c 20  atabase.** will 
0670: 62 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c  be in-memory onl
0680: 79 29 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  y).*/.#ifndef SQ
0690: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
06a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
06b0: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69  owing variable i
06c0: 73 20 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65 74  s (normally) set
06d0: 20 6f 6e 63 65 20 61 6e 64 20 6e 65 76 65 72 20   once and never 
06e0: 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72 65  changes.** there
06f0: 61 66 74 65 72 2e 20 20 49 74 20 72 65 63 6f 72  after.  It recor
0700: 64 73 20 77 68 65 74 68 65 72 20 74 68 65 20 6f  ds whether the o
0710: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
0720: 69 73 20 57 69 6e 39 35 0a 2a 2a 20 6f 72 20 57  is Win95.** or W
0730: 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20  inNT..**.** 0:  
0740: 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   Operating syste
0750: 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a  m unknown..** 1:
0760: 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73     Operating sys
0770: 74 65 6d 20 69 73 20 57 69 6e 39 35 2e 0a 2a 2a  tem is Win95..**
0780: 20 32 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20   2:   Operating 
0790: 73 79 73 74 65 6d 20 69 73 20 57 69 6e 4e 54 2e  system is WinNT.
07a0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20  .**.** In order 
07b0: 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 65  to facilitate te
07c0: 73 74 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e 54  sting on a WinNT
07d0: 20 73 79 73 74 65 6d 2c 20 74 68 65 20 74 65 73   system, the tes
07e0: 74 20 66 69 78 74 75 72 65 0a 2a 2a 20 63 61 6e  t fixture.** can
07f0: 20 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20 74 68   manually set th
0800: 69 73 20 76 61 6c 75 65 20 74 6f 20 31 20 74 6f  is value to 1 to
0810: 20 65 6d 75 6c 61 74 65 20 57 69 6e 39 38 20 62   emulate Win98 b
0820: 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20  ehavior..*/.int 
0830: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20  sqlite3_os_type 
0840: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  = 0;../*.** Retu
0850: 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72  rn true (non-zer
0860: 6f 29 20 69 66 20 77 65 20 61 72 65 20 72 75 6e  o) if we are run
0870: 6e 69 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e 54  ning under WinNT
0880: 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a  , Win2K, WinXP,.
0890: 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20 20 52 65  ** or WinCE.  Re
08a0: 74 75 72 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f  turn false (zero
08b0: 29 20 66 6f 72 20 57 69 6e 39 35 2c 20 57 69 6e  ) for Win95, Win
08c0: 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a  98, or WinME..**
08d0: 0a 2a 2a 20 48 65 72 65 20 69 73 20 61 6e 20 69  .** Here is an i
08e0: 6e 74 65 72 65 73 74 69 6e 67 20 6f 62 73 65 72  nteresting obser
08f0: 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c 20  vation:  Win95, 
0900: 57 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d 45  Win98, and WinME
0910: 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63   lack.** the Loc
0920: 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 20 20  kFileEx() API.  
0930: 42 75 74 20 77 65 20 63 61 6e 20 73 74 69 6c 6c  But we can still
0940: 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b   statically link
0950: 20 61 67 61 69 6e 73 74 20 74 68 61 74 0a 2a 2a   against that.**
0960: 20 41 50 49 20 61 73 20 6c 6f 6e 67 20 61 73 20   API as long as 
0970: 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69 74  we don't call it
0980: 20 77 69 6e 20 72 75 6e 6e 69 6e 67 20 57 69 6e   win running Win
0990: 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61 6c  95/98/ME.  A cal
09a0: 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75  l to.** this rou
09b0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
09c0: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
09d0: 20 68 6f 73 74 20 69 73 20 57 69 6e 39 35 2f 39   host is Win95/9
09e0: 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54  8/ME or.** WinNT
09f0: 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61 74 20 77  /2K/XP so that w
0a00: 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 74  e will know whet
0a10: 68 65 72 20 6f 72 20 6e 6f 74 20 77 65 20 63 61  her or not we ca
0a20: 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a  n safely call.**
0a30: 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28   the LockFileEx(
0a40: 29 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 20 4f 53  ) API..*/.#if OS
0a50: 5f 57 49 4e 43 45 0a 23 20 64 65 66 69 6e 65 20  _WINCE.# define 
0a60: 69 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 73  isNT()  (1).#els
0a70: 65 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 69  e.  static int i
0a80: 73 4e 54 28 76 6f 69 64 29 7b 0a 20 20 20 20 69  sNT(void){.    i
0a90: 66 28 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  f( sqlite3_os_ty
0aa0: 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f  pe==0 ){.      O
0ab0: 53 56 45 52 53 49 4f 4e 49 4e 46 4f 20 73 49 6e  SVERSIONINFO sIn
0ac0: 66 6f 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f 2e  fo;.      sInfo.
0ad0: 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53  dwOSVersionInfoS
0ae0: 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e  ize = sizeof(sIn
0af0: 66 6f 29 3b 0a 20 20 20 20 20 20 47 65 74 56 65  fo);.      GetVe
0b00: 72 73 69 6f 6e 45 78 28 26 73 49 6e 66 6f 29 3b  rsionEx(&sInfo);
0b10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f  .      sqlite3_o
0b20: 73 5f 74 79 70 65 20 3d 20 73 49 6e 66 6f 2e 64  s_type = sInfo.d
0b30: 77 50 6c 61 74 66 6f 72 6d 49 64 3d 3d 56 45 52  wPlatformId==VER
0b40: 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f  _PLATFORM_WIN32_
0b50: 4e 54 20 3f 20 32 20 3a 20 31 3b 0a 20 20 20 20  NT ? 2 : 1;.    
0b60: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  }.    return sql
0b70: 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 3b  ite3_os_type==2;
0b80: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  .  }.#endif /* O
0b90: 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 23 69 66 20  S_WINCE */..#if 
0ba0: 4f 53 5f 57 49 4e 43 45 0a 2f 2a 0a 2a 2a 20 57  OS_WINCE./*.** W
0bb0: 69 6e 64 6f 77 73 43 45 20 64 6f 65 73 20 6e 6f  indowsCE does no
0bc0: 74 20 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69  t have a localti
0bd0: 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  me() function.  
0be0: 53 6f 20 63 72 65 61 74 65 20 61 0a 2a 2a 20 73  So create a.** s
0bf0: 75 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69  ubstitute..*/.#i
0c00: 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a  nclude <time.h>.
0c10: 73 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65  struct tm *__cde
0c20: 63 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e  cl localtime(con
0c30: 73 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a  st time_t *t).{.
0c40: 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
0c50: 74 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45  tm y;.  FILETIME
0c60: 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53   uTm, lTm;.  SYS
0c70: 54 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 69  TEMTIME pTm;.  i
0c80: 36 34 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20  64 t64;.  t64 = 
0c90: 2a 74 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34  *t;.  t64 = (t64
0ca0: 20 2b 20 31 31 36 34 34 34 37 33 36 30 30 29 2a   + 11644473600)*
0cb0: 31 30 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e  10000000;.  uTm.
0cc0: 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20  dwLowDateTime = 
0cd0: 74 36 34 20 26 20 30 78 46 46 46 46 46 46 46 46  t64 & 0xFFFFFFFF
0ce0: 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68 44 61  ;.  uTm.dwHighDa
0cf0: 74 65 54 69 6d 65 3d 20 74 36 34 20 3e 3e 20 33  teTime= t64 >> 3
0d00: 32 3b 0a 20 20 46 69 6c 65 54 69 6d 65 54 6f 4c  2;.  FileTimeToL
0d10: 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28 26 75 54  ocalFileTime(&uT
0d20: 6d 2c 26 6c 54 6d 29 3b 0a 20 20 46 69 6c 65 54  m,&lTm);.  FileT
0d30: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28  imeToSystemTime(
0d40: 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e  &lTm,&pTm);.  y.
0d50: 74 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59  tm_year = pTm.wY
0d60: 65 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e  ear - 1900;.  y.
0d70: 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f  tm_mon = pTm.wMo
0d80: 6e 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f  nth - 1;.  y.tm_
0d90: 77 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f  wday = pTm.wDayO
0da0: 66 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64  fWeek;.  y.tm_md
0db0: 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20  ay = pTm.wDay;. 
0dc0: 20 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d   y.tm_hour = pTm
0dd0: 2e 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d  .wHour;.  y.tm_m
0de0: 69 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65  in = pTm.wMinute
0df0: 3b 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70  ;.  y.tm_sec = p
0e00: 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65  Tm.wSecond;.  re
0e10: 74 75 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69  turn &y;.}.#endi
0e20: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65  f../*.** Compile
0e30: 20 77 69 74 68 20 2d 44 53 51 4c 49 54 45 5f 4f   with -DSQLITE_O
0e40: 4d 49 54 5f 57 49 4e 5f 4c 4f 43 4b 53 20 74 6f  MIT_WIN_LOCKS to
0e50: 20 64 69 73 61 62 6c 65 20 66 69 6c 65 20 6c 6f   disable file lo
0e60: 63 6b 69 6e 67 20 6f 6e 0a 2a 2a 20 77 69 6e 64  cking on.** wind
0e70: 6f 77 73 2e 20 20 49 66 20 79 6f 75 20 64 6f 20  ows.  If you do 
0e80: 74 68 69 73 20 61 6e 64 20 74 77 6f 20 6f 72 20  this and two or 
0e90: 6d 6f 72 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  more connections
0ea0: 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 77   attempt to.** w
0eb0: 72 69 74 65 20 74 68 65 20 64 61 74 61 62 61 73  rite the databas
0ec0: 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  e at the same ti
0ed0: 6d 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  me, the database
0ee0: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 0a 2a 2a   file will be.**
0ef0: 20 63 6f 72 72 75 70 74 65 64 2e 20 20 42 75 74   corrupted.  But
0f00: 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
0f10: 66 20 57 69 6e 64 6f 77 73 43 45 20 64 6f 20 6e  f WindowsCE do n
0f20: 6f 74 20 73 75 70 70 6f 72 74 20 6c 6f 63 6b 69  ot support locki
0f30: 6e 67 2c 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20  ng,.** in which 
0f40: 63 61 73 65 20 63 6f 6d 70 69 6c 69 6e 67 20 77  case compiling w
0f50: 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 20  ith this option 
0f60: 69 73 20 72 65 71 75 69 72 65 64 20 6a 75 73 74  is required just
0f70: 20 74 6f 20 67 65 74 0a 2a 2a 20 69 74 20 74 6f   to get.** it to
0f80: 20 77 6f 72 6b 20 61 74 20 61 6c 6c 2e 0a 2a 2f   work at all..*/
0f90: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
0fa0: 4d 49 54 5f 57 49 4e 5f 4c 4f 43 4b 53 0a 23 20  MIT_WIN_LOCKS.# 
0fb0: 64 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 28  define LockFile(
0fc0: 61 2c 62 2c 63 2c 64 2c 65 29 20 28 31 29 0a 23  a,b,c,d,e) (1).#
0fd0: 20 64 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65   define LockFile
0fe0: 45 78 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20  Ex(a,b,c,d,e,f) 
0ff0: 28 31 29 0a 23 20 64 65 66 69 6e 65 20 55 6e 6c  (1).# define Unl
1000: 6f 63 6b 46 69 6c 65 28 61 2c 62 2c 63 2c 64 2c  ockFile(a,b,c,d,
1010: 65 29 20 28 31 29 0a 23 20 64 65 66 69 6e 65 20  e) (1).# define 
1020: 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 61 2c 62  UnlockFileEx(a,b
1030: 2c 63 2c 64 2c 65 29 20 28 31 29 0a 23 65 6e 64  ,c,d,e) (1).#end
1040: 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  if../*.** Conver
1050: 74 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67  t a UTF-8 string
1060: 20 74 6f 20 55 54 46 2d 33 32 2e 20 20 53 70 61   to UTF-32.  Spa
1070: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
1080: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a  eturned string.*
1090: 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  * is obtained fr
10a0: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 2e  om sqliteMalloc.
10b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 57 43 48 41 52  .*/.static WCHAR
10c0: 20 2a 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28   *utf8ToUnicode(
10d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
10e0: 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42  ename){.  int nB
10f0: 79 74 65 3b 0a 20 20 57 43 48 41 52 20 2a 7a 57  yte;.  WCHAR *zW
1100: 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20  ideFilename;..  
1110: 69 66 28 20 21 69 73 4e 54 28 29 20 29 7b 0a 20  if( !isNT() ){. 
1120: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1130: 0a 20 20 6e 42 79 74 65 20 3d 20 4d 75 6c 74 69  .  nByte = Multi
1140: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43  ByteToWideChar(C
1150: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65  P_UTF8, 0, zFile
1160: 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20  name, -1, NULL, 
1170: 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29  0)*sizeof(WCHAR)
1180: 3b 0a 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  ;.  zWideFilenam
1190: 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  e = sqliteMalloc
11a0: 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a  ( nByte*sizeof(z
11b0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d 29  WideFilename[0])
11c0: 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 46   );.  if( zWideF
11d0: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
11e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
11f0: 20 20 6e 42 79 74 65 20 3d 20 4d 75 6c 74 69 42    nByte = MultiB
1200: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50  yteToWideChar(CP
1210: 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e  _UTF8, 0, zFilen
1220: 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64 65 46 69  ame, -1, zWideFi
1230: 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65 29 3b 0a  lename, nByte);.
1240: 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29    if( nByte==0 )
1250: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
1260: 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b  (zWideFilename);
1270: 0a 20 20 20 20 7a 57 69 64 65 46 69 6c 65 6e 61  .    zWideFilena
1280: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
1290: 74 75 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61  turn zWideFilena
12a0: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  me;.}../*.** Con
12b0: 76 65 72 74 20 55 54 46 2d 33 32 20 74 6f 20 55  vert UTF-32 to U
12c0: 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20  TF-8.  Space to 
12d0: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
12e0: 64 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f  d string is.** o
12f0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
1300: 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  iteMalloc()..*/.
1310: 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 6e 69  static char *uni
1320: 63 6f 64 65 54 6f 55 74 66 38 28 63 6f 6e 73 74  codeToUtf8(const
1330: 20 57 43 48 41 52 20 2a 7a 57 69 64 65 46 69 6c   WCHAR *zWideFil
1340: 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42  ename){.  int nB
1350: 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69  yte;.  char *zFi
1360: 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 42 79 74 65  lename;..  nByte
1370: 20 3d 20 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   = WideCharToMul
1380: 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20  tiByte(CP_UTF8, 
1390: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
13a0: 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  , -1, 0, 0, 0, 0
13b0: 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  );.  zFilename =
13c0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e   sqliteMalloc( n
13d0: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46  Byte );.  if( zF
13e0: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
13f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1400: 20 20 6e 42 79 74 65 20 3d 20 57 69 64 65 43 68    nByte = WideCh
1410: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50  arToMultiByte(CP
1420: 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46  _UTF8, 0, zWideF
1430: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69  ilename, -1, zFi
1440: 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a 20  lename, nByte,. 
1450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1460: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
1470: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
1480: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  == 0 ){.    sqli
1490: 74 65 46 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65  teFree(zFilename
14a0: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
14b0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
14c0: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  rn zFilename;.}.
14d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
14e0: 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 0a 2a 2f  he named file.*/
14f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 44  .int sqlite3WinD
1500: 65 6c 65 74 65 28 63 6f 6e 73 74 20 63 68 61 72  elete(const char
1510: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
1520: 57 43 48 41 52 20 2a 7a 57 69 64 65 20 3d 20 75  WCHAR *zWide = u
1530: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
1540: 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
1550: 57 69 64 65 20 29 7b 0a 20 20 20 20 44 65 6c 65  Wide ){.    Dele
1560: 74 65 46 69 6c 65 57 28 7a 57 69 64 65 29 3b 0a  teFileW(zWide);.
1570: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
1580: 57 69 64 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Wide);.  }else{.
1590: 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20 20  #if OS_WINCE.   
15a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
15b0: 4f 4d 45 4d 3b 0a 23 65 6c 73 65 0a 20 20 20 20  OMEM;.#else.    
15c0: 44 65 6c 65 74 65 46 69 6c 65 41 28 7a 46 69 6c  DeleteFileA(zFil
15d0: 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20  ename);.#endif. 
15e0: 20 7d 0a 20 20 54 52 41 43 45 32 28 22 44 45 4c   }.  TRACE2("DEL
15f0: 45 54 45 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a  ETE \"%s\"\n", z
1600: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74  Filename);.  ret
1610: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1620: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
1630: 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65 64  RUE if the named
1640: 20 66 69 6c 65 20 65 78 69 73 74 73 2e 0a 2a 2f   file exists..*/
1650: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 46  .int sqlite3WinF
1660: 69 6c 65 45 78 69 73 74 73 28 63 6f 6e 73 74 20  ileExists(const 
1670: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
1680: 7b 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d  {.  int exists =
1690: 20 30 3b 0a 20 20 57 43 48 41 52 20 2a 7a 57 69   0;.  WCHAR *zWi
16a0: 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f  de = utf8ToUnico
16b0: 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
16c0: 20 69 66 28 20 7a 57 69 64 65 20 29 7b 0a 20 20   if( zWide ){.  
16d0: 20 20 65 78 69 73 74 73 20 3d 20 47 65 74 46 69    exists = GetFi
16e0: 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 7a 57  leAttributesW(zW
16f0: 69 64 65 29 20 21 3d 20 30 78 66 66 66 66 66 66  ide) != 0xffffff
1700: 66 66 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  ff;.    sqliteFr
1710: 65 65 28 7a 57 69 64 65 29 3b 0a 20 20 7d 65 6c  ee(zWide);.  }el
1720: 73 65 7b 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45  se{.#if OS_WINCE
1730: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1740: 54 45 5f 4e 4f 4d 45 4d 3b 0a 23 65 6c 73 65 0a  TE_NOMEM;.#else.
1750: 20 20 20 20 65 78 69 73 74 73 20 3d 20 47 65 74      exists = Get
1760: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28  FileAttributesA(
1770: 7a 46 69 6c 65 6e 61 6d 65 29 20 21 3d 20 30 78  zFilename) != 0x
1780: 66 66 66 66 66 66 66 66 3b 0a 23 65 6e 64 69 66  ffffffff;.#endif
1790: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 78  .  }.  return ex
17a0: 69 73 74 73 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  ists;.}../* Forw
17b0: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
17c0: 2a 2f 0a 69 6e 74 20 61 6c 6c 6f 63 61 74 65 57  */.int allocateW
17d0: 69 6e 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a  inFile(winFile *
17e0: 70 49 6e 69 74 2c 20 4f 73 46 69 6c 65 20 2a 2a  pInit, OsFile **
17f0: 70 49 64 29 3b 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  pId);../*.** Att
1800: 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 66  empt to open a f
1810: 69 6c 65 20 66 6f 72 20 62 6f 74 68 20 72 65 61  ile for both rea
1820: 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67  ding and writing
1830: 2e 20 20 49 66 20 74 68 61 74 0a 2a 2a 20 66 61  .  If that.** fa
1840: 69 6c 73 2c 20 74 72 79 20 6f 70 65 6e 69 6e 67  ils, try opening
1850: 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20   it read-only.  
1860: 49 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  If the file does
1870: 20 6e 6f 74 20 65 78 69 73 74 2c 0a 2a 2a 20 74   not exist,.** t
1880: 72 79 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e  ry to create it.
1890: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
18a0: 73 2c 20 61 20 68 61 6e 64 6c 65 20 66 6f 72 20  s, a handle for 
18b0: 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 69 73  the open file is
18c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 69 64 0a   written to *id.
18d0: 2a 2a 20 61 6e 64 20 2a 70 52 65 61 64 6f 6e 6c  ** and *pReadonl
18e0: 79 20 69 73 20 73 65 74 20 74 6f 20 30 20 69 66  y is set to 0 if
18f0: 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 6f 70   the file was op
1900: 65 6e 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67  ened for reading
1910: 20 61 6e 64 0a 2a 2a 20 77 72 69 74 69 6e 67 20   and.** writing 
1920: 6f 72 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  or 1 if the file
1930: 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64   was opened read
1940: 2d 6f 6e 6c 79 2e 20 20 54 68 65 20 66 75 6e 63  -only.  The func
1950: 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20  tion returns.** 
1960: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
1970: 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68 65   On failure, the
1980: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1990: 73 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  s SQLITE_CANTOPE
19a0: 4e 20 61 6e 64 20 6c 65 61 76 65 73 0a 2a 2a 20  N and leaves.** 
19b0: 2a 69 64 20 61 6e 64 20 2a 70 52 65 61 64 6f 6e  *id and *pReadon
19c0: 6c 79 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  ly unchanged..*/
19d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 4f  .int sqlite3WinO
19e0: 70 65 6e 52 65 61 64 57 72 69 74 65 28 0a 20 20  penReadWrite(.  
19f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1a00: 65 6e 61 6d 65 2c 0a 20 20 4f 73 46 69 6c 65 20  ename,.  OsFile 
1a10: 2a 2a 70 49 64 2c 0a 20 20 69 6e 74 20 2a 70 52  **pId,.  int *pR
1a20: 65 61 64 6f 6e 6c 79 0a 29 7b 0a 20 20 77 69 6e  eadonly.){.  win
1a30: 46 69 6c 65 20 66 3b 0a 20 20 48 41 4e 44 4c 45  File f;.  HANDLE
1a40: 20 68 3b 0a 20 20 57 43 48 41 52 20 2a 7a 57 69   h;.  WCHAR *zWi
1a50: 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f  de = utf8ToUnico
1a60: 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
1a70: 20 61 73 73 65 72 74 28 20 2a 70 49 64 3d 3d 30   assert( *pId==0
1a80: 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 20   );.  if( zWide 
1a90: 29 7b 0a 20 20 20 20 68 20 3d 20 43 72 65 61 74  ){.    h = Creat
1aa0: 65 46 69 6c 65 57 28 7a 57 69 64 65 2c 0a 20 20  eFileW(zWide,.  
1ab0: 20 20 20 20 20 47 45 4e 45 52 49 43 5f 52 45 41       GENERIC_REA
1ac0: 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54  D | GENERIC_WRIT
1ad0: 45 2c 0a 20 20 20 20 20 20 20 46 49 4c 45 5f 53  E,.       FILE_S
1ae0: 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45  HARE_READ | FILE
1af0: 5f 53 48 41 52 45 5f 57 52 49 54 45 2c 0a 20 20  _SHARE_WRITE,.  
1b00: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20       NULL,.     
1b10: 20 20 4f 50 45 4e 5f 41 4c 57 41 59 53 2c 0a 20    OPEN_ALWAYS,. 
1b20: 20 20 20 20 20 20 46 49 4c 45 5f 41 54 54 52 49        FILE_ATTRI
1b30: 42 55 54 45 5f 4e 4f 52 4d 41 4c 20 7c 20 46 49  BUTE_NORMAL | FI
1b40: 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41  LE_FLAG_RANDOM_A
1b50: 43 43 45 53 53 2c 0a 20 20 20 20 20 20 20 4e 55  CCESS,.       NU
1b60: 4c 4c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  LL.    );.    if
1b70: 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  ( h==INVALID_HAN
1b80: 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20  DLE_VALUE ){.   
1b90: 20 20 20 68 20 3d 20 43 72 65 61 74 65 46 69 6c     h = CreateFil
1ba0: 65 57 28 7a 57 69 64 65 2c 0a 20 20 20 20 20 20  eW(zWide,.      
1bb0: 20 20 20 47 45 4e 45 52 49 43 5f 52 45 41 44 2c     GENERIC_READ,
1bc0: 0a 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 53  .         FILE_S
1bd0: 48 41 52 45 5f 52 45 41 44 2c 0a 20 20 20 20 20  HARE_READ,.     
1be0: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
1bf0: 20 20 20 4f 50 45 4e 5f 41 4c 57 41 59 53 2c 0a     OPEN_ALWAYS,.
1c00: 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 41 54           FILE_AT
1c10: 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 20 7c  TRIBUTE_NORMAL |
1c20: 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f   FILE_FLAG_RANDO
1c30: 4d 5f 41 43 43 45 53 53 2c 0a 20 20 20 20 20 20  M_ACCESS,.      
1c40: 20 20 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b     NULL.      );
1c50: 0a 20 20 20 20 20 20 69 66 28 20 68 3d 3d 49 4e  .      if( h==IN
1c60: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
1c70: 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  UE ){.        sq
1c80: 6c 69 74 65 46 72 65 65 28 7a 57 69 64 65 29 3b  liteFree(zWide);
1c90: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1ca0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
1cb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
1cc0: 70 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20  pReadonly = 1;. 
1cd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ce0: 2a 70 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a  *pReadonly = 0;.
1cf0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1d00: 46 72 65 65 28 7a 57 69 64 65 29 3b 0a 20 20 7d  Free(zWide);.  }
1d10: 65 6c 73 65 7b 0a 23 69 66 20 4f 53 5f 57 49 4e  else{.#if OS_WIN
1d20: 43 45 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  CE.    return SQ
1d30: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 23 65 6c 73  LITE_NOMEM;.#els
1d40: 65 0a 20 20 20 20 68 20 3d 20 43 72 65 61 74 65  e.    h = Create
1d50: 46 69 6c 65 41 28 7a 46 69 6c 65 6e 61 6d 65 2c  FileA(zFilename,
1d60: 0a 20 20 20 20 20 20 20 47 45 4e 45 52 49 43 5f  .       GENERIC_
1d70: 52 45 41 44 20 7c 20 47 45 4e 45 52 49 43 5f 57  READ | GENERIC_W
1d80: 52 49 54 45 2c 0a 20 20 20 20 20 20 20 46 49 4c  RITE,.       FIL
1d90: 45 5f 53 48 41 52 45 5f 52 45 41 44 20 7c 20 46  E_SHARE_READ | F
1da0: 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45 2c  ILE_SHARE_WRITE,
1db0: 0a 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20  .       NULL,.  
1dc0: 20 20 20 20 20 4f 50 45 4e 5f 41 4c 57 41 59 53       OPEN_ALWAYS
1dd0: 2c 0a 20 20 20 20 20 20 20 46 49 4c 45 5f 41 54  ,.       FILE_AT
1de0: 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 20 7c  TRIBUTE_NORMAL |
1df0: 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f   FILE_FLAG_RANDO
1e00: 4d 5f 41 43 43 45 53 53 2c 0a 20 20 20 20 20 20  M_ACCESS,.      
1e10: 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 20 20 20   NULL.    );.   
1e20: 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f   if( h==INVALID_
1e30: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a  HANDLE_VALUE ){.
1e40: 20 20 20 20 20 20 68 20 3d 20 43 72 65 61 74 65        h = Create
1e50: 46 69 6c 65 41 28 7a 46 69 6c 65 6e 61 6d 65 2c  FileA(zFilename,
1e60: 0a 20 20 20 20 20 20 20 20 20 47 45 4e 45 52 49  .         GENERI
1e70: 43 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20  C_READ,.        
1e80: 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44   FILE_SHARE_READ
1e90: 2c 0a 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c  ,.         NULL,
1ea0: 0a 20 20 20 20 20 20 20 20 20 4f 50 45 4e 5f 41  .         OPEN_A
1eb0: 4c 57 41 59 53 2c 0a 20 20 20 20 20 20 20 20 20  LWAYS,.         
1ec0: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e  FILE_ATTRIBUTE_N
1ed0: 4f 52 4d 41 4c 20 7c 20 46 49 4c 45 5f 46 4c 41  ORMAL | FILE_FLA
1ee0: 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 2c  G_RANDOM_ACCESS,
1ef0: 0a 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20  .         NULL. 
1f00: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
1f10: 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  ( h==INVALID_HAN
1f20: 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20  DLE_VALUE ){.   
1f30: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1f40: 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20  TE_CANTOPEN;.   
1f50: 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 52 65 61     }.      *pRea
1f60: 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d  donly = 1;.    }
1f70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 65  else{.      *pRe
1f80: 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20  adonly = 0;.    
1f90: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 57  }.#endif /* OS_W
1fa0: 49 4e 43 45 20 2a 2f 0a 20 20 7d 0a 20 20 66 2e  INCE */.  }.  f.
1fb0: 68 20 3d 20 68 3b 0a 20 20 66 2e 6c 6f 63 6b 74  h = h;.  f.lockt
1fc0: 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ype = NO_LOCK;. 
1fd0: 20 66 2e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74   f.sharedLockByt
1fe0: 65 20 3d 20 30 3b 0a 20 20 54 52 41 43 45 33 28  e = 0;.  TRACE3(
1ff0: 22 4f 50 45 4e 20 52 2f 57 20 25 64 20 5c 22 25  "OPEN R/W %d \"%
2000: 73 5c 22 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65  s\"\n", h, zFile
2010: 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  name);.  return 
2020: 61 6c 6c 6f 63 61 74 65 57 69 6e 46 69 6c 65 28  allocateWinFile(
2030: 26 66 2c 20 70 49 64 29 3b 0a 7d 0a 0a 0a 2f 2a  &f, pId);.}.../*
2040: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f  .** Attempt to o
2050: 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 20 66  pen a new file f
2060: 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  or exclusive acc
2070: 65 73 73 20 62 79 20 74 68 69 73 20 70 72 6f 63  ess by this proc
2080: 65 73 73 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ess..** The file
2090: 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20   will be opened 
20a0: 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67  for both reading
20b0: 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 20 20 54   and writing.  T
20c0: 6f 20 61 76 6f 69 64 0a 2a 2a 20 61 20 70 6f 74  o avoid.** a pot
20d0: 65 6e 74 69 61 6c 20 73 65 63 75 72 69 74 79 20  ential security 
20e0: 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 6f 20 6e  problem, we do n
20f0: 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 66 69 6c  ot allow the fil
2100: 65 20 74 6f 20 68 61 76 65 0a 2a 2a 20 70 72 65  e to have.** pre
2110: 76 69 6f 75 73 6c 79 20 65 78 69 73 74 65 64 2e  viously existed.
2120: 20 20 4e 6f 72 20 64 6f 20 77 65 20 61 6c 6c 6f    Nor do we allo
2130: 77 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  w the file to be
2140: 20 61 20 73 79 6d 62 6f 6c 69 63 0a 2a 2a 20 6c   a symbolic.** l
2150: 69 6e 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65  ink..**.** If de
2160: 6c 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74  lFlag is true, t
2170: 68 65 6e 20 6d 61 6b 65 20 61 72 72 61 6e 67 65  hen make arrange
2180: 6d 65 6e 74 73 20 74 6f 20 61 75 74 6f 6d 61 74  ments to automat
2190: 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 0a 2a 2a  ically delete.**
21a0: 20 74 68 65 20 66 69 6c 65 20 77 68 65 6e 20 69   the file when i
21b0: 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
21c0: 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 77  ** On success, w
21d0: 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 68 61  rite the file ha
21e0: 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61 6e  ndle into *id an
21f0: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
2200: 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69  OK..**.** On fai
2210: 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 53 51 4c  lure, return SQL
2220: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f  ITE_CANTOPEN..*/
2230: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 4f  .int sqlite3WinO
2240: 70 65 6e 45 78 63 6c 75 73 69 76 65 28 63 6f 6e  penExclusive(con
2250: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
2260: 6d 65 2c 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64  me, OsFile **pId
2270: 2c 20 69 6e 74 20 64 65 6c 46 6c 61 67 29 7b 0a  , int delFlag){.
2280: 20 20 77 69 6e 46 69 6c 65 20 66 3b 0a 20 20 48    winFile f;.  H
2290: 41 4e 44 4c 45 20 68 3b 0a 20 20 69 6e 74 20 66  ANDLE h;.  int f
22a0: 69 6c 65 66 6c 61 67 73 3b 0a 20 20 57 43 48 41  ileflags;.  WCHA
22b0: 52 20 2a 7a 57 69 64 65 20 3d 20 75 74 66 38 54  R *zWide = utf8T
22c0: 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
22d0: 6d 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a  me);.  assert( *
22e0: 70 49 64 20 3d 3d 20 30 20 29 3b 0a 20 20 66 69  pId == 0 );.  fi
22f0: 6c 65 66 6c 61 67 73 20 3d 20 46 49 4c 45 5f 46  leflags = FILE_F
2300: 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53  LAG_RANDOM_ACCES
2310: 53 3b 0a 23 69 66 20 21 4f 53 5f 57 49 4e 43 45  S;.#if !OS_WINCE
2320: 0a 20 20 69 66 28 20 64 65 6c 46 6c 61 67 20 29  .  if( delFlag )
2330: 7b 0a 20 20 20 20 66 69 6c 65 66 6c 61 67 73 20  {.    fileflags 
2340: 7c 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54  |= FILE_ATTRIBUT
2350: 45 5f 54 45 4d 50 4f 52 41 52 59 20 7c 20 46 49  E_TEMPORARY | FI
2360: 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f  LE_FLAG_DELETE_O
2370: 4e 5f 43 4c 4f 53 45 3b 0a 20 20 7d 0a 23 65 6e  N_CLOSE;.  }.#en
2380: 64 69 66 0a 20 20 69 66 28 20 7a 57 69 64 65 20  dif.  if( zWide 
2390: 29 7b 0a 20 20 20 20 68 20 3d 20 43 72 65 61 74  ){.    h = Creat
23a0: 65 46 69 6c 65 57 28 7a 57 69 64 65 2c 0a 20 20  eFileW(zWide,.  
23b0: 20 20 20 20 20 47 45 4e 45 52 49 43 5f 52 45 41       GENERIC_REA
23c0: 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54  D | GENERIC_WRIT
23d0: 45 2c 0a 20 20 20 20 20 20 20 30 2c 0a 20 20 20  E,.       0,.   
23e0: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
23f0: 20 43 52 45 41 54 45 5f 41 4c 57 41 59 53 2c 0a   CREATE_ALWAYS,.
2400: 20 20 20 20 20 20 20 66 69 6c 65 66 6c 61 67 73         fileflags
2410: 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20  ,.       NULL.  
2420: 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46    );.    sqliteF
2430: 72 65 65 28 7a 57 69 64 65 29 3b 0a 20 20 7d 65  ree(zWide);.  }e
2440: 6c 73 65 7b 0a 23 69 66 20 4f 53 5f 57 49 4e 43  lse{.#if OS_WINC
2450: 45 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  E.    return SQL
2460: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 23 65 6c 73 65  ITE_NOMEM;.#else
2470: 0a 20 20 20 20 68 20 3d 20 43 72 65 61 74 65 46  .    h = CreateF
2480: 69 6c 65 41 28 7a 46 69 6c 65 6e 61 6d 65 2c 0a  ileA(zFilename,.
2490: 20 20 20 20 20 20 20 47 45 4e 45 52 49 43 5f 52         GENERIC_R
24a0: 45 41 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52  EAD | GENERIC_WR
24b0: 49 54 45 2c 0a 20 20 20 20 20 20 20 30 2c 0a 20  ITE,.       0,. 
24c0: 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20        NULL,.    
24d0: 20 20 20 43 52 45 41 54 45 5f 41 4c 57 41 59 53     CREATE_ALWAYS
24e0: 2c 0a 20 20 20 20 20 20 20 66 69 6c 65 66 6c 61  ,.       filefla
24f0: 67 73 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 0a  gs,.       NULL.
2500: 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 20 2f 2a      );.#endif /*
2510: 20 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 20 20 7d   OS_WINCE */.  }
2520: 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49  .  if( h==INVALI
2530: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
2540: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2550: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
2560: 7d 0a 20 20 66 2e 68 20 3d 20 68 3b 0a 20 20 66  }.  f.h = h;.  f
2570: 2e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c  .locktype = NO_L
2580: 4f 43 4b 3b 0a 20 20 66 2e 73 68 61 72 65 64 4c  OCK;.  f.sharedL
2590: 6f 63 6b 42 79 74 65 20 3d 20 30 3b 0a 23 69 66  ockByte = 0;.#if
25a0: 20 4f 53 5f 57 49 4e 43 45 0a 20 20 66 2e 7a 44   OS_WINCE.  f.zD
25b0: 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 64  eleteOnClose = d
25c0: 65 6c 46 6c 61 67 20 3f 20 75 74 66 38 54 6f 55  elFlag ? utf8ToU
25d0: 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65  nicode(zFilename
25e0: 29 20 3a 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  ) : 0;.#endif.  
25f0: 54 52 41 43 45 33 28 22 4f 50 45 4e 20 45 58 20  TRACE3("OPEN EX 
2600: 25 64 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 68 2c  %d \"%s\"\n", h,
2610: 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72   zFilename);.  r
2620: 65 74 75 72 6e 20 61 6c 6c 6f 63 61 74 65 57 69  eturn allocateWi
2630: 6e 46 69 6c 65 28 26 66 2c 20 70 49 64 29 3b 0a  nFile(&f, pId);.
2640: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
2650: 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66   to open a new f
2660: 69 6c 65 20 66 6f 72 20 72 65 61 64 2d 6f 6e 6c  ile for read-onl
2670: 79 20 61 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  y access..**.** 
2680: 4f 6e 20 73 75 63 63 65 73 73 2c 20 77 72 69 74  On success, writ
2690: 65 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c  e the file handl
26a0: 65 20 69 6e 74 6f 20 2a 69 64 20 61 6e 64 20 72  e into *id and r
26b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
26c0: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72  .**.** On failur
26d0: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
26e0: 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a 69 6e  _CANTOPEN..*/.in
26f0: 74 20 73 71 6c 69 74 65 33 57 69 6e 4f 70 65 6e  t sqlite3WinOpen
2700: 52 65 61 64 4f 6e 6c 79 28 63 6f 6e 73 74 20 63  ReadOnly(const c
2710: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
2720: 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29 7b 0a 20  OsFile **pId){. 
2730: 20 77 69 6e 46 69 6c 65 20 66 3b 0a 20 20 48 41   winFile f;.  HA
2740: 4e 44 4c 45 20 68 3b 0a 20 20 57 43 48 41 52 20  NDLE h;.  WCHAR 
2750: 2a 7a 57 69 64 65 20 3d 20 75 74 66 38 54 6f 55  *zWide = utf8ToU
2760: 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65  nicode(zFilename
2770: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 49  );.  assert( *pI
2780: 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 57  d==0 );.  if( zW
2790: 69 64 65 20 29 7b 0a 20 20 20 20 68 20 3d 20 43  ide ){.    h = C
27a0: 72 65 61 74 65 46 69 6c 65 57 28 7a 57 69 64 65  reateFileW(zWide
27b0: 2c 0a 20 20 20 20 20 20 20 47 45 4e 45 52 49 43  ,.       GENERIC
27c0: 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 30 2c  _READ,.       0,
27d0: 0a 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20  .       NULL,.  
27e0: 20 20 20 20 20 4f 50 45 4e 5f 45 58 49 53 54 49       OPEN_EXISTI
27f0: 4e 47 2c 0a 20 20 20 20 20 20 20 46 49 4c 45 5f  NG,.       FILE_
2800: 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c  ATTRIBUTE_NORMAL
2810: 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e   | FILE_FLAG_RAN
2820: 44 4f 4d 5f 41 43 43 45 53 53 2c 0a 20 20 20 20  DOM_ACCESS,.    
2830: 20 20 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 20     NULL.    );. 
2840: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 57     sqliteFree(zW
2850: 69 64 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23  ide);.  }else{.#
2860: 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  if OS_WINCE.    
2870: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2880: 4d 45 4d 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68  MEM;.#else.    h
2890: 20 3d 20 43 72 65 61 74 65 46 69 6c 65 41 28 7a   = CreateFileA(z
28a0: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
28b0: 20 47 45 4e 45 52 49 43 5f 52 45 41 44 2c 0a 20   GENERIC_READ,. 
28c0: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
28d0: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 4f 50 45  NULL,.       OPE
28e0: 4e 5f 45 58 49 53 54 49 4e 47 2c 0a 20 20 20 20  N_EXISTING,.    
28f0: 20 20 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54     FILE_ATTRIBUT
2900: 45 5f 4e 4f 52 4d 41 4c 20 7c 20 46 49 4c 45 5f  E_NORMAL | FILE_
2910: 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45  FLAG_RANDOM_ACCE
2920: 53 53 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 0a  SS,.       NULL.
2930: 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20      );.#endif.  
2940: 7d 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c  }.  if( h==INVAL
2950: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
2960: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2970: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
2980: 20 7d 0a 20 20 66 2e 68 20 3d 20 68 3b 0a 20 20   }.  f.h = h;.  
2990: 66 2e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f  f.locktype = NO_
29a0: 4c 4f 43 4b 3b 0a 20 20 66 2e 73 68 61 72 65 64  LOCK;.  f.shared
29b0: 4c 6f 63 6b 42 79 74 65 20 3d 20 30 3b 0a 20 20  LockByte = 0;.  
29c0: 54 52 41 43 45 33 28 22 4f 50 45 4e 20 52 4f 20  TRACE3("OPEN RO 
29d0: 25 64 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 68 2c  %d \"%s\"\n", h,
29e0: 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72   zFilename);.  r
29f0: 65 74 75 72 6e 20 61 6c 6c 6f 63 61 74 65 57 69  eturn allocateWi
2a00: 6e 46 69 6c 65 28 26 66 2c 20 70 49 64 29 3b 0a  nFile(&f, pId);.
2a10: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
2a20: 20 74 6f 20 6f 70 65 6e 20 61 20 66 69 6c 65 20   to open a file 
2a30: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
2a40: 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61  he directory tha
2a50: 74 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20  t contains a.** 
2a60: 66 69 6c 65 2e 20 20 54 68 69 73 20 66 69 6c 65  file.  This file
2a70: 20 64 65 73 63 72 69 70 74 6f 72 20 63 61 6e 20   descriptor can 
2a80: 62 65 20 75 73 65 64 20 74 6f 20 66 73 79 6e 63  be used to fsync
2a90: 28 29 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  () the directory
2aa0: 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
2ab0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 72  make sure the cr
2ac0: 65 61 74 69 6f 6e 20 6f 66 20 61 20 6e 65 77 20  eation of a new 
2ad0: 66 69 6c 65 20 69 73 20 61 63 74 75 61 6c 6c 79  file is actually
2ae0: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 64   written.** to d
2af0: 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  isk..**.** This 
2b00: 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
2b10: 6d 65 61 6e 69 6e 67 66 75 6c 20 66 6f 72 20 55  meaningful for U
2b20: 6e 69 78 2e 20 20 49 74 20 69 73 20 61 20 6e 6f  nix.  It is a no
2b30: 2d 6f 70 20 75 6e 64 65 72 0a 2a 2a 20 77 69 6e  -op under.** win
2b40: 64 6f 77 73 20 73 69 6e 63 65 20 77 69 6e 64 6f  dows since windo
2b50: 77 73 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ws does not supp
2b60: 6f 72 74 20 68 61 72 64 20 6c 69 6e 6b 73 2e 0a  ort hard links..
2b70: 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
2b80: 2c 20 61 20 68 61 6e 64 6c 65 20 66 6f 72 20 61  , a handle for a
2b90: 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e   previously open
2ba0: 20 66 69 6c 65 20 69 73 20 61 74 20 2a 69 64 20   file is at *id 
2bb0: 69 73 0a 2a 2a 20 75 70 64 61 74 65 64 20 77 69  is.** updated wi
2bc0: 74 68 20 74 68 65 20 6e 65 77 20 64 69 72 65 63  th the new direc
2bd0: 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  tory file descri
2be0: 70 74 6f 72 20 61 6e 64 20 53 51 4c 49 54 45 5f  ptor and SQLITE_
2bf0: 4f 4b 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  OK is.** returne
2c00: 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c  d..**.** On fail
2c10: 75 72 65 2c 20 74 68 65 20 66 75 6e 63 74 69 6f  ure, the functio
2c20: 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
2c30: 5f 43 41 4e 54 4f 50 45 4e 20 61 6e 64 20 6c 65  _CANTOPEN and le
2c40: 61 76 65 73 0a 2a 2a 20 2a 69 64 20 75 6e 63 68  aves.** *id unch
2c50: 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  anged..*/.static
2c60: 20 69 6e 74 20 77 69 6e 4f 70 65 6e 44 69 72 65   int winOpenDire
2c70: 63 74 6f 72 79 28 0a 20 20 4f 73 46 69 6c 65 20  ctory(.  OsFile 
2c80: 2a 69 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *id,.  const cha
2c90: 72 20 2a 7a 44 69 72 6e 61 6d 65 0a 29 7b 0a 20  r *zDirname.){. 
2ca0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2cb0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  K;.}../*.** If t
2cc0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
2cd0: 62 61 6c 20 76 61 72 69 61 62 6c 65 20 70 6f 69  bal variable poi
2ce0: 6e 74 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20  nts to a string 
2cf0: 77 68 69 63 68 20 69 73 20 74 68 65 0a 2a 2a 20  which is the.** 
2d00: 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74  name of a direct
2d10: 6f 72 79 2c 20 74 68 65 6e 20 74 68 61 74 20 64  ory, then that d
2d20: 69 72 65 63 74 6f 72 79 20 77 69 6c 6c 20 62 65  irectory will be
2d30: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a   used to store.*
2d40: 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  * temporary file
2d50: 73 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  s..*/.char *sqli
2d60: 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
2d70: 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 43  ry = 0;../*.** C
2d80: 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  reate a temporar
2d90: 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a  y file name in z
2da0: 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20  Buf.  zBuf must 
2db0: 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  be big enough to
2dc0: 0a 2a 2a 20 68 6f 6c 64 20 61 74 20 6c 65 61 73  .** hold at leas
2dd0: 74 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  t SQLITE_TEMPNAM
2de0: 45 5f 53 49 5a 45 20 63 68 61 72 61 63 74 65 72  E_SIZE character
2df0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2e00: 33 57 69 6e 54 65 6d 70 46 69 6c 65 4e 61 6d 65  3WinTempFileName
2e10: 28 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20  (char *zBuf){.  
2e20: 73 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61  static char zCha
2e30: 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64  rs[] =.    "abcd
2e40: 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
2e50: 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43  uvwxyz".    "ABC
2e60: 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
2e70: 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31  TUVWXYZ".    "01
2e80: 32 33 34 35 36 37 38 39 22 3b 0a 20 20 69 6e 74  23456789";.  int
2e90: 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 7a 54   i, j;.  char zT
2ea0: 65 6d 70 50 61 74 68 5b 53 51 4c 49 54 45 5f 54  empPath[SQLITE_T
2eb0: 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20  EMPNAME_SIZE];. 
2ec0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 6d   if( sqlite3_tem
2ed0: 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20  p_directory ){. 
2ee0: 20 20 20 73 74 72 6e 63 70 79 28 7a 54 65 6d 70     strncpy(zTemp
2ef0: 50 61 74 68 2c 20 73 71 6c 69 74 65 33 5f 74 65  Path, sqlite3_te
2f00: 6d 70 5f 64 69 72 65 63 74 6f 72 79 2c 20 53 51  mp_directory, SQ
2f10: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
2f20: 5a 45 2d 33 30 29 3b 0a 20 20 20 20 7a 54 65 6d  ZE-30);.    zTem
2f30: 70 50 61 74 68 5b 53 51 4c 49 54 45 5f 54 45 4d  pPath[SQLITE_TEM
2f40: 50 4e 41 4d 45 5f 53 49 5a 45 2d 33 30 5d 20 3d  PNAME_SIZE-30] =
2f50: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
2f60: 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 63 68  isNT() ){.    ch
2f70: 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20  ar *zMulti;.    
2f80: 57 43 48 41 52 20 7a 57 69 64 65 50 61 74 68 5b  WCHAR zWidePath[
2f90: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
2fa0: 53 49 5a 45 5d 3b 0a 20 20 20 20 47 65 74 54 65  SIZE];.    GetTe
2fb0: 6d 70 50 61 74 68 57 28 53 51 4c 49 54 45 5f 54  mpPathW(SQLITE_T
2fc0: 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 2d 33 30 2c  EMPNAME_SIZE-30,
2fd0: 20 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20   zWidePath);.   
2fe0: 20 7a 4d 75 6c 74 69 20 3d 20 75 6e 69 63 6f 64   zMulti = unicod
2ff0: 65 54 6f 55 74 66 38 28 7a 57 69 64 65 50 61 74  eToUtf8(zWidePat
3000: 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c  h);.    if( zMul
3010: 74 69 20 29 7b 0a 20 20 20 20 20 20 73 74 72 6e  ti ){.      strn
3020: 63 70 79 28 7a 54 65 6d 70 50 61 74 68 2c 20 7a  cpy(zTempPath, z
3030: 4d 75 6c 74 69 2c 20 53 51 4c 49 54 45 5f 54 45  Multi, SQLITE_TE
3040: 4d 50 4e 41 4d 45 5f 53 49 5a 45 2d 33 30 29 3b  MPNAME_SIZE-30);
3050: 0a 20 20 20 20 20 20 7a 54 65 6d 70 50 61 74 68  .      zTempPath
3060: 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45  [SQLITE_TEMPNAME
3070: 5f 53 49 5a 45 2d 33 30 5d 20 3d 20 30 3b 0a 20  _SIZE-30] = 0;. 
3080: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
3090: 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 7d 0a 20  zMulti);.    }. 
30a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 47 65 74 54   }else{.    GetT
30b0: 65 6d 70 50 61 74 68 41 28 53 51 4c 49 54 45 5f  empPathA(SQLITE_
30c0: 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 2d 33 30  TEMPNAME_SIZE-30
30d0: 2c 20 7a 54 65 6d 70 50 61 74 68 29 3b 0a 20 20  , zTempPath);.  
30e0: 7d 0a 20 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e  }.  for(i=strlen
30f0: 28 7a 54 65 6d 70 50 61 74 68 29 3b 20 69 3e 30  (zTempPath); i>0
3100: 20 26 26 20 7a 54 65 6d 70 50 61 74 68 5b 69 2d   && zTempPath[i-
3110: 31 5d 3d 3d 27 5c 5c 27 3b 20 69 2d 2d 29 7b 7d  1]=='\\'; i--){}
3120: 0a 20 20 7a 54 65 6d 70 50 61 74 68 5b 69 5d 20  .  zTempPath[i] 
3130: 3d 20 30 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a  = 0;.  for(;;){.
3140: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66      sprintf(zBuf
3150: 2c 20 22 25 73 5c 5c 22 54 45 4d 50 5f 46 49 4c  , "%s\\"TEMP_FIL
3160: 45 5f 50 52 45 46 49 58 2c 20 7a 54 65 6d 70 50  E_PREFIX, zTempP
3170: 61 74 68 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74  ath);.    j = st
3180: 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20  rlen(zBuf);.    
3190: 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73  sqlite3Randomnes
31a0: 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b  s(15, &zBuf[j]);
31b0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
31c0: 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20  15; i++, j++){. 
31d0: 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28       zBuf[j] = (
31e0: 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75  char)zChars[ ((u
31f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75  nsigned char)zBu
3200: 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43  f[j])%(sizeof(zC
3210: 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20  hars)-1) ];.    
3220: 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20  }.    zBuf[j] = 
3230: 30 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  0;.    if( !sqli
3240: 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
3250: 7a 42 75 66 29 20 29 20 62 72 65 61 6b 3b 0a 20  zBuf) ) break;. 
3260: 20 7d 0a 20 20 54 52 41 43 45 32 28 22 54 45 4d   }.  TRACE2("TEM
3270: 50 20 46 49 4c 45 4e 41 4d 45 3a 20 25 73 5c 6e  P FILENAME: %s\n
3280: 22 2c 20 7a 42 75 66 29 3b 0a 20 20 72 65 74 75  ", zBuf);.  retu
3290: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d  rn SQLITE_OK; .}
32a0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
32b0: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
32c0: 69 6e 74 20 77 69 6e 43 6c 6f 73 65 28 4f 73 46  int winClose(OsF
32d0: 69 6c 65 20 2a 2a 70 49 64 29 7b 0a 20 20 77 69  ile **pId){.  wi
32e0: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 3b 0a 20 20  nFile *pFile;.  
32f0: 69 66 28 20 70 49 64 20 26 26 20 28 70 46 69 6c  if( pId && (pFil
3300: 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 2a 70  e = (winFile*)*p
3310: 49 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 54 52  Id)!=0 ){.    TR
3320: 41 43 45 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e  ACE2("CLOSE %d\n
3330: 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  ", pFile->h);.  
3340: 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46    CloseHandle(pF
3350: 69 6c 65 2d 3e 68 29 3b 0a 23 69 66 20 4f 53 5f  ile->h);.#if OS_
3360: 57 49 4e 43 45 0a 20 20 20 20 69 66 28 20 70 46  WINCE.    if( pF
3370: 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
3380: 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 44 65 6c  ose ){.      Del
3390: 65 74 65 46 69 6c 65 57 28 70 46 69 6c 65 2d 3e  eteFileW(pFile->
33a0: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b  zDeleteOnClose);
33b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
33c0: 65 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65  e(pFile->zDelete
33d0: 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 20 20 7d 0a  OnClose);.    }.
33e0: 23 65 6e 64 69 66 0a 20 20 20 20 4f 70 65 6e 43  #endif.    OpenC
33f0: 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 20 20  ounter(-1);.    
3400: 73 71 6c 69 74 65 46 72 65 65 28 70 46 69 6c 65  sqliteFree(pFile
3410: 29 3b 0a 20 20 20 20 2a 70 49 64 20 3d 20 30 3b  );.    *pId = 0;
3420: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
3430: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
3440: 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d  * Read data from
3450: 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62   a file into a b
3460: 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53  uffer.  Return S
3470: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a  QLITE_OK if all.
3480: 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 65  ** bytes were re
3490: 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ad successfully 
34a0: 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  and SQLITE_IOERR
34b0: 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
34c0: 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  s.** wrong..*/.s
34d0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65 61  tatic int winRea
34e0: 64 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 76 6f  d(OsFile *id, vo
34f0: 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 61 6d  id *pBuf, int am
3500: 74 29 7b 0a 20 20 44 57 4f 52 44 20 67 6f 74 3b  t){.  DWORD got;
3510: 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
3520: 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
3530: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
3540: 52 52 29 3b 0a 20 20 54 52 41 43 45 33 28 22 52  RR);.  TRACE3("R
3550: 45 41 44 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e  EAD %d lock=%d\n
3560: 22 2c 20 28 28 77 69 6e 46 69 6c 65 2a 29 69 64  ", ((winFile*)id
3570: 29 2d 3e 68 2c 20 28 28 77 69 6e 46 69 6c 65 2a  )->h, ((winFile*
3580: 29 69 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 29 3b  )id)->locktype);
3590: 0a 20 20 69 66 28 20 21 52 65 61 64 46 69 6c 65  .  if( !ReadFile
35a0: 28 28 28 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d  (((winFile*)id)-
35b0: 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26  >h, pBuf, amt, &
35c0: 67 6f 74 2c 20 30 29 20 29 7b 0a 20 20 20 20 67  got, 0) ){.    g
35d0: 6f 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  ot = 0;.  }.  if
35e0: 28 20 67 6f 74 3d 3d 28 44 57 4f 52 44 29 61 6d  ( got==(DWORD)am
35f0: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
3600: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
3610: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  se{.    return S
3620: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d  QLITE_IOERR;.  }
3630: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
3640: 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
3650: 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20  er into a file. 
3660: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
3670: 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20  K on success.** 
3680: 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
3690: 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c  ror code on fail
36a0: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
36b0: 6e 74 20 77 69 6e 57 72 69 74 65 28 4f 73 46 69  nt winWrite(OsFi
36c0: 6c 65 20 2a 69 64 2c 20 63 6f 6e 73 74 20 76 6f  le *id, const vo
36d0: 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 61 6d  id *pBuf, int am
36e0: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  t){.  int rc = 0
36f0: 3b 0a 20 20 44 57 4f 52 44 20 77 72 6f 74 65 3b  ;.  DWORD wrote;
3700: 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
3710: 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
3720: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
3730: 52 52 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44  RR);.  SimulateD
3740: 69 73 6b 66 75 6c 6c 45 72 72 6f 72 3b 0a 20 20  iskfullError;.  
3750: 54 52 41 43 45 33 28 22 57 52 49 54 45 20 25 64  TRACE3("WRITE %d
3760: 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 28 28 77   lock=%d\n", ((w
3770: 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20  inFile*)id)->h, 
3780: 28 28 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e  ((winFile*)id)->
3790: 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 61 73 73  locktype);.  ass
37a0: 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20  ert( amt>0 );.  
37b0: 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20  while( amt>0 && 
37c0: 28 72 63 20 3d 20 57 72 69 74 65 46 69 6c 65 28  (rc = WriteFile(
37d0: 28 28 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e  ((winFile*)id)->
37e0: 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 77  h, pBuf, amt, &w
37f0: 72 6f 74 65 2c 20 30 29 29 21 3d 30 0a 20 20 20  rote, 0))!=0.   
3800: 20 20 20 20 20 20 26 26 20 77 72 6f 74 65 3e 30        && wrote>0
3810: 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77   ){.    amt -= w
3820: 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d  rote;.    pBuf =
3830: 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b   &((char*)pBuf)[
3840: 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 69 66  wrote];.  }.  if
3850: 28 20 21 72 63 20 7c 7c 20 61 6d 74 3e 28 69 6e  ( !rc || amt>(in
3860: 74 29 77 72 6f 74 65 20 29 7b 0a 20 20 20 20 72  t)wrote ){.    r
3870: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
3880: 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  L;.  }.  return 
3890: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
38a0: 0a 2a 2a 20 53 6f 6d 65 20 6d 69 63 72 6f 73 6f  .** Some microso
38b0: 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63  ft compilers lac
38c0: 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f  k this definitio
38d0: 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e  n..*/.#ifndef IN
38e0: 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
38f0: 4f 49 4e 54 45 52 0a 23 20 64 65 66 69 6e 65 20  OINTER.# define 
3900: 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
3910: 5f 50 4f 49 4e 54 45 52 20 28 28 44 57 4f 52 44  _POINTER ((DWORD
3920: 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  )-1).#endif../*.
3930: 2a 2a 20 4d 6f 76 65 20 74 68 65 20 72 65 61 64  ** Move the read
3940: 2f 77 72 69 74 65 20 70 6f 69 6e 74 65 72 20 69  /write pointer i
3950: 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  n a file..*/.sta
3960: 74 69 63 20 69 6e 74 20 77 69 6e 53 65 65 6b 28  tic int winSeek(
3970: 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  OsFile *id, i64 
3980: 6f 66 66 73 65 74 29 7b 0a 20 20 4c 4f 4e 47 20  offset){.  LONG 
3990: 75 70 70 65 72 42 69 74 73 20 3d 20 6f 66 66 73  upperBits = offs
39a0: 65 74 3e 3e 33 32 3b 0a 20 20 4c 4f 4e 47 20 6c  et>>32;.  LONG l
39b0: 6f 77 65 72 42 69 74 73 20 3d 20 6f 66 66 73 65  owerBits = offse
39c0: 74 20 26 20 30 78 66 66 66 66 66 66 66 66 3b 0a  t & 0xffffffff;.
39d0: 20 20 44 57 4f 52 44 20 72 63 3b 0a 20 20 61 73    DWORD rc;.  as
39e0: 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 23  sert( id!=0 );.#
39f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
3a00: 54 0a 20 20 69 66 28 20 6f 66 66 73 65 74 20 29  T.  if( offset )
3a10: 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
3a20: 6c 45 72 72 6f 72 0a 23 65 6e 64 69 66 0a 20 20  lError.#endif.  
3a30: 53 45 45 4b 28 6f 66 66 73 65 74 2f 31 30 32 34  SEEK(offset/1024
3a40: 20 2b 20 31 29 3b 0a 20 20 72 63 20 3d 20 53 65   + 1);.  rc = Se
3a50: 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 28 28 77  tFilePointer(((w
3a60: 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20  inFile*)id)->h, 
3a70: 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70 70 65  lowerBits, &uppe
3a80: 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49  rBits, FILE_BEGI
3a90: 4e 29 3b 0a 20 20 54 52 41 43 45 33 28 22 53 45  N);.  TRACE3("SE
3aa0: 45 4b 20 25 64 20 25 6c 6c 64 5c 6e 22 2c 20 28  EK %d %lld\n", (
3ab0: 28 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 68  (winFile*)id)->h
3ac0: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28  , offset);.  if(
3ad0: 20 72 63 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54   rc==INVALID_SET
3ae0: 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 26 26  _FILE_POINTER &&
3af0: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21   GetLastError()!
3b00: 3d 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20  =NO_ERROR ){.   
3b10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
3b20: 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ULL;.  }.  retur
3b30: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
3b40: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
3b50: 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20  all writes to a 
3b60: 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20  particular file 
3b70: 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f  are committed to
3b80: 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   disk..*/.static
3b90: 20 69 6e 74 20 77 69 6e 53 79 6e 63 28 4f 73 46   int winSync(OsF
3ba0: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 64 61 74  ile *id, int dat
3bb0: 61 4f 6e 6c 79 29 7b 0a 20 20 61 73 73 65 72 74  aOnly){.  assert
3bc0: 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 54 52 41  ( id!=0 );.  TRA
3bd0: 43 45 33 28 22 53 59 4e 43 20 25 64 20 6c 6f 63  CE3("SYNC %d loc
3be0: 6b 3d 25 64 5c 6e 22 2c 20 28 28 77 69 6e 46 69  k=%d\n", ((winFi
3bf0: 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 28 28 77 69  le*)id)->h, ((wi
3c00: 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63 6b  nFile*)id)->lock
3c10: 74 79 70 65 29 3b 0a 20 20 69 66 28 20 46 6c 75  type);.  if( Flu
3c20: 73 68 46 69 6c 65 42 75 66 66 65 72 73 28 28 28  shFileBuffers(((
3c30: 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 68 29  winFile*)id)->h)
3c40: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
3c50: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
3c60: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
3c70: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a  LITE_IOERR;.  }.
3c80: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
3c90: 65 20 64 69 72 65 63 74 6f 72 79 20 7a 44 69 72  e directory zDir
3ca0: 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 61 20  name. This is a 
3cb0: 6e 6f 2d 6f 70 20 6f 6e 20 6f 70 65 72 61 74 69  no-op on operati
3cc0: 6e 67 20 73 79 73 74 65 6d 73 20 6f 74 68 65 72  ng systems other
3cd0: 0a 2a 2a 20 74 68 61 6e 20 55 4e 49 58 2e 0a 2a  .** than UNIX..*
3ce0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e  /.int sqlite3Win
3cf0: 53 79 6e 63 44 69 72 65 63 74 6f 72 79 28 63 6f  SyncDirectory(co
3d00: 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 6e 61  nst char *zDirna
3d10: 6d 65 29 7b 0a 20 20 53 69 6d 75 6c 61 74 65 49  me){.  SimulateI
3d20: 4f 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  OError(SQLITE_IO
3d30: 45 52 52 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ERR);.  return S
3d40: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
3d50: 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f  ** Truncate an o
3d60: 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70  pen file to a sp
3d70: 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a  ecified size.*/.
3d80: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 54 72  static int winTr
3d90: 75 6e 63 61 74 65 28 4f 73 46 69 6c 65 20 2a 69  uncate(OsFile *i
3da0: 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  d, i64 nByte){. 
3db0: 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73 20   LONG upperBits 
3dc0: 3d 20 6e 42 79 74 65 3e 3e 33 32 3b 0a 20 20 61  = nByte>>32;.  a
3dd0: 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
3de0: 20 20 54 52 41 43 45 33 28 22 54 52 55 4e 43 41    TRACE3("TRUNCA
3df0: 54 45 20 25 64 20 25 6c 6c 64 5c 6e 22 2c 20 28  TE %d %lld\n", (
3e00: 28 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 68  (winFile*)id)->h
3e10: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 53 69 6d 75  , nByte);.  Simu
3e20: 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49  lateIOError(SQLI
3e30: 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 53 65 74  TE_IOERR);.  Set
3e40: 46 69 6c 65 50 6f 69 6e 74 65 72 28 28 28 77 69  FilePointer(((wi
3e50: 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 6e  nFile*)id)->h, n
3e60: 42 79 74 65 2c 20 26 75 70 70 65 72 42 69 74 73  Byte, &upperBits
3e70: 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 20  , FILE_BEGIN);. 
3e80: 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 28 28   SetEndOfFile(((
3e90: 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 68 29  winFile*)id)->h)
3ea0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
3eb0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
3ec0: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72  etermine the cur
3ed0: 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66  rent size of a f
3ee0: 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a  ile in bytes.*/.
3ef0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69  static int winFi
3f00: 6c 65 53 69 7a 65 28 4f 73 46 69 6c 65 20 2a 69  leSize(OsFile *i
3f10: 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a  d, i64 *pSize){.
3f20: 20 20 44 57 4f 52 44 20 75 70 70 65 72 42 69 74    DWORD upperBit
3f30: 73 2c 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20  s, lowerBits;.  
3f40: 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
3f50: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
3f60: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  or(SQLITE_IOERR)
3f70: 3b 0a 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20  ;.  lowerBits = 
3f80: 47 65 74 46 69 6c 65 53 69 7a 65 28 28 28 77 69  GetFileSize(((wi
3f90: 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26  nFile*)id)->h, &
3fa0: 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20 2a 70  upperBits);.  *p
3fb0: 53 69 7a 65 20 3d 20 28 28 28 69 36 34 29 75 70  Size = (((i64)up
3fc0: 70 65 72 42 69 74 73 29 3c 3c 33 32 29 20 2b 20  perBits)<<32) + 
3fd0: 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 72 65 74  lowerBits;.  ret
3fe0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
3ff0: 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45  ../*.** LOCKFILE
4000: 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
4010: 59 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 6f  Y is undefined o
4020: 6e 20 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73  n some Windows s
4030: 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64  ystems..*/.#ifnd
4040: 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ef LOCKFILE_FAIL
4050: 5f 49 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20 64  _IMMEDIATELY.# d
4060: 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46  efine LOCKFILE_F
4070: 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20  AIL_IMMEDIATELY 
4080: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  1.#endif../*.** 
4090: 41 63 71 75 69 72 65 20 61 20 72 65 61 64 65 72  Acquire a reader
40a0: 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72   lock..** Differ
40b0: 65 6e 74 20 41 50 49 20 72 6f 75 74 69 6e 65 73  ent API routines
40c0: 20 61 72 65 20 63 61 6c 6c 65 64 20 64 65 70 65   are called depe
40d0: 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
40e0: 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20   or not this.** 
40f0: 69 73 20 57 69 6e 39 35 20 6f 72 20 57 69 6e 4e  is Win95 or WinN
4100: 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  T..*/.static int
4110: 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 77 69 6e   getReadLock(win
4120: 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74  File *id){.  int
4130: 20 72 65 73 3b 0a 20 20 69 66 28 20 69 73 4e 54   res;.  if( isNT
4140: 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41  () ){.    OVERLA
4150: 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6f  PPED ovlp;.    o
4160: 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 53 48 41  vlp.Offset = SHA
4170: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6f  RED_FIRST;.    o
4180: 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d  vlp.OffsetHigh =
4190: 20 30 3b 0a 20 20 20 20 6f 76 6c 70 2e 68 45 76   0;.    ovlp.hEv
41a0: 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 72 65 73  ent = 0;.    res
41b0: 20 3d 20 4c 6f 63 6b 46 69 6c 65 45 78 28 69 64   = LockFileEx(id
41c0: 2d 3e 68 2c 20 4c 4f 43 4b 46 49 4c 45 5f 46 41  ->h, LOCKFILE_FA
41d0: 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 2c 20  IL_IMMEDIATELY, 
41e0: 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 30  0, SHARED_SIZE,0
41f0: 2c 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65  ,&ovlp);.  }else
4200: 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 3b 0a 20 20  {.    int lk;.  
4210: 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e    sqlite3Randomn
4220: 65 73 73 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20  ess(sizeof(lk), 
4230: 26 6c 6b 29 3b 0a 20 20 20 20 69 64 2d 3e 73 68  &lk);.    id->sh
4240: 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28  aredLockByte = (
4250: 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 29  lk & 0x7fffffff)
4260: 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20  %(SHARED_SIZE - 
4270: 31 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f  1);.    res = Lo
4280: 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 53 48  ckFile(id->h, SH
4290: 41 52 45 44 5f 46 49 52 53 54 2b 69 64 2d 3e 73  ARED_FIRST+id->s
42a0: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30  haredLockByte, 0
42b0: 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 1, 0);.  }.  r
42c0: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
42d0: 0a 2a 2a 20 55 6e 64 6f 20 61 20 72 65 61 64 6c  .** Undo a readl
42e0: 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ock.*/.static in
42f0: 74 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b  t unlockReadLock
4300: 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29  (winFile *pFile)
4310: 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69  {.  int res;.  i
4320: 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
4330: 20 72 65 73 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c   res = UnlockFil
4340: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  e(pFile->h, SHAR
4350: 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41  ED_FIRST, 0, SHA
4360: 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20  RED_SIZE, 0);.  
4370: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d  }else{.    res =
4380: 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c   UnlockFile(pFil
4390: 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
43a0: 53 54 20 2b 20 70 46 69 6c 65 2d 3e 73 68 61 72  ST + pFile->shar
43b0: 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31  edLockByte, 0, 1
43c0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
43d0: 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69 66 6e 64  rn res;.}..#ifnd
43e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
43f0: 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f 2a 0a  AGER_PRAGMAS./*.
4400: 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61 20  ** Check that a 
4410: 67 69 76 65 6e 20 70 61 74 68 6e 61 6d 65 20 69  given pathname i
4420: 73 20 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e  s a directory an
4430: 64 20 69 73 20 77 72 69 74 61 62 6c 65 20 0a 2a  d is writable .*
4440: 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  *.*/.int sqlite3
4450: 57 69 6e 49 73 44 69 72 57 72 69 74 61 62 6c 65  WinIsDirWritable
4460: 28 63 68 61 72 20 2a 7a 44 69 72 6e 61 6d 65 29  (char *zDirname)
4470: 7b 0a 20 20 69 6e 74 20 66 69 6c 65 41 74 74 72  {.  int fileAttr
4480: 3b 0a 20 20 57 43 48 41 52 20 2a 7a 57 69 64 65  ;.  WCHAR *zWide
4490: 3b 0a 20 20 69 66 28 20 7a 44 69 72 6e 61 6d 65  ;.  if( zDirname
44a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
44b0: 20 20 69 66 28 20 21 69 73 4e 54 28 29 20 26 26    if( !isNT() &&
44c0: 20 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65   strlen(zDirname
44d0: 29 3e 4d 41 58 5f 50 41 54 48 20 29 20 72 65 74  )>MAX_PATH ) ret
44e0: 75 72 6e 20 30 3b 0a 20 20 7a 57 69 64 65 20 3d  urn 0;.  zWide =
44f0: 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a   utf8ToUnicode(z
4500: 44 69 72 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  Dirname);.  if( 
4510: 7a 57 69 64 65 20 29 7b 0a 20 20 20 20 66 69 6c  zWide ){.    fil
4520: 65 41 74 74 72 20 3d 20 47 65 74 46 69 6c 65 41  eAttr = GetFileA
4530: 74 74 72 69 62 75 74 65 73 57 28 7a 57 69 64 65  ttributesW(zWide
4540: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
4550: 65 28 7a 57 69 64 65 29 3b 0a 20 20 7d 65 6c 73  e(zWide);.  }els
4560: 65 7b 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a  e{.#if OS_WINCE.
4570: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65      return 0;.#e
4580: 6c 73 65 0a 20 20 20 20 66 69 6c 65 41 74 74 72  lse.    fileAttr
4590: 20 3d 20 47 65 74 46 69 6c 65 41 74 74 72 69 62   = GetFileAttrib
45a0: 75 74 65 73 41 28 7a 44 69 72 6e 61 6d 65 29 3b  utesA(zDirname);
45b0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66  .#endif.  }.  if
45c0: 28 20 66 69 6c 65 41 74 74 72 20 3d 3d 20 30 78  ( fileAttr == 0x
45d0: 66 66 66 66 66 66 66 66 20 29 20 72 65 74 75 72  ffffffff ) retur
45e0: 6e 20 30 3b 0a 20 20 69 66 28 20 28 66 69 6c 65  n 0;.  if( (file
45f0: 41 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52  Attr & FILE_ATTR
4600: 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 29  IBUTE_DIRECTORY)
4610: 20 21 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55   != FILE_ATTRIBU
4620: 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a  TE_DIRECTORY ){.
4630: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4640: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
4650: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
4660: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
4670: 4d 41 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  MAS */../*.** Lo
4680: 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
4690: 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
46a0: 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
46b0: 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a   locktype - one.
46c0: 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
46d0: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
46e0: 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
46f0: 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
4700: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
4710: 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
4720: 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
4730: 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
4740: 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
4750: 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
4760: 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
4770: 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
4780: 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
4790: 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
47a0: 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
47b0: 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
47c0: 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
47d0: 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
47e0: 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
47f0: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
4800: 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
4810: 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
4820: 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
4830: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
4840: 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
4850: 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
4860: 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
4870: 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
4880: 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
4890: 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
48a0: 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
48b0: 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
48c0: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
48d0: 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
48e0: 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
48f0: 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
4900: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
4910: 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
4920: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
4930: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
4940: 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
4950: 61 20 6c 6f 63 6b 2e 20 20 54 68 65 20 77 69 6e  a lock.  The win
4960: 55 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65  Unlock() routine
4970: 0a 2a 2a 20 65 72 61 73 65 73 20 61 6c 6c 20 6c  .** erases all l
4980: 6f 63 6b 73 20 61 74 20 6f 6e 63 65 20 61 6e 64  ocks at once and
4990: 20 72 65 74 75 72 6e 73 20 75 73 20 69 6d 6d 65   returns us imme
49a0: 64 69 61 74 65 6c 79 20 74 6f 20 6c 6f 63 6b 69  diately to locki
49b0: 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20 49  ng level 0..** I
49c0: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
49d0: 65 20 74 6f 20 6c 6f 77 65 72 20 74 68 65 20 6c  e to lower the l
49e0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 65  ocking level one
49f0: 20 73 74 65 70 20 61 74 20 61 20 74 69 6d 65 2e   step at a time.
4a00: 20 20 59 6f 75 0a 2a 2a 20 6d 75 73 74 20 67 6f    You.** must go
4a10: 20 73 74 72 61 69 67 68 74 20 74 6f 20 6c 6f 63   straight to loc
4a20: 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f  king level 0..*/
4a30: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c  .static int winL
4a40: 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20  ock(OsFile *id, 
4a50: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
4a60: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4a70: 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75 72  _OK;    /* Retur
4a80: 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 72  n code from subr
4a90: 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74  outines */.  int
4aa0: 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20   res = 1;       
4ab0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
4ac0: 20 61 20 77 69 6e 64 6f 77 73 20 6c 6f 63 6b 20   a windows lock 
4ad0: 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65  call */.  int ne
4ae0: 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20  wLocktype;      
4af0: 20 2f 2a 20 53 65 74 20 69 64 2d 3e 6c 6f 63 6b   /* Set id->lock
4b00: 74 79 70 65 20 74 6f 20 74 68 69 73 20 76 61 6c  type to this val
4b10: 75 65 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e  ue before exitin
4b20: 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65  g */.  int gotPe
4b30: 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a  ndingLock = 0;/*
4b40: 20 54 72 75 65 20 69 66 20 77 65 20 61 63 71 75   True if we acqu
4b50: 69 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20 6c  ired a PENDING l
4b60: 6f 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a 2f  ock this time */
4b70: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
4b80: 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
4b90: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
4ba0: 6c 65 21 3d 30 20 29 3b 0a 20 20 54 52 41 43 45  le!=0 );.  TRACE
4bb0: 35 28 22 4c 4f 43 4b 20 25 64 20 25 64 20 77 61  5("LOCK %d %d wa
4bc0: 73 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20  s %d(%d)\n",.   
4bd0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
4be0: 20 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65   locktype, pFile
4bf0: 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c  ->locktype, pFil
4c00: 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e->sharedLockByt
4c10: 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  e);..  /* If the
4c20: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
4c30: 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70  lock of this typ
4c40: 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69  e or more restri
4c50: 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a  ctive on the.  *
4c60: 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74  * OsFile, do not
4c70: 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20  hing. Don't use 
4c80: 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78  the end_lock: ex
4c90: 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a  it path, as.  **
4ca0: 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d   sqlite3OsEnterM
4cb0: 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65  utex() hasn't be
4cc0: 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20  en called yet.. 
4cd0: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
4ce0: 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74  >locktype>=lockt
4cf0: 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ype ){.    retur
4d00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
4d10: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
4d20: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71   the locking seq
4d30: 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74  uence is correct
4d40: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
4d50: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21  pFile->locktype!
4d60: 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b  =NO_LOCK || lock
4d70: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
4d80: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  K );.  assert( l
4d90: 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47  ocktype!=PENDING
4da0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
4db0: 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53  t( locktype!=RES
4dc0: 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46  ERVED_LOCK || pF
4dd0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53  ile->locktype==S
4de0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  HARED_LOCK );.. 
4df0: 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e   /* Lock the PEN
4e00: 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69  DING_LOCK byte i
4e10: 66 20 77 65 20 6e 65 65 64 20 74 6f 20 61 63 71  f we need to acq
4e20: 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c  uire a PENDING l
4e30: 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48  ock or.  ** a SH
4e40: 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77  ARED lock.  If w
4e50: 65 20 61 72 65 20 61 63 71 75 69 72 69 6e 67 20  e are acquiring 
4e60: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  a SHARED lock, t
4e70: 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6f  he acquisition o
4e80: 66 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44 49  f.  ** the PENDI
4e90: 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73 20  NG_LOCK byte is 
4ea0: 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a  temporary..  */.
4eb0: 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
4ec0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b  pFile->locktype;
4ed0: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
4ee0: 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 0a  cktype==NO_LOCK.
4ef0: 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d     || (locktype=
4f00: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
4f10: 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  && pFile->lockty
4f20: 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe==RESERVED_LOC
4f30: 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  K).  ){.    int 
4f40: 63 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77 68 69  cnt = 3;.    whi
4f50: 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28  le( cnt-->0 && (
4f60: 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70  res = LockFile(p
4f70: 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47  File->h, PENDING
4f80: 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29  _BYTE, 0, 1, 0))
4f90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
4fa0: 54 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67  Try 3 times to g
4fb0: 65 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c  et the pending l
4fc0: 6f 63 6b 2e 20 20 54 68 65 20 70 65 6e 64 69 6e  ock.  The pendin
4fd0: 67 20 6c 6f 63 6b 20 6d 69 67 68 74 20 62 65 0a  g lock might be.
4fe0: 20 20 20 20 20 20 2a 2a 20 68 65 6c 64 20 62 79        ** held by
4ff0: 20 61 6e 6f 74 68 65 72 20 72 65 61 64 65 72 20   another reader 
5000: 70 72 6f 63 65 73 73 20 77 68 6f 20 77 69 6c 6c  process who will
5010: 20 72 65 6c 65 61 73 65 20 69 74 20 6d 6f 6d 65   release it mome
5020: 6e 74 61 72 69 6c 79 2e 0a 20 20 20 20 20 20 2a  ntarily..      *
5030: 2f 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22  /.      TRACE2("
5040: 63 6f 75 6c 64 20 6e 6f 74 20 67 65 74 20 61 20  could not get a 
5050: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 20 63 6e  PENDING lock. cn
5060: 74 3d 25 64 5c 6e 22 2c 20 63 6e 74 29 3b 0a 20  t=%d\n", cnt);. 
5070: 20 20 20 20 20 53 6c 65 65 70 28 31 29 3b 0a 20       Sleep(1);. 
5080: 20 20 20 7d 0a 20 20 20 20 67 6f 74 50 65 6e 64     }.    gotPend
5090: 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73 3b 0a 20  ingLock = res;. 
50a0: 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
50b0: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20   a shared lock. 
50c0: 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
50d0: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
50e0: 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73  && res ){.    as
50f0: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
5100: 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29  ktype==NO_LOCK )
5110: 3b 0a 20 20 20 20 72 65 73 20 3d 20 67 65 74 52  ;.    res = getR
5120: 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  eadLock(pFile);.
5130: 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20      if( res ){. 
5140: 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65       newLocktype
5150: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
5160: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
5170: 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56  Acquire a RESERV
5180: 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  ED lock.  */.  i
5190: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53  f( locktype==RES
51a0: 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65  ERVED_LOCK && re
51b0: 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  s ){.    assert(
51c0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
51d0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
51e0: 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46  .    res = LockF
51f0: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45  ile(pFile->h, RE
5200: 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
5210: 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
5220: 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
5230: 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56  ocktype = RESERV
5240: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  ED_LOCK;.    }. 
5250: 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
5260: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a   a PENDING lock.
5270: 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
5280: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
5290: 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20  OCK && res ){.  
52a0: 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
52b0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
52c0: 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b    gotPendingLock
52d0: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
52e0: 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55  Acquire an EXCLU
52f0: 53 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20  SIVE lock.  */. 
5300: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45   if( locktype==E
5310: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
5320: 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65   res ){.    asse
5330: 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
5340: 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype>=SHARED_LOCK
5350: 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 75 6e   );.    res = un
5360: 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69  lockReadLock(pFi
5370: 6c 65 29 3b 0a 20 20 20 20 54 52 41 43 45 32 28  le);.    TRACE2(
5380: 22 75 6e 72 65 61 64 6c 6f 63 6b 20 3d 20 25 64  "unreadlock = %d
5390: 5c 6e 22 2c 20 72 65 73 29 3b 0a 20 20 20 20 72  \n", res);.    r
53a0: 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46  es = LockFile(pF
53b0: 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  ile->h, SHARED_F
53c0: 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f  IRST, 0, SHARED_
53d0: 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  SIZE, 0);.    if
53e0: 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e  ( res ){.      n
53f0: 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58 43  ewLocktype = EXC
5400: 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20  LUSIVE_LOCK;.   
5410: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52   }else{.      TR
5420: 41 43 45 32 28 22 65 72 72 6f 72 2d 63 6f 64 65  ACE2("error-code
5430: 20 3d 20 25 64 5c 6e 22 2c 20 47 65 74 4c 61 73   = %d\n", GetLas
5440: 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 7d  tError());.    }
5450: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
5460: 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 50   are holding a P
5470: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74  ENDING lock that
5480: 20 6f 75 67 68 74 20 74 6f 20 62 65 20 72 65 6c   ought to be rel
5490: 65 61 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a  eased, then.  **
54a0: 20 72 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e   release it now.
54b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50  .  */.  if( gotP
54c0: 65 6e 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f  endingLock && lo
54d0: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
54e0: 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63  OCK ){.    Unloc
54f0: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
5500: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c  PENDING_BYTE, 0,
5510: 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f   1, 0);.  }..  /
5520: 2a 20 55 70 64 61 74 65 20 74 68 65 20 73 74 61  * Update the sta
5530: 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68  te of the lock h
5540: 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66  as held in the f
5550: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
5560: 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  hen.  ** return 
5570: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
5580: 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a  result code..  *
5590: 2f 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20  /.  if( res ){. 
55a0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
55b0: 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
55c0: 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 46 41 49  TRACE4("LOCK FAI
55d0: 4c 45 44 20 25 64 20 74 72 79 69 6e 67 20 66 6f  LED %d trying fo
55e0: 72 20 25 64 20 62 75 74 20 67 6f 74 20 25 64 5c  r %d but got %d\
55f0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
5600: 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70           locktyp
5610: 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29 3b  e, newLocktype);
5620: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
5630: 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 46 69  _BUSY;.  }.  pFi
5640: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6e  le->locktype = n
5650: 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65  ewLocktype;.  re
5660: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
5670: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
5680: 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
5690: 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
56a0: 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
56b0: 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
56c0: 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
56d0: 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
56e0: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
56f0: 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  held, return.** 
5700: 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77  non-zero, otherw
5710: 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  ise zero..*/.sta
5720: 74 69 63 20 69 6e 74 20 77 69 6e 43 68 65 63 6b  tic int winCheck
5730: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 4f 73 46  ReservedLock(OsF
5740: 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20  ile *id){.  int 
5750: 72 63 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  rc;.  winFile *p
5760: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
5770: 29 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70  )id;.  assert( p
5780: 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28  File!=0 );.  if(
5790: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
57a0: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
57b0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  ){.    rc = 1;. 
57c0: 20 20 20 54 52 41 43 45 33 28 22 54 45 53 54 20     TRACE3("TEST 
57d0: 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28 6c  WR-LOCK %d %d (l
57e0: 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  ocal)\n", pFile-
57f0: 3e 68 2c 20 72 63 29 3b 0a 20 20 7d 65 6c 73 65  >h, rc);.  }else
5800: 7b 0a 20 20 20 20 72 63 20 3d 20 4c 6f 63 6b 46  {.    rc = LockF
5810: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45  ile(pFile->h, RE
5820: 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
5830: 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
5840: 63 20 29 7b 0a 20 20 20 20 20 20 55 6e 6c 6f 63  c ){.      Unloc
5850: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
5860: 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
5870: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 0);.    }. 
5880: 20 20 20 72 63 20 3d 20 21 72 63 3b 0a 20 20 20     rc = !rc;.   
5890: 20 54 52 41 43 45 33 28 22 54 45 53 54 20 57 52   TRACE3("TEST WR
58a0: 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28 72 65 6d  -LOCK %d %d (rem
58b0: 6f 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ote)\n", pFile->
58c0: 68 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65  h, rc);.  }.  re
58d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
58e0: 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
58f0: 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
5900: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 64 20  e descriptor id 
5910: 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f  to locktype.  lo
5920: 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62  cktype.** must b
5930: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
5940: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
5950: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
5960: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
5970: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
5980: 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
5990: 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
59a0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
59b0: 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
59c0: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
59d0: 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e  p..**.** It is n
59e0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
59f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
5a00: 66 61 69 6c 20 69 66 20 74 68 65 20 73 65 63 6f  fail if the seco
5a10: 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
5a20: 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74  s NO_LOCK.  If t
5a30: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
5a40: 6e 74 20 69 73 20 53 48 41 52 45 44 5f 4c 4f 43  nt is SHARED_LOC
5a50: 4b 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  K then this rout
5a60: 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74  ine.** might ret
5a70: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
5a80: 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.*/.static int 
5a90: 77 69 6e 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65  winUnlock(OsFile
5aa0: 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
5ab0: 70 65 29 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b  pe){.  int type;
5ac0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
5ad0: 54 45 5f 4f 4b 3b 0a 20 20 77 69 6e 46 69 6c 65  TE_OK;.  winFile
5ae0: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
5af0: 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73 65 72 74  le*)id;.  assert
5b00: 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20  ( pFile!=0 );.  
5b10: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
5b20: 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
5b30: 0a 20 20 54 52 41 43 45 35 28 22 55 4e 4c 4f 43  .  TRACE5("UNLOC
5b40: 4b 20 25 64 20 74 6f 20 25 64 20 77 61 73 20 25  K %d to %d was %
5b50: 64 28 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  d(%d)\n", pFile-
5b60: 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20  >h, locktype,.  
5b70: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
5b80: 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e  ocktype, pFile->
5b90: 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 29 3b  sharedLockByte);
5ba0: 0a 20 20 74 79 70 65 20 3d 20 70 46 69 6c 65 2d  .  type = pFile-
5bb0: 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28  >locktype;.  if(
5bc0: 20 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 56 45   type>=EXCLUSIVE
5bd0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c  _LOCK ){.    Unl
5be0: 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  ockFile(pFile->h
5bf0: 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
5c00: 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20  0, SHARED_SIZE, 
5c10: 30 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  0);.    if( lock
5c20: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
5c30: 4b 20 26 26 20 21 67 65 74 52 65 61 64 4c 6f 63  K && !getReadLoc
5c40: 6b 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  k(pFile) ){.    
5c50: 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64    /* This should
5c60: 20 6e 65 76 65 72 20 68 61 70 70 65 6e 2e 20 20   never happen.  
5c70: 57 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  We should always
5c80: 20 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20 20   be able to.    
5c90: 20 20 2a 2a 20 72 65 61 63 71 75 69 72 65 20 74    ** reacquire t
5ca0: 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a  he read lock */.
5cb0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
5cc0: 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20  E_IOERR;.    }. 
5cd0: 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 52   }.  if( type>=R
5ce0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
5cf0: 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70      UnlockFile(p
5d00: 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45  File->h, RESERVE
5d10: 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  D_BYTE, 0, 1, 0)
5d20: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b  ;.  }.  if( lock
5d30: 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26  type==NO_LOCK &&
5d40: 20 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f   type>=SHARED_LO
5d50: 43 4b 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b  CK ){.    unlock
5d60: 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  ReadLock(pFile);
5d70: 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e  .  }.  if( type>
5d80: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b  =PENDING_LOCK ){
5d90: 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28  .    UnlockFile(
5da0: 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e  pFile->h, PENDIN
5db0: 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  G_BYTE, 0, 1, 0)
5dc0: 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c  ;.  }.  pFile->l
5dd0: 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
5de0: 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  pe;.  return rc;
5df0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61  .}../*.** Turn a
5e00: 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
5e10: 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70  me into a full p
5e20: 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e  athname.  Return
5e30: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
5e40: 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
5e50: 6d 65 20 73 74 6f 72 65 64 20 69 6e 20 73 70 61  me stored in spa
5e60: 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ce obtained from
5e70: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e   sqliteMalloc().
5e80: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
5e90: 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70  function is resp
5ea0: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65  onsible for free
5eb0: 69 6e 67 20 74 68 69 73 20 73 70 61 63 65 20 6f  ing this space o
5ec0: 6e 63 65 20 69 74 0a 2a 2a 20 69 73 20 6e 6f 20  nce it.** is no 
5ed0: 6c 6f 6e 67 65 72 20 6e 65 65 64 65 64 2e 0a 2a  longer needed..*
5ee0: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 57  /.char *sqlite3W
5ef0: 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 63  inFullPathname(c
5f00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61  onst char *zRela
5f10: 74 69 76 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  tive){.  char *z
5f20: 46 75 6c 6c 3b 0a 23 69 66 20 64 65 66 69 6e 65  Full;.#if define
5f30: 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
5f40: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 6e 42 79  int nByte;.  nBy
5f50: 74 65 20 3d 20 73 74 72 6c 65 6e 28 7a 52 65 6c  te = strlen(zRel
5f60: 61 74 69 76 65 29 20 2b 20 4d 41 58 5f 50 41 54  ative) + MAX_PAT
5f70: 48 20 2b 20 31 30 30 31 3b 0a 20 20 7a 46 75 6c  H + 1001;.  zFul
5f80: 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
5f90: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  ( nByte );.  if(
5fa0: 20 7a 46 75 6c 6c 3d 3d 30 20 29 20 72 65 74 75   zFull==0 ) retu
5fb0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 63 79 67 77  rn 0;.  if( cygw
5fc0: 69 6e 5f 63 6f 6e 76 5f 74 6f 5f 66 75 6c 6c 5f  in_conv_to_full_
5fd0: 77 69 6e 33 32 5f 70 61 74 68 28 7a 52 65 6c 61  win32_path(zRela
5fe0: 74 69 76 65 2c 20 7a 46 75 6c 6c 29 20 29 20 72  tive, zFull) ) r
5ff0: 65 74 75 72 6e 20 30 3b 0a 23 65 6c 69 66 20 4f  eturn 0;.#elif O
6000: 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 20 57 69 6e  S_WINCE.  /* Win
6010: 43 45 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70  CE has no concep
6020: 74 20 6f 66 20 61 20 72 65 6c 61 74 69 76 65 20  t of a relative 
6030: 70 61 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20  pathname, or so 
6040: 49 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20  I am told. */.  
6050: 7a 46 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53  zFull = sqlite3S
6060: 74 72 44 75 70 28 7a 52 65 6c 61 74 69 76 65 29  trDup(zRelative)
6070: 3b 0a 23 65 6c 73 65 0a 20 20 63 68 61 72 20 2a  ;.#else.  char *
6080: 7a 4e 6f 74 55 73 65 64 3b 0a 20 20 57 43 48 41  zNotUsed;.  WCHA
6090: 52 20 2a 7a 57 69 64 65 3b 0a 20 20 69 6e 74 20  R *zWide;.  int 
60a0: 6e 42 79 74 65 3b 0a 20 20 7a 57 69 64 65 20 3d  nByte;.  zWide =
60b0: 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a   utf8ToUnicode(z
60c0: 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 69 66 28  Relative);.  if(
60d0: 20 7a 57 69 64 65 20 29 7b 0a 20 20 20 20 57 43   zWide ){.    WC
60e0: 48 41 52 20 2a 7a 54 65 6d 70 2c 20 2a 7a 4e 6f  HAR *zTemp, *zNo
60f0: 74 55 73 65 64 57 3b 0a 20 20 20 20 6e 42 79 74  tUsedW;.    nByt
6100: 65 20 3d 20 47 65 74 46 75 6c 6c 50 61 74 68 4e  e = GetFullPathN
6110: 61 6d 65 57 28 7a 57 69 64 65 2c 20 30 2c 20 30  ameW(zWide, 0, 0
6120: 2c 20 26 7a 4e 6f 74 55 73 65 64 57 29 20 2b 20  , &zNotUsedW) + 
6130: 31 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73  1;.    zTemp = s
6140: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79  qliteMalloc( nBy
6150: 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b  te*sizeof(zTemp[
6160: 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  0]) );.    if( z
6170: 54 65 6d 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  Temp==0 ) return
6180: 20 30 3b 0a 20 20 20 20 47 65 74 46 75 6c 6c 50   0;.    GetFullP
6190: 61 74 68 4e 61 6d 65 57 28 7a 57 69 64 65 2c 20  athNameW(zWide, 
61a0: 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 26 7a  nByte, zTemp, &z
61b0: 4e 6f 74 55 73 65 64 57 29 3b 0a 20 20 20 20 73  NotUsedW);.    s
61c0: 71 6c 69 74 65 46 72 65 65 28 7a 57 69 64 65 29  qliteFree(zWide)
61d0: 3b 0a 20 20 20 20 7a 46 75 6c 6c 20 3d 20 75 6e  ;.    zFull = un
61e0: 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d  icodeToUtf8(zTem
61f0: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  p);.    sqliteFr
6200: 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c  ee(zTemp);.  }el
6210: 73 65 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  se{.    nByte = 
6220: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
6230: 28 7a 52 65 6c 61 74 69 76 65 2c 20 30 2c 20 30  (zRelative, 0, 0
6240: 2c 20 26 7a 4e 6f 74 55 73 65 64 29 20 2b 20 31  , &zNotUsed) + 1
6250: 3b 0a 20 20 20 20 7a 46 75 6c 6c 20 3d 20 73 71  ;.    zFull = sq
6260: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74  liteMalloc( nByt
6270: 65 2a 73 69 7a 65 6f 66 28 7a 46 75 6c 6c 5b 30  e*sizeof(zFull[0
6280: 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 46  ]) );.    if( zF
6290: 75 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ull==0 ) return 
62a0: 30 3b 0a 20 20 20 20 47 65 74 46 75 6c 6c 50 61  0;.    GetFullPa
62b0: 74 68 4e 61 6d 65 41 28 7a 52 65 6c 61 74 69 76  thNameA(zRelativ
62c0: 65 2c 20 6e 42 79 74 65 2c 20 7a 46 75 6c 6c 2c  e, nByte, zFull,
62d0: 20 26 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 7d   &zNotUsed);.  }
62e0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
62f0: 20 7a 46 75 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zFull;.}../*.**
6300: 20 54 68 65 20 66 75 6c 6c 53 79 6e 63 20 6f 70   The fullSync op
6310: 74 69 6f 6e 20 69 73 20 6d 65 61 6e 69 6e 67 6c  tion is meaningl
6320: 65 73 73 20 6f 6e 20 77 69 6e 64 6f 77 73 2e 20  ess on windows. 
6330: 20 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f    This is a no-o
6340: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
6350: 64 20 77 69 6e 53 65 74 46 75 6c 6c 53 79 6e 63  d winSetFullSync
6360: 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74  (OsFile *id, int
6370: 20 76 29 7b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d   v){.  return;.}
6380: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
6390: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69  he underlying fi
63a0: 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 6e  le handle for an
63b0: 20 4f 73 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69   OsFile.*/.stati
63c0: 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 48 61 6e  c int winFileHan
63d0: 64 6c 65 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b  dle(OsFile *id){
63e0: 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28  .  return (int)(
63f0: 28 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 68  (winFile*)id)->h
6400: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6410: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61  n an integer tha
6420: 74 20 69 6e 64 69 63 65 73 20 74 68 65 20 74 79  t indices the ty
6430: 70 65 20 6f 66 20 6c 6f 63 6b 20 63 75 72 72 65  pe of lock curre
6440: 6e 74 6c 79 20 68 65 6c 64 0a 2a 2a 20 62 79 20  ntly held.** by 
6450: 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 28 55  this handle.  (U
6460: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
6470: 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
6480: 79 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y.).*/.static in
6490: 74 20 77 69 6e 4c 6f 63 6b 53 74 61 74 65 28 4f  t winLockState(O
64a0: 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65  sFile *id){.  re
64b0: 74 75 72 6e 20 28 28 77 69 6e 46 69 6c 65 2a 29  turn ((winFile*)
64c0: 69 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 7d  id)->locktype;.}
64d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63  ../*.** This vec
64e0: 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20  tor defines all 
64f0: 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74  the methods that
6500: 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20   can operate on 
6510: 61 6e 20 4f 73 46 69 6c 65 0a 2a 2a 20 66 6f 72  an OsFile.** for
6520: 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69   win32..*/.stati
6530: 63 20 63 6f 6e 73 74 20 49 6f 4d 65 74 68 6f 64  c const IoMethod
6540: 20 73 71 6c 69 74 65 33 57 69 6e 49 6f 4d 65 74   sqlite3WinIoMet
6550: 68 6f 64 20 3d 20 7b 0a 20 20 77 69 6e 43 6c 6f  hod = {.  winClo
6560: 73 65 2c 0a 20 20 77 69 6e 4f 70 65 6e 44 69 72  se,.  winOpenDir
6570: 65 63 74 6f 72 79 2c 0a 20 20 77 69 6e 52 65 61  ectory,.  winRea
6580: 64 2c 0a 20 20 77 69 6e 57 72 69 74 65 2c 0a 20  d,.  winWrite,. 
6590: 20 77 69 6e 53 65 65 6b 2c 0a 20 20 77 69 6e 54   winSeek,.  winT
65a0: 72 75 6e 63 61 74 65 2c 0a 20 20 77 69 6e 53 79  runcate,.  winSy
65b0: 6e 63 2c 0a 20 20 77 69 6e 53 65 74 46 75 6c 6c  nc,.  winSetFull
65c0: 53 79 6e 63 2c 0a 20 20 77 69 6e 46 69 6c 65 48  Sync,.  winFileH
65d0: 61 6e 64 6c 65 2c 0a 20 20 77 69 6e 46 69 6c 65  andle,.  winFile
65e0: 53 69 7a 65 2c 0a 20 20 77 69 6e 4c 6f 63 6b 2c  Size,.  winLock,
65f0: 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 0a 20 20  .  winUnlock,.  
6600: 77 69 6e 4c 6f 63 6b 53 74 61 74 65 2c 0a 20 20  winLockState,.  
6610: 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64  winCheckReserved
6620: 4c 6f 63 6b 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  Lock,.};../*.** 
6630: 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
6640: 66 6f 72 20 61 6e 20 4f 73 46 69 6c 65 2e 20 20  for an OsFile.  
6650: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e  Initialize the n
6660: 65 77 20 4f 73 46 69 6c 65 0a 2a 2a 20 74 6f 20  ew OsFile.** to 
6670: 74 68 65 20 76 61 6c 75 65 20 67 69 76 65 6e 20  the value given 
6680: 69 6e 20 70 49 6e 69 74 20 61 6e 64 20 72 65 74  in pInit and ret
6690: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
66a0: 20 74 68 65 20 6e 65 77 0a 2a 2a 20 4f 73 46 69   the new.** OsFi
66b0: 6c 65 2e 20 20 49 66 20 77 65 20 72 75 6e 20 6f  le.  If we run o
66c0: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2c 20 63 6c  ut of memory, cl
66d0: 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61 6e 64  ose the file and
66e0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
66f0: 0a 69 6e 74 20 61 6c 6c 6f 63 61 74 65 57 69 6e  .int allocateWin
6700: 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 49  File(winFile *pI
6710: 6e 69 74 2c 20 4f 73 46 69 6c 65 20 2a 2a 70 49  nit, OsFile **pI
6720: 64 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  d){.  winFile *p
6730: 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  New;.  pNew = sq
6740: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
6750: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
6760: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
6770: 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 49    CloseHandle(pI
6780: 6e 69 74 2d 3e 68 29 3b 0a 23 69 66 20 4f 53 5f  nit->h);.#if OS_
6790: 57 49 4e 43 45 0a 20 20 20 20 73 71 6c 69 74 65  WINCE.    sqlite
67a0: 46 72 65 65 28 70 49 6e 69 74 2d 3e 7a 44 65 6c  Free(pInit->zDel
67b0: 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 23 65 6e  eteOnClose);.#en
67c0: 64 69 66 0a 20 20 20 20 2a 70 49 64 20 3d 20 30  dif.    *pId = 0
67d0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
67e0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
67f0: 73 65 7b 0a 20 20 20 20 2a 70 4e 65 77 20 3d 20  se{.    *pNew = 
6800: 2a 70 49 6e 69 74 3b 0a 20 20 20 20 70 4e 65 77  *pInit;.    pNew
6810: 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73 71 6c  ->pMethod = &sql
6820: 69 74 65 33 57 69 6e 49 6f 4d 65 74 68 6f 64 3b  ite3WinIoMethod;
6830: 0a 20 20 20 20 2a 70 49 64 20 3d 20 28 4f 73 46  .    *pId = (OsF
6840: 69 6c 65 2a 29 70 4e 65 77 3b 0a 20 20 20 20 72  ile*)pNew;.    r
6850: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6860: 0a 20 20 7d 0a 7d 0a 0a 0a 23 65 6e 64 69 66 20  .  }.}...#endif 
6870: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  /* SQLITE_OMIT_D
6880: 49 53 4b 49 4f 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a  ISKIO */./******
6890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
68d0: 2a 2a 2a 2a 2a 0a 2a 2a 20 45 76 65 72 79 74 68  *****.** Everyth
68e0: 69 6e 67 20 61 62 6f 76 65 20 64 65 61 6c 73 20  ing above deals 
68f0: 77 69 74 68 20 66 69 6c 65 20 49 2f 4f 2e 20 20  with file I/O.  
6900: 45 76 65 72 79 74 68 69 6e 67 20 74 68 61 74 20  Everything that 
6910: 66 6f 6c 6c 6f 77 73 20 64 65 61 6c 73 0a 2a 2a  follows deals.**
6920: 20 77 69 74 68 20 6f 74 68 65 72 20 6d 69 73 63   with other misc
6930: 65 6c 6c 61 6e 6f 75 73 20 61 73 70 65 63 74 73  ellanous aspects
6940: 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e   of the operatin
6950: 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61  g system interfa
6960: 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ce.*************
6970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
69a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
69b0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 69 6e 66 6f  ../*.** Get info
69c0: 72 6d 61 74 69 6f 6e 20 74 6f 20 73 65 65 64 20  rmation to seed 
69d0: 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65  the random numbe
69e0: 72 20 67 65 6e 65 72 61 74 6f 72 2e 20 20 54 68  r generator.  Th
69f0: 65 20 73 65 65 64 0a 2a 2a 20 69 73 20 77 72 69  e seed.** is wri
6a00: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 62 75  tten into the bu
6a10: 66 66 65 72 20 7a 42 75 66 5b 32 35 36 5d 2e 20  ffer zBuf[256]. 
6a20: 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
6a30: 63 74 69 6f 6e 20 6d 75 73 74 0a 2a 2a 20 73 75  ction must.** su
6a40: 70 70 6c 79 20 61 20 73 75 66 66 69 63 69 65 6e  pply a sufficien
6a50: 74 6c 79 20 6c 61 72 67 65 20 62 75 66 66 65 72  tly large buffer
6a60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6a70: 57 69 6e 52 61 6e 64 6f 6d 53 65 65 64 28 63 68  WinRandomSeed(ch
6a80: 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a 20  ar *zBuf){.  /* 
6a90: 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69  We have to initi
6aa0: 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72  alize zBuf to pr
6ab0: 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66  event valgrind f
6ac0: 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20  rom reporting.  
6ad0: 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20  ** errors.  The 
6ae0: 72 65 70 6f 72 74 73 20 69 73 73 75 65 64 20 62  reports issued b
6af0: 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69  y valgrind are i
6b00: 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f  ncorrect - we wo
6b10: 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20  uld.  ** prefer 
6b20: 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e  that the randomn
6b30: 65 73 73 20 62 65 20 69 6e 63 72 65 61 73 65 64  ess be increased
6b40: 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f   by making use o
6b50: 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69  f the.  ** unini
6b60: 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69  tialized space i
6b70: 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c  n zBuf - but val
6b80: 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e  grind errors ten
6b90: 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20  d to worry.  ** 
6ba0: 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74  some users.  Rat
6bb0: 68 65 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20  her than argue, 
6bc0: 69 74 20 73 65 65 6d 73 20 65 61 73 69 65 72 20  it seems easier 
6bd0: 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69  just to initiali
6be0: 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c  ze.  ** the whol
6bf0: 65 20 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65  e array and sile
6c00: 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76  nce valgrind, ev
6c10: 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73  en if that means
6c20: 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73   less randomness
6c30: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e  .  ** in the ran
6c40: 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20  dom seed..  **. 
6c50: 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67   ** When testing
6c60: 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a  , initializing z
6c70: 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73  Buf[] to zero is
6c80: 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61   all we do.  Tha
6c90: 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61  t means.  ** tha
6ca0: 74 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  t we always use 
6cb0: 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20  the same random 
6cc0: 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e  number sequence.
6cd0: 2a 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65  * This makes the
6ce0: 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65  .  ** tests repe
6cf0: 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d  atable..  */.  m
6d00: 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 32  emset(zBuf, 0, 2
6d10: 35 36 29 3b 0a 20 20 47 65 74 53 79 73 74 65 6d  56);.  GetSystem
6d20: 54 69 6d 65 28 28 4c 50 53 59 53 54 45 4d 54 49  Time((LPSYSTEMTI
6d30: 4d 45 29 7a 42 75 66 29 3b 0a 20 20 72 65 74 75  ME)zBuf);.  retu
6d40: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6d50: 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72  ./*.** Sleep for
6d60: 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e   a little while.
6d70: 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f    Return the amo
6d80: 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70  unt of time slep
6d90: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
6da0: 33 57 69 6e 53 6c 65 65 70 28 69 6e 74 20 6d 73  3WinSleep(int ms
6db0: 29 7b 0a 20 20 53 6c 65 65 70 28 6d 73 29 3b 0a  ){.  Sleep(ms);.
6dc0: 20 20 72 65 74 75 72 6e 20 6d 73 3b 0a 7d 0a 0a    return ms;.}..
6dd0: 2f 2a 0a 2a 2a 20 53 74 61 74 69 63 20 76 61 72  /*.** Static var
6de0: 69 61 62 6c 65 73 20 75 73 65 64 20 66 6f 72 20  iables used for 
6df0: 74 68 72 65 61 64 20 73 79 6e 63 68 72 6f 6e 69  thread synchroni
6e00: 7a 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  zation.*/.static
6e10: 20 69 6e 74 20 69 6e 4d 75 74 65 78 20 3d 20 30   int inMutex = 0
6e20: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
6e30: 57 33 32 5f 54 48 52 45 41 44 53 0a 20 20 73 74  W32_THREADS.  st
6e40: 61 74 69 63 20 43 52 49 54 49 43 41 4c 5f 53 45  atic CRITICAL_SE
6e50: 43 54 49 4f 4e 20 63 73 3b 0a 23 65 6e 64 69 66  CTION cs;.#endif
6e60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
6e70: 6f 77 69 6e 67 20 70 61 69 72 20 6f 66 20 72 6f  owing pair of ro
6e80: 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 20  utine implement 
6e90: 6d 75 74 75 61 6c 20 65 78 63 6c 75 73 69 6f 6e  mutual exclusion
6ea0: 20 66 6f 72 0a 2a 2a 20 6d 75 6c 74 69 2d 74 68   for.** multi-th
6eb0: 72 65 61 64 65 64 20 70 72 6f 63 65 73 73 65 73  readed processes
6ec0: 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  .  Only a single
6ed0: 20 74 68 72 65 61 64 20 69 73 20 61 6c 6c 6f 77   thread is allow
6ee0: 65 64 20 74 6f 0a 2a 2a 20 65 78 65 63 75 74 65  ed to.** execute
6ef0: 64 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 73  d code that is s
6f00: 75 72 72 6f 75 6e 64 65 64 20 62 79 20 45 6e 74  urrounded by Ent
6f10: 65 72 4d 75 74 65 78 28 29 20 61 6e 64 20 4c 65  erMutex() and Le
6f20: 61 76 65 4d 75 74 65 78 28 29 2e 0a 2a 2a 0a 2a  aveMutex()..**.*
6f30: 2a 20 53 51 4c 69 74 65 20 75 73 65 73 20 6f 6e  * SQLite uses on
6f40: 6c 79 20 61 20 73 69 6e 67 6c 65 20 4d 75 74 65  ly a single Mute
6f50: 78 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 74  x.  There is not
6f60: 20 6d 75 63 68 20 63 72 69 74 69 63 61 6c 0a 2a   much critical.*
6f70: 2a 20 63 6f 64 65 20 61 6e 64 20 77 68 61 74 20  * code and what 
6f80: 6c 69 74 74 6c 65 20 74 68 65 72 65 20 69 73 20  little there is 
6f90: 65 78 65 63 75 74 65 73 20 71 75 69 63 6b 6c 79  executes quickly
6fa0: 20 61 6e 64 20 77 69 74 68 6f 75 74 20 62 6c 6f   and without blo
6fb0: 63 6b 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cking..*/.void s
6fc0: 71 6c 69 74 65 33 57 69 6e 45 6e 74 65 72 4d 75  qlite3WinEnterMu
6fd0: 74 65 78 28 29 7b 0a 23 69 66 64 65 66 20 53 51  tex(){.#ifdef SQ
6fe0: 4c 49 54 45 5f 57 33 32 5f 54 48 52 45 41 44 53  LITE_W32_THREADS
6ff0: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 73  .  static int is
7000: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 77 68 69 6c  Init = 0;.  whil
7010: 65 28 20 21 69 73 49 6e 69 74 20 29 7b 0a 20 20  e( !isInit ){.  
7020: 20 20 73 74 61 74 69 63 20 6c 6f 6e 67 20 6c 6f    static long lo
7030: 63 6b 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ck = 0;.    if( 
7040: 49 6e 74 65 72 6c 6f 63 6b 65 64 49 6e 63 72 65  InterlockedIncre
7050: 6d 65 6e 74 28 26 6c 6f 63 6b 29 3d 3d 31 20 29  ment(&lock)==1 )
7060: 7b 0a 20 20 20 20 20 20 49 6e 69 74 69 61 6c 69  {.      Initiali
7070: 7a 65 43 72 69 74 69 63 61 6c 53 65 63 74 69 6f  zeCriticalSectio
7080: 6e 28 26 63 73 29 3b 0a 20 20 20 20 20 20 69 73  n(&cs);.      is
7090: 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65  Init = 1;.    }e
70a0: 6c 73 65 7b 0a 20 20 20 20 20 20 53 6c 65 65 70  lse{.      Sleep
70b0: 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  (1);.    }.  }. 
70c0: 20 45 6e 74 65 72 43 72 69 74 69 63 61 6c 53 65   EnterCriticalSe
70d0: 63 74 69 6f 6e 28 26 63 73 29 3b 0a 23 65 6e 64  ction(&cs);.#end
70e0: 69 66 0a 20 20 61 73 73 65 72 74 28 20 21 69 6e  if.  assert( !in
70f0: 4d 75 74 65 78 20 29 3b 0a 20 20 69 6e 4d 75 74  Mutex );.  inMut
7100: 65 78 20 3d 20 31 3b 0a 7d 0a 76 6f 69 64 20 73  ex = 1;.}.void s
7110: 71 6c 69 74 65 33 57 69 6e 4c 65 61 76 65 4d 75  qlite3WinLeaveMu
7120: 74 65 78 28 29 7b 0a 20 20 61 73 73 65 72 74 28  tex(){.  assert(
7130: 20 69 6e 4d 75 74 65 78 20 29 3b 0a 20 20 69 6e   inMutex );.  in
7140: 4d 75 74 65 78 20 3d 20 30 3b 0a 23 69 66 64 65  Mutex = 0;.#ifde
7150: 66 20 53 51 4c 49 54 45 5f 57 33 32 5f 54 48 52  f SQLITE_W32_THR
7160: 45 41 44 53 0a 20 20 4c 65 61 76 65 43 72 69 74  EADS.  LeaveCrit
7170: 69 63 61 6c 53 65 63 74 69 6f 6e 28 26 63 73 29  icalSection(&cs)
7180: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
7190: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
71a0: 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c   we are currentl
71b0: 79 20 77 69 74 68 69 6e 20 74 68 65 20 6d 75 74  y within the mut
71c0: 65 78 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20  ex and FALSE if 
71d0: 6e 6f 74 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  not..** This rou
71e0: 74 69 6e 65 20 69 73 20 69 6e 74 65 6e 64 65 64  tine is intended
71f0: 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
7200: 6b 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 74 20 69  king only.  It i
7210: 73 20 64 65 73 69 67 6e 65 64 0a 2a 2a 20 66 6f  s designed.** fo
7220: 72 20 75 73 65 20 69 6e 20 61 6e 20 61 73 73 65  r use in an asse
7230: 72 74 28 29 20 74 6f 20 76 65 72 69 66 79 20 74  rt() to verify t
7240: 68 61 74 20 74 68 65 20 6d 75 74 65 78 20 69 73  hat the mutex is
7250: 20 68 65 6c 64 20 6f 72 20 6e 6f 74 20 68 65 6c   held or not hel
7260: 64 0a 2a 2a 20 69 6e 20 63 65 72 74 61 69 6e 20  d.** in certain 
7270: 72 6f 75 74 69 6e 65 73 2e 0a 2a 2f 0a 69 6e 74  routines..*/.int
7280: 20 73 71 6c 69 74 65 33 57 69 6e 49 6e 4d 75 74   sqlite3WinInMut
7290: 65 78 28 29 7b 0a 20 20 72 65 74 75 72 6e 20 69  ex(){.  return i
72a0: 6e 4d 75 74 65 78 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  nMutex;.}.../*.*
72b0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
72c0: 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74  variable, if set
72d0: 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
72e0: 61 6c 75 65 2c 20 62 65 63 6f 6d 65 73 20 74 68  alue, becomes th
72f0: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 72 65 74 75  e result.** retu
7300: 72 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  rned from sqlite
7310: 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29  3OsCurrentTime()
7320: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
7330: 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a  for testing..*/.
7340: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
7350: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  ST.int sqlite3_c
7360: 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b  urrent_time = 0;
7370: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
7380: 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
7390: 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
73a0: 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
73b0: 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65  ime).  Write the
73c0: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65  .** current time
73d0: 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
73e0: 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
73f0: 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64   into *prNow and
7400: 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52  .** return 0.  R
7410: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
7420: 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
7430: 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
7440: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 43  .int sqlite3WinC
7450: 75 72 72 65 6e 74 54 69 6d 65 28 64 6f 75 62 6c  urrentTime(doubl
7460: 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 46 49 4c  e *prNow){.  FIL
7470: 45 54 49 4d 45 20 66 74 3b 0a 20 20 2f 2a 20 46  ETIME ft;.  /* F
7480: 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74 75 72  ILETIME structur
7490: 65 20 69 73 20 61 20 36 34 2d 62 69 74 20 76 61  e is a 64-bit va
74a0: 6c 75 65 20 72 65 70 72 65 73 65 6e 74 69 6e 67  lue representing
74b0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a   the number of .
74c0: 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65 63       100-nanosec
74d0: 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73 20 73 69  ond intervals si
74e0: 6e 63 65 20 4a 61 6e 75 61 72 79 20 31 2c 20 31  nce January 1, 1
74f0: 36 30 31 20 28 3d 20 4a 44 20 32 33 30 35 38 31  601 (= JD 230581
7500: 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20 20 64 6f  3.5). .  */.  do
7510: 75 62 6c 65 20 6e 6f 77 3b 0a 23 69 66 20 4f 53  uble now;.#if OS
7520: 5f 57 49 4e 43 45 0a 20 20 53 59 53 54 45 4d 54  _WINCE.  SYSTEMT
7530: 49 4d 45 20 74 69 6d 65 3b 0a 20 20 47 65 74 53  IME time;.  GetS
7540: 79 73 74 65 6d 54 69 6d 65 28 26 74 69 6d 65 29  ystemTime(&time)
7550: 3b 0a 20 20 53 79 73 74 65 6d 54 69 6d 65 54 6f  ;.  SystemTimeTo
7560: 46 69 6c 65 54 69 6d 65 28 26 74 69 6d 65 2c 26  FileTime(&time,&
7570: 66 74 29 3b 0a 23 65 6c 73 65 0a 20 20 47 65 74  ft);.#else.  Get
7580: 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
7590: 54 69 6d 65 28 20 26 66 74 20 29 3b 0a 23 65 6e  Time( &ft );.#en
75a0: 64 69 66 0a 20 20 6e 6f 77 20 3d 20 28 28 64 6f  dif.  now = ((do
75b0: 75 62 6c 65 29 66 74 2e 64 77 48 69 67 68 44 61  uble)ft.dwHighDa
75c0: 74 65 54 69 6d 65 29 20 2a 20 34 32 39 34 39 36  teTime) * 429496
75d0: 37 32 39 36 2e 30 3b 20 0a 20 20 2a 70 72 4e 6f  7296.0; .  *prNo
75e0: 77 20 3d 20 28 6e 6f 77 20 2b 20 66 74 2e 64 77  w = (now + ft.dw
75f0: 4c 6f 77 44 61 74 65 54 69 6d 65 29 2f 38 36 34  LowDateTime)/864
7600: 30 30 30 30 30 30 30 30 30 2e 30 20 2b 20 32 33  000000000.0 + 23
7610: 30 35 38 31 33 2e 35 3b 0a 23 69 66 64 65 66 20  05813.5;.#ifdef 
7620: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
7630: 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  ( sqlite3_curren
7640: 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70  t_time ){.    *p
7650: 72 4e 6f 77 20 3d 20 73 71 6c 69 74 65 33 5f 63  rNow = sqlite3_c
7660: 75 72 72 65 6e 74 5f 74 69 6d 65 2f 38 36 34 30  urrent_time/8640
7670: 30 2e 30 20 2b 20 32 34 34 30 35 38 37 2e 35 3b  0.0 + 2440587.5;
7680: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
7690: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  turn 0;.}../* .*
76a0: 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  * The first time
76b0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
76c0: 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 20  s called from a 
76d0: 73 70 65 63 69 66 69 63 20 74 68 72 65 61 64 2c  specific thread,
76e0: 20 6e 42 79 74 65 20 0a 2a 2a 20 62 79 74 65 73   nByte .** bytes
76f0: 20 6f 66 20 64 61 74 61 20 61 72 65 61 20 61 72   of data area ar
7700: 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  e allocated and 
7710: 7a 65 72 6f 65 64 2e 20 41 20 70 6f 69 6e 74 65  zeroed. A pointe
7720: 72 20 74 6f 20 74 68 65 20 6e 65 77 20 0a 2a 2a  r to the new .**
7730: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 72   allocation is r
7740: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
7750: 61 6c 6c 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 45 61  aller. .**.** Ea
7760: 63 68 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  ch subsequent ca
7770: 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ll to this funct
7780: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 74 68 72  ion from the thr
7790: 65 61 64 20 72 65 74 75 72 6e 73 20 74 68 65 20  ead returns the 
77a0: 73 61 6d 65 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e  same.** pointer.
77b0: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
77c0: 20 69 67 6e 6f 72 65 64 20 69 6e 20 74 68 69 73   ignored in this
77d0: 20 63 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a   case..*/.void *
77e0: 73 71 6c 69 74 65 33 57 69 6e 54 68 72 65 61 64  sqlite3WinThread
77f0: 53 70 65 63 69 66 69 63 44 61 74 61 28 69 6e 74  SpecificData(int
7800: 20 6e 42 79 74 65 29 7b 0a 20 20 73 74 61 74 69   nByte){.  stati
7810: 63 20 76 6f 69 64 20 2a 70 54 73 64 20 3d 20 30  c void *pTsd = 0
7820: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6b  ;.  static int k
7830: 65 79 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  ey;.  static int
7840: 20 6b 65 79 49 6e 69 74 20 3d 20 30 3b 0a 0a 20   keyInit = 0;.. 
7850: 20 69 66 28 20 21 6b 65 79 49 6e 69 74 20 29 7b   if( !keyInit ){
7860: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 45 6e  .    sqlite3OsEn
7870: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
7880: 69 66 28 20 21 6b 65 79 49 6e 69 74 20 29 7b 0a  if( !keyInit ){.
7890: 20 20 20 20 20 20 6b 65 79 20 3d 20 54 6c 73 41        key = TlsA
78a0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 69 66  lloc();.      if
78b0: 28 20 6b 65 79 3d 3d 30 78 66 66 66 66 66 66 66  ( key==0xfffffff
78c0: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  f ){.        sql
78d0: 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78  ite3OsLeaveMutex
78e0: 28 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ();.        retu
78f0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
7900: 20 20 20 20 6b 65 79 49 6e 69 74 20 3d 20 31 3b      keyInit = 1;
7910: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
7920: 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29  e3OsLeaveMutex()
7930: 3b 0a 20 20 7d 0a 20 20 70 54 73 64 20 3d 20 54  ;.  }.  pTsd = T
7940: 6c 73 47 65 74 56 61 6c 75 65 28 6b 65 79 29 3b  lsGetValue(key);
7950: 0a 20 20 69 66 28 20 21 70 54 73 64 20 29 7b 0a  .  if( !pTsd ){.
7960: 20 20 20 20 70 54 73 64 20 3d 20 73 71 6c 69 74      pTsd = sqlit
7970: 65 33 4f 73 4d 61 6c 6c 6f 63 28 6e 42 79 74 65  e3OsMalloc(nByte
7980: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 73 64 20  );.    if( pTsd 
7990: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
79a0: 70 54 73 64 2c 20 30 2c 20 6e 42 79 74 65 29 3b  pTsd, 0, nByte);
79b0: 0a 20 20 20 20 20 20 54 6c 73 53 65 74 56 61 6c  .      TlsSetVal
79c0: 75 65 28 6b 65 79 2c 20 70 54 73 64 29 3b 0a 20  ue(key, pTsd);. 
79d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
79e0: 6e 20 70 54 73 64 3b 0a 7d 0a 23 65 6e 64 69 66  n pTsd;.}.#endif
79f0: 20 2f 2a 20 4f 53 5f 57 49 4e 20 2a 2f 0a         /* OS_WIN */.