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 2a 0a 2a 2a 20 24 49 64 3a 20 6f 73 5f 77 .**.** $Id: os_w
01c0: 69 6e 2e 63 2c 76 20 31 2e 31 33 30 20 32 30 30 in.c,v 1.130 200
01d0: 38 2f 30 37 2f 31 38 20 32 33 3a 34 37 3a 34 33 8/07/18 23:47:43
01e0: 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69 drh Exp $.*/.#i
01f0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e nclude "sqliteIn
0200: 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54 45 5f t.h".#if SQLITE_
0210: 4f 53 5f 57 49 4e 20 20 20 20 20 20 20 20 20 20 OS_WIN
0220: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66 69 6c /* This fil
0230: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 77 69 e is used for wi
0240: 6e 64 6f 77 73 20 6f 6e 6c 79 20 2a 2f 0a 0a 0a ndows only */...
0250: 2f 2a 0a 2a 2a 20 41 20 4e 6f 74 65 20 41 62 6f /*.** A Note Abo
0260: 75 74 20 4d 65 6d 6f 72 79 20 41 6c 6c 6f 63 61 ut Memory Alloca
0270: 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 tion:.**.** This
0280: 20 64 72 69 76 65 72 20 75 73 65 73 20 6d 61 6c driver uses mal
0290: 6c 6f 63 28 29 2f 66 72 65 65 28 29 20 64 69 72 loc()/free() dir
02a0: 65 63 74 6c 79 20 72 61 74 68 65 72 20 74 68 61 ectly rather tha
02b0: 6e 20 67 6f 69 6e 67 20 74 68 72 6f 75 67 68 0a n going through.
02c0: 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 2d 77 72 ** the SQLite-wr
02d0: 61 70 70 65 72 73 20 73 71 6c 69 74 65 33 5f 6d appers sqlite3_m
02e0: 61 6c 6c 6f 63 28 29 2f 73 71 6c 69 74 65 33 5f alloc()/sqlite3_
02f0: 66 72 65 65 28 29 2e 20 20 54 68 6f 73 65 20 77 free(). Those w
0300: 72 61 70 70 65 72 73 0a 2a 2a 20 61 72 65 20 64 rappers.** are d
0310: 65 73 69 67 6e 65 64 20 66 6f 72 20 75 73 65 20 esigned for use
0320: 6f 6e 20 65 6d 62 65 64 64 65 64 20 73 79 73 74 on embedded syst
0330: 65 6d 73 20 77 68 65 72 65 20 6d 65 6d 6f 72 79 ems where memory
0340: 20 69 73 20 73 63 61 72 63 65 20 61 6e 64 0a 2a is scarce and.*
0350: 2a 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 * malloc failure
0360: 73 20 68 61 70 70 65 6e 20 66 72 65 71 75 65 6e s happen frequen
0370: 74 6c 79 2e 20 20 57 69 6e 33 32 20 64 6f 65 73 tly. Win32 does
0380: 20 6e 6f 74 20 74 79 70 69 63 61 6c 6c 79 20 72 not typically r
0390: 75 6e 20 6f 6e 0a 2a 2a 20 65 6d 62 65 64 64 65 un on.** embedde
03a0: 64 20 73 79 73 74 65 6d 73 2c 20 61 6e 64 20 77 d systems, and w
03b0: 68 65 6e 20 69 74 20 64 6f 65 73 20 74 68 65 20 hen it does the
03c0: 64 65 76 65 6c 6f 70 65 72 73 20 6e 6f 72 6d 61 developers norma
03d0: 6c 6c 79 20 68 61 76 65 20 62 69 67 67 65 72 0a lly have bigger.
03e0: 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 74 6f 20 77 ** problems to w
03f0: 6f 72 72 79 20 61 62 6f 75 74 20 74 68 61 6e 20 orry about than
0400: 72 75 6e 6e 69 6e 67 20 6f 75 74 20 6f 66 20 6d running out of m
0410: 65 6d 6f 72 79 2e 20 20 53 6f 20 74 68 65 72 65 emory. So there
0420: 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 63 6f 6d is not.** a com
0430: 70 65 6c 6c 69 6e 67 20 6e 65 65 64 20 74 6f 20 pelling need to
0440: 75 73 65 20 74 68 65 20 77 72 61 70 70 65 72 73 use the wrappers
0450: 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 74 68 65 72 ..**.** But ther
0460: 65 20 69 73 20 61 20 67 6f 6f 64 20 72 65 61 73 e is a good reas
0470: 6f 6e 20 74 6f 20 6e 6f 74 20 75 73 65 20 74 68 on to not use th
0480: 65 20 77 72 61 70 70 65 72 73 2e 20 20 49 66 20 e wrappers. If
0490: 77 65 20 75 73 65 20 74 68 65 0a 2a 2a 20 77 72 we use the.** wr
04a0: 61 70 70 65 72 73 20 74 68 65 6e 20 77 65 20 77 appers then we w
04b0: 69 6c 6c 20 67 65 74 20 73 69 6d 75 6c 61 74 65 ill get simulate
04c0: 64 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 d malloc() failu
04d0: 72 65 73 20 77 69 74 68 69 6e 20 74 68 69 73 0a res within this.
04e0: 2a 2a 20 64 72 69 76 65 72 2e 20 20 41 6e 64 20 ** driver. And
04f0: 74 68 61 74 20 63 61 75 73 65 73 20 61 6c 6c 20 that causes all
0500: 6b 69 6e 64 73 20 6f 66 20 70 72 6f 62 6c 65 6d kinds of problem
0510: 73 20 66 6f 72 20 6f 75 72 20 74 65 73 74 73 2e s for our tests.
0520: 20 20 57 65 0a 2a 2a 20 63 6f 75 6c 64 20 65 6e We.** could en
0530: 68 61 6e 63 65 20 53 51 4c 69 74 65 20 74 6f 20 hance SQLite to
0540: 64 65 61 6c 20 77 69 74 68 20 73 69 6d 75 6c 61 deal with simula
0550: 74 65 64 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 ted malloc failu
0560: 72 65 73 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 res within.** th
0570: 65 20 4f 53 20 64 72 69 76 65 72 2c 20 62 75 74 e OS driver, but
0580: 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64 65 61 the code to dea
0590: 6c 20 77 69 74 68 20 74 68 6f 73 65 20 66 61 69 l with those fai
05a0: 6c 75 72 65 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a lure would not.*
05b0: 2a 20 62 65 20 65 78 65 72 63 69 73 65 64 20 6f * be exercised o
05c0: 6e 20 4c 69 6e 75 78 20 28 77 68 69 63 68 20 64 n Linux (which d
05d0: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 oes not need to
05e0: 6d 61 6c 6c 6f 63 28 29 20 69 6e 20 74 68 65 20 malloc() in the
05f0: 64 72 69 76 65 72 29 0a 2a 2a 20 61 6e 64 20 73 driver).** and s
0600: 6f 20 77 65 20 77 6f 75 6c 64 20 68 61 76 65 20 o we would have
0610: 64 69 66 66 69 63 75 6c 74 79 20 77 72 69 74 69 difficulty writi
0620: 6e 67 20 63 6f 76 65 72 61 67 65 20 74 65 73 74 ng coverage test
0630: 73 20 66 6f 72 20 74 68 61 74 0a 2a 2a 20 63 6f s for that.** co
0640: 64 65 2e 20 20 42 65 74 74 65 72 20 74 6f 20 6c de. Better to l
0650: 65 61 76 65 20 74 68 65 20 63 6f 64 65 20 6f 75 eave the code ou
0660: 74 2c 20 77 65 20 74 68 69 6e 6b 2e 0a 2a 2a 0a t, we think..**.
0670: 2a 2a 20 54 68 65 20 70 6f 69 6e 74 20 6f 66 20 ** The point of
0680: 74 68 69 73 20 64 69 73 63 75 73 73 69 6f 6e 20 this discussion
0690: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 20 is as follows:
06a0: 57 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 When creating a
06b0: 6e 65 77 0a 2a 2a 20 4f 53 20 6c 61 79 65 72 20 new.** OS layer
06c0: 66 6f 72 20 61 6e 20 65 6d 62 65 64 64 65 64 20 for an embedded
06d0: 73 79 73 74 65 6d 2c 20 69 66 20 79 6f 75 20 75 system, if you u
06e0: 73 65 20 74 68 69 73 20 66 69 6c 65 20 61 73 20 se this file as
06f0: 61 6e 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61 an example,.** a
0700: 76 6f 69 64 20 74 68 65 20 75 73 65 20 6f 66 20 void the use of
0710: 6d 61 6c 6c 6f 63 28 29 2f 66 72 65 65 28 29 2e malloc()/free().
0720: 20 20 54 68 6f 73 65 20 72 6f 75 74 69 6e 65 73 Those routines
0730: 20 77 6f 72 6b 20 6f 6b 20 6f 6e 20 77 69 6e 64 work ok on wind
0740: 6f 77 73 0a 2a 2a 20 64 65 73 6b 74 6f 70 73 20 ows.** desktops
0750: 62 75 74 20 6e 6f 74 20 73 6f 20 77 65 6c 6c 20 but not so well
0760: 69 6e 20 65 6d 62 65 64 64 65 64 20 73 79 73 74 in embedded syst
0770: 65 6d 73 2e 0a 2a 2f 0a 0a 23 69 6e 63 6c 75 64 ems..*/..#includ
0780: 65 20 3c 77 69 6e 62 61 73 65 2e 68 3e 0a 0a 23 e <winbase.h>..#
0790: 69 66 64 65 66 20 5f 5f 43 59 47 57 49 4e 5f 5f ifdef __CYGWIN__
07a0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f .# include <sys/
07b0: 63 79 67 77 69 6e 2e 68 3e 0a 23 65 6e 64 69 66 cygwin.h>.#endif
07c0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 75 ../*.** Macros u
07d0: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 sed to determine
07e0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 whether or not
07f0: 74 6f 20 75 73 65 20 74 68 72 65 61 64 73 2e 0a to use threads..
0800: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 54 */.#if defined(T
0810: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 54 48 HREADSAFE) && TH
0820: 52 45 41 44 53 41 46 45 0a 23 20 64 65 66 69 6e READSAFE.# defin
0830: 65 20 53 51 4c 49 54 45 5f 57 33 32 5f 54 48 52 e SQLITE_W32_THR
0840: 45 41 44 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f EADS 1.#endif../
0850: 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64 *.** Include cod
0860: 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e e that is common
0870: 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 to all os_*.c f
0880: 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 iles.*/.#include
0890: 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a "os_common.h"..
08a0: 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 /*.** Determine
08b0: 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e if we are dealin
08c0: 67 20 77 69 74 68 20 57 69 6e 64 6f 77 73 43 45 g with WindowsCE
08d0: 20 2d 20 77 68 69 63 68 20 68 61 73 20 61 20 6d - which has a m
08e0: 75 63 68 0a 2a 2a 20 72 65 64 75 63 65 64 20 41 uch.** reduced A
08f0: 50 49 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e PI..*/.#if defin
0900: 65 64 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e ed(SQLITE_OS_WIN
0910: 43 45 29 0a 23 20 64 65 66 69 6e 65 20 41 72 65 CE).# define Are
0920: 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 31 FileApisANSI() 1
0930: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 .#endif../*.** W
0940: 69 6e 43 45 20 6c 61 63 6b 73 20 6e 61 74 69 76 inCE lacks nativ
0950: 65 20 73 75 70 70 6f 72 74 20 66 6f 72 20 66 69 e support for fi
0960: 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 6f 20 77 65 le locking so we
0970: 20 68 61 76 65 20 74 6f 20 66 61 6b 65 20 69 74 have to fake it
0980: 0a 2a 2a 20 77 69 74 68 20 73 6f 6d 65 20 63 6f .** with some co
0990: 64 65 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a de of our own..*
09a0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f /.#if SQLITE_OS_
09b0: 57 49 4e 43 45 0a 74 79 70 65 64 65 66 20 73 74 WINCE.typedef st
09c0: 72 75 63 74 20 77 69 6e 63 65 4c 6f 63 6b 20 7b ruct winceLock {
09d0: 0a 20 20 69 6e 74 20 6e 52 65 61 64 65 72 73 3b . int nReaders;
09e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 /* Number
09f0: 20 6f 66 20 72 65 61 64 65 72 20 6c 6f 63 6b 73 of reader locks
0a00: 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 obtained */. B
0a10: 4f 4f 4c 20 62 50 65 6e 64 69 6e 67 3b 20 20 20 OOL bPending;
0a20: 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 /* Indicates
0a30: 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 a pending lock h
0a40: 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 as been obtained
0a50: 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 73 65 */. BOOL bRese
0a60: 72 76 65 64 3b 20 20 20 20 20 2f 2a 20 49 6e 64 rved; /* Ind
0a70: 69 63 61 74 65 73 20 61 20 72 65 73 65 72 76 65 icates a reserve
0a80: 64 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 d lock has been
0a90: 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f obtained */. BO
0aa0: 4f 4c 20 62 45 78 63 6c 75 73 69 76 65 3b 20 20 OL bExclusive;
0ab0: 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 /* Indicates a
0ac0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b n exclusive lock
0ad0: 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e has been obtain
0ae0: 65 64 20 2a 2f 0a 7d 20 77 69 6e 63 65 4c 6f 63 ed */.} winceLoc
0af0: 6b 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a k;.#endif../*.**
0b00: 20 54 68 65 20 77 69 6e 46 69 6c 65 20 73 74 72 The winFile str
0b10: 75 63 74 75 72 65 20 69 73 20 61 20 73 75 62 63 ucture is a subc
0b20: 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f lass of sqlite3_
0b30: 66 69 6c 65 2a 20 73 70 65 63 69 66 69 63 20 74 file* specific t
0b40: 6f 20 74 68 65 20 77 69 6e 33 32 0a 2a 2a 20 70 o the win32.** p
0b50: 6f 72 74 61 62 69 6c 69 74 79 20 6c 61 79 65 72 ortability layer
0b60: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 ..*/.typedef str
0b70: 75 63 74 20 77 69 6e 46 69 6c 65 20 77 69 6e 46 uct winFile winF
0b80: 69 6c 65 3b 0a 73 74 72 75 63 74 20 77 69 6e 46 ile;.struct winF
0b90: 69 6c 65 20 7b 0a 20 20 63 6f 6e 73 74 20 73 71 ile {. const sq
0ba0: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 lite3_io_methods
0bb0: 20 2a 70 4d 65 74 68 6f 64 3b 2f 2a 20 4d 75 73 *pMethod;/* Mus
0bc0: 74 20 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 t be first */.
0bd0: 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20 20 HANDLE h;
0be0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c /* Handl
0bf0: 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 e for accessing
0c00: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e the file */. un
0c10: 73 69 67 6e 65 64 20 63 68 61 72 20 6c 6f 63 6b signed char lock
0c20: 74 79 70 65 3b 20 2f 2a 20 54 79 70 65 20 6f 66 type; /* Type of
0c30: 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 lock currently
0c40: 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 69 6c held on this fil
0c50: 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73 68 61 e */. short sha
0c60: 72 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20 20 2f redLockByte; /
0c70: 2a 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f 73 65 * Randomly chose
0c80: 6e 20 62 79 74 65 20 75 73 65 64 20 61 73 20 61 n byte used as a
0c90: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a shared lock */.
0ca0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 #if SQLITE_OS_WI
0cb0: 4e 43 45 0a 20 20 57 43 48 41 52 20 2a 7a 44 65 NCE. WCHAR *zDe
0cc0: 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20 20 2f 2a leteOnClose; /*
0cd0: 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f Name of file to
0ce0: 20 64 65 6c 65 74 65 20 77 68 65 6e 20 63 6c 6f delete when clo
0cf0: 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 sing */. HANDLE
0d00: 20 68 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 hMutex;
0d10: 20 20 2f 2a 20 4d 75 74 65 78 20 75 73 65 64 20 /* Mutex used
0d20: 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 to control acces
0d30: 73 20 74 6f 20 73 68 61 72 65 64 20 6c 6f 63 6b s to shared lock
0d40: 20 2a 2f 20 20 0a 20 20 48 41 4e 44 4c 45 20 68 */ . HANDLE h
0d50: 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20 20 Shared;
0d60: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 /* Shared memory
0d70: 20 73 65 67 6d 65 6e 74 20 75 73 65 64 20 66 6f segment used fo
0d80: 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 77 r locking */. w
0d90: 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c 3b 20 inceLock local;
0da0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 73 20 /* Locks
0db0: 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68 69 73 obtained by this
0dc0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 77 69 6e instance of win
0dd0: 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 63 65 4c File */. winceL
0de0: 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20 20 20 20 ock *shared;
0df0: 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 68 61 72 /* Global shar
0e00: 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79 20 66 ed lock memory f
0e10: 6f 72 20 74 68 65 20 66 69 6c 65 20 20 2a 2f 0a or the file */.
0e20: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a #endif.};.../*.*
0e30: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 * The following
0e40: 76 61 72 69 61 62 6c 65 20 69 73 20 28 6e 6f 72 variable is (nor
0e50: 6d 61 6c 6c 79 29 20 73 65 74 20 6f 6e 63 65 20 mally) set once
0e60: 61 6e 64 20 6e 65 76 65 72 20 63 68 61 6e 67 65 and never change
0e70: 73 0a 2a 2a 20 74 68 65 72 65 61 66 74 65 72 2e s.** thereafter.
0e80: 20 20 49 74 20 72 65 63 6f 72 64 73 20 77 68 65 It records whe
0e90: 74 68 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 ther the operati
0ea0: 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e ng system is Win
0eb0: 39 35 0a 2a 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a 95.** or WinNT..
0ec0: 2a 2a 0a 2a 2a 20 30 3a 20 20 20 4f 70 65 72 61 **.** 0: Opera
0ed0: 74 69 6e 67 20 73 79 73 74 65 6d 20 75 6e 6b 6e ting system unkn
0ee0: 6f 77 6e 2e 0a 2a 2a 20 31 3a 20 20 20 4f 70 65 own..** 1: Ope
0ef0: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 rating system is
0f00: 20 57 69 6e 39 35 2e 0a 2a 2a 20 32 3a 20 20 20 Win95..** 2:
0f10: 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d Operating system
0f20: 20 69 73 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a is WinNT..**.**
0f30: 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63 In order to fac
0f40: 69 6c 69 74 61 74 65 20 74 65 73 74 69 6e 67 20 ilitate testing
0f50: 6f 6e 20 61 20 57 69 6e 4e 54 20 73 79 73 74 65 on a WinNT syste
0f60: 6d 2c 20 74 68 65 20 74 65 73 74 20 66 69 78 74 m, the test fixt
0f70: 75 72 65 0a 2a 2a 20 63 61 6e 20 6d 61 6e 75 61 ure.** can manua
0f80: 6c 6c 79 20 73 65 74 20 74 68 69 73 20 76 61 6c lly set this val
0f90: 75 65 20 74 6f 20 31 20 74 6f 20 65 6d 75 6c 61 ue to 1 to emula
0fa0: 74 65 20 57 69 6e 39 38 20 62 65 68 61 76 69 6f te Win98 behavio
0fb0: 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c r..*/.#ifdef SQL
0fc0: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c ITE_TEST.int sql
0fd0: 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 ite3_os_type = 0
0fe0: 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 69 ;.#else.static i
0ff0: 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 nt sqlite3_os_ty
1000: 70 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a pe = 0;.#endif..
1010: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 /*.** Return tru
1020: 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 e (non-zero) if
1030: 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 75 we are running u
1040: 6e 64 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e 32 nder WinNT, Win2
1050: 4b 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20 K, WinXP,.** or
1060: 57 69 6e 43 45 2e 20 20 52 65 74 75 72 6e 20 66 WinCE. Return f
1070: 61 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f 72 20 alse (zero) for
1080: 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72 Win95, Win98, or
1090: 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 WinME..**.** He
10a0: 72 65 20 69 73 20 61 6e 20 69 6e 74 65 72 65 73 re is an interes
10b0: 74 69 6e 67 20 6f 62 73 65 72 76 61 74 69 6f 6e ting observation
10c0: 3a 20 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c : Win95, Win98,
10d0: 20 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a and WinME lack.
10e0: 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 ** the LockFileE
10f0: 78 28 29 20 41 50 49 2e 20 20 42 75 74 20 77 65 x() API. But we
1100: 20 63 61 6e 20 73 74 69 6c 6c 20 73 74 61 74 69 can still stati
1110: 63 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e cally link again
1120: 73 74 20 74 68 61 74 0a 2a 2a 20 41 50 49 20 61 st that.** API a
1130: 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e s long as we don
1140: 27 74 20 63 61 6c 6c 20 69 74 20 77 69 6e 20 72 't call it win r
1150: 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f unning Win95/98/
1160: 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a ME. A call to.*
1170: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 * this routine i
1180: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d s used to determ
1190: 69 6e 65 20 69 66 20 74 68 65 20 68 6f 73 74 20 ine if the host
11a0: 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f is Win95/98/ME o
11b0: 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50 r.** WinNT/2K/XP
11c0: 20 73 6f 20 74 68 61 74 20 77 65 20 77 69 6c 6c so that we will
11d0: 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 know whether or
11e0: 20 6e 6f 74 20 77 65 20 63 61 6e 20 73 61 66 65 not we can safe
11f0: 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c ly call.** the L
1200: 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e ockFileEx() API.
1210: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f .*/.#if SQLITE_O
1220: 53 5f 57 49 4e 43 45 0a 23 20 64 65 66 69 6e 65 S_WINCE.# define
1230: 20 69 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c isNT() (1).#el
1240: 73 65 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 se. static int
1250: 69 73 4e 54 28 76 6f 69 64 29 7b 0a 20 20 20 20 isNT(void){.
1260: 69 66 28 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 if( sqlite3_os_t
1270: 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 ype==0 ){.
1280: 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 20 73 49 OSVERSIONINFO sI
1290: 6e 66 6f 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f nfo;. sInfo
12a0: 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f .dwOSVersionInfo
12b0: 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 Size = sizeof(sI
12c0: 6e 66 6f 29 3b 0a 20 20 20 20 20 20 47 65 74 56 nfo);. GetV
12d0: 65 72 73 69 6f 6e 45 78 28 26 73 49 6e 66 6f 29 ersionEx(&sInfo)
12e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f ;. sqlite3_
12f0: 6f 73 5f 74 79 70 65 20 3d 20 73 49 6e 66 6f 2e os_type = sInfo.
1300: 64 77 50 6c 61 74 66 6f 72 6d 49 64 3d 3d 56 45 dwPlatformId==VE
1310: 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 R_PLATFORM_WIN32
1320: 5f 4e 54 20 3f 20 32 20 3a 20 31 3b 0a 20 20 20 _NT ? 2 : 1;.
1330: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 }. return sq
1340: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 lite3_os_type==2
1350: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 ;. }.#endif /*
1360: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 SQLITE_OS_WINCE
1370: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 */../*.** Conver
1380: 74 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67 t a UTF-8 string
1390: 20 74 6f 20 6d 69 63 72 6f 73 6f 66 74 20 75 6e to microsoft un
13a0: 69 63 6f 64 65 20 28 55 54 46 2d 31 36 3f 29 2e icode (UTF-16?).
13b0: 20 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f .**.** Space to
13c0: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e hold the return
13d0: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 ed string is obt
13e0: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f ained from mallo
13f0: 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 43 48 c..*/.static WCH
1400: 41 52 20 2a 75 74 66 38 54 6f 55 6e 69 63 6f 64 AR *utf8ToUnicod
1410: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 e(const char *zF
1420: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 ilename){. int
1430: 6e 43 68 61 72 3b 0a 20 20 57 43 48 41 52 20 2a nChar;. WCHAR *
1440: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a zWideFilename;..
1450: 20 20 6e 43 68 61 72 20 3d 20 4d 75 6c 74 69 42 nChar = MultiB
1460: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 yteToWideChar(CP
1470: 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e _UTF8, 0, zFilen
1480: 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 ame, -1, NULL, 0
1490: 29 3b 0a 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 );. zWideFilena
14a0: 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 43 68 me = malloc( nCh
14b0: 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 ar*sizeof(zWideF
14c0: 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 ilename[0]) );.
14d0: 20 69 66 28 20 7a 57 69 64 65 46 69 6c 65 6e 61 if( zWideFilena
14e0: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 me==0 ){. ret
14f0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68 urn 0;. }. nCh
1500: 61 72 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f ar = MultiByteTo
1510: 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 WideChar(CP_UTF8
1520: 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 , 0, zFilename,
1530: 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d -1, zWideFilenam
1540: 65 2c 20 6e 43 68 61 72 29 3b 0a 20 20 69 66 28 e, nChar);. if(
1550: 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 nChar==0 ){.
1560: 20 66 72 65 65 28 7a 57 69 64 65 46 69 6c 65 6e free(zWideFilen
1570: 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69 64 65 46 ame);. zWideF
1580: 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d ilename = 0;. }
1590: 0a 20 20 72 65 74 75 72 6e 20 7a 57 69 64 65 46 . return zWideF
15a0: 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a ilename;.}../*.*
15b0: 2a 20 43 6f 6e 76 65 72 74 20 6d 69 63 72 6f 73 * Convert micros
15c0: 6f 66 74 20 75 6e 69 63 6f 64 65 20 74 6f 20 55 oft unicode to U
15d0: 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 TF-8. Space to
15e0: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 hold the returne
15f0: 64 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f d string is.** o
1600: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c btained from mal
1610: 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 loc()..*/.static
1620: 20 63 68 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f char *unicodeTo
1630: 55 74 66 38 28 63 6f 6e 73 74 20 57 43 48 41 52 Utf8(const WCHAR
1640: 20 2a 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 *zWideFilename)
1650: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 {. int nByte;.
1660: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 char *zFilename
1670: 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 57 69 64 ;.. nByte = Wid
1680: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 eCharToMultiByte
1690: 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 (CP_UTF8, 0, zWi
16a0: 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 deFilename, -1,
16b0: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7a 0, 0, 0, 0);. z
16c0: 46 69 6c 65 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f Filename = mallo
16d0: 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 c( nByte );. if
16e0: 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 ( zFilename==0 )
16f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a {. return 0;.
1700: 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 57 69 }. nByte = Wi
1710: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 deCharToMultiByt
1720: 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 e(CP_UTF8, 0, zW
1730: 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c ideFilename, -1,
1740: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 zFilename, nByt
1750: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 e,.
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1770: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 0, 0);. if( nB
1780: 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 yte == 0 ){.
1790: 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b free(zFilename);
17a0: 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d . zFilename =
17b0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 0;. }. return
17c0: 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f zFilename;.}../
17d0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 *.** Convert an
17e0: 61 6e 73 69 20 73 74 72 69 6e 67 20 74 6f 20 6d ansi string to m
17f0: 69 63 72 6f 73 6f 66 74 20 75 6e 69 63 6f 64 65 icrosoft unicode
1800: 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a , based on the.*
1810: 2a 20 63 75 72 72 65 6e 74 20 63 6f 64 65 70 61 * current codepa
1820: 67 65 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20 ge settings for
1830: 66 69 6c 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a file apis..** .*
1840: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 * Space to hold
1850: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 the returned str
1860: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 0a ing is obtained.
1870: 2a 2a 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a ** from malloc..
1880: 2a 2f 0a 73 74 61 74 69 63 20 57 43 48 41 52 20 */.static WCHAR
1890: 2a 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 63 *mbcsToUnicode(c
18a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 onst char *zFile
18b0: 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 name){. int nBy
18c0: 74 65 3b 0a 20 20 57 43 48 41 52 20 2a 7a 4d 62 te;. WCHAR *zMb
18d0: 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e csFilename;. in
18e0: 74 20 63 6f 64 65 70 61 67 65 20 3d 20 41 72 65 t codepage = Are
18f0: 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f FileApisANSI() ?
1900: 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d CP_ACP : CP_OEM
1910: 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 4d CP;.. nByte = M
1920: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 ultiByteToWideCh
1930: 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 ar(codepage, 0,
1940: 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e zFilename, -1, N
1950: 55 4c 4c 2c 30 29 2a 73 69 7a 65 6f 66 28 57 43 ULL,0)*sizeof(WC
1960: 48 41 52 29 3b 0a 20 20 7a 4d 62 63 73 46 69 6c HAR);. zMbcsFil
1970: 65 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 ename = malloc(
1980: 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 4d 62 nByte*sizeof(zMb
1990: 63 73 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 csFilename[0]) )
19a0: 3b 0a 20 20 69 66 28 20 7a 4d 62 63 73 46 69 6c ;. if( zMbcsFil
19b0: 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 ename==0 ){.
19c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 return 0;. }.
19d0: 6e 42 79 74 65 20 3d 20 4d 75 6c 74 69 42 79 74 nByte = MultiByt
19e0: 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65 eToWideChar(code
19f0: 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 page, 0, zFilena
1a00: 6d 65 2c 20 2d 31 2c 20 7a 4d 62 63 73 46 69 6c me, -1, zMbcsFil
1a10: 65 6e 61 6d 65 2c 20 6e 42 79 74 65 29 3b 0a 20 ename, nByte);.
1a20: 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b if( nByte==0 ){
1a30: 0a 20 20 20 20 66 72 65 65 28 7a 4d 62 63 73 46 . free(zMbcsF
1a40: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 4d ilename);. zM
1a50: 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b bcsFilename = 0;
1a60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4d . }. return zM
1a70: 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a bcsFilename;.}..
1a80: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 69 /*.** Convert mi
1a90: 63 72 6f 73 6f 66 74 20 75 6e 69 63 6f 64 65 20 crosoft unicode
1aa0: 74 6f 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61 to multibyte cha
1ab0: 72 61 63 74 65 72 20 73 74 72 69 6e 67 2c 20 62 racter string, b
1ac0: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 75 ased on the.** u
1ad0: 73 65 72 27 73 20 41 6e 73 69 20 63 6f 64 65 70 ser's Ansi codep
1ae0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 age..**.** Space
1af0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 to hold the ret
1b00: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 urned string is
1b10: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a obtained from.**
1b20: 20 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 malloc()..*/.st
1b30: 61 74 69 63 20 63 68 61 72 20 2a 75 6e 69 63 6f atic char *unico
1b40: 64 65 54 6f 4d 62 63 73 28 63 6f 6e 73 74 20 57 deToMbcs(const W
1b50: 43 48 41 52 20 2a 7a 57 69 64 65 46 69 6c 65 6e CHAR *zWideFilen
1b60: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 ame){. int nByt
1b70: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 e;. char *zFile
1b80: 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 name;. int code
1b90: 70 61 67 65 20 3d 20 41 72 65 46 69 6c 65 41 70 page = AreFileAp
1ba0: 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 isANSI() ? CP_AC
1bb0: 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 P : CP_OEMCP;..
1bc0: 20 6e 42 79 74 65 20 3d 20 57 69 64 65 43 68 61 nByte = WideCha
1bd0: 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 rToMultiByte(cod
1be0: 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 epage, 0, zWideF
1bf0: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 ilename, -1, 0,
1c00: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7a 46 69 6c 0, 0, 0);. zFil
1c10: 65 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 ename = malloc(
1c20: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a nByte );. if( z
1c30: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 Filename==0 ){.
1c40: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d return 0;. }
1c50: 0a 20 20 6e 42 79 74 65 20 3d 20 57 69 64 65 43 . nByte = WideC
1c60: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 harToMultiByte(c
1c70: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 odepage, 0, zWid
1c80: 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a eFilename, -1, z
1c90: 46 69 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c Filename, nByte,
1ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0
1cc0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 , 0);. if( nByt
1cd0: 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 66 72 e == 0 ){. fr
1ce0: 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 ee(zFilename);.
1cf0: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 zFilename = 0
1d00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a ;. }. return z
1d10: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a Filename;.}../*.
1d20: 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 75 6c 74 69 ** Convert multi
1d30: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73 byte character s
1d40: 74 72 69 6e 67 20 74 6f 20 55 54 46 2d 38 2e 20 tring to UTF-8.
1d50: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 Space to hold t
1d60: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 he.** returned s
1d70: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 tring is obtaine
1d80: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e d from malloc().
1d90: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 .*/.static char
1da0: 2a 6d 62 63 73 54 6f 55 74 66 38 28 63 6f 6e 73 *mbcsToUtf8(cons
1db0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d t char *zFilenam
1dc0: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c e){. char *zFil
1dd0: 65 6e 61 6d 65 55 74 66 38 3b 0a 20 20 57 43 48 enameUtf8;. WCH
1de0: 41 52 20 2a 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 AR *zTmpWide;..
1df0: 20 7a 54 6d 70 57 69 64 65 20 3d 20 6d 62 63 73 zTmpWide = mbcs
1e00: 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e ToUnicode(zFilen
1e10: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 ame);. if( zTmp
1e20: 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 Wide==0 ){. r
1e30: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a eturn 0;. }. z
1e40: 46 69 6c 65 6e 61 6d 65 55 74 66 38 20 3d 20 75 FilenameUtf8 = u
1e50: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 6d nicodeToUtf8(zTm
1e60: 70 57 69 64 65 29 3b 0a 20 20 66 72 65 65 28 7a pWide);. free(z
1e70: 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 TmpWide);. retu
1e80: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 rn zFilenameUtf8
1e90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 ;.}../*.** Conve
1ea0: 72 74 20 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74 rt UTF-8 to mult
1eb0: 69 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 ibyte character
1ec0: 73 74 72 69 6e 67 2e 20 20 53 70 61 63 65 20 74 string. Space t
1ed0: 6f 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72 o hold the .** r
1ee0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 eturned string i
1ef0: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 s obtained from
1f00: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 malloc()..*/.sta
1f10: 74 69 63 20 63 68 61 72 20 2a 75 74 66 38 54 6f tic char *utf8To
1f20: 4d 62 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20 Mbcs(const char
1f30: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 *zFilename){. c
1f40: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62 har *zFilenameMb
1f50: 63 73 3b 0a 20 20 57 43 48 41 52 20 2a 7a 54 6d cs;. WCHAR *zTm
1f60: 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 pWide;.. zTmpWi
1f70: 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f de = utf8ToUnico
1f80: 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 de(zFilename);.
1f90: 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 if( zTmpWide==0
1fa0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 ){. return 0
1fb0: 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d ;. }. zFilenam
1fc0: 65 4d 62 63 73 20 3d 20 75 6e 69 63 6f 64 65 54 eMbcs = unicodeT
1fd0: 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64 65 29 3b oMbcs(zTmpWide);
1fe0: 0a 20 20 66 72 65 65 28 7a 54 6d 70 57 69 64 65 . free(zTmpWide
1ff0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c );. return zFil
2000: 65 6e 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a 23 69 enameMbcs;.}..#i
2010: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 f SQLITE_OS_WINC
2020: 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a E./*************
2030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 ************.**
2070: 54 68 69 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e This section con
2080: 74 61 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 57 tains code for W
2090: 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 2f 2a inCE only..*/./*
20a0: 0a 2a 2a 20 57 69 6e 64 6f 77 73 43 45 20 64 6f .** WindowsCE do
20b0: 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f es not have a lo
20c0: 63 61 6c 74 69 6d 65 28 29 20 66 75 6e 63 74 69 caltime() functi
20d0: 6f 6e 2e 20 20 53 6f 20 63 72 65 61 74 65 20 61 on. So create a
20e0: 0a 2a 2a 20 73 75 62 73 74 69 74 75 74 65 2e 0a .** substitute..
20f0: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d */.#include <tim
2100: 65 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a e.h>.struct tm *
2110: 5f 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d __cdecl localtim
2120: 65 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a e(const time_t *
2130: 74 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 73 74 t).{. static st
2140: 72 75 63 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c ruct tm y;. FIL
2150: 45 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a ETIME uTm, lTm;.
2160: 20 20 53 59 53 54 45 4d 54 49 4d 45 20 70 54 6d SYSTEMTIME pTm
2170: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 ;. sqlite3_int6
2180: 34 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a 4 t64;. t64 = *
2190: 74 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34 20 t;. t64 = (t64
21a0: 2b 20 31 31 36 34 34 34 37 33 36 30 30 29 2a 31 + 11644473600)*1
21b0: 30 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64 0000000;. uTm.d
21c0: 77 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20 74 wLowDateTime = t
21d0: 36 34 20 26 20 30 78 46 46 46 46 46 46 46 46 3b 64 & 0xFFFFFFFF;
21e0: 0a 20 20 75 54 6d 2e 64 77 48 69 67 68 44 61 74 . uTm.dwHighDat
21f0: 65 54 69 6d 65 3d 20 74 36 34 20 3e 3e 20 33 32 eTime= t64 >> 32
2200: 3b 0a 20 20 46 69 6c 65 54 69 6d 65 54 6f 4c 6f ;. FileTimeToLo
2210: 63 61 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 6d calFileTime(&uTm
2220: 2c 26 6c 54 6d 29 3b 0a 20 20 46 69 6c 65 54 69 ,&lTm);. FileTi
2230: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26 meToSystemTime(&
2240: 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74 lTm,&pTm);. y.t
2250: 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65 m_year = pTm.wYe
2260: 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74 ar - 1900;. y.t
2270: 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e m_mon = pTm.wMon
2280: 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77 th - 1;. y.tm_w
2290: 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66 day = pTm.wDayOf
22a0: 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61 Week;. y.tm_mda
22b0: 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20 y = pTm.wDay;.
22c0: 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e y.tm_hour = pTm.
22d0: 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69 wHour;. y.tm_mi
22e0: 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b n = pTm.wMinute;
22f0: 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54 . y.tm_sec = pT
2300: 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74 m.wSecond;. ret
2310: 75 72 6e 20 26 79 3b 0a 7d 0a 0a 2f 2a 20 54 68 urn &y;.}../* Th
2320: 69 73 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 is will never be
2330: 20 63 61 6c 6c 65 64 2c 20 62 75 74 20 64 65 66 called, but def
2340: 69 6e 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 ined to make the
2350: 20 63 6f 64 65 20 63 6f 6d 70 69 6c 65 20 2a 2f code compile */
2360: 0a 23 64 65 66 69 6e 65 20 47 65 74 54 65 6d 70 .#define GetTemp
2370: 50 61 74 68 41 28 61 2c 62 29 0a 0a 23 64 65 66 PathA(a,b)..#def
2380: 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 28 61 2c 62 ine LockFile(a,b
2390: 2c 63 2c 64 2c 65 29 20 20 20 20 20 20 20 77 69 ,c,d,e) wi
23a0: 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26 61 2c 20 nceLockFile(&a,
23b0: 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23 64 65 66 b, c, d, e).#def
23c0: 69 6e 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 61 ine UnlockFile(a
23d0: 2c 62 2c 63 2c 64 2c 65 29 20 20 20 20 20 77 69 ,b,c,d,e) wi
23e0: 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 61 nceUnlockFile(&a
23f0: 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23 64 , b, c, d, e).#d
2400: 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 45 78 efine LockFileEx
2410: 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 20 20 (a,b,c,d,e,f)
2420: 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45 78 28 winceLockFileEx(
2430: 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 2c 20 &a, b, c, d, e,
2440: 66 29 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 f)..#define HAND
2450: 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 LE_TO_WINFILE(a)
2460: 20 28 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 (winFile*)&((ch
2470: 61 72 2a 29 61 29 5b 2d 6f 66 66 73 65 74 6f 66 ar*)a)[-offsetof
2480: 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f 2a (winFile,h)]../*
2490: 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 6c 6f .** Acquire a lo
24a0: 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64 6c 65 ck on the handle
24b0: 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 h.*/.static voi
24c0: 64 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 d winceMutexAcqu
24d0: 69 72 65 28 48 41 4e 44 4c 45 20 68 29 7b 0a 20 ire(HANDLE h){.
24e0: 20 20 44 57 4f 52 44 20 64 77 45 72 72 3b 0a 20 DWORD dwErr;.
24f0: 20 20 64 6f 20 7b 0a 20 20 20 20 20 64 77 45 72 do {. dwEr
2500: 72 20 3d 20 57 61 69 74 46 6f 72 53 69 6e 67 6c r = WaitForSingl
2510: 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e 46 49 4e eObject(h, INFIN
2520: 49 54 45 29 3b 0a 20 20 20 7d 20 77 68 69 6c 65 ITE);. } while
2530: 20 28 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f (dwErr != WAIT_
2540: 4f 42 4a 45 43 54 5f 30 20 26 26 20 64 77 45 72 OBJECT_0 && dwEr
2550: 72 20 21 3d 20 57 41 49 54 5f 41 42 41 4e 44 4f r != WAIT_ABANDO
2560: 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 NED);.}./*.** Re
2570: 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20 61 63 71 lease a lock acq
2580: 75 69 72 65 64 20 62 79 20 77 69 6e 63 65 4d 75 uired by winceMu
2590: 74 65 78 41 63 71 75 69 72 65 28 29 0a 2a 2f 0a texAcquire().*/.
25a0: 23 64 65 66 69 6e 65 20 77 69 6e 63 65 4d 75 74 #define winceMut
25b0: 65 78 52 65 6c 65 61 73 65 28 68 29 20 52 65 6c exRelease(h) Rel
25c0: 65 61 73 65 4d 75 74 65 78 28 68 29 0a 0a 2f 2a easeMutex(h)../*
25d0: 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 6d .** Create the m
25e0: 75 74 65 78 20 61 6e 64 20 73 68 61 72 65 64 20 utex and shared
25f0: 6d 65 6d 6f 72 79 20 75 73 65 64 20 66 6f 72 20 memory used for
2600: 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 65 20 66 locking in the f
2610: 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f ile.** descripto
2620: 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 r pFile.*/.stati
2630: 63 20 42 4f 4f 4c 20 77 69 6e 63 65 43 72 65 61 c BOOL winceCrea
2640: 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68 61 teLock(const cha
2650: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 77 69 r *zFilename, wi
2660: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 nFile *pFile){.
2670: 20 57 43 48 41 52 20 2a 7a 54 6f 6b 3b 0a 20 20 WCHAR *zTok;.
2680: 57 43 48 41 52 20 2a 7a 4e 61 6d 65 20 3d 20 75 WCHAR *zName = u
2690: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 tf8ToUnicode(zFi
26a0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 42 4f 4f 4c 20 lename);. BOOL
26b0: 62 49 6e 69 74 20 3d 20 54 52 55 45 3b 0a 0a 20 bInit = TRUE;..
26c0: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 /* Initialize t
26d0: 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74 he local lockdat
26e0: 61 20 2a 2f 0a 20 20 5a 65 72 6f 4d 65 6d 6f 72 a */. ZeroMemor
26f0: 79 28 26 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2c y(&pFile->local,
2700: 20 73 69 7a 65 6f 66 28 70 46 69 6c 65 2d 3e 6c sizeof(pFile->l
2710: 6f 63 61 6c 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 ocal));.. /* Re
2720: 70 6c 61 63 65 20 74 68 65 20 62 61 63 6b 73 6c place the backsl
2730: 61 73 68 65 73 20 66 72 6f 6d 20 74 68 65 20 66 ashes from the f
2740: 69 6c 65 6e 61 6d 65 20 61 6e 64 20 6c 6f 77 65 ilename and lowe
2750: 72 63 61 73 65 20 69 74 0a 20 20 2a 2a 20 74 6f rcase it. ** to
2760: 20 64 65 72 69 76 65 20 61 20 6d 75 74 65 78 20 derive a mutex
2770: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 name. */. zTok
2780: 3d 20 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61 = CharLowerW(zNa
2790: 6d 65 29 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 me);. for (;*zT
27a0: 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 ok;zTok++){.
27b0: 69 66 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c if (*zTok == '\\
27c0: 27 29 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a ') *zTok = '_';.
27d0: 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 }.. /* Create
27e0: 2f 6f 70 65 6e 20 74 68 65 20 6e 61 6d 65 64 20 /open the named
27f0: 6d 75 74 65 78 20 2a 2f 0a 20 20 70 46 69 6c 65 mutex */. pFile
2800: 2d 3e 68 4d 75 74 65 78 20 3d 20 43 72 65 61 74 ->hMutex = Creat
2810: 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41 eMutexW(NULL, FA
2820: 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 LSE, zName);. i
2830: 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 f (!pFile->hMute
2840: 78 29 7b 0a 20 20 20 20 66 72 65 65 28 7a 4e 61 x){. free(zNa
2850: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 me);. return
2860: 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a FALSE;. }.. /*
2870: 20 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 Acquire the mut
2880: 65 78 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e ex before contin
2890: 75 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d uing */. winceM
28a0: 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c utexAcquire(pFil
28b0: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 0a 20 e->hMutex);. .
28c0: 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 6e 61 /* Since the na
28d0: 6d 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74 mes of named mut
28e0: 65 78 65 73 2c 20 73 65 6d 61 70 68 6f 72 65 73 exes, semaphores
28f0: 2c 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 73 20 , file mappings
2900: 65 74 63 20 61 72 65 20 0a 20 20 2a 2a 20 63 61 etc are . ** ca
2910: 73 65 2d 73 65 6e 73 69 74 69 76 65 2c 20 74 61 se-sensitive, ta
2920: 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 ke advantage of
2930: 74 68 61 74 20 62 79 20 75 70 70 65 72 63 61 73 that by uppercas
2940: 69 6e 67 20 74 68 65 20 6d 75 74 65 78 20 6e 61 ing the mutex na
2950: 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69 6e me. ** and usin
2960: 67 20 74 68 61 74 20 61 73 20 74 68 65 20 73 68 g that as the sh
2970: 61 72 65 64 20 66 69 6c 65 6d 61 70 70 69 6e 67 ared filemapping
2980: 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 43 68 name.. */. Ch
2990: 61 72 55 70 70 65 72 57 28 7a 4e 61 6d 65 29 3b arUpperW(zName);
29a0: 0a 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 . pFile->hShare
29b0: 64 20 3d 20 43 72 65 61 74 65 46 69 6c 65 4d 61 d = CreateFileMa
29c0: 70 70 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48 ppingW(INVALID_H
29d0: 41 4e 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c ANDLE_VALUE, NUL
29e0: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 L,.
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2a00: 20 20 20 20 20 20 20 20 20 20 50 41 47 45 5f 52 PAGE_R
2a10: 45 41 44 57 52 49 54 45 2c 20 30 2c 20 73 69 7a EADWRITE, 0, siz
2a20: 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a eof(winceLock),.
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2a50: 20 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b 20 20 zName);
2a60: 0a 0a 20 20 2f 2a 20 53 65 74 20 61 20 66 6c 61 .. /* Set a fla
2a70: 67 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 g that indicates
2a80: 20 77 65 27 72 65 20 74 68 65 20 66 69 72 73 74 we're the first
2a90: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 6d to create the m
2aa0: 65 6d 6f 72 79 20 73 6f 20 69 74 20 0a 20 20 2a emory so it . *
2ab0: 2a 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 69 * must be zero-i
2ac0: 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 nitialized */.
2ad0: 69 66 20 28 47 65 74 4c 61 73 74 45 72 72 6f 72 if (GetLastError
2ae0: 28 29 20 3d 3d 20 45 52 52 4f 52 5f 41 4c 52 45 () == ERROR_ALRE
2af0: 41 44 59 5f 45 58 49 53 54 53 29 7b 0a 20 20 20 ADY_EXISTS){.
2b00: 20 62 49 6e 69 74 20 3d 20 46 41 4c 53 45 3b 0a bInit = FALSE;.
2b10: 20 20 7d 0a 0a 20 20 66 72 65 65 28 7a 4e 61 6d }.. free(zNam
2b20: 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 e);.. /* If we
2b30: 73 75 63 63 65 65 64 65 64 20 69 6e 20 6d 61 6b succeeded in mak
2b40: 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d ing the shared m
2b50: 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61 emory handle, ma
2b60: 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66 20 28 70 p it. */. if (p
2b70: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 7b 0a File->hShared){.
2b80: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 pFile->share
2b90: 64 20 3d 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 d = (winceLock*)
2ba0: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 MapViewOfFile(pF
2bb0: 69 6c 65 2d 3e 68 53 68 61 72 65 64 2c 20 0a 20 ile->hShared, .
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 FILE
2bd0: 5f 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d _MAP_READ|FILE_M
2be0: 41 50 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 AP_WRITE, 0, 0,
2bf0: 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b sizeof(winceLock
2c00: 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61 ));. /* If ma
2c10: 70 70 69 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c pping failed, cl
2c20: 6f 73 65 20 74 68 65 20 73 68 61 72 65 64 20 6d ose the shared m
2c30: 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e 64 emory handle and
2c40: 20 65 72 61 73 65 20 69 74 20 2a 2f 0a 20 20 20 erase it */.
2c50: 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 73 68 61 if (!pFile->sha
2c60: 72 65 64 29 7b 0a 20 20 20 20 20 20 43 6c 6f 73 red){. Clos
2c70: 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 eHandle(pFile->h
2c80: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 Shared);. p
2c90: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 File->hShared =
2ca0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a NULL;. }. }.
2cb0: 0a 20 20 2f 2a 20 49 66 20 73 68 61 72 65 64 20 . /* If shared
2cc0: 6d 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 memory could not
2cd0: 20 62 65 20 63 72 65 61 74 65 64 2c 20 74 68 65 be created, the
2ce0: 6e 20 63 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 n close the mute
2cf0: 78 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20 x and fail */.
2d00: 69 66 20 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 if (pFile->hShar
2d10: 65 64 20 3d 3d 20 4e 55 4c 4c 29 7b 0a 20 20 20 ed == NULL){.
2d20: 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 winceMutexRelea
2d30: 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 se(pFile->hMutex
2d40: 29 3b 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 );. CloseHand
2d50: 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 le(pFile->hMutex
2d60: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d );. pFile->hM
2d70: 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 utex = NULL;.
2d80: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 20 return FALSE;.
2d90: 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69 }. . /* Initi
2da0: 61 6c 69 7a 65 20 74 68 65 20 73 68 61 72 65 64 alize the shared
2db0: 20 6d 65 6d 6f 72 79 20 69 66 20 77 65 27 72 65 memory if we're
2dc0: 20 73 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a supposed to */.
2dd0: 20 20 69 66 20 28 62 49 6e 69 74 29 20 7b 0a 20 if (bInit) {.
2de0: 20 20 20 5a 65 72 6f 4d 65 6d 6f 72 79 28 70 46 ZeroMemory(pF
2df0: 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 73 69 7a ile->shared, siz
2e00: 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b eof(winceLock));
2e10: 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 . }.. winceMut
2e20: 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d exRelease(pFile-
2e30: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 >hMutex);. retu
2e40: 72 6e 20 54 52 55 45 3b 0a 7d 0a 0a 2f 2a 0a 2a rn TRUE;.}../*.*
2e50: 2a 20 44 65 73 74 72 6f 79 20 74 68 65 20 70 61 * Destroy the pa
2e60: 72 74 20 6f 66 20 77 69 6e 46 69 6c 65 20 74 68 rt of winFile th
2e70: 61 74 20 64 65 61 6c 73 20 77 69 74 68 20 77 69 at deals with wi
2e80: 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61 nce locks.*/.sta
2e90: 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 44 65 tic void winceDe
2ea0: 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46 69 6c stroyLock(winFil
2eb0: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66 20 e *pFile){. if
2ec0: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b (pFile->hMutex){
2ed0: 0a 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 . /* Acquire
2ee0: 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 the mutex */.
2ef0: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 winceMutexAcqui
2f00: 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 re(pFile->hMutex
2f10: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 );.. /* The f
2f20: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 73 20 ollowing blocks
2f30: 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 should probably
2f40: 61 73 73 65 72 74 20 69 6e 20 64 65 62 75 67 20 assert in debug
2f50: 6d 6f 64 65 2c 20 62 75 74 20 74 68 65 79 0a 20 mode, but they.
2f60: 20 20 20 20 20 20 61 72 65 20 74 6f 20 63 6c 65 are to cle
2f70: 61 6e 75 70 20 69 6e 20 63 61 73 65 20 61 6e 79 anup in case any
2f80: 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65 64 20 locks remained
2f90: 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 open */. if (
2fa0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 pFile->local.nRe
2fb0: 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 70 46 aders){. pF
2fc0: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 ile->shared->nRe
2fd0: 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a aders --;. }.
2fe0: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c if (pFile->l
2ff0: 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 7b ocal.bReserved){
3000: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 . pFile->sh
3010: 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 ared->bReserved
3020: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 = FALSE;. }.
3030: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f if (pFile->lo
3040: 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 cal.bPending){.
3050: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 pFile->shar
3060: 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 ed->bPending = F
3070: 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ALSE;. }.
3080: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c if (pFile->local
3090: 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 .bExclusive){.
30a0: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 pFile->share
30b0: 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 d->bExclusive =
30c0: 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 FALSE;. }..
30d0: 20 20 2f 2a 20 44 65 2d 72 65 66 65 72 65 6e 63 /* De-referenc
30e0: 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75 72 20 e and close our
30f0: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 68 61 72 copy of the shar
3100: 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 ed memory handle
3110: 20 2a 2f 0a 20 20 20 20 55 6e 6d 61 70 56 69 65 */. UnmapVie
3120: 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 73 wOfFile(pFile->s
3130: 68 61 72 65 64 29 3b 0a 20 20 20 20 43 6c 6f 73 hared);. Clos
3140: 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 eHandle(pFile->h
3150: 53 68 61 72 65 64 29 3b 0a 0a 20 20 20 20 2f 2a Shared);.. /*
3160: 20 44 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d Done with the m
3170: 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 utex */. winc
3180: 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 eMutexRelease(pF
3190: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 20 20 20 ile->hMutex);
31a0: 20 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c . CloseHandl
31b0: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 e(pFile->hMutex)
31c0: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 ;. pFile->hMu
31d0: 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a tex = NULL;. }.
31e0: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e 20 69 6d 70 }../* .** An imp
31f0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 lementation of t
3200: 68 65 20 4c 6f 63 6b 46 69 6c 65 28 29 20 41 50 he LockFile() AP
3210: 49 20 6f 66 20 77 69 6e 64 6f 77 73 20 66 6f 72 I of windows for
3220: 20 77 69 6e 63 65 0a 2a 2f 0a 73 74 61 74 69 63 wince.*/.static
3230: 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 BOOL winceLockF
3240: 69 6c 65 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 ile(. HANDLE *p
3250: 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 hFile,. DWORD d
3260: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a wFileOffsetLow,.
3270: 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 DWORD dwFileOf
3280: 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 fsetHigh,. DWOR
3290: 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 D nNumberOfBytes
32a0: 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f ToLockLow,. DWO
32b0: 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 RD nNumberOfByte
32c0: 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 sToLockHigh.){.
32d0: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 winFile *pFile
32e0: 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 = HANDLE_TO_WINF
32f0: 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 ILE(phFile);. B
3300: 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41 OOL bReturn = FA
3310: 4c 53 45 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 LSE;.. if (!pFi
3320: 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75 le->hMutex) retu
3330: 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 rn TRUE;. wince
3340: 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69 MutexAcquire(pFi
3350: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 le->hMutex);..
3360: 2f 2a 20 57 61 6e 74 69 6e 67 20 61 6e 20 65 78 /* Wanting an ex
3370: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f clusive lock? */
3380: 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 . if (dwFileOff
3390: 73 65 74 4c 6f 77 20 3d 3d 20 53 48 41 52 45 44 setLow == SHARED
33a0: 5f 46 49 52 53 54 0a 20 20 20 20 20 20 20 26 26 _FIRST. &&
33b0: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 nNumberOfBytesT
33c0: 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 53 48 41 52 oLockLow == SHAR
33d0: 45 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20 69 66 ED_SIZE){. if
33e0: 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d (pFile->shared-
33f0: 3e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 20 26 >nReaders == 0 &
3400: 26 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d & pFile->shared-
3410: 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 >bExclusive == 0
3420: 29 7b 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d ){. pFile-
3430: 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 >shared->bExclus
3440: 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 ive = TRUE;.
3450: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e pFile->local.
3460: 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 bExclusive = TRU
3470: 45 3b 0a 20 20 20 20 20 20 20 62 52 65 74 75 72 E;. bRetur
3480: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a n = TRUE;. }.
3490: 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 }.. /* Want a
34a0: 20 72 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f read-only lock?
34b0: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 28 */. else if ((
34c0: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 dwFileOffsetLow
34d0: 3e 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 >= SHARED_FIRST
34e0: 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 &&. d
34f0: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3c wFileOffsetLow <
3500: 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 SHARED_FIRST +
3510: 53 48 41 52 45 44 5f 53 49 5a 45 29 20 26 26 0a SHARED_SIZE) &&.
3520: 20 20 20 20 20 20 20 20 20 20 20 20 6e 4e 75 6d nNum
3530: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b berOfBytesToLock
3540: 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 Low == 1){. i
3550: 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 f (pFile->shared
3560: 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 ->bExclusive ==
3570: 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 0){. pFile-
3580: 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 >local.nReaders
3590: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 ++;. if (pF
35a0: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 ile->local.nRead
35b0: 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20 ers == 1){.
35c0: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 pFile->shared
35d0: 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 ->nReaders ++;.
35e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 }. bRe
35f0: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 turn = TRUE;.
3600: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e }. }.. /* Wan
3610: 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b t a pending lock
3620: 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 ? */. else if (
3630: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 dwFileOffsetLow
3640: 3d 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 == PENDING_BYTE
3650: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 && nNumberOfByte
3660: 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 sToLockLow == 1)
3670: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70 {. /* If no p
3680: 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 ending lock has
3690: 62 65 65 6e 20 61 63 71 75 69 72 65 64 2c 20 74 been acquired, t
36a0: 68 65 6e 20 61 63 71 75 69 72 65 20 69 74 20 2a hen acquire it *
36b0: 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d /. if (pFile-
36c0: 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e >shared->bPendin
36d0: 67 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 g == 0) {.
36e0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 pFile->shared->b
36f0: 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a Pending = TRUE;.
3700: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 pFile->loc
3710: 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 al.bPending = TR
3720: 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 UE;. bRetur
3730: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a n = TRUE;. }.
3740: 20 20 7d 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 }. /* Want a
3750: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 3f 20 2a reserved lock? *
3760: 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 /. else if (dwF
3770: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 ileOffsetLow ==
3780: 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 26 26 RESERVED_BYTE &&
3790: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 nNumberOfBytesT
37a0: 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a oLockLow == 1){.
37b0: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 if (pFile->s
37c0: 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 hared->bReserved
37d0: 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70 == 0) {. p
37e0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 File->shared->bR
37f0: 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a eserved = TRUE;.
3800: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 pFile->loc
3810: 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20 54 al.bReserved = T
3820: 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 RUE;. bRetu
3830: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d rn = TRUE;. }
3840: 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 . }.. winceMut
3850: 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d exRelease(pFile-
3860: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 >hMutex);. retu
3870: 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f rn bReturn;.}../
3880: 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e *.** An implemen
3890: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 55 6e tation of the Un
38a0: 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f 66 20 lockFile API of
38b0: 77 69 6e 64 6f 77 73 20 66 6f 72 20 77 69 6e 63 windows for winc
38c0: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c e.*/.static BOOL
38d0: 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 winceUnlockFile
38e0: 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46 69 (. HANDLE *phFi
38f0: 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 le,. DWORD dwFi
3900: 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 leOffsetLow,. D
3910: 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 WORD dwFileOffse
3920: 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e tHigh,. DWORD n
3930: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 NumberOfBytesToU
3940: 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 nlockLow,. DWOR
3950: 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 D nNumberOfBytes
3960: 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a ToUnlockHigh.){.
3970: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 winFile *pFile
3980: 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e = HANDLE_TO_WIN
3990: 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 FILE(phFile);.
39a0: 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 BOOL bReturn = F
39b0: 41 4c 53 45 3b 0a 0a 20 20 69 66 20 28 21 70 46 ALSE;.. if (!pF
39c0: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 ile->hMutex) ret
39d0: 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 urn TRUE;. winc
39e0: 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46 eMutexAcquire(pF
39f0: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 ile->hMutex);..
3a00: 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 /* Releasing a
3a10: 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20 61 reader lock or a
3a20: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b n exclusive lock
3a30: 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65 */. if (dwFile
3a40: 4f 66 66 73 65 74 4c 6f 77 20 3e 3d 20 53 48 41 OffsetLow >= SHA
3a50: 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20 20 20 RED_FIRST &&.
3a60: 20 20 20 20 64 77 46 69 6c 65 4f 66 66 73 65 74 dwFileOffset
3a70: 4c 6f 77 20 3c 20 53 48 41 52 45 44 5f 46 49 52 Low < SHARED_FIR
3a80: 53 54 20 2b 20 53 48 41 52 45 44 5f 53 49 5a 45 ST + SHARED_SIZE
3a90: 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65 ){. /* Did we
3aa0: 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 have an exclusi
3ab0: 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 ve lock? */.
3ac0: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c if (pFile->local
3ad0: 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 .bExclusive){.
3ae0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c pFile->local
3af0: 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 .bExclusive = FA
3b00: 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 LSE;. pFile
3b10: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 ->shared->bExclu
3b20: 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 sive = FALSE;.
3b30: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 bReturn = TR
3b40: 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f UE;. }.. /
3b50: 2a 20 44 69 64 20 77 65 20 6a 75 73 74 20 68 61 * Did we just ha
3b60: 76 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b ve a reader lock
3b70: 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 ? */. else if
3b80: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e (pFile->local.n
3b90: 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 Readers){.
3ba0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 pFile->local.nRe
3bb0: 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 aders --;.
3bc0: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c if (pFile->local
3bd0: 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 29 0a .nReaders == 0).
3be0: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 {.
3bf0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e pFile->shared->n
3c00: 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 Readers --;.
3c10: 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72 }. bRetur
3c20: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a n = TRUE;. }.
3c30: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 }.. /* Releas
3c40: 69 6e 67 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f ing a pending lo
3c50: 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 ck */. else if
3c60: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 (dwFileOffsetLow
3c70: 20 3d 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 == PENDING_BYTE
3c80: 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 && nNumberOfByt
3c90: 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d esToUnlockLow ==
3ca0: 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 1){. if (pFi
3cb0: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 le->local.bPendi
3cc0: 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 ng){. pFile
3cd0: 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 ->local.bPending
3ce0: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 = FALSE;.
3cf0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 pFile->shared->b
3d00: 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b Pending = FALSE;
3d10: 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d . bReturn =
3d20: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d TRUE;. }. }
3d30: 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 . /* Releasing
3d40: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 a reserved lock
3d50: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 */. else if (dw
3d60: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d FileOffsetLow ==
3d70: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 26 RESERVED_BYTE &
3d80: 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 & nNumberOfBytes
3d90: 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 ToUnlockLow == 1
3da0: 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 ){. if (pFile
3db0: 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 ->local.bReserve
3dc0: 64 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 d) {. pFile
3dd0: 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 ->local.bReserve
3de0: 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 d = FALSE;.
3df0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e pFile->shared->
3e00: 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 bReserved = FALS
3e10: 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e E;. bReturn
3e20: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 = TRUE;. }.
3e30: 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 }.. winceMutex
3e40: 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 Release(pFile->h
3e50: 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e Mutex);. return
3e60: 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a bReturn;.}../*.
3e70: 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 ** An implementa
3e80: 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b tion of the Lock
3e90: 46 69 6c 65 45 78 28 29 20 41 50 49 20 6f 66 20 FileEx() API of
3ea0: 77 69 6e 64 6f 77 73 20 66 6f 72 20 77 69 6e 63 windows for winc
3eb0: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c e.*/.static BOOL
3ec0: 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45 78 winceLockFileEx
3ed0: 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46 69 (. HANDLE *phFi
3ee0: 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 6c le,. DWORD dwFl
3ef0: 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 64 77 52 ags,. DWORD dwR
3f00: 65 73 65 72 76 65 64 2c 0a 20 20 44 57 4f 52 44 eserved,. DWORD
3f10: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 nNumberOfBytesT
3f20: 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 oLockLow,. DWOR
3f30: 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 D nNumberOfBytes
3f40: 54 6f 4c 6f 63 6b 48 69 67 68 2c 0a 20 20 4c 50 ToLockHigh,. LP
3f50: 4f 56 45 52 4c 41 50 50 45 44 20 6c 70 4f 76 65 OVERLAPPED lpOve
3f60: 72 6c 61 70 70 65 64 0a 29 7b 0a 20 20 2f 2a 20 rlapped.){. /*
3f70: 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 77 61 If the caller wa
3f80: 6e 74 73 20 61 20 73 68 61 72 65 64 20 72 65 61 nts a shared rea
3f90: 64 20 6c 6f 63 6b 2c 20 66 6f 72 77 61 72 64 20 d lock, forward
3fa0: 74 68 69 73 20 63 61 6c 6c 0a 20 20 2a 2a 20 74 this call. ** t
3fb0: 6f 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 20 o winceLockFile
3fc0: 2a 2f 0a 20 20 69 66 20 28 6c 70 4f 76 65 72 6c */. if (lpOverl
3fd0: 61 70 70 65 64 2d 3e 4f 66 66 73 65 74 20 3d 3d apped->Offset ==
3fe0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 26 26 SHARED_FIRST &&
3ff0: 0a 20 20 20 20 20 20 64 77 46 6c 61 67 73 20 3d . dwFlags =
4000: 3d 20 31 20 26 26 0a 20 20 20 20 20 20 6e 4e 75 = 1 &&. nNu
4010: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 mberOfBytesToLoc
4020: 6b 4c 6f 77 20 3d 3d 20 53 48 41 52 45 44 5f 53 kLow == SHARED_S
4030: 49 5a 45 29 7b 0a 20 20 20 20 72 65 74 75 72 6e IZE){. return
4040: 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70 winceLockFile(p
4050: 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 hFile, SHARED_FI
4060: 52 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 RST, 0, 1, 0);.
4070: 20 7d 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53 }. return FALS
4080: 45 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f E;.}./*.** End o
4090: 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 6f f the special co
40a0: 64 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a de for wince.***
40b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
40c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
40d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
40e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
40f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 **********/.#end
4100: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f if /* SQLITE_OS_
4110: 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a WINCE */../*****
4120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
4130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
4140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
4150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
4160: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 ********.** The
4170: 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20 72 6f next group of ro
4180: 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 utines implement
4190: 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 the I/O methods
41a0: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 specified.** by
41b0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f the sqlite3_io_
41c0: 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a methods object..
41d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
41e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
41f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
4200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
4210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a **************/.
4220: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 ./*.** Close a f
4230: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 ile..**.** It is
4240: 20 72 65 70 6f 72 74 65 64 20 74 68 61 74 20 61 reported that a
4250: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f n attempt to clo
4260: 73 65 20 61 20 68 61 6e 64 6c 65 20 6d 69 67 68 se a handle migh
4270: 74 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 t sometimes.** f
4280: 61 69 6c 2e 20 20 54 68 69 73 20 69 73 20 61 20 ail. This is a
4290: 76 65 72 79 20 75 6e 72 65 61 73 6f 6e 61 62 6c very unreasonabl
42a0: 65 20 72 65 73 75 6c 74 2c 20 62 75 74 20 77 69 e result, but wi
42b0: 6e 64 6f 77 73 20 69 73 20 6e 6f 74 6f 72 69 6f ndows is notorio
42c0: 75 73 0a 2a 2a 20 66 6f 72 20 62 65 69 6e 67 20 us.** for being
42d0: 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 73 6f 20 unreasonable so
42e0: 49 20 64 6f 20 6e 6f 74 20 64 6f 75 62 74 20 74 I do not doubt t
42f0: 68 61 74 20 69 74 20 6d 69 67 68 74 20 68 61 70 hat it might hap
4300: 70 65 6e 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 pen. If.** the
4310: 63 6c 6f 73 65 20 66 61 69 6c 73 2c 20 77 65 20 close fails, we
4320: 70 61 75 73 65 20 66 6f 72 20 31 30 30 20 6d 69 pause for 100 mi
4330: 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 lliseconds and t
4340: 72 79 20 61 67 61 69 6e 2e 20 20 41 73 0a 2a 2a ry again. As.**
4350: 20 6d 61 6e 79 20 61 73 20 4d 58 5f 43 4c 4f 53 many as MX_CLOS
4360: 45 5f 41 54 54 45 4d 50 54 20 61 74 74 65 6d 70 E_ATTEMPT attemp
4370: 74 73 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 ts to close the
4380: 68 61 6e 64 6c 65 20 61 72 65 20 6d 61 64 65 20 handle are made
4390: 62 65 66 6f 72 65 0a 2a 2a 20 67 69 76 69 6e 67 before.** giving
43a0: 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e up and returnin
43b0: 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 g an error..*/.#
43c0: 64 65 66 69 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f define MX_CLOSE_
43d0: 41 54 54 45 4d 50 54 20 33 0a 73 74 61 74 69 63 ATTEMPT 3.static
43e0: 20 69 6e 74 20 77 69 6e 43 6c 6f 73 65 28 73 71 int winClose(sq
43f0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b lite3_file *id){
4400: 0a 20 20 69 6e 74 20 72 63 2c 20 63 6e 74 20 3d . int rc, cnt =
4410: 20 30 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 0;. winFile *p
4420: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a File = (winFile*
4430: 29 69 64 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 )id;. OSTRACE2(
4440: 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 70 46 "CLOSE %d\n", pF
4450: 69 6c 65 2d 3e 68 29 3b 0a 20 20 64 6f 7b 0a 20 ile->h);. do{.
4460: 20 20 20 72 63 20 3d 20 43 6c 6f 73 65 48 61 6e rc = CloseHan
4470: 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 dle(pFile->h);.
4480: 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30 20 26 }while( rc==0 &
4490: 26 20 63 6e 74 2b 2b 20 3c 20 4d 58 5f 43 4c 4f & cnt++ < MX_CLO
44a0: 53 45 5f 41 54 54 45 4d 50 54 20 26 26 20 28 53 SE_ATTEMPT && (S
44b0: 6c 65 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b leep(100), 1) );
44c0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 .#if SQLITE_OS_W
44d0: 49 4e 43 45 0a 23 64 65 66 69 6e 65 20 57 49 4e INCE.#define WIN
44e0: 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 CE_DELETION_ATTE
44f0: 4d 50 54 53 20 33 0a 20 20 77 69 6e 63 65 44 65 MPTS 3. winceDe
4500: 73 74 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29 stroyLock(pFile)
4510: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a ;. if( pFile->z
4520: 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b DeleteOnClose ){
4530: 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 . int cnt = 0
4540: 3b 0a 20 20 20 20 77 68 69 6c 65 28 0a 20 20 20 ;. while(.
4550: 20 20 20 20 20 20 20 20 44 65 6c 65 74 65 46 69 DeleteFi
4560: 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 leW(pFile->zDele
4570: 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20 20 teOnClose)==0.
4580: 20 20 20 20 20 20 26 26 20 47 65 74 46 69 6c 65 && GetFile
4590: 41 74 74 72 69 62 75 74 65 73 57 28 70 46 69 6c AttributesW(pFil
45a0: 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 e->zDeleteOnClos
45b0: 65 29 21 3d 30 78 66 66 66 66 66 66 66 66 20 0a e)!=0xffffffff .
45c0: 20 20 20 20 20 20 20 20 26 26 20 63 6e 74 2b 2b && cnt++
45d0: 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f < WINCE_DELETIO
45e0: 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20 20 20 29 N_ATTEMPTS. )
45f0: 7b 0a 20 20 20 20 20 20 20 53 6c 65 65 70 28 31 {. Sleep(1
4600: 30 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61 20 00); /* Wait a
4610: 6c 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74 72 little before tr
4620: 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20 20 ying again */.
4630: 20 20 7d 0a 20 20 20 20 66 72 65 65 28 70 46 69 }. free(pFi
4640: 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f le->zDeleteOnClo
4650: 73 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a se);. }.#endif.
4660: 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 OpenCounter(-1
4670: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f );. return rc ?
4680: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c SQLITE_OK : SQL
4690: 49 54 45 5f 49 4f 45 52 52 3b 0a 7d 0a 0a 2f 2a ITE_IOERR;.}../*
46a0: 0a 2a 2a 20 53 6f 6d 65 20 6d 69 63 72 6f 73 6f .** Some microso
46b0: 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63 ft compilers lac
46c0: 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f k this definitio
46d0: 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e n..*/.#ifndef IN
46e0: 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 VALID_SET_FILE_P
46f0: 4f 49 4e 54 45 52 0a 23 20 64 65 66 69 6e 65 20 OINTER.# define
4700: 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 INVALID_SET_FILE
4710: 5f 50 4f 49 4e 54 45 52 20 28 28 44 57 4f 52 44 _POINTER ((DWORD
4720: 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a )-1).#endif../*.
4730: 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f ** Read data fro
4740: 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 m a file into a
4750: 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 buffer. Return
4760: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c SQLITE_OK if all
4770: 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 .** bytes were r
4780: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 ead successfully
4790: 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 and SQLITE_IOER
47a0: 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f R if anything go
47b0: 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a es.** wrong..*/.
47c0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65 static int winRe
47d0: 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 ad(. sqlite3_fi
47e0: 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 le *id,
47f0: 20 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65 61 64 /* File to read
4800: 20 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64 20 from */. void
4810: 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 *pBuf,
4820: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 /* Write c
4830: 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68 69 73 ontent into this
4840: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 buffer */. int
4850: 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 amt,
4860: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 /* Numbe
4870: 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 r of bytes to re
4880: 61 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f ad */. sqlite3_
4890: 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20 20 int64 offset
48a0: 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 /* Begin read
48b0: 69 6e 67 20 61 74 20 74 68 69 73 20 6f 66 66 73 ing at this offs
48c0: 65 74 20 2a 2f 0a 29 7b 0a 20 20 4c 4f 4e 47 20 et */.){. LONG
48d0: 75 70 70 65 72 42 69 74 73 20 3d 20 28 6f 66 66 upperBits = (off
48e0: 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 set>>32) & 0x7ff
48f0: 66 66 66 66 66 3b 0a 20 20 4c 4f 4e 47 20 6c 6f fffff;. LONG lo
4900: 77 65 72 42 69 74 73 20 3d 20 6f 66 66 73 65 74 werBits = offset
4910: 20 26 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 & 0xffffffff;.
4920: 20 44 57 4f 52 44 20 72 63 3b 0a 20 20 44 57 4f DWORD rc;. DWO
4930: 52 44 20 67 6f 74 3b 0a 20 20 77 69 6e 46 69 6c RD got;. winFil
4940: 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 e *pFile = (winF
4950: 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73 65 72 ile*)id;. asser
4960: 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53 69 t( id!=0 );. Si
4970: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 mulateIOError(re
4980: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 turn SQLITE_IOER
4990: 52 5f 52 45 41 44 29 3b 0a 20 20 4f 53 54 52 41 R_READ);. OSTRA
49a0: 43 45 33 28 22 52 45 41 44 20 25 64 20 6c 6f 63 CE3("READ %d loc
49b0: 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e k=%d\n", pFile->
49c0: 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 h, pFile->lockty
49d0: 70 65 29 3b 0a 20 20 72 63 20 3d 20 53 65 74 46 pe);. rc = SetF
49e0: 69 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 ilePointer(pFile
49f0: 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 ->h, lowerBits,
4a00: 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 &upperBits, FILE
4a10: 5f 42 45 47 49 4e 29 3b 0a 20 20 69 66 28 20 72 _BEGIN);. if( r
4a20: 63 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 c==INVALID_SET_F
4a30: 49 4c 45 5f 50 4f 49 4e 54 45 52 20 26 26 20 47 ILE_POINTER && G
4a40: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21 3d 4e etLastError()!=N
4a50: 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 72 O_ERROR ){. r
4a60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c eturn SQLITE_FUL
4a70: 4c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 52 65 L;. }. if( !Re
4a80: 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c adFile(pFile->h,
4a90: 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 67 6f 74 pBuf, amt, &got
4aa0: 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 , 0) ){. retu
4ab0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f rn SQLITE_IOERR_
4ac0: 52 45 41 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20 READ;. }. if(
4ad0: 67 6f 74 3d 3d 28 44 57 4f 52 44 29 61 6d 74 20 got==(DWORD)amt
4ae0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 ){. return SQ
4af0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 LITE_OK;. }else
4b00: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 {. memset(&((
4b10: 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d char*)pBuf)[got]
4b20: 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 , 0, amt-got);.
4b30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 return SQLITE
4b40: 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 _IOERR_SHORT_REA
4b50: 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 D;. }.}../*.**
4b60: 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 Write data from
4b70: 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 a buffer into a
4b80: 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 file. Return SQ
4b90: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 LITE_OK on succe
4ba0: 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 ss.** or some ot
4bb0: 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f her error code o
4bc0: 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 n failure..*/.st
4bd0: 61 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69 74 atic int winWrit
4be0: 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c e(. sqlite3_fil
4bf0: 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 2f e *id, /
4c00: 2a 20 46 69 6c 65 20 74 6f 20 77 72 69 74 65 20 * File to write
4c10: 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 into */. const
4c20: 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 void *pBuf,
4c30: 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 73 /* The bytes
4c40: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a to be written *
4c50: 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 /. int amt,
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
4c70: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 Number of bytes
4c80: 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 73 to write */. s
4c90: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 qlite3_int64 off
4ca0: 73 65 74 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 set /* Offs
4cb0: 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 et into the file
4cc0: 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e to begin writin
4cd0: 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20 4c 4f 4e g at */.){. LON
4ce0: 47 20 75 70 70 65 72 42 69 74 73 20 3d 20 28 6f G upperBits = (o
4cf0: 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 ffset>>32) & 0x7
4d00: 66 66 66 66 66 66 66 3b 0a 20 20 4c 4f 4e 47 20 fffffff;. LONG
4d10: 6c 6f 77 65 72 42 69 74 73 20 3d 20 6f 66 66 73 lowerBits = offs
4d20: 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66 3b et & 0xffffffff;
4d30: 0a 20 20 44 57 4f 52 44 20 72 63 3b 0a 20 20 44 . DWORD rc;. D
4d40: 57 4f 52 44 20 77 72 6f 74 65 3b 0a 20 20 77 69 WORD wrote;. wi
4d50: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 nFile *pFile = (
4d60: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 winFile*)id;. a
4d70: 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a ssert( id!=0 );.
4d80: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f SimulateIOErro
4d90: 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f r(return SQLITE_
4da0: 49 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a 20 20 IOERR_WRITE);.
4db0: 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c SimulateDiskfull
4dc0: 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c Error(return SQL
4dd0: 49 54 45 5f 46 55 4c 4c 29 3b 0a 20 20 4f 53 54 ITE_FULL);. OST
4de0: 52 41 43 45 33 28 22 57 52 49 54 45 20 25 64 20 RACE3("WRITE %d
4df0: 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c lock=%d\n", pFil
4e00: 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 e->h, pFile->loc
4e10: 6b 74 79 70 65 29 3b 0a 20 20 72 63 20 3d 20 53 ktype);. rc = S
4e20: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 70 46 etFilePointer(pF
4e30: 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 ile->h, lowerBit
4e40: 73 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20 46 s, &upperBits, F
4e50: 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 20 20 69 66 ILE_BEGIN);. if
4e60: 28 20 72 63 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 ( rc==INVALID_SE
4e70: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 26 T_FILE_POINTER &
4e80: 26 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 & GetLastError()
4e90: 21 3d 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20 !=NO_ERROR ){.
4ea0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
4eb0: 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 FULL;. }. asse
4ec0: 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 77 rt( amt>0 );. w
4ed0: 68 69 6c 65 28 0a 20 20 20 20 20 61 6d 74 3e 30 hile(. amt>0
4ee0: 0a 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 57 . && (rc = W
4ef0: 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e riteFile(pFile->
4f00: 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 77 h, pBuf, amt, &w
4f10: 72 6f 74 65 2c 20 30 29 29 21 3d 30 0a 20 20 20 rote, 0))!=0.
4f20: 20 20 26 26 20 77 72 6f 74 65 3e 30 0a 20 20 29 && wrote>0. )
4f30: 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f {. amt -= wro
4f40: 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26 te;. pBuf = &
4f50: 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72 ((char*)pBuf)[wr
4f60: 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 ote];. }. if(
4f70: 21 72 63 20 7c 7c 20 61 6d 74 3e 28 69 6e 74 29 !rc || amt>(int)
4f80: 77 72 6f 74 65 20 29 7b 0a 20 20 20 20 72 65 74 wrote ){. ret
4f90: 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b urn SQLITE_FULL;
4fa0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 . }. return SQ
4fb0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a LITE_OK;.}../*.*
4fc0: 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 * Truncate an op
4fd0: 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 en file to a spe
4fe0: 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 cified size.*/.s
4ff0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 54 72 75 tatic int winTru
5000: 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 ncate(sqlite3_fi
5010: 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f le *id, sqlite3_
5020: 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 int64 nByte){.
5030: 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73 20 3d LONG upperBits =
5040: 20 28 6e 42 79 74 65 3e 3e 33 32 29 20 26 20 30 (nByte>>32) & 0
5050: 78 37 66 66 66 66 66 66 66 3b 0a 20 20 4c 4f 4e x7fffffff;. LON
5060: 47 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 6e 42 G lowerBits = nB
5070: 79 74 65 20 26 20 30 78 66 66 66 66 66 66 66 66 yte & 0xffffffff
5080: 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 ;. winFile *pFi
5090: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 le = (winFile*)i
50a0: 64 3b 0a 20 20 4f 53 54 52 41 43 45 33 28 22 54 d;. OSTRACE3("T
50b0: 52 55 4e 43 41 54 45 20 25 64 20 25 6c 6c 64 5c RUNCATE %d %lld\
50c0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 n", pFile->h, nB
50d0: 79 74 65 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 yte);. Simulate
50e0: 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 IOError(return S
50f0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e QLITE_IOERR_TRUN
5100: 43 41 54 45 29 3b 0a 20 20 53 65 74 46 69 6c 65 CATE);. SetFile
5110: 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68 Pointer(pFile->h
5120: 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70 , lowerBits, &up
5130: 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45 perBits, FILE_BE
5140: 47 49 4e 29 3b 0a 20 20 53 65 74 45 6e 64 4f 66 GIN);. SetEndOf
5150: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a File(pFile->h);.
5160: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
5170: 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 OK;.}..#ifdef SQ
5180: 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 LITE_TEST./*.**
5190: 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 Count the number
51a0: 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e of fullsyncs an
51b0: 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 d normal syncs.
51c0: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f This is used to
51d0: 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 test.** that sy
51e0: 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 ncs and fullsync
51f0: 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20 61 s are occuring a
5200: 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 t the right time
5210: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 s..*/.int sqlite
5220: 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3_sync_count = 0
5230: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 ;.int sqlite3_fu
5240: 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 llsync_count = 0
5250: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 ;.#endif../*.**
5260: 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 Make sure all wr
5270: 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 ites to a partic
5280: 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f ular file are co
5290: 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e mmitted to disk.
52a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 .*/.static int w
52b0: 69 6e 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 inSync(sqlite3_f
52c0: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 ile *id, int fla
52d0: 67 73 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a gs){. winFile *
52e0: 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 pFile = (winFile
52f0: 2a 29 69 64 3b 0a 20 20 4f 53 54 52 41 43 45 33 *)id;. OSTRACE3
5300: 28 22 53 59 4e 43 20 25 64 20 6c 6f 63 6b 3d 25 ("SYNC %d lock=%
5310: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 d\n", pFile->h,
5320: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 pFile->locktype)
5330: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ;.#ifdef SQLITE_
5340: 54 45 53 54 0a 20 20 69 66 28 20 66 6c 61 67 73 TEST. if( flags
5350: 20 26 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 & SQLITE_SYNC_F
5360: 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 ULL ){. sqlit
5370: 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e e3_fullsync_coun
5380: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 t++;. }. sqlit
5390: 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b e3_sync_count++;
53a0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 46 6c .#endif. if( Fl
53b0: 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 28 70 ushFileBuffers(p
53c0: 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20 20 20 20 File->h) ){.
53d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
53e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 ;. }else{. r
53f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 eturn SQLITE_IOE
5400: 52 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a RR;. }.}../*.**
5410: 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 Determine the c
5420: 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 urrent size of a
5430: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a file in bytes.*
5440: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e /.static int win
5450: 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 FileSize(sqlite3
5460: 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 _file *id, sqlit
5470: 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 e3_int64 *pSize)
5480: 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 {. winFile *pFi
5490: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 le = (winFile*)i
54a0: 64 3b 0a 20 20 44 57 4f 52 44 20 75 70 70 65 72 d;. DWORD upper
54b0: 42 69 74 73 2c 20 6c 6f 77 65 72 42 69 74 73 3b Bits, lowerBits;
54c0: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 . SimulateIOErr
54d0: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 or(return SQLITE
54e0: 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a 20 _IOERR_FSTAT);.
54f0: 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 47 65 74 lowerBits = Get
5500: 46 69 6c 65 53 69 7a 65 28 70 46 69 6c 65 2d 3e FileSize(pFile->
5510: 68 2c 20 26 75 70 70 65 72 42 69 74 73 29 3b 0a h, &upperBits);.
5520: 20 20 2a 70 53 69 7a 65 20 3d 20 28 28 28 73 71 *pSize = (((sq
5530: 6c 69 74 65 33 5f 69 6e 74 36 34 29 75 70 70 65 lite3_int64)uppe
5540: 72 42 69 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f rBits)<<32) + lo
5550: 77 65 72 42 69 74 73 3b 0a 20 20 72 65 74 75 72 werBits;. retur
5560: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a n SQLITE_OK;.}..
5570: 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 /*.** LOCKFILE_F
5580: 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 AIL_IMMEDIATELY
5590: 69 73 20 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20 is undefined on
55a0: 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73 79 73 some Windows sys
55b0: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 tems..*/.#ifndef
55c0: 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 LOCKFILE_FAIL_I
55d0: 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20 64 65 66 MMEDIATELY.# def
55e0: 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 ine LOCKFILE_FAI
55f0: 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a L_IMMEDIATELY 1.
5600: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 #endif../*.** Ac
5610: 71 75 69 72 65 20 61 20 72 65 61 64 65 72 20 6c quire a reader l
5620: 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e ock..** Differen
5630: 74 20 41 50 49 20 72 6f 75 74 69 6e 65 73 20 61 t API routines a
5640: 72 65 20 63 61 6c 6c 65 64 20 64 65 70 65 6e 64 re called depend
5650: 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f ing on whether o
5660: 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73 r not this.** is
5670: 20 57 69 6e 39 35 20 6f 72 20 57 69 6e 4e 54 2e Win95 or WinNT.
5680: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 .*/.static int g
5690: 65 74 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 etReadLock(winFi
56a0: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e le *pFile){. in
56b0: 74 20 72 65 73 3b 0a 20 20 69 66 28 20 69 73 4e t res;. if( isN
56c0: 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c T() ){. OVERL
56d0: 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 APPED ovlp;.
56e0: 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 53 48 ovlp.Offset = SH
56f0: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 ARED_FIRST;.
5700: 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20 ovlp.OffsetHigh
5710: 3d 20 30 3b 0a 20 20 20 20 6f 76 6c 70 2e 68 45 = 0;. ovlp.hE
5720: 76 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 72 65 vent = 0;. re
5730: 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 45 78 28 70 s = LockFileEx(p
5740: 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 46 49 4c File->h, LOCKFIL
5750: 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 E_FAIL_IMMEDIATE
5760: 4c 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 LY,.
5770: 20 20 20 20 20 20 20 20 20 30 2c 20 53 48 41 52 0, SHAR
5780: 45 44 5f 53 49 5a 45 2c 20 30 2c 20 26 6f 76 6c ED_SIZE, 0, &ovl
5790: 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 p);. }else{.
57a0: 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c int lk;. sql
57b0: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 ite3_randomness(
57c0: 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 sizeof(lk), &lk)
57d0: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 ;. pFile->sha
57e0: 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 6c redLockByte = (l
57f0: 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25 k & 0x7fffffff)%
5800: 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 (SHARED_SIZE - 1
5810: 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 );. res = Loc
5820: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 kFile(pFile->h,
5830: 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46 69 SHARED_FIRST+pFi
5840: 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 le->sharedLockBy
5850: 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 te, 0, 1, 0);.
5860: 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a }. return res;.
5870: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20 }../*.** Undo a
5880: 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 readlock.*/.stat
5890: 69 63 20 69 6e 74 20 75 6e 6c 6f 63 6b 52 65 61 ic int unlockRea
58a0: 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 dLock(winFile *p
58b0: 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 File){. int res
58c0: 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 ;. if( isNT() )
58d0: 7b 0a 20 20 20 20 72 65 73 20 3d 20 55 6e 6c 6f {. res = Unlo
58e0: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c ckFile(pFile->h,
58f0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 SHARED_FIRST, 0
5900: 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 , SHARED_SIZE, 0
5910: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 );. }else{.
5920: 72 65 73 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 res = UnlockFile
5930: 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 (pFile->h, SHARE
5940: 44 5f 46 49 52 53 54 20 2b 20 70 46 69 6c 65 2d D_FIRST + pFile-
5950: 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c >sharedLockByte,
5960: 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 0, 1, 0);. }.
5970: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a return res;.}..
5980: 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 /*.** Lock the f
5990: 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 ile with the loc
59a0: 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 k specified by p
59b0: 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 arameter locktyp
59c0: 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 e - one.** of th
59d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a e following:.**.
59e0: 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 ** (1) SHARE
59f0: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 D_LOCK.** (2
5a00: 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a ) RESERVED_LOCK.
5a10: 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 ** (3) PENDI
5a20: 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 NG_LOCK.** (
5a30: 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4) EXCLUSIVE_LOC
5a40: 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 K.**.** Sometime
5a50: 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e s when requestin
5a60: 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 g one lock state
5a70: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 , additional loc
5a80: 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 k states.** are
5a90: 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 inserted in betw
5aa0: 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e een. The lockin
5ab0: 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 g might fail on
5ac0: 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 one of the later
5ad0: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 .** transitions
5ae0: 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b leaving the lock
5af0: 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 state different
5b00: 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 from what it st
5b10: 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 arted but.** sti
5b20: 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 ll short of its
5b30: 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f goal. The follo
5b40: 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 wing chart shows
5b50: 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 the allowed.**
5b60: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 transitions and
5b70: 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 the inserted int
5b80: 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 ermediate states
5b90: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 :.**.** UNLOC
5ba0: 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a KED -> SHARED.**
5bb0: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 SHARED -> RE
5bc0: 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 SERVED.** SHA
5bd0: 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 RED -> (PENDING)
5be0: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a -> EXCLUSIVE.**
5bf0: 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 RESERVED ->
5c00: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 (PENDING) -> EXC
5c10: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e LUSIVE.** PEN
5c20: 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 DING -> EXCLUSIV
5c30: 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 E.**.** This rou
5c40: 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 tine will only i
5c50: 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 ncrease a lock.
5c60: 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 The winUnlock()
5c70: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 routine.** eras
5c80: 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 es all locks at
5c90: 6f 6e 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73 once and returns
5ca0: 20 75 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 us immediately
5cb0: 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c to locking level
5cc0: 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 0..** It is not
5cd0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 possible to low
5ce0: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c er the locking l
5cf0: 65 76 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 evel one step at
5d00: 20 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a a time. You.**
5d10: 20 6d 75 73 74 20 67 6f 20 73 74 72 61 69 67 68 must go straigh
5d20: 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 t to locking lev
5d30: 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 el 0..*/.static
5d40: 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 int winLock(sqli
5d50: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e te3_file *id, in
5d60: 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 t locktype){. i
5d70: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f nt rc = SQLITE_O
5d80: 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 K; /* Return
5d90: 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 code from subrou
5da0: 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 tines */. int r
5db0: 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 es = 1;
5dc0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 /* Result of a
5dd0: 20 77 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61 windows lock ca
5de0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c ll */. int newL
5df0: 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f ocktype; /
5e00: 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 * Set pFile->loc
5e10: 6b 74 79 70 65 20 74 6f 20 74 68 69 73 20 76 61 ktype to this va
5e20: 6c 75 65 20 62 65 66 6f 72 65 20 65 78 69 74 69 lue before exiti
5e30: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50 ng */. int gotP
5e40: 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f endingLock = 0;/
5e50: 2a 20 54 72 75 65 20 69 66 20 77 65 20 61 63 71 * True if we acq
5e60: 75 69 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20 uired a PENDING
5e70: 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a lock this time *
5e80: 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 /. winFile *pFi
5e90: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 le = (winFile*)i
5ea0: 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 d;.. assert( pF
5eb0: 69 6c 65 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 ile!=0 );. OSTR
5ec0: 41 43 45 35 28 22 4c 4f 43 4b 20 25 64 20 25 64 ACE5("LOCK %d %d
5ed0: 20 77 61 73 20 25 64 28 25 64 29 5c 6e 22 2c 0a was %d(%d)\n",.
5ee0: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d pFile-
5ef0: 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 70 46 >h, locktype, pF
5f00: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 ile->locktype, p
5f10: 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b File->sharedLock
5f20: 42 79 74 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 Byte);.. /* If
5f30: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 there is already
5f40: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 a lock of this
5f50: 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 type or more res
5f60: 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a trictive on the.
5f70: 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 ** OsFile, do
5f80: 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 nothing. Don't u
5f90: 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a se the end_lock:
5fa0: 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 exit path, as.
5fb0: 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 ** sqlite3OsEnt
5fc0: 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 erMutex() hasn't
5fd0: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 been called yet
5fe0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 .. */. if( pFi
5ff0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f le->locktype>=lo
6000: 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 cktype ){. re
6010: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a turn SQLITE_OK;.
6020: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 }.. /* Make s
6030: 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 ure the locking
6040: 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 sequence is corr
6050: 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 ect. */. asser
6060: 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 t( pFile->lockty
6070: 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c pe!=NO_LOCK || l
6080: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f ocktype==SHARED_
6090: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 LOCK );. assert
60a0: 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 ( locktype!=PEND
60b0: 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 ING_LOCK );. as
60c0: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d sert( locktype!=
60d0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c RESERVED_LOCK ||
60e0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 pFile->locktype
60f0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b ==SHARED_LOCK );
6100: 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 .. /* Lock the
6110: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 PENDING_LOCK byt
6120: 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 e if we need to
6130: 61 63 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e acquire a PENDIN
6140: 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 G lock or. ** a
6150: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49 SHARED lock. I
6160: 66 20 77 65 20 61 72 65 20 61 63 71 75 69 72 69 f we are acquiri
6170: 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b ng a SHARED lock
6180: 2c 20 74 68 65 20 61 63 71 75 69 73 69 74 69 6f , the acquisitio
6190: 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50 45 n of. ** the PE
61a0: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 NDING_LOCK byte
61b0: 69 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20 is temporary..
61c0: 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 */. newLocktype
61d0: 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 = pFile->lockty
61e0: 70 65 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d pe;. if( pFile-
61f0: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f >locktype==NO_LO
6200: 43 4b 0a 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 CK. || (lockty
6210: 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f pe==EXCLUSIVE_LO
6220: 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 CK && pFile->loc
6230: 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f ktype==RESERVED_
6240: 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 LOCK). ){. i
6250: 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20 20 20 20 nt cnt = 3;.
6260: 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26 while( cnt-->0 &
6270: 26 20 28 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c & (res = LockFil
6280: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 e(pFile->h, PEND
6290: 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 ING_BYTE, 0, 1,
62a0: 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 0))==0 ){.
62b0: 2f 2a 20 54 72 79 20 33 20 74 69 6d 65 73 20 74 /* Try 3 times t
62c0: 6f 20 67 65 74 20 74 68 65 20 70 65 6e 64 69 6e o get the pendin
62d0: 67 20 6c 6f 63 6b 2e 20 20 54 68 65 20 70 65 6e g lock. The pen
62e0: 64 69 6e 67 20 6c 6f 63 6b 20 6d 69 67 68 74 20 ding lock might
62f0: 62 65 0a 20 20 20 20 20 20 2a 2a 20 68 65 6c 64 be. ** held
6300: 20 62 79 20 61 6e 6f 74 68 65 72 20 72 65 61 64 by another read
6310: 65 72 20 70 72 6f 63 65 73 73 20 77 68 6f 20 77 er process who w
6320: 69 6c 6c 20 72 65 6c 65 61 73 65 20 69 74 20 6d ill release it m
6330: 6f 6d 65 6e 74 61 72 69 6c 79 2e 0a 20 20 20 20 omentarily..
6340: 20 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 */. OSTRA
6350: 43 45 32 28 22 63 6f 75 6c 64 20 6e 6f 74 20 67 CE2("could not g
6360: 65 74 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 et a PENDING loc
6370: 6b 2e 20 63 6e 74 3d 25 64 5c 6e 22 2c 20 63 6e k. cnt=%d\n", cn
6380: 74 29 3b 0a 20 20 20 20 20 20 53 6c 65 65 70 28 t);. Sleep(
6390: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 1);. }. go
63a0: 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 tPendingLock = r
63b0: 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 es;. }.. /* Ac
63c0: 71 75 69 72 65 20 61 20 73 68 61 72 65 64 20 6c quire a shared l
63d0: 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c ock. */. if( l
63e0: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f ocktype==SHARED_
63f0: 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 LOCK && res ){.
6400: 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 assert( pFile
6410: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c ->locktype==NO_L
6420: 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d OCK );. res =
6430: 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 getReadLock(pFi
6440: 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 le);. if( res
6450: 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 ){. newLoc
6460: 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c ktype = SHARED_L
6470: 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a OCK;. }. }..
6480: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 /* Acquire a R
6490: 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a ESERVED lock. *
64a0: 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 /. if( locktype
64b0: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 ==RESERVED_LOCK
64c0: 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 && res ){. as
64d0: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 sert( pFile->loc
64e0: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f ktype==SHARED_LO
64f0: 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 CK );. res =
6500: 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e LockFile(pFile->
6510: 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 h, RESERVED_BYTE
6520: 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 , 0, 1, 0);.
6530: 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 if( res ){.
6540: 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52 newLocktype = R
6550: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20 ESERVED_LOCK;.
6560: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 }. }.. /* Ac
6570: 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 quire a PENDING
6580: 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 lock. */. if(
6590: 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 locktype==EXCLUS
65a0: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 IVE_LOCK && res
65b0: 29 7b 0a 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 ){. newLockty
65c0: 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 pe = PENDING_LOC
65d0: 4b 3b 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e K;. gotPendin
65e0: 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a gLock = 0;. }..
65f0: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 /* Acquire an
6600: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 0a 20 EXCLUSIVE lock.
6610: 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 */. if( lockty
6620: 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f pe==EXCLUSIVE_LO
6630: 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 CK && res ){.
6640: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e assert( pFile->
6650: 6c 6f 63 6b 74 79 70 65 3e 3d 53 48 41 52 45 44 locktype>=SHARED
6660: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 _LOCK );. res
6670: 20 3d 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 = unlockReadLoc
6680: 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 4f 53 k(pFile);. OS
6690: 54 52 41 43 45 32 28 22 75 6e 72 65 61 64 6c 6f TRACE2("unreadlo
66a0: 63 6b 20 3d 20 25 64 5c 6e 22 2c 20 72 65 73 29 ck = %d\n", res)
66b0: 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b ;. res = Lock
66c0: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 File(pFile->h, S
66d0: 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 HARED_FIRST, 0,
66e0: 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b SHARED_SIZE, 0);
66f0: 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a . if( res ){.
6700: 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 newLocktyp
6710: 65 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f e = EXCLUSIVE_LO
6720: 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 CK;. }else{.
6730: 20 20 20 20 20 4f 53 54 52 41 43 45 32 28 22 65 OSTRACE2("e
6740: 72 72 6f 72 2d 63 6f 64 65 20 3d 20 25 64 5c 6e rror-code = %d\n
6750: 22 2c 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 ", GetLastError(
6760: 29 29 3b 0a 20 20 20 20 20 20 67 65 74 52 65 61 ));. getRea
6770: 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 dLock(pFile);.
6780: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 }. }.. /* If
6790: 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 we are holding
67a0: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 a PENDING lock t
67b0: 68 61 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 hat ought to be
67c0: 72 65 6c 65 61 73 65 64 2c 20 74 68 65 6e 0a 20 released, then.
67d0: 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74 20 6e ** release it n
67e0: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 67 ow.. */. if( g
67f0: 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 26 26 otPendingLock &&
6800: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 locktype==SHARE
6810: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e D_LOCK ){. Un
6820: 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e lockFile(pFile->
6830: 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c h, PENDING_BYTE,
6840: 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 0, 1, 0);. }..
6850: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 /* Update the
6860: 73 74 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 state of the loc
6870: 6b 20 68 61 73 20 68 65 6c 64 20 69 6e 20 74 68 k has held in th
6880: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f e file descripto
6890: 72 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75 r then. ** retu
68a0: 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 rn the appropria
68b0: 74 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a te result code..
68c0: 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 20 29 */. if( res )
68d0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 {. rc = SQLIT
68e0: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 E_OK;. }else{.
68f0: 20 20 20 4f 53 54 52 41 43 45 34 28 22 4c 4f 43 OSTRACE4("LOC
6900: 4b 20 46 41 49 4c 45 44 20 25 64 20 74 72 79 69 K FAILED %d tryi
6910: 6e 67 20 66 6f 72 20 25 64 20 62 75 74 20 67 6f ng for %d but go
6920: 74 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e t %d\n", pFile->
6930: 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f h,. lo
6940: 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 cktype, newLockt
6950: 79 70 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 ype);. rc = S
6960: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a QLITE_BUSY;. }.
6970: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 pFile->locktyp
6980: 65 20 3d 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b e = newLocktype;
6990: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a . return rc;.}.
69a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 ./*.** This rout
69b0: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 ine checks if th
69c0: 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 ere is a RESERVE
69d0: 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 D lock held on t
69e0: 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 he specified.**
69f0: 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 file by this or
6a00: 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 any other proces
6a10: 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 s. If such a loc
6a20: 6b 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72 k is held, retur
6a30: 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f n.** non-zero, o
6a40: 74 68 65 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a therwise zero..*
6a50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e /.static int win
6a60: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 CheckReservedLoc
6a70: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a k(sqlite3_file *
6a80: 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 id, int *pResOut
6a90: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 77 ){. int rc;. w
6aa0: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 inFile *pFile =
6ab0: 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 (winFile*)id;.
6ac0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 assert( pFile!=0
6ad0: 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d );. if( pFile-
6ae0: 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 >locktype>=RESER
6af0: 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 VED_LOCK ){.
6b00: 72 63 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 rc = 1;. OSTR
6b10: 41 43 45 33 28 22 54 45 53 54 20 57 52 2d 4c 4f ACE3("TEST WR-LO
6b20: 43 4b 20 25 64 20 25 64 20 28 6c 6f 63 61 6c 29 CK %d %d (local)
6b30: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 \n", pFile->h, r
6b40: 63 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 c);. }else{.
6b50: 20 72 63 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 rc = LockFile(p
6b60: 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 File->h, RESERVE
6b70: 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 D_BYTE, 0, 1, 0)
6b80: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a ;. if( rc ){.
6b90: 20 20 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 UnlockFile
6ba0: 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 (pFile->h, RESER
6bb0: 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 VED_BYTE, 0, 1,
6bc0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 0);. }. rc
6bd0: 20 3d 20 21 72 63 3b 0a 20 20 20 20 4f 53 54 52 = !rc;. OSTR
6be0: 41 43 45 33 28 22 54 45 53 54 20 57 52 2d 4c 4f ACE3("TEST WR-LO
6bf0: 43 4b 20 25 64 20 25 64 20 28 72 65 6d 6f 74 65 CK %d %d (remote
6c00: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 )\n", pFile->h,
6c10: 72 63 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 rc);. }. *pRes
6c20: 4f 75 74 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 Out = rc;. retu
6c30: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a rn SQLITE_OK;.}.
6c40: 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 ./*.** Lower the
6c50: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f locking level o
6c60: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f n file descripto
6c70: 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65 r id to locktype
6c80: 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d . locktype.** m
6c90: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f ust be either NO
6ca0: 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f _LOCK or SHARED_
6cb0: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 LOCK..**.** If t
6cc0: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c he locking level
6cd0: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 of the file des
6ce0: 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 criptor is alrea
6cf0: 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a dy at or below.*
6d00: 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 * the requested
6d10: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 locking level, t
6d20: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 his routine is a
6d30: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 no-op..**.** It
6d40: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 is not possible
6d50: 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e for this routin
6d60: 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74 68 65 e to fail if the
6d70: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 second argument
6d80: 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 .** is NO_LOCK.
6d90: 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 If the second a
6da0: 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41 52 45 rgument is SHARE
6db0: 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69 73 D_LOCK then this
6dc0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 routine.** migh
6dd0: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f t return SQLITE_
6de0: 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69 63 IOERR;.*/.static
6df0: 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28 73 int winUnlock(s
6e00: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c qlite3_file *id,
6e10: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a int locktype){.
6e20: 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 77 69 int type;. wi
6e30: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 nFile *pFile = (
6e40: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 winFile*)id;. i
6e50: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f nt rc = SQLITE_O
6e60: 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 K;. assert( pFi
6e70: 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 le!=0 );. asser
6e80: 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 t( locktype<=SHA
6e90: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f 53 RED_LOCK );. OS
6ea0: 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20 25 TRACE5("UNLOCK %
6eb0: 64 20 74 6f 20 25 64 20 77 61 73 20 25 64 28 25 d to %d was %d(%
6ec0: 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c d)\n", pFile->h,
6ed0: 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 locktype,.
6ee0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b pFile->lock
6ef0: 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 type, pFile->sha
6f00: 72 65 64 4c 6f 63 6b 42 79 74 65 29 3b 0a 20 20 redLockByte);.
6f10: 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f type = pFile->lo
6f20: 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 74 79 cktype;. if( ty
6f30: 70 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f pe>=EXCLUSIVE_LO
6f40: 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b CK ){. Unlock
6f50: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 File(pFile->h, S
6f60: 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 HARED_FIRST, 0,
6f70: 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b SHARED_SIZE, 0);
6f80: 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 . if( locktyp
6f90: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 e==SHARED_LOCK &
6fa0: 26 20 21 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 & !getReadLock(p
6fb0: 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 2f File) ){. /
6fc0: 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 * This should ne
6fd0: 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20 ver happen. We
6fe0: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 should always be
6ff0: 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a able to. *
7000: 2a 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 * reacquire the
7010: 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 read lock */.
7020: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 rc = SQLITE_I
7030: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 OERR_UNLOCK;.
7040: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 }. }. if( typ
7050: 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b e>=RESERVED_LOCK
7060: 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 ){. UnlockFi
7070: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 le(pFile->h, RES
7080: 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 ERVED_BYTE, 0, 1
7090: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 , 0);. }. if(
70a0: 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 locktype==NO_LOC
70b0: 4b 20 26 26 20 74 79 70 65 3e 3d 53 48 41 52 45 K && type>=SHARE
70c0: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 6e D_LOCK ){. un
70d0: 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 lockReadLock(pFi
70e0: 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 le);. }. if( t
70f0: 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 ype>=PENDING_LOC
7100: 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 K ){. UnlockF
7110: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45 ile(pFile->h, PE
7120: 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 NDING_BYTE, 0, 1
7130: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c , 0);. }. pFil
7140: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f e->locktype = lo
7150: 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e cktype;. return
7160: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f rc;.}../*.** Co
7170: 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20 ntrol and query
7180: 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 of the open file
7190: 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 handle..*/.stat
71a0: 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f ic int winFileCo
71b0: 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 ntrol(sqlite3_fi
71c0: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 le *id, int op,
71d0: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 void *pArg){. s
71e0: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 witch( op ){.
71f0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e case SQLITE_FCN
7200: 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a TL_LOCKSTATE: {.
7210: 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 *(int*)pAr
7220: 67 20 3d 20 28 28 77 69 6e 46 69 6c 65 2a 29 69 g = ((winFile*)i
7230: 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 d)->locktype;.
7240: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
7250: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a E_OK;. }. }.
7260: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
7270: 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 ERROR;.}../*.**
7280: 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f Return the secto
7290: 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 r size in bytes
72a0: 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e of the underlyin
72b0: 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 g block device f
72c0: 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 or.** the specif
72d0: 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 ied file. This i
72e0: 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 s almost always
72f0: 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 512 bytes, but m
7300: 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 ay be.** larger
7310: 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 for some devices
7320: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 ..**.** SQLite c
7330: 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 ode assumes this
7340: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 function cannot
7350: 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 fail. It also a
7360: 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 ssumes that.** i
7370: 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 f two files are
7380: 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 created in the s
7390: 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 ame file-system
73a0: 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a directory (i.e..
73b0: 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e ** a database an
73c0: 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 d its journal fi
73d0: 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63 le) that the sec
73e0: 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 tor size will be
73f0: 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 the.** same for
7400: 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 both..*/.static
7410: 20 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53 69 int winSectorSi
7420: 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 ze(sqlite3_file
7430: 2a 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 *id){. return S
7440: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 QLITE_DEFAULT_SE
7450: 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a CTOR_SIZE;.}../*
7460: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65 63 .** Return a vec
7470: 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63 68 tor of device ch
7480: 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a 2a aracteristics..*
7490: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e /.static int win
74a0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 DeviceCharacteri
74b0: 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 stics(sqlite3_fi
74c0: 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65 74 75 72 le *id){. retur
74d0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 n 0;.}../*.** Th
74e0: 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65 is vector define
74f0: 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 s all the method
7500: 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61 s that can opera
7510: 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 te on an.** sqli
7520: 74 65 33 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e te3_file for win
7530: 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 32..*/.static co
7540: 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d nst sqlite3_io_m
7550: 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74 68 ethods winIoMeth
7560: 6f 64 20 3d 20 7b 0a 20 20 31 2c 20 20 20 20 20 od = {. 1,
7570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7580: 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a /* iVersion *
7590: 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 0a 20 20 /. winClose,.
75a0: 77 69 6e 52 65 61 64 2c 0a 20 20 77 69 6e 57 72 winRead,. winWr
75b0: 69 74 65 2c 0a 20 20 77 69 6e 54 72 75 6e 63 61 ite,. winTrunca
75c0: 74 65 2c 0a 20 20 77 69 6e 53 79 6e 63 2c 0a 20 te,. winSync,.
75d0: 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c 0a 20 20 winFileSize,.
75e0: 77 69 6e 4c 6f 63 6b 2c 0a 20 20 77 69 6e 55 6e winLock,. winUn
75f0: 6c 6f 63 6b 2c 0a 20 20 77 69 6e 43 68 65 63 6b lock,. winCheck
7600: 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 20 20 ReservedLock,.
7610: 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 0a winFileControl,.
7620: 20 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c winSectorSize,
7630: 0a 20 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 . winDeviceChar
7640: 61 63 74 65 72 69 73 74 69 63 73 0a 7d 3b 0a 0a acteristics.};..
7650: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /***************
7660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 ************.**
76a0: 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 49 2f Here ends the I/
76b0: 4f 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 66 O methods that f
76c0: 6f 72 6d 20 74 68 65 20 73 71 6c 69 74 65 33 5f orm the sqlite3_
76d0: 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 io_methods objec
76e0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 t..**.** The nex
76f0: 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 t block of code
7700: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 56 implements the V
7710: 46 53 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 2a 2a FS methods..****
7720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7760: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a ********/../*.**
7770: 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38 Convert a UTF-8
7780: 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 77 filename into w
7790: 68 61 74 65 76 65 72 20 66 6f 72 6d 20 74 68 65 hatever form the
77a0: 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f underlying.** o
77b0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 perating system
77c0: 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73 20 wants filenames
77d0: 69 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f in. Space to ho
77e0: 6c 64 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a ld the result.**
77f0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f is obtained fro
7800: 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 m malloc and mus
7810: 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 t be freed by th
7820: 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e e calling.** fun
7830: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 ction..*/.static
7840: 20 76 6f 69 64 20 2a 63 6f 6e 76 65 72 74 55 74 void *convertUt
7850: 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 f8Filename(const
7860: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 char *zFilename
7870: 29 7b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 ){. void *zConv
7880: 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 erted = 0;. if(
7890: 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a isNT() ){. z
78a0: 43 6f 6e 76 65 72 74 65 64 20 3d 20 75 74 66 38 Converted = utf8
78b0: 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e ToUnicode(zFilen
78c0: 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 ame);. }else{.
78d0: 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 zConverted =
78e0: 75 74 66 38 54 6f 4d 62 63 73 28 7a 46 69 6c 65 utf8ToMbcs(zFile
78f0: 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 name);. }. /*
7900: 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64 caller will hand
7910: 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 le out of memory
7920: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f */. return zCo
7930: 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a nverted;.}../*.*
7940: 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f * Create a tempo
7950: 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 rary file name i
7960: 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 n zBuf. zBuf mu
7970: 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 st be big enough
7980: 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20 70 to.** hold at p
7990: 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 Vfs->mxPathname
79a0: 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 characters..*/.s
79b0: 74 61 74 69 63 20 69 6e 74 20 67 65 74 54 65 6d tatic int getTem
79c0: 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 pname(int nBuf,
79d0: 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 char *zBuf){. s
79e0: 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61 72 tatic char zChar
79f0: 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 s[] =. "abcde
7a00: 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 fghijklmnopqrstu
7a10: 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 vwxyz". "ABCD
7a20: 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 EFGHIJKLMNOPQRST
7a30: 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 UVWXYZ". "012
7a40: 33 34 35 36 37 38 39 22 3b 0a 20 20 69 6e 74 20 3456789";. int
7a50: 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 7a 54 65 i, j;. char zTe
7a60: 6d 70 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 2b mpPath[MAX_PATH+
7a70: 31 5d 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 1];. if( sqlite
7a80: 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3_temp_directory
7a90: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f ){. sqlite3_
7aa0: 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 snprintf(MAX_PAT
7ab0: 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c H-30, zTempPath,
7ac0: 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 74 "%s", sqlite3_t
7ad0: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a emp_directory);.
7ae0: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 54 }else if( isNT
7af0: 28 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a () ){. char *
7b00: 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 57 43 48 41 zMulti;. WCHA
7b10: 52 20 7a 57 69 64 65 50 61 74 68 5b 4d 41 58 5f R zWidePath[MAX_
7b20: 50 41 54 48 5d 3b 0a 20 20 20 20 47 65 74 54 65 PATH];. GetTe
7b30: 6d 70 50 61 74 68 57 28 4d 41 58 5f 50 41 54 48 mpPathW(MAX_PATH
7b40: 2d 33 30 2c 20 7a 57 69 64 65 50 61 74 68 29 3b -30, zWidePath);
7b50: 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d 20 75 6e . zMulti = un
7b60: 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 57 69 64 icodeToUtf8(zWid
7b70: 65 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 ePath);. if(
7b80: 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 zMulti ){.
7b90: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 sqlite3_snprintf
7ba0: 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 (MAX_PATH-30, zT
7bb0: 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20 7a empPath, "%s", z
7bc0: 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 66 72 Multi);. fr
7bd0: 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 ee(zMulti);.
7be0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 }else{. ret
7bf0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d urn SQLITE_NOMEM
7c00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b ;. }. }else{
7c10: 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 . char *zUtf8
7c20: 3b 0a 20 20 20 20 63 68 61 72 20 7a 4d 62 63 73 ;. char zMbcs
7c30: 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a Path[MAX_PATH];.
7c40: 20 20 20 20 47 65 74 54 65 6d 70 50 61 74 68 41 GetTempPathA
7c50: 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 4d (MAX_PATH-30, zM
7c60: 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20 7a 55 bcsPath);. zU
7c70: 74 66 38 20 3d 20 6d 62 63 73 54 6f 55 74 66 38 tf8 = mbcsToUtf8
7c80: 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20 (zMbcsPath);.
7c90: 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a 20 20 if( zUtf8 ){.
7ca0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 sqlite3_snpr
7cb0: 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 intf(MAX_PATH-30
7cc0: 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73 , zTempPath, "%s
7cd0: 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 ", zUtf8);.
7ce0: 20 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 free(zUtf8);.
7cf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 }else{. r
7d00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d eturn SQLITE_NOM
7d10: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 EM;. }. }.
7d20: 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 7a 54 65 for(i=strlen(zTe
7d30: 6d 70 50 61 74 68 29 3b 20 69 3e 30 20 26 26 20 mpPath); i>0 &&
7d40: 7a 54 65 6d 70 50 61 74 68 5b 69 2d 31 5d 3d 3d zTempPath[i-1]==
7d50: 27 5c 5c 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a '\\'; i--){}. z
7d60: 54 65 6d 70 50 61 74 68 5b 69 5d 20 3d 20 30 3b TempPath[i] = 0;
7d70: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 . sqlite3_snpri
7d80: 6e 74 66 28 6e 42 75 66 2d 33 30 2c 20 7a 42 75 ntf(nBuf-30, zBu
7d90: 66 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 f,.
7da0: 20 20 20 20 20 20 22 25 73 5c 5c 22 53 51 4c 49 "%s\\"SQLI
7db0: 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 TE_TEMP_FILE_PRE
7dc0: 46 49 58 2c 20 7a 54 65 6d 70 50 61 74 68 29 3b FIX, zTempPath);
7dd0: 0a 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 42 . j = strlen(zB
7de0: 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 uf);. sqlite3_r
7df0: 61 6e 64 6f 6d 6e 65 73 73 28 32 30 2c 20 26 7a andomness(20, &z
7e00: 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 Buf[j]);. for(i
7e10: 3d 30 3b 20 69 3c 32 30 3b 20 69 2b 2b 2c 20 6a =0; i<20; i++, j
7e20: 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d ++){. zBuf[j]
7e30: 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b = (char)zChars[
7e40: 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 ((unsigned char
7e50: 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f )zBuf[j])%(sizeo
7e60: 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a f(zChars)-1) ];.
7e70: 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 }. zBuf[j] =
7e80: 30 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22 54 0;. OSTRACE2("T
7e90: 45 4d 50 20 46 49 4c 45 4e 41 4d 45 3a 20 25 73 EMP FILENAME: %s
7ea0: 5c 6e 22 2c 20 7a 42 75 66 29 3b 0a 20 20 72 65 \n", zBuf);. re
7eb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 turn SQLITE_OK;
7ec0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 .}.../*.** Open
7ed0: 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 a file..*/.stati
7ee0: 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20 c int winOpen(.
7ef0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 sqlite3_vfs *pV
7f00: 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f fs, /* No
7f10: 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 t used */. cons
7f20: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 t char *zName,
7f30: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 /* Name of
7f40: 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38 the file (UTF-8
7f50: 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 ) */. sqlite3_f
7f60: 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 ile *id,
7f70: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 53 51 /* Write the SQ
7f80: 4c 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 Lite file handle
7f90: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 here */. int f
7fa0: 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 lags,
7fb0: 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64 /* Open mod
7fc0: 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 e flags */. int
7fd0: 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 *pOutFlags
7fe0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 /* Status
7ff0: 20 72 65 74 75 72 6e 20 66 6c 61 67 73 20 2a 2f return flags */
8000: 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a .){. HANDLE h;.
8010: 20 20 44 57 4f 52 44 20 64 77 44 65 73 69 72 65 DWORD dwDesire
8020: 64 41 63 63 65 73 73 3b 0a 20 20 44 57 4f 52 44 dAccess;. DWORD
8030: 20 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20 dwShareMode;.
8040: 44 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f 6e DWORD dwCreation
8050: 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 Disposition;. D
8060: 57 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64 41 WORD dwFlagsAndA
8070: 74 74 72 69 62 75 74 65 73 20 3d 20 30 3b 0a 20 ttributes = 0;.
8080: 20 69 6e 74 20 69 73 54 65 6d 70 3b 0a 20 20 77 int isTemp;. w
8090: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 inFile *pFile =
80a0: 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 (winFile*)id;.
80b0: 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 void *zConverted
80c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
80d0: 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e /* Filename in
80e0: 20 4f 53 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a OS encoding */.
80f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 const char *zU
8100: 74 66 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b tf8Name = zName;
8110: 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 /* Filename
8120: 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 69 6e in UTF-8 encodin
8130: 67 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 g */. char zTmp
8140: 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 2b 31 5d name[MAX_PATH+1]
8150: 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 ; /* Buff
8160: 65 72 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 er used to creat
8170: 65 20 74 65 6d 70 20 66 69 6c 65 6e 61 6d 65 20 e temp filename
8180: 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 */.. /* If the
8190: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 second argument
81a0: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e to this function
81b0: 20 69 73 20 4e 55 4c 4c 2c 20 67 65 6e 65 72 61 is NULL, genera
81c0: 74 65 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f te a . ** tempo
81d0: 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 74 rary file name t
81e0: 6f 20 75 73 65 20 0a 20 20 2a 2f 0a 20 20 69 66 o use . */. if
81f0: 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 29 7b 0a ( !zUtf8Name ){.
8200: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 67 65 74 int rc = get
8210: 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 Tempname(MAX_PAT
8220: 48 2b 31 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a H+1, zTmpname);.
8230: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 if( rc!=SQLI
8240: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 TE_OK ){. r
8250: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a eturn rc;. }.
8260: 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20 zUtf8Name =
8270: 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 zTmpname;. }..
8280: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 /* Convert the
8290: 66 69 6c 65 6e 61 6d 65 20 74 6f 20 74 68 65 20 filename to the
82a0: 73 79 73 74 65 6d 20 65 6e 63 6f 64 69 6e 67 2e system encoding.
82b0: 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 */. zConverted
82c0: 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 = convertUtf8Fi
82d0: 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61 6d 65 lename(zUtf8Name
82e0: 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 );. if( zConver
82f0: 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 ted==0 ){. re
8300: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 turn SQLITE_NOME
8310: 4d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 66 6c M;. }.. if( fl
8320: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 ags & SQLITE_OPE
8330: 4e 5f 52 45 41 44 57 52 49 54 45 20 29 7b 0a 20 N_READWRITE ){.
8340: 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 dwDesiredAcce
8350: 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 ss = GENERIC_REA
8360: 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54 D | GENERIC_WRIT
8370: 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 E;. }else{.
8380: 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 20 dwDesiredAccess
8390: 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a = GENERIC_READ;.
83a0: 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 20 }. if( flags
83b0: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 & SQLITE_OPEN_CR
83c0: 45 41 54 45 20 29 7b 0a 20 20 20 20 64 77 43 72 EATE ){. dwCr
83d0: 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f eationDispositio
83e0: 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b n = OPEN_ALWAYS;
83f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 . }else{. dw
8400: 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 CreationDisposit
8410: 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54 ion = OPEN_EXIST
8420: 49 4e 47 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 ING;. }. if( f
8430: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 lags & SQLITE_OP
8440: 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 EN_MAIN_DB ){.
8450: 20 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d 20 dwShareMode =
8460: 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20 FILE_SHARE_READ
8470: 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 | FILE_SHARE_WRI
8480: 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 TE;. }else{.
8490: 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d 20 30 dwShareMode = 0
84a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 ;. }. if( flag
84b0: 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f s & SQLITE_OPEN_
84c0: 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b DELETEONCLOSE ){
84d0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 .#if SQLITE_OS_W
84e0: 49 4e 43 45 0a 20 20 20 20 64 77 46 6c 61 67 73 INCE. dwFlags
84f0: 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 AndAttributes =
8500: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 FILE_ATTRIBUTE_H
8510: 49 44 44 45 4e 3b 0a 23 65 6c 73 65 0a 20 20 20 IDDEN;.#else.
8520: 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 dwFlagsAndAttri
8530: 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 butes = FILE_ATT
8540: 52 49 42 55 54 45 5f 54 45 4d 50 4f 52 41 52 59 RIBUTE_TEMPORARY
8550: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
8560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8570: 7c 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 | FILE_ATTRIBUTE
8580: 5f 48 49 44 44 45 4e 0a 20 20 20 20 20 20 20 20 _HIDDEN.
8590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
85a0: 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c | FILE_FL
85b0: 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f AG_DELETE_ON_CLO
85c0: 53 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 SE;.#endif. i
85d0: 73 54 65 6d 70 20 3d 20 31 3b 0a 20 20 7d 65 6c sTemp = 1;. }el
85e0: 73 65 7b 0a 20 20 20 20 64 77 46 6c 61 67 73 41 se{. dwFlagsA
85f0: 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 ndAttributes = F
8600: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f ILE_ATTRIBUTE_NO
8610: 52 4d 41 4c 3b 0a 20 20 20 20 69 73 54 65 6d 70 RMAL;. isTemp
8620: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 = 0;. }. /* R
8630: 65 70 6f 72 74 73 20 66 72 6f 6d 20 74 68 65 20 eports from the
8640: 69 6e 74 65 72 6e 65 74 20 61 72 65 20 74 68 61 internet are tha
8650: 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 73 t performance is
8660: 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65 74 always. ** bet
8670: 74 65 72 20 69 66 20 46 49 4c 45 5f 46 4c 41 47 ter if FILE_FLAG
8680: 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20 69 _RANDOM_ACCESS i
8690: 73 20 75 73 65 64 2e 20 20 54 69 63 6b 65 74 20 s used. Ticket
86a0: 23 32 36 39 39 2e 20 2a 2f 0a 20 20 64 77 46 6c #2699. */. dwFl
86b0: 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 agsAndAttributes
86c0: 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 |= FILE_FLAG_RA
86d0: 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 20 20 69 NDOM_ACCESS;. i
86e0: 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 f( isNT() ){.
86f0: 20 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 57 h = CreateFileW
8700: 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 ((WCHAR*)zConver
8710: 74 65 64 2c 0a 20 20 20 20 20 20 20 64 77 44 65 ted,. dwDe
8720: 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 siredAccess,.
8730: 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c dwShareMode,
8740: 0a 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 . NULL,.
8750: 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 dwCreationD
8760: 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 isposition,.
8770: 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 dwFlagsAndAtt
8780: 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 ributes,.
8790: 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 20 20 7d 65 NULL. );. }e
87a0: 6c 73 65 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f lse{.#if SQLITE_
87b0: 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 72 65 74 OS_WINCE. ret
87c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d urn SQLITE_NOMEM
87d0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68 20 3d 20 ;.#else. h =
87e0: 43 72 65 61 74 65 46 69 6c 65 41 28 28 63 68 61 CreateFileA((cha
87f0: 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 r*)zConverted,.
8800: 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41 dwDesiredA
8810: 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 64 77 ccess,. dw
8820: 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20 ShareMode,.
8830: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 64 NULL,. d
8840: 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 wCreationDisposi
8850: 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 64 77 46 tion,. dwF
8860: 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 lagsAndAttribute
8870: 73 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 s,. NULL.
8880: 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d );.#endif. }
8890: 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 . if( h==INVALI
88a0: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 D_HANDLE_VALUE )
88b0: 7b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 {. free(zConv
88c0: 65 72 74 65 64 29 3b 0a 20 20 20 20 69 66 28 20 erted);. if(
88d0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f flags & SQLITE_O
88e0: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 29 7b PEN_READWRITE ){
88f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 . return wi
8900: 6e 4f 70 65 6e 28 30 2c 20 7a 4e 61 6d 65 2c 20 nOpen(0, zName,
8910: 69 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 id, .
8920: 20 20 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45 ((flags|SQLITE
8930: 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 26 _OPEN_READONLY)&
8940: 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 ~SQLITE_OPEN_REA
8950: 44 57 52 49 54 45 29 2c 20 70 4f 75 74 46 6c 61 DWRITE), pOutFla
8960: 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a gs);. }else{.
8970: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c return SQL
8980: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 ITE_CANTOPEN;.
8990: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f }. }. if( pO
89a0: 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 69 utFlags ){. i
89b0: 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 f( flags & SQLIT
89c0: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 E_OPEN_READWRITE
89d0: 20 29 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 ){. *pOutF
89e0: 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 lags = SQLITE_OP
89f0: 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 EN_READWRITE;.
8a00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a }else{. *
8a10: 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 pOutFlags = SQLI
8a20: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 TE_OPEN_READONLY
8a30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6d 65 ;. }. }. me
8a40: 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 mset(pFile, 0, s
8a50: 69 7a 65 6f 66 28 2a 70 46 69 6c 65 29 29 3b 0a izeof(*pFile));.
8a60: 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 pFile->pMethod
8a70: 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64 3b = &winIoMethod;
8a80: 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b . pFile->h = h;
8a90: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 .#if SQLITE_OS_W
8aa0: 49 4e 43 45 0a 20 20 69 66 28 20 28 66 6c 61 67 INCE. if( (flag
8ab0: 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e s & (SQLITE_OPEN
8ac0: 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 _READWRITE|SQLIT
8ad0: 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 29 E_OPEN_MAIN_DB))
8ae0: 20 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 ==.
8af0: 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f (SQLITE_OPEN_
8b00: 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 READWRITE|SQLITE
8b10: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 0a 20 _OPEN_MAIN_DB).
8b20: 20 20 20 20 20 20 26 26 20 21 77 69 6e 63 65 43 && !winceC
8b30: 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c reateLock(zName,
8b40: 20 70 46 69 6c 65 29 0a 20 20 29 7b 0a 20 20 20 pFile). ){.
8b50: 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29 3b CloseHandle(h);
8b60: 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 . free(zConve
8b70: 72 74 65 64 29 3b 0a 20 20 20 20 72 65 74 75 72 rted);. retur
8b80: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 n SQLITE_CANTOPE
8b90: 4e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 54 N;. }. if( isT
8ba0: 65 6d 70 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 emp ){. pFile
8bb0: 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 ->zDeleteOnClose
8bc0: 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 = zConverted;.
8bd0: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 }else.#endif.
8be0: 7b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 {. free(zConv
8bf0: 65 72 74 65 64 29 3b 0a 20 20 7d 0a 20 20 4f 70 erted);. }. Op
8c00: 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 enCounter(+1);.
8c10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
8c20: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 K;.}../*.** Dele
8c30: 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c te the named fil
8c40: 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 e..**.** Note th
8c50: 61 74 20 77 69 6e 64 6f 77 73 20 64 6f 65 73 20 at windows does
8c60: 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c 65 not allow a file
8c70: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 to be deleted i
8c80: 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 f some other.**
8c90: 70 72 6f 63 65 73 73 20 68 61 73 20 69 74 20 6f process has it o
8ca0: 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20 pen. Sometimes
8cb0: 61 20 76 69 72 75 73 20 73 63 61 6e 6e 65 72 20 a virus scanner
8cc0: 6f 72 20 69 6e 64 65 78 69 6e 67 20 70 72 6f 67 or indexing prog
8cd0: 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e ram.** will open
8ce0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 a journal file
8cf0: 73 68 6f 72 74 6c 79 20 61 66 74 65 72 20 69 74 shortly after it
8d00: 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 6f is created in o
8d10: 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77 68 rder to do.** wh
8d20: 61 74 65 76 65 72 20 64 6f 65 73 2e 20 20 57 68 atever does. Wh
8d30: 69 6c 65 20 74 68 69 73 20 6f 74 68 65 72 20 70 ile this other p
8d40: 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e rocess is holdin
8d50: 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 g the.** file op
8d60: 65 6e 2c 20 77 65 20 77 69 6c 6c 20 62 65 20 75 en, we will be u
8d70: 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 nable to delete
8d80: 69 74 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f it. To work aro
8d90: 75 6e 64 20 74 68 69 73 0a 2a 2a 20 70 72 6f 62 und this.** prob
8da0: 6c 65 6d 2c 20 77 65 20 64 65 6c 61 79 20 31 30 lem, we delay 10
8db0: 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 0 milliseconds a
8dc0: 6e 64 20 74 72 79 20 74 6f 20 64 65 6c 65 74 65 nd try to delete
8dd0: 20 61 67 61 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 again. Up.** t
8de0: 6f 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 o MX_DELETION_AT
8df0: 54 45 4d 50 54 73 20 64 65 6c 65 74 69 6f 6e 20 TEMPTs deletion
8e00: 61 74 74 65 6d 70 74 73 20 61 72 65 20 72 75 6e attempts are run
8e10: 20 62 65 66 6f 72 65 20 67 69 76 69 6e 67 0a 2a before giving.*
8e20: 2a 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69 * up and returni
8e30: 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a ng an error..*/.
8e40: 23 64 65 66 69 6e 65 20 4d 58 5f 44 45 4c 45 54 #define MX_DELET
8e50: 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 35 0a 73 ION_ATTEMPTS 5.s
8e60: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c tatic int winDel
8e70: 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 ete(. sqlite3_v
8e80: 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 fs *pVfs,
8e90: 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f /* Not used o
8ea0: 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e n win32 */. con
8eb0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 st char *zFilena
8ec0: 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 me, /* Name
8ed0: 20 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 of file to dele
8ee0: 74 65 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 te */. int sync
8ef0: 44 69 72 20 20 20 20 20 20 20 20 20 20 20 20 20 Dir
8f00: 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 /* Not used
8f10: 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 on win32 */.){.
8f20: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 int cnt = 0;.
8f30: 69 6e 74 20 72 63 3b 0a 20 20 76 6f 69 64 20 2a int rc;. void *
8f40: 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e zConverted = con
8f50: 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 vertUtf8Filename
8f60: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 (zFilename);. i
8f70: 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 f( zConverted==0
8f80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 ){. return S
8f90: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d QLITE_NOMEM;. }
8fa0: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 . SimulateIOErr
8fb0: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 or(return SQLITE
8fc0: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a _IOERR_DELETE);.
8fd0: 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a if( isNT() ){.
8fe0: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 44 65 do{. De
8ff0: 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e 76 65 leteFileW(zConve
9000: 72 74 65 64 29 3b 0a 20 20 20 20 7d 77 68 69 6c rted);. }whil
9010: 65 28 20 28 72 63 20 3d 20 47 65 74 46 69 6c 65 e( (rc = GetFile
9020: 41 74 74 72 69 62 75 74 65 73 57 28 7a 43 6f 6e AttributesW(zCon
9030: 76 65 72 74 65 64 29 29 21 3d 30 78 66 66 66 66 verted))!=0xffff
9040: 66 66 66 66 20 0a 20 20 20 20 20 20 20 20 20 20 ffff .
9050: 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20 4d 58 5f && cnt++ < MX_
9060: 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 DELETION_ATTEMPT
9070: 53 20 26 26 20 28 53 6c 65 65 70 28 31 30 30 29 S && (Sleep(100)
9080: 2c 20 31 29 20 29 3b 0a 20 20 7d 65 6c 73 65 7b , 1) );. }else{
9090: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 .#if SQLITE_OS_W
90a0: 49 4e 43 45 0a 20 20 20 20 72 65 74 75 72 6e 20 INCE. return
90b0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 23 65 SQLITE_NOMEM;.#e
90c0: 6c 73 65 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 lse. do{.
90d0: 20 20 44 65 6c 65 74 65 46 69 6c 65 41 28 7a 43 DeleteFileA(zC
90e0: 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7d onverted);. }
90f0: 77 68 69 6c 65 28 20 28 72 63 20 3d 20 47 65 74 while( (rc = Get
9100: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 FileAttributesA(
9110: 7a 43 6f 6e 76 65 72 74 65 64 29 29 21 3d 30 78 zConverted))!=0x
9120: 66 66 66 66 66 66 66 66 0a 20 20 20 20 20 20 20 ffffffff.
9130: 20 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20 && cnt++ <
9140: 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 MX_DELETION_ATTE
9150: 4d 50 54 53 20 26 26 20 28 53 6c 65 65 70 28 31 MPTS && (Sleep(1
9160: 30 30 29 2c 20 31 29 20 29 3b 0a 23 65 6e 64 69 00), 1) );.#endi
9170: 66 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a 43 6f f. }. free(zCo
9180: 6e 76 65 72 74 65 64 29 3b 0a 20 20 4f 53 54 52 nverted);. OSTR
9190: 41 43 45 32 28 22 44 45 4c 45 54 45 20 5c 22 25 ACE2("DELETE \"%
91a0: 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d s\"\n", zFilenam
91b0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3d e);. return rc=
91c0: 3d 30 78 66 66 66 66 66 66 66 66 20 3f 20 53 51 =0xffffffff ? SQ
91d0: 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 LITE_OK : SQLITE
91e0: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 3b 0a 7d _IOERR_DELETE;.}
91f0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 ../*.** Check th
9200: 65 20 65 78 69 73 74 61 6e 63 65 20 61 6e 64 20 e existance and
9210: 73 74 61 74 75 73 20 6f 66 20 61 20 66 69 6c 65 status of a file
9220: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 ..*/.static int
9230: 77 69 6e 41 63 63 65 73 73 28 0a 20 20 73 71 6c winAccess(. sql
9240: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 ite3_vfs *pVfs,
9250: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 /* Not u
9260: 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a sed on win32 */.
9270: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 const char *zF
9280: 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 ilename, /*
9290: 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 Name of file to
92a0: 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 check */. int f
92b0: 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 lags,
92c0: 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 /* Type of
92d0: 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 6f 6e test to make on
92e0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 this file */.
92f0: 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 int *pResOut
9300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 /* OU
9310: 54 3a 20 52 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a T: Result */.){.
9320: 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 DWORD attr;.
9330: 69 6e 74 20 72 63 3b 0a 20 20 76 6f 69 64 20 2a int rc;. void *
9340: 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e zConverted = con
9350: 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 vertUtf8Filename
9360: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 (zFilename);. i
9370: 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 f( zConverted==0
9380: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 ){. return S
9390: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d QLITE_NOMEM;. }
93a0: 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b . if( isNT() ){
93b0: 0a 20 20 20 20 61 74 74 72 20 3d 20 47 65 74 46 . attr = GetF
93c0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 28 ileAttributesW((
93d0: 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65 WCHAR*)zConverte
93e0: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 d);. }else{.#if
93f0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 SQLITE_OS_WINCE
9400: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 . return SQLI
9410: 54 45 5f 4e 4f 4d 45 4d 3b 0a 23 65 6c 73 65 0a TE_NOMEM;.#else.
9420: 20 20 20 20 61 74 74 72 20 3d 20 47 65 74 46 69 attr = GetFi
9430: 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 28 63 leAttributesA((c
9440: 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 har*)zConverted)
9450: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 66 ;.#endif. }. f
9460: 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b ree(zConverted);
9470: 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61 67 73 . switch( flags
9480: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c ){. case SQL
9490: 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a ITE_ACCESS_READ:
94a0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 . case SQLITE
94b0: 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a _ACCESS_EXISTS:.
94c0: 20 20 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 rc = attr!
94d0: 3d 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 20 =0xffffffff;.
94e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 break;. ca
94f0: 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 se SQLITE_ACCESS
9500: 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20 _READWRITE:.
9510: 20 20 72 63 20 3d 20 28 61 74 74 72 20 26 20 46 rc = (attr & F
9520: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45 ILE_ATTRIBUTE_RE
9530: 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 ADONLY)==0;.
9540: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 break;. def
9550: 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 ault:. asse
9560: 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 rt(!"Invalid fla
9570: 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 gs argument");.
9580: 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 }. *pResOut =
9590: 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c rc;. return SQL
95a0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a ITE_OK;.}.../*.*
95b0: 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 * Turn a relativ
95c0: 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 e pathname into
95d0: 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e a full pathname.
95e0: 20 20 57 72 69 74 65 20 74 68 65 20 66 75 6c 6c Write the full
95f0: 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 .** pathname int
9600: 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b o zOut[]. zOut[
9610: 5d 20 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 61 ] will be at lea
9620: 73 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e st pVfs->mxPathn
9630: 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 ame.** bytes in
9640: 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 size..*/.static
9650: 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e int winFullPathn
9660: 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 ame(. sqlite3_v
9670: 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 fs *pVfs,
9680: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 /* Pointer
9690: 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f to vfs object */
96a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
96b0: 52 65 6c 61 74 69 76 65 2c 20 20 20 20 20 20 20 Relative,
96c0: 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c /* Possibly rel
96d0: 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 ative input path
96e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c */. int nFull,
96f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9700: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f /* Size of o
9710: 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 utput buffer in
9720: 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 bytes */. char
9730: 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20 20 20 20 *zFull
9740: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 /* Outp
9750: 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a ut buffer */.){.
9760: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 .#if defined(__C
9770: 59 47 57 49 4e 5f 5f 29 0a 20 20 63 79 67 77 69 YGWIN__). cygwi
9780: 6e 5f 63 6f 6e 76 5f 74 6f 5f 66 75 6c 6c 5f 77 n_conv_to_full_w
9790: 69 6e 33 32 5f 70 61 74 68 28 7a 52 65 6c 61 74 in32_path(zRelat
97a0: 69 76 65 2c 20 7a 46 75 6c 6c 29 3b 0a 20 20 72 ive, zFull);. r
97b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b eturn SQLITE_OK;
97c0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c .#endif..#if SQL
97d0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f ITE_OS_WINCE. /
97e0: 2a 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20 63 * WinCE has no c
97f0: 6f 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c 61 oncept of a rela
9800: 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f tive pathname, o
9810: 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20 r so I am told.
9820: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 */. sqlite3_snp
9830: 72 69 6e 74 66 28 70 56 66 73 2d 3e 6d 78 50 61 rintf(pVfs->mxPa
9840: 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 2c 20 22 thname, zFull, "
9850: 25 73 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b %s", zRelative);
9860: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 . return SQLITE
9870: 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 _OK;.#endif..#if
9880: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 !SQLITE_OS_WINC
9890: 45 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f E && !defined(__
98a0: 43 59 47 57 49 4e 5f 5f 29 0a 20 20 69 6e 74 20 CYGWIN__). int
98b0: 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a nByte;. void *z
98c0: 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 63 68 61 Converted;. cha
98d0: 72 20 2a 7a 4f 75 74 3b 0a 20 20 7a 43 6f 6e 76 r *zOut;. zConv
98e0: 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 erted = convertU
98f0: 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c tf8Filename(zRel
9900: 61 74 69 76 65 29 3b 0a 20 20 69 66 28 20 69 73 ative);. if( is
9910: 4e 54 28 29 20 29 7b 0a 20 20 20 20 57 43 48 41 NT() ){. WCHA
9920: 52 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 R *zTemp;. nB
9930: 79 74 65 20 3d 20 47 65 74 46 75 6c 6c 50 61 74 yte = GetFullPat
9940: 68 4e 61 6d 65 57 28 28 57 43 48 41 52 2a 29 7a hNameW((WCHAR*)z
9950: 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c Converted, 0, 0,
9960: 20 30 29 20 2b 20 33 3b 0a 20 20 20 20 7a 54 65 0) + 3;. zTe
9970: 6d 70 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 mp = malloc( nBy
9980: 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b te*sizeof(zTemp[
9990: 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 0]) );. if( z
99a0: 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 Temp==0 ){.
99b0: 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 free(zConverted
99c0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 );. return
99d0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 SQLITE_NOMEM;.
99e0: 20 20 7d 0a 20 20 20 20 47 65 74 46 75 6c 6c 50 }. GetFullP
99f0: 61 74 68 4e 61 6d 65 57 28 28 57 43 48 41 52 2a athNameW((WCHAR*
9a00: 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 )zConverted, nBy
9a10: 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 te, zTemp, 0);.
9a20: 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 free(zConvert
9a30: 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 ed);. zOut =
9a40: 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 unicodeToUtf8(zT
9a50: 65 6d 70 29 3b 0a 20 20 20 20 66 72 65 65 28 7a emp);. free(z
9a60: 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a Temp);. }else{.
9a70: 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 3b char *zTemp;
9a80: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 47 65 74 . nByte = Get
9a90: 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 FullPathNameA((c
9aa0: 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c har*)zConverted,
9ab0: 20 30 2c 20 30 2c 20 30 29 20 2b 20 33 3b 0a 20 0, 0, 0) + 3;.
9ac0: 20 20 20 7a 54 65 6d 70 20 3d 20 6d 61 6c 6c 6f zTemp = mallo
9ad0: 63 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 c( nByte*sizeof(
9ae0: 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 zTemp[0]) );.
9af0: 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b if( zTemp==0 ){
9b00: 0a 20 20 20 20 20 20 66 72 65 65 28 7a 43 6f 6e . free(zCon
9b10: 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 verted);. r
9b20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d eturn SQLITE_NOM
9b30: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 47 65 EM;. }. Ge
9b40: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 tFullPathNameA((
9b50: 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 char*)zConverted
9b60: 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 , nByte, zTemp,
9b70: 30 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 0);. free(zCo
9b80: 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f nverted);. zO
9b90: 75 74 20 3d 20 6d 62 63 73 54 6f 55 74 66 38 28 ut = mbcsToUtf8(
9ba0: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 66 72 65 65 zTemp);. free
9bb0: 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 (zTemp);. }. i
9bc0: 66 28 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 f( zOut ){. s
9bd0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 qlite3_snprintf(
9be0: 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 pVfs->mxPathname
9bf0: 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a , zFull, "%s", z
9c00: 4f 75 74 29 3b 0a 20 20 20 20 66 72 65 65 28 7a Out);. free(z
9c10: 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Out);. return
9c20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 SQLITE_OK;. }e
9c30: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 lse{. return
9c40: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 SQLITE_NOMEM;.
9c50: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 6e }.#endif.}..#ifn
9c60: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f def SQLITE_OMIT_
9c70: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f LOAD_EXTENSION./
9c80: 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 *.** Interfaces
9c90: 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 for opening a sh
9ca0: 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 ared library, fi
9cb0: 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e nding entry poin
9cc0: 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 ts.** within the
9cd0: 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c shared library,
9ce0: 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 and closing the
9cf0: 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e shared library.
9d00: 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 .*/./*.** Interf
9d10: 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 aces for opening
9d20: 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 a shared librar
9d30: 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 y, finding entry
9d40: 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 points.** withi
9d50: 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 n the shared lib
9d60: 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e rary, and closin
9d70: 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 g the shared lib
9d80: 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 rary..*/.static
9d90: 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e 28 void *winDlOpen(
9da0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 sqlite3_vfs *pVf
9db0: 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a s, const char *z
9dc0: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41 4e Filename){. HAN
9dd0: 44 4c 45 20 68 3b 0a 20 20 76 6f 69 64 20 2a 7a DLE h;. void *z
9de0: 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 Converted = conv
9df0: 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 ertUtf8Filename(
9e00: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 zFilename);. if
9e10: 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 ( zConverted==0
9e20: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b ){. return 0;
9e30: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 . }. if( isNT(
9e40: 29 20 29 7b 0a 20 20 20 20 68 20 3d 20 4c 6f 61 ) ){. h = Loa
9e50: 64 4c 69 62 72 61 72 79 57 28 28 57 43 48 41 52 dLibraryW((WCHAR
9e60: 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 *)zConverted);.
9e70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20 }else{. h =
9e80: 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28 63 68 LoadLibraryA((ch
9e90: 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b ar*)zConverted);
9ea0: 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a 43 6f 6e . }. free(zCon
9eb0: 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74 75 72 verted);. retur
9ec0: 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74 n (void*)h;.}.st
9ed0: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 45 atic void winDlE
9ee0: 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 rror(sqlite3_vfs
9ef0: 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 *pVfs, int nBuf
9f00: 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 , char *zBufOut)
9f10: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f {.#if SQLITE_OS_
9f20: 57 49 4e 43 45 0a 20 20 69 6e 74 20 65 72 72 6f WINCE. int erro
9f30: 72 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 r = GetLastError
9f40: 28 29 3b 0a 20 20 69 66 28 20 65 72 72 6f 72 3e ();. if( error>
9f50: 30 78 37 46 46 46 46 46 46 20 29 7b 0a 20 20 20 0x7FFFFFF ){.
9f60: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 sqlite3_snprint
9f70: 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c f(nBuf, zBufOut,
9f80: 20 22 4f 73 45 72 72 6f 72 20 30 78 25 78 22 2c "OsError 0x%x",
9f90: 20 65 72 72 6f 72 29 3b 0a 20 20 7d 65 6c 73 65 error);. }else
9fa0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e {. sqlite3_sn
9fb0: 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 printf(nBuf, zBu
9fc0: 66 4f 75 74 2c 20 22 4f 73 45 72 72 6f 72 20 25 fOut, "OsError %
9fd0: 64 22 2c 20 65 72 72 6f 72 29 3b 0a 20 20 7d 0a d", error);. }.
9fe0: 23 65 6c 73 65 0a 20 20 46 6f 72 6d 61 74 4d 65 #else. FormatMe
9ff0: 73 73 61 67 65 41 28 0a 20 20 20 20 46 4f 52 4d ssageA(. FORM
a000: 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f AT_MESSAGE_FROM_
a010: 53 59 53 54 45 4d 2c 0a 20 20 20 20 4e 55 4c 4c SYSTEM,. NULL
a020: 2c 0a 20 20 20 20 47 65 74 4c 61 73 74 45 72 72 ,. GetLastErr
a030: 6f 72 28 29 2c 0a 20 20 20 20 30 2c 0a 20 20 20 or(),. 0,.
a040: 20 7a 42 75 66 4f 75 74 2c 0a 20 20 20 20 6e 42 zBufOut,. nB
a050: 75 66 2d 31 2c 0a 20 20 20 20 30 0a 20 20 29 3b uf-1,. 0. );
a060: 0a 23 65 6e 64 69 66 0a 7d 0a 76 6f 69 64 20 2a .#endif.}.void *
a070: 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 winDlSym(sqlite3
a080: 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 _vfs *pVfs, void
a090: 20 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e 73 74 *pHandle, const
a0a0: 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c 29 7b char *zSymbol){
a0b0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 .#if SQLITE_OS_W
a0c0: 49 4e 43 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 INCE. /* The Ge
a0d0: 74 50 72 6f 63 41 64 64 72 65 73 73 41 28 29 20 tProcAddressA()
a0e0: 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 routine is only
a0f0: 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 77 69 6e available on win
a100: 63 65 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 ce. */. return
a110: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 28 GetProcAddressA(
a120: 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 2c (HANDLE)pHandle,
a130: 20 7a 53 79 6d 62 6f 6c 29 3b 0a 23 65 6c 73 65 zSymbol);.#else
a140: 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 . /* All other
a150: 77 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d windows platform
a160: 73 20 65 78 70 65 63 74 20 47 65 74 50 72 6f 63 s expect GetProc
a170: 41 64 64 72 65 73 73 28 29 20 74 6f 20 74 61 6b Address() to tak
a180: 65 0a 20 20 2a 2a 20 61 6e 20 41 6e 73 69 20 73 e. ** an Ansi s
a190: 74 72 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 tring regardless
a1a0: 20 6f 66 20 74 68 65 20 5f 55 4e 49 43 4f 44 45 of the _UNICODE
a1b0: 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 72 65 setting */. re
a1c0: 74 75 72 6e 20 47 65 74 50 72 6f 63 41 64 64 72 turn GetProcAddr
a1d0: 65 73 73 28 28 48 41 4e 44 4c 45 29 70 48 61 6e ess((HANDLE)pHan
a1e0: 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 23 dle, zSymbol);.#
a1f0: 65 6e 64 69 66 0a 7d 0a 76 6f 69 64 20 77 69 6e endif.}.void win
a200: 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f DlClose(sqlite3_
a210: 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 vfs *pVfs, void
a220: 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 46 72 65 *pHandle){. Fre
a230: 65 4c 69 62 72 61 72 79 28 28 48 41 4e 44 4c 45 eLibrary((HANDLE
a240: 29 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c )pHandle);.}.#el
a250: 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f se /* if SQLITE_
a260: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 OMIT_LOAD_EXTENS
a270: 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20 ION is defined:
a280: 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e */. #define win
a290: 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66 DlOpen 0. #def
a2a0: 69 6e 65 20 77 69 6e 44 6c 45 72 72 6f 72 20 30 ine winDlError 0
a2b0: 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c . #define winDl
a2c0: 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e Sym 0. #defin
a2d0: 65 20 77 69 6e 44 6c 43 6c 6f 73 65 20 30 0a 23 e winDlClose 0.#
a2e0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 endif.../*.** Wr
a2f0: 69 74 65 20 75 70 20 74 6f 20 6e 42 75 66 20 62 ite up to nBuf b
a300: 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 ytes of randomne
a310: 73 73 20 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f ss into zBuf..*/
a320: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 .static int winR
a330: 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 andomness(sqlite
a340: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 3_vfs *pVfs, int
a350: 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 nBuf, char *zBu
a360: 66 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b f){. int n = 0;
a370: 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 53 59 . if( sizeof(SY
a380: 53 54 45 4d 54 49 4d 45 29 3c 3d 6e 42 75 66 2d STEMTIME)<=nBuf-
a390: 6e 20 29 7b 0a 20 20 20 20 53 59 53 54 45 4d 54 n ){. SYSTEMT
a3a0: 49 4d 45 20 78 3b 0a 20 20 20 20 47 65 74 53 79 IME x;. GetSy
a3b0: 73 74 65 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20 stemTime(&x);.
a3c0: 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e memcpy(&zBuf[n
a3d0: 5d 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 ], &x, sizeof(x)
a3e0: 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 );. n += size
a3f0: 6f 66 28 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 of(x);. }. if(
a400: 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d sizeof(DWORD)<=
a410: 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 nBuf-n ){. DW
a420: 4f 52 44 20 70 69 64 20 3d 20 47 65 74 43 75 72 ORD pid = GetCur
a430: 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 3b rentProcessId();
a440: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 . memcpy(&zBu
a450: 66 5b 6e 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 f[n], &pid, size
a460: 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20 6e 20 of(pid));. n
a470: 2b 3d 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a += sizeof(pid);.
a480: 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 }. if( sizeof
a490: 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 (DWORD)<=nBuf-n
a4a0: 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 63 6e 74 ){. DWORD cnt
a4b0: 20 3d 20 47 65 74 54 69 63 6b 43 6f 75 6e 74 28 = GetTickCount(
a4c0: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a );. memcpy(&z
a4d0: 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 Buf[n], &cnt, si
a4e0: 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 zeof(cnt));.
a4f0: 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 n += sizeof(cnt)
a500: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 ;. }. if( size
a510: 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 of(LARGE_INTEGER
a520: 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 )<=nBuf-n ){.
a530: 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 69 LARGE_INTEGER i
a540: 3b 0a 20 20 20 20 51 75 65 72 79 50 65 72 66 6f ;. QueryPerfo
a550: 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28 26 69 rmanceCounter(&i
a560: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a );. memcpy(&z
a570: 42 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a 65 Buf[n], &i, size
a580: 6f 66 28 69 29 29 3b 0a 20 20 20 20 6e 20 2b 3d of(i));. n +=
a590: 20 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20 7d 0a sizeof(i);. }.
a5a0: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a return n;.}...
a5b0: 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 /*.** Sleep for
a5c0: 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 a little while.
a5d0: 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 Return the amou
a5e0: 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 nt of time slept
a5f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 ..*/.static int
a600: 77 69 6e 53 6c 65 65 70 28 73 71 6c 69 74 65 33 winSleep(sqlite3
a610: 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 _vfs *pVfs, int
a620: 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20 53 6c 65 microsec){. Sle
a630: 65 70 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 ep((microsec+999
a640: 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72 )/1000);. retur
a650: 6e 20 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 n ((microsec+999
a660: 29 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a )/1000)*1000;.}.
a670: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f ./*.** The follo
a680: 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 wing variable, i
a690: 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a f set to a non-z
a6a0: 65 72 6f 20 76 61 6c 75 65 2c 20 62 65 63 6f 6d ero value, becom
a6b0: 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a es the result.**
a6c0: 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 73 returned from s
a6d0: 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 qlite3OsCurrentT
a6e0: 69 6d 65 28 29 2e 20 20 54 68 69 73 20 69 73 20 ime(). This is
a6f0: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 used for testing
a700: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 ..*/.#ifdef SQLI
a710: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 TE_TEST.int sqli
a720: 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 te3_current_time
a730: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a = 0;.#endif../*
a740: 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 .** Find the cur
a750: 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e rent time (in Un
a760: 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 iversal Coordina
a770: 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 ted Time). Writ
a780: 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 e the.** current
a790: 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 time and date a
a7a0: 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e s a Julian Day n
a7b0: 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f umber into *prNo
a7c0: 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 w and.** return
a7d0: 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 0. Return 1 if
a7e0: 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 the time and dat
a7f0: 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e e cannot be foun
a800: 64 2e 0a 2a 2f 0a 69 6e 74 20 77 69 6e 43 75 72 d..*/.int winCur
a810: 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 rentTime(sqlite3
a820: 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 _vfs *pVfs, doub
a830: 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 46 49 le *prNow){. FI
a840: 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 2f 2a 20 LETIME ft;. /*
a850: 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74 75 FILETIME structu
a860: 72 65 20 69 73 20 61 20 36 34 2d 62 69 74 20 76 re is a 64-bit v
a870: 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74 69 6e alue representin
a880: 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 g the number of
a890: 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65 . 100-nanose
a8a0: 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73 20 73 cond intervals s
a8b0: 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31 2c 20 ince January 1,
a8c0: 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30 35 38 1601 (= JD 23058
a8d0: 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20 20 64 13.5). . */. d
a8e0: 6f 75 62 6c 65 20 6e 6f 77 3b 0a 23 69 66 20 53 ouble now;.#if S
a8f0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 QLITE_OS_WINCE.
a900: 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69 6d 65 SYSTEMTIME time
a910: 3b 0a 20 20 47 65 74 53 79 73 74 65 6d 54 69 6d ;. GetSystemTim
a920: 65 28 26 74 69 6d 65 29 3b 0a 20 20 53 79 73 74 e(&time);. Syst
a930: 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 emTimeToFileTime
a940: 28 26 74 69 6d 65 2c 26 66 74 29 3b 0a 23 65 6c (&time,&ft);.#el
a950: 73 65 0a 20 20 47 65 74 53 79 73 74 65 6d 54 69 se. GetSystemTi
a960: 6d 65 41 73 46 69 6c 65 54 69 6d 65 28 20 26 66 meAsFileTime( &f
a970: 74 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 6e 6f t );.#endif. no
a980: 77 20 3d 20 28 28 64 6f 75 62 6c 65 29 66 74 2e w = ((double)ft.
a990: 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 29 20 dwHighDateTime)
a9a0: 2a 20 34 32 39 34 39 36 37 32 39 36 2e 30 3b 20 * 4294967296.0;
a9b0: 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 28 6e 6f 77 . *prNow = (now
a9c0: 20 2b 20 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 + ft.dwLowDateT
a9d0: 69 6d 65 29 2f 38 36 34 30 30 30 30 30 30 30 30 ime)/86400000000
a9e0: 30 2e 30 20 2b 20 32 33 30 35 38 31 33 2e 35 3b 0.0 + 2305813.5;
a9f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 .#ifdef SQLITE_T
aa00: 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 EST. if( sqlite
aa10: 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 3_current_time )
aa20: 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 73 {. *prNow = s
aa30: 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 qlite3_current_t
aa40: 69 6d 65 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 ime/86400.0 + 24
aa50: 34 30 35 38 37 2e 35 3b 0a 20 20 7d 0a 23 65 6e 40587.5;. }.#en
aa60: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a dif. return 0;.
aa70: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 }..static int wi
aa80: 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 nGetLastError(sq
aa90: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c lite3_vfs *pVfs,
aaa0: 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 int nBuf, char
aab0: 2a 7a 42 75 66 29 7b 0a 20 20 72 65 74 75 72 6e *zBuf){. return
aac0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 0;.}../*.** Ini
aad0: 74 69 61 6c 69 7a 65 20 61 6e 64 20 64 65 69 6e tialize and dein
aae0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 itialize the ope
aaf0: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e rating system in
ab00: 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 terface..*/.int
ab10: 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 sqlite3_os_init(
ab20: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 void){. static
ab30: 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 56 sqlite3_vfs winV
ab40: 66 73 20 3d 20 7b 0a 20 20 20 20 31 2c 20 20 20 fs = {. 1,
ab50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
ab60: 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 iVersion */.
ab70: 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 sizeof(winFile)
ab80: 2c 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 , /* szOsFile
ab90: 2a 2f 0a 20 20 20 20 4d 41 58 5f 50 41 54 48 2c */. MAX_PATH,
aba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50 /* mxP
abb0: 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 athname */. 0
abc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
abd0: 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 /* pNext */.
abe0: 20 20 22 77 69 6e 33 32 22 2c 20 20 20 20 20 20 "win32",
abf0: 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f /* zName */
ac00: 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 . 0,
ac10: 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 /* pAppD
ac20: 61 74 61 20 2a 2f 0a 20 0a 20 20 20 20 77 69 6e ata */. . win
ac30: 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 Open,
ac40: 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 /* xOpen */.
ac50: 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20 winDelete,
ac60: 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f /* xDelete */
ac70: 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20 . winAccess,
ac80: 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 /* xAcce
ac90: 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c ss */. winFul
aca0: 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 2f 2a 20 lPathname, /*
acb0: 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f xFullPathname */
acc0: 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 . winDlOpen,
acd0: 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 /* xDlOp
ace0: 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 en */. winDlE
acf0: 72 72 6f 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 rror, /*
ad00: 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 xDlError */.
ad10: 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 winDlSym,
ad20: 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a /* xDlSym */.
ad30: 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 winDlClose,
ad40: 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f /* xDlClo
ad50: 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e se */. winRan
ad60: 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 2f 2a 20 domness, /*
ad70: 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 xRandomness */.
ad80: 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 winSleep,
ad90: 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 /* xSleep
ada0: 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e */. winCurren
adb0: 74 54 69 6d 65 2c 20 20 20 20 2f 2a 20 78 43 75 tTime, /* xCu
adc0: 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 rrentTime */.
add0: 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 winGetLastError
ade0: 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 /* xGetLastE
adf0: 72 72 6f 72 20 2a 2f 0a 20 20 7d 3b 0a 20 20 73 rror */. };. s
ae00: 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 qlite3_vfs_regis
ae10: 74 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29 3b ter(&winVfs, 1);
ae20: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 . return SQLITE
ae30: 5f 4f 4b 3b 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 _OK; .}.int sqli
ae40: 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 te3_os_end(void)
ae50: 7b 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 { . return SQLI
ae60: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 TE_OK;.}..#endif
ae70: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 /* SQLITE_OS_WI
ae80: 4e 20 2a 2f 0a N */.