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 57 69 6e 64 6f 77 73 2e ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53 liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20 QLITE_OS_WIN
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20 is file is used
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79 for Windows only
0210: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59 */..#ifdef __CY
0220: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65 GWIN__.# include
0230: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a <sys/cygwin.h>.
0240: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e #endif../*.** In
0250: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20 clude code that
0260: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c is common to all
0270: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f os_*.c files.*/
0280: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f .#include "os_co
0290: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 53 mmon.h"../*.** S
02a0: 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f ome Microsoft co
02b0: 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 mpilers lack thi
02c0: 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f s definition..*/
02d0: 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 .#ifndef INVALID
02e0: 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 _FILE_ATTRIBUTES
02f0: 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 .# define INVALI
0300: 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 D_FILE_ATTRIBUTE
0310: 53 20 28 28 44 57 4f 52 44 29 2d 31 29 20 0a 23 S ((DWORD)-1) .#
0320: 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72 endif../* Forwar
0330: 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a d references */.
0340: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77 typedef struct w
0350: 69 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20 20 20 inShm winShm;
0360: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6e /* A con
0370: 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 nection to share
0380: 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65 d-memory */.type
0390: 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 53 68 def struct winSh
03a0: 6d 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f 64 65 mNode winShmNode
03b0: 3b 20 20 20 2f 2a 20 41 20 72 65 67 69 6f 6e 20 ; /* A region
03c0: 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 of shared-memory
03d0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 43 45 */../*.** WinCE
03e0: 20 6c 61 63 6b 73 20 6e 61 74 69 76 65 20 73 75 lacks native su
03f0: 70 70 6f 72 74 20 66 6f 72 20 66 69 6c 65 20 6c pport for file l
0400: 6f 63 6b 69 6e 67 20 73 6f 20 77 65 20 68 61 76 ocking so we hav
0410: 65 20 74 6f 20 66 61 6b 65 20 69 74 0a 2a 2a 20 e to fake it.**
0420: 77 69 74 68 20 73 6f 6d 65 20 63 6f 64 65 20 6f with some code o
0430: 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a 23 69 f our own..*/.#i
0440: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 f SQLITE_OS_WINC
0450: 45 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 E.typedef struct
0460: 20 77 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20 20 69 winceLock {. i
0470: 6e 74 20 6e 52 65 61 64 65 72 73 3b 20 20 20 20 nt nReaders;
0480: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 /* Number of
0490: 72 65 61 64 65 72 20 6c 6f 63 6b 73 20 6f 62 74 reader locks obt
04a0: 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 ained */. BOOL
04b0: 62 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 2f bPending; /
04c0: 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20 70 65 * Indicates a pe
04d0: 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62 nding lock has b
04e0: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a een obtained */.
04f0: 20 20 42 4f 4f 4c 20 62 52 65 73 65 72 76 65 64 BOOL bReserved
0500: 3b 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 ; /* Indicat
0510: 65 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f es a reserved lo
0520: 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 ck has been obta
0530: 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 ined */. BOOL b
0540: 45 78 63 6c 75 73 69 76 65 3b 20 20 20 20 2f 2a Exclusive; /*
0550: 20 49 6e 64 69 63 61 74 65 73 20 61 6e 20 65 78 Indicates an ex
0560: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 68 61 73 clusive lock has
0570: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a been obtained *
0580: 2f 0a 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b 0a 23 /.} winceLock;.#
0590: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 endif../*.** The
05a0: 20 77 69 6e 46 69 6c 65 20 73 74 72 75 63 74 75 winFile structu
05b0: 72 65 20 69 73 20 61 20 73 75 62 63 6c 61 73 73 re is a subclass
05c0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 of sqlite3_file
05d0: 2a 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 * specific to th
05e0: 65 20 77 69 6e 33 32 0a 2a 2a 20 70 6f 72 74 61 e win32.** porta
05f0: 62 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a 2f bility layer..*/
0600: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 .typedef struct
0610: 77 69 6e 46 69 6c 65 20 77 69 6e 46 69 6c 65 3b winFile winFile;
0620: 0a 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20 .struct winFile
0630: 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 {. const sqlite
0640: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 3_io_methods *pM
0650: 65 74 68 6f 64 3b 20 2f 2a 2a 2a 20 4d 75 73 74 ethod; /*** Must
0660: 20 62 65 20 66 69 72 73 74 20 2a 2a 2a 2f 0a 20 be first ***/.
0670: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 sqlite3_vfs *pV
0680: 66 73 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 fs; /* The
0690: 56 46 53 20 75 73 65 64 20 74 6f 20 6f 70 65 6e VFS used to open
06a0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 this file */.
06b0: 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20 20 HANDLE h;
06c0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c /* Handl
06d0: 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 e for accessing
06e0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 the file */. u8
06f0: 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 locktype;
0700: 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 /* Type of
0710: 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 lock currently
0720: 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 69 6c held on this fil
0730: 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73 68 61 e */. short sha
0740: 72 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20 20 2f redLockByte; /
0750: 2a 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f 73 65 * Randomly chose
0760: 6e 20 62 79 74 65 20 75 73 65 64 20 61 73 20 61 n byte used as a
0770: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a shared lock */.
0780: 20 20 75 38 20 62 50 65 72 73 69 73 74 57 61 6c u8 bPersistWal
0790: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 ; /* Tru
07a0: 65 20 74 6f 20 70 65 72 73 69 73 74 20 57 41 4c e to persist WAL
07b0: 20 66 69 6c 65 73 20 2a 2f 0a 20 20 44 57 4f 52 files */. DWOR
07c0: 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 D lastErrno;
07d0: 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f /* The Windo
07e0: 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 ws errno from th
07f0: 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 e last I/O error
0800: 20 2a 2f 0a 20 20 44 57 4f 52 44 20 73 65 63 74 */. DWORD sect
0810: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a orSize; /*
0820: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 Sector size of
0830: 74 68 65 20 64 65 76 69 63 65 20 66 69 6c 65 20 the device file
0840: 69 73 20 6f 6e 20 2a 2f 0a 20 20 77 69 6e 53 68 is on */. winSh
0850: 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20 m *pShm;
0860: 20 20 20 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f /* Instance o
0870: 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 f shared memory
0880: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a on this file */.
0890: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 const char *zP
08a0: 61 74 68 3b 20 20 20 20 20 20 2f 2a 20 46 75 6c ath; /* Ful
08b0: 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 l pathname of th
08c0: 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 is file */. int
08d0: 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 szChunk;
08e0: 20 20 20 20 20 2f 2a 20 43 68 75 6e 6b 20 73 69 /* Chunk si
08f0: 7a 65 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 ze configured by
0900: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a FCNTL_CHUNK_SIZ
0910: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f E */.#if SQLITE_
0920: 4f 53 5f 57 49 4e 43 45 0a 20 20 4c 50 57 53 54 OS_WINCE. LPWST
0930: 52 20 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 R zDeleteOnClose
0940: 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 ; /* Name of fi
0950: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 77 68 65 le to delete whe
0960: 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 48 n closing */. H
0970: 41 4e 44 4c 45 20 68 4d 75 74 65 78 3b 20 20 20 ANDLE hMutex;
0980: 20 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 /* Mutex
0990: 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 used to control
09a0: 61 63 63 65 73 73 20 74 6f 20 73 68 61 72 65 64 access to shared
09b0: 20 6c 6f 63 6b 20 2a 2f 20 20 0a 20 20 48 41 4e lock */ . HAN
09c0: 44 4c 45 20 68 53 68 61 72 65 64 3b 20 20 20 20 DLE hShared;
09d0: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d /* Shared m
09e0: 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 75 73 emory segment us
09f0: 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a ed for locking *
0a00: 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f /. winceLock lo
0a10: 63 61 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c cal; /* L
0a20: 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 62 79 ocks obtained by
0a30: 20 74 68 69 73 20 69 6e 73 74 61 6e 63 65 20 6f this instance o
0a40: 66 20 77 69 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 f winFile */. w
0a50: 69 6e 63 65 4c 6f 63 6b 20 2a 73 68 61 72 65 64 inceLock *shared
0a60: 3b 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c ; /* Global
0a70: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6d 65 6d shared lock mem
0a80: 6f 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 ory for the file
0a90: 20 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a */.#endif.};..
0aa0: 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65 /*. * If compile
0ab0: 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 57 49 d with SQLITE_WI
0ac0: 4e 33 32 5f 4d 41 4c 4c 4f 43 20 6f 6e 20 57 69 N32_MALLOC on Wi
0ad0: 6e 64 6f 77 73 2c 20 77 65 20 77 69 6c 6c 20 75 ndows, we will u
0ae0: 73 65 20 74 68 65 0a 20 2a 20 76 61 72 69 6f 75 se the. * variou
0af0: 73 20 57 69 6e 33 32 20 41 50 49 20 68 65 61 70 s Win32 API heap
0b00: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 73 74 65 functions inste
0b10: 61 64 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 20 ad of our own..
0b20: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 */.#ifdef SQLITE
0b30: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a _WIN32_MALLOC./*
0b40: 0a 20 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 . * The initial
0b50: 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33 size of the Win3
0b60: 32 2d 73 70 65 63 69 66 69 63 20 68 65 61 70 2e 2-specific heap.
0b70: 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 This value may
0b80: 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 be zero.. */.#i
0b90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e fndef SQLITE_WIN
0ba0: 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 32_HEAP_INIT_SIZ
0bb0: 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 E.# define SQLI
0bc0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e TE_WIN32_HEAP_IN
0bd0: 49 54 5f 53 49 5a 45 20 28 28 53 51 4c 49 54 45 IT_SIZE ((SQLITE
0be0: 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 _DEFAULT_CACHE_S
0bf0: 49 5a 45 29 20 2a 20 5c 0a 20 20 20 20 20 20 20 IZE) * \.
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0c20: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f (SQLITE_DEFAULT_
0c30: 50 41 47 45 5f 53 49 5a 45 29 20 2b 20 34 31 39 PAGE_SIZE) + 419
0c40: 34 33 30 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 4304).#endif../*
0c50: 0a 20 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 . * The maximum
0c60: 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33 size of the Win3
0c70: 32 2d 73 70 65 63 69 66 69 63 20 68 65 61 70 2e 2-specific heap.
0c80: 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 This value may
0c90: 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 be zero.. */.#i
0ca0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e fndef SQLITE_WIN
0cb0: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 32_HEAP_MAX_SIZE
0cc0: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 .# define SQLIT
0cd0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 E_WIN32_HEAP_MAX
0ce0: 5f 53 49 5a 45 20 20 28 30 29 0a 23 65 6e 64 69 _SIZE (0).#endi
0cf0: 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 65 78 74 f../*. * The ext
0d00: 72 61 20 66 6c 61 67 73 20 74 6f 20 75 73 65 20 ra flags to use
0d10: 69 6e 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 in calls to the
0d20: 57 69 6e 33 32 20 68 65 61 70 20 41 50 49 73 2e Win32 heap APIs.
0d30: 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 This value may
0d40: 20 62 65 0a 20 2a 20 7a 65 72 6f 20 66 6f 72 20 be. * zero for
0d50: 74 68 65 20 64 65 66 61 75 6c 74 20 62 65 68 61 the default beha
0d60: 76 69 6f 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 vior.. */.#ifnde
0d70: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 f SQLITE_WIN32_H
0d80: 45 41 50 5f 46 4c 41 47 53 0a 23 20 20 64 65 66 EAP_FLAGS.# def
0d90: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 ine SQLITE_WIN32
0da0: 5f 48 45 41 50 5f 46 4c 41 47 53 20 20 20 20 20 _HEAP_FLAGS
0db0: 28 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a (0).#endif../*.*
0dc0: 2a 20 54 68 65 20 77 69 6e 4d 65 6d 44 61 74 61 * The winMemData
0dd0: 20 73 74 72 75 63 74 75 72 65 20 73 74 6f 72 65 structure store
0de0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65 s information re
0df0: 71 75 69 72 65 64 20 62 79 20 74 68 65 20 57 69 quired by the Wi
0e00: 6e 33 32 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 n32-specific.**
0e10: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 sqlite3_mem_meth
0e20: 6f 64 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 ods implementati
0e30: 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 on..*/.typedef s
0e40: 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 truct winMemData
0e50: 20 77 69 6e 4d 65 6d 44 61 74 61 3b 0a 73 74 72 winMemData;.str
0e60: 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 7b uct winMemData {
0e70: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a .#ifndef NDEBUG.
0e80: 20 20 75 33 32 20 6d 61 67 69 63 3b 20 20 20 20 u32 magic;
0e90: 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20 /* Magic number
0ea0: 74 6f 20 64 65 74 65 63 74 20 73 74 72 75 63 74 to detect struct
0eb0: 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 ure corruption.
0ec0: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 48 41 4e 44 */.#endif. HAND
0ed0: 4c 45 20 68 48 65 61 70 3b 20 2f 2a 20 54 68 65 LE hHeap; /* The
0ee0: 20 68 61 6e 64 6c 65 20 74 6f 20 6f 75 72 20 68 handle to our h
0ef0: 65 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 eap. */. BOOL b
0f00: 4f 77 6e 65 64 3b 20 20 2f 2a 20 44 6f 20 77 65 Owned; /* Do we
0f10: 20 6f 77 6e 20 74 68 65 20 68 65 61 70 20 28 69 own the heap (i
0f20: 2e 65 2e 20 64 65 73 74 72 6f 79 20 69 74 20 6f .e. destroy it o
0f30: 6e 20 73 68 75 74 64 6f 77 6e 29 3f 20 2a 2f 0a n shutdown)? */.
0f40: 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 };..#ifndef NDEB
0f50: 55 47 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45 UG.#define WINME
0f60: 4d 5f 4d 41 47 49 43 20 20 20 20 20 30 78 34 32 M_MAGIC 0x42
0f70: 62 32 38 33 30 62 0a 23 65 6e 64 69 66 0a 0a 73 b2830b.#endif..s
0f80: 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e tatic struct win
0f90: 4d 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65 6d 5f MemData win_mem_
0fa0: 64 61 74 61 20 3d 20 7b 0a 23 69 66 6e 64 65 66 data = {.#ifndef
0fb0: 20 4e 44 45 42 55 47 0a 20 20 57 49 4e 4d 45 4d NDEBUG. WINMEM
0fc0: 5f 4d 41 47 49 43 2c 0a 23 65 6e 64 69 66 0a 20 _MAGIC,.#endif.
0fd0: 20 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a 7d 3b 0a NULL, FALSE.};.
0fe0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a .#ifndef NDEBUG.
0ff0: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 #define winMemAs
1000: 73 65 72 74 4d 61 67 69 63 28 29 20 61 73 73 65 sertMagic() asse
1010: 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 rt( win_mem_data
1020: 2e 6d 61 67 69 63 3d 3d 57 49 4e 4d 45 4d 5f 4d .magic==WINMEM_M
1030: 41 47 49 43 20 29 0a 23 65 6c 73 65 0a 23 64 65 AGIC ).#else.#de
1040: 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 fine winMemAsser
1050: 74 4d 61 67 69 63 28 29 0a 23 65 6e 64 69 66 0a tMagic().#endif.
1060: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 .#define winMemG
1070: 65 74 48 65 61 70 28 29 20 77 69 6e 5f 6d 65 6d etHeap() win_mem
1080: 5f 64 61 74 61 2e 68 48 65 61 70 0a 0a 73 74 61 _data.hHeap..sta
1090: 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d tic void *winMem
10a0: 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 Malloc(int nByte
10b0: 73 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 s);.static void
10c0: 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 winMemFree(void
10d0: 2a 70 50 72 69 6f 72 29 3b 0a 73 74 61 74 69 63 *pPrior);.static
10e0: 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 void *winMemRea
10f0: 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f lloc(void *pPrio
1100: 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a r, int nBytes);.
1110: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 static int winMe
1120: 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 3b 0a mSize(void *p);.
1130: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 static int winMe
1140: 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 3b mRoundup(int n);
1150: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d .static int winM
1160: 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 emInit(void *pAp
1170: 70 44 61 74 61 29 3b 0a 73 74 61 74 69 63 20 76 pData);.static v
1180: 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f oid winMemShutdo
1190: 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 wn(void *pAppDat
11a0: 61 29 3b 0a 0a 63 6f 6e 73 74 20 73 71 6c 69 74 a);..const sqlit
11b0: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a e3_mem_methods *
11c0: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e sqlite3MemGetWin
11d0: 33 32 28 76 6f 69 64 29 3b 0a 23 65 6e 64 69 66 32(void);.#endif
11e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 /* SQLITE_WIN32
11f0: 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a _MALLOC */../*.*
1200: 2a 20 46 6f 72 77 61 72 64 20 70 72 6f 74 6f 74 * Forward protot
1210: 79 70 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 ypes..*/.static
1220: 69 6e 74 20 67 65 74 53 65 63 74 6f 72 53 69 7a int getSectorSiz
1230: 65 28 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 e(. sqlite3_v
1240: 66 73 20 2a 70 56 66 73 2c 0a 20 20 20 20 63 6f fs *pVfs,. co
1250: 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 nst char *zRelat
1260: 69 76 65 20 20 20 20 20 2f 2a 20 55 54 46 2d 38 ive /* UTF-8
1270: 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 29 3b file name */.);
1280: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c ../*.** The foll
1290: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69 owing variable i
12a0: 73 20 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65 74 s (normally) set
12b0: 20 6f 6e 63 65 20 61 6e 64 20 6e 65 76 65 72 20 once and never
12c0: 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72 65 changes.** there
12d0: 61 66 74 65 72 2e 20 20 49 74 20 72 65 63 6f 72 after. It recor
12e0: 64 73 20 77 68 65 74 68 65 72 20 74 68 65 20 6f ds whether the o
12f0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 perating system
1300: 69 73 20 57 69 6e 39 78 0a 2a 2a 20 6f 72 20 57 is Win9x.** or W
1310: 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20 inNT..**.** 0:
1320: 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 Operating syste
1330: 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a m unknown..** 1:
1340: 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 Operating sys
1350: 74 65 6d 20 69 73 20 57 69 6e 39 78 2e 0a 2a 2a tem is Win9x..**
1360: 20 32 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 2: Operating
1370: 73 79 73 74 65 6d 20 69 73 20 57 69 6e 4e 54 2e system is WinNT.
1380: 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 .**.** In order
1390: 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 65 to facilitate te
13a0: 73 74 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e 54 sting on a WinNT
13b0: 20 73 79 73 74 65 6d 2c 20 74 68 65 20 74 65 73 system, the tes
13c0: 74 20 66 69 78 74 75 72 65 0a 2a 2a 20 63 61 6e t fixture.** can
13d0: 20 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20 74 68 manually set th
13e0: 69 73 20 76 61 6c 75 65 20 74 6f 20 31 20 74 6f is value to 1 to
13f0: 20 65 6d 75 6c 61 74 65 20 57 69 6e 39 38 20 62 emulate Win98 b
1400: 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66 64 ehavior..*/.#ifd
1410: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 ef SQLITE_TEST.i
1420: 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 nt sqlite3_os_ty
1430: 70 65 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 pe = 0;.#else.st
1440: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 atic int sqlite3
1450: 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 _os_type = 0;.#e
1460: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 ndif../*.** Many
1470: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72 system calls ar
1480: 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f 75 e accessed throu
1490: 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 gh pointer-to-fu
14a0: 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a nctions so that.
14b0: 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f ** they may be o
14c0: 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e verridden at run
14d0: 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61 time to facilita
14e0: 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69 te fault injecti
14f0: 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 on during.** tes
1500: 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78 ting and sandbox
1510: 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 ing. The follow
1520: 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20 ing array holds
1530: 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f the names and po
1540: 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c inters.** to all
1550: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 overrideable sy
1560: 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 23 stem calls..*/.#
1570: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 if !SQLITE_OS_WI
1580: 4e 43 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 NCE.# define SQ
1590: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 LITE_WIN32_HAS_A
15a0: 4e 53 49 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 NSI.#endif..#if
15b0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 SQLITE_OS_WINCE
15c0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e || SQLITE_OS_WIN
15d0: 4e 54 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c NT.# define SQL
15e0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 ITE_WIN32_HAS_WI
15f0: 44 45 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 DE.#endif..#ifnd
1600: 65 66 20 53 59 53 43 41 4c 4c 0a 23 20 20 64 65 ef SYSCALL.# de
1610: 66 69 6e 65 20 53 59 53 43 41 4c 4c 20 73 71 6c fine SYSCALL sql
1620: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 ite3_syscall_ptr
1630: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c .#endif..#if SQL
1640: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 2f 2a 0a ITE_OS_WINCE./*.
1650: 2a 2a 20 54 68 65 73 65 20 6d 61 63 72 6f 73 20 ** These macros
1660: 61 72 65 20 6e 65 63 65 73 73 61 72 79 20 62 65 are necessary be
1670: 63 61 75 73 65 20 57 69 6e 64 6f 77 73 20 43 45 cause Windows CE
1680: 20 64 6f 65 73 20 6e 6f 74 20 6e 61 74 69 76 65 does not native
1690: 6c 79 20 73 75 70 70 6f 72 74 20 74 68 65 0a 2a ly support the.*
16a0: 2a 20 57 69 6e 33 32 20 41 50 49 73 20 4c 6f 63 * Win32 APIs Loc
16b0: 6b 46 69 6c 65 2c 20 55 6e 6c 6f 63 6b 46 69 6c kFile, UnlockFil
16c0: 65 2c 20 61 6e 64 20 4c 6f 63 6b 46 69 6c 65 45 e, and LockFileE
16d0: 78 2e 0a 20 2a 2f 0a 0a 23 20 20 64 65 66 69 6e x.. */..# defin
16e0: 65 20 4c 6f 63 6b 46 69 6c 65 28 61 2c 62 2c 63 e LockFile(a,b,c
16f0: 2c 64 2c 65 29 20 20 20 20 20 20 20 77 69 6e 63 ,d,e) winc
1700: 65 4c 6f 63 6b 46 69 6c 65 28 26 61 2c 20 62 2c eLockFile(&a, b,
1710: 20 63 2c 20 64 2c 20 65 29 0a 23 20 20 64 65 66 c, d, e).# def
1720: 69 6e 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 61 ine UnlockFile(a
1730: 2c 62 2c 63 2c 64 2c 65 29 20 20 20 20 20 77 69 ,b,c,d,e) wi
1740: 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 61 nceUnlockFile(&a
1750: 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23 20 , b, c, d, e).#
1760: 20 64 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 define LockFile
1770: 45 78 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 Ex(a,b,c,d,e,f)
1780: 20 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45 winceLockFileE
1790: 78 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 x(&a, b, c, d, e
17a0: 2c 20 66 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 , f)../*.** Thes
17b0: 65 20 61 72 65 20 74 68 65 20 73 70 65 63 69 61 e are the specia
17c0: 6c 20 73 79 73 63 61 6c 6c 20 68 61 63 6b 73 20 l syscall hacks
17d0: 66 6f 72 20 57 69 6e 64 6f 77 73 20 43 45 2e 20 for Windows CE.
17e0: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c The locking rel
17f0: 61 74 65 64 0a 2a 2a 20 64 65 66 69 6e 65 73 20 ated.** defines
1800: 68 65 72 65 20 72 65 66 65 72 20 74 6f 20 74 68 here refer to th
1810: 65 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 64 e macros defined
1820: 20 6a 75 73 74 20 61 62 6f 76 65 2e 0a 20 2a 2f just above.. */
1830: 0a 0a 23 20 20 64 65 66 69 6e 65 20 6f 73 41 72 ..# define osAr
1840: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 eFileApisANSI()
1850: 20 20 20 20 20 20 31 0a 23 20 20 64 65 66 69 6e 1.# defin
1860: 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 20 20 20 20 e osLockFile
1870: 20 20 20 20 20 20 20 20 20 20 20 20 4c 6f 63 6b Lock
1880: 46 69 6c 65 0a 23 20 20 64 65 66 69 6e 65 20 6f File.# define o
1890: 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 20 20 20 20 sUnlockFile
18a0: 20 20 20 20 20 20 20 20 20 55 6e 6c 6f 63 6b 46 UnlockF
18b0: 69 6c 65 0a 23 20 20 64 65 66 69 6e 65 20 6f 73 ile.# define os
18c0: 4c 6f 63 6b 46 69 6c 65 45 78 20 20 20 20 20 20 LockFileEx
18d0: 20 20 20 20 20 20 20 20 4c 6f 63 6b 46 69 6c 65 LockFile
18e0: 45 78 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 Ex.#endif..stati
18f0: 63 20 73 74 72 75 63 74 20 77 69 6e 5f 73 79 73 c struct win_sys
1900: 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 call {. const c
1910: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 har *zName;
1920: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f /* Name o
1930: 66 20 74 68 65 20 73 79 74 65 6d 20 63 61 6c 6c f the sytem call
1940: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 */. sqlite3_sy
1950: 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 scall_ptr pCurre
1960: 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 nt; /* Current v
1970: 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73 74 alue of the syst
1980: 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c em call */. sql
1990: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 ite3_syscall_ptr
19a0: 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 pDefault; /* De
19b0: 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d fault value */.}
19c0: 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a aSyscall[] = {.
19d0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 #if !SQLITE_OS_W
19e0: 49 4e 43 45 0a 20 20 7b 20 22 41 72 65 46 69 6c INCE. { "AreFil
19f0: 65 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20 eApisANSI",
1a00: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 41 72 65 (SYSCALL)Are
1a10: 46 69 6c 65 41 70 69 73 41 4e 53 49 2c 20 20 20 FileApisANSI,
1a20: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 0 },..#def
1a30: 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69 ine osAreFileApi
1a40: 73 41 4e 53 49 20 28 28 42 4f 4f 4c 28 57 49 4e sANSI ((BOOL(WIN
1a50: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 API*)(VOID))aSys
1a60: 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 call[0].pCurrent
1a70: 29 0a 23 65 6c 73 65 0a 20 20 7b 20 22 41 72 65 ).#else. { "Are
1a80: 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20 FileApisANSI",
1a90: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 (SYSCALL)
1aa0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0,
1ab0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 0 },.#e
1ac0: 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 ndif..#if SQLITE
1ad0: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 _OS_WINCE && def
1ae0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 ined(SQLITE_WIN3
1af0: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 2_HAS_WIDE). {
1b00: 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20 20 "CharLowerW",
1b10: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 (SYSC
1b20: 41 4c 4c 29 43 68 61 72 4c 6f 77 65 72 57 2c 20 ALL)CharLowerW,
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 0 }
1b40: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 68 61 ,.#else. { "Cha
1b50: 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20 20 rLowerW",
1b60: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 (SYSCALL)
1b70: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0,
1b80: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 0 },.#e
1b90: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 ndif..#define os
1ba0: 43 68 61 72 4c 6f 77 65 72 57 20 28 28 4c 50 57 CharLowerW ((LPW
1bb0: 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c 50 57 STR(WINAPI*)(LPW
1bc0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d STR))aSyscall[1]
1bd0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 .pCurrent)..#if
1be0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 SQLITE_OS_WINCE
1bf0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 && defined(SQLIT
1c00: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 E_WIN32_HAS_WIDE
1c10: 29 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65 72 ). { "CharUpper
1c20: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 W",
1c30: 20 28 53 59 53 43 41 4c 4c 29 43 68 61 72 55 70 (SYSCALL)CharUp
1c40: 70 65 72 57 2c 20 20 20 20 20 20 20 20 20 20 20 perW,
1c50: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 0 },.#else.
1c60: 7b 20 22 43 68 61 72 55 70 70 65 72 57 22 2c 20 { "CharUpperW",
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 (SY
1c80: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 SCALL)0,
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0
1ca0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 },.#endif..#def
1cb0: 69 6e 65 20 6f 73 43 68 61 72 55 70 70 65 72 57 ine osCharUpperW
1cc0: 20 28 28 4c 50 57 53 54 52 28 57 49 4e 41 50 49 ((LPWSTR(WINAPI
1cd0: 2a 29 28 4c 50 57 53 54 52 29 29 61 53 79 73 63 *)(LPWSTR))aSysc
1ce0: 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 all[2].pCurrent)
1cf0: 0a 0a 20 20 7b 20 22 43 6c 6f 73 65 48 61 6e 64 .. { "CloseHand
1d00: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 le",
1d10: 20 28 53 59 53 43 41 4c 4c 29 43 6c 6f 73 65 48 (SYSCALL)CloseH
1d20: 61 6e 64 6c 65 2c 20 20 20 20 20 20 20 20 20 20 andle,
1d30: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 0 },..#define
1d40: 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 20 28 osCloseHandle (
1d50: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 (BOOL(WINAPI*)(H
1d60: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b ANDLE))aSyscall[
1d70: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 3].pCurrent)..#i
1d80: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 f defined(SQLITE
1d90: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 _WIN32_HAS_ANSI)
1da0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 . { "CreateFile
1db0: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 A",
1dc0: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 (SYSCALL)CreateF
1dd0: 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20 20 ileA,
1de0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 0 },.#else. {
1df0: 20 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c 20 "CreateFileA",
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 (SYS
1e10: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 CALL)0,
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 0
1e30: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 },.#endif..#defi
1e40: 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 41 ne osCreateFileA
1e50: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 ((HANDLE(WINAPI
1e60: 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c *)(LPCSTR,DWORD,
1e70: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 DWORD, \.
1e80: 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 LPSECURITY_ATTR
1e90: 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f IBUTES,DWORD,DWO
1ea0: 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73 63 RD,HANDLE))aSysc
1eb0: 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 all[4].pCurrent)
1ec0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 ..#if defined(SQ
1ed0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 LITE_WIN32_HAS_W
1ee0: 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65 IDE). { "Create
1ef0: 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 FileW",
1f00: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 (SYSCALL)Cre
1f10: 61 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20 ateFileW,
1f20: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0 },.#else
1f30: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 . { "CreateFile
1f40: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 W",
1f50: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 (SYSCALL)0,
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f70: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 0 },.#endif..#
1f80: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 define osCreateF
1f90: 69 6c 65 57 20 28 28 48 41 4e 44 4c 45 28 57 49 ileW ((HANDLE(WI
1fa0: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 NAPI*)(LPCWSTR,D
1fb0: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 WORD,DWORD, \.
1fc0: 20 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 LPSECURITY
1fd0: 5f 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52 _ATTRIBUTES,DWOR
1fe0: 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 D,DWORD,HANDLE))
1ff0: 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 aSyscall[5].pCur
2000: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 43 72 65 61 rent).. { "Crea
2010: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 22 2c 20 teFileMapping",
2020: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 (SYSCALL)C
2030: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 reateFileMapping
2040: 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 , 0 },..#d
2050: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 efine osCreateFi
2060: 6c 65 4d 61 70 70 69 6e 67 20 28 28 48 41 4e 44 leMapping ((HAND
2070: 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 LE(WINAPI*)(HAND
2080: 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f 41 54 LE,LPSECURITY_AT
2090: 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 TRIBUTES, \.
20a0: 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 2c DWORD,DWORD,
20b0: 44 57 4f 52 44 2c 4c 50 43 54 53 54 52 29 29 61 DWORD,LPCTSTR))a
20c0: 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 Syscall[6].pCurr
20d0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 ent)..#if define
20e0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 d(SQLITE_WIN32_H
20f0: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 72 AS_WIDE). { "Cr
2100: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 eateFileMappingW
2110: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c ", (SYSCALL
2120: 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 )CreateFileMappi
2130: 6e 67 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 ngW, 0 },.#
2140: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 else. { "Create
2150: 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20 FileMappingW",
2160: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 (SYSCALL)0,
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2180: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 0 },.#endi
2190: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 f..#define osCre
21a0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 20 ateFileMappingW
21b0: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a ((HANDLE(WINAPI*
21c0: 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 )(HANDLE,LPSECUR
21d0: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 ITY_ATTRIBUTES,
21e0: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c \. DWORD,
21f0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 57 DWORD,DWORD,LPCW
2200: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d STR))aSyscall[7]
2210: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 .pCurrent)..#if
2220: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 defined(SQLITE_W
2230: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 IN32_HAS_WIDE).
2240: 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78 57 { "CreateMutexW
2250: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 ", (S
2260: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 4d 75 74 YSCALL)CreateMut
2270: 65 78 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 exW,
2280: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 0 },.#else. { "
2290: 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20 20 CreateMutexW",
22a0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 (SYSCA
22b0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 LL)0,
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0 },
22d0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 .#endif..#define
22e0: 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57 20 osCreateMutexW
22f0: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a ((HANDLE(WINAPI*
2300: 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 )(LPSECURITY_ATT
2310: 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c 20 5c 0a RIBUTES,BOOL, \.
2320: 20 20 20 20 20 20 20 20 4c 50 43 57 53 54 52 29 LPCWSTR)
2330: 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 )aSyscall[8].pCu
2340: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 rrent)..#if defi
2350: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 ned(SQLITE_WIN32
2360: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 _HAS_ANSI). { "
2370: 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20 20 DeleteFileA",
2380: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 (SYSCA
2390: 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 41 2c 20 LL)DeleteFileA,
23a0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0 },
23b0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c 65 .#else. { "Dele
23c0: 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 teFileA",
23d0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 (SYSCALL)0
23e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
23f0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 0 },.#en
2400: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44 dif..#define osD
2410: 65 6c 65 74 65 46 69 6c 65 41 20 28 28 42 4f 4f eleteFileA ((BOO
2420: 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 L(WINAPI*)(LPCST
2430: 52 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 R))aSyscall[9].p
2440: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 Current)..#if de
2450: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e fined(SQLITE_WIN
2460: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 32_HAS_WIDE). {
2470: 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c 20 "DeleteFileW",
2480: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 (SYS
2490: 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 57 CALL)DeleteFileW
24a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 , 0
24b0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65 },.#else. { "De
24c0: 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 leteFileW",
24d0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c (SYSCALL
24e0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 )0,
24f0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 0 },.#
2500: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f endif..#define o
2510: 73 44 65 6c 65 74 65 46 69 6c 65 57 20 28 28 42 sDeleteFileW ((B
2520: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 OOL(WINAPI*)(LPC
2530: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 31 WSTR))aSyscall[1
2540: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 0].pCurrent)..#i
2550: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 f SQLITE_OS_WINC
2560: 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 E. { "FileTimeT
2570: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c oLocalFileTime",
2580: 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69 (SYSCALL)FileTi
2590: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d meToLocalFileTim
25a0: 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 e, 0 },.#else.
25b0: 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 { "FileTimeToLoc
25c0: 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 alFileTime", (SY
25d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 SCALL)0,
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0
25f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 },.#endif..#def
2600: 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f ine osFileTimeTo
2610: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 20 28 28 LocalFileTime ((
2620: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f BOOL(WINAPI*)(CO
2630: 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c NST FILETIME*, \
2640: 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54 . LPFILET
2650: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 IME))aSyscall[11
2660: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 ].pCurrent)..#if
2670: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 SQLITE_OS_WINCE
2680: 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f . { "FileTimeTo
2690: 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20 SystemTime",
26a0: 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69 6d (SYSCALL)FileTim
26b0: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 2c 20 20 eToSystemTime,
26c0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 0 },.#else. {
26d0: 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 "FileTimeToSyst
26e0: 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53 emTime", (SYS
26f0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 CALL)0,
2700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 0
2710: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 },.#endif..#defi
2720: 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53 ne osFileTimeToS
2730: 79 73 74 65 6d 54 69 6d 65 20 28 28 42 4f 4f 4c ystemTime ((BOOL
2740: 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 (WINAPI*)(CONST
2750: 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 FILETIME*, \.
2760: 20 20 20 20 20 4c 50 53 59 53 54 45 4d 54 49 4d LPSYSTEMTIM
2770: 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e E))aSyscall[12].
2780: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 pCurrent).. { "
2790: 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 FlushFileBuffers
27a0: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 ", (SYSCA
27b0: 4c 4c 29 46 6c 75 73 68 46 69 6c 65 42 75 66 66 LL)FlushFileBuff
27c0: 65 72 73 2c 20 20 20 20 20 20 20 20 30 20 7d 2c ers, 0 },
27d0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c 75 73 ..#define osFlus
27e0: 68 46 69 6c 65 42 75 66 66 65 72 73 20 28 28 42 hFileBuffers ((B
27f0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e OOL(WINAPI*)(HAN
2800: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 33 DLE))aSyscall[13
2810: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 ].pCurrent)..#if
2820: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f defined(SQLITE_
2830: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a WIN32_HAS_ANSI).
2840: 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 { "FormatMessa
2850: 67 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 28 geA", (
2860: 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 SYSCALL)FormatMe
2870: 73 73 61 67 65 41 2c 20 20 20 20 20 20 20 20 20 ssageA,
2880: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 0 },.#else. {
2890: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 22 "FormatMessageA"
28a0: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 , (SYSC
28b0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 ALL)0,
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 0 }
28d0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e ,.#endif..#defin
28e0: 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 e osFormatMessag
28f0: 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 eA ((DWORD(WINAP
2900: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49 I*)(DWORD,LPCVOI
2910: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 D,DWORD,DWORD,LP
2920: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 STR, \. D
2930: 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61 WORD,va_list*))a
2940: 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72 Syscall[14].pCur
2950: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e rent)..#if defin
2960: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f ed(SQLITE_WIN32_
2970: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 46 HAS_WIDE). { "F
2980: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20 ormatMessageW",
2990: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c (SYSCAL
29a0: 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 L)FormatMessageW
29b0: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a , 0 },.
29c0: 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61 #else. { "Forma
29d0: 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20 20 tMessageW",
29e0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c (SYSCALL)0,
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 30 20 7d 2c 0a 23 65 6e 64 0 },.#end
2a10: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f if..#define osFo
2a20: 72 6d 61 74 4d 65 73 73 61 67 65 57 20 28 28 44 rmatMessageW ((D
2a30: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57 WORD(WINAPI*)(DW
2a40: 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 ORD,LPCVOID,DWOR
2a50: 44 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20 D,DWORD,LPWSTR,
2a60: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c \. DWORD,
2a70: 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63 61 va_list*))aSysca
2a80: 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e 74 29 ll[15].pCurrent)
2a90: 0a 0a 20 20 7b 20 22 46 72 65 65 4c 69 62 72 61 .. { "FreeLibra
2aa0: 72 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 ry",
2ab0: 20 28 53 59 53 43 41 4c 4c 29 46 72 65 65 4c 69 (SYSCALL)FreeLi
2ac0: 62 72 61 72 79 2c 20 20 20 20 20 20 20 20 20 20 brary,
2ad0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 0 },..#define
2ae0: 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79 20 28 osFreeLibrary (
2af0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 (BOOL(WINAPI*)(H
2b00: 4d 4f 44 55 4c 45 29 29 61 53 79 73 63 61 6c 6c MODULE))aSyscall
2b10: 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a [16].pCurrent)..
2b20: 20 20 7b 20 22 47 65 74 43 75 72 72 65 6e 74 50 { "GetCurrentP
2b30: 72 6f 63 65 73 73 49 64 22 2c 20 20 20 20 20 28 rocessId", (
2b40: 53 59 53 43 41 4c 4c 29 47 65 74 43 75 72 72 65 SYSCALL)GetCurre
2b50: 6e 74 50 72 6f 63 65 73 73 49 64 2c 20 20 20 20 ntProcessId,
2b60: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 0 },..#define o
2b70: 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 sGetCurrentProce
2b80: 73 73 49 64 20 28 28 44 57 4f 52 44 28 57 49 4e ssId ((DWORD(WIN
2b90: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 API*)(VOID))aSys
2ba0: 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e call[17].pCurren
2bb0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f t)..#if !SQLITE_
2bc0: 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 OS_WINCE && defi
2bd0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 ned(SQLITE_WIN32
2be0: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 _HAS_ANSI). { "
2bf0: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 GetDiskFreeSpace
2c00: 41 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 A", (SYSCA
2c10: 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53 70 LL)GetDiskFreeSp
2c20: 61 63 65 41 2c 20 20 20 20 20 20 20 30 20 7d 2c aceA, 0 },
2c30: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 .#else. { "GetD
2c40: 69 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20 iskFreeSpaceA",
2c50: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 (SYSCALL)0
2c60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
2c70: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 0 },.#en
2c80: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 dif..#define osG
2c90: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 etDiskFreeSpaceA
2ca0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 ((BOOL(WINAPI*)
2cb0: 28 4c 50 43 53 54 52 2c 4c 50 44 57 4f 52 44 2c (LPCSTR,LPDWORD,
2cc0: 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c LPDWORD,LPDWORD,
2cd0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f \. LPDWO
2ce0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d RD))aSyscall[18]
2cf0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 .pCurrent)..#if
2d00: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 !SQLITE_OS_WINCE
2d10: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 && defined(SQLI
2d20: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 TE_WIN32_HAS_WID
2d30: 45 29 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46 E). { "GetDiskF
2d40: 72 65 65 53 70 61 63 65 57 22 2c 20 20 20 20 20 reeSpaceW",
2d50: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 44 69 (SYSCALL)GetDi
2d60: 73 6b 46 72 65 65 53 70 61 63 65 57 2c 20 20 20 skFreeSpaceW,
2d70: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 0 },.#else.
2d80: 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53 { "GetDiskFreeS
2d90: 70 61 63 65 57 22 2c 20 20 20 20 20 20 20 28 53 paceW", (S
2da0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 YSCALL)0,
2db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2dc0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 0 },.#endif..#de
2dd0: 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b 46 72 fine osGetDiskFr
2de0: 65 65 53 70 61 63 65 57 20 28 28 42 4f 4f 4c 28 eeSpaceW ((BOOL(
2df0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 WINAPI*)(LPCWSTR
2e00: 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 ,LPDWORD,LPDWORD
2e10: 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 ,LPDWORD, \.
2e20: 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61 53 79 LPDWORD))aSy
2e30: 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65 scall[19].pCurre
2e40: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 nt)..#if defined
2e50: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 (SQLITE_WIN32_HA
2e60: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 S_ANSI). { "Get
2e70: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 22 FileAttributesA"
2e80: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 , (SYSCALL)
2e90: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 GetFileAttribute
2ea0: 73 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 sA, 0 },.#e
2eb0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 lse. { "GetFile
2ec0: 41 74 74 72 69 62 75 74 65 73 41 22 2c 20 20 20 AttributesA",
2ed0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 (SYSCALL)0,
2ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2ef0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0 },.#endif
2f00: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 ..#define osGetF
2f10: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 20 28 ileAttributesA (
2f20: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 (DWORD(WINAPI*)(
2f30: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c LPCSTR))aSyscall
2f40: 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a [20].pCurrent)..
2f50: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 #if defined(SQLI
2f60: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 TE_WIN32_HAS_WID
2f70: 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 E). { "GetFileA
2f80: 74 74 72 69 62 75 74 65 73 57 22 2c 20 20 20 20 ttributesW",
2f90: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 (SYSCALL)GetFi
2fa0: 6c 65 41 74 74 72 69 62 75 74 65 73 57 2c 20 20 leAttributesW,
2fb0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 0 },.#else.
2fc0: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 { "GetFileAttri
2fd0: 62 75 74 65 73 57 22 2c 20 20 20 20 20 20 28 53 butesW", (S
2fe0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 YSCALL)0,
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3000: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 0 },.#endif..#de
3010: 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74 fine osGetFileAt
3020: 74 72 69 62 75 74 65 73 57 20 28 28 44 57 4f 52 tributesW ((DWOR
3030: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 D(WINAPI*)(LPCWS
3040: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d TR))aSyscall[21]
3050: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 .pCurrent)..#if
3060: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 defined(SQLITE_W
3070: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 IN32_HAS_WIDE).
3080: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 { "GetFileAttri
3090: 62 75 74 65 73 45 78 57 22 2c 20 20 20 20 28 53 butesExW", (S
30a0: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 YSCALL)GetFileAt
30b0: 74 72 69 62 75 74 65 73 45 78 57 2c 20 20 20 20 tributesExW,
30c0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 0 },.#else. { "
30d0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 GetFileAttribute
30e0: 73 45 78 57 22 2c 20 20 20 20 28 53 59 53 43 41 sExW", (SYSCA
30f0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 LL)0,
3100: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0 },
3110: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 .#endif..#define
3120: 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 osGetFileAttrib
3130: 75 74 65 73 45 78 57 20 28 28 42 4f 4f 4c 28 57 utesExW ((BOOL(W
3140: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c INAPI*)(LPCWSTR,
3150: 47 45 54 5f 46 49 4c 45 45 58 5f 49 4e 46 4f 5f GET_FILEEX_INFO_
3160: 4c 45 56 45 4c 53 2c 20 5c 0a 20 20 20 20 20 20 LEVELS, \.
3170: 20 20 4c 50 56 4f 49 44 29 29 61 53 79 73 63 61 LPVOID))aSysca
3180: 6c 6c 5b 32 32 5d 2e 70 43 75 72 72 65 6e 74 29 ll[22].pCurrent)
3190: 0a 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69 .. { "GetFileSi
31a0: 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 ze",
31b0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c (SYSCALL)GetFil
31c0: 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 eSize,
31d0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 0 },..#define
31e0: 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 20 28 osGetFileSize (
31f0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 (DWORD(WINAPI*)(
3200: 48 41 4e 44 4c 45 2c 4c 50 44 57 4f 52 44 29 29 HANDLE,LPDWORD))
3210: 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 aSyscall[23].pCu
3220: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c rrent)..#if !SQL
3230: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 ITE_OS_WINCE &&
3240: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 defined(SQLITE_W
3250: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 IN32_HAS_ANSI).
3260: 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e { "GetFullPathN
3270: 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53 ameA", (S
3280: 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 YSCALL)GetFullPa
3290: 74 68 4e 61 6d 65 41 2c 20 20 20 20 20 20 20 20 thNameA,
32a0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 0 },.#else. { "
32b0: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 GetFullPathNameA
32c0: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 ", (SYSCA
32d0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 LL)0,
32e0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0 },
32f0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 .#endif..#define
3300: 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 osGetFullPathNa
3310: 6d 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 meA ((DWORD(WINA
3320: 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 PI*)(LPCSTR,DWOR
3330: 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 D,LPSTR, \.
3340: 20 20 20 4c 50 53 54 52 2a 29 29 61 53 79 73 63 LPSTR*))aSysc
3350: 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74 all[24].pCurrent
3360: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f )..#if !SQLITE_O
3370: 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e S_WINCE && defin
3380: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f ed(SQLITE_WIN32_
3390: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 HAS_WIDE). { "G
33a0: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22 etFullPathNameW"
33b0: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c , (SYSCAL
33c0: 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d L)GetFullPathNam
33d0: 65 57 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a eW, 0 },.
33e0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 75 #else. { "GetFu
33f0: 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20 20 20 llPathNameW",
3400: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c (SYSCALL)0,
3410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3420: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 0 },.#end
3430: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 if..#define osGe
3440: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 20 28 tFullPathNameW (
3450: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 (DWORD(WINAPI*)(
3460: 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 4c 50 LPCWSTR,DWORD,LP
3470: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 WSTR, \.
3480: 4c 50 57 53 54 52 2a 29 29 61 53 79 73 63 61 6c LPWSTR*))aSyscal
3490: 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a l[25].pCurrent).
34a0: 0a 20 20 7b 20 22 47 65 74 4c 61 73 74 45 72 72 . { "GetLastErr
34b0: 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 or",
34c0: 28 53 59 53 43 41 4c 4c 29 47 65 74 4c 61 73 74 (SYSCALL)GetLast
34d0: 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 Error,
34e0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 0 },..#define
34f0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 20 28 osGetLastError (
3500: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 (DWORD(WINAPI*)(
3510: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 VOID))aSyscall[2
3520: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 6].pCurrent)..#i
3530: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 f SQLITE_OS_WINC
3540: 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 74 50 72 E. /* The GetPr
3550: 6f 63 41 64 64 72 65 73 73 41 28 29 20 72 6f 75 ocAddressA() rou
3560: 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 tine is only ava
3570: 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 ilable on Window
3580: 73 20 43 45 2e 20 2a 2f 0a 20 20 7b 20 22 47 65 s CE. */. { "Ge
3590: 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20 tProcAddressA",
35a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c (SYSCALL
35b0: 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 )GetProcAddressA
35c0: 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 , 0 },.#
35d0: 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 else. /* All ot
35e0: 68 65 72 20 57 69 6e 64 6f 77 73 20 70 6c 61 74 her Windows plat
35f0: 66 6f 72 6d 73 20 65 78 70 65 63 74 20 47 65 74 forms expect Get
3600: 50 72 6f 63 41 64 64 72 65 73 73 28 29 20 74 6f ProcAddress() to
3610: 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 4e take. ** an AN
3620: 53 49 20 73 74 72 69 6e 67 20 72 65 67 61 72 64 SI string regard
3630: 6c 65 73 73 20 6f 66 20 74 68 65 20 5f 55 4e 49 less of the _UNI
3640: 43 4f 44 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a CODE setting */.
3650: 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 { "GetProcAddr
3660: 65 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 essA", (
3670: 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41 SYSCALL)GetProcA
3680: 64 64 72 65 73 73 2c 20 20 20 20 20 20 20 20 20 ddress,
3690: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 0 },.#endif..#d
36a0: 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 41 efine osGetProcA
36b0: 64 64 72 65 73 73 41 20 28 28 46 41 52 50 52 4f ddressA ((FARPRO
36c0: 43 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55 C(WINAPI*)(HMODU
36d0: 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 LE, \. LP
36e0: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 CSTR))aSyscall[2
36f0: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7].pCurrent)..
3700: 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66 6f { "GetSystemInfo
3710: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 ", (SY
3720: 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 49 SCALL)GetSystemI
3730: 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 30 nfo, 0
3740: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 },..#define osG
3750: 65 74 53 79 73 74 65 6d 49 6e 66 6f 20 28 28 56 etSystemInfo ((V
3760: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 OID(WINAPI*)(LPS
3770: 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73 YSTEM_INFO))aSys
3780: 63 61 6c 6c 5b 32 38 5d 2e 70 43 75 72 72 65 6e call[28].pCurren
3790: 74 29 0a 0a 20 20 7b 20 22 47 65 74 53 79 73 74 t).. { "GetSyst
37a0: 65 6d 54 69 6d 65 22 2c 20 20 20 20 20 20 20 20 emTime",
37b0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 (SYSCALL)GetS
37c0: 79 73 74 65 6d 54 69 6d 65 2c 20 20 20 20 20 20 ystemTime,
37d0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 0 },..#defi
37e0: 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 ne osGetSystemTi
37f0: 6d 65 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 me ((VOID(WINAPI
3800: 2a 29 28 4c 50 53 59 53 54 45 4d 54 49 4d 45 29 *)(LPSYSTEMTIME)
3810: 29 61 53 79 73 63 61 6c 6c 5b 32 39 5d 2e 70 43 )aSyscall[29].pC
3820: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 urrent)..#if !SQ
3830: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 LITE_OS_WINCE.
3840: 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65 { "GetSystemTime
3850: 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 AsFileTime", (SY
3860: 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 54 SCALL)GetSystemT
3870: 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 2c 20 30 imeAsFileTime, 0
3880: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 },.#else. { "G
3890: 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 etSystemTimeAsFi
38a0: 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c leTime", (SYSCAL
38b0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 L)0,
38c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0 },.
38d0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 #endif..#define
38e0: 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 osGetSystemTimeA
38f0: 73 46 69 6c 65 54 69 6d 65 20 28 28 56 4f 49 44 sFileTime ((VOID
3900: 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 (WINAPI*)( \.
3910: 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 LPFILETIME)
3920: 29 61 53 79 73 63 61 6c 6c 5b 33 30 5d 2e 70 43 )aSyscall[30].pC
3930: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 urrent)..#if def
3940: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 ined(SQLITE_WIN3
3950: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 2_HAS_ANSI). {
3960: 22 47 65 74 54 65 6d 70 50 61 74 68 41 22 2c 20 "GetTempPathA",
3970: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 (SYSC
3980: 41 4c 4c 29 47 65 74 54 65 6d 70 50 61 74 68 41 ALL)GetTempPathA
3990: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d , 0 }
39a0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 ,.#else. { "Get
39b0: 54 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20 20 TempPathA",
39c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 (SYSCALL)
39d0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0,
39e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 0 },.#e
39f0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 ndif..#define os
3a00: 47 65 74 54 65 6d 70 50 61 74 68 41 20 28 28 44 GetTempPathA ((D
3a10: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57 WORD(WINAPI*)(DW
3a20: 4f 52 44 2c 4c 50 53 54 52 29 29 61 53 79 73 63 ORD,LPSTR))aSysc
3a30: 61 6c 6c 5b 33 31 5d 2e 70 43 75 72 72 65 6e 74 all[31].pCurrent
3a40: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 )..#if defined(S
3a50: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f QLITE_WIN32_HAS_
3a60: 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 54 65 WIDE). { "GetTe
3a70: 6d 70 50 61 74 68 57 22 2c 20 20 20 20 20 20 20 mpPathW",
3a80: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 (SYSCALL)Ge
3a90: 74 54 65 6d 70 50 61 74 68 57 2c 20 20 20 20 20 tTempPathW,
3aa0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 0 },.#els
3ab0: 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 e. { "GetTempPa
3ac0: 74 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 thW",
3ad0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 (SYSCALL)0,
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3af0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 0 },.#endif..
3b00: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d #define osGetTem
3b10: 70 50 61 74 68 57 20 28 28 44 57 4f 52 44 28 57 pPathW ((DWORD(W
3b20: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 INAPI*)(DWORD,LP
3b30: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33 WSTR))aSyscall[3
3b40: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 2].pCurrent)..
3b50: 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 { "GetTickCount"
3b60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 , (SY
3b70: 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 SCALL)GetTickCou
3b80: 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 nt, 0
3b90: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 },..#define osG
3ba0: 65 74 54 69 63 6b 43 6f 75 6e 74 20 28 28 44 57 etTickCount ((DW
3bb0: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 ORD(WINAPI*)(VOI
3bc0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 33 5d 2e D))aSyscall[33].
3bd0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 pCurrent)..#if d
3be0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 efined(SQLITE_WI
3bf0: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 N32_HAS_ANSI).
3c00: 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41 { "GetVersionExA
3c10: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 ", (SY
3c20: 53 43 41 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e SCALL)GetVersion
3c30: 45 78 41 2c 20 20 20 20 20 20 20 20 20 20 20 30 ExA, 0
3c40: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 },.#else. { "G
3c50: 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20 20 etVersionExA",
3c60: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c (SYSCAL
3c70: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 L)0,
3c80: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0 },.
3c90: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 #endif..#define
3ca0: 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41 20 osGetVersionExA
3cb0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 ((BOOL(WINAPI*)(
3cc0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 53 56 \. LPOSV
3cd0: 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29 61 53 79 ERSIONINFOA))aSy
3ce0: 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75 72 72 65 scall[34].pCurre
3cf0: 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 41 6c nt).. { "HeapAl
3d00: 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 loc",
3d10: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 (SYSCALL)Hea
3d20: 70 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20 20 pAlloc,
3d30: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 0 },..#def
3d40: 69 6e 65 20 6f 73 48 65 61 70 41 6c 6c 6f 63 20 ine osHeapAlloc
3d50: 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a ((LPVOID(WINAPI*
3d60: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 )(HANDLE,DWORD,
3d70: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 \. SIZE_T
3d80: 29 29 61 53 79 73 63 61 6c 6c 5b 33 35 5d 2e 70 ))aSyscall[35].p
3d90: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 Current).. { "H
3da0: 65 61 70 43 72 65 61 74 65 22 2c 20 20 20 20 20 eapCreate",
3db0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c (SYSCAL
3dc0: 4c 29 48 65 61 70 43 72 65 61 74 65 2c 20 20 20 L)HeapCreate,
3dd0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0 },.
3de0: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 43 .#define osHeapC
3df0: 72 65 61 74 65 20 28 28 48 41 4e 44 4c 45 28 57 reate ((HANDLE(W
3e00: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 53 49 INAPI*)(DWORD,SI
3e10: 5a 45 5f 54 2c 20 5c 0a 20 20 20 20 20 20 20 20 ZE_T, \.
3e20: 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c SIZE_T))aSyscall
3e30: 5b 33 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a [36].pCurrent)..
3e40: 20 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f 79 { "HeapDestroy
3e50: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 ", (
3e60: 53 59 53 43 41 4c 4c 29 48 65 61 70 44 65 73 74 SYSCALL)HeapDest
3e70: 72 6f 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 roy,
3e80: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 0 },..#define o
3e90: 73 48 65 61 70 44 65 73 74 72 6f 79 20 28 28 42 sHeapDestroy ((B
3ea0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e OOL(WINAPI*)(HAN
3eb0: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 37 DLE))aSyscall[37
3ec0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b ].pCurrent).. {
3ed0: 20 22 48 65 61 70 46 72 65 65 22 2c 20 20 20 20 "HeapFree",
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 (SYS
3ef0: 43 41 4c 4c 29 48 65 61 70 46 72 65 65 2c 20 20 CALL)HeapFree,
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 0
3f10: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 },..#define osHe
3f20: 61 70 46 72 65 65 20 28 28 42 4f 4f 4c 28 57 49 apFree ((BOOL(WI
3f30: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 NAPI*)(HANDLE,DW
3f40: 4f 52 44 2c 4c 50 56 4f 49 44 29 29 61 53 79 73 ORD,LPVOID))aSys
3f50: 63 61 6c 6c 5b 33 38 5d 2e 70 43 75 72 72 65 6e call[38].pCurren
3f60: 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 52 65 41 t).. { "HeapReA
3f70: 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20 lloc",
3f80: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 (SYSCALL)Heap
3f90: 52 65 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20 ReAlloc,
3fa0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 0 },..#defi
3fb0: 6e 65 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63 ne osHeapReAlloc
3fc0: 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 ((LPVOID(WINAPI
3fd0: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c *)(HANDLE,DWORD,
3fe0: 4c 50 56 4f 49 44 2c 20 5c 0a 20 20 20 20 20 20 LPVOID, \.
3ff0: 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 SIZE_T))aSysca
4000: 6c 6c 5b 33 39 5d 2e 70 43 75 72 72 65 6e 74 29 ll[39].pCurrent)
4010: 0a 0a 20 20 7b 20 22 48 65 61 70 53 69 7a 65 22 .. { "HeapSize"
4020: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
4030: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 53 69 (SYSCALL)HeapSi
4040: 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 ze,
4050: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 0 },..#define
4060: 20 6f 73 48 65 61 70 53 69 7a 65 20 28 28 53 49 osHeapSize ((SI
4070: 5a 45 5f 54 28 57 49 4e 41 50 49 2a 29 28 48 41 ZE_T(WINAPI*)(HA
4080: 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 NDLE,DWORD, \.
4090: 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29 29 61 LPCVOID))a
40a0: 53 79 73 63 61 6c 6c 5b 34 30 5d 2e 70 43 75 72 Syscall[40].pCur
40b0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 rent).. { "Heap
40c0: 56 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20 Validate",
40d0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 (SYSCALL)H
40e0: 65 61 70 56 61 6c 69 64 61 74 65 2c 20 20 20 20 eapValidate,
40f0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 0 },..#d
4100: 65 66 69 6e 65 20 6f 73 48 65 61 70 56 61 6c 69 efine osHeapVali
4110: 64 61 74 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 date ((BOOL(WINA
4120: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 PI*)(HANDLE,DWOR
4130: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 D, \. LPC
4140: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 VOID))aSyscall[4
4150: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 1].pCurrent)..#i
4160: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 f defined(SQLITE
4170: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 _WIN32_HAS_ANSI)
4180: 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 . { "LoadLibrar
4190: 79 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 yA",
41a0: 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 (SYSCALL)LoadLib
41b0: 72 61 72 79 41 2c 20 20 20 20 20 20 20 20 20 20 raryA,
41c0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 0 },.#else. {
41d0: 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c "LoadLibraryA",
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 (SYS
41f0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 CALL)0,
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 0
4210: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 },.#endif..#defi
4220: 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 ne osLoadLibrary
4230: 41 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 A ((HMODULE(WINA
4240: 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 PI*)(LPCSTR))aSy
4250: 73 63 61 6c 6c 5b 34 32 5d 2e 70 43 75 72 72 65 scall[42].pCurre
4260: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 nt)..#if defined
4270: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 (SQLITE_WIN32_HA
4280: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 4c 6f 61 S_WIDE). { "Loa
4290: 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20 dLibraryW",
42a0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 (SYSCALL)
42b0: 4c 6f 61 64 4c 69 62 72 61 72 79 57 2c 20 20 20 LoadLibraryW,
42c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 0 },.#e
42d0: 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 lse. { "LoadLib
42e0: 72 61 72 79 57 22 2c 20 20 20 20 20 20 20 20 20 raryW",
42f0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 (SYSCALL)0,
4300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4310: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0 },.#endif
4320: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 ..#define osLoad
4330: 4c 69 62 72 61 72 79 57 20 28 28 48 4d 4f 44 55 LibraryW ((HMODU
4340: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 LE(WINAPI*)(LPCW
4350: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 33 STR))aSyscall[43
4360: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b ].pCurrent).. {
4370: 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20 20 "LocalFree",
4380: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 (SYS
4390: 43 41 4c 4c 29 4c 6f 63 61 6c 46 72 65 65 2c 20 CALL)LocalFree,
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 0
43b0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f },..#define osLo
43c0: 63 61 6c 46 72 65 65 20 28 28 48 4c 4f 43 41 4c calFree ((HLOCAL
43d0: 28 57 49 4e 41 50 49 2a 29 28 48 4c 4f 43 41 4c (WINAPI*)(HLOCAL
43e0: 29 29 61 53 79 73 63 61 6c 6c 5b 34 34 5d 2e 70 ))aSyscall[44].p
43f0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 Current)..#if !S
4400: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 QLITE_OS_WINCE.
4410: 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 { "LockFile",
4420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 (S
4430: 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 2c YSCALL)LockFile,
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4450: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 0 },..#define os
4460: 4c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28 LockFile ((BOOL(
4470: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c WINAPI*)(HANDLE,
4480: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 DWORD,DWORD,DWOR
4490: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f D, \. DWO
44a0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 35 5d RD))aSyscall[45]
44b0: 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6c 73 65 .pCurrent).#else
44c0: 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c . { "LockFile",
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
44e0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 (SYSCALL)0,
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4500: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 0 },.#endif..#
4510: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 if !SQLITE_OS_WI
4520: 4e 43 45 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c NCE. { "LockFil
4530: 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 eEx",
4540: 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b (SYSCALL)Lock
4550: 46 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20 FileEx,
4560: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 0 },..#defi
4570: 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20 ne osLockFileEx
4580: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 ((BOOL(WINAPI*)(
4590: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f HANDLE,DWORD,DWO
45a0: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 RD,DWORD,DWORD,
45b0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 \. LPOVER
45c0: 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c LAPPED))aSyscall
45d0: 5b 34 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 [46].pCurrent).#
45e0: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 else. { "LockFi
45f0: 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 leEx",
4600: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 (SYSCALL)0,
4610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4620: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 0 },.#endi
4630: 66 0a 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f f.. { "MapViewO
4640: 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 fFile",
4650: 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69 (SYSCALL)MapVi
4660: 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 ewOfFile,
4670: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 0 },..#defin
4680: 65 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c e osMapViewOfFil
4690: 65 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 e ((LPVOID(WINAP
46a0: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 I*)(HANDLE,DWORD
46b0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a ,DWORD,DWORD, \.
46c0: 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 SIZE_T))
46d0: 61 53 79 73 63 61 6c 6c 5b 34 37 5d 2e 70 43 75 aSyscall[47].pCu
46e0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 4d 75 6c rrent).. { "Mul
46f0: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 tiByteToWideChar
4700: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 ", (SYSCALL)
4710: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 MultiByteToWideC
4720: 68 61 72 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 har, 0 },..#
4730: 64 65 66 69 6e 65 20 6f 73 4d 75 6c 74 69 42 79 define osMultiBy
4740: 74 65 54 6f 57 69 64 65 43 68 61 72 20 28 28 69 teToWideChar ((i
4750: 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 nt(WINAPI*)(UINT
4760: 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 2c 69 6e ,DWORD,LPCSTR,in
4770: 74 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 t,LPWSTR, \.
4780: 20 20 20 20 69 6e 74 29 29 61 53 79 73 63 61 6c int))aSyscal
4790: 6c 5b 34 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a l[48].pCurrent).
47a0: 0a 20 20 7b 20 22 51 75 65 72 79 50 65 72 66 6f . { "QueryPerfo
47b0: 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 22 2c 20 rmanceCounter",
47c0: 28 53 59 53 43 41 4c 4c 29 51 75 65 72 79 50 65 (SYSCALL)QueryPe
47d0: 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 rformanceCounter
47e0: 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 , 0 },..#define
47f0: 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e osQueryPerforman
4800: 63 65 43 6f 75 6e 74 65 72 20 28 28 42 4f 4f 4c ceCounter ((BOOL
4810: 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 (WINAPI*)( \.
4820: 20 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 LARGE_INTEG
4830: 45 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34 39 ER*))aSyscall[49
4840: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b ].pCurrent).. {
4850: 20 22 52 65 61 64 46 69 6c 65 22 2c 20 20 20 20 "ReadFile",
4860: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 (SYS
4870: 43 41 4c 4c 29 52 65 61 64 46 69 6c 65 2c 20 20 CALL)ReadFile,
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 0
4890: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 },..#define osRe
48a0: 61 64 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 adFile ((BOOL(WI
48b0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 NAPI*)(HANDLE,LP
48c0: 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f VOID,DWORD,LPDWO
48d0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 RD, \. LP
48e0: 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 OVERLAPPED))aSys
48f0: 63 61 6c 6c 5b 35 30 5d 2e 70 43 75 72 72 65 6e call[50].pCurren
4900: 74 29 0a 0a 20 20 7b 20 22 53 65 74 45 6e 64 4f t).. { "SetEndO
4910: 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 fFile",
4920: 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 45 (SYSCALL)SetE
4930: 6e 64 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 ndOfFile,
4940: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 0 },..#defi
4950: 6e 65 20 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c ne osSetEndOfFil
4960: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a e ((BOOL(WINAPI*
4970: 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 )(HANDLE))aSysca
4980: 6c 6c 5b 35 31 5d 2e 70 43 75 72 72 65 6e 74 29 ll[51].pCurrent)
4990: 0a 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f .. { "SetFilePo
49a0: 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 inter",
49b0: 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c (SYSCALL)SetFil
49c0: 65 50 6f 69 6e 74 65 72 2c 20 20 20 20 20 20 20 ePointer,
49d0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 0 },..#define
49e0: 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 osSetFilePointe
49f0: 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 r ((DWORD(WINAPI
4a00: 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f 4e 47 2c 50 *)(HANDLE,LONG,P
4a10: 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20 20 20 20 20 LONG, \.
4a20: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b DWORD))aSyscall[
4a30: 35 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 52].pCurrent)..
4a40: 20 7b 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20 { "Sleep",
4a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 (S
4a60: 59 53 43 41 4c 4c 29 53 6c 65 65 70 2c 20 20 20 YSCALL)Sleep,
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4a80: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 0 },..#define os
4a90: 53 6c 65 65 70 20 28 28 56 4f 49 44 28 57 49 4e Sleep ((VOID(WIN
4aa0: 41 50 49 2a 29 28 44 57 4f 52 44 29 29 61 53 79 API*)(DWORD))aSy
4ab0: 73 63 61 6c 6c 5b 35 33 5d 2e 70 43 75 72 72 65 scall[53].pCurre
4ac0: 6e 74 29 0a 0a 20 20 7b 20 22 53 79 73 74 65 6d nt).. { "System
4ad0: 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 22 2c TimeToFileTime",
4ae0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 79 73 (SYSCALL)Sys
4af0: 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d temTimeToFileTim
4b00: 65 2c 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 e, 0 },..#def
4b10: 69 6e 65 20 6f 73 53 79 73 74 65 6d 54 69 6d 65 ine osSystemTime
4b20: 54 6f 46 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f ToFileTime ((BOO
4b30: 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 L(WINAPI*)(CONST
4b40: 20 53 59 53 54 45 4d 54 49 4d 45 2a 2c 20 5c 0a SYSTEMTIME*, \.
4b50: 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49 LPFILETI
4b60: 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 34 5d ME))aSyscall[54]
4b70: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 .pCurrent)..#if
4b80: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 !SQLITE_OS_WINCE
4b90: 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 . { "UnlockFile
4ba0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ",
4bb0: 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 (SYSCALL)UnlockF
4bc0: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 ile,
4bd0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 0 },..#define
4be0: 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 28 28 42 osUnlockFile ((B
4bf0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e OOL(WINAPI*)(HAN
4c00: 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c DLE,DWORD,DWORD,
4c10: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 DWORD, \.
4c20: 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c DWORD))aSyscall
4c30: 5b 35 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 [55].pCurrent).#
4c40: 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b else. { "Unlock
4c50: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 File",
4c60: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 (SYSCALL)0,
4c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4c80: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 0 },.#endi
4c90: 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f f..#if !SQLITE_O
4ca0: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 55 6e 6c S_WINCE. { "Unl
4cb0: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 ockFileEx",
4cc0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 (SYSCALL)
4cd0: 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 UnlockFileEx,
4ce0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 0 },..#
4cf0: 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 define osUnlockF
4d00: 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e ileEx ((BOOL(WIN
4d10: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f API*)(HANDLE,DWO
4d20: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 RD,DWORD,DWORD,
4d30: 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 \. LPOVER
4d40: 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c LAPPED))aSyscall
4d50: 5b 35 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 [56].pCurrent).#
4d60: 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b else. { "Unlock
4d70: 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 FileEx",
4d80: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 (SYSCALL)0,
4d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4da0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 0 },.#endi
4db0: 66 0a 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69 65 f.. { "UnmapVie
4dc0: 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 wOfFile",
4dd0: 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6d 61 70 (SYSCALL)Unmap
4de0: 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 ViewOfFile,
4df0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 0 },..#defin
4e00: 65 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 e osUnmapViewOfF
4e10: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 ile ((BOOL(WINAP
4e20: 49 2a 29 28 4c 50 43 56 4f 49 44 29 29 61 53 79 I*)(LPCVOID))aSy
4e30: 73 63 61 6c 6c 5b 35 37 5d 2e 70 43 75 72 72 65 scall[57].pCurre
4e40: 6e 74 29 0a 0a 20 20 7b 20 22 57 69 64 65 43 68 nt).. { "WideCh
4e50: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c 20 arToMultiByte",
4e60: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 69 64 (SYSCALL)Wid
4e70: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 eCharToMultiByte
4e80: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 , 0 },..#def
4e90: 69 6e 65 20 6f 73 57 69 64 65 43 68 61 72 54 6f ine osWideCharTo
4ea0: 4d 75 6c 74 69 42 79 74 65 20 28 28 69 6e 74 28 MultiByte ((int(
4eb0: 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 WINAPI*)(UINT,DW
4ec0: 4f 52 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74 2c ORD,LPCWSTR,int,
4ed0: 4c 50 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20 20 LPSTR,int, \.
4ee0: 20 20 20 20 20 4c 50 43 53 54 52 2c 4c 50 42 4f LPCSTR,LPBO
4ef0: 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 35 38 5d OL))aSyscall[58]
4f00: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 .pCurrent).. {
4f10: 22 57 72 69 74 65 46 69 6c 65 22 2c 20 20 20 20 "WriteFile",
4f20: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 (SYSC
4f30: 41 4c 4c 29 57 72 69 74 65 46 69 6c 65 2c 20 20 ALL)WriteFile,
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 0 }
4f50: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69 ,..#define osWri
4f60: 74 65 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 teFile ((BOOL(WI
4f70: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 NAPI*)(HANDLE,LP
4f80: 43 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 CVOID,DWORD,LPDW
4f90: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c ORD, \. L
4fa0: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 POVERLAPPED))aSy
4fb0: 73 63 61 6c 6c 5b 35 39 5d 2e 70 43 75 72 72 65 scall[59].pCurre
4fc0: 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f nt)..}; /* End o
4fd0: 66 20 74 68 65 20 6f 76 65 72 72 69 64 65 61 62 f the overrideab
4fe0: 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 le system calls
4ff0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 */../*.** This i
5000: 73 20 74 68 65 20 78 53 65 74 53 79 73 74 65 6d s the xSetSystem
5010: 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66 Call() method of
5020: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f 72 sqlite3_vfs for
5030: 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22 all of the.** "
5040: 77 69 6e 33 32 22 20 56 46 53 65 73 2e 20 20 52 win32" VFSes. R
5050: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 eturn SQLITE_OK
5060: 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c opon successfull
5070: 79 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a y updating the.*
5080: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f * system call po
5090: 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45 inter, or SQLITE
50a0: 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65 _NOTFOUND if the
50b0: 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75 re is no configu
50c0: 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20 rable.** system
50d0: 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 call named zName
50e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 ..*/.static int
50f0: 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c winSetSystemCall
5100: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 (. sqlite3_vfs
5110: 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20 *pNotUsed,
5120: 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f 69 /* The VFS poi
5130: 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64 20 nter. Not used
5140: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 */. const char
5150: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 *zName,
5160: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79 /* Name of sy
5170: 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65 stem call to ove
5180: 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 rride */. sqlit
5190: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 e3_syscall_ptr p
51a0: 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e NewFunc /* Poin
51b0: 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74 65 ter to new syste
51c0: 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a m call value */.
51d0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e ){. unsigned in
51e0: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 t i;. int rc =
51f0: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b SQLITE_NOTFOUND;
5200: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d .. UNUSED_PARAM
5210: 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a ETER(pNotUsed);.
5220: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 if( zName==0 )
5230: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a {. /* If no z
5240: 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20 72 Name is given, r
5250: 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74 65 estore all syste
5260: 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69 72 m calls to their
5270: 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 default. **
5280: 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65 74 settings and ret
5290: 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a urn NULL. */.
52a0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f rc = SQLITE_
52b0: 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b OK;. for(i=0;
52c0: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 i<sizeof(aSysca
52d0: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 ll)/sizeof(aSysc
52e0: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 all[0]); i++){.
52f0: 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c if( aSyscal
5300: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b l[i].pDefault ){
5310: 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c . aSyscal
5320: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 l[i].pCurrent =
5330: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 aSyscall[i].pDef
5340: 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 ault;. }.
5350: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 }. }else{.
5360: 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 /* If zName is
5370: 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72 61 specified, opera
5380: 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f te on only the o
5390: 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20 ne system call.
53a0: 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 2e ** specified.
53b0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 . */. for(
53c0: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 i=0; i<sizeof(aS
53d0: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 yscall)/sizeof(a
53e0: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b Syscall[0]); i++
53f0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 ){. if( str
5400: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 cmp(zName, aSysc
5410: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 all[i].zName)==0
5420: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 ){. if(
5430: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 aSyscall[i].pDef
5440: 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 ault==0 ){.
5450: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d aSyscall[i]
5460: 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79 73 .pDefault = aSys
5470: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 call[i].pCurrent
5480: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
5490: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f rc = SQLITE_
54a0: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 OK;. if(
54b0: 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e pNewFunc==0 ) pN
54c0: 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61 6c ewFunc = aSyscal
54d0: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 l[i].pDefault;.
54e0: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b aSyscall[
54f0: 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70 4e i].pCurrent = pN
5500: 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 ewFunc;.
5510: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 break;. }.
5520: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 }. }. retur
5530: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 n rc;.}../*.** R
5540: 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 eturn the value
5550: 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c of a system call
5560: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 . Return NULL i
5570: 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61 f zName is not a
5580: 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 73 .** recognized s
5590: 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e ystem call name.
55a0: 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72 NULL is also r
55b0: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 73 eturned if the s
55c0: 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 ystem call.** is
55d0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 66 currently undef
55e0: 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 ined..*/.static
55f0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f sqlite3_syscall_
5600: 70 74 72 20 77 69 6e 47 65 74 53 79 73 74 65 6d ptr winGetSystem
5610: 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f Call(. sqlite3_
5620: 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 vfs *pNotUsed,.
5630: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 const char *zNa
5640: 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 me.){. unsigned
5650: 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45 int i;.. UNUSE
5660: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 D_PARAMETER(pNot
5670: 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30 Used);. for(i=0
5680: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 ; i<sizeof(aSysc
5690: 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 all)/sizeof(aSys
56a0: 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a call[0]); i++){.
56b0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a if( strcmp(z
56c0: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 Name, aSyscall[i
56d0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 ].zName)==0 ) re
56e0: 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d turn aSyscall[i]
56f0: 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 .pCurrent;. }.
5700: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a return 0;.}../*
5710: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e .** Return the n
5720: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 ame of the first
5730: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61 66 74 system call aft
5740: 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e er zName. If zN
5750: 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 ame==NULL.** the
5760: 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61 6d n return the nam
5770: 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 e of the first s
5780: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 ystem call. Ret
5790: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d urn NULL if zNam
57a0: 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74 e.** is the last
57b0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20 system call or
57c0: 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 if zName is not
57d0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 the name of a va
57e0: 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 lid.** system ca
57f0: 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f ll..*/.static co
5800: 6e 73 74 20 63 68 61 72 20 2a 77 69 6e 4e 65 78 nst char *winNex
5810: 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 tSystemCall(sqli
5820: 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73 te3_vfs *p, cons
5830: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a t char *zName){.
5840: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 int i = -1;..
5850: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 UNUSED_PARAMETE
5860: 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d R(p);. if( zNam
5870: 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 e ){. for(i=0
5880: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 ; i<ArraySize(aS
5890: 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b yscall)-1; i++){
58a0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d . if( strcm
58b0: 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c p(zName, aSyscal
58c0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 l[i].zName)==0 )
58d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 break;. }.
58e0: 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 }. for(i++; i<A
58f0: 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c rraySize(aSyscal
5900: 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 l); i++){. if
5910: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 ( aSyscall[i].pC
5920: 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65 74 75 urrent!=0 ) retu
5930: 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a rn aSyscall[i].z
5940: 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 Name;. }. retu
5950: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 rn 0;.}../*.** R
5960: 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d eturn true (non-
5970: 7a 65 72 6f 29 20 69 66 20 77 65 20 61 72 65 20 zero) if we are
5980: 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57 69 running under Wi
5990: 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58 nNT, Win2K, WinX
59a0: 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20 P,.** or WinCE.
59b0: 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 28 7a Return false (z
59c0: 65 72 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c 20 ero) for Win95,
59d0: 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e Win98, or WinME.
59e0: 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 61 .**.** Here is a
59f0: 6e 20 69 6e 74 65 72 65 73 74 69 6e 67 20 6f 62 n interesting ob
5a00: 73 65 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39 servation: Win9
5a10: 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20 57 69 5, Win98, and Wi
5a20: 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 nME lack.** the
5a30: 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 LockFileEx() API
5a40: 2e 20 20 42 75 74 20 77 65 20 63 61 6e 20 73 74 . But we can st
5a50: 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79 20 6c ill statically l
5a60: 69 6e 6b 20 61 67 61 69 6e 73 74 20 74 68 61 74 ink against that
5a70: 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67 20 .** API as long
5a80: 61 73 20 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c as we don't call
5a90: 20 69 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 it when running
5aa0: 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41 Win95/98/ME. A
5ab0: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 call to.** this
5ac0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 routine is used
5ad0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 to determine if
5ae0: 20 74 68 65 20 68 6f 73 74 20 69 73 20 57 69 6e the host is Win
5af0: 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 95/98/ME or.** W
5b00: 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68 inNT/2K/XP so th
5b10: 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 at we will know
5b20: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 77 whether or not w
5b30: 65 20 63 61 6e 20 73 61 66 65 6c 79 20 63 61 6c e can safely cal
5b40: 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c l.** the LockFil
5b50: 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 23 69 eEx() API..*/.#i
5b60: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 f SQLITE_OS_WINC
5b70: 45 0a 23 20 64 65 66 69 6e 65 20 69 73 4e 54 28 E.# define isNT(
5b80: 29 20 20 28 31 29 0a 23 65 6c 73 65 0a 20 20 73 ) (1).#else. s
5b90: 74 61 74 69 63 20 69 6e 74 20 69 73 4e 54 28 76 tatic int isNT(v
5ba0: 6f 69 64 29 7b 0a 20 20 20 20 69 66 28 20 73 71 oid){. if( sq
5bb0: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 30 lite3_os_type==0
5bc0: 20 29 7b 0a 20 20 20 20 20 20 4f 53 56 45 52 53 ){. OSVERS
5bd0: 49 4f 4e 49 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a IONINFOA sInfo;.
5be0: 20 20 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 sInfo.dwOS
5bf0: 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 VersionInfoSize
5c00: 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b = sizeof(sInfo);
5c10: 0a 20 20 20 20 20 20 6f 73 47 65 74 56 65 72 73 . osGetVers
5c20: 69 6f 6e 45 78 41 28 26 73 49 6e 66 6f 29 3b 0a ionExA(&sInfo);.
5c30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 sqlite3_os
5c40: 5f 74 79 70 65 20 3d 20 73 49 6e 66 6f 2e 64 77 _type = sInfo.dw
5c50: 50 6c 61 74 66 6f 72 6d 49 64 3d 3d 56 45 52 5f PlatformId==VER_
5c60: 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e PLATFORM_WIN32_N
5c70: 54 20 3f 20 32 20 3a 20 31 3b 0a 20 20 20 20 7d T ? 2 : 1;. }
5c80: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 . return sqli
5c90: 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 3b 0a te3_os_type==2;.
5ca0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 }.#endif /* SQ
5cb0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f LITE_OS_WINCE */
5cc0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ..#ifdef SQLITE_
5cd0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a WIN32_MALLOC./*.
5ce0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 ** Allocate nByt
5cf0: 65 73 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f es of memory..*/
5d00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 .static void *wi
5d10: 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e nMemMalloc(int n
5d20: 42 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45 Bytes){. HANDLE
5d30: 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a hHeap;. void *
5d40: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 p;.. winMemAsse
5d50: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 rtMagic();. hHe
5d60: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 ap = winMemGetHe
5d70: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 ap();. assert(
5d80: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 hHeap!=0 );. as
5d90: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 sert( hHeap!=INV
5da0: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 ALID_HANDLE_VALU
5db0: 45 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 E );.#ifdef SQLI
5dc0: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f TE_WIN32_MALLOC_
5dd0: 56 41 4c 49 44 41 54 45 0a 20 20 61 73 73 65 72 VALIDATE. asser
5de0: 74 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 t ( osHeapValida
5df0: 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 te(hHeap, SQLITE
5e00: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 _WIN32_HEAP_FLAG
5e10: 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 S, NULL) );.#end
5e20: 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 if. assert( nBy
5e30: 74 65 73 3e 3d 30 20 29 3b 0a 20 20 70 20 3d 20 tes>=0 );. p =
5e40: 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 osHeapAlloc(hHea
5e50: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f p, SQLITE_WIN32_
5e60: 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a HEAP_FLAGS, (SIZ
5e70: 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 69 E_T)nBytes);. i
5e80: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c f( !p ){. sql
5e90: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f ite3_log(SQLITE_
5ea0: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 NOMEM, "failed t
5eb0: 6f 20 48 65 61 70 41 6c 6c 6f 63 20 25 75 20 62 o HeapAlloc %u b
5ec0: 79 74 65 73 20 28 25 64 29 2c 20 68 65 61 70 3d ytes (%d), heap=
5ed0: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 %p",.
5ee0: 20 20 20 20 20 6e 42 79 74 65 73 2c 20 6f 73 47 nBytes, osG
5ef0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 etLastError(), (
5f00: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 void*)hHeap);.
5f10: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a }. return p;.}.
5f20: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f ./*.** Free memo
5f30: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f ry..*/.static vo
5f40: 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f id winMemFree(vo
5f50: 69 64 20 2a 70 50 72 69 6f 72 29 7b 0a 20 20 48 id *pPrior){. H
5f60: 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 ANDLE hHeap;..
5f70: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 winMemAssertMagi
5f80: 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 c();. hHeap = w
5f90: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a inMemGetHeap();.
5fa0: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 assert( hHeap!
5fb0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 =0 );. assert(
5fc0: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 hHeap!=INVALID_H
5fd0: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 ANDLE_VALUE );.#
5fe0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e ifdef SQLITE_WIN
5ff0: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 32_MALLOC_VALIDA
6000: 54 45 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73 TE. assert ( os
6010: 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 HeapValidate(hHe
6020: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 ap, SQLITE_WIN32
6030: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 _HEAP_FLAGS, pPr
6040: 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 ior) );.#endif.
6050: 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 20 72 if( !pPrior ) r
6060: 65 74 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69 6e eturn; /* Passin
6070: 67 20 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46 72 g NULL to HeapFr
6080: 65 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e ee is undefined.
6090: 20 2a 2f 0a 20 20 69 66 28 20 21 6f 73 48 65 61 */. if( !osHea
60a0: 70 46 72 65 65 28 68 48 65 61 70 2c 20 53 51 4c pFree(hHeap, SQL
60b0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 ITE_WIN32_HEAP_F
60c0: 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 7b LAGS, pPrior) ){
60d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 . sqlite3_log
60e0: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 (SQLITE_NOMEM, "
60f0: 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 46 72 failed to HeapFr
6100: 65 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 64 29 ee block %p (%d)
6110: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 , heap=%p",.
6120: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69 pPri
6130: 6f 72 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 or, osGetLastErr
6140: 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 or(), (void*)hHe
6150: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a ap);. }.}../*.*
6160: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a * Change the siz
6170: 65 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67 e of an existing
6180: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 memory allocati
6190: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 on.*/.static voi
61a0: 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 d *winMemRealloc
61b0: 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 (void *pPrior, i
61c0: 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41 nt nBytes){. HA
61d0: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f NDLE hHeap;. vo
61e0: 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d id *p;.. winMem
61f0: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 AssertMagic();.
6200: 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 hHeap = winMemG
6210: 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 etHeap();. asse
6220: 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a rt( hHeap!=0 );.
6230: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 assert( hHeap!
6240: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f =INVALID_HANDLE_
6250: 56 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66 20 VALUE );.#ifdef
6260: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c SQLITE_WIN32_MAL
6270: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20 61 LOC_VALIDATE. a
6280: 73 73 65 72 74 20 28 20 6f 73 48 65 61 70 56 61 ssert ( osHeapVa
6290: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 lidate(hHeap, SQ
62a0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f LITE_WIN32_HEAP_
62b0: 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 FLAGS, pPrior) )
62c0: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 ;.#endif. asser
62d0: 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a t( nBytes>=0 );.
62e0: 20 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 7b if( !pPrior ){
62f0: 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70 41 . p = osHeapA
6300: 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 lloc(hHeap, SQLI
6310: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c TE_WIN32_HEAP_FL
6320: 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 AGS, (SIZE_T)nBy
6330: 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 tes);. }else{.
6340: 20 20 20 70 20 3d 20 6f 73 48 65 61 70 52 65 41 p = osHeapReA
6350: 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 lloc(hHeap, SQLI
6360: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c TE_WIN32_HEAP_FL
6370: 41 47 53 2c 20 70 50 72 69 6f 72 2c 20 28 53 49 AGS, pPrior, (SI
6380: 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 ZE_T)nBytes);.
6390: 7d 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 }. if( !p ){.
63a0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 sqlite3_log(SQ
63b0: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 LITE_NOMEM, "fai
63c0: 6c 65 64 20 74 6f 20 25 73 20 25 75 20 62 79 74 led to %s %u byt
63d0: 65 73 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70 es (%d), heap=%p
63e0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ",.
63f0: 20 20 20 70 50 72 69 6f 72 20 3f 20 22 48 65 61 pPrior ? "Hea
6400: 70 52 65 41 6c 6c 6f 63 22 20 3a 20 22 48 65 61 pReAlloc" : "Hea
6410: 70 41 6c 6c 6f 63 22 2c 20 6e 42 79 74 65 73 2c pAlloc", nBytes,
6420: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 osGetLastError(
6430: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ),.
6440: 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 (void*)hHeap)
6450: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 ;. }. return p
6460: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 ;.}../*.** Retur
6470: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e n the size of an
6480: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c outstanding all
6490: 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 62 79 74 65 ocation, in byte
64a0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 s..*/.static int
64b0: 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64 winMemSize(void
64c0: 20 2a 70 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 *p){. HANDLE h
64d0: 48 65 61 70 3b 0a 20 20 53 49 5a 45 5f 54 20 6e Heap;. SIZE_T n
64e0: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 ;.. winMemAsser
64f0: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 tMagic();. hHea
6500: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 p = winMemGetHea
6510: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 p();. assert( h
6520: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 Heap!=0 );. ass
6530: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 ert( hHeap!=INVA
6540: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 LID_HANDLE_VALUE
6550: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 );.#ifdef SQLIT
6560: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 E_WIN32_MALLOC_V
6570: 41 4c 49 44 41 54 45 0a 20 20 61 73 73 65 72 74 ALIDATE. assert
6580: 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 ( osHeapValidat
6590: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f e(hHeap, SQLITE_
65a0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 WIN32_HEAP_FLAGS
65b0: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 , NULL) );.#endi
65c0: 66 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 f. if( !p ) ret
65d0: 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f 73 48 urn 0;. n = osH
65e0: 65 61 70 53 69 7a 65 28 68 48 65 61 70 2c 20 53 eapSize(hHeap, S
65f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 QLITE_WIN32_HEAP
6600: 5f 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20 69 66 _FLAGS, p);. if
6610: 28 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d 31 20 ( n==(SIZE_T)-1
6620: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c ){. sqlite3_l
6630: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c og(SQLITE_NOMEM,
6640: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 "failed to Heap
6650: 53 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 Size block %p (%
6660: 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 d), heap=%p",.
6670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c p,
6680: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 osGetLastError(
6690: 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 ), (void*)hHeap)
66a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a ;. return 0;.
66b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e }. return (in
66c0: 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f t)n;.}../*.** Ro
66d0: 75 6e 64 20 75 70 20 61 20 72 65 71 75 65 73 74 und up a request
66e0: 20 73 69 7a 65 20 74 6f 20 74 68 65 20 6e 65 78 size to the nex
66f0: 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69 t valid allocati
6700: 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 on size..*/.stat
6710: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 ic int winMemRou
6720: 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72 ndup(int n){. r
6730: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a eturn n;.}../*.*
6740: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 * Initialize thi
6750: 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 s module..*/.sta
6760: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e tic int winMemIn
6770: 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 it(void *pAppDat
6780: 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 a){. winMemData
6790: 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 *pWinMemData =
67a0: 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 (winMemData *)pA
67b0: 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 ppData;.. if( !
67c0: 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 pWinMemData ) re
67d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f turn SQLITE_ERRO
67e0: 52 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 R;. assert( pWi
67f0: 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 3d nMemData->magic=
6800: 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 29 3b =WINMEM_MAGIC );
6810: 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 . if( !pWinMemD
6820: 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 ata->hHeap ){.
6830: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 pWinMemData->h
6840: 48 65 61 70 20 3d 20 6f 73 48 65 61 70 43 72 65 Heap = osHeapCre
6850: 61 74 65 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 ate(SQLITE_WIN32
6860: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20 _HEAP_FLAGS,.
6870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6890: 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f SQLITE_WIN32_
68a0: 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 0a HEAP_INIT_SIZE,.
68b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
68c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
68d0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e SQLITE_WIN
68e0: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 32_HEAP_MAX_SIZE
68f0: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 57 69 6e );. if( !pWin
6900: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 MemData->hHeap )
6910: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f {. sqlite3_
6920: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d log(SQLITE_NOMEM
6930: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 66 61 69 ,. "fai
6940: 6c 65 64 20 74 6f 20 48 65 61 70 43 72 65 61 74 led to HeapCreat
6950: 65 20 28 25 64 29 2c 20 66 6c 61 67 73 3d 25 75 e (%d), flags=%u
6960: 2c 20 69 6e 69 74 53 69 7a 65 3d 25 75 2c 20 6d , initSize=%u, m
6970: 61 78 53 69 7a 65 3d 25 75 22 2c 0a 20 20 20 20 axSize=%u",.
6980: 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 osGetLastE
6990: 72 72 6f 72 28 29 2c 20 53 51 4c 49 54 45 5f 57 rror(), SQLITE_W
69a0: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c IN32_HEAP_FLAGS,
69b0: 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 . SQLIT
69c0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 E_WIN32_HEAP_INI
69d0: 54 5f 53 49 5a 45 2c 20 53 51 4c 49 54 45 5f 57 T_SIZE, SQLITE_W
69e0: 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 IN32_HEAP_MAX_SI
69f0: 5a 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 ZE);. retur
6a00: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a n SQLITE_NOMEM;.
6a10: 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 }. pWinMe
6a20: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 mData->bOwned =
6a30: 54 52 55 45 3b 0a 20 20 7d 0a 20 20 61 73 73 65 TRUE;. }. asse
6a40: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d rt( pWinMemData-
6a50: 3e 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 >hHeap!=0 );. a
6a60: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 ssert( pWinMemDa
6a70: 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c ta->hHeap!=INVAL
6a80: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 ID_HANDLE_VALUE
6a90: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 );.#ifdef SQLITE
6aa0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 _WIN32_MALLOC_VA
6ab0: 4c 49 44 41 54 45 0a 20 20 61 73 73 65 72 74 28 LIDATE. assert(
6ac0: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 osHeapValidate(
6ad0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 pWinMemData->hHe
6ae0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 ap, SQLITE_WIN32
6af0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c _HEAP_FLAGS, NUL
6b00: 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 L) );.#endif. r
6b10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b eturn SQLITE_OK;
6b20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74 .}../*.** Deinit
6b30: 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 ialize this modu
6b40: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f le..*/.static vo
6b50: 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 id winMemShutdow
6b60: 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 n(void *pAppData
6b70: 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 ){. winMemData
6b80: 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 *pWinMemData = (
6b90: 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 winMemData *)pAp
6ba0: 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 pData;.. if( !p
6bb0: 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74 WinMemData ) ret
6bc0: 75 72 6e 3b 0a 20 20 69 66 28 20 70 57 69 6e 4d urn;. if( pWinM
6bd0: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b emData->hHeap ){
6be0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69 . assert( pWi
6bf0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 nMemData->hHeap!
6c00: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f =INVALID_HANDLE_
6c10: 56 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66 20 VALUE );.#ifdef
6c20: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c SQLITE_WIN32_MAL
6c30: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20 20 LOC_VALIDATE.
6c40: 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 assert( osHeapV
6c50: 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 alidate(pWinMemD
6c60: 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 ata->hHeap, SQLI
6c70: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c TE_WIN32_HEAP_FL
6c80: 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 AGS, NULL) );.#e
6c90: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 57 69 ndif. if( pWi
6ca0: 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 nMemData->bOwned
6cb0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6f ){. if( !o
6cc0: 73 48 65 61 70 44 65 73 74 72 6f 79 28 70 57 69 sHeapDestroy(pWi
6cd0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 nMemData->hHeap)
6ce0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 ){. sqli
6cf0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e te3_log(SQLITE_N
6d00: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f OMEM, "failed to
6d10: 20 48 65 61 70 44 65 73 74 72 6f 79 20 28 25 64 HeapDestroy (%d
6d20: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 ), heap=%p",.
6d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6d40: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 osGetLastError(
6d50: 29 2c 20 28 76 6f 69 64 2a 29 70 57 69 6e 4d 65 ), (void*)pWinMe
6d60: 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 3b 0a 20 mData->hHeap);.
6d70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57 69 }. pWi
6d80: 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 nMemData->bOwned
6d90: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a = FALSE;. }.
6da0: 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d pWinMemData-
6db0: 3e 68 48 65 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 >hHeap = NULL;.
6dc0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 }.}../*.** Popu
6dd0: 6c 61 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76 late the low-lev
6de0: 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 el memory alloca
6df0: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f tion function po
6e00: 69 6e 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c inters in.** sql
6e10: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 ite3GlobalConfig
6e20: 2e 6d 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 .m with pointers
6e30: 20 74 6f 20 74 68 65 20 72 6f 75 74 69 6e 65 73 to the routines
6e40: 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 54 in this file. T
6e50: 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 he.** arguments
6e60: 73 70 65 63 69 66 79 20 74 68 65 20 62 6c 6f 63 specify the bloc
6e70: 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6d k of memory to m
6e80: 61 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 anage..**.** Thi
6e90: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c s routine is onl
6ea0: 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 y called by sqli
6eb0: 74 65 33 5f 63 6f 6e 66 69 67 28 29 2c 20 61 6e te3_config(), an
6ec0: 64 20 74 68 65 72 65 66 6f 72 65 0a 2a 2a 20 69 d therefore.** i
6ed0: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 s not required t
6ee0: 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65 20 o be threadsafe
6ef0: 28 69 74 20 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a (it is not)..*/.
6f00: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 const sqlite3_me
6f10: 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 m_methods *sqlit
6f20: 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f e3MemGetWin32(vo
6f30: 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f id){. static co
6f40: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f nst sqlite3_mem_
6f50: 6d 65 74 68 6f 64 73 20 77 69 6e 4d 65 6d 4d 65 methods winMemMe
6f60: 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20 20 77 69 thods = {. wi
6f70: 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 nMemMalloc,.
6f80: 77 69 6e 4d 65 6d 46 72 65 65 2c 0a 20 20 20 20 winMemFree,.
6f90: 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20 winMemRealloc,.
6fa0: 20 20 20 77 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20 winMemSize,.
6fb0: 20 20 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 winMemRoundup
6fc0: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 49 6e 69 74 ,. winMemInit
6fd0: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 ,. winMemShut
6fe0: 64 6f 77 6e 2c 0a 20 20 20 20 26 77 69 6e 5f 6d down,. &win_m
6ff0: 65 6d 5f 64 61 74 61 0a 20 20 7d 3b 0a 20 20 72 em_data. };. r
7000: 65 74 75 72 6e 20 26 77 69 6e 4d 65 6d 4d 65 74 eturn &winMemMet
7010: 68 6f 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 hods;.}..void sq
7020: 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 lite3MemSetDefau
7030: 6c 74 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 lt(void){. sqli
7040: 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 te3_config(SQLIT
7050: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c E_CONFIG_MALLOC,
7060: 20 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 sqlite3MemGetWi
7070: 6e 33 32 28 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 n32());.}.#endif
7080: 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 /* SQLITE_WIN32
7090: 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a _MALLOC */../*.*
70a0: 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d * Convert a UTF-
70b0: 38 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 8 string to Micr
70c0: 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 28 55 osoft Unicode (U
70d0: 54 46 2d 31 36 3f 29 2e 20 0a 2a 2a 0a 2a 2a 20 TF-16?). .**.**
70e0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 Space to hold th
70f0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e e returned strin
7100: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 g is obtained fr
7110: 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 om malloc..*/.st
7120: 61 74 69 63 20 4c 50 57 53 54 52 20 75 74 66 38 atic LPWSTR utf8
7130: 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 ToUnicode(const
7140: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 char *zFilename)
7150: 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20 {. int nChar;.
7160: 20 4c 50 57 53 54 52 20 7a 57 69 64 65 46 69 6c LPWSTR zWideFil
7170: 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20 ename;.. nChar
7180: 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 = osMultiByteToW
7190: 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c ideChar(CP_UTF8,
71a0: 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 0, zFilename, -
71b0: 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 69 1, NULL, 0);. i
71c0: 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 f( nChar==0 ){.
71d0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d return 0;. }
71e0: 0a 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 . zWideFilename
71f0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f = sqlite3_mallo
7200: 63 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28 c( nChar*sizeof(
7210: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d zWideFilename[0]
7220: 29 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 ) );. if( zWide
7230: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 Filename==0 ){.
7240: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d return 0;. }
7250: 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c . nChar = osMul
7260: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 tiByteToWideChar
7270: 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 (CP_UTF8, 0, zFi
7280: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64 lename, -1, zWid
7290: 65 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 eFilename,.
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
72b0: 20 20 20 20 20 20 20 20 20 20 20 6e 43 68 61 72 nChar
72c0: 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d );. if( nChar==
72d0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 0 ){. sqlite3
72e0: 5f 66 72 65 65 28 7a 57 69 64 65 46 69 6c 65 6e _free(zWideFilen
72f0: 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69 64 65 46 ame);. zWideF
7300: 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d ilename = 0;. }
7310: 0a 20 20 72 65 74 75 72 6e 20 7a 57 69 64 65 46 . return zWideF
7320: 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a ilename;.}../*.*
7330: 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 * Convert Micros
7340: 6f 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20 55 oft Unicode to U
7350: 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 TF-8. Space to
7360: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 hold the returne
7370: 64 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f d string is.** o
7380: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c btained from sql
7390: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a ite3_malloc()..*
73a0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 /.static char *u
73b0: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 4c 50 43 nicodeToUtf8(LPC
73c0: 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 WSTR zWideFilena
73d0: 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 me){. int nByte
73e0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e ;. char *zFilen
73f0: 61 6d 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 ame;.. nByte =
7400: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 osWideCharToMult
7410: 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30 iByte(CP_UTF8, 0
7420: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c , zWideFilename,
7430: 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 -1, 0, 0, 0, 0)
7440: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d ;. if( nByte ==
7450: 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 0 ){. return
7460: 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 0;. }. zFilen
7470: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 ame = sqlite3_ma
7480: 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 lloc( nByte );.
7490: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d if( zFilename==
74a0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 0 ){. return
74b0: 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 0;. }. nByte =
74c0: 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c osWideCharToMul
74d0: 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 tiByte(CP_UTF8,
74e0: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 0, zWideFilename
74f0: 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c , -1, zFilename,
7500: 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20 nByte,.
7510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7520: 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 0, 0);.
7530: 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 if( nByte == 0
7540: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 ){. sqlite3_f
7550: 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a ree(zFilename);.
7560: 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 zFilename =
7570: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 0;. }. return
7580: 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a zFilename;.}../*
7590: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 41 .** Convert an A
75a0: 4e 53 49 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 NSI string to Mi
75b0: 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c crosoft Unicode,
75c0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a based on the.**
75d0: 20 63 75 72 72 65 6e 74 20 63 6f 64 65 70 61 67 current codepag
75e0: 65 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20 66 e settings for f
75f0: 69 6c 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a ile apis..** .**
7600: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 Space to hold t
7610: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 he returned stri
7620: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a ng is obtained.*
7630: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d * from sqlite3_m
7640: 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 alloc..*/.static
7650: 20 4c 50 57 53 54 52 20 6d 62 63 73 54 6f 55 6e LPWSTR mbcsToUn
7660: 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 icode(const char
7670: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 *zFilename){.
7680: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 4c 50 57 int nByte;. LPW
7690: 53 54 52 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d STR zMbcsFilenam
76a0: 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67 e;. int codepag
76b0: 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69 e = osAreFileApi
76c0: 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 sANSI() ? CP_ACP
76d0: 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 : CP_OEMCP;..
76e0: 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 nByte = osMultiB
76f0: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f yteToWideChar(co
7700: 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 depage, 0, zFile
7710: 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 0a name, -1, NULL,.
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7740: 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29 0)*sizeof(WCHAR)
7750: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 ;. if( nByte==0
7760: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 ){. return 0
7770: 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 46 69 6c ;. }. zMbcsFil
7780: 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f ename = sqlite3_
7790: 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 malloc( nByte*si
77a0: 7a 65 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61 zeof(zMbcsFilena
77b0: 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 me[0]) );. if(
77c0: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30 zMbcsFilename==0
77d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 ){. return 0
77e0: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 ;. }. nByte =
77f0: 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 osMultiByteToWid
7800: 65 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 eChar(codepage,
7810: 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 0, zFilename, -1
7820: 2c 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c , zMbcsFilename,
7830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
7840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7850: 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e nByte);. if( n
7860: 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 Byte==0 ){. s
7870: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 62 63 qlite3_free(zMbc
7880: 73 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 sFilename);.
7890: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 zMbcsFilename =
78a0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 0;. }. return
78b0: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d zMbcsFilename;.}
78c0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 ../*.** Convert
78d0: 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 Microsoft Unicod
78e0: 65 20 74 6f 20 6d 75 6c 74 69 2d 62 79 74 65 20 e to multi-byte
78f0: 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 character string
7900: 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a , based on the.*
7910: 2a 20 75 73 65 72 27 73 20 41 4e 53 49 20 63 6f * user's ANSI co
7920: 64 65 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 depage..**.** Sp
7930: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 ace to hold the
7940: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 returned string
7950: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d is obtained from
7960: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c .** sqlite3_mall
7970: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 oc()..*/.static
7980: 63 68 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 4d char *unicodeToM
7990: 62 63 73 28 4c 50 43 57 53 54 52 20 7a 57 69 64 bcs(LPCWSTR zWid
79a0: 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e eFilename){. in
79b0: 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 t nByte;. char
79c0: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e *zFilename;. in
79d0: 74 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73 41 t codepage = osA
79e0: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 reFileApisANSI()
79f0: 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f ? CP_ACP : CP_O
7a00: 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d EMCP;.. nByte =
7a10: 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c osWideCharToMul
7a20: 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c tiByte(codepage,
7a30: 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 0, zWideFilenam
7a40: 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 e, -1, 0, 0, 0,
7a50: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 0);. if( nByte
7a60: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 == 0 ){. retu
7a70: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c rn 0;. }. zFil
7a80: 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f ename = sqlite3_
7a90: 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b malloc( nByte );
7aa0: 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 . if( zFilename
7ab0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 ==0 ){. retur
7ac0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 n 0;. }. nByte
7ad0: 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d = osWideCharToM
7ae0: 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 ultiByte(codepag
7af0: 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e e, 0, zWideFilen
7b00: 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 ame, -1, zFilena
7b10: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 me,.
7b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7b30: 20 20 20 20 6e 42 79 74 65 2c 20 30 2c 20 30 29 nByte, 0, 0)
7b40: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d ;. if( nByte ==
7b50: 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 0 ){. sqlite
7b60: 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 3_free(zFilename
7b70: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 );. zFilename
7b80: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 = 0;. }. retu
7b90: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a rn zFilename;.}.
7ba0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 6d ./*.** Convert m
7bb0: 75 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74 ultibyte charact
7bc0: 65 72 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46 er string to UTF
7bd0: 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f -8. Space to ho
7be0: 6c 64 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e ld the.** return
7bf0: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 ed string is obt
7c00: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 ained from sqlit
7c10: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a e3_malloc()..*/.
7c20: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 char *sqlite3_wi
7c30: 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 n32_mbcs_to_utf8
7c40: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 (const char *zFi
7c50: 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 lename){. char
7c60: 2a 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a *zFilenameUtf8;.
7c70: 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64 LPWSTR zTmpWid
7c80: 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d e;.. zTmpWide =
7c90: 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a mbcsToUnicode(z
7ca0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 Filename);. if(
7cb0: 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a zTmpWide==0 ){.
7cc0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 return 0;.
7cd0: 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 }. zFilenameUtf
7ce0: 38 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 8 = unicodeToUtf
7cf0: 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 8(zTmpWide);. s
7d00: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 qlite3_free(zTmp
7d10: 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 Wide);. return
7d20: 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 7d zFilenameUtf8;.}
7d30: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 ../*.** Convert
7d40: 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74 69 62 79 UTF-8 to multiby
7d50: 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72 te character str
7d60: 69 6e 67 2e 20 20 53 70 61 63 65 20 74 6f 20 68 ing. Space to h
7d70: 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 old the .** retu
7d80: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f rned string is o
7d90: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c btained from sql
7da0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a ite3_malloc()..*
7db0: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f /.char *sqlite3_
7dc0: 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 win32_utf8_to_mb
7dd0: 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a cs(const char *z
7de0: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 Filename){. cha
7df0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 r *zFilenameMbcs
7e00: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 ;. LPWSTR zTmpW
7e10: 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 ide;.. zTmpWide
7e20: 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 = utf8ToUnicode
7e30: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 (zFilename);. i
7e40: 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 f( zTmpWide==0 )
7e50: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a {. return 0;.
7e60: 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 4d }. zFilenameM
7e70: 62 63 73 20 3d 20 75 6e 69 63 6f 64 65 54 6f 4d bcs = unicodeToM
7e80: 62 63 73 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 bcs(zTmpWide);.
7e90: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 sqlite3_free(zT
7ea0: 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72 mpWide);. retur
7eb0: 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b n zFilenameMbcs;
7ec0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 .}.../*.** The r
7ed0: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 67 eturn value of g
7ee0: 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a 2a etLastErrorMsg.*
7ef0: 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 * is zero if the
7f00: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 error message f
7f10: 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 its in the buffe
7f20: 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a r, or non-zero.*
7f30: 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 * otherwise (if
7f40: 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 the message was
7f50: 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a 73 truncated)..*/.s
7f60: 74 61 74 69 63 20 69 6e 74 20 67 65 74 4c 61 73 tatic int getLas
7f70: 74 45 72 72 6f 72 4d 73 67 28 44 57 4f 52 44 20 tErrorMsg(DWORD
7f80: 6c 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74 20 6e lastErrno, int n
7f90: 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 Buf, char *zBuf)
7fa0: 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73 {. /* FormatMes
7fb0: 73 61 67 65 20 72 65 74 75 72 6e 73 20 30 20 6f sage returns 0 o
7fc0: 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68 65 n failure. Othe
7fd0: 72 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72 65 rwise it. ** re
7fe0: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 turns the number
7ff0: 20 6f 66 20 54 43 48 41 52 73 20 77 72 69 74 74 of TCHARs writt
8000: 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 en to the output
8010: 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65 78 . ** buffer, ex
8020: 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72 6d cluding the term
8030: 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61 inating null cha
8040: 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44 20 r.. */. DWORD
8050: 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 dwLen = 0;. cha
8060: 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 r *zOut = 0;..
8070: 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 if( isNT() ){.
8080: 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 57 69 LPWSTR zTempWi
8090: 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 de = NULL;. d
80a0: 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d wLen = osFormatM
80b0: 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d essageW(FORMAT_M
80c0: 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f ESSAGE_ALLOCATE_
80d0: 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20 20 BUFFER |.
80e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
80f0: 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 FORMAT_MES
8100: 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d SAGE_FROM_SYSTEM
8110: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 |.
8120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8130: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 FORMAT_MESSAGE_I
8140: 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 GNORE_INSERTS,.
8150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8160: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c NULL
8170: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
8180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c l
8190: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 astErrno,.
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
81b0: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 0,.
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
81d0: 20 20 20 20 20 20 20 28 4c 50 57 53 54 52 29 20 (LPWSTR)
81e0: 26 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 &zTempWide,.
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8200: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 0,.
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8220: 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 0);.
8230: 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 if( dwLen > 0 )
8240: 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 {. /* alloc
8250: 61 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 ate a buffer and
8260: 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 convert to UTF8
8270: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 */. sqlite
8280: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 3BeginBenignMall
8290: 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 oc();. zOut
82a0: 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 = unicodeToUtf8
82b0: 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 20 (zTempWide);.
82c0: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e sqlite3EndBen
82d0: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 ignMalloc();.
82e0: 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73 /* free the s
82f0: 79 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c ystem buffer all
8300: 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74 ocated by Format
8310: 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 Message */.
8320: 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 osLocalFree(zTe
8330: 6d 70 57 69 64 65 29 3b 0a 20 20 20 20 7d 0a 2f mpWide);. }./
8340: 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 * isNT() is 1 if
8350: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 SQLITE_OS_WINCE
8360: 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 ==1, so this els
8370: 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 e is never execu
8380: 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 ted. .** Since t
8390: 68 65 20 41 4e 53 49 20 76 65 72 73 69 6f 6e 20 he ANSI version
83a0: 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73 of these Windows
83b0: 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 API do not exis
83c0: 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 t for WINCE,.**
83d0: 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 it's important t
83e0: 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20 o not reference
83f0: 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 them for WINCE b
8400: 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 uilds..*/.#if SQ
8410: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 LITE_OS_WINCE==0
8420: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 . }else{. ch
8430: 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c ar *zTemp = NULL
8440: 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 ;. dwLen = os
8450: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 28 46 FormatMessageA(F
8460: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c ORMAT_MESSAGE_AL
8470: 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a LOCATE_BUFFER |.
8480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8490: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 FOR
84a0: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d MAT_MESSAGE_FROM
84b0: 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 _SYSTEM |.
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
84d0: 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 FORMAT_ME
84e0: 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 SSAGE_IGNORE_INS
84f0: 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 ERTS,.
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8510: 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 NULL,.
8520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8530: 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c lastErrno,
8540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
8550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0,
8560: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
8570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4c (L
8580: 50 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20 PSTR) &zTemp,.
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 20 20 20 20 30 2c 0a 20 20 0,.
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
85c0: 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20 0);.
85d0: 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 if( dwLen > 0
85e0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c ){. /* all
85f0: 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61 ocate a buffer a
8600: 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 nd convert to UT
8610: 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 F8 */. sqli
8620: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 te3BeginBenignMa
8630: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f lloc();. zO
8640: 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e ut = sqlite3_win
8650: 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 32_mbcs_to_utf8(
8660: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 zTemp);. sq
8670: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 lite3EndBenignMa
8680: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 2f 2a lloc();. /*
8690: 20 66 72 65 65 20 74 68 65 20 73 79 73 74 65 6d free the system
86a0: 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 buffer allocate
86b0: 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 d by FormatMessa
86c0: 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f ge */. osLo
86d0: 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a calFree(zTemp);.
86e0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d }.#endif. }
86f0: 0a 20 20 69 66 28 20 30 20 3d 3d 20 64 77 4c 65 . if( 0 == dwLe
8700: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 n ){. sqlite3
8710: 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 _snprintf(nBuf,
8720: 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f 72 20 30 zBuf, "OsError 0
8730: 78 25 78 20 28 25 75 29 22 2c 20 6c 61 73 74 45 x%x (%u)", lastE
8740: 72 72 6e 6f 2c 20 6c 61 73 74 45 72 72 6e 6f 29 rrno, lastErrno)
8750: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f ;. }else{. /
8760: 2a 20 63 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d * copy a maximum
8770: 20 6f 66 20 6e 42 75 66 20 63 68 61 72 73 20 74 of nBuf chars t
8780: 6f 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 o output buffer
8790: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 */. sqlite3_s
87a0: 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 nprintf(nBuf, zB
87b0: 75 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b uf, "%s", zOut);
87c0: 0a 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 . /* free the
87d0: 20 55 54 46 38 20 62 75 66 66 65 72 20 2a 2f 0a UTF8 buffer */.
87e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 sqlite3_free
87f0: 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65 (zOut);. }. re
8800: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a turn 0;.}../*.**
8810: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f .** This functio
8820: 6e 20 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 n - winLogErrorA
8830: 74 4c 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c tLine() - is onl
8840: 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 y ever called vi
8850: 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 77 a the macro.** w
8860: 69 6e 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a inLogError()..**
8870: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 .** This routine
8880: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 is invoked afte
8890: 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 r an error occur
88a0: 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 s in an OS funct
88b0: 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 20 ion..** It logs
88c0: 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 a message using
88d0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f sqlite3_log() co
88e0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 ntaining the cur
88f0: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a rent value of.**
8900: 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c error code and,
8910: 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 if possible, th
8920: 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 e human-readable
8930: 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d equivalent from
8940: 20 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 .** FormatMessa
8950: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 ge..**.** The fi
8960: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 rst argument pas
8970: 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f sed to the macro
8980: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 should be the e
8990: 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a rror code that.*
89a0: 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e * will be return
89b0: 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e ed to SQLite (e.
89c0: 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f g. SQLITE_IOERR_
89d0: 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 DELETE, SQLITE_C
89e0: 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 ANTOPEN). .** Th
89f0: 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 e two subsequent
8a00: 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c arguments shoul
8a10: 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 d be the name of
8a20: 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e the OS function
8a30: 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 that.** failed
8a40: 61 6e 64 20 74 68 65 20 74 68 65 20 61 73 73 6f and the the asso
8a50: 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74 ciated file-syst
8a60: 65 6d 20 70 61 74 68 2c 20 69 66 20 61 6e 79 2e em path, if any.
8a70: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c .*/.#define winL
8a80: 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29 ogError(a,b,c,d)
8a90: 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 winLogErrorAt
8aa0: 4c 69 6e 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c Line(a,b,c,d,__L
8ab0: 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e INE__).static in
8ac0: 74 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c t winLogErrorAtL
8ad0: 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f ine(. int errco
8ae0: 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 de,
8af0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 /* SQLite
8b00: 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 error code */.
8b10: 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f DWORD lastErrno
8b20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
8b30: 20 2f 2a 20 57 69 6e 33 32 20 6c 61 73 74 20 65 /* Win32 last e
8b40: 72 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 rror */. const
8b50: 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 char *zFunc,
8b60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d /* Nam
8b70: 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e e of OS function
8b80: 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a that failed */.
8b90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 const char *zP
8ba0: 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 ath,
8bb0: 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61 /* File path a
8bc0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 ssociated with e
8bd0: 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c rror */. int iL
8be0: 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20 ine
8bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 /* Sou
8c00: 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 rce line number
8c10: 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75 where error occu
8c20: 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 rred */.){. cha
8c30: 72 20 7a 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20 r zMsg[500];
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
8c50: 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 65 Human readable e
8c60: 72 72 6f 72 20 74 65 78 74 20 2a 2f 0a 20 20 69 rror text */. i
8c70: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 nt i;
8c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
8c90: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a * Loop counter *
8ca0: 2f 0a 0a 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 /.. zMsg[0] = 0
8cb0: 3b 0a 20 20 67 65 74 4c 61 73 74 45 72 72 6f 72 ;. getLastError
8cc0: 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73 Msg(lastErrno, s
8cd0: 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 izeof(zMsg), zMs
8ce0: 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 72 g);. assert( er
8cf0: 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b rcode!=SQLITE_OK
8d00: 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d );. if( zPath=
8d10: 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b =0 ) zPath = "";
8d20: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67 . for(i=0; zMsg
8d30: 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d [i] && zMsg[i]!=
8d40: 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21 '\r' && zMsg[i]!
8d50: 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 ='\n'; i++){}.
8d60: 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 zMsg[i] = 0;. s
8d70: 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f qlite3_log(errco
8d80: 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77 69 de,. "os_wi
8d90: 6e 2e 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28 n.c:%d: (%d) %s(
8da0: 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 %s) - %s",.
8db0: 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e iLine, lastErrn
8dc0: 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c o, zFunc, zPath,
8dd0: 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65 zMsg. );.. re
8de0: 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a turn errcode;.}.
8df0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 ./*.** The numbe
8e00: 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 r of times that
8e10: 61 20 52 65 61 64 46 69 6c 65 28 29 2c 20 57 72 a ReadFile(), Wr
8e20: 69 74 65 46 69 6c 65 28 29 2c 20 61 6e 64 20 44 iteFile(), and D
8e30: 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77 eleteFile().** w
8e40: 69 6c 6c 20 62 65 20 72 65 74 72 69 65 64 20 66 ill be retried f
8e50: 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69 ollowing a locki
8e60: 6e 67 20 65 72 72 6f 72 20 2d 20 70 72 6f 62 61 ng error - proba
8e70: 62 6c 79 20 63 61 75 73 65 64 20 62 79 20 0a 2a bly caused by .*
8e80: 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f 66 74 * antivirus soft
8e90: 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68 65 20 ware. Also the
8ea0: 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20 62 65 initial delay be
8eb0: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 72 fore the first r
8ec0: 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c etry..** The del
8ed0: 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c 69 6e ay increases lin
8ee0: 65 61 72 6c 79 20 77 69 74 68 20 65 61 63 68 20 early with each
8ef0: 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 retry..*/.#ifnde
8f00: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 f SQLITE_WIN32_I
8f10: 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64 65 66 OERR_RETRY.# def
8f20: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 ine SQLITE_WIN32
8f30: 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31 30 0a _IOERR_RETRY 10.
8f40: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 #endif.#ifndef S
8f50: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 QLITE_WIN32_IOER
8f60: 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a 23 20 R_RETRY_DELAY.#
8f70: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 define SQLITE_WI
8f80: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f N32_IOERR_RETRY_
8f90: 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69 66 0a DELAY 25.#endif.
8fa0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32 static int win32
8fb0: 49 6f 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c IoerrRetry = SQL
8fc0: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f ITE_WIN32_IOERR_
8fd0: 52 45 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e RETRY;.static in
8fe0: 74 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 t win32IoerrRetr
8ff0: 79 44 65 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f yDelay = SQLITE_
9000: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 WIN32_IOERR_RETR
9010: 59 5f 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 Y_DELAY;../*.**
9020: 49 66 20 61 20 52 65 61 64 46 69 6c 65 28 29 20 If a ReadFile()
9030: 6f 72 20 57 72 69 74 65 46 69 6c 65 28 29 20 65 or WriteFile() e
9040: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 69 6e 76 rror occurs, inv
9050: 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 oke this routine
9060: 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 69 74 .** to see if it
9070: 20 73 68 6f 75 6c 64 20 62 65 20 72 65 74 72 69 should be retri
9080: 65 64 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 ed. Return TRUE
9090: 20 74 6f 20 72 65 74 72 79 2e 20 20 52 65 74 75 to retry. Retu
90a0: 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 74 6f 20 67 rn FALSE.** to g
90b0: 69 76 65 20 75 70 20 77 69 74 68 20 61 6e 20 65 ive up with an e
90c0: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 rror..*/.static
90d0: 69 6e 74 20 72 65 74 72 79 49 6f 65 72 72 28 69 int retryIoerr(i
90e0: 6e 74 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f nt *pnRetry, DWO
90f0: 52 44 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44 RD *pError){. D
9100: 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61 WORD e = osGetLa
9110: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 stError();. if(
9120: 20 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e 33 32 *pnRetry>=win32
9130: 49 6f 65 72 72 52 65 74 72 79 20 29 7b 0a 20 20 IoerrRetry ){.
9140: 20 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a if( pError ){.
9150: 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 *pError =
9160: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 e;. }. ret
9170: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 urn 0;. }. if(
9180: 20 65 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53 53 e==ERROR_ACCESS
9190: 5f 44 45 4e 49 45 44 20 7c 7c 0a 20 20 20 20 20 _DENIED ||.
91a0: 20 65 3d 3d 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56 e==ERROR_LOCK_V
91b0: 49 4f 4c 41 54 49 4f 4e 20 7c 7c 0a 20 20 20 20 IOLATION ||.
91c0: 20 20 65 3d 3d 45 52 52 4f 52 5f 53 48 41 52 49 e==ERROR_SHARI
91d0: 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 20 29 7b 0a NG_VIOLATION ){.
91e0: 20 20 20 20 6f 73 53 6c 65 65 70 28 77 69 6e 33 osSleep(win3
91f0: 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2IoerrRetryDelay
9200: 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a *(1+*pnRetry));.
9210: 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a ++*pnRetry;.
9220: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 return 1;.
9230: 7d 0a 20 20 69 66 28 20 70 45 72 72 6f 72 20 29 }. if( pError )
9240: 7b 0a 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 {. *pError =
9250: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 e;. }. return
9260: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67 20 0;.}../*.** Log
9270: 61 20 49 2f 4f 20 65 72 72 6f 72 20 72 65 74 72 a I/O error retr
9280: 79 20 65 70 69 73 6f 64 65 2e 0a 2a 2f 0a 73 74 y episode..*/.st
9290: 61 74 69 63 20 76 6f 69 64 20 6c 6f 67 49 6f 65 atic void logIoe
92a0: 72 72 28 69 6e 74 20 6e 52 65 74 72 79 29 7b 0a rr(int nRetry){.
92b0: 20 20 69 66 28 20 6e 52 65 74 72 79 20 29 7b 0a if( nRetry ){.
92c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 sqlite3_log(
92d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 0a 20 SQLITE_IOERR, .
92e0: 20 20 20 20 20 22 64 65 6c 61 79 65 64 20 25 64 "delayed %d
92f0: 6d 73 20 66 6f 72 20 6c 6f 63 6b 2f 73 68 61 72 ms for lock/shar
9300: 69 6e 67 20 63 6f 6e 66 6c 69 63 74 22 2c 0a 20 ing conflict",.
9310: 20 20 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52 win32IoerrR
9320: 65 74 72 79 44 65 6c 61 79 2a 6e 52 65 74 72 79 etryDelay*nRetry
9330: 2a 28 6e 52 65 74 72 79 2b 31 29 2f 32 0a 20 20 *(nRetry+1)/2.
9340: 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 );. }.}..#if
9350: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a SQLITE_OS_WINCE.
9360: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /***************
9370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
9380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
9390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
93a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 **********.** Th
93b0: 69 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e 74 61 is section conta
93c0: 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 57 69 6e ins code for Win
93d0: 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 2f 2a 0a 2a CE only..*/./*.*
93e0: 2a 20 57 69 6e 64 6f 77 73 20 43 45 20 64 6f 65 * Windows CE doe
93f0: 73 20 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f 63 s not have a loc
9400: 61 6c 74 69 6d 65 28 29 20 66 75 6e 63 74 69 6f altime() functio
9410: 6e 2e 20 20 53 6f 20 63 72 65 61 74 65 20 61 0a n. So create a.
9420: 2a 2a 20 73 75 62 73 74 69 74 75 74 65 2e 0a 2a ** substitute..*
9430: 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 /.#include <time
9440: 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a 5f .h>.struct tm *_
9450: 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d 65 _cdecl localtime
9460: 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a 74 (const time_t *t
9470: 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72 ).{. static str
9480: 75 63 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c 45 uct tm y;. FILE
9490: 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20 TIME uTm, lTm;.
94a0: 20 53 59 53 54 45 4d 54 49 4d 45 20 70 54 6d 3b SYSTEMTIME pTm;
94b0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 . sqlite3_int64
94c0: 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a 74 t64;. t64 = *t
94d0: 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34 20 2b ;. t64 = (t64 +
94e0: 20 31 31 36 34 34 34 37 33 36 30 30 29 2a 31 30 11644473600)*10
94f0: 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64 77 000000;. uTm.dw
9500: 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20 28 44 LowDateTime = (D
9510: 57 4f 52 44 29 28 74 36 34 20 26 20 30 78 46 46 WORD)(t64 & 0xFF
9520: 46 46 46 46 46 46 29 3b 0a 20 20 75 54 6d 2e 64 FFFFFF);. uTm.d
9530: 77 48 69 67 68 44 61 74 65 54 69 6d 65 3d 20 28 wHighDateTime= (
9540: 44 57 4f 52 44 29 28 74 36 34 20 3e 3e 20 33 32 DWORD)(t64 >> 32
9550: 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 54 );. osFileTimeT
9560: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28 26 oLocalFileTime(&
9570: 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20 6f 73 46 uTm,&lTm);. osF
9580: 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 ileTimeToSystemT
9590: 69 6d 65 28 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a ime(&lTm,&pTm);.
95a0: 20 20 79 2e 74 6d 5f 79 65 61 72 20 3d 20 70 54 y.tm_year = pT
95b0: 6d 2e 77 59 65 61 72 20 2d 20 31 39 30 30 3b 0a m.wYear - 1900;.
95c0: 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d y.tm_mon = pTm
95d0: 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20 20 79 .wMonth - 1;. y
95e0: 2e 74 6d 5f 77 64 61 79 20 3d 20 70 54 6d 2e 77 .tm_wday = pTm.w
95f0: 44 61 79 4f 66 57 65 65 6b 3b 0a 20 20 79 2e 74 DayOfWeek;. y.t
9600: 6d 5f 6d 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 m_mday = pTm.wDa
9610: 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75 72 20 3d y;. y.tm_hour =
9620: 20 70 54 6d 2e 77 48 6f 75 72 3b 0a 20 20 79 2e pTm.wHour;. y.
9630: 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d 69 tm_min = pTm.wMi
9640: 6e 75 74 65 3b 0a 20 20 79 2e 74 6d 5f 73 65 63 nute;. y.tm_sec
9650: 20 3d 20 70 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a = pTm.wSecond;.
9660: 20 20 72 65 74 75 72 6e 20 26 79 3b 0a 7d 0a 0a return &y;.}..
9670: 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f 54 #define HANDLE_T
9680: 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28 77 69 O_WINFILE(a) (wi
9690: 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72 2a 29 nFile*)&((char*)
96a0: 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65 74 6f a)[-(int)offseto
96b0: 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f f(winFile,h)]../
96c0: 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 6c *.** Acquire a l
96d0: 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64 6c ock on the handl
96e0: 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f e h.*/.static vo
96f0: 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 id winceMutexAcq
9700: 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29 7b 0a uire(HANDLE h){.
9710: 20 20 20 44 57 4f 52 44 20 64 77 45 72 72 3b 0a DWORD dwErr;.
9720: 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64 77 45 do {. dwE
9730: 72 72 20 3d 20 57 61 69 74 46 6f 72 53 69 6e 67 rr = WaitForSing
9740: 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e 46 49 leObject(h, INFI
9750: 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77 68 69 6c NITE);. } whil
9760: 65 20 28 64 77 45 72 72 20 21 3d 20 57 41 49 54 e (dwErr != WAIT
9770: 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20 64 77 45 _OBJECT_0 && dwE
9780: 72 72 20 21 3d 20 57 41 49 54 5f 41 42 41 4e 44 rr != WAIT_ABAND
9790: 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 ONED);.}./*.** R
97a0: 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20 61 63 elease a lock ac
97b0: 71 75 69 72 65 64 20 62 79 20 77 69 6e 63 65 4d quired by winceM
97c0: 75 74 65 78 41 63 71 75 69 72 65 28 29 0a 2a 2f utexAcquire().*/
97d0: 0a 23 64 65 66 69 6e 65 20 77 69 6e 63 65 4d 75 .#define winceMu
97e0: 74 65 78 52 65 6c 65 61 73 65 28 68 29 20 52 65 texRelease(h) Re
97f0: 6c 65 61 73 65 4d 75 74 65 78 28 68 29 0a 0a 2f leaseMutex(h)../
9800: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 *.** Create the
9810: 6d 75 74 65 78 20 61 6e 64 20 73 68 61 72 65 64 mutex and shared
9820: 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 66 6f 72 memory used for
9830: 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 65 20 locking in the
9840: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 file.** descript
9850: 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 or pFile.*/.stat
9860: 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 43 72 65 ic BOOL winceCre
9870: 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68 ateLock(const ch
9880: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 77 ar *zFilename, w
9890: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a inFile *pFile){.
98a0: 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b 3b 0a 20 LPWSTR zTok;.
98b0: 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65 3b 0a 20 LPWSTR zName;.
98c0: 20 42 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 BOOL bInit = TR
98d0: 55 45 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 75 UE;.. zName = u
98e0: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 tf8ToUnicode(zFi
98f0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a lename);. if( z
9900: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f Name==0 ){. /
9910: 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 * out of memory
9920: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41 */. return FA
9930: 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 LSE;. }.. /* I
9940: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f nitialize the lo
9950: 63 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a cal lockdata */.
9960: 20 20 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d memset(&pFile-
9970: 3e 6c 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f >local, 0, sizeo
9980: 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 f(pFile->local))
9990: 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 ;.. /* Replace
99a0: 74 68 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20 the backslashes
99b0: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d from the filenam
99c0: 65 20 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 e and lowercase
99d0: 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 it. ** to deriv
99e0: 65 20 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 e a mutex name.
99f0: 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 */. zTok = osCh
9a00: 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b arLowerW(zName);
9a10: 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a . for (;*zTok;z
9a20: 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 Tok++){. if (
9a30: 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a *zTok == '\\') *
9a40: 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a zTok = '_';. }.
9a50: 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 . /* Create/ope
9a60: 6e 20 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 n the named mute
9a70: 78 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d x */. pFile->hM
9a80: 75 74 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d utex = osCreateM
9a90: 75 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 utexW(NULL, FALS
9aa0: 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 E, zName);. if
9ab0: 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 (!pFile->hMutex)
9ac0: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 {. pFile->las
9ad0: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 tErrno = osGetLa
9ae0: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 77 stError();. w
9af0: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 inLogError(SQLIT
9b00: 45 5f 45 52 52 4f 52 2c 20 70 46 69 6c 65 2d 3e E_ERROR, pFile->
9b10: 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 63 lastErrno, "winc
9b20: 65 43 72 65 61 74 65 4c 6f 63 6b 31 22 2c 20 7a eCreateLock1", z
9b30: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 73 Filename);. s
9b40: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d qlite3_free(zNam
9b50: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 e);. return F
9b60: 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 ALSE;. }.. /*
9b70: 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 Acquire the mute
9b80: 78 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 x before continu
9b90: 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75 ing */. winceMu
9ba0: 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 texAcquire(pFile
9bb0: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 0a 20 20 ->hMutex);. .
9bc0: 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 6e 61 6d /* Since the nam
9bd0: 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74 65 es of named mute
9be0: 78 65 73 2c 20 73 65 6d 61 70 68 6f 72 65 73 2c xes, semaphores,
9bf0: 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 73 20 65 file mappings e
9c00: 74 63 20 61 72 65 20 0a 20 20 2a 2a 20 63 61 73 tc are . ** cas
9c10: 65 2d 73 65 6e 73 69 74 69 76 65 2c 20 74 61 6b e-sensitive, tak
9c20: 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 e advantage of t
9c30: 68 61 74 20 62 79 20 75 70 70 65 72 63 61 73 69 hat by uppercasi
9c40: 6e 67 20 74 68 65 20 6d 75 74 65 78 20 6e 61 6d ng the mutex nam
9c50: 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69 6e 67 e. ** and using
9c60: 20 74 68 61 74 20 61 73 20 74 68 65 20 73 68 61 that as the sha
9c70: 72 65 64 20 66 69 6c 65 6d 61 70 70 69 6e 67 20 red filemapping
9c80: 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 6f 73 43 name.. */. osC
9c90: 68 61 72 55 70 70 65 72 57 28 7a 4e 61 6d 65 29 harUpperW(zName)
9ca0: 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 ;. pFile->hShar
9cb0: 65 64 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c ed = osCreateFil
9cc0: 65 4d 61 70 70 69 6e 67 57 28 49 4e 56 41 4c 49 eMappingW(INVALI
9cd0: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 2c 20 D_HANDLE_VALUE,
9ce0: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 NULL,.
9cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 PA
9d10: 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c GE_READWRITE, 0,
9d20: 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 sizeof(winceLoc
9d30: 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 k),.
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d zNam
9d60: 65 29 3b 20 20 0a 0a 20 20 2f 2a 20 53 65 74 20 e); .. /* Set
9d70: 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69 a flag that indi
9d80: 63 61 74 65 73 20 77 65 27 72 65 20 74 68 65 20 cates we're the
9d90: 66 69 72 73 74 20 74 6f 20 63 72 65 61 74 65 20 first to create
9da0: 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74 the memory so it
9db0: 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a . ** must be z
9dc0: 65 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20 ero-initialized
9dd0: 2a 2f 0a 20 20 69 66 20 28 6f 73 47 65 74 4c 61 */. if (osGetLa
9de0: 73 74 45 72 72 6f 72 28 29 20 3d 3d 20 45 52 52 stError() == ERR
9df0: 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58 49 53 54 OR_ALREADY_EXIST
9e00: 53 29 7b 0a 20 20 20 20 62 49 6e 69 74 20 3d 20 S){. bInit =
9e10: 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 FALSE;. }.. sq
9e20: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 lite3_free(zName
9e30: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 73 );.. /* If we s
9e40: 75 63 63 65 65 64 65 64 20 69 6e 20 6d 61 6b 69 ucceeded in maki
9e50: 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 ng the shared me
9e60: 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70 mory handle, map
9e70: 20 69 74 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 it. */. if (pF
9e80: 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 7b 0a 20 ile->hShared){.
9e90: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 pFile->shared
9ea0: 20 3d 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f = (winceLock*)o
9eb0: 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 sMapViewOfFile(p
9ec0: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 2c 20 0a File->hShared, .
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 49 4c FIL
9ee0: 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f E_MAP_READ|FILE_
9ef0: 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c MAP_WRITE, 0, 0,
9f00: 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 sizeof(winceLoc
9f10: 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d k));. /* If m
9f20: 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2c 20 63 apping failed, c
9f30: 6c 6f 73 65 20 74 68 65 20 73 68 61 72 65 64 20 lose the shared
9f40: 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e memory handle an
9f50: 64 20 65 72 61 73 65 20 69 74 20 2a 2f 0a 20 20 d erase it */.
9f60: 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 73 68 if (!pFile->sh
9f70: 61 72 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69 ared){. pFi
9f80: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 le->lastErrno =
9f90: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 osGetLastError()
9fa0: 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 ;. winLogEr
9fb0: 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 ror(SQLITE_ERROR
9fc0: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 , pFile->lastErr
9fd0: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 no,.
9fe0: 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c "winceCreateL
9ff0: 6f 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 ock2", zFilename
a000: 29 3b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 );. osClose
a010: 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 Handle(pFile->hS
a020: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 46 hared);. pF
a030: 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 4e ile->hShared = N
a040: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a ULL;. }. }..
a050: 20 20 2f 2a 20 49 66 20 73 68 61 72 65 64 20 6d /* If shared m
a060: 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20 emory could not
a070: 62 65 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e be created, then
a080: 20 63 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 close the mutex
a090: 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20 69 and fail */. i
a0a0: 66 20 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 f (pFile->hShare
a0b0: 64 20 3d 3d 20 4e 55 4c 4c 29 7b 0a 20 20 20 20 d == NULL){.
a0c0: 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 winceMutexReleas
a0d0: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 e(pFile->hMutex)
a0e0: 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e ;. osCloseHan
a0f0: 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 dle(pFile->hMute
a100: 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 x);. pFile->h
a110: 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 Mutex = NULL;.
a120: 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a return FALSE;.
a130: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 6e 69 74 }. . /* Init
a140: 69 61 6c 69 7a 65 20 74 68 65 20 73 68 61 72 65 ialize the share
a150: 64 20 6d 65 6d 6f 72 79 20 69 66 20 77 65 27 72 d memory if we'r
a160: 65 20 73 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f e supposed to */
a170: 0a 20 20 69 66 20 28 62 49 6e 69 74 29 20 7b 0a . if (bInit) {.
a180: 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 memset(pFile
a190: 2d 3e 73 68 61 72 65 64 2c 20 30 2c 20 73 69 7a ->shared, 0, siz
a1a0: 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b eof(winceLock));
a1b0: 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 . }.. winceMut
a1c0: 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d exRelease(pFile-
a1d0: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 >hMutex);. retu
a1e0: 72 6e 20 54 52 55 45 3b 0a 7d 0a 0a 2f 2a 0a 2a rn TRUE;.}../*.*
a1f0: 2a 20 44 65 73 74 72 6f 79 20 74 68 65 20 70 61 * Destroy the pa
a200: 72 74 20 6f 66 20 77 69 6e 46 69 6c 65 20 74 68 rt of winFile th
a210: 61 74 20 64 65 61 6c 73 20 77 69 74 68 20 77 69 at deals with wi
a220: 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61 nce locks.*/.sta
a230: 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 44 65 tic void winceDe
a240: 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46 69 6c stroyLock(winFil
a250: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66 20 e *pFile){. if
a260: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b (pFile->hMutex){
a270: 0a 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 . /* Acquire
a280: 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 the mutex */.
a290: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 winceMutexAcqui
a2a0: 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 re(pFile->hMutex
a2b0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 );.. /* The f
a2c0: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 73 20 ollowing blocks
a2d0: 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 should probably
a2e0: 61 73 73 65 72 74 20 69 6e 20 64 65 62 75 67 20 assert in debug
a2f0: 6d 6f 64 65 2c 20 62 75 74 20 74 68 65 79 0a 20 mode, but they.
a300: 20 20 20 20 20 20 61 72 65 20 74 6f 20 63 6c 65 are to cle
a310: 61 6e 75 70 20 69 6e 20 63 61 73 65 20 61 6e 79 anup in case any
a320: 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65 64 20 locks remained
a330: 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 open */. if (
a340: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 pFile->local.nRe
a350: 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 70 46 aders){. pF
a360: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 ile->shared->nRe
a370: 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a aders --;. }.
a380: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c if (pFile->l
a390: 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 7b ocal.bReserved){
a3a0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 . pFile->sh
a3b0: 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 ared->bReserved
a3c0: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 = FALSE;. }.
a3d0: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f if (pFile->lo
a3e0: 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 cal.bPending){.
a3f0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 pFile->shar
a400: 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 ed->bPending = F
a410: 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ALSE;. }.
a420: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c if (pFile->local
a430: 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 .bExclusive){.
a440: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 pFile->share
a450: 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 d->bExclusive =
a460: 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 FALSE;. }..
a470: 20 20 2f 2a 20 44 65 2d 72 65 66 65 72 65 6e 63 /* De-referenc
a480: 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75 72 20 e and close our
a490: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 68 61 72 copy of the shar
a4a0: 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 ed memory handle
a4b0: 20 2a 2f 0a 20 20 20 20 6f 73 55 6e 6d 61 70 56 */. osUnmapV
a4c0: 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d iewOfFile(pFile-
a4d0: 3e 73 68 61 72 65 64 29 3b 0a 20 20 20 20 6f 73 >shared);. os
a4e0: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c CloseHandle(pFil
a4f0: 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 0a 20 20 e->hShared);..
a500: 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74 68 20 74 /* Done with t
a510: 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 he mutex */.
a520: 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 winceMutexReleas
a530: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 e(pFile->hMutex)
a540: 3b 20 20 20 20 0a 20 20 20 20 6f 73 43 6c 6f 73 ; . osClos
a550: 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 eHandle(pFile->h
a560: 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c Mutex);. pFil
a570: 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c e->hMutex = NULL
a580: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 ;. }.}../* .**
a590: 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f An implementatio
a5a0: 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c n of the LockFil
a5b0: 65 28 29 20 41 50 49 20 6f 66 20 57 69 6e 64 6f e() API of Windo
a5c0: 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 ws for CE.*/.sta
a5d0: 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f tic BOOL winceLo
a5e0: 63 6b 46 69 6c 65 28 0a 20 20 48 41 4e 44 4c 45 ckFile(. HANDLE
a5f0: 20 2a 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 *phFile,. DWOR
a600: 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f D dwFileOffsetLo
a610: 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c w,. DWORD dwFil
a620: 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 eOffsetHigh,. D
a630: 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 WORD nNumberOfBy
a640: 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 tesToLockLow,.
a650: 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 DWORD nNumberOfB
a660: 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29 ytesToLockHigh.)
a670: 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 {. winFile *pFi
a680: 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 le = HANDLE_TO_W
a690: 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a INFILE(phFile);.
a6a0: 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d BOOL bReturn =
a6b0: 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 FALSE;.. UNUSE
a6c0: 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 D_PARAMETER(dwFi
a6d0: 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 leOffsetHigh);.
a6e0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 UNUSED_PARAMETE
a6f0: 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 R(nNumberOfBytes
a700: 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 ToLockHigh);..
a710: 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 if (!pFile->hMut
a720: 65 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b ex) return TRUE;
a730: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 . winceMutexAcq
a740: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 uire(pFile->hMut
a750: 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74 69 ex);.. /* Wanti
a760: 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 ng an exclusive
a770: 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20 28 64 lock? */. if (d
a780: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d wFileOffsetLow =
a790: 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f = (DWORD)SHARED_
a7a0: 46 49 52 53 54 0a 20 20 20 20 20 20 20 26 26 20 FIRST. &&
a7b0: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f nNumberOfBytesTo
a7c0: 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 LockLow == (DWOR
a7d0: 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a D)SHARED_SIZE){.
a7e0: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 if (pFile->s
a7f0: 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 hared->nReaders
a800: 3d 3d 20 30 20 26 26 20 70 46 69 6c 65 2d 3e 73 == 0 && pFile->s
a810: 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 hared->bExclusiv
a820: 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 20 e == 0){.
a830: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 pFile->shared->b
a840: 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45 Exclusive = TRUE
a850: 3b 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e ;. pFile->
a860: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 local.bExclusive
a870: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 = TRUE;.
a880: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a bReturn = TRUE;.
a890: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 }. }.. /*
a8a0: 57 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 Want a read-only
a8b0: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 lock? */. else
a8c0: 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 if (dwFileOffse
a8d0: 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 tLow == (DWORD)S
a8e0: 48 41 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20 HARED_FIRST &&.
a8f0: 20 20 20 20 20 20 20 20 20 20 6e 4e 75 6d 62 65 nNumbe
a900: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f rOfBytesToLockLo
a910: 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 w == 1){. if
a920: 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e (pFile->shared->
a930: 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 bExclusive == 0)
a940: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c {. pFile->l
a950: 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2b 2b ocal.nReaders ++
a960: 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c ;. if (pFil
a970: 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 e->local.nReader
a980: 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20 20 20 s == 1){.
a990: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e pFile->shared->
a9a0: 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 nReaders ++;.
a9b0: 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75 }. bRetu
a9c0: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d rn = TRUE;. }
a9d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 . }.. /* Want
a9e0: 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20 a pending lock?
a9f0: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 */. else if (dw
aa00: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d FileOffsetLow ==
aa10: 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f (DWORD)PENDING_
aa20: 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f BYTE && nNumberO
aa30: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 fBytesToLockLow
aa40: 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 == 1){. /* If
aa50: 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b no pending lock
aa60: 20 68 61 73 20 62 65 65 6e 20 61 63 71 75 69 72 has been acquir
aa70: 65 64 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 ed, then acquire
aa80: 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 it */. if (p
aa90: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 File->shared->bP
aaa0: 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 ending == 0) {.
aab0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 pFile->shar
aac0: 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 ed->bPending = T
aad0: 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 RUE;. pFile
aae0: 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 ->local.bPending
aaf0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 = TRUE;. b
ab00: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 Return = TRUE;.
ab10: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 }. }.. /* W
ab20: 61 6e 74 20 61 20 72 65 73 65 72 76 65 64 20 6c ant a reserved l
ab30: 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 ock? */. else i
ab40: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c f (dwFileOffsetL
ab50: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 ow == (DWORD)RES
ab60: 45 52 56 45 44 5f 42 59 54 45 20 26 26 20 6e 4e ERVED_BYTE && nN
ab70: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f umberOfBytesToLo
ab80: 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 ckLow == 1){.
ab90: 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 if (pFile->shar
aba0: 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 3d ed->bReserved ==
abb0: 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 0) {. pFil
abc0: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 e->shared->bRese
abd0: 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 rved = TRUE;.
abe0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e pFile->local.
abf0: 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 bReserved = TRUE
ac00: 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 ;. bReturn
ac10: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 = TRUE;. }.
ac20: 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 }.. winceMutexR
ac30: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d elease(pFile->hM
ac40: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 utex);. return
ac50: 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a bReturn;.}../*.*
ac60: 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 * An implementat
ac70: 69 6f 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f 63 ion of the Unloc
ac80: 6b 46 69 6c 65 20 41 50 49 20 6f 66 20 57 69 6e kFile API of Win
ac90: 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 dows for CE.*/.s
aca0: 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 tatic BOOL wince
acb0: 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 48 41 UnlockFile(. HA
acc0: 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a 20 20 NDLE *phFile,.
acd0: 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 DWORD dwFileOffs
ace0: 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 etLow,. DWORD d
acf0: 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c wFileOffsetHigh,
ad00: 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 . DWORD nNumber
ad10: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c OfBytesToUnlockL
ad20: 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d ow,. DWORD nNum
ad30: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f berOfBytesToUnlo
ad40: 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 ckHigh.){. winF
ad50: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e ile *pFile = HAN
ad60: 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 DLE_TO_WINFILE(p
ad70: 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 hFile);. BOOL b
ad80: 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a Return = FALSE;.
ad90: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 . UNUSED_PARAME
ada0: 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74 TER(dwFileOffset
adb0: 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f High);. UNUSED_
adc0: 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 PARAMETER(nNumbe
add0: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b rOfBytesToUnlock
ade0: 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 High);.. if (!p
adf0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 File->hMutex) re
ae00: 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e turn TRUE;. win
ae10: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 ceMutexAcquire(p
ae20: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a File->hMutex);..
ae30: 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 /* Releasing a
ae40: 20 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20 reader lock or
ae50: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 an exclusive loc
ae60: 6b 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c k */. if (dwFil
ae70: 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 eOffsetLow == (D
ae80: 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 WORD)SHARED_FIRS
ae90: 54 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 T){. /* Did w
aea0: 65 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 e have an exclus
aeb0: 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 ive lock? */.
aec0: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 if (pFile->loca
aed0: 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 l.bExclusive){.
aee0: 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d assert(nNum
aef0: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f berOfBytesToUnlo
af00: 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 ckLow == (DWORD)
af10: 53 48 41 52 45 44 5f 53 49 5a 45 29 3b 0a 20 20 SHARED_SIZE);.
af20: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c pFile->local
af30: 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 .bExclusive = FA
af40: 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 LSE;. pFile
af50: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 ->shared->bExclu
af60: 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 sive = FALSE;.
af70: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 bReturn = TR
af80: 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f UE;. }.. /
af90: 2a 20 44 69 64 20 77 65 20 6a 75 73 74 20 68 61 * Did we just ha
afa0: 76 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b ve a reader lock
afb0: 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 ? */. else if
afc0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e (pFile->local.n
afd0: 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 Readers){.
afe0: 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 assert(nNumberOf
aff0: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 BytesToUnlockLow
b000: 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 == (DWORD)SHARE
b010: 44 5f 53 49 5a 45 20 7c 7c 20 6e 4e 75 6d 62 65 D_SIZE || nNumbe
b020: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b rOfBytesToUnlock
b030: 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20 20 20 20 20 Low == 1);.
b040: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 pFile->local.nR
b050: 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 eaders --;.
b060: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 if (pFile->loca
b070: 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 29 l.nReaders == 0)
b080: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 . {.
b090: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e pFile->shared->
b0a0: 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 nReaders --;.
b0b0: 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75 }. bRetu
b0c0: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d rn = TRUE;. }
b0d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 . }.. /* Relea
b0e0: 73 69 6e 67 20 61 20 70 65 6e 64 69 6e 67 20 6c sing a pending l
b0f0: 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 ock */. else if
b100: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f (dwFileOffsetLo
b110: 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 w == (DWORD)PEND
b120: 49 4e 47 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d ING_BYTE && nNum
b130: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f berOfBytesToUnlo
b140: 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 ckLow == 1){.
b150: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 if (pFile->loca
b160: 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 l.bPending){.
b170: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e pFile->local.
b180: 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 bPending = FALSE
b190: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 ;. pFile->s
b1a0: 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 hared->bPending
b1b0: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 = FALSE;. b
b1c0: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 Return = TRUE;.
b1d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 }. }. /* Re
b1e0: 6c 65 61 73 69 6e 67 20 61 20 72 65 73 65 72 76 leasing a reserv
b1f0: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 ed lock */. els
b200: 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 e if (dwFileOffs
b210: 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 etLow == (DWORD)
b220: 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 26 26 RESERVED_BYTE &&
b230: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 nNumberOfBytesT
b240: 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 oUnlockLow == 1)
b250: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d {. if (pFile-
b260: 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 >local.bReserved
b270: 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d ) {. pFile-
b280: 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 >local.bReserved
b290: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 = FALSE;.
b2a0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 pFile->shared->b
b2b0: 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 Reserved = FALSE
b2c0: 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 ;. bReturn
b2d0: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 = TRUE;. }.
b2e0: 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 }.. winceMutexR
b2f0: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d elease(pFile->hM
b300: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 utex);. return
b310: 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a bReturn;.}../*.*
b320: 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 * An implementat
b330: 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 ion of the LockF
b340: 69 6c 65 45 78 28 29 20 41 50 49 20 6f 66 20 57 ileEx() API of W
b350: 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f indows for CE.*/
b360: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e .static BOOL win
b370: 63 65 4c 6f 63 6b 46 69 6c 65 45 78 28 0a 20 20 ceLockFileEx(.
b380: 48 41 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a HANDLE *phFile,.
b390: 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 2c DWORD dwFlags,
b3a0: 0a 20 20 44 57 4f 52 44 20 64 77 52 65 73 65 72 . DWORD dwReser
b3b0: 76 65 64 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 ved,. DWORD nNu
b3c0: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 mberOfBytesToLoc
b3d0: 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e kLow,. DWORD nN
b3e0: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f umberOfBytesToLo
b3f0: 63 6b 48 69 67 68 2c 0a 20 20 4c 50 4f 56 45 52 ckHigh,. LPOVER
b400: 4c 41 50 50 45 44 20 6c 70 4f 76 65 72 6c 61 70 LAPPED lpOverlap
b410: 70 65 64 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f ped.){. UNUSED_
b420: 50 41 52 41 4d 45 54 45 52 28 64 77 52 65 73 65 PARAMETER(dwRese
b430: 72 76 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f rved);. UNUSED_
b440: 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 PARAMETER(nNumbe
b450: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 rOfBytesToLockHi
b460: 67 68 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 gh);.. /* If th
b470: 65 20 63 61 6c 6c 65 72 20 77 61 6e 74 73 20 61 e caller wants a
b480: 20 73 68 61 72 65 64 20 72 65 61 64 20 6c 6f 63 shared read loc
b490: 6b 2c 20 66 6f 72 77 61 72 64 20 74 68 69 73 20 k, forward this
b4a0: 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 77 69 6e call. ** to win
b4b0: 63 65 4c 6f 63 6b 46 69 6c 65 20 2a 2f 0a 20 20 ceLockFile */.
b4c0: 69 66 20 28 6c 70 4f 76 65 72 6c 61 70 70 65 64 if (lpOverlapped
b4d0: 2d 3e 4f 66 66 73 65 74 20 3d 3d 20 28 44 57 4f ->Offset == (DWO
b4e0: 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 20 RD)SHARED_FIRST
b4f0: 26 26 0a 20 20 20 20 20 20 64 77 46 6c 61 67 73 &&. dwFlags
b500: 20 3d 3d 20 31 20 26 26 0a 20 20 20 20 20 20 6e == 1 &&. n
b510: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c NumberOfBytesToL
b520: 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 ockLow == (DWORD
b530: 29 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20 )SHARED_SIZE){.
b540: 20 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 4c return winceL
b550: 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20 ockFile(phFile,
b560: 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c SHARED_FIRST, 0,
b570: 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 1, 0);. }. re
b580: 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 2f 2a turn FALSE;.}./*
b590: 0a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 .** End of the s
b5a0: 70 65 63 69 61 6c 20 63 6f 64 65 20 66 6f 72 20 pecial code for
b5b0: 77 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a wince.**********
b5c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b5d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b5e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b5f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b600: 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 ***/.#endif /* S
b610: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a QLITE_OS_WINCE *
b620: 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /../************
b630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b670: 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 72 *.** The next gr
b680: 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 oup of routines
b690: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f implement the I/
b6a0: 4f 20 6d 65 74 68 6f 64 73 20 73 70 65 63 69 66 O methods specif
b6b0: 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 71 ied.** by the sq
b6c0: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 lite3_io_methods
b6d0: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a object..*******
b6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b720: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 *******/../*.**
b730: 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20 63 Some Microsoft c
b740: 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 ompilers lack th
b750: 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a is definition..*
b760: 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 /.#ifndef INVALI
b770: 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 D_SET_FILE_POINT
b780: 45 52 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41 ER.# define INVA
b790: 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 LID_SET_FILE_POI
b7a0: 4e 54 45 52 20 28 28 44 57 4f 52 44 29 2d 31 29 NTER ((DWORD)-1)
b7b0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d .#endif../*.** M
b7c0: 6f 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 ove the current
b7d0: 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 position of the
b7e0: 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 61 73 73 file handle pass
b7f0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 ed as the first
b800: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 .** argument to
b810: 6f 66 66 73 65 74 20 69 4f 66 66 73 65 74 20 77 offset iOffset w
b820: 69 74 68 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 ithin the file.
b830: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 If successful, r
b840: 65 74 75 72 6e 20 30 2e 20 0a 2a 2a 20 4f 74 68 eturn 0. .** Oth
b850: 65 72 77 69 73 65 2c 20 73 65 74 20 70 46 69 6c erwise, set pFil
b860: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 61 6e 64 e->lastErrno and
b870: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f return non-zero
b880: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 ..*/.static int
b890: 73 65 65 6b 57 69 6e 46 69 6c 65 28 77 69 6e 46 seekWinFile(winF
b8a0: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 ile *pFile, sqli
b8b0: 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 66 73 65 te3_int64 iOffse
b8c0: 74 29 7b 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 t){. LONG upper
b8d0: 42 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 Bits;
b8e0: 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69 /* Most si
b8f0: 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65 g. 32 bits of ne
b900: 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f w offset */. LO
b910: 4e 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 20 20 NG lowerBits;
b920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
b930: 20 4c 65 61 73 74 20 73 69 67 2e 20 33 32 20 62 Least sig. 32 b
b940: 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 its of new offse
b950: 74 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 52 t */. DWORD dwR
b960: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 et;
b970: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 /* Value
b980: 72 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46 returned by SetF
b990: 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a ilePointer() */.
b9a0: 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e DWORD lastErrn
b9b0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 o;
b9c0: 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 /* Value retur
b9d0: 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72 ned by GetLastEr
b9e0: 72 6f 72 28 29 20 2a 2f 0a 0a 20 20 75 70 70 65 ror() */.. uppe
b9f0: 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28 rBits = (LONG)((
ba00: 69 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 iOffset>>32) & 0
ba10: 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f x7fffffff);. lo
ba20: 77 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 werBits = (LONG)
ba30: 28 69 4f 66 66 73 65 74 20 26 20 30 78 66 66 66 (iOffset & 0xfff
ba40: 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50 fffff);.. /* AP
ba50: 49 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75 63 I oddity: If suc
ba60: 63 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c 65 cessful, SetFile
ba70: 50 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72 6e Pointer() return
ba80: 73 20 61 20 64 77 6f 72 64 20 0a 20 20 2a 2a 20 s a dword . **
ba90: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c containing the l
baa0: 6f 77 65 72 20 33 32 2d 62 69 74 73 20 6f 66 20 ower 32-bits of
bab0: 74 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66 the new file-off
bac0: 73 65 74 2e 20 4f 72 2c 20 69 66 20 69 74 20 66 set. Or, if it f
bad0: 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65 ails,. ** it re
bae0: 74 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45 turns INVALID_SE
baf0: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 T_FILE_POINTER.
bb00: 48 6f 77 65 76 65 72 20 61 63 63 6f 72 64 69 6e However accordin
bb10: 67 20 74 6f 20 4d 53 44 4e 2c 20 0a 20 20 2a 2a g to MSDN, . **
bb20: 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c INVALID_SET_FIL
bb30: 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c E_POINTER may al
bb40: 73 6f 20 62 65 20 61 20 76 61 6c 69 64 20 6e 65 so be a valid ne
bb50: 77 20 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f 20 w offset. So to
bb60: 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 determine . **
bb70: 77 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f 72 whether an error
bb80: 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f 63 has actually oc
bb90: 63 75 72 65 64 2c 20 69 74 20 69 73 20 61 6c 73 cured, it is als
bba0: 6f 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 63 o necessary to c
bbb0: 61 6c 6c 20 0a 20 20 2a 2a 20 47 65 74 4c 61 73 all . ** GetLas
bbc0: 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 tError().. */.
bbd0: 20 64 77 52 65 74 20 3d 20 6f 73 53 65 74 46 69 dwRet = osSetFi
bbe0: 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d lePointer(pFile-
bbf0: 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26 >h, lowerBits, &
bc00: 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f upperBits, FILE_
bc10: 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 20 28 BEGIN);.. if( (
bc20: 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 dwRet==INVALID_S
bc30: 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a ET_FILE_POINTER.
bc40: 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45 && ((lastE
bc50: 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 rrno = osGetLast
bc60: 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 Error())!=NO_ERR
bc70: 4f 52 29 29 20 29 7b 0a 20 20 20 20 70 46 69 6c OR)) ){. pFil
bc80: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c e->lastErrno = l
bc90: 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 astErrno;. wi
bca0: 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 nLogError(SQLITE
bcb0: 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 _IOERR_SEEK, pFi
bcc0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 le->lastErrno,.
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 22 73 65 65 "see
bce0: 6b 57 69 6e 46 69 6c 65 22 2c 20 70 46 69 6c 65 kWinFile", pFile
bcf0: 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65 ->zPath);. re
bd00: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 turn 1;. }.. r
bd10: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a eturn 0;.}../*.*
bd20: 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a * Close a file..
bd30: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72 65 70 6f **.** It is repo
bd40: 72 74 65 64 20 74 68 61 74 20 61 6e 20 61 74 74 rted that an att
bd50: 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20 61 20 empt to close a
bd60: 68 61 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d handle might som
bd70: 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 etimes.** fail.
bd80: 20 54 68 69 73 20 69 73 20 61 20 76 65 72 79 20 This is a very
bd90: 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72 65 73 unreasonable res
bda0: 75 6c 74 2c 20 62 75 74 20 57 69 6e 64 6f 77 73 ult, but Windows
bdb0: 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a is notorious.**
bdc0: 20 66 6f 72 20 62 65 69 6e 67 20 75 6e 72 65 61 for being unrea
bdd0: 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f 20 sonable so I do
bde0: 6e 6f 74 20 64 6f 75 62 74 20 74 68 61 74 20 69 not doubt that i
bdf0: 74 20 6d 69 67 68 74 20 68 61 70 70 65 6e 2e 20 t might happen.
be00: 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65 If.** the close
be10: 20 66 61 69 6c 73 2c 20 77 65 20 70 61 75 73 65 fails, we pause
be20: 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73 65 for 100 millise
be30: 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 61 67 conds and try ag
be40: 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 ain. As.** many
be50: 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 as MX_CLOSE_ATT
be60: 45 4d 50 54 20 61 74 74 65 6d 70 74 73 20 74 6f EMPT attempts to
be70: 20 63 6c 6f 73 65 20 74 68 65 20 68 61 6e 64 6c close the handl
be80: 65 20 61 72 65 20 6d 61 64 65 20 62 65 66 6f 72 e are made befor
be90: 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75 70 20 61 e.** giving up a
bea0: 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 nd returning an
beb0: 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e error..*/.#defin
bec0: 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d e MX_CLOSE_ATTEM
bed0: 50 54 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20 PT 3.static int
bee0: 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 winClose(sqlite3
bef0: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e _file *id){. in
bf00: 74 20 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 t rc, cnt = 0;.
bf10: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 winFile *pFile
bf20: 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a = (winFile*)id;.
bf30: 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 . assert( id!=0
bf40: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 );. assert( pF
bf50: 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a ile->pShm==0 );.
bf60: 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 OSTRACE(("CLOS
bf70: 45 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e E %d\n", pFile->
bf80: 68 29 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 72 h));. do{. r
bf90: 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c c = osCloseHandl
bfa0: 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 e(pFile->h);.
bfb0: 20 2f 2a 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 /* SimulateIOEr
bfc0: 72 6f 72 28 20 72 63 3d 30 3b 20 63 6e 74 3d 4d ror( rc=0; cnt=M
bfd0: 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 3b X_CLOSE_ATTEMPT;
bfe0: 20 29 3b 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 ); */. }while(
bff0: 20 72 63 3d 3d 30 20 26 26 20 2b 2b 63 6e 74 20 rc==0 && ++cnt
c000: 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d < MX_CLOSE_ATTEM
c010: 50 54 20 26 26 20 28 6f 73 53 6c 65 65 70 28 31 PT && (osSleep(1
c020: 30 30 29 2c 20 31 29 20 29 3b 0a 23 69 66 20 53 00), 1) );.#if S
c030: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23 QLITE_OS_WINCE.#
c040: 64 65 66 69 6e 65 20 57 49 4e 43 45 5f 44 45 4c define WINCE_DEL
c050: 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33 ETION_ATTEMPTS 3
c060: 0a 20 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c . winceDestroyL
c070: 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 ock(pFile);. if
c080: 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 ( pFile->zDelete
c090: 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20 20 69 OnClose ){. i
c0a0: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 nt cnt = 0;.
c0b0: 77 68 69 6c 65 28 0a 20 20 20 20 20 20 20 20 20 while(.
c0c0: 20 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28 osDeleteFileW(
c0d0: 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e pFile->zDeleteOn
c0e0: 43 6c 6f 73 65 29 3d 3d 30 0a 20 20 20 20 20 20 Close)==0.
c0f0: 20 20 26 26 20 6f 73 47 65 74 46 69 6c 65 41 74 && osGetFileAt
c100: 74 72 69 62 75 74 65 73 57 28 70 46 69 6c 65 2d tributesW(pFile-
c110: 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 >zDeleteOnClose)
c120: 21 3d 30 78 66 66 66 66 66 66 66 66 20 0a 20 20 !=0xffffffff .
c130: 20 20 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c && cnt++ <
c140: 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f WINCE_DELETION_
c150: 41 54 54 45 4d 50 54 53 0a 20 20 20 20 29 7b 0a ATTEMPTS. ){.
c160: 20 20 20 20 20 20 20 6f 73 53 6c 65 65 70 28 31 osSleep(1
c170: 30 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61 20 00); /* Wait a
c180: 6c 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74 72 little before tr
c190: 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20 20 ying again */.
c1a0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f }. sqlite3_
c1b0: 66 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65 6c free(pFile->zDel
c1c0: 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d eteOnClose);. }
c1d0: 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 .#endif. OSTRAC
c1e0: 45 28 28 22 43 4c 4f 53 45 20 25 64 20 25 73 5c E(("CLOSE %d %s\
c1f0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 n", pFile->h, rc
c200: 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 ? "ok" : "faile
c210: 64 22 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e d"));. OpenCoun
c220: 74 65 72 28 2d 31 29 3b 0a 20 20 72 65 74 75 72 ter(-1);. retur
c230: 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b n rc ? SQLITE_OK
c240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 77 . : w
c250: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 inLogError(SQLIT
c260: 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 6f E_IOERR_CLOSE, o
c270: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c sGetLastError(),
c280: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
c290: 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 43 "winC
c2a0: 6c 6f 73 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 lose", pFile->zP
c2b0: 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 ath);.}../*.** R
c2c0: 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 ead data from a
c2d0: 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 file into a buff
c2e0: 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 er. Return SQLI
c2f0: 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 TE_OK if all.**
c300: 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20 bytes were read
c310: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 successfully and
c320: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 SQLITE_IOERR if
c330: 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a anything goes.*
c340: 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 * wrong..*/.stat
c350: 69 63 20 69 6e 74 20 77 69 6e 52 65 61 64 28 0a ic int winRead(.
c360: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a sqlite3_file *
c370: 69 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 id, /*
c380: 46 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f File to read fro
c390: 6d 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 m */. void *pBu
c3a0: 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 f,
c3b0: 20 20 2f 2a 20 57 72 69 74 65 20 63 6f 6e 74 65 /* Write conte
c3c0: 6e 74 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 nt into this buf
c3d0: 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 fer */. int amt
c3e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
c3f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 /* Number of
c400: 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a bytes to read *
c410: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 /. sqlite3_int6
c420: 34 20 6f 66 66 73 65 74 20 20 20 20 20 20 20 2f 4 offset /
c430: 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 * Begin reading
c440: 61 74 20 74 68 69 73 20 6f 66 66 73 65 74 20 2a at this offset *
c450: 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a /.){. winFile *
c460: 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 pFile = (winFile
c470: 2a 29 69 64 3b 20 20 2f 2a 20 66 69 6c 65 20 68 *)id; /* file h
c480: 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 57 4f 52 44 andle */. DWORD
c490: 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20 20 nRead;
c4a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 /* Nu
c4b0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 mber of bytes ac
c4c0: 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d tually read from
c4d0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e file */. int n
c4e0: 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20 Retry = 0;
c4f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 /* Nu
c500: 6d 62 65 72 20 6f 66 20 72 65 74 72 79 73 20 2a mber of retrys *
c510: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 /.. assert( id!
c520: 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 =0 );. Simulate
c530: 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 IOError(return S
c540: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 QLITE_IOERR_READ
c550: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 );. OSTRACE(("R
c560: 45 41 44 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e EAD %d lock=%d\n
c570: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 ", pFile->h, pFi
c580: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a le->locktype));.
c590: 0a 20 20 69 66 28 20 73 65 65 6b 57 69 6e 46 69 . if( seekWinFi
c5a0: 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 le(pFile, offset
c5b0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 ) ){. return
c5c0: 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d SQLITE_FULL;. }
c5d0: 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52 65 61 . while( !osRea
c5e0: 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 dFile(pFile->h,
c5f0: 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 pBuf, amt, &nRea
c600: 64 2c 20 30 29 20 29 7b 0a 20 20 20 20 44 57 4f d, 0) ){. DWO
c610: 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 RD lastErrno;.
c620: 20 20 69 66 28 20 72 65 74 72 79 49 6f 65 72 72 if( retryIoerr
c630: 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45 (&nRetry, &lastE
c640: 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 rrno) ) continue
c650: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 ;. pFile->las
c660: 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 tErrno = lastErr
c670: 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 no;. return w
c680: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 inLogError(SQLIT
c690: 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c 20 70 46 E_IOERR_READ, pF
c6a0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a ile->lastErrno,.
c6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 "wi
c6c0: 6e 52 65 61 64 22 2c 20 70 46 69 6c 65 2d 3e 7a nRead", pFile->z
c6d0: 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 6c 6f 67 Path);. }. log
c6e0: 49 6f 65 72 72 28 6e 52 65 74 72 79 29 3b 0a 20 Ioerr(nRetry);.
c6f0: 20 69 66 28 20 6e 52 65 61 64 3c 28 44 57 4f 52 if( nRead<(DWOR
c700: 44 29 61 6d 74 20 29 7b 0a 20 20 20 20 2f 2a 20 D)amt ){. /*
c710: 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20 Unread parts of
c720: 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 the buffer must
c730: 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a be zero-filled *
c740: 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 /. memset(&((
c750: 63 68 61 72 2a 29 70 42 75 66 29 5b 6e 52 65 61 char*)pBuf)[nRea
c760: 64 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52 65 61 64 d], 0, amt-nRead
c770: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 );. return SQ
c780: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 LITE_IOERR_SHORT
c790: 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 _READ;. }.. re
c7a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a turn SQLITE_OK;.
c7b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 }../*.** Write d
c7c0: 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 ata from a buffe
c7d0: 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 r into a file.
c7e0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b Return SQLITE_OK
c7f0: 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f on success.** o
c800: 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 r some other err
c810: 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 or code on failu
c820: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e re..*/.static in
c830: 74 20 77 69 6e 57 72 69 74 65 28 0a 20 20 73 71 t winWrite(. sq
c840: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 lite3_file *id,
c850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
c860: 20 46 69 6c 65 20 74 6f 20 77 72 69 74 65 20 69 File to write i
c870: 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 nto */. const v
c880: 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 oid *pBuf,
c890: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 /* The
c8a0: 62 79 74 65 73 20 74 6f 20 62 65 20 77 72 69 74 bytes to be writ
c8b0: 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 ten */. int amt
c8c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
c8d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 /* Numb
c8e0: 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77 er of bytes to w
c8f0: 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 rite */. sqlite
c900: 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20 3_int64 offset
c910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 /* Off
c920: 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c set into the fil
c930: 65 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69 e to begin writi
c940: 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e ng at */.){. in
c950: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 t rc;
c960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
c970: 20 54 72 75 65 20 69 66 20 65 72 72 6f 72 20 68 True if error h
c980: 61 73 20 6f 63 63 75 72 65 64 2c 20 65 6c 73 65 as occured, else
c990: 20 66 61 6c 73 65 20 2a 2f 0a 20 20 77 69 6e 46 false */. winF
c9a0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 ile *pFile = (wi
c9b0: 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 nFile*)id; /* F
c9c0: 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 ile handle */.
c9d0: 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 int nRetry = 0;
c9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c9f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 /* Number of ret
ca00: 72 69 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 ries */.. asser
ca10: 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 t( amt>0 );. as
ca20: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 sert( pFile );.
ca30: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 SimulateIOError
ca40: 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 (return SQLITE_I
ca50: 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a 20 20 53 OERR_WRITE);. S
ca60: 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 imulateDiskfullE
ca70: 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 rror(return SQLI
ca80: 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54 TE_FULL);.. OST
ca90: 52 41 43 45 28 28 22 57 52 49 54 45 20 25 64 20 RACE(("WRITE %d
caa0: 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c lock=%d\n", pFil
cab0: 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 e->h, pFile->loc
cac0: 6b 74 79 70 65 29 29 3b 0a 0a 20 20 72 63 20 3d ktype));.. rc =
cad0: 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70 46 69 seekWinFile(pFi
cae0: 6c 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 le, offset);. i
caf0: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 f( rc==0 ){.
cb00: 75 38 20 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a u8 *aRem = (u8 *
cb10: 29 70 42 75 66 3b 20 20 20 20 20 20 20 20 2f 2a )pBuf; /*
cb20: 20 44 61 74 61 20 79 65 74 20 74 6f 20 62 65 20 Data yet to be
cb30: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 written */. i
cb40: 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20 nt nRem = amt;
cb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
cb60: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 Number of bytes
cb70: 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 yet to be writte
cb80: 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e n */. DWORD n
cb90: 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 Write;
cba0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 /* Bytes
cbb0: 77 72 69 74 74 65 6e 20 62 79 20 65 61 63 68 20 written by each
cbc0: 57 72 69 74 65 46 69 6c 65 28 29 20 63 61 6c 6c WriteFile() call
cbd0: 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 */. DWORD la
cbe0: 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 stErrno = NO_ERR
cbf0: 4f 52 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 OR; /* Value r
cc00: 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61 eturned by GetLa
cc10: 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 20 20 stError() */..
cc20: 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 while( nRem>0
cc30: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 ){. if( !os
cc40: 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d WriteFile(pFile-
cc50: 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 >h, aRem, nRem,
cc60: 26 6e 57 72 69 74 65 2c 20 30 29 20 29 7b 0a 20 &nWrite, 0) ){.
cc70: 20 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79 if( retry
cc80: 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c 20 26 Ioerr(&nRetry, &
cc90: 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e lastErrno) ) con
cca0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 62 tinue;. b
ccb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 reak;. }.
ccc0: 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 3c 3d if( nWrite<=
ccd0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 0 ) break;.
cce0: 20 61 52 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b aRem += nWrite;
ccf0: 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e . nRem -= n
cd00: 57 72 69 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 Write;. }.
cd10: 20 69 66 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 if( nRem>0 ){.
cd20: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 pFile->last
cd30: 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e Errno = lastErrn
cd40: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b o;. rc = 1;
cd50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 . }. }.. if
cd60: 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 ( rc ){. if(
cd70: 20 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 ( pFile->lastE
cd80: 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44 rrno==ERROR_HAND
cd90: 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20 LE_DISK_FULL ).
cda0: 20 20 20 20 20 20 7c 7c 20 28 20 70 46 69 6c 65 || ( pFile
cdb0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 ->lastErrno==ERR
cdc0: 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b OR_DISK_FULL )){
cdd0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 . return SQ
cde0: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d LITE_FULL;. }
cdf0: 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c . return winL
ce00: 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 ogError(SQLITE_I
ce10: 4f 45 52 52 5f 57 52 49 54 45 2c 20 70 46 69 6c OERR_WRITE, pFil
ce20: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 e->lastErrno,.
ce30: 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 57 "winW
ce40: 72 69 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 rite", pFile->zP
ce50: 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 ath);. }else{.
ce60: 20 20 20 6c 6f 67 49 6f 65 72 72 28 6e 52 65 74 logIoerr(nRet
ce70: 72 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 ry);. }. retur
ce80: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a n SQLITE_OK;.}..
ce90: 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 /*.** Truncate a
cea0: 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 n open file to a
ceb0: 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a specified size.
cec0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 */.static int wi
ced0: 6e 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65 nTruncate(sqlite
cee0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 3_file *id, sqli
cef0: 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 te3_int64 nByte)
cf00: 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 {. winFile *pFi
cf10: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 le = (winFile*)i
cf20: 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 d; /* File hand
cf30: 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 le object */. i
cf40: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f nt rc = SQLITE_O
cf50: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f K; /
cf60: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 6f * Return code fo
cf70: 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 r this function
cf80: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 */.. assert( pF
cf90: 69 6c 65 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 ile );.. OSTRAC
cfa0: 45 28 28 22 54 52 55 4e 43 41 54 45 20 25 64 20 E(("TRUNCATE %d
cfb0: 25 6c 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e %lld\n", pFile->
cfc0: 68 2c 20 6e 42 79 74 65 29 29 3b 0a 20 20 53 69 h, nByte));. Si
cfd0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 mulateIOError(re
cfe0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 turn SQLITE_IOER
cff0: 52 5f 54 52 55 4e 43 41 54 45 29 3b 0a 0a 20 20 R_TRUNCATE);..
d000: 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68 /* If the user h
d010: 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 as configured a
d020: 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 chunk-size for t
d030: 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 his file, trunca
d040: 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 te the. ** file
d050: 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73 so that it cons
d060: 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 ists of an integ
d070: 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 er number of chu
d080: 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 nks (i.e. the.
d090: 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73 ** actual file s
d0a0: 69 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f 70 ize after the op
d0b0: 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c eration may be l
d0c0: 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 72 arger than the r
d0d0: 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 equested. ** si
d0e0: 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 ze).. */. if(
d0f0: 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 pFile->szChunk>0
d100: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 ){. nByte =
d110: 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d ((nByte + pFile-
d120: 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 >szChunk - 1)/pF
d130: 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 ile->szChunk) *
d140: 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a pFile->szChunk;.
d150: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 45 6e 64 }.. /* SetEnd
d160: 4f 66 46 69 6c 65 28 29 20 72 65 74 75 72 6e 73 OfFile() returns
d170: 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 73 non-zero when s
d180: 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 7a 65 uccessful, or ze
d190: 72 6f 20 77 68 65 6e 20 69 74 20 66 61 69 6c 73 ro when it fails
d1a0: 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 65 6b 57 . */. if( seekW
d1b0: 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42 inFile(pFile, nB
d1c0: 79 74 65 29 20 29 7b 0a 20 20 20 20 72 63 20 3d yte) ){. rc =
d1d0: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c winLogError(SQL
d1e0: 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 ITE_IOERR_TRUNCA
d1f0: 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 TE, pFile->lastE
d200: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 rrno,.
d210: 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65 31 "winTruncate1
d220: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 ", pFile->zPath)
d230: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 30 3d ;. }else if( 0=
d240: 3d 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 =osSetEndOfFile(
d250: 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20 20 20 pFile->h) ){.
d260: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e pFile->lastErrn
d270: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 o = osGetLastErr
d280: 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 or();. rc = w
d290: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 inLogError(SQLIT
d2a0: 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 E_IOERR_TRUNCATE
d2b0: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 , pFile->lastErr
d2c0: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 no,.
d2d0: 20 22 77 69 6e 54 72 75 6e 63 61 74 65 32 22 2c "winTruncate2",
d2e0: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a pFile->zPath);.
d2f0: 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 }.. OSTRACE((
d300: 22 54 52 55 4e 43 41 54 45 20 25 64 20 25 6c 6c "TRUNCATE %d %ll
d310: 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e d %s\n", pFile->
d320: 68 2c 20 6e 42 79 74 65 2c 20 72 63 20 3f 20 22 h, nByte, rc ? "
d330: 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 failed" : "ok"))
d340: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d ;. return rc;.}
d350: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ..#ifdef SQLITE_
d360: 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 TEST./*.** Count
d370: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 the number of f
d380: 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 ullsyncs and nor
d390: 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 mal syncs. This
d3a0: 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 is used to test
d3b0: 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 .** that syncs a
d3c0: 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 nd fullsyncs are
d3d0: 20 6f 63 63 75 72 69 6e 67 20 61 74 20 74 68 65 occuring at the
d3e0: 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f right times..*/
d3f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e .int sqlite3_syn
d400: 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 c_count = 0;.int
d410: 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e sqlite3_fullsyn
d420: 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e c_count = 0;.#en
d430: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 dif../*.** Make
d440: 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 sure all writes
d450: 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 to a particular
d460: 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 file are committ
d470: 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 ed to disk..*/.s
d480: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 79 6e tatic int winSyn
d490: 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a c(sqlite3_file *
d4a0: 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a id, int flags){.
d4b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e #ifndef SQLITE_N
d4c0: 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a O_SYNC. /*. **
d4d0: 20 55 73 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 Used only when
d4e0: 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 SQLITE_NO_SYNC i
d4f0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e 0a 20 s not defined..
d500: 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a */. BOOL rc;.
d510: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
d520: 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 21 ned(NDEBUG) || !
d530: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e defined(SQLITE_N
d540: 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c 0a 20 20 20 O_SYNC) || \.
d550: 20 28 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 (defined(SQLITE
d560: 5f 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65 _TEST) && define
d570: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 29 d(SQLITE_DEBUG))
d580: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20 . /*. ** Used
d590: 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 when SQLITE_NO_S
d5a0: 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e YNC is not defin
d5b0: 65 64 20 61 6e 64 20 62 79 20 74 68 65 20 61 73 ed and by the as
d5c0: 73 65 72 74 28 29 20 61 6e 64 2f 6f 72 0a 20 20 sert() and/or.
d5d0: 2a 2a 20 4f 53 54 52 41 43 45 28 29 20 6d 61 63 ** OSTRACE() mac
d5e0: 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20 20 77 69 6e ros.. */. win
d5f0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 File *pFile = (w
d600: 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 23 65 6c 73 inFile*)id;.#els
d610: 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d e. UNUSED_PARAM
d620: 45 54 45 52 28 69 64 29 3b 0a 23 65 6e 64 69 66 ETER(id);.#endif
d630: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c .. assert( pFil
d640: 65 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20 e );. /* Check
d650: 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 that one of SQLI
d660: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f TE_SYNC_NORMAL o
d670: 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65 r FULL was passe
d680: 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66 d */. assert((f
d690: 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 lags&0x0F)==SQLI
d6a0: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 TE_SYNC_NORMAL.
d6b0: 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 || (flags&0
d6c0: 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e x0F)==SQLITE_SYN
d6d0: 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 4f C_FULL. );.. O
d6e0: 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 25 64 STRACE(("SYNC %d
d6f0: 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 lock=%d\n", pFi
d700: 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f le->h, pFile->lo
d710: 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 cktype));.. /*
d720: 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 Unix cannot, but
d730: 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 some systems ma
d740: 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f y return SQLITE_
d750: 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 FULL from here.
d760: 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 This. ** line i
d770: 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 s to test that d
d780: 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 oing so does not
d790: 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c cause any probl
d7a0: 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 ems.. */. Simu
d7b0: 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f lateDiskfullErro
d7c0: 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 r( return SQLITE
d7d0: 5f 46 55 4c 4c 20 29 3b 0a 0a 23 69 66 6e 64 65 _FULL );..#ifnde
d7e0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 f SQLITE_TEST.
d7f0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 UNUSED_PARAMETER
d800: 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65 0a 20 (flags);.#else.
d810: 20 69 66 28 20 28 66 6c 61 67 73 26 30 78 30 46 if( (flags&0x0F
d820: 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 )==SQLITE_SYNC_F
d830: 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 ULL ){. sqlit
d840: 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e e3_fullsync_coun
d850: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 t++;. }. sqlit
d860: 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b e3_sync_count++;
d870: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 .#endif.. /* If
d880: 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 we compiled wit
d890: 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f h the SQLITE_NO_
d8a0: 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 SYNC flag, then
d8b0: 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a syncing is a. *
d8c0: 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 * no-op. */.#if
d8d0: 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 def SQLITE_NO_SY
d8e0: 4e 43 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 NC. return SQLI
d8f0: 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 72 TE_OK;.#else. r
d900: 63 20 3d 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 c = osFlushFileB
d910: 75 66 66 65 72 73 28 70 46 69 6c 65 2d 3e 68 29 uffers(pFile->h)
d920: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 ;. SimulateIOEr
d930: 72 6f 72 28 20 72 63 3d 46 41 4c 53 45 20 29 3b ror( rc=FALSE );
d940: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 . if( rc ){.
d950: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
d960: 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 K;. }else{.
d970: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f pFile->lastErrno
d980: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f = osGetLastErro
d990: 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 r();. return
d9a0: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 winLogError(SQLI
d9b0: 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 TE_IOERR_FSYNC,
d9c0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f pFile->lastErrno
d9d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 ,. "
d9e0: 77 69 6e 53 79 6e 63 22 2c 20 70 46 69 6c 65 2d winSync", pFile-
d9f0: 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23 65 6e >zPath);. }.#en
da00: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 dif.}../*.** Det
da10: 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 ermine the curre
da20: 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c nt size of a fil
da30: 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 e in bytes.*/.st
da40: 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 atic int winFile
da50: 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c Size(sqlite3_fil
da60: 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 e *id, sqlite3_i
da70: 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 nt64 *pSize){.
da80: 44 57 4f 52 44 20 75 70 70 65 72 42 69 74 73 3b DWORD upperBits;
da90: 0a 20 20 44 57 4f 52 44 20 6c 6f 77 65 72 42 69 . DWORD lowerBi
daa0: 74 73 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 ts;. winFile *p
dab0: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a File = (winFile*
dac0: 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 )id;. DWORD las
dad0: 74 45 72 72 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 tErrno;.. asser
dae0: 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53 69 t( id!=0 );. Si
daf0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 mulateIOError(re
db00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 turn SQLITE_IOER
db10: 52 5f 46 53 54 41 54 29 3b 0a 20 20 6c 6f 77 65 R_FSTAT);. lowe
db20: 72 42 69 74 73 20 3d 20 6f 73 47 65 74 46 69 6c rBits = osGetFil
db30: 65 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20 eSize(pFile->h,
db40: 26 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20 69 &upperBits);. i
db50: 66 28 20 20 20 28 6c 6f 77 65 72 42 69 74 73 20 f( (lowerBits
db60: 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f == INVALID_FILE_
db70: 53 49 5a 45 29 0a 20 20 20 20 20 26 26 20 28 28 SIZE). && ((
db80: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 lastErrno = osGe
db90: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e tLastError())!=N
dba0: 4f 5f 45 52 52 4f 52 29 20 29 0a 20 20 7b 0a 20 O_ERROR) ). {.
dbb0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 pFile->lastEr
dbc0: 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b rno = lastErrno;
dbd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c . return winL
dbe0: 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 ogError(SQLITE_I
dbf0: 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c OERR_FSTAT, pFil
dc00: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 e->lastErrno,.
dc10: 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 "winF
dc20: 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d ileSize", pFile-
dc30: 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 2a >zPath);. }. *
dc40: 70 53 69 7a 65 20 3d 20 28 28 28 73 71 6c 69 74 pSize = (((sqlit
dc50: 65 33 5f 69 6e 74 36 34 29 75 70 70 65 72 42 69 e3_int64)upperBi
dc60: 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 ts)<<32) + lower
dc70: 42 69 74 73 3b 0a 20 20 72 65 74 75 72 6e 20 53 Bits;. return S
dc80: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a QLITE_OK;.}../*.
dc90: 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c ** LOCKFILE_FAIL
dca0: 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 69 73 20 _IMMEDIATELY is
dcb0: 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d undefined on som
dcc0: 65 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d e Windows system
dcd0: 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f s..*/.#ifndef LO
dce0: 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 CKFILE_FAIL_IMME
dcf0: 44 49 41 54 45 4c 59 0a 23 20 64 65 66 69 6e 65 DIATELY.# define
dd00: 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 LOCKFILE_FAIL_I
dd10: 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a 23 65 6e MMEDIATELY 1.#en
dd20: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 dif../*.** Acqui
dd30: 72 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b re a reader lock
dd40: 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 41 ..** Different A
dd50: 50 49 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 PI routines are
dd60: 63 61 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 called depending
dd70: 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e on whether or n
dd80: 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 ot this.** is Wi
dd90: 6e 39 78 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f n9x or WinNT..*/
dda0: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 52 .static int getR
ddb0: 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 eadLock(winFile
ddc0: 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 *pFile){. int r
ddd0: 65 73 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 es;. if( isNT()
dde0: 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 ){. OVERLAPP
ddf0: 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6f 76 6c ED ovlp;. ovl
de00: 70 2e 4f 66 66 73 65 74 20 3d 20 53 48 41 52 45 p.Offset = SHARE
de10: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6f 76 6c D_FIRST;. ovl
de20: 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 30 p.OffsetHigh = 0
de30: 3b 0a 20 20 20 20 6f 76 6c 70 2e 68 45 76 65 6e ;. ovlp.hEven
de40: 74 20 3d 20 30 3b 0a 20 20 20 20 72 65 73 20 3d t = 0;. res =
de50: 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 28 70 46 osLockFileEx(pF
de60: 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 46 49 4c 45 ile->h, LOCKFILE
de70: 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c _FAIL_IMMEDIATEL
de80: 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 Y,.
de90: 20 20 20 20 20 20 20 20 20 20 30 2c 20 53 48 41 0, SHA
dea0: 52 45 44 5f 53 49 5a 45 2c 20 30 2c 20 26 6f 76 RED_SIZE, 0, &ov
deb0: 6c 70 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69 lp);./* isNT() i
dec0: 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 s 1 if SQLITE_OS
ded0: 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 _WINCE==1, so th
dee0: 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 is else is never
def0: 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2f 0a 23 executed. .*/.#
df00: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e if SQLITE_OS_WIN
df10: 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 CE==0. }else{.
df20: 20 20 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 int lk;. s
df30: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 qlite3_randomnes
df40: 73 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c s(sizeof(lk), &l
df50: 6b 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 k);. pFile->s
df60: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 haredLockByte =
df70: 28 73 68 6f 72 74 29 28 28 6c 6b 20 26 20 30 78 (short)((lk & 0x
df80: 37 66 66 66 66 66 66 66 29 25 28 53 48 41 52 45 7fffffff)%(SHARE
df90: 44 5f 53 49 5a 45 20 2d 20 31 29 29 3b 0a 20 20 D_SIZE - 1));.
dfa0: 20 20 72 65 73 20 3d 20 6f 73 4c 6f 63 6b 46 69 res = osLockFi
dfb0: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 le(pFile->h, SHA
dfc0: 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d RED_FIRST+pFile-
dfd0: 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c >sharedLockByte,
dfe0: 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65 6e 64 69 0, 1, 0);.#endi
dff0: 66 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 73 20 f. }. if( res
e000: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c == 0 ){. pFil
e010: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f e->lastErrno = o
e020: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b sGetLastError();
e030: 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 . /* No need
e040: 74 6f 20 6c 6f 67 20 61 20 66 61 69 6c 75 72 65 to log a failure
e050: 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a to lock */. }.
e060: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a return res;.}.
e070: 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20 72 65 ./*.** Undo a re
e080: 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 adlock.*/.static
e090: 20 69 6e 74 20 75 6e 6c 6f 63 6b 52 65 61 64 4c int unlockReadL
e0a0: 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 ock(winFile *pFi
e0b0: 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a le){. int res;.
e0c0: 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e DWORD lastErrn
e0d0: 6f 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 o;. if( isNT()
e0e0: 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 6f 73 55 ){. res = osU
e0f0: 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d nlockFile(pFile-
e100: 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 >h, SHARED_FIRST
e110: 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 , 0, SHARED_SIZE
e120: 2c 20 30 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 , 0);./* isNT()
e130: 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f is 1 if SQLITE_O
e140: 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 S_WINCE==1, so t
e150: 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 his else is neve
e160: 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2f 0a r executed. .*/.
e170: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 #if SQLITE_OS_WI
e180: 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a NCE==0. }else{.
e190: 20 20 20 20 72 65 73 20 3d 20 6f 73 55 6e 6c 6f res = osUnlo
e1a0: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c ckFile(pFile->h,
e1b0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 SHARED_FIRST +
e1c0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 pFile->sharedLoc
e1d0: 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b kByte, 0, 1, 0);
e1e0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 .#endif. }. if
e1f0: 28 20 72 65 73 3d 3d 30 20 26 26 20 28 28 6c 61 ( res==0 && ((la
e200: 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c stErrno = osGetL
e210: 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52 astError())!=ERR
e220: 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29 20 29 OR_NOT_LOCKED) )
e230: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 {. pFile->las
e240: 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 tErrno = lastErr
e250: 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 no;. winLogEr
e260: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 ror(SQLITE_IOERR
e270: 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65 2d 3e _UNLOCK, pFile->
e280: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 lastErrno,.
e290: 20 20 20 20 20 20 20 20 22 75 6e 6c 6f 63 6b 52 "unlockR
e2a0: 65 61 64 4c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d eadLock", pFile-
e2b0: 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72 >zPath);. }. r
e2c0: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a eturn res;.}../*
e2d0: 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c .** Lock the fil
e2e0: 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 e with the lock
e2f0: 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 specified by par
e300: 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 ameter locktype
e310: 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 - one.** of the
e320: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a following:.**.**
e330: 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f (1) SHARED_
e340: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 LOCK.** (2)
e350: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a RESERVED_LOCK.**
e360: 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 (3) PENDING
e370: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 _LOCK.** (4)
e380: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a EXCLUSIVE_LOCK.
e390: 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 **.** Sometimes
e3a0: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 when requesting
e3b0: 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 one lock state,
e3c0: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 additional lock
e3d0: 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e states.** are in
e3e0: 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 serted in betwee
e3f0: 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 n. The locking
e400: 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e might fail on on
e410: 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a e of the later.*
e420: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 * transitions le
e430: 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 aving the lock s
e440: 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 tate different f
e450: 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 rom what it star
e460: 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c ted but.** still
e470: 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f short of its go
e480: 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 al. The followi
e490: 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 ng chart shows t
e4a0: 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 he allowed.** tr
e4b0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 ansitions and th
e4c0: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 e inserted inter
e4d0: 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a mediate states:.
e4e0: 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 **.** UNLOCKE
e4f0: 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 D -> SHARED.**
e500: 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 SHARED -> RESE
e510: 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 RVED.** SHARE
e520: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d D -> (PENDING) -
e530: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 > EXCLUSIVE.**
e540: 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 RESERVED -> (P
e550: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 ENDING) -> EXCLU
e560: 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 SIVE.** PENDI
e570: 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a NG -> EXCLUSIVE.
e580: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 **.** This routi
e590: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 ne will only inc
e5a0: 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54 rease a lock. T
e5b0: 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72 he winUnlock() r
e5c0: 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73 outine.** erases
e5d0: 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e all locks at on
e5e0: 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 75 ce and returns u
e5f0: 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f s immediately to
e600: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 locking level 0
e610: 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 ..** It is not p
e620: 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72 ossible to lower
e630: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 the locking lev
e640: 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 20 61 el one step at a
e650: 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d time. You.** m
e660: 75 73 74 20 67 6f 20 73 74 72 61 69 67 68 74 20 ust go straight
e670: 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c to locking level
e680: 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 0..*/.static in
e690: 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74 65 t winLock(sqlite
e6a0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 3_file *id, int
e6b0: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 locktype){. int
e6c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b rc = SQLITE_OK;
e6d0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f /* Return co
e6e0: 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69 de from subrouti
e6f0: 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 nes */. int res
e700: 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 = 1;
e710: 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 20 57 /* Result of a W
e720: 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c indows lock call
e730: 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63 */. int newLoc
e740: 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20 ktype; /*
e750: 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 Set pFile->lockt
e760: 79 70 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 ype to this valu
e770: 65 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 e before exiting
e780: 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e */. int gotPen
e790: 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 dingLock = 0;/*
e7a0: 54 72 75 65 20 69 66 20 77 65 20 61 63 71 75 69 True if we acqui
e7b0: 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f red a PENDING lo
e7c0: 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a ck this time */.
e7d0: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 winFile *pFile
e7e0: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b = (winFile*)id;
e7f0: 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 . DWORD lastErr
e800: 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a no = NO_ERROR;..
e810: 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 assert( id!=0
e820: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c );. OSTRACE(("L
e830: 4f 43 4b 20 25 64 20 25 64 20 77 61 73 20 25 64 OCK %d %d was %d
e840: 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 (%d)\n",.
e850: 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f pFile->h, lo
e860: 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 6c cktype, pFile->l
e870: 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e ocktype, pFile->
e880: 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 29 29 sharedLockByte))
e890: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 ;.. /* If there
e8a0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f is already a lo
e8b0: 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 ck of this type
e8c0: 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 or more restrict
e8d0: 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 ive on the. **
e8e0: 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 OsFile, do nothi
e8f0: 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 ng. Don't use th
e900: 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 e end_lock: exit
e910: 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 73 path, as. ** s
e920: 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 qlite3OsEnterMut
e930: 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e ex() hasn't been
e940: 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a called yet.. *
e950: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c /. if( pFile->l
e960: 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 ocktype>=locktyp
e970: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 e ){. return
e980: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a SQLITE_OK;. }..
e990: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 /* Make sure t
e9a0: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 he locking seque
e9b0: 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 nce is correct.
e9c0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 */. assert( pF
e9d0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e ile->locktype!=N
e9e0: 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 O_LOCK || lockty
e9f0: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 pe==SHARED_LOCK
ea00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 );. assert( loc
ea10: 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c ktype!=PENDING_L
ea20: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 OCK );. assert(
ea30: 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 locktype!=RESER
ea40: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c VED_LOCK || pFil
ea50: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 e->locktype==SHA
ea60: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f RED_LOCK );.. /
ea70: 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e 44 49 * Lock the PENDI
ea80: 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 66 20 NG_LOCK byte if
ea90: 77 65 20 6e 65 65 64 20 74 6f 20 61 63 71 75 69 we need to acqui
eaa0: 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 re a PENDING loc
eab0: 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48 41 52 k or. ** a SHAR
eac0: 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77 65 20 ED lock. If we
ead0: 61 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 are acquiring a
eae0: 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 SHARED lock, the
eaf0: 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6f 66 0a acquisition of.
eb00: 20 20 2a 2a 20 74 68 65 20 50 45 4e 44 49 4e 47 ** the PENDING
eb10: 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73 20 74 65 _LOCK byte is te
eb20: 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 mporary.. */.
eb30: 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 70 46 newLocktype = pF
eb40: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 ile->locktype;.
eb50: 20 69 66 28 20 20 20 28 70 46 69 6c 65 2d 3e 6c if( (pFile->l
eb60: 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b ocktype==NO_LOCK
eb70: 29 0a 20 20 20 20 20 7c 7c 20 28 20 20 20 28 6c ). || ( (l
eb80: 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 ocktype==EXCLUSI
eb90: 56 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 VE_LOCK).
eba0: 20 20 26 26 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 && (pFile->loc
ebb0: 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f ktype==RESERVED_
ebc0: 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 LOCK)). ){.
ebd0: 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20 20 20 int cnt = 3;.
ebe0: 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 while( cnt-->0
ebf0: 26 26 20 28 72 65 73 20 3d 20 6f 73 4c 6f 63 6b && (res = osLock
ec00: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 File(pFile->h, P
ec10: 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 ENDING_BYTE, 0,
ec20: 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 1, 0))==0 ){.
ec30: 20 20 20 2f 2a 20 54 72 79 20 33 20 74 69 6d 65 /* Try 3 time
ec40: 73 20 74 6f 20 67 65 74 20 74 68 65 20 70 65 6e s to get the pen
ec50: 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68 69 73 ding lock. This
ec60: 20 69 73 20 6e 65 65 64 65 64 20 74 6f 20 77 6f is needed to wo
ec70: 72 6b 0a 20 20 20 20 20 20 2a 2a 20 61 72 6f 75 rk. ** arou
ec80: 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63 61 75 73 nd problems caus
ec90: 65 64 20 62 79 20 69 6e 64 65 78 69 6e 67 20 61 ed by indexing a
eca0: 6e 64 2f 6f 72 20 61 6e 74 69 2d 76 69 72 75 73 nd/or anti-virus
ecb0: 20 73 6f 66 74 77 61 72 65 20 6f 6e 0a 20 20 20 software on.
ecc0: 20 20 20 2a 2a 20 57 69 6e 64 6f 77 73 20 73 79 ** Windows sy
ecd0: 73 74 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2a 20 stems.. **
ece0: 49 66 20 79 6f 75 20 61 72 65 20 75 73 69 6e 67 If you are using
ecf0: 20 74 68 69 73 20 63 6f 64 65 20 61 73 20 61 20 this code as a
ed00: 6d 6f 64 65 6c 20 66 6f 72 20 61 6c 74 65 72 6e model for altern
ed10: 61 74 69 76 65 20 56 46 53 65 73 2c 20 64 6f 20 ative VFSes, do
ed20: 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 not. ** cop
ed30: 79 20 74 68 69 73 20 72 65 74 72 79 20 6c 6f 67 y this retry log
ed40: 69 63 2e 20 20 49 74 20 69 73 20 61 20 68 61 63 ic. It is a hac
ed50: 6b 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 57 k intended for W
ed60: 69 6e 64 6f 77 73 20 6f 6e 6c 79 2e 0a 20 20 20 indows only..
ed70: 20 20 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 */. OSTR
ed80: 41 43 45 28 28 22 63 6f 75 6c 64 20 6e 6f 74 20 ACE(("could not
ed90: 67 65 74 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f get a PENDING lo
eda0: 63 6b 2e 20 63 6e 74 3d 25 64 5c 6e 22 2c 20 63 ck. cnt=%d\n", c
edb0: 6e 74 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 nt));. if(
edc0: 63 6e 74 20 29 20 6f 73 53 6c 65 65 70 28 31 29 cnt ) osSleep(1)
edd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 50 ;. }. gotP
ede0: 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73 endingLock = res
edf0: 3b 0a 20 20 20 20 69 66 28 20 21 72 65 73 20 29 ;. if( !res )
ee00: 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e {. lastErrn
ee10: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 o = osGetLastErr
ee20: 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a or();. }. }.
ee30: 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 . /* Acquire a
ee40: 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f shared lock. */
ee50: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d . if( locktype=
ee60: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 =SHARED_LOCK &&
ee70: 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 res ){. asser
ee80: 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 t( pFile->lockty
ee90: 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 pe==NO_LOCK );.
eea0: 20 20 20 72 65 73 20 3d 20 67 65 74 52 65 61 64 res = getRead
eeb0: 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 Lock(pFile);.
eec0: 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 if( res ){.
eed0: 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 newLocktype =
eee0: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 SHARED_LOCK;.
eef0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 }else{. la
ef00: 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c stErrno = osGetL
ef10: 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 astError();.
ef20: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 }. }.. /* Acqu
ef30: 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c ire a RESERVED l
ef40: 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c ock. */. if( l
ef50: 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 ocktype==RESERVE
ef60: 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b D_LOCK && res ){
ef70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 . assert( pFi
ef80: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 le->locktype==SH
ef90: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 ARED_LOCK );.
efa0: 20 72 65 73 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c res = osLockFil
efb0: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 e(pFile->h, RESE
efc0: 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c RVED_BYTE, 0, 1,
efd0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 0);. if( res
efe0: 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 ){. newLoc
eff0: 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56 45 44 ktype = RESERVED
f000: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 _LOCK;. }else
f010: 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e {. lastErrn
f020: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 o = osGetLastErr
f030: 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a or();. }. }.
f040: 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 . /* Acquire a
f050: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a PENDING lock. *
f060: 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 /. if( locktype
f070: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b ==EXCLUSIVE_LOCK
f080: 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 6e && res ){. n
f090: 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e ewLocktype = PEN
f0a0: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 DING_LOCK;. g
f0b0: 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 otPendingLock =
f0c0: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 0;. }.. /* Acq
f0d0: 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 uire an EXCLUSIV
f0e0: 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 E lock. */. if
f0f0: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c ( locktype==EXCL
f100: 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 USIVE_LOCK && re
f110: 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 s ){. assert(
f120: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 pFile->locktype
f130: 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b >=SHARED_LOCK );
f140: 0a 20 20 20 20 72 65 73 20 3d 20 75 6e 6c 6f 63 . res = unloc
f150: 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 kReadLock(pFile)
f160: 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 ;. OSTRACE(("
f170: 75 6e 72 65 61 64 6c 6f 63 6b 20 3d 20 25 64 5c unreadlock = %d\
f180: 6e 22 2c 20 72 65 73 29 29 3b 0a 20 20 20 20 72 n", res));. r
f190: 65 73 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 es = osLockFile(
f1a0: 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 pFile->h, SHARED
f1b0: 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 _FIRST, 0, SHARE
f1c0: 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 D_SIZE, 0);.
f1d0: 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 if( res ){.
f1e0: 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 newLocktype = E
f1f0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 XCLUSIVE_LOCK;.
f200: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
f210: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 lastErrno = osGe
f220: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 tLastError();.
f230: 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 65 72 OSTRACE(("er
f240: 72 6f 72 2d 63 6f 64 65 20 3d 20 25 64 5c 6e 22 ror-code = %d\n"
f250: 2c 20 6c 61 73 74 45 72 72 6e 6f 29 29 3b 0a 20 , lastErrno));.
f260: 20 20 20 20 20 67 65 74 52 65 61 64 4c 6f 63 6b getReadLock
f270: 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 (pFile);. }.
f280: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 }.. /* If we a
f290: 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e re holding a PEN
f2a0: 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f DING lock that o
f2b0: 75 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61 ught to be relea
f2c0: 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 sed, then. ** r
f2d0: 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 elease it now..
f2e0: 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e */. if( gotPen
f2f0: 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b dingLock && lock
f300: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 type==SHARED_LOC
f310: 4b 20 29 7b 0a 20 20 20 20 6f 73 55 6e 6c 6f 63 K ){. osUnloc
f320: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 kFile(pFile->h,
f330: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c PENDING_BYTE, 0,
f340: 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 1, 0);. }.. /
f350: 2a 20 55 70 64 61 74 65 20 74 68 65 20 73 74 61 * Update the sta
f360: 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 te of the lock h
f370: 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66 as held in the f
f380: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 ile descriptor t
f390: 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 hen. ** return
f3a0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 the appropriate
f3b0: 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a result code.. *
f3c0: 2f 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 /. if( res ){.
f3d0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f rc = SQLITE_O
f3e0: 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 K;. }else{.
f3f0: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 46 OSTRACE(("LOCK F
f400: 41 49 4c 45 44 20 25 64 20 74 72 79 69 6e 67 20 AILED %d trying
f410: 66 6f 72 20 25 64 20 62 75 74 20 67 6f 74 20 25 for %d but got %
f420: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a d\n", pFile->h,.
f430: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 lockt
f440: 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65 ype, newLocktype
f450: 29 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c ));. pFile->l
f460: 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 astErrno = lastE
f470: 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 53 rrno;. rc = S
f480: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a QLITE_BUSY;. }.
f490: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 pFile->locktyp
f4a0: 65 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74 e = (u8)newLockt
f4b0: 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 ype;. return rc
f4c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 ;.}../*.** This
f4d0: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 routine checks i
f4e0: 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 f there is a RES
f4f0: 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 ERVED lock held
f500: 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 on the specified
f510: 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 .** file by this
f520: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 or any other pr
f530: 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 ocess. If such a
f540: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 lock is held, r
f550: 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 eturn.** non-zer
f560: 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65 72 o, otherwise zer
f570: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 o..*/.static int
f580: 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 winCheckReserve
f590: 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 dLock(sqlite3_fi
f5a0: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 le *id, int *pRe
f5b0: 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b sOut){. int rc;
f5c0: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c . winFile *pFil
f5d0: 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 e = (winFile*)id
f5e0: 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 ;.. SimulateIOE
f5f0: 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c rror( return SQL
f600: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 ITE_IOERR_CHECKR
f610: 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a ESERVEDLOCK; );.
f620: 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 . assert( id!=0
f630: 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d );. if( pFile-
f640: 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 >locktype>=RESER
f650: 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 VED_LOCK ){.
f660: 72 63 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 rc = 1;. OSTR
f670: 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f ACE(("TEST WR-LO
f680: 43 4b 20 25 64 20 25 64 20 28 6c 6f 63 61 6c 29 CK %d %d (local)
f690: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 \n", pFile->h, r
f6a0: 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 c));. }else{.
f6b0: 20 20 72 63 20 3d 20 6f 73 4c 6f 63 6b 46 69 6c rc = osLockFil
f6c0: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 e(pFile->h, RESE
f6d0: 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c RVED_BYTE, 0, 1,
f6e0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 0);. if( rc
f6f0: 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 6f 63 ){. osUnloc
f700: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 kFile(pFile->h,
f710: 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 RESERVED_BYTE, 0
f720: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 , 1, 0);. }.
f730: 20 20 20 72 63 20 3d 20 21 72 63 3b 0a 20 20 20 rc = !rc;.
f740: 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 OSTRACE(("TEST
f750: 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28 72 WR-LOCK %d %d (r
f760: 65 6d 6f 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65 emote)\n", pFile
f770: 2d 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d 0a 20 ->h, rc));. }.
f780: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a *pResOut = rc;.
f790: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
f7a0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 OK;.}../*.** Low
f7b0: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c er the locking l
f7c0: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 evel on file des
f7d0: 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f criptor id to lo
f7e0: 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 cktype. locktyp
f7f0: 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 e.** must be eit
f800: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 her NO_LOCK or S
f810: 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a HARED_LOCK..**.*
f820: 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 * If the locking
f830: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 level of the fi
f840: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 le descriptor is
f850: 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 already at or b
f860: 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 elow.** the requ
f870: 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 ested locking le
f880: 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e vel, this routin
f890: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a e is a no-op..**
f8a0: 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f .** It is not po
f8b0: 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 ssible for this
f8c0: 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c 20 routine to fail
f8d0: 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 if the second ar
f8e0: 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f gument.** is NO_
f8f0: 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20 73 65 LOCK. If the se
f900: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 cond argument is
f910: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65 SHARED_LOCK the
f920: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a n this routine.*
f930: 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 53 * might return S
f940: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a QLITE_IOERR;.*/.
f950: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e static int winUn
f960: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c lock(sqlite3_fil
f970: 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 e *id, int lockt
f980: 79 70 65 29 7b 0a 20 20 69 6e 74 20 74 79 70 65 ype){. int type
f990: 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 ;. winFile *pFi
f9a0: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 le = (winFile*)i
f9b0: 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 d;. int rc = SQ
f9c0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 LITE_OK;. asser
f9d0: 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 t( pFile!=0 );.
f9e0: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 assert( locktyp
f9f0: 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 e<=SHARED_LOCK )
fa00: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e ;. OSTRACE(("UN
fa10: 4c 4f 43 4b 20 25 64 20 74 6f 20 25 64 20 77 61 LOCK %d to %d wa
fa20: 73 20 25 64 28 25 64 29 5c 6e 22 2c 20 70 46 69 s %d(%d)\n", pFi
fa30: 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c le->h, locktype,
fa40: 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 . pFile
fa50: 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c ->locktype, pFil
fa60: 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 e->sharedLockByt
fa70: 65 29 29 3b 0a 20 20 74 79 70 65 20 3d 20 70 46 e));. type = pF
fa80: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 ile->locktype;.
fa90: 20 69 66 28 20 74 79 70 65 3e 3d 45 58 43 4c 55 if( type>=EXCLU
faa0: 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 SIVE_LOCK ){.
fab0: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 osUnlockFile(pF
fac0: 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 ile->h, SHARED_F
fad0: 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f IRST, 0, SHARED_
fae0: 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 SIZE, 0);. if
faf0: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 ( locktype==SHAR
fb00: 45 44 5f 4c 4f 43 4b 20 26 26 20 21 67 65 74 52 ED_LOCK && !getR
fb10: 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 20 29 eadLock(pFile) )
fb20: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 {. /* This
fb30: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 should never hap
fb40: 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c 64 20 pen. We should
fb50: 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65 20 74 always be able t
fb60: 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 63 71 o. ** reacq
fb70: 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f uire the read lo
fb80: 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d ck */. rc =
fb90: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c winLogError(SQL
fba0: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b ITE_IOERR_UNLOCK
fbb0: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 , osGetLastError
fbc0: 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 (),.
fbd0: 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20 "winUnlock",
fbe0: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 pFile->zPath);.
fbf0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74 }. }. if( t
fc00: 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f ype>=RESERVED_LO
fc10: 43 4b 20 29 7b 0a 20 20 20 20 6f 73 55 6e 6c 6f CK ){. osUnlo
fc20: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c ckFile(pFile->h,
fc30: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 RESERVED_BYTE,
fc40: 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 0, 1, 0);. }.
fc50: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f if( locktype==NO
fc60: 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53 _LOCK && type>=S
fc70: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 HARED_LOCK ){.
fc80: 20 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b unlockReadLock
fc90: 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 (pFile);. }. i
fca0: 66 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 f( type>=PENDING
fcb0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 6f 73 55 _LOCK ){. osU
fcc0: 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d nlockFile(pFile-
fcd0: 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 >h, PENDING_BYTE
fce0: 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a , 0, 1, 0);. }.
fcf0: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 pFile->locktyp
fd00: 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 e = (u8)locktype
fd10: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d ;. return rc;.}
fd20: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c 20 ../*.** Control
fd30: 61 6e 64 20 71 75 65 72 79 20 6f 66 20 74 68 65 and query of the
fd40: 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c open file handl
fd50: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 e..*/.static int
fd60: 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 winFileControl(
fd70: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 sqlite3_file *id
fd80: 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a , int op, void *
fd90: 70 41 72 67 29 7b 0a 20 20 77 69 6e 46 69 6c 65 pArg){. winFile
fda0: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 *pFile = (winFi
fdb0: 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69 74 63 68 le*)id;. switch
fdc0: 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 ( op ){. case
fdd0: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f SQLITE_FCNTL_LO
fde0: 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 CKSTATE: {.
fdf0: 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 *(int*)pArg = p
fe00: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a File->locktype;.
fe10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c return SQL
fe20: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 ITE_OK;. }.
fe30: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 case SQLITE_LA
fe40: 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 ST_ERRNO: {.
fe50: 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 *(int*)pArg =
fe60: 28 69 6e 74 29 70 46 69 6c 65 2d 3e 6c 61 73 74 (int)pFile->last
fe70: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 Errno;. ret
fe80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 urn SQLITE_OK;.
fe90: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 }. case SQ
fea0: 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b LITE_FCNTL_CHUNK
feb0: 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 _SIZE: {. p
fec0: 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 File->szChunk =
fed0: 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 *(int *)pArg;.
fee0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
fef0: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 E_OK;. }.
ff00: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 case SQLITE_FCNT
ff10: 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 L_SIZE_HINT: {.
ff20: 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e if( pFile->
ff30: 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 szChunk>0 ){.
ff40: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 sqlite3_int
ff50: 36 34 20 6f 6c 64 53 7a 3b 0a 20 20 20 20 20 20 64 oldSz;.
ff60: 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 46 69 int rc = winFi
ff70: 6c 65 53 69 7a 65 28 69 64 2c 20 26 6f 6c 64 53 leSize(id, &oldS
ff80: 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 z);. if(
ff90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc==SQLITE_OK ){
ffa0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 . sqlit
ffb0: 65 33 5f 69 6e 74 36 34 20 6e 65 77 53 7a 20 3d e3_int64 newSz =
ffc0: 20 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 *(sqlite3_int64
ffd0: 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 20 20 *)pArg;.
ffe0: 20 20 69 66 28 20 6e 65 77 53 7a 3e 6f 6c 64 53 if( newSz>oldS
fff0: 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 z ){.
10000 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 SimulateIOError
10010 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 Benign(1);.
10020 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 rc = winT
10030 72 75 6e 63 61 74 65 28 69 64 2c 20 6e 65 77 53 runcate(id, newS
10040 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 z);.
10050 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 SimulateIOErrorB
10060 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 enign(0);.
10070 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a }. }.
10080 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 return r
10090 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 c;. }.
100a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
100b0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 K;. }. cas
100c0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 e SQLITE_FCNTL_P
100d0 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 ERSIST_WAL: {.
100e0 20 20 20 20 69 6e 74 20 62 50 65 72 73 69 73 74 int bPersist
100f0 20 3d 20 2a 28 69 6e 74 2a 29 70 41 72 67 3b 0a = *(int*)pArg;.
10100 20 20 20 20 20 20 69 66 28 20 62 50 65 72 73 69 if( bPersi
10110 73 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 st<0 ){.
10120 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 *(int*)pArg = pF
10130 69 6c 65 2d 3e 62 50 65 72 73 69 73 74 57 61 6c ile->bPersistWal
10140 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 ;. }else{.
10150 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 62 50 pFile->bP
10160 65 72 73 69 73 74 57 61 6c 20 3d 20 62 50 65 72 ersistWal = bPer
10170 73 69 73 74 21 3d 30 3b 0a 20 20 20 20 20 20 7d sist!=0;. }
10180 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 . return SQ
10190 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 LITE_OK;. }.
101a0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 case SQLITE_F
101b0 43 4e 54 4c 5f 53 59 4e 43 5f 4f 4d 49 54 54 45 CNTL_SYNC_OMITTE
101c0 44 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 D: {. retur
101d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 n SQLITE_OK;.
101e0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 }. case SQLI
101f0 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 TE_FCNTL_WIN32_A
10200 56 5f 52 45 54 52 59 3a 20 7b 0a 20 20 20 20 20 V_RETRY: {.
10210 20 69 6e 74 20 2a 61 20 3d 20 28 69 6e 74 2a 29 int *a = (int*)
10220 70 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20 pArg;. if(
10230 61 5b 30 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 a[0]>0 ){.
10240 20 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 win32IoerrRetr
10250 79 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 y = a[0];.
10260 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 }else{. a
10270 5b 30 5d 20 3d 20 77 69 6e 33 32 49 6f 65 72 72 [0] = win32Ioerr
10280 52 65 74 72 79 3b 0a 20 20 20 20 20 20 7d 0a 20 Retry;. }.
10290 20 20 20 20 20 69 66 28 20 61 5b 31 5d 3e 30 20 if( a[1]>0
102a0 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 33 32 ){. win32
102b0 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20 IoerrRetryDelay
102c0 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65 = a[1];. }e
102d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 31 lse{. a[1
102e0 5d 20 3d 20 77 69 6e 33 32 49 6f 65 72 72 52 65 ] = win32IoerrRe
102f0 74 72 79 44 65 6c 61 79 3b 0a 20 20 20 20 20 20 tryDelay;.
10300 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 }. return S
10310 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a QLITE_OK;. }.
10320 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c }. return SQL
10330 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a ITE_NOTFOUND;.}.
10340 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 ./*.** Return th
10350 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e e sector size in
10360 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e bytes of the un
10370 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 derlying block d
10380 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 evice for.** the
10390 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e specified file.
103a0 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 This is almost
103b0 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 always 512 bytes
103c0 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 , but may be.**
103d0 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 larger for some
103e0 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 devices..**.** S
103f0 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d QLite code assum
10400 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e es this function
10410 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 cannot fail. It
10420 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 also assumes th
10430 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c at.** if two fil
10440 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69 es are created i
10450 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d n the same file-
10460 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 system directory
10470 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 (i.e..** a data
10480 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 base and its jou
10490 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 rnal file) that
104a0 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 the sector size
104b0 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 will be the.** s
104c0 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f ame for both..*/
104d0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 .static int winS
104e0 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 ectorSize(sqlite
104f0 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 61 3_file *id){. a
10500 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a ssert( id!=0 );.
10510 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28 28 return (int)((
10520 28 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 73 (winFile*)id)->s
10530 65 63 74 6f 72 53 69 7a 65 29 3b 0a 7d 0a 0a 2f ectorSize);.}../
10540 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65 *.** Return a ve
10550 63 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63 ctor of device c
10560 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a haracteristics..
10570 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 */.static int wi
10580 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 nDeviceCharacter
10590 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 istics(sqlite3_f
105a0 69 6c 65 20 2a 69 64 29 7b 0a 20 20 55 4e 55 53 ile *id){. UNUS
105b0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64 29 ED_PARAMETER(id)
105c0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 ;. return SQLIT
105d0 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 E_IOCAP_UNDELETA
105e0 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 3b 0a 7d BLE_WHEN_OPEN;.}
105f0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 ..#ifndef SQLITE
10600 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 20 0a 2a _OMIT_WAL../* .*
10610 2a 20 57 69 6e 64 6f 77 73 20 77 69 6c 6c 20 6f * Windows will o
10620 6e 6c 79 20 6c 65 74 20 79 6f 75 20 63 72 65 61 nly let you crea
10630 74 65 20 66 69 6c 65 20 76 69 65 77 20 6d 61 70 te file view map
10640 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f pings.** on allo
10650 63 61 74 69 6f 6e 20 73 69 7a 65 20 67 72 61 6e cation size gran
10660 75 6c 61 72 69 74 79 20 62 6f 75 6e 64 61 72 69 ularity boundari
10670 65 73 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 73 71 es..** During sq
10680 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 lite3_os_init()
10690 77 65 20 64 6f 20 61 20 47 65 74 53 79 73 74 65 we do a GetSyste
106a0 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20 67 65 mInfo().** to ge
106b0 74 20 74 68 65 20 67 72 61 6e 75 6c 61 72 69 74 t the granularit
106c0 79 20 73 69 7a 65 2e 0a 2a 2f 0a 53 59 53 54 45 y size..*/.SYSTE
106d0 4d 5f 49 4e 46 4f 20 77 69 6e 53 79 73 49 6e 66 M_INFO winSysInf
106e0 6f 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 o;../*.** Helper
106f0 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 functions to ob
10700 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 tain and relinqu
10710 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d ish the global m
10720 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f utex. The.** glo
10730 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 bal mutex is use
10740 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 d to protect the
10750 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a winLockInfo obj
10760 65 63 74 73 20 75 73 65 64 20 62 79 20 0a 2a 2a ects used by .**
10770 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 this file, all
10780 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 of which may be
10790 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70 shared by multip
107a0 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a le threads..**.*
107b0 2a 20 46 75 6e 63 74 69 6f 6e 20 77 69 6e 53 68 * Function winSh
107c0 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 mMutexHeld() is
107d0 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 used to assert()
107e0 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c that the global
107f0 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 mutex .** is he
10800 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 ld when required
10810 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 . This function
10820 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 is only used as
10830 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 part of assert()
10840 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e .** statements.
10850 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 77 69 e.g..**.** wi
10860 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 nShmEnterMutex()
10870 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 .** assert(
10880 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 winShmMutexHeld(
10890 29 20 29 3b 0a 2a 2a 20 20 20 77 69 6e 53 68 6d ) );.** winShm
108a0 4c 65 61 76 65 4d 75 74 65 78 28 29 0a 2a 2f 0a LeaveMutex().*/.
108b0 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 static void winS
108c0 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 hmEnterMutex(voi
108d0 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 d){. sqlite3_mu
108e0 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 tex_enter(sqlite
108f0 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 3MutexAlloc(SQLI
10900 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f TE_MUTEX_STATIC_
10910 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 MASTER));.}.stat
10920 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 4c 65 ic void winShmLe
10930 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a aveMutex(void){.
10940 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f sqlite3_mutex_
10950 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74 leave(sqlite3Mut
10960 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d exAlloc(SQLITE_M
10970 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 UTEX_STATIC_MAST
10980 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 ER));.}.#ifdef S
10990 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 QLITE_DEBUG.stat
109a0 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 75 74 ic int winShmMut
109b0 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 exHeld(void) {.
109c0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f return sqlite3_
109d0 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 mutex_held(sqlit
109e0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c e3MutexAlloc(SQL
109f0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 ITE_MUTEX_STATIC
10a00 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e _MASTER));.}.#en
10a10 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 dif../*.** Objec
10a20 74 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 t used to repres
10a30 65 6e 74 20 61 20 73 69 6e 67 6c 65 20 66 69 6c ent a single fil
10a40 65 20 6f 70 65 6e 65 64 20 61 6e 64 20 6d 6d 61 e opened and mma
10a50 70 70 65 64 20 74 6f 20 70 72 6f 76 69 64 65 0a pped to provide.
10a60 2a 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 ** shared memory
10a70 2e 20 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 . When multiple
10a80 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66 threads all ref
10a90 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65 0a erence the same.
10aa0 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c 20 ** log-summary,
10ab0 65 61 63 68 20 74 68 72 65 61 64 20 68 61 73 20 each thread has
10ac0 69 74 73 20 6f 77 6e 20 77 69 6e 46 69 6c 65 20 its own winFile
10ad0 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79 object, but they
10ae0 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f all.** point to
10af0 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e a single instan
10b00 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 ce of this objec
10b10 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 t. In other wor
10b20 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f 67 2d ds, each.** log-
10b30 73 75 6d 6d 61 72 79 20 69 73 20 6f 70 65 6e 65 summary is opene
10b40 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 d only once per
10b50 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 77 process..**.** w
10b60 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 inShmMutexHeld()
10b70 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68 must be true wh
10b80 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64 en creating or d
10b90 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 estroying.** thi
10ba0 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c s object or whil
10bb0 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 e reading or wri
10bc0 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 ting the followi
10bd0 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a ng fields:.**.**
10be0 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 20 20 20 nRef.**
10bf0 20 20 20 70 4e 65 78 74 20 0a 2a 2a 0a 2a 2a 20 pNext .**.**
10c00 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 The following fi
10c10 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e elds are read-on
10c20 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a ly after the obj
10c30 65 63 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a ect is created:.
10c40 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a ** .** fid.
10c50 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d ** zFilenam
10c60 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 77 e.**.** Either w
10c70 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 inShmNode.mutex
10c80 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20 must be held or
10c90 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d winShmNode.nRef=
10ca0 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 6e 53 68 6d =0 and.** winShm
10cb0 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 74 MutexHeld() is t
10cc0 72 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67 rue when reading
10cd0 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20 or writing any
10ce0 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 other field.** i
10cf0 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 n this structure
10d00 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74 20 77 ..**.*/.struct w
10d10 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 73 71 inShmNode {. sq
10d20 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 lite3_mutex *mut
10d30 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 ex; /* Mute
10d40 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 x to access this
10d50 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 object */. cha
10d60 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 r *zFilename;
10d70 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 /* Name
10d80 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 of the file */.
10d90 20 77 69 6e 46 69 6c 65 20 68 46 69 6c 65 3b 20 winFile hFile;
10da0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 /* F
10db0 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 ile handle from
10dc0 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20 69 6e winOpen */.. in
10dd0 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 t szRegion;
10de0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 /* Size
10df0 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 of shared-memor
10e00 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 y regions */. i
10e10 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 nt nRegion;
10e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a /* Siz
10e30 65 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 e of array apReg
10e40 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 ion */. struct
10e50 53 68 6d 52 65 67 69 6f 6e 20 7b 0a 20 20 20 20 ShmRegion {.
10e60 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 HANDLE hMap;
10e70 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 /* File
10e80 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 43 72 65 handle from Cre
10e90 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 20 2a ateFileMapping *
10ea0 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 /. void *pMap
10eb0 3b 0a 20 20 7d 20 2a 61 52 65 67 69 6f 6e 3b 0a ;. } *aRegion;.
10ec0 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e DWORD lastErrn
10ed0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 o; /*
10ee0 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72 72 6e The Windows errn
10ef0 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 o from the last
10f00 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 I/O error */..
10f10 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 int nRef;
10f20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 /* Nu
10f30 6d 62 65 72 20 6f 66 20 77 69 6e 53 68 6d 20 6f mber of winShm o
10f40 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 bjects pointing
10f50 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e to this */. win
10f60 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20 Shm *pFirst;
10f70 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 77 /* All w
10f80 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f inShm objects po
10f90 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a inting to this *
10fa0 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a /. winShmNode *
10fb0 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 2f pNext; /
10fc0 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73 74 20 6f * Next in list o
10fd0 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 f all winShmNode
10fe0 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69 66 64 objects */.#ifd
10ff0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a ef SQLITE_DEBUG.
11000 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 u8 nextShmId;
11010 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
11020 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 77 Next available w
11030 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a inShm.id value *
11040 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a /.#endif.};../*.
11050 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72 72 61 ** A global arra
11060 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e y of all winShmN
11070 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a ode objects..**.
11080 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d 4d 75 74 ** The winShmMut
11090 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 exHeld() must be
110a0 20 74 72 75 65 20 77 68 69 6c 65 20 72 65 61 64 true while read
110b0 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 ing or writing t
110c0 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 his list..*/.sta
110d0 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a tic winShmNode *
110e0 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d winShmNodeList =
110f0 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 0;../*.** Struc
11100 74 75 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e ture used intern
11110 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46 53 ally by this VFS
11120 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 to record the s
11130 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 tate of an.** op
11140 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 en shared memory
11150 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a connection..**.
11160 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 ** The following
11170 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74 fields are init
11180 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 ialized when thi
11190 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 s object is crea
111a0 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 ted and.** are r
111b0 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 ead-only thereaf
111c0 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 77 69 ter:.**.** wi
111d0 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a 2a nShm.pShmNode.**
111e0 20 20 20 20 77 69 6e 53 68 6d 2e 69 64 0a 2a 2a winShm.id.**
111f0 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 .** All other fi
11200 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77 72 elds are read/wr
11210 69 74 65 2e 20 20 54 68 65 20 77 69 6e 53 68 6d ite. The winShm
11220 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 .pShmNode->mutex
11230 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a must be held.**
11240 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 while accessing
11250 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20 any read/write
11260 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 fields..*/.struc
11270 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20 77 69 6e t winShm {. win
11280 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 ShmNode *pShmNod
11290 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 e; /* The u
112a0 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e 53 68 6d nderlying winShm
112b0 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 Node object */.
112c0 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78 74 3b 20 winShm *pNext;
112d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e /* N
112e0 65 78 74 20 77 69 6e 53 68 6d 20 77 69 74 68 20 ext winShm with
112f0 74 68 65 20 73 61 6d 65 20 77 69 6e 53 68 6d 4e the same winShmN
11300 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d ode */. u8 hasM
11310 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 utex;
11320 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 /* True if h
11330 6f 6c 64 69 6e 67 20 74 68 65 20 77 69 6e 53 68 olding the winSh
11340 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 mNode mutex */.
11350 20 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b u16 sharedMask;
11360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d /* M
11370 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f ask of shared lo
11380 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 cks held */. u1
11390 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 6 exclMask;
113a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b /* Mask
113b0 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f of exclusive lo
113c0 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66 64 cks held */.#ifd
113d0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a ef SQLITE_DEBUG.
113e0 20 20 75 38 20 69 64 3b 20 20 20 20 20 20 20 20 u8 id;
113f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
11400 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 Id of this conne
11410 63 74 69 6f 6e 20 77 69 74 68 20 69 74 73 20 77 ction with its w
11420 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e inShmNode */.#en
11430 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f dif.};../*.** Co
11440 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 nstants used for
11450 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 locking.*/.#def
11460 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 42 41 53 45 ine WIN_SHM_BASE
11470 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 ((22+SQLITE_S
11480 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 HM_NLOCK)*4)
11490 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 /* first loc
114a0 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e k byte */.#defin
114b0 65 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 20 20 20 e WIN_SHM_DMS
114c0 20 28 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2b 53 (WIN_SHM_BASE+S
114d0 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 QLITE_SHM_NLOCK)
114e0 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 /* deadman swi
114f0 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 tch */../*.** Ap
11500 70 6c 79 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 ply advisory loc
11510 6b 73 20 66 6f 72 20 61 6c 6c 20 6e 20 62 79 74 ks for all n byt
11520 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 es beginning at
11530 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 ofst..*/.#define
11540 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a 23 _SHM_UNLCK 1.#
11550 64 65 66 69 6e 65 20 5f 53 48 4d 5f 52 44 4c 43 define _SHM_RDLC
11560 4b 20 20 32 0a 23 64 65 66 69 6e 65 20 5f 53 48 K 2.#define _SH
11570 4d 5f 57 52 4c 43 4b 20 20 33 0a 73 74 61 74 69 M_WRLCK 3.stati
11580 63 20 69 6e 74 20 77 69 6e 53 68 6d 53 79 73 74 c int winShmSyst
11590 65 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d emLock(. winShm
115a0 4e 6f 64 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 Node *pFile,
115b0 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 /* Apply locks t
115c0 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 o this open shar
115d0 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e ed-memory segmen
115e0 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 t */. int lockT
115f0 79 70 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 ype, /*
11600 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 5f 53 48 4d _SHM_UNLCK, _SHM
11610 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f 53 48 4d 5f _RDLCK, or _SHM_
11620 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f WRLCK */. int o
11630 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 fst,
11640 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 66 69 /* Offset to fi
11650 72 73 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c rst byte to be l
11660 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a ocked/unlocked *
11670 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 20 20 /. int nByte
11680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d /* Num
11690 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 ber of bytes to
116a0 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a lock or unlock *
116b0 2f 0a 29 7b 0a 20 20 4f 56 45 52 4c 41 50 50 45 /.){. OVERLAPPE
116c0 44 20 6f 76 6c 70 3b 0a 20 20 44 57 4f 52 44 20 D ovlp;. DWORD
116d0 64 77 46 6c 61 67 73 3b 0a 20 20 69 6e 74 20 72 dwFlags;. int r
116e0 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 c = 0;
116f0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 /* Result code
11700 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b form Lock/Unlock
11710 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20 2f FileEx() */.. /
11720 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 * Access to the
11730 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 winShmNode objec
11740 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 t is serialized
11750 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f by the caller */
11760 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 . assert( sqlit
11770 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 e3_mutex_held(pF
11780 69 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 ile->mutex) || p
11790 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b File->nRef==0 );
117a0 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a .. /* Initializ
117b0 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 e the locking pa
117c0 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 64 77 rameters */. dw
117d0 46 6c 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45 Flags = LOCKFILE
117e0 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c _FAIL_IMMEDIATEL
117f0 59 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 Y;. if( lockTyp
11800 65 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 e == _SHM_WRLCK
11810 29 20 64 77 46 6c 61 67 73 20 7c 3d 20 4c 4f 43 ) dwFlags |= LOC
11820 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f KFILE_EXCLUSIVE_
11830 4c 4f 43 4b 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 LOCK;.. memset(
11840 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 &ovlp, 0, sizeof
11850 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 (OVERLAPPED));.
11860 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f ovlp.Offset = o
11870 66 73 74 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 fst;.. /* Relea
11880 73 65 2f 41 63 71 75 69 72 65 20 74 68 65 20 73 se/Acquire the s
11890 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b ystem-level lock
118a0 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79 */. if( lockTy
118b0 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29 pe==_SHM_UNLCK )
118c0 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 55 6e 6c {. rc = osUnl
118d0 6f 63 6b 46 69 6c 65 45 78 28 70 46 69 6c 65 2d ockFileEx(pFile-
118e0 3e 68 46 69 6c 65 2e 68 2c 20 30 2c 20 6e 42 79 >hFile.h, 0, nBy
118f0 74 65 2c 20 30 2c 20 26 6f 76 6c 70 29 3b 0a 20 te, 0, &ovlp);.
11900 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d }else{. rc =
11910 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 28 70 46 osLockFileEx(pF
11920 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 64 77 ile->hFile.h, dw
11930 46 6c 61 67 73 2c 20 30 2c 20 6e 42 79 74 65 2c Flags, 0, nByte,
11940 20 30 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 0a 0, &ovlp);. }.
11950 20 20 0a 20 20 69 66 28 20 72 63 21 3d 20 30 20 . if( rc!= 0
11960 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 ){. rc = SQLI
11970 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a TE_OK;. }else{.
11980 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 pFile->lastE
11990 72 72 6e 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73 rrno = osGetLas
119a0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 tError();. rc
119b0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a = SQLITE_BUSY;.
119c0 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 }.. OSTRACE((
119d0 22 53 48 4d 2d 4c 4f 43 4b 20 25 64 20 25 73 20 "SHM-LOCK %d %s
119e0 25 73 20 30 78 25 30 38 6c 78 5c 6e 22 2c 20 0a %s 0x%08lx\n", .
119f0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 pFile
11a00 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 ->hFile.h,.
11a10 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 rc==SQLITE
11a20 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 _OK ? "ok" : "fa
11a30 69 6c 65 64 22 2c 0a 20 20 20 20 20 20 20 20 20 iled",.
11a40 20 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d lockType==_SHM
11a50 5f 55 4e 4c 43 4b 20 3f 20 22 55 6e 6c 6f 63 6b _UNLCK ? "Unlock
11a60 46 69 6c 65 45 78 22 20 3a 20 22 4c 6f 63 6b 46 FileEx" : "LockF
11a70 69 6c 65 45 78 22 2c 0a 20 20 20 20 20 20 20 20 ileEx",.
11a80 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 pFile->lastEr
11a90 72 6e 6f 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e rno));.. return
11aa0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 rc;.}../* Forwa
11ab0 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f rd references to
11ac0 20 56 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a VFS methods */.
11ad0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 static int winOp
11ae0 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c en(sqlite3_vfs*,
11af0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 const char*,sqli
11b00 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e te3_file*,int,in
11b10 74 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 t*);.static int
11b20 77 69 6e 44 65 6c 65 74 65 28 73 71 6c 69 74 65 winDelete(sqlite
11b30 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74 20 63 68 3_vfs *,const ch
11b40 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a ar*,int);../*.**
11b50 20 50 75 72 67 65 20 74 68 65 20 77 69 6e 53 68 Purge the winSh
11b60 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f mNodeList list o
11b70 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 f all entries wi
11b80 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 th winShmNode.nR
11b90 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 ef==0..**.** Thi
11ba0 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 s is not a VFS s
11bb0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 hared-memory met
11bc0 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 hod; it is a uti
11bd0 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 lity function ca
11be0 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 lled.** by VFS s
11bf0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 hared-memory met
11c00 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 hods..*/.static
11c10 76 6f 69 64 20 77 69 6e 53 68 6d 50 75 72 67 65 void winShmPurge
11c20 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 (sqlite3_vfs *pV
11c30 66 73 2c 20 69 6e 74 20 64 65 6c 65 74 65 46 6c fs, int deleteFl
11c40 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 ag){. winShmNod
11c50 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e 53 68 6d e **pp;. winShm
11c60 4e 6f 64 65 20 2a 70 3b 0a 20 20 42 4f 4f 4c 20 Node *p;. BOOL
11c70 62 52 63 3b 0a 20 20 61 73 73 65 72 74 28 20 77 bRc;. assert( w
11c80 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 inShmMutexHeld()
11c90 20 29 3b 0a 20 20 70 70 20 3d 20 26 77 69 6e 53 );. pp = &winS
11ca0 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 hmNodeList;. wh
11cb0 69 6c 65 28 20 28 70 20 3d 20 2a 70 70 29 21 3d ile( (p = *pp)!=
11cc0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 0 ){. if( p->
11cd0 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 nRef==0 ){.
11ce0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66 int i;. if
11cf0 28 20 70 2d 3e 6d 75 74 65 78 20 29 20 73 71 6c ( p->mutex ) sql
11d00 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 ite3_mutex_free(
11d10 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 p->mutex);.
11d20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e for(i=0; i<p->n
11d30 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 Region; i++){.
11d40 20 20 20 20 20 20 62 52 63 20 3d 20 6f 73 55 6e bRc = osUn
11d50 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 2d mapViewOfFile(p-
11d60 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61 70 >aRegion[i].pMap
11d70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 );. OSTRA
11d80 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 20 70 CE(("SHM-PURGE p
11d90 69 64 2d 25 64 20 75 6e 6d 61 70 20 72 65 67 69 id-%d unmap regi
11da0 6f 6e 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 on=%d %s\n",.
11db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 (i
11dc0 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74 50 nt)osGetCurrentP
11dd0 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 0a 20 rocessId(), i,.
11de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11df0 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 bRc ? "ok" : "fa
11e00 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 iled"));.
11e10 20 62 52 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 bRc = osCloseHa
11e20 6e 64 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b ndle(p->aRegion[
11e30 69 5d 2e 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 i].hMap);.
11e40 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d OSTRACE(("SHM-
11e50 50 55 52 47 45 20 70 69 64 2d 25 64 20 63 6c 6f PURGE pid-%d clo
11e60 73 65 20 72 65 67 69 6f 6e 3d 25 64 20 25 73 5c se region=%d %s\
11e70 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 n",.
11e80 20 20 20 20 20 28 69 6e 74 29 6f 73 47 65 74 43 (int)osGetC
11e90 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 urrentProcessId(
11ea0 29 2c 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20 ), i,.
11eb0 20 20 20 20 20 20 20 62 52 63 20 3f 20 22 6f 6b bRc ? "ok
11ec0 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a " : "failed"));.
11ed0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 }. if
11ee0 28 20 70 2d 3e 68 46 69 6c 65 2e 68 20 21 3d 20 ( p->hFile.h !=
11ef0 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 INVALID_HANDLE_V
11f00 41 4c 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20 ALUE ){.
11f10 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 SimulateIOErrorB
11f20 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 enign(1);.
11f30 20 20 77 69 6e 43 6c 6f 73 65 28 28 73 71 6c 69 winClose((sqli
11f40 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 2d 3e 68 te3_file *)&p->h
11f50 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 53 File);. S
11f60 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 imulateIOErrorBe
11f70 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d nign(0);. }
11f80 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c 65 74 . if( delet
11f90 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 eFlag ){.
11fa0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 SimulateIOError
11fb0 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 Benign(1);.
11fc0 20 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56 66 winDelete(pVf
11fd0 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c s, p->zFilename,
11fe0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 0);. Sim
11ff0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 ulateIOErrorBeni
12000 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 gn(0);. }.
12010 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e *pp = p->pN
12020 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 ext;. sqlit
12030 65 33 5f 66 72 65 65 28 70 2d 3e 61 52 65 67 69 e3_free(p->aRegi
12040 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 on);. sqlit
12050 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 e3_free(p);.
12060 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 20 }else{. pp
12070 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 = &p->pNext;.
12080 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 }. }.}../*.**
12090 4f 70 65 6e 20 74 68 65 20 73 68 61 72 65 64 2d Open the shared-
120a0 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f memory area asso
120b0 63 69 61 74 65 64 20 77 69 74 68 20 64 61 74 61 ciated with data
120c0 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e base file pDbFd.
120d0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e .**.** When open
120e0 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 ing a new shared
120f0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 -memory file, if
12100 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e no other instan
12110 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 ces of that.** f
12120 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c ile are currentl
12130 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 y open, in this
12140 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 process or in ot
12150 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74 her processes, t
12160 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 hen.** the file
12170 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 74 65 must be truncate
12180 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 d to zero length
12190 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 65 61 or have its hea
121a0 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a der cleared..*/.
121b0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 static int winOp
121c0 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 77 enSharedMemory(w
121d0 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a inFile *pDbFd){.
121e0 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20 struct winShm
121f0 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 *p;
12200 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e /* The conn
12210 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 ection to be ope
12220 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 ned */. struct
12230 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d winShmNode *pShm
12240 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a 20 54 Node = 0; /* T
12250 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d he underlying mm
12260 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 apped file */.
12270 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 int rc;
12280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12290 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 /* Result cod
122a0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69 e */. struct wi
122b0 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b 20 nShmNode *pNew;
122c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 /* New
122d0 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 6e ly allocated win
122e0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 ShmNode */. int
122f0 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 nName;
12300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12310 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61 6d 65 /* Size of zName
12320 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 in bytes */..
12330 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70 assert( pDbFd->p
12340 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 Shm==0 ); /*
12350 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20 6f Not previously o
12360 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 pened */.. /* A
12370 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f llocate space fo
12380 72 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74 65 r the new sqlite
12390 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20 20 41 3_shm object. A
123a0 6c 73 6f 20 73 70 65 63 75 6c 61 74 69 76 65 6c lso speculativel
123b0 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 y. ** allocate
123c0 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20 space for a new
123d0 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64 20 66 winShmNode and f
123e0 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 ilename.. */.
123f0 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c p = sqlite3_mall
12400 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 oc( sizeof(*p) )
12410 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 ;. if( p==0 ) r
12420 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 eturn SQLITE_IOE
12430 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 RR_NOMEM;. mems
12440 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 et(p, 0, sizeof(
12450 2a 70 29 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 *p));. nName =
12460 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 sqlite3Strlen30(
12470 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 pDbFd->zPath);.
12480 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f pNew = sqlite3_
12490 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a malloc( sizeof(*
124a0 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d pShmNode) + nNam
124b0 65 20 2b 20 31 35 20 29 3b 0a 20 20 69 66 28 20 e + 15 );. if(
124c0 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 pNew==0 ){. s
124d0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a qlite3_free(p);.
124e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
124f0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 E_IOERR_NOMEM;.
12500 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 }. memset(pNew
12510 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 , 0, sizeof(*pNe
12520 77 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 46 69 w));. pNew->zFi
12530 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 lename = (char*)
12540 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69 &pNew[1];. sqli
12550 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61 te3_snprintf(nNa
12560 6d 65 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69 me+15, pNew->zFi
12570 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 lename, "%s-shm"
12580 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b , pDbFd->zPath);
12590 0a 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 . sqlite3FileSu
125a0 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 ffix3(pDbFd->zPa
125b0 74 68 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e th, pNew->zFilen
125c0 61 6d 65 29 3b 20 0a 0a 20 20 2f 2a 20 4c 6f 6f ame); .. /* Loo
125d0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 k to see if ther
125e0 65 20 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67 e is an existing
125f0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74 winShmNode that
12600 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 20 can be used..
12610 2a 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e ** If no matchin
12620 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72 g winShmNode cur
12630 72 65 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63 rently exists, c
12640 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e reate a new one.
12650 0a 20 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e . */. winShmEn
12660 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f terMutex();. fo
12670 72 28 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e r(pShmNode = win
12680 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68 ShmNodeList; pSh
12690 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d mNode; pShmNode=
126a0 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29 pShmNode->pNext)
126b0 7b 0a 20 20 20 20 2f 2a 20 54 42 44 20 6e 65 65 {. /* TBD nee
126c0 64 20 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74 d to come up wit
126d0 68 20 62 65 74 74 65 72 20 6d 61 74 63 68 20 68 h better match h
126e0 65 72 65 2e 20 20 50 65 72 68 61 70 73 0a 20 20 ere. Perhaps.
126f0 20 20 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49 44 ** use FILE_ID
12700 5f 42 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53 _BOTH_DIR_INFO S
12710 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f tructure.. */
12720 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 . if( sqlite3
12730 53 74 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65 StrICmp(pShmNode
12740 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 ->zFilename, pNe
12750 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 w->zFilename)==0
12760 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 ) break;. }.
12770 69 66 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a if( pShmNode ){.
12780 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 sqlite3_free
12790 28 70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b (pNew);. }else{
127a0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 . pShmNode =
127b0 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d pNew;. pNew =
127c0 20 30 3b 0a 20 20 20 20 28 28 77 69 6e 46 69 6c 0;. ((winFil
127d0 65 2a 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 e*)(&pShmNode->h
127e0 46 69 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41 File))->h = INVA
127f0 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 LID_HANDLE_VALUE
12800 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e ;. pShmNode->
12810 70 4e 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f pNext = winShmNo
12820 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e 53 deList;. winS
12830 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68 hmNodeList = pSh
12840 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20 70 53 68 6d mNode;.. pShm
12850 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 Node->mutex = sq
12860 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f lite3_mutex_allo
12870 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 c(SQLITE_MUTEX_F
12880 41 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 AST);. if( pS
12890 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 hmNode->mutex==0
128a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 ){. rc = S
128b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 QLITE_IOERR_NOME
128c0 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 M;. goto sh
128d0 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 m_open_err;.
128e0 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f }.. rc = winO
128f0 70 65 6e 28 70 44 62 46 64 2d 3e 70 56 66 73 2c pen(pDbFd->pVfs,
12900 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
12910 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c pShmNode->zFil
12920 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 ename,
12930 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 /* Name of th
12940 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a e file (UTF-8) *
12950 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 /.
12960 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 (sqlite3_file
12970 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 *)&pShmNode->hFi
12980 6c 65 2c 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e le, /* File han
12990 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 20 20 dle here */.
129a0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c SQL
129b0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 20 53 ITE_OPEN_WAL | S
129c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 QLITE_OPEN_READW
129d0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 RITE | SQLITE_OP
129e0 45 4e 5f 43 52 45 41 54 45 2c 20 2f 2a 20 4d 6f EN_CREATE, /* Mo
129f0 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 20 20 de flags */.
12a00 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0);
12a10 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f . if( SQLITE_
12a20 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 OK!=rc ){.
12a30 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 rc = SQLITE_CANT
12a40 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 OPEN_BKPT;.
12a50 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 goto shm_open_e
12a60 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f rr;. }.. /
12a70 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 * Check to see i
12a80 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 f another proces
12a90 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 s is holding the
12aa0 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 dead-man switch
12ab0 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c .. ** If not,
12ac0 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 truncate the fi
12ad0 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 le to zero lengt
12ae0 68 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 h. . */. i
12af0 66 28 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c f( winShmSystemL
12b00 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 ock(pShmNode, _S
12b10 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f 53 48 HM_WRLCK, WIN_SH
12b20 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 M_DMS, 1)==SQLIT
12b30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 E_OK ){. rc
12b40 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 = winTruncate((
12b50 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 sqlite3_file *)&
12b60 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c pShmNode->hFile,
12b70 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 0);. if( r
12b80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a c!=SQLITE_OK ){.
12b90 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e rc = win
12ba0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f LogError(SQLITE_
12bb0 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f IOERR_SHMOPEN, o
12bc0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c sGetLastError(),
12bd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
12be0 20 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 "winOpenShm",
12bf0 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 pDbFd->zPath);.
12c00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 }. }.
12c10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f if( rc==SQLITE_
12c20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 53 OK ){. winS
12c30 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 hmSystemLock(pSh
12c40 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 mNode, _SHM_UNLC
12c50 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 K, WIN_SHM_DMS,
12c60 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 1);. rc = w
12c70 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 inShmSystemLock(
12c80 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 pShmNode, _SHM_R
12c90 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d DLCK, WIN_SHM_DM
12ca0 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 S, 1);. }.
12cb0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 if( rc ) goto s
12cc0 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d hm_open_err;. }
12cd0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 .. /* Make the
12ce0 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 new connection a
12cf0 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69 child of the wi
12d00 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d nShmNode */. p-
12d10 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d >pShmNode = pShm
12d20 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c Node;.#ifdef SQL
12d30 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 ITE_DEBUG. p->i
12d40 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 d = pShmNode->ne
12d50 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 xtShmId++;.#endi
12d60 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 f. pShmNode->nR
12d70 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 ef++;. pDbFd->p
12d80 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68 Shm = p;. winSh
12d90 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a mLeaveMutex();..
12da0 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e /* The referen
12db0 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d ce count on pShm
12dc0 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79 Node has already
12dd0 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 been incremente
12de0 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 d under. ** the
12df0 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77 69 cover of the wi
12e00 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 nShmEnterMutex()
12e10 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 mutex and the p
12e20 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a ointer from the.
12e30 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 ** new (struct
12e40 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20 winShm) object
12e50 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 to the pShmNode
12e60 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c has been set. Al
12e70 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c l that is. ** l
12e80 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 eft to do is to
12e90 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a link the new obj
12ea0 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e ect into the lin
12eb0 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e ked list startin
12ec0 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f g. ** at pShmNo
12ed0 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 de->pFirst. This
12ee0 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 must be done wh
12ef0 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 ile holding the
12f00 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 pShmNode->mutex
12f10 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a . ** mutex.. *
12f20 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 /. sqlite3_mute
12f30 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 x_enter(pShmNode
12f40 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 ->mutex);. p->p
12f50 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d Next = pShmNode-
12f60 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e >pFirst;. pShmN
12f70 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b ode->pFirst = p;
12f80 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 . sqlite3_mutex
12f90 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d _leave(pShmNode-
12fa0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 >mutex);. retur
12fb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 n SQLITE_OK;..
12fc0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 /* Jump here on
12fd0 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d any error */.shm
12fe0 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e _open_err:. win
12ff0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 ShmSystemLock(pS
13000 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c hmNode, _SHM_UNL
13010 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c CK, WIN_SHM_DMS,
13020 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72 1);. winShmPur
13030 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 ge(pDbFd->pVfs,
13040 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73 0); /* This
13050 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d call frees pShm
13060 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64 Node if required
13070 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 */. sqlite3_fr
13080 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 ee(p);. sqlite3
13090 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77 _free(pNew);. w
130a0 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 inShmLeaveMutex(
130b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a );. return rc;.
130c0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 }../*.** Close a
130d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 connection to s
130e0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 hared-memory. D
130f0 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c elete the underl
13100 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 ying .** storage
13110 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 if deleteFlag i
13120 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 s true..*/.stati
13130 63 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61 c int winShmUnma
13140 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c p(. sqlite3_fil
13150 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 e *fd,
13160 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 /* Database hold
13170 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 ing shared memor
13180 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 y */. int delet
13190 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 eFlag
131a0 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74 65 /* Delete afte
131b0 72 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72 75 r closing if tru
131c0 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c e */.){. winFil
131d0 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 e *pDbFd;
131e0 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 /* Database hold
131f0 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 ing shared-memor
13200 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 y */. winShm *p
13210 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 ; /*
13220 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 The connection t
13230 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 o be closed */.
13240 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 winShmNode *pSh
13250 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e mNode; /* The un
13260 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d derlying shared-
13270 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 memory file */.
13280 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20 winShm **pp;
13290 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f /* For lo
132a0 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 oping over sibli
132b0 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a ng connections *
132c0 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77 69 /.. pDbFd = (wi
132d0 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d nFile*)fd;. p =
132e0 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 pDbFd->pShm;.
132f0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 if( p==0 ) retur
13300 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 n SQLITE_OK;. p
13310 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 ShmNode = p->pSh
13320 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d mNode;.. /* Rem
13330 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 ove connection p
13340 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 from the set of
13350 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 connections ass
13360 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 ociated. ** wit
13370 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 h pShmNode */.
13380 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e sqlite3_mutex_en
13390 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 ter(pShmNode->mu
133a0 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 tex);. for(pp=&
133b0 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 pShmNode->pFirst
133c0 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d ; (*pp)!=p; pp =
133d0 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b &(*pp)->pNext){
133e0 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 }. *pp = p->pNe
133f0 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 xt;.. /* Free t
13400 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 he connection p
13410 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 */. sqlite3_fre
13420 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 e(p);. pDbFd->p
13430 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 Shm = 0;. sqlit
13440 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 e3_mutex_leave(p
13450 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b ShmNode->mutex);
13460 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f .. /* If pShmNo
13470 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 de->nRef has rea
13480 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f ched 0, then clo
13490 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e se the underlyin
134a0 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 g. ** shared-me
134b0 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a mory file, too *
134c0 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d /. winShmEnterM
134d0 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 utex();. assert
134e0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 ( pShmNode->nRef
134f0 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 >0 );. pShmNode
13500 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 ->nRef--;. if(
13510 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d pShmNode->nRef==
13520 30 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50 0 ){. winShmP
13530 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 urge(pDbFd->pVfs
13540 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20 , deleteFlag);.
13550 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 }. winShmLeave
13560 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 Mutex();.. retu
13570 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a rn SQLITE_OK;.}.
13580 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 ./*.** Change th
13590 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 e lock state for
135a0 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 a shared-memory
135b0 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 segment..*/.sta
135c0 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f tic int winShmLo
135d0 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 ck(. sqlite3_fi
135e0 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 le *fd,
135f0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c /* Database fil
13600 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 e holding the sh
13610 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 ared memory */.
13620 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 int ofst,
13630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 /* F
13640 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 irst lock to acq
13650 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 uire or release
13660 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 */. int n,
13670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13680 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 /* Number of loc
13690 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 ks to acquire or
136a0 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e release */. in
136b0 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 t flags
136c0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 /* What
136d0 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 to do with the
136e0 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e lock */.){. win
136f0 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 File *pDbFd = (w
13700 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 inFile*)fd;
13710 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e /* Connection
13720 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 holding shared
13730 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 memory */. winS
13740 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 hm *p = pDbFd->p
13750 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 Shm;
13760 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 /* The shared
13770 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 memory being loc
13780 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 ked */. winShm
13790 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 *pX;
137a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
137b0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 * For looping ov
137c0 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 er all siblings
137d0 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 */. winShmNode
137e0 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 *pShmNode = p->p
137f0 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 ShmNode;. int r
13800 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 c = SQLITE_OK;
13810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13820 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 /* Result code
13830 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 */. u16 mask;
13840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 /* Ma
13860 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 sk of locks to t
13870 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a ake or release *
13880 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 /.. assert( ofs
13890 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d t>=0 && ofst+n<=
138a0 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b SQLITE_SHM_NLOCK
138b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e );. assert( n>
138c0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 =1 );. assert(
138d0 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 flags==(SQLITE_S
138e0 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 HM_LOCK | SQLITE
138f0 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 _SHM_SHARED).
13900 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 || flags==(S
13910 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c QLITE_SHM_LOCK |
13920 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c SQLITE_SHM_EXCL
13930 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c USIVE). ||
13940 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f flags==(SQLITE_
13950 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c SHM_UNLOCK | SQL
13960 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a ITE_SHM_SHARED).
13970 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d || flags=
13980 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c =(SQLITE_SHM_UNL
13990 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d OCK | SQLITE_SHM
139a0 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 _EXCLUSIVE) );.
139b0 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c assert( n==1 ||
139c0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 (flags & SQLITE
139d0 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 _SHM_EXCLUSIVE)!
139e0 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 =0 );.. mask =
139f0 28 75 31 36 29 28 28 31 55 3c 3c 28 6f 66 73 74 (u16)((1U<<(ofst
13a00 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74 +n)) - (1U<<ofst
13a10 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e ));. assert( n>
13a20 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 1 || mask==(1<<o
13a30 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 fst) );. sqlite
13a40 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 3_mutex_enter(pS
13a50 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a hmNode->mutex);.
13a60 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 if( flags & SQ
13a70 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 LITE_SHM_UNLOCK
13a80 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 ){. u16 allMa
13a90 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 sk = 0; /* Mask
13aa0 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 of locks held by
13ab0 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 siblings */..
13ac0 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 /* See if any
13ad0 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 siblings hold th
13ae0 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a is same lock */.
13af0 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e for(pX=pShmN
13b00 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b ode->pFirst; pX;
13b10 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a pX=pX->pNext){.
13b20 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 if( pX==p
13b30 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 ) continue;.
13b40 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 assert( (pX->e
13b50 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 xclMask & (p->ex
13b60 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 clMask|p->shared
13b70 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 Mask))==0 );.
13b80 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 allMask |= pX
13b90 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 ->sharedMask;.
13ba0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f }.. /* Unlo
13bb0 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 ck the system-le
13bc0 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 vel locks */.
13bd0 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c if( (mask & all
13be0 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 Mask)==0 ){.
13bf0 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 rc = winShmSys
13c00 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 temLock(pShmNode
13c10 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 , _SHM_UNLCK, of
13c20 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c st+WIN_SHM_BASE,
13c30 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a n);. }else{.
13c40 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 rc = SQLIT
13c50 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 E_OK;. }..
13c60 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 /* Undo the loc
13c70 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 al locks */.
13c80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f if( rc==SQLITE_O
13c90 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 K ){. p->ex
13ca0 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b clMask &= ~mask;
13cb0 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 . p->shared
13cc0 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 Mask &= ~mask;.
13cd0 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 } . }else if
13ce0 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 ( flags & SQLITE
13cf0 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 _SHM_SHARED ){.
13d00 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 u16 allShared
13d10 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 = 0; /* Union
13d20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 of locks held by
13d30 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 connections oth
13d40 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a er than "p" */..
13d50 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 /* Find out
13d60 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 which shared loc
13d70 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 ks are already h
13d80 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 eld by sibling c
13d90 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 onnections..
13da0 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e ** If any siblin
13db0 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 g already holds
13dc0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 an exclusive loc
13dd0 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 k, go ahead and
13de0 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 return. ** SQ
13df0 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a LITE_BUSY.. *
13e00 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 /. for(pX=pSh
13e10 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 mNode->pFirst; p
13e20 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 X; pX=pX->pNext)
13e30 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d {. if( (pX-
13e40 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b >exclMask & mask
13e50 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 )!=0 ){.
13e60 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 rc = SQLITE_BUSY
13e70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b ;. break;
13e80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 . }. a
13e90 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e llShared |= pX->
13ea0 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 sharedMask;.
13eb0 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 }.. /* Get sh
13ec0 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 ared locks at th
13ed0 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 e system level,
13ee0 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a if necessary */.
13ef0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 if( rc==SQLI
13f00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 TE_OK ){. i
13f10 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 f( (allShared &
13f20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 mask)==0 ){.
13f30 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 rc = winShmS
13f40 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f ystemLock(pShmNo
13f50 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 de, _SHM_RDLCK,
13f60 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 ofst+WIN_SHM_BAS
13f70 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c E, n);. }el
13f80 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d se{. rc =
13f90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 SQLITE_OK;.
13fa0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f }. }.. /
13fb0 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 * Get the local
13fc0 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a shared locks */.
13fd0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 if( rc==SQLI
13fe0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 TE_OK ){. p
13ff0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 ->sharedMask |=
14000 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 mask;. }. }e
14010 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 lse{. /* Make
14020 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 sure no sibling
14030 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c connections hol
14040 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c d locks that wil
14050 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 l block this.
14060 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e ** lock. If an
14070 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c y do, return SQL
14080 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61 ITE_BUSY right a
14090 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 way.. */.
140a0 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d for(pX=pShmNode-
140b0 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d >pFirst; pX; pX=
140c0 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 pX->pNext){.
140d0 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d if( (pX->exclM
140e0 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c ask & mask)!=0 |
140f0 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 | (pX->sharedMas
14100 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a k & mask)!=0 ){.
14110 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c rc = SQL
14120 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 ITE_BUSY;.
14130 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d break;. }
14140 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a . }. . /*
14150 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 Get the exclusi
14160 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 ve locks at the
14170 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 system level. T
14180 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 hen if successfu
14190 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 l. ** also ma
141a0 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e rk the local con
141b0 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 nection as being
141c0 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a locked.. */.
141d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 if( rc==SQLI
141e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 TE_OK ){. r
141f0 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d c = winShmSystem
14200 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f Lock(pShmNode, _
14210 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b SHM_WRLCK, ofst+
14220 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 WIN_SHM_BASE, n)
14230 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d ;. if( rc==
14240 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 SQLITE_OK ){.
14250 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d assert( (p-
14260 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 >sharedMask & ma
14270 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 sk)==0 );.
14280 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d p->exclMask |=
14290 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 mask;. }.
142a0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 }. }. sqlit
142b0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 e3_mutex_leave(p
142c0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b ShmNode->mutex);
142d0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d . OSTRACE(("SHM
142e0 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 -LOCK shmid-%d,
142f0 70 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c pid-%d got %03x,
14300 25 30 33 78 20 25 73 5c 6e 22 2c 0a 20 20 20 20 %03x %s\n",.
14310 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 28 69 p->id, (i
14320 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74 50 nt)osGetCurrentP
14330 72 6f 63 65 73 73 49 64 28 29 2c 20 70 2d 3e 73 rocessId(), p->s
14340 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 haredMask, p->ex
14350 63 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 clMask,.
14360 20 20 20 72 63 20 3f 20 22 66 61 69 6c 65 64 22 rc ? "failed"
14370 20 3a 20 22 6f 6b 22 29 29 3b 0a 20 20 72 65 74 : "ok"));. ret
14380 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a urn rc;.}../*.**
14390 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d Implement a mem
143a0 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d ory barrier or m
143b0 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 emory fence on s
143c0 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a hared memory. .
143d0 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 **.** All loads
143e0 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e and stores begun
143f0 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 before the barr
14400 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 ier must complet
14410 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 e before.** any
14420 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 load or store be
14430 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 gun after the ba
14440 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 rrier..*/.static
14450 20 76 6f 69 64 20 77 69 6e 53 68 6d 42 61 72 72 void winShmBarr
14460 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 ier(. sqlite3_f
14470 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 ile *fd
14480 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c /* Database hol
14490 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 ding the shared
144a0 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 memory */.){. U
144b0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 NUSED_PARAMETER(
144c0 66 64 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 fd);. /* Memory
144d0 42 61 72 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f Barrier(); // do
144e0 65 73 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 es not work -- d
144f0 6f 20 6e 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e o not know why n
14500 6f 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e ot */. winShmEn
14510 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 77 69 terMutex();. wi
14520 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 nShmLeaveMutex()
14530 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 ;.}../*.** This
14540 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c function is call
14550 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 ed to obtain a p
14560 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e ointer to region
14570 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 iRegion of the
14580 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 .** shared-memor
14590 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 y associated wit
145a0 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 h the database f
145b0 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d ile fd. Shared-m
145c0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a emory regions .*
145d0 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 * are numbered s
145e0 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 tarting from zer
145f0 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d o. Each shared-m
14600 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 emory region is
14610 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 szRegion .** byt
14620 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a es in size..**.*
14630 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 * If an error oc
14640 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 curs, an error c
14650 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 ode is returned
14660 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 and *pp is set t
14670 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 o NULL..**.** Ot
14680 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 herwise, if the
14690 69 73 57 72 69 74 65 20 70 61 72 61 6d 65 74 65 isWrite paramete
146a0 72 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 r is 0 and the r
146b0 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d equested shared-
146c0 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e memory.** region
146d0 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c has not been al
146e0 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 located (by any
146f0 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e client, includin
14700 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e g one running in
14710 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 a.** separate p
14720 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 rocess), then *p
14730 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c p is set to NULL
14740 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 and SQLITE_OK r
14750 65 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 eturned. If .**
14760 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a isWrite is non-z
14770 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 ero and the requ
14780 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d ested shared-mem
14790 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e ory region has n
147a0 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 ot yet .** been
147b0 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 allocated, it is
147c0 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 allocated by th
147d0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a is function..**.
147e0 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 ** If the shared
147f0 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 -memory region h
14800 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 as already been
14810 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 allocated or is
14820 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 allocated by.**
14830 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 this call as des
14840 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 cribed above, th
14850 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 en it is mapped
14860 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 into this proces
14870 73 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 ses .** address
14880 73 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20 space (if it is
14890 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 not already), *p
148a0 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e p is set to poin
148b0 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 t to the mapped
148c0 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 .** memory and S
148d0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 QLITE_OK returne
148e0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 d..*/.static int
148f0 20 77 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 winShmMap(. sq
14900 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 lite3_file *fd,
14910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
14920 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 Handle open on
14930 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f database file */
14940 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 . int iRegion,
14950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14960 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 /* Region to
14970 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e retrieve */. in
14980 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 t szRegion,
14990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
149a0 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 Size of regions
149b0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 57 72 69 74 */. int isWrit
149c0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e,
149d0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f /* True to
149e0 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 extend file if
149f0 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 necessary */. v
14a00 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 oid volatile **p
14a10 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f p /
14a20 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 * OUT: Mapped me
14a30 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e mory */.){. win
14a40 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 File *pDbFd = (w
14a50 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 inFile*)fd;. wi
14a60 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d nShm *p = pDbFd-
14a70 3e 70 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e >pShm;. winShmN
14a80 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 ode *pShmNode;.
14a90 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 int rc = SQLITE
14aa0 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 20 29 _OK;.. if( !p )
14ab0 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 {. rc = winOp
14ac0 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 enSharedMemory(p
14ad0 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 DbFd);. if( r
14ae0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 c!=SQLITE_OK ) r
14af0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 20 eturn rc;. p
14b00 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 = pDbFd->pShm;.
14b10 20 7d 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 }. pShmNode =
14b20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 p->pShmNode;..
14b30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e sqlite3_mutex_en
14b40 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 ter(pShmNode->mu
14b50 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 tex);. assert(
14b60 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f szRegion==pShmNo
14b70 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 de->szRegion ||
14b80 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f pShmNode->nRegio
14b90 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 n==0 );.. if( p
14ba0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e ShmNode->nRegion
14bb0 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 <=iRegion ){.
14bc0 20 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f struct ShmRegio
14bd0 6e 20 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 n *apNew;
14be0 20 20 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 /* New aRegi
14bf0 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 on[] array */.
14c00 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 int nByte = (i
14c10 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 Region+1)*szRegi
14c20 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 on; /* Minimum
14c30 72 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 required file si
14c40 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 ze */. sqlite
14c50 33 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 3_int64 sz;
14c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
14c70 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 Current size of
14c80 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a wal-index file *
14c90 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d /.. pShmNode-
14ca0 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 >szRegion = szRe
14cb0 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 gion;.. /* Th
14cc0 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 e requested regi
14cd0 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 on is not mapped
14ce0 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 into this proce
14cf0 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 sses address spa
14d00 63 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b ce.. ** Check
14d10 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 to see if it ha
14d20 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 s been allocated
14d30 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 (i.e. if the wa
14d40 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a l-index file is.
14d50 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f ** large eno
14d60 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 ugh to contain t
14d70 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 he requested reg
14d80 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 ion).. */.
14d90 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a rc = winFileSiz
14da0 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 e((sqlite3_file
14db0 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 *)&pShmNode->hFi
14dc0 6c 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 le, &sz);. if
14dd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc!=SQLITE_OK
14de0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 ){. rc = wi
14df0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 nLogError(SQLITE
14e00 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 _IOERR_SHMSIZE,
14e10 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 osGetLastError()
14e20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
14e30 20 22 77 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70 "winShmMap1", p
14e40 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 DbFd->zPath);.
14e50 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 goto shmpage
14e60 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 _out;. }..
14e70 20 69 66 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b if( sz<nByte ){
14e80 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 . /* The re
14e90 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 quested memory r
14ea0 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 egion does not e
14eb0 78 69 73 74 2e 20 49 66 20 69 73 57 72 69 74 65 xist. If isWrite
14ec0 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 is set to.
14ed0 20 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20 65 ** zero, exit e
14ee0 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 arly. *pp will b
14ef0 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e e set to NULL an
14f00 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 d SQLITE_OK retu
14f10 72 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 rned.. **.
14f20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 ** Alternat
14f30 69 76 65 6c 79 2c 20 69 66 20 69 73 57 72 69 74 ively, if isWrit
14f40 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 e is non-zero, u
14f50 73 65 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 se ftruncate() t
14f60 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 o allocate.
14f70 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 ** the requeste
14f80 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e d memory region.
14f90 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 . */.
14fa0 69 66 28 20 21 69 73 57 72 69 74 65 20 29 20 67 if( !isWrite ) g
14fb0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b oto shmpage_out;
14fc0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 . rc = winT
14fd0 72 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 runcate((sqlite3
14fe0 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 _file *)&pShmNod
14ff0 65 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65 29 e->hFile, nByte)
15000 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d ;. if( rc!=
15010 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 SQLITE_OK ){.
15020 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 rc = winLog
15030 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 Error(SQLITE_IOE
15040 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 RR_SHMSIZE, osGe
15050 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 tLastError(),.
15060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 "
15070 77 69 6e 53 68 6d 4d 61 70 32 22 2c 20 70 44 62 winShmMap2", pDb
15080 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 Fd->zPath);.
15090 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 goto shmpage
150a0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 _out;. }.
150b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 }.. /* Map
150c0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 the requested me
150d0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f mory region into
150e0 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 this processes
150f0 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a address space. *
15100 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 73 /. apNew = (s
15110 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 truct ShmRegion
15120 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f *)sqlite3_reallo
15130 63 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e c(. pShmN
15140 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69 ode->aRegion, (i
15150 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 Region+1)*sizeof
15160 28 61 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29 (apNew[0]). )
15170 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 ;. if( !apNew
15180 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 ){. rc = S
15190 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 QLITE_IOERR_NOME
151a0 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 M;. goto sh
151b0 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d mpage_out;. }
151c0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 . pShmNode->a
151d0 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a Region = apNew;.
151e0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d . while( pShm
151f0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 Node->nRegion<=i
15200 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 Region ){.
15210 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 HANDLE hMap;
15220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 /* f
15230 69 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64 ile-mapping hand
15240 6c 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 le */. void
15250 20 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 *pMap = 0;
15260 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 65 /* Mappe
15270 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 d memory region
15280 2a 2f 0a 20 20 20 20 20 0a 20 20 20 20 20 20 68 */. . h
15290 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 Map = osCreateFi
152a0 6c 65 4d 61 70 70 69 6e 67 28 70 53 68 6d 4e 6f leMapping(pShmNo
152b0 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 0a 20 20 de->hFile.h, .
152c0 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 NULL, PA
152d0 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c GE_READWRITE, 0,
152e0 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 nByte, NULL.
152f0 20 20 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 );. OSTR
15300 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 20 70 69 ACE(("SHM-MAP pi
15310 64 2d 25 64 20 63 72 65 61 74 65 20 72 65 67 69 d-%d create regi
15320 6f 6e 3d 25 64 20 6e 62 79 74 65 3d 25 64 20 25 on=%d nbyte=%d %
15330 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 s\n",.
15340 20 20 20 20 20 28 69 6e 74 29 6f 73 47 65 74 43 (int)osGetC
15350 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 urrentProcessId(
15360 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 ), pShmNode->nRe
15370 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20 20 20 gion, nByte,.
15380 20 20 20 20 20 20 20 20 20 20 20 20 68 4d 61 70 hMap
15390 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 ? "ok" : "faile
153a0 64 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 d"));. if(
153b0 68 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 hMap ){.
153c0 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 70 53 int iOffset = pS
153d0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a hmNode->nRegion*
153e0 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 20 20 szRegion;.
153f0 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 int iOffsetShi
15400 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 ft = iOffset % w
15410 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f inSysInfo.dwAllo
15420 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 cationGranularit
15430 79 3b 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 y;. pMap
15440 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c = osMapViewOfFil
15450 65 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 e(hMap, FILE_MAP
15460 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 _WRITE | FILE_MA
15470 50 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 P_READ,.
15480 20 20 20 20 30 2c 20 69 4f 66 66 73 65 74 20 2d 0, iOffset -
15490 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73 iOffsetShift, s
154a0 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 zRegion + iOffse
154b0 74 53 68 69 66 74 0a 20 20 20 20 20 20 20 20 29 tShift. )
154c0 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 ;. OSTRAC
154d0 45 28 28 22 53 48 4d 2d 4d 41 50 20 70 69 64 2d E(("SHM-MAP pid-
154e0 25 64 20 6d 61 70 20 72 65 67 69 6f 6e 3d 25 64 %d map region=%d
154f0 20 6f 66 66 73 65 74 3d 25 64 20 73 69 7a 65 3d offset=%d size=
15500 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 %d %s\n",.
15510 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 (int)
15520 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 osGetCurrentProc
15530 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 essId(), pShmNod
15540 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f 66 66 e->nRegion, iOff
15550 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 set,.
15560 20 20 20 20 20 20 73 7a 52 65 67 69 6f 6e 2c 20 szRegion,
15570 70 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 pMap ? "ok" : "f
15580 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 ailed"));.
15590 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 4d 61 }. if( !pMa
155a0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68 p ){. pSh
155b0 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f mNode->lastErrno
155c0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f = osGetLastErro
155d0 72 28 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 r();. rc
155e0 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 = winLogError(SQ
155f0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 LITE_IOERR_SHMMA
15600 50 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 P, pShmNode->las
15610 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 tErrno,.
15620 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d "winShm
15630 4d 61 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50 Map3", pDbFd->zP
15640 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69 66 ath);. if
15650 28 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73 65 ( hMap ) osClose
15660 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20 Handle(hMap);.
15670 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 goto shmpa
15680 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a ge_out;. }.
15690 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d . pShmNode-
156a0 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 >aRegion[pShmNod
156b0 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 e->nRegion].pMap
156c0 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20 20 70 = pMap;. p
156d0 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e ShmNode->aRegion
156e0 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 [pShmNode->nRegi
156f0 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b on].hMap = hMap;
15700 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d . pShmNode-
15710 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 >nRegion++;.
15720 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f }. }..shmpage_o
15730 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f ut:. if( pShmNo
15740 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 de->nRegion>iReg
15750 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 ion ){. int i
15760 4f 66 66 73 65 74 20 3d 20 69 52 65 67 69 6f 6e Offset = iRegion
15770 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69 *szRegion;. i
15780 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20 nt iOffsetShift
15790 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53 = iOffset % winS
157a0 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 ysInfo.dwAllocat
157b0 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a ionGranularity;.
157c0 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63 char *p = (c
157d0 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e har *)pShmNode->
157e0 61 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d aRegion[iRegion]
157f0 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d .pMap;. *pp =
15800 20 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66 (void *)&p[iOff
15810 73 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c setShift];. }el
15820 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b se{. *pp = 0;
15830 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d . }. sqlite3_m
15840 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e utex_leave(pShmN
15850 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 ode->mutex);. r
15860 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c eturn rc;.}..#el
15870 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 se.# define winS
15880 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 hmMap 0.# de
15890 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 fine winShmLock
158a0 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 0.# define wi
158b0 6e 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 nShmBarrier 0.#
158c0 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d define winShmUnm
158d0 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a ap 0.#endif /*
158e0 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f #ifndef SQLITE_
158f0 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a OMIT_WAL */../*.
15900 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 ** Here ends the
15910 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 implementation
15920 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 of all sqlite3_f
15930 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a ile methods..**.
15940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15950 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 ****** End sqlit
15960 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 e3_file Methods
15970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a ***************.
15990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
159a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
159b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
159c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
159d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a **************/.
159e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 ./*.** This vect
159f0 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 or defines all t
15a00 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 he methods that
15a10 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 can operate on a
15a20 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c n.** sqlite3_fil
15a30 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a e for win32..*/.
15a40 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c static const sql
15a50 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 ite3_io_methods
15a60 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a winIoMethod = {.
15a70 20 20 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 2,
15a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15a90 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f /* iVersion */
15aa0 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20 20 . winClose,
15ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15ac0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a /* xClose */.
15ad0 20 20 77 69 6e 52 65 61 64 2c 20 20 20 20 20 20 winRead,
15ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15af0 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 /* xRead */.
15b00 77 69 6e 57 72 69 74 65 2c 20 20 20 20 20 20 20 winWrite,
15b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15b20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 77 /* xWrite */. w
15b30 69 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 inTruncate,
15b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
15b50 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 * xTruncate */.
15b60 20 77 69 6e 53 79 6e 63 2c 20 20 20 20 20 20 20 winSync,
15b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15b80 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 77 /* xSync */. w
15b90 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 inFileSize,
15ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
15bb0 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 * xFileSize */.
15bc0 20 77 69 6e 4c 6f 63 6b 2c 20 20 20 20 20 20 20 winLock,
15bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15be0 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77 /* xLock */. w
15bf0 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 inUnlock,
15c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
15c10 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77 * xUnlock */. w
15c20 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c inCheckReservedL
15c30 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 2f ock, /
15c40 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 * xCheckReserved
15c50 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69 6c Lock */. winFil
15c60 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 eControl,
15c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 /* xFi
15c80 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77 leControl */. w
15c90 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 inSectorSize,
15ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
15cb0 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f * xSectorSize */
15cc0 0a 20 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 . winDeviceChar
15cd0 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 20 20 acteristics,
15ce0 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61 /* xDeviceCha
15cf0 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a racteristics */.
15d00 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20 20 winShmMap,
15d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15d20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a /* xShmMap */.
15d30 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20 winShmLock,
15d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15d50 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f /* xShmLock */
15d60 0a 20 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 . winShmBarrier
15d70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
15d80 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 /* xShmBarrie
15d90 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e 6d r */. winShmUnm
15da0 61 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ap
15db0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e /* xShmUn
15dc0 6d 61 70 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a map */.};../****
15dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15e10 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a ********.*******
15e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15e30 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 ***** sqlite3_vf
15e40 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a s methods ******
15e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
15e60 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 ******.**.** Thi
15e70 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 s division conta
15e80 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e ins the implemen
15e90 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 tation of method
15ea0 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 s on the.** sqli
15eb0 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a te3_vfs object..
15ec0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 */../*.** Conver
15ed0 74 20 61 20 55 54 46 2d 38 20 66 69 6c 65 6e 61 t a UTF-8 filena
15ee0 6d 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 me into whatever
15ef0 20 66 6f 72 6d 20 74 68 65 20 75 6e 64 65 72 6c form the underl
15f00 79 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6e ying.** operatin
15f10 67 20 73 79 73 74 65 6d 20 77 61 6e 74 73 20 66 g system wants f
15f20 69 6c 65 6e 61 6d 65 73 20 69 6e 2e 20 20 53 70 ilenames in. Sp
15f30 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 ace to hold the
15f40 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 result.** is obt
15f50 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f ained from mallo
15f60 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 c and must be fr
15f70 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 eed by the calli
15f80 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a ng.** function..
15f90 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a */.static void *
15fa0 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e convertUtf8Filen
15fb0 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a ame(const char *
15fc0 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76 6f zFilename){. vo
15fd0 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d id *zConverted =
15fe0 20 30 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 0;. if( isNT()
15ff0 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 ){. zConvert
16000 65 64 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f ed = utf8ToUnico
16010 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 2f de(zFilename);./
16020 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 * isNT() is 1 if
16030 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 SQLITE_OS_WINCE
16040 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 ==1, so this els
16050 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 e is never execu
16060 74 65 64 2e 20 0a 2a 2f 0a 23 69 66 20 53 51 4c ted. .*/.#if SQL
16070 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a ITE_OS_WINCE==0.
16080 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f }else{. zCo
16090 6e 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65 nverted = sqlite
160a0 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 3_win32_utf8_to_
160b0 6d 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65 29 3b mbcs(zFilename);
160c0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 2f 2a .#endif. }. /*
160d0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e caller will han
160e0 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 dle out of memor
160f0 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 y */. return zC
16100 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a onverted;.}../*.
16110 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 ** Create a temp
16120 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 orary file name
16130 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d in zBuf. zBuf m
16140 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 ust be big enoug
16150 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20 h to.** hold at
16160 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 pVfs->mxPathname
16170 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a characters..*/.
16180 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 54 65 static int getTe
16190 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c mpname(int nBuf,
161a0 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 char *zBuf){.
161b0 73 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61 static char zCha
161c0 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 rs[] =. "abcd
161d0 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 efghijklmnopqrst
161e0 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 uvwxyz". "ABC
161f0 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 DEFGHIJKLMNOPQRS
16200 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 TUVWXYZ". "01
16210 32 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a 23456789";. siz
16220 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 e_t i, j;. char
16230 20 7a 54 65 6d 70 50 61 74 68 5b 4d 41 58 5f 50 zTempPath[MAX_P
16240 41 54 48 2b 31 5d 3b 0a 0a 20 20 2f 2a 20 49 74 ATH+1];.. /* It
16250 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 's odd to simula
16260 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 te an io-error h
16270 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 ere, but really
16280 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a this is just. *
16290 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 * using the io-e
162a0 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 rror infrastruct
162b0 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 ure to test that
162c0 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 SQLite handles
162d0 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 this. ** functi
162e0 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a on failing. . *
162f0 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 /. SimulateIOEr
16300 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 ror( return SQLI
16310 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 69 TE_IOERR );.. i
16320 66 28 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f f( sqlite3_temp_
16330 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 directory ){.
16340 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 sqlite3_snprint
16350 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a f(MAX_PATH-30, z
16360 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20 TempPath, "%s",
16370 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 sqlite3_temp_dir
16380 65 63 74 6f 72 79 29 3b 0a 20 20 7d 65 6c 73 65 ectory);. }else
16390 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 if( isNT() ){.
163a0 20 20 20 63 68 61 72 20 2a 7a 4d 75 6c 74 69 3b char *zMulti;
163b0 0a 20 20 20 20 57 43 48 41 52 20 7a 57 69 64 65 . WCHAR zWide
163c0 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a Path[MAX_PATH];.
163d0 20 20 20 20 6f 73 47 65 74 54 65 6d 70 50 61 74 osGetTempPat
163e0 68 57 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 hW(MAX_PATH-30,
163f0 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 zWidePath);.
16400 7a 4d 75 6c 74 69 20 3d 20 75 6e 69 63 6f 64 65 zMulti = unicode
16410 54 6f 55 74 66 38 28 7a 57 69 64 65 50 61 74 68 ToUtf8(zWidePath
16420 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c 74 );. if( zMult
16430 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 i ){. sqlit
16440 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f e3_snprintf(MAX_
16450 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 PATH-30, zTempPa
16460 74 68 2c 20 22 25 73 22 2c 20 7a 4d 75 6c 74 69 th, "%s", zMulti
16470 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 );. sqlite3
16480 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 _free(zMulti);.
16490 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
164a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f return SQLITE_IO
164b0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d ERR_NOMEM;. }
164c0 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 ./* isNT() is 1
164d0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e if SQLITE_OS_WIN
164e0 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 CE==1, so this e
164f0 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 lse is never exe
16500 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 cuted. .** Since
16510 20 74 68 65 20 41 4e 53 49 20 76 65 72 73 69 6f the ANSI versio
16520 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f n of these Windo
16530 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 ws API do not ex
16540 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a ist for WINCE,.*
16550 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 * it's important
16560 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 to not referenc
16570 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 e them for WINCE
16580 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 builds..*/.#if
16590 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d SQLITE_OS_WINCE=
165a0 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 =0. }else{.
165b0 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a 20 20 20 char *zUtf8;.
165c0 20 63 68 61 72 20 7a 4d 62 63 73 50 61 74 68 5b char zMbcsPath[
165d0 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 6f MAX_PATH];. o
165e0 73 47 65 74 54 65 6d 70 50 61 74 68 41 28 4d 41 sGetTempPathA(MA
165f0 58 5f 50 41 54 48 2d 33 30 2c 20 7a 4d 62 63 73 X_PATH-30, zMbcs
16600 50 61 74 68 29 3b 0a 20 20 20 20 7a 55 74 66 38 Path);. zUtf8
16610 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 = sqlite3_win32
16620 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 4d _mbcs_to_utf8(zM
16630 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20 69 66 bcsPath);. if
16640 28 20 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 ( zUtf8 ){.
16650 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 sqlite3_snprint
16660 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a f(MAX_PATH-30, z
16670 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20 TempPath, "%s",
16680 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 zUtf8);. sq
16690 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 lite3_free(zUtf8
166a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 );. }else{.
166b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
166c0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 E_IOERR_NOMEM;.
166d0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a }.#endif. }.
166e0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 . /* Check that
166f0 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 the output buff
16700 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 er is large enou
16710 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f gh for the tempo
16720 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 rary file . **
16730 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e name. If it is n
16740 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 ot, return SQLIT
16750 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 E_ERROR.. */.
16760 69 66 28 20 28 73 71 6c 69 74 65 33 53 74 72 6c if( (sqlite3Strl
16770 65 6e 33 30 28 7a 54 65 6d 70 50 61 74 68 29 20 en30(zTempPath)
16780 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 + sqlite3Strlen3
16790 30 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 0(SQLITE_TEMP_FI
167a0 4c 45 5f 50 52 45 46 49 58 29 20 2b 20 31 37 29 LE_PREFIX) + 17)
167b0 20 3e 3d 20 6e 42 75 66 20 29 7b 0a 20 20 20 20 >= nBuf ){.
167c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 return SQLITE_ER
167d0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 ROR;. }.. for(
167e0 69 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 i=sqlite3Strlen3
167f0 30 28 7a 54 65 6d 70 50 61 74 68 29 3b 20 69 3e 0(zTempPath); i>
16800 30 20 26 26 20 7a 54 65 6d 70 50 61 74 68 5b 69 0 && zTempPath[i
16810 2d 31 5d 3d 3d 27 5c 5c 27 3b 20 69 2d 2d 29 7b -1]=='\\'; i--){
16820 7d 0a 20 20 7a 54 65 6d 70 50 61 74 68 5b 69 5d }. zTempPath[i]
16830 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33 = 0;.. sqlite3
16840 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 _snprintf(nBuf-1
16850 37 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20 7, zBuf,.
16860 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73 5c "%s\
16870 5c 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 \"SQLITE_TEMP_FI
16880 4c 45 5f 50 52 45 46 49 58 2c 20 7a 54 65 6d 70 LE_PREFIX, zTemp
16890 50 61 74 68 29 3b 0a 20 20 6a 20 3d 20 73 71 6c Path);. j = sql
168a0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 ite3Strlen30(zBu
168b0 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 f);. sqlite3_ra
168c0 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 ndomness(15, &zB
168d0 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d uf[j]);. for(i=
168e0 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 0; i<15; i++, j+
168f0 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 +){. zBuf[j]
16900 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 = (char)zChars[
16910 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 ((unsigned char)
16920 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 zBuf[j])%(sizeof
16930 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 (zChars)-1) ];.
16940 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 }. zBuf[j] = 0
16950 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 ;.. OSTRACE(("T
16960 45 4d 50 20 46 49 4c 45 4e 41 4d 45 3a 20 25 73 EMP FILENAME: %s
16970 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20 20 72 \n", zBuf));. r
16980 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b eturn SQLITE_OK;
16990 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 .}../*.** Open
169a0 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 a file..*/.stati
169b0 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20 c int winOpen(.
169c0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 sqlite3_vfs *pV
169d0 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f fs, /* No
169e0 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 t used */. cons
169f0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 t char *zName,
16a00 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 /* Name of
16a10 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38 the file (UTF-8
16a20 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 ) */. sqlite3_f
16a30 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 ile *id,
16a40 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 53 51 /* Write the SQ
16a50 4c 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 Lite file handle
16a60 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 here */. int f
16a70 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 lags,
16a80 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64 /* Open mod
16a90 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 e flags */. int
16aa0 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 *pOutFlags
16ab0 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 /* Status
16ac0 20 72 65 74 75 72 6e 20 66 6c 61 67 73 20 2a 2f return flags */
16ad0 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a .){. HANDLE h;.
16ae0 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e DWORD lastErrn
16af0 6f 3b 0a 20 20 44 57 4f 52 44 20 64 77 44 65 73 o;. DWORD dwDes
16b00 69 72 65 64 41 63 63 65 73 73 3b 0a 20 20 44 57 iredAccess;. DW
16b10 4f 52 44 20 64 77 53 68 61 72 65 4d 6f 64 65 3b ORD dwShareMode;
16b20 0a 20 20 44 57 4f 52 44 20 64 77 43 72 65 61 74 . DWORD dwCreat
16b30 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a ionDisposition;.
16b40 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 41 DWORD dwFlagsA
16b50 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 30 ndAttributes = 0
16b60 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f ;.#if SQLITE_OS_
16b70 57 49 4e 43 45 0a 20 20 69 6e 74 20 69 73 54 65 WINCE. int isTe
16b80 6d 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 mp = 0;.#endif.
16b90 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 winFile *pFile
16ba0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a = (winFile*)id;.
16bb0 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 void *zConvert
16bc0 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ed;
16bd0 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 /* Filename in
16be0 4f 53 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 OS encoding */.
16bf0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 const char *zUt
16c00 66 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 f8Name = zName;
16c10 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55 /* Filename in U
16c20 54 46 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f TF-8 encoding */
16c30 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a . int cnt = 0;.
16c40 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e . /* If argumen
16c50 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c t zPath is a NUL
16c60 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 L pointer, this
16c70 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75 function is requ
16c80 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a ired to open. *
16c90 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 * a temporary fi
16ca0 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62 75 66 le. Use this buf
16cb0 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 fer to store the
16cc0 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 file name in..
16cd0 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e */. char zTmpn
16ce0 61 6d 65 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b ame[MAX_PATH+1];
16cf0 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75 /* Buffer u
16d00 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 74 65 sed to create te
16d10 6d 70 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 0a mp filename */..
16d20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 int rc = SQLIT
16d30 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 E_OK;
16d40 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 /* Function Ret
16d50 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 69 66 20 urn Code */.#if
16d60 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 !defined(NDEBUG)
16d70 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 || SQLITE_OS_WI
16d80 4e 43 45 0a 20 20 69 6e 74 20 65 54 79 70 65 20 NCE. int eType
16d90 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 = flags&0xFFFFFF
16da0 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 00; /* Type of
16db0 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a file to open */.
16dc0 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20 69 73 #endif.. int is
16dd0 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c Exclusive = (fl
16de0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 ags & SQLITE_OPE
16df0 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 N_EXCLUSIVE);.
16e00 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 int isDelete
16e10 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 = (flags & SQLI
16e20 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e TE_OPEN_DELETEON
16e30 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 CLOSE);. int is
16e40 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c Create = (fl
16e50 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 ags & SQLITE_OPE
16e60 4e 5f 43 52 45 41 54 45 29 3b 0a 23 69 66 6e 64 N_CREATE);.#ifnd
16e70 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 ef NDEBUG. int
16e80 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 isReadonly = (
16e90 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f flags & SQLITE_O
16ea0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 23 PEN_READONLY);.#
16eb0 65 6e 64 69 66 0a 20 20 69 6e 74 20 69 73 52 65 endif. int isRe
16ec0 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 adWrite = (flag
16ed0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f s & SQLITE_OPEN_
16ee0 52 45 41 44 57 52 49 54 45 29 3b 0a 0a 23 69 66 READWRITE);..#if
16ef0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e ndef NDEBUG. in
16f00 74 20 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 t isOpenJournal
16f10 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28 = (isCreate && (
16f20 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d . eType==
16f30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 SQLITE_OPEN_MAST
16f40 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 ER_JOURNAL .
16f50 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 || eType==SQLIT
16f60 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 E_OPEN_MAIN_JOUR
16f70 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 NAL . || eTy
16f80 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f pe==SQLITE_OPEN_
16f90 57 41 4c 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66 WAL. ));.#endif
16fa0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 .. /* Check the
16fb0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 following state
16fc0 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20 ments are true:
16fd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 . **. ** (a)
16fe0 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 Exactly one of
16ff0 74 68 65 20 52 45 41 44 57 52 49 54 45 20 61 6e the READWRITE an
17000 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 d READONLY flags
17010 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e must be set, an
17020 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66 d . ** (b) if
17030 20 43 52 45 41 54 45 20 69 73 20 73 65 74 2c 20 CREATE is set,
17040 74 68 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d then READWRITE m
17050 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c ust also be set,
17060 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 and. ** (c)
17070 69 66 20 45 58 43 4c 55 53 49 56 45 20 69 73 20 if EXCLUSIVE is
17080 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 set, then CREATE
17090 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 must also be se
170a0 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66 t.. ** (d) if
170b0 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 DELETEONCLOSE i
170c0 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 s set, then CREA
170d0 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 TE must also be
170e0 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 set.. */. asse
170f0 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d rt((isReadonly==
17100 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 0 || isReadWrite
17110 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61 64 57 ==0) && (isReadW
17120 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e rite || isReadon
17130 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69 ly));. assert(i
17140 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 sCreate==0 || is
17150 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73 ReadWrite);. as
17160 73 65 72 74 28 69 73 45 78 63 6c 75 73 69 76 65 sert(isExclusive
17170 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 ==0 || isCreate)
17180 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44 65 6c ;. assert(isDel
17190 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 ete==0 || isCrea
171a0 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d te);.. /* The m
171b0 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 ain DB, main jou
171c0 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 rnal, WAL file a
171d0 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 nd master journa
171e0 6c 20 61 72 65 20 6e 65 76 65 72 20 0a 20 20 2a l are never . *
171f0 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 * automatically
17200 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 deleted. Nor are
17210 20 74 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f they ever tempo
17220 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a rary files. */.
17230 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 assert( (!isDe
17240 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c lete && zName) |
17250 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f | eType!=SQLITE_
17260 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a OPEN_MAIN_DB );.
17270 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 assert( (!isDe
17280 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c lete && zName) |
17290 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f | eType!=SQLITE_
172a0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 OPEN_MAIN_JOURNA
172b0 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 L );. assert( (
172c0 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 !isDelete && zNa
172d0 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 me) || eType!=SQ
172e0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 LITE_OPEN_MASTER
172f0 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 _JOURNAL );. as
17300 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 sert( (!isDelete
17310 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 && zName) || eT
17320 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e ype!=SQLITE_OPEN
17330 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 _WAL );.. /* As
17340 73 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70 sert that the up
17350 70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 per layer has se
17360 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 t one of the "fi
17370 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 le-type" flags.
17380 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 */. assert( eTy
17390 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f pe==SQLITE_OPEN_
173a0 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 MAIN_DB ||
173b0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 eType==SQLITE_OP
173c0 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 EN_TEMP_DB .
173d0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c || eType==SQL
173e0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f ITE_OPEN_MAIN_JO
173f0 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d URNAL || eType==
17400 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 SQLITE_OPEN_TEMP
17410 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 _JOURNAL .
17420 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 || eType==SQLIT
17430 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 E_OPEN_SUBJOURNA
17440 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 L || eType==SQ
17450 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 LITE_OPEN_MASTER
17460 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 _JOURNAL .
17470 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 || eType==SQLIT
17480 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 E_OPEN_TRANSIENT
17490 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 _DB || eType==SQ
174a0 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 LITE_OPEN_WAL.
174b0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 );.. assert( id
174c0 21 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f !=0 );. UNUSED_
174d0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b PARAMETER(pVfs);
174e0 0a 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 49 .. pFile->h = I
174f0 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 NVALID_HANDLE_VA
17500 4c 55 45 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 LUE;.. /* If th
17510 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e e second argumen
17520 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 t to this functi
17530 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67 65 6e 65 on is NULL, gene
17540 72 61 74 65 20 61 20 0a 20 20 2a 2a 20 74 65 6d rate a . ** tem
17550 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 porary file name
17560 20 74 6f 20 75 73 65 20 0a 20 20 2a 2f 0a 20 20 to use . */.
17570 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 29 if( !zUtf8Name )
17580 7b 0a 20 20 20 20 61 73 73 65 72 74 28 69 73 44 {. assert(isD
17590 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70 65 6e elete && !isOpen
175a0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 72 63 Journal);. rc
175b0 20 3d 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 4d = getTempname(M
175c0 41 58 5f 50 41 54 48 2b 31 2c 20 7a 54 6d 70 6e AX_PATH+1, zTmpn
175d0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 ame);. if( rc
175e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 !=SQLITE_OK ){.
175f0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a return rc;.
17600 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e }. zUtf8N
17610 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a ame = zTmpname;.
17620 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 }.. /* Conver
17630 74 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 74 t the filename t
17640 6f 20 74 68 65 20 73 79 73 74 65 6d 20 65 6e 63 o the system enc
17650 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e oding. */. zCon
17660 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 verted = convert
17670 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 55 74 Utf8Filename(zUt
17680 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a f8Name);. if( z
17690 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a Converted==0 ){.
176a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
176b0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 E_IOERR_NOMEM;.
176c0 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 65 61 64 }.. if( isRead
176d0 57 72 69 74 65 20 29 7b 0a 20 20 20 20 64 77 44 Write ){. dwD
176e0 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47 esiredAccess = G
176f0 45 4e 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45 ENERIC_READ | GE
17700 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d NERIC_WRITE;. }
17710 65 6c 73 65 7b 0a 20 20 20 20 64 77 44 65 73 69 else{. dwDesi
17720 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 redAccess = GENE
17730 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 RIC_READ;. }..
17740 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f /* SQLITE_OPEN_
17750 45 58 43 4c 55 53 49 56 45 20 69 73 20 75 73 65 EXCLUSIVE is use
17760 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 d to make sure t
17770 68 61 74 20 61 20 6e 65 77 20 66 69 6c 65 20 69 hat a new file i
17780 73 20 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 2e s . ** created.
17790 20 53 51 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 SQLite doesn't
177a0 75 73 65 20 69 74 20 74 6f 20 69 6e 64 69 63 61 use it to indica
177b0 74 65 20 22 65 78 63 6c 75 73 69 76 65 20 61 63 te "exclusive ac
177c0 63 65 73 73 22 20 0a 20 20 2a 2a 20 61 73 20 69 cess" . ** as i
177d0 74 20 69 73 20 75 73 75 61 6c 6c 79 20 75 6e 64 t is usually und
177e0 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20 erstood.. */.
177f0 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65 20 if( isExclusive
17800 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 ){. /* Create
17810 73 20 61 20 6e 65 77 20 66 69 6c 65 2c 20 6f 6e s a new file, on
17820 6c 79 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f ly if it does no
17830 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e t already exist.
17840 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 */. /* If th
17850 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 69 e file exists, i
17860 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 t fails. */.
17870 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 dwCreationDispos
17880 69 74 69 6f 6e 20 3d 20 43 52 45 41 54 45 5f 4e ition = CREATE_N
17890 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 EW;. }else if(
178a0 69 73 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 isCreate ){.
178b0 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74 69 6e 67 /* Open existing
178c0 20 66 69 6c 65 2c 20 6f 72 20 63 72 65 61 74 65 file, or create
178d0 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 65 if it doesn't e
178e0 78 69 73 74 20 2a 2f 0a 20 20 20 20 64 77 43 72 xist */. dwCr
178f0 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f eationDispositio
17900 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b n = OPEN_ALWAYS;
17910 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a . }else{. /*
17920 20 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c 20 6f Opens a file, o
17930 6e 6c 79 20 69 66 20 69 74 20 65 78 69 73 74 73 nly if it exists
17940 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 . */. dwCreat
17950 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d ionDisposition =
17960 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b 0a OPEN_EXISTING;.
17970 20 20 7d 0a 0a 20 20 64 77 53 68 61 72 65 4d 6f }.. dwShareMo
17980 64 65 20 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f de = FILE_SHARE_
17990 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48 41 52 READ | FILE_SHAR
179a0 45 5f 57 52 49 54 45 3b 0a 0a 20 20 69 66 28 20 E_WRITE;.. if(
179b0 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 isDelete ){.#if
179c0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a SQLITE_OS_WINCE.
179d0 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 dwFlagsAndAt
179e0 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f tributes = FILE_
179f0 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e ATTRIBUTE_HIDDEN
17a00 3b 0a 20 20 20 20 69 73 54 65 6d 70 20 3d 20 31 ;. isTemp = 1
17a10 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 77 46 6c ;.#else. dwFl
17a20 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 agsAndAttributes
17a30 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 = FILE_ATTRIBUT
17a40 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20 20 20 20 E_TEMPORARY.
17a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17a60 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c | FIL
17a70 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 E_ATTRIBUTE_HIDD
17a80 45 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 EN.
17a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17aa0 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45 | FILE_FLAG_DE
17ab0 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 LETE_ON_CLOSE;.#
17ac0 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 endif. }else{.
17ad0 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 dwFlagsAndAtt
17ae0 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 ributes = FILE_A
17af0 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b TTRIBUTE_NORMAL;
17b00 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70 6f 72 74 . }. /* Report
17b10 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 s from the inter
17b20 6e 65 74 20 61 72 65 20 74 68 61 74 20 70 65 72 net are that per
17b30 66 6f 72 6d 61 6e 63 65 20 69 73 20 61 6c 77 61 formance is alwa
17b40 79 73 0a 20 20 2a 2a 20 62 65 74 74 65 72 20 69 ys. ** better i
17b50 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 f FILE_FLAG_RAND
17b60 4f 4d 5f 41 43 43 45 53 53 20 69 73 20 75 73 65 OM_ACCESS is use
17b70 64 2e 20 20 54 69 63 6b 65 74 20 23 32 36 39 39 d. Ticket #2699
17b80 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f . */.#if SQLITE_
17b90 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77 46 6c 61 OS_WINCE. dwFla
17ba0 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 gsAndAttributes
17bb0 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e |= FILE_FLAG_RAN
17bc0 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23 65 6e 64 DOM_ACCESS;.#end
17bd0 69 66 0a 0a 20 20 69 66 28 20 69 73 4e 54 28 29 if.. if( isNT()
17be0 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 ){. while( (
17bf0 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 h = osCreateFile
17c00 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 W((LPCWSTR)zConv
17c10 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 erted,.
17c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17c30 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 dwDesiredAc
17c40 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 cess,.
17c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17c60 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c dwShareMode,
17c70 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 NULL,.
17c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17c90 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 dwCreationD
17ca0 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 isposition,.
17cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17cc0 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67 dwFlag
17cd0 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a sAndAttributes,.
17ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 NU
17d00 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 LL))==INVALID_HA
17d10 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 NDLE_VALUE &&.
17d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17d30 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 72 retr
17d40 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 yIoerr(&cnt, &la
17d50 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 2f 2a 20 stErrno) ){}./*
17d60 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 isNT() is 1 if S
17d70 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d QLITE_OS_WINCE==
17d80 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 1, so this else
17d90 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 is never execute
17da0 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 d. .** Since the
17db0 20 41 4e 53 49 20 76 65 72 73 69 6f 6e 20 6f 66 ANSI version of
17dc0 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41 these Windows A
17dd0 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 PI do not exist
17de0 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 for WINCE,.** it
17df0 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 's important to
17e00 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 not reference th
17e10 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69 em for WINCE bui
17e20 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 lds..*/.#if SQLI
17e30 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 TE_OS_WINCE==0.
17e40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c }else{. whil
17e50 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 e( (h = osCreate
17e60 46 69 6c 65 41 28 28 4c 50 43 53 54 52 29 7a 43 FileA((LPCSTR)zC
17e70 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 onverted,.
17e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17e90 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 dwDesire
17ea0 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 dAccess,.
17eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17ec0 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f dwShareMo
17ed0 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 de, NULL,.
17ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17ef0 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69 dwCreati
17f00 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 onDisposition,.
17f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17f20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46 dwF
17f30 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 lagsAndAttribute
17f40 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 s,.
17f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17f60 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 NULL))==INVALID
17f70 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 _HANDLE_VALUE &&
17f80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
17f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 r
17fa0 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 etryIoerr(&cnt,
17fb0 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a &lastErrno) ){}.
17fc0 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 6c 6f #endif. }.. lo
17fd0 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 0a 20 20 gIoerr(cnt);..
17fe0 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 OSTRACE(("OPEN %
17ff0 64 20 25 73 20 30 78 25 6c 78 20 25 73 5c 6e 22 d %s 0x%lx %s\n"
18000 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 68 2c , . h,
18010 20 7a 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65 zName, dwDesire
18020 64 41 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20 dAccess, .
18030 20 20 20 20 20 68 3d 3d 49 4e 56 41 4c 49 44 5f h==INVALID_
18040 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 3f 20 22 HANDLE_VALUE ? "
18050 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 failed" : "ok"))
18060 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 ;.. if( h==INVA
18070 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 LID_HANDLE_VALUE
18080 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c ){. pFile->l
18090 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 astErrno = lastE
180a0 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 rrno;. winLog
180b0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e Error(SQLITE_CAN
180c0 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61 TOPEN, pFile->la
180d0 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 65 stErrno, "winOpe
180e0 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a n", zUtf8Name);.
180f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 sqlite3_free
18100 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 (zConverted);.
18110 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 if( isReadWrit
18120 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 e && !isExclusiv
18130 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 e ){. retur
18140 6e 20 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 n winOpen(pVfs,
18150 7a 4e 61 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20 zName, id, .
18160 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 ((flags
18170 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 |SQLITE_OPEN_REA
18180 44 4f 4e 4c 59 29 26 7e 28 53 51 4c 49 54 45 5f DONLY)&~(SQLITE_
18190 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 OPEN_CREATE|SQLI
181a0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 TE_OPEN_READWRIT
181b0 45 29 29 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b E)), pOutFlags);
181c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 . }else{.
181d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
181e0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 CANTOPEN_BKPT;.
181f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 }. }.. if(
18200 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 pOutFlags ){.
18210 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 if( isReadWrite
18220 20 29 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 ){. *pOutF
18230 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 lags = SQLITE_OP
18240 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 EN_READWRITE;.
18250 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a }else{. *
18260 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 pOutFlags = SQLI
18270 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 TE_OPEN_READONLY
18280 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6d ;. }. }.. m
18290 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 emset(pFile, 0,
182a0 73 69 7a 65 6f 66 28 2a 70 46 69 6c 65 29 29 3b sizeof(*pFile));
182b0 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f . pFile->pMetho
182c0 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64 d = &winIoMethod
182d0 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68 ;. pFile->h = h
182e0 3b 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 ;. pFile->lastE
182f0 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b rrno = NO_ERROR;
18300 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66 73 20 3d . pFile->pVfs =
18310 20 70 56 66 73 3b 0a 20 20 70 46 69 6c 65 2d 3e pVfs;. pFile->
18320 70 53 68 6d 20 3d 20 30 3b 0a 20 20 70 46 69 6c pShm = 0;. pFil
18330 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 e->zPath = zName
18340 3b 0a 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f ;. pFile->secto
18350 72 53 69 7a 65 20 3d 20 67 65 74 53 65 63 74 6f rSize = getSecto
18360 72 53 69 7a 65 28 70 56 66 73 2c 20 7a 55 74 66 rSize(pVfs, zUtf
18370 38 4e 61 6d 65 29 3b 0a 0a 23 69 66 20 53 51 4c 8Name);..#if SQL
18380 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 ITE_OS_WINCE. i
18390 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 26 f( isReadWrite &
183a0 26 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f & eType==SQLITE_
183b0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20 20 OPEN_MAIN_DB.
183c0 20 20 20 20 26 26 20 21 77 69 6e 63 65 43 72 65 && !winceCre
183d0 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70 ateLock(zName, p
183e0 46 69 6c 65 29 0a 20 20 29 7b 0a 20 20 20 20 6f File). ){. o
183f0 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29 3b sCloseHandle(h);
18400 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 . sqlite3_fre
18410 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 e(zConverted);.
18420 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 return SQLITE
18430 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a _CANTOPEN_BKPT;.
18440 20 20 7d 0a 20 20 69 66 28 20 69 73 54 65 6d 70 }. if( isTemp
18450 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a ){. pFile->z
18460 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 DeleteOnClose =
18470 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 7d 65 zConverted;. }e
18480 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 lse.#endif. {.
18490 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 sqlite3_free(
184a0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d zConverted);. }
184b0 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 .. OpenCounter(
184c0 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 +1);. return rc
184d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 ;.}../*.** Delet
184e0 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 e the named file
184f0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 ..**.** Note tha
18500 74 20 57 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e t Windows does n
18510 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c 65 20 ot allow a file
18520 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 66 to be deleted if
18530 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 some other.** p
18540 72 6f 63 65 73 73 20 68 61 73 20 69 74 20 6f 70 rocess has it op
18550 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20 61 en. Sometimes a
18560 20 76 69 72 75 73 20 73 63 61 6e 6e 65 72 20 6f virus scanner o
18570 72 20 69 6e 64 65 78 69 6e 67 20 70 72 6f 67 72 r indexing progr
18580 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e 20 am.** will open
18590 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 a journal file s
185a0 68 6f 72 74 6c 79 20 61 66 74 65 72 20 69 74 20 hortly after it
185b0 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 6f 72 is created in or
185c0 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77 68 61 der to do.** wha
185d0 74 65 76 65 72 20 69 74 20 64 6f 65 73 2e 20 20 tever it does.
185e0 57 68 69 6c 65 20 74 68 69 73 20 6f 74 68 65 72 While this other
185f0 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 process is hold
18600 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 ing the.** file
18610 6f 70 65 6e 2c 20 77 65 20 77 69 6c 6c 20 62 65 open, we will be
18620 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 unable to delet
18630 65 20 69 74 2e 20 20 54 6f 20 77 6f 72 6b 20 61 e it. To work a
18640 72 6f 75 6e 64 20 74 68 69 73 0a 2a 2a 20 70 72 round this.** pr
18650 6f 62 6c 65 6d 2c 20 77 65 20 64 65 6c 61 79 20 oblem, we delay
18660 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 100 milliseconds
18670 20 61 6e 64 20 74 72 79 20 74 6f 20 64 65 6c 65 and try to dele
18680 74 65 20 61 67 61 69 6e 2e 20 20 55 70 0a 2a 2a te again. Up.**
18690 20 74 6f 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f to MX_DELETION_
186a0 41 54 54 45 4d 50 54 73 20 64 65 6c 65 74 69 6f ATTEMPTs deletio
186b0 6e 20 61 74 74 65 6d 70 74 73 20 61 72 65 20 72 n attempts are r
186c0 75 6e 20 62 65 66 6f 72 65 20 67 69 76 69 6e 67 un before giving
186d0 0a 2a 2a 20 75 70 20 61 6e 64 20 72 65 74 75 72 .** up and retur
186e0 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a ning an error..*
186f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e /.static int win
18700 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65 Delete(. sqlite
18710 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 3_vfs *pVfs,
18720 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 /* Not use
18730 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 d on win32 */.
18740 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c const char *zFil
18750 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e ename, /* N
18760 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 64 ame of file to d
18770 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 73 elete */. int s
18780 79 6e 63 44 69 72 20 20 20 20 20 20 20 20 20 20 yncDir
18790 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 /* Not us
187a0 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 29 ed on win32 */.)
187b0 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b {. int cnt = 0;
187c0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f . int rc;. DWO
187d0 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 RD lastErrno;.
187e0 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 void *zConverted
187f0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d ;. UNUSED_PARAM
18800 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 55 4e ETER(pVfs);. UN
18810 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 73 USED_PARAMETER(s
18820 79 6e 63 44 69 72 29 3b 0a 0a 20 20 53 69 6d 75 yncDir);.. Simu
18830 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 lateIOError(retu
18840 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f rn SQLITE_IOERR_
18850 44 45 4c 45 54 45 29 3b 0a 20 20 7a 43 6f 6e 76 DELETE);. zConv
18860 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 erted = convertU
18870 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c tf8Filename(zFil
18880 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 ename);. if( zC
18890 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 onverted==0 ){.
188a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 return SQLITE
188b0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 _IOERR_NOMEM;.
188c0 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 }. if( isNT() )
188d0 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 {. rc = 1;.
188e0 20 20 77 68 69 6c 65 28 20 6f 73 47 65 74 46 69 while( osGetFi
188f0 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 7a 43 leAttributesW(zC
18900 6f 6e 76 65 72 74 65 64 29 21 3d 49 4e 56 41 4c onverted)!=INVAL
18910 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 ID_FILE_ATTRIBUT
18920 45 53 20 26 26 0a 20 20 20 20 20 20 20 20 20 28 ES &&. (
18930 72 63 20 3d 20 6f 73 44 65 6c 65 74 65 46 69 6c rc = osDeleteFil
18940 65 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 29 3d eW(zConverted))=
18950 3d 30 20 26 26 20 72 65 74 72 79 49 6f 65 72 72 =0 && retryIoerr
18960 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e (&cnt, &lastErrn
18970 6f 29 20 29 7b 7d 0a 20 20 20 20 72 63 20 3d 20 o) ){}. rc =
18980 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a rc ? SQLITE_OK :
18990 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 2f SQLITE_ERROR;./
189a0 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 * isNT() is 1 if
189b0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 SQLITE_OS_WINCE
189c0 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 ==1, so this els
189d0 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 e is never execu
189e0 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 ted. .** Since t
189f0 68 65 20 41 4e 53 49 20 76 65 72 73 69 6f 6e 20 he ANSI version
18a00 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73 of these Windows
18a10 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 API do not exis
18a20 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 t for WINCE,.**
18a30 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 it's important t
18a40 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20 o not reference
18a50 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 them for WINCE b
18a60 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 uilds..*/.#if SQ
18a70 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 LITE_OS_WINCE==0
18a80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 . }else{. rc
18a90 20 3d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 = 1;. while(
18aa0 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 osGetFileAttrib
18ab0 75 74 65 73 41 28 7a 43 6f 6e 76 65 72 74 65 64 utesA(zConverted
18ac0 29 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f )!=INVALID_FILE_
18ad0 41 54 54 52 49 42 55 54 45 53 20 26 26 0a 20 20 ATTRIBUTES &&.
18ae0 20 20 20 20 20 20 20 28 72 63 20 3d 20 6f 73 44 (rc = osD
18af0 65 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76 eleteFileA(zConv
18b00 65 72 74 65 64 29 29 3d 3d 30 20 26 26 20 72 65 erted))==0 && re
18b10 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 tryIoerr(&cnt, &
18b20 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 lastErrno) ){}.
18b30 20 20 20 72 63 20 3d 20 72 63 20 3f 20 53 51 4c rc = rc ? SQL
18b40 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f ITE_OK : SQLITE_
18b50 45 52 52 4f 52 3b 0a 23 65 6e 64 69 66 0a 20 20 ERROR;.#endif.
18b60 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 }. if( rc ){.
18b70 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 rc = winLogErr
18b80 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f or(SQLITE_IOERR_
18b90 44 45 4c 45 54 45 2c 20 6c 61 73 74 45 72 72 6e DELETE, lastErrn
18ba0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 o,.
18bb0 22 77 69 6e 44 65 6c 65 74 65 22 2c 20 7a 46 69 "winDelete", zFi
18bc0 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 lename);. }else
18bd0 7b 0a 20 20 20 20 6c 6f 67 49 6f 65 72 72 28 63 {. logIoerr(c
18be0 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 nt);. }. sqlit
18bf0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 e3_free(zConvert
18c00 65 64 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 ed);. OSTRACE((
18c10 22 44 45 4c 45 54 45 20 5c 22 25 73 5c 22 20 25 "DELETE \"%s\" %
18c20 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c s\n", zFilename,
18c30 20 28 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20 (rc ? "failed"
18c40 3a 20 22 6f 6b 22 20 29 29 29 3b 0a 20 20 72 65 : "ok" )));. re
18c50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a turn rc;.}../*.*
18c60 2a 20 43 68 65 63 6b 20 74 68 65 20 65 78 69 73 * Check the exis
18c70 74 61 6e 63 65 20 61 6e 64 20 73 74 61 74 75 73 tance and status
18c80 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 of a file..*/.s
18c90 74 61 74 69 63 20 69 6e 74 20 77 69 6e 41 63 63 tatic int winAcc
18ca0 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 ess(. sqlite3_v
18cb0 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 fs *pVfs,
18cc0 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e /* Not used on
18cd0 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 win32 */. cons
18ce0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d t char *zFilenam
18cf0 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f e, /* Name o
18d00 66 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 f file to check
18d10 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 */. int flags,
18d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
18d30 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 73 74 20 /* Type of test
18d40 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20 to make on this
18d50 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 file */. int *p
18d60 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 ResOut
18d70 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 /* OUT: Res
18d80 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 ult */.){. DWOR
18d90 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 D attr;. int rc
18da0 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 = 0;. DWORD la
18db0 73 74 45 72 72 6e 6f 3b 0a 20 20 76 6f 69 64 20 stErrno;. void
18dc0 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 *zConverted;. U
18dd0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 NUSED_PARAMETER(
18de0 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 pVfs);.. Simula
18df0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 teIOError( retur
18e00 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 n SQLITE_IOERR_A
18e10 43 43 45 53 53 3b 20 29 3b 0a 20 20 7a 43 6f 6e CCESS; );. zCon
18e20 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 verted = convert
18e30 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 Utf8Filename(zFi
18e40 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a lename);. if( z
18e50 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a Converted==0 ){.
18e60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
18e70 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 E_IOERR_NOMEM;.
18e80 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 }. if( isNT()
18e90 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d ){. int cnt =
18ea0 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 0;. WIN32_FI
18eb0 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 LE_ATTRIBUTE_DAT
18ec0 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 A sAttrData;.
18ed0 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 memset(&sAttrDa
18ee0 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 ta, 0, sizeof(sA
18ef0 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77 ttrData));. w
18f00 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 47 hile( !(rc = osG
18f10 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 etFileAttributes
18f20 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f ExW((LPCWSTR)zCo
18f30 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 nverted,.
18f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
18f50 20 20 20 20 20 20 47 65 74 46 69 6c 65 45 78 49 GetFileExI
18f60 6e 66 6f 53 74 61 6e 64 61 72 64 2c 20 0a 20 20 nfoStandard, .
18f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
18f80 20 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74 &sAtt
18f90 72 44 61 74 61 29 29 20 26 26 20 72 65 74 72 79 rData)) && retry
18fa0 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 Ioerr(&cnt, &las
18fb0 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 tErrno) ){}.
18fc0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 if( rc ){.
18fd0 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49 54 45 /* For an SQLITE
18fe0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 71 _ACCESS_EXISTS q
18ff0 75 65 72 79 2c 20 74 72 65 61 74 20 61 20 7a 65 uery, treat a ze
19000 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65 0a 20 ro-length file.
19010 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 69 74 ** as if it
19020 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e does not exist.
19030 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 . */.
19040 69 66 28 20 20 20 20 66 6c 61 67 73 3d 3d 53 51 if( flags==SQ
19050 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 LITE_ACCESS_EXIS
19060 54 53 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 TS. &&
19070 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 sAttrData.nFileS
19080 69 7a 65 48 69 67 68 3d 3d 30 20 0a 20 20 20 20 izeHigh==0 .
19090 20 20 20 20 20 20 26 26 20 73 41 74 74 72 44 61 && sAttrDa
190a0 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f 77 3d ta.nFileSizeLow=
190b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 74 =0 ){. at
190c0 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c tr = INVALID_FIL
190d0 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 E_ATTRIBUTES;.
190e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
190f0 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 attr = sAttrD
19100 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 ata.dwFileAttrib
19110 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 utes;. }.
19120 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c }else{. l
19130 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20 20 ogIoerr(cnt);.
19140 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e if( lastErrn
19150 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f o!=ERROR_FILE_NO
19160 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 T_FOUND ){.
19170 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 winLogError(S
19180 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 QLITE_IOERR_ACCE
19190 53 53 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 SS, lastErrno, "
191a0 77 69 6e 41 63 63 65 73 73 22 2c 20 7a 46 69 6c winAccess", zFil
191b0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 ename);.
191c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f sqlite3_free(zCo
191d0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 nverted);.
191e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
191f0 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 IOERR_ACCESS;.
19200 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
19210 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 attr = INVALI
19220 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 D_FILE_ATTRIBUTE
19230 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d S;. }. }
19240 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 ./* isNT() is 1
19250 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e if SQLITE_OS_WIN
19260 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 CE==1, so this e
19270 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 lse is never exe
19280 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 cuted. .** Since
19290 20 74 68 65 20 41 4e 53 49 20 76 65 72 73 69 6f the ANSI versio
192a0 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f n of these Windo
192b0 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 ws API do not ex
192c0 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a ist for WINCE,.*
192d0 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 * it's important
192e0 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 to not referenc
192f0 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 e them for WINCE
19300 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 builds..*/.#if
19310 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d SQLITE_OS_WINCE=
19320 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 =0. }else{.
19330 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 attr = osGetFile
19340 41 74 74 72 69 62 75 74 65 73 41 28 28 63 68 61 AttributesA((cha
19350 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a r*)zConverted);.
19360 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c #endif. }. sql
19370 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 ite3_free(zConve
19380 72 74 65 64 29 3b 0a 20 20 73 77 69 74 63 68 28 rted);. switch(
19390 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 flags ){. ca
193a0 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 se SQLITE_ACCESS
193b0 5f 52 45 41 44 3a 0a 20 20 20 20 63 61 73 65 20 _READ:. case
193c0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 SQLITE_ACCESS_EX
193d0 49 53 54 53 3a 0a 20 20 20 20 20 20 72 63 20 3d ISTS:. rc =
193e0 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 attr!=INVALID_F
193f0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a ILE_ATTRIBUTES;.
19400 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
19410 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 case SQLITE_ACC
19420 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 ESS_READWRITE:.
19430 20 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d rc = attr!=
19440 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 INVALID_FILE_ATT
19450 52 49 42 55 54 45 53 20 26 26 0a 20 20 20 20 20 RIBUTES &&.
19460 20 20 20 20 20 20 20 20 28 61 74 74 72 20 26 20 (attr &
19470 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52 FILE_ATTRIBUTE_R
19480 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 EADONLY)==0;.
19490 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 break;. de
194a0 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 fault:. ass
194b0 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c ert(!"Invalid fl
194c0 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a ags argument");.
194d0 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d }. *pResOut =
194e0 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 rc;. return SQ
194f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a LITE_OK;.}.../*.
19500 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 ** Turn a relati
19510 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f ve pathname into
19520 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 a full pathname
19530 2e 20 20 57 72 69 74 65 20 74 68 65 20 66 75 6c . Write the ful
19540 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e l.** pathname in
19550 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 to zOut[]. zOut
19560 5b 5d 20 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 [] will be at le
19570 61 73 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 ast pVfs->mxPath
19580 6e 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e name.** bytes in
19590 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 size..*/.static
195a0 20 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61 74 68 int winFullPath
195b0 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f name(. sqlite3_
195c0 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 vfs *pVfs,
195d0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 /* Pointer
195e0 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a to vfs object *
195f0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a /. const char *
19600 7a 52 65 6c 61 74 69 76 65 2c 20 20 20 20 20 20 zRelative,
19610 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 /* Possibly re
19620 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 lative input pat
19630 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c h */. int nFull
19640 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
19650 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 /* Size of
19660 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e output buffer in
19670 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 bytes */. char
19680 20 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20 20 20 *zFull
19690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 /* Out
196a0 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b put buffer */.){
196b0 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 . .#if defined(
196c0 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 __CYGWIN__). Si
196d0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 mulateIOError( r
196e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 eturn SQLITE_ERR
196f0 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 OR );. UNUSED_P
19700 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b ARAMETER(nFull);
19710 0a 20 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 74 . cygwin_conv_t
19720 6f 5f 66 75 6c 6c 5f 77 69 6e 33 32 5f 70 61 74 o_full_win32_pat
19730 68 28 7a 52 65 6c 61 74 69 76 65 2c 20 7a 46 75 h(zRelative, zFu
19740 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 ll);. return SQ
19750 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a LITE_OK;.#endif.
19760 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 .#if SQLITE_OS_W
19770 49 4e 43 45 0a 20 20 53 69 6d 75 6c 61 74 65 49 INCE. SimulateI
19780 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 OError( return S
19790 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 QLITE_ERROR );.
197a0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 UNUSED_PARAMETE
197b0 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 2f 2a 20 57 R(nFull);. /* W
197c0 69 6e 43 45 20 68 61 73 20 6e 6f 20 63 6f 6e 63 inCE has no conc
197d0 65 70 74 20 6f 66 20 61 20 72 65 6c 61 74 69 76 ept of a relativ
197e0 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f 72 20 73 e pathname, or s
197f0 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a o I am told. */.
19800 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e sqlite3_snprin
19810 74 66 28 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e tf(pVfs->mxPathn
19820 61 6d 65 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 ame, zFull, "%s"
19830 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 , zRelative);.
19840 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
19850 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 ;.#endif..#if !S
19860 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 QLITE_OS_WINCE &
19870 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 & !defined(__CYG
19880 57 49 4e 5f 5f 29 0a 20 20 69 6e 74 20 6e 42 79 WIN__). int nBy
19890 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e te;. void *zCon
198a0 76 65 72 74 65 64 3b 0a 20 20 63 68 61 72 20 2a verted;. char *
198b0 7a 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 zOut;.. /* If t
198c0 68 69 73 20 70 61 74 68 20 6e 61 6d 65 20 62 65 his path name be
198d0 67 69 6e 73 20 77 69 74 68 20 22 2f 58 3a 22 2c gins with "/X:",
198e0 20 77 68 65 72 65 20 22 58 22 20 69 73 20 61 6e where "X" is an
198f0 79 20 61 6c 70 68 61 62 65 74 69 63 0a 20 20 2a y alphabetic. *
19900 2a 20 63 68 61 72 61 63 74 65 72 2c 20 64 69 73 * character, dis
19910 63 61 72 64 20 74 68 65 20 69 6e 69 74 69 61 6c card the initial
19920 20 22 2f 22 20 66 72 6f 6d 20 74 68 65 20 70 61 "/" from the pa
19930 74 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 thname.. */. i
19940 66 28 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d f( zRelative[0]=
19950 3d 27 2f 27 20 26 26 20 73 71 6c 69 74 65 33 49 ='/' && sqlite3I
19960 73 61 6c 70 68 61 28 7a 52 65 6c 61 74 69 76 65 salpha(zRelative
19970 5b 31 5d 29 20 26 26 20 7a 52 65 6c 61 74 69 76 [1]) && zRelativ
19980 65 5b 32 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 e[2]==':' ){.
19990 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b 0a 20 20 zRelative++;.
199a0 7d 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 }.. /* It's odd
199b0 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 to simulate an
199c0 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 io-error here, b
199d0 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 ut really this i
199e0 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e s just. ** usin
199f0 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 g the io-error i
19a00 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f nfrastructure to
19a10 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 test that SQLit
19a20 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 e handles this.
19a30 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 ** function fai
19a40 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 ling. This funct
19a50 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 ion could fail i
19a60 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 f, for example,
19a70 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 the. ** current
19a80 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f working directo
19a90 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 ry has been unli
19aa0 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d nked.. */. Sim
19ab0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 ulateIOError( re
19ac0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f turn SQLITE_ERRO
19ad0 52 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 R );. UNUSED_PA
19ae0 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a RAMETER(nFull);.
19af0 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 zConverted = c
19b00 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 onvertUtf8Filena
19b10 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 me(zRelative);.
19b20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d if( zConverted=
19b30 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e =0 ){. return
19b40 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f SQLITE_IOERR_NO
19b50 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 MEM;. }. if( i
19b60 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4c 50 57 sNT() ){. LPW
19b70 53 54 52 20 7a 54 65 6d 70 3b 0a 20 20 20 20 6e STR zTemp;. n
19b80 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c Byte = osGetFull
19b90 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 PathNameW((LPCWS
19ba0 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 TR)zConverted, 0
19bb0 2c 20 30 2c 20 30 29 20 2b 20 33 3b 0a 20 20 20 , 0, 0) + 3;.
19bc0 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 zTemp = sqlite3
19bd0 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 _malloc( nByte*s
19be0 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 izeof(zTemp[0])
19bf0 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 );. if( zTemp
19c00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c ==0 ){. sql
19c10 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 ite3_free(zConve
19c20 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 rted);. ret
19c30 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 urn SQLITE_IOERR
19c40 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 _NOMEM;. }.
19c50 20 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e osGetFullPathN
19c60 61 6d 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 ameW((LPCWSTR)zC
19c70 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c onverted, nByte,
19c80 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 zTemp, 0);.
19c90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f sqlite3_free(zCo
19ca0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f nverted);. zO
19cb0 75 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 ut = unicodeToUt
19cc0 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 f8(zTemp);. s
19cd0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d qlite3_free(zTem
19ce0 70 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 p);./* isNT() is
19cf0 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 1 if SQLITE_OS_
19d00 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 WINCE==1, so thi
19d10 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 s else is never
19d20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 executed. .** Si
19d30 6e 63 65 20 74 68 65 20 41 4e 53 49 20 76 65 72 nce the ANSI ver
19d40 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69 sion of these Wi
19d50 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 ndows API do not
19d60 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45 exist for WINCE
19d70 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 ,.** it's import
19d80 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 ant to not refer
19d90 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49 ence them for WI
19da0 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 NCE builds..*/.#
19db0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e if SQLITE_OS_WIN
19dc0 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 CE==0. }else{.
19dd0 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 3b 0a char *zTemp;.
19de0 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 nByte = osGe
19df0 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 tFullPathNameA((
19e00 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 char*)zConverted
19e10 2c 20 30 2c 20 30 2c 20 30 29 20 2b 20 33 3b 0a , 0, 0, 0) + 3;.
19e20 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 zTemp = sqli
19e30 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 te3_malloc( nByt
19e40 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 e*sizeof(zTemp[0
19e50 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 ]) );. if( zT
19e60 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 emp==0 ){.
19e70 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f sqlite3_free(zCo
19e80 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 nverted);.
19e90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f return SQLITE_IO
19ea0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d ERR_NOMEM;. }
19eb0 0a 20 20 20 20 6f 73 47 65 74 46 75 6c 6c 50 61 . osGetFullPa
19ec0 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a thNameA((char*)z
19ed0 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65 Converted, nByte
19ee0 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 , zTemp, 0);.
19ef0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 sqlite3_free(zC
19f00 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a onverted);. z
19f10 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 Out = sqlite3_wi
19f20 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 n32_mbcs_to_utf8
19f30 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c (zTemp);. sql
19f40 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 ite3_free(zTemp)
19f50 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 ;.#endif. }. i
19f60 66 28 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 f( zOut ){. s
19f70 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 qlite3_snprintf(
19f80 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 pVfs->mxPathname
19f90 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a , zFull, "%s", z
19fa0 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 Out);. sqlite
19fb0 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 3_free(zOut);.
19fc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
19fd0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 OK;. }else{.
19fe0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 return SQLITE_I
19ff0 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a OERR_NOMEM;. }.
1a000 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 #endif.}../*.**
1a010 47 65 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 Get the sector s
1a020 69 7a 65 20 6f 66 20 74 68 65 20 64 65 76 69 63 ize of the devic
1a030 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a e used to store.
1a040 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 ** file..*/.stat
1a050 69 63 20 69 6e 74 20 67 65 74 53 65 63 74 6f 72 ic int getSector
1a060 53 69 7a 65 28 0a 20 20 20 20 73 71 6c 69 74 65 Size(. sqlite
1a070 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 20 3_vfs *pVfs,.
1a080 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 const char *zRe
1a090 6c 61 74 69 76 65 20 20 20 20 20 2f 2a 20 55 54 lative /* UT
1a0a0 46 2d 38 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f F-8 file name */
1a0b0 0a 29 7b 0a 20 20 44 57 4f 52 44 20 62 79 74 65 .){. DWORD byte
1a0c0 73 50 65 72 53 65 63 74 6f 72 20 3d 20 53 51 4c sPerSector = SQL
1a0d0 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 ITE_DEFAULT_SECT
1a0e0 4f 52 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 47 65 OR_SIZE;. /* Ge
1a0f0 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 20 69 tDiskFreeSpace i
1a100 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 s not supported
1a110 75 6e 64 65 72 20 57 49 4e 43 45 20 2a 2f 0a 23 under WINCE */.#
1a120 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e if SQLITE_OS_WIN
1a130 43 45 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 CE. UNUSED_PARA
1a140 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 55 METER(pVfs);. U
1a150 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 NUSED_PARAMETER(
1a160 7a 52 65 6c 61 74 69 76 65 29 3b 0a 23 65 6c 73 zRelative);.#els
1a170 65 0a 20 20 63 68 61 72 20 7a 46 75 6c 6c 70 61 e. char zFullpa
1a180 74 68 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 0a th[MAX_PATH+1];.
1a190 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52 int rc;. DWOR
1a1a0 44 20 64 77 52 65 74 20 3d 20 30 3b 0a 20 20 44 D dwRet = 0;. D
1a1b0 57 4f 52 44 20 64 77 44 75 6d 6d 79 3b 0a 0a 20 WORD dwDummy;..
1a1c0 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 6e 65 65 64 /*. ** We need
1a1d0 20 74 6f 20 67 65 74 20 74 68 65 20 66 75 6c 6c to get the full
1a1e0 20 70 61 74 68 20 6e 61 6d 65 20 6f 66 20 74 68 path name of th
1a1f0 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 6f 20 67 e file. ** to g
1a200 65 74 20 74 68 65 20 64 72 69 76 65 20 6c 65 74 et the drive let
1a210 74 65 72 20 74 6f 20 6c 6f 6f 6b 20 75 70 20 74 ter to look up t
1a220 68 65 20 73 65 63 74 6f 72 0a 20 20 2a 2a 20 73 he sector. ** s
1a230 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 ize.. */. Simu
1a240 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 lateIOErrorBenig
1a250 6e 28 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 n(1);. sqlite3B
1a260 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 eginBenignMalloc
1a270 28 29 3b 0a 20 20 72 63 20 3d 20 77 69 6e 46 75 ();. rc = winFu
1a280 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c llPathname(pVfs,
1a290 20 7a 52 65 6c 61 74 69 76 65 2c 20 4d 41 58 5f zRelative, MAX_
1a2a0 50 41 54 48 2c 20 7a 46 75 6c 6c 70 61 74 68 29 PATH, zFullpath)
1a2b0 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 ;. sqlite3EndBe
1a2c0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 nignMalloc();.
1a2d0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 SimulateIOErrorB
1a2e0 65 6e 69 67 6e 28 30 29 3b 0a 20 20 69 66 28 20 enign(0);. if(
1a2f0 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 rc == SQLITE_OK
1a300 29 0a 20 20 7b 0a 20 20 20 20 76 6f 69 64 20 2a ). {. void *
1a310 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 20 20 zConverted;.
1a320 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 sqlite3BeginBeni
1a330 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 gnMalloc();.
1a340 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e zConverted = con
1a350 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 vertUtf8Filename
1a360 28 7a 46 75 6c 6c 70 61 74 68 29 3b 0a 20 20 20 (zFullpath);.
1a370 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 sqlite3EndBenig
1a380 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 nMalloc();. i
1a390 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b f( zConverted ){
1a3a0 0a 20 20 20 20 20 20 69 66 28 20 69 73 4e 54 28 . if( isNT(
1a3b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 ) ){. /*
1a3c0 74 72 69 6d 20 70 61 74 68 20 74 6f 20 6a 75 73 trim path to jus
1a3d0 74 20 64 72 69 76 65 20 72 65 66 65 72 65 6e 63 t drive referenc
1a3e0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c 50 57 e */. LPW
1a3f0 53 54 52 20 70 20 3d 20 7a 43 6f 6e 76 65 72 74 STR p = zConvert
1a400 65 64 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 ed;. for(
1a410 3b 2a 70 3b 70 2b 2b 29 7b 0a 20 20 20 20 20 20 ;*p;p++){.
1a420 20 20 20 20 69 66 28 20 2a 70 20 3d 3d 20 27 5c if( *p == '\
1a430 5c 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 \' ){.
1a440 20 20 2a 70 20 3d 20 27 5c 30 27 3b 0a 20 20 20 *p = '\0';.
1a450 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a break;.
1a460 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 }.
1a470 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 77 }. dw
1a480 52 65 74 20 3d 20 6f 73 47 65 74 44 69 73 6b 46 Ret = osGetDiskF
1a490 72 65 65 53 70 61 63 65 57 28 28 4c 50 43 57 53 reeSpaceW((LPCWS
1a4a0 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 TR)zConverted,.
1a4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a4d0 20 20 20 26 64 77 44 75 6d 6d 79 2c 0a 20 20 20 &dwDummy,.
1a4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a500 20 26 62 79 74 65 73 50 65 72 53 65 63 74 6f 72 &bytesPerSector
1a510 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
1a520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a530 20 20 20 20 20 20 26 64 77 44 75 6d 6d 79 2c 0a &dwDummy,.
1a540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a560 20 20 20 20 26 64 77 44 75 6d 6d 79 29 3b 0a 20 &dwDummy);.
1a570 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 }else{.
1a580 20 20 20 20 2f 2a 20 74 72 69 6d 20 70 61 74 68 /* trim path
1a590 20 74 6f 20 6a 75 73 74 20 64 72 69 76 65 20 72 to just drive r
1a5a0 65 66 65 72 65 6e 63 65 20 2a 2f 0a 20 20 20 20 eference */.
1a5b0 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63 char *p = (c
1a5c0 68 61 72 20 2a 29 7a 43 6f 6e 76 65 72 74 65 64 har *)zConverted
1a5d0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 2a ;. for(;*
1a5e0 70 3b 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 p;p++){.
1a5f0 20 20 69 66 28 20 2a 70 20 3d 3d 20 27 5c 5c 27 if( *p == '\\'
1a600 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 ){.
1a610 2a 70 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 *p = '\0';.
1a620 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 break;.
1a630 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
1a640 20 20 7d 0a 20 20 20 20 20 20 20 20 64 77 52 65 }. dwRe
1a650 74 20 3d 20 6f 73 47 65 74 44 69 73 6b 46 72 65 t = osGetDiskFre
1a660 65 53 70 61 63 65 41 28 28 63 68 61 72 2a 29 7a eSpaceA((char*)z
1a670 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 Converted,.
1a680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 &
1a6a0 64 77 44 75 6d 6d 79 2c 0a 20 20 20 20 20 20 20 dwDummy,.
1a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 62 79 &by
1a6d0 74 65 73 50 65 72 53 65 63 74 6f 72 2c 0a 20 20 tesPerSector,.
1a6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a700 20 20 26 64 77 44 75 6d 6d 79 2c 0a 20 20 20 20 &dwDummy,.
1a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a730 26 64 77 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20 &dwDummy);.
1a740 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 }. sqlite3
1a750 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 _free(zConverted
1a760 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 );. }. if(
1a770 20 21 64 77 52 65 74 20 29 7b 0a 20 20 20 20 20 !dwRet ){.
1a780 20 62 79 74 65 73 50 65 72 53 65 63 74 6f 72 20 bytesPerSector
1a790 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 = SQLITE_DEFAULT
1a7a0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 _SECTOR_SIZE;.
1a7b0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 }. }.#endif.
1a7c0 20 72 65 74 75 72 6e 20 28 69 6e 74 29 20 62 79 return (int) by
1a7d0 74 65 73 50 65 72 53 65 63 74 6f 72 3b 20 0a 7d tesPerSector; .}
1a7e0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 ..#ifndef SQLITE
1a7f0 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e _OMIT_LOAD_EXTEN
1a800 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 SION./*.** Inter
1a810 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e faces for openin
1a820 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 g a shared libra
1a830 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 ry, finding entr
1a840 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 y points.** with
1a850 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 in the shared li
1a860 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 brary, and closi
1a870 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 ng the shared li
1a880 62 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 brary..*/./*.**
1a890 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f Interfaces for o
1a8a0 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 pening a shared
1a8b0 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 library, finding
1a8c0 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a entry points.**
1a8d0 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 within the shar
1a8e0 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 ed library, and
1a8f0 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 closing the shar
1a900 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 ed library..*/.s
1a910 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 44 tatic void *winD
1a920 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 lOpen(sqlite3_vf
1a930 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 s *pVfs, const c
1a940 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b har *zFilename){
1a950 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 76 . HANDLE h;. v
1a960 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 oid *zConverted
1a970 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c = convertUtf8Fil
1a980 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 ename(zFilename)
1a990 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d ;. UNUSED_PARAM
1a9a0 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 69 66 ETER(pVfs);. if
1a9b0 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 ( zConverted==0
1a9c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b ){. return 0;
1a9d0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 . }. if( isNT(
1a9e0 29 20 29 7b 0a 20 20 20 20 68 20 3d 20 6f 73 4c ) ){. h = osL
1a9f0 6f 61 64 4c 69 62 72 61 72 79 57 28 28 4c 50 43 oadLibraryW((LPC
1aa00 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 29 WSTR)zConverted)
1aa10 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 ;./* isNT() is 1
1aa20 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 if SQLITE_OS_WI
1aa30 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 NCE==1, so this
1aa40 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 else is never ex
1aa50 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 ecuted. .** Sinc
1aa60 65 20 74 68 65 20 41 4e 53 49 20 76 65 72 73 69 e the ANSI versi
1aa70 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 on of these Wind
1aa80 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 ows API do not e
1aa90 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a xist for WINCE,.
1aaa0 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e ** it's importan
1aab0 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e t to not referen
1aac0 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 ce them for WINC
1aad0 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 E builds..*/.#if
1aae0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 SQLITE_OS_WINCE
1aaf0 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 ==0. }else{.
1ab00 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 h = osLoadLibra
1ab10 72 79 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 ryA((char*)zConv
1ab20 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 erted);.#endif.
1ab30 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 }. sqlite3_fre
1ab40 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 e(zConverted);.
1ab50 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 68 return (void*)h
1ab60 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 ;.}.static void
1ab70 77 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 winDlError(sqlit
1ab80 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e e3_vfs *pVfs, in
1ab90 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 t nBuf, char *zB
1aba0 75 66 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 ufOut){. UNUSED
1abb0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 _PARAMETER(pVfs)
1abc0 3b 0a 20 20 67 65 74 4c 61 73 74 45 72 72 6f 72 ;. getLastError
1abd0 4d 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72 Msg(osGetLastErr
1abe0 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 or(), nBuf, zBuf
1abf0 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 Out);.}.static v
1ac00 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73 oid (*winDlSym(s
1ac10 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 qlite3_vfs *pVfs
1ac20 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 2c , void *pHandle,
1ac30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 const char *zSy
1ac40 6d 62 6f 6c 29 29 28 76 6f 69 64 29 7b 0a 20 20 mbol))(void){.
1ac50 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 UNUSED_PARAMETER
1ac60 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e (pVfs);. return
1ac70 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 29 29 (void(*)(void))
1ac80 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 osGetProcAddress
1ac90 41 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c A((HANDLE)pHandl
1aca0 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 7d 0a 73 e, zSymbol);.}.s
1acb0 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c tatic void winDl
1acc0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 Close(sqlite3_vf
1acd0 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 s *pVfs, void *p
1ace0 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 Handle){. UNUSE
1acf0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 D_PARAMETER(pVfs
1ad00 29 3b 0a 20 20 6f 73 46 72 65 65 4c 69 62 72 61 );. osFreeLibra
1ad10 72 79 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 ry((HANDLE)pHand
1ad20 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 le);.}.#else /*
1ad30 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c if SQLITE_OMIT_L
1ad40 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 OAD_EXTENSION is
1ad50 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 defined: */. #
1ad60 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e define winDlOpen
1ad70 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 0. #define wi
1ad80 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 nDlError 0. #de
1ad90 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20 20 fine winDlSym
1ada0 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 0. #define winD
1adb0 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a lClose 0.#endif.
1adc0 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70 ../*.** Write up
1add0 20 74 6f 20 6e 42 75 66 20 62 79 74 65 73 20 6f to nBuf bytes o
1ade0 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 f randomness int
1adf0 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 o zBuf..*/.stati
1ae00 63 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e c int winRandomn
1ae10 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 ess(sqlite3_vfs
1ae20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c *pVfs, int nBuf,
1ae30 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 char *zBuf){.
1ae40 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 55 4e 55 int n = 0;. UNU
1ae50 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 SED_PARAMETER(pV
1ae60 66 73 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 fs);.#if defined
1ae70 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 (SQLITE_TEST).
1ae80 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d 65 6d 73 n = nBuf;. mems
1ae90 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 et(zBuf, 0, nBuf
1aea0 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73 );.#else. if( s
1aeb0 69 7a 65 6f 66 28 53 59 53 54 45 4d 54 49 4d 45 izeof(SYSTEMTIME
1aec0 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 )<=nBuf-n ){.
1aed0 20 53 59 53 54 45 4d 54 49 4d 45 20 78 3b 0a 20 SYSTEMTIME x;.
1aee0 20 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 osGetSystemTi
1aef0 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d 65 6d 63 me(&x);. memc
1af00 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c py(&zBuf[n], &x,
1af10 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 sizeof(x));.
1af20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 78 29 3b n += sizeof(x);
1af30 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f . }. if( sizeo
1af40 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e f(DWORD)<=nBuf-n
1af50 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 70 69 ){. DWORD pi
1af60 64 20 3d 20 6f 73 47 65 74 43 75 72 72 65 6e 74 d = osGetCurrent
1af70 50 72 6f 63 65 73 73 49 64 28 29 3b 0a 20 20 20 ProcessId();.
1af80 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d memcpy(&zBuf[n]
1af90 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 , &pid, sizeof(p
1afa0 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 id));. n += s
1afb0 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 7d 0a izeof(pid);. }.
1afc0 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f if( sizeof(DWO
1afd0 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 RD)<=nBuf-n ){.
1afe0 20 20 20 44 57 4f 52 44 20 63 6e 74 20 3d 20 6f DWORD cnt = o
1aff0 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 28 29 3b sGetTickCount();
1b000 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 . memcpy(&zBu
1b010 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65 f[n], &cnt, size
1b020 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20 of(cnt));. n
1b030 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a += sizeof(cnt);.
1b040 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 }. if( sizeof
1b050 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 29 3c (LARGE_INTEGER)<
1b060 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 4c =nBuf-n ){. L
1b070 41 52 47 45 5f 49 4e 54 45 47 45 52 20 69 3b 0a ARGE_INTEGER i;.
1b080 20 20 20 20 6f 73 51 75 65 72 79 50 65 72 66 6f osQueryPerfo
1b090 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28 26 69 rmanceCounter(&i
1b0a0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a );. memcpy(&z
1b0b0 42 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a 65 Buf[n], &i, size
1b0c0 6f 66 28 69 29 29 3b 0a 20 20 20 20 6e 20 2b 3d of(i));. n +=
1b0d0 20 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20 7d 0a sizeof(i);. }.
1b0e0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 #endif. return
1b0f0 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 n;.}.../*.** Sle
1b100 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 ep for a little
1b110 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 while. Return t
1b120 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d he amount of tim
1b130 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 e slept..*/.stat
1b140 69 63 20 69 6e 74 20 77 69 6e 53 6c 65 65 70 28 ic int winSleep(
1b150 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 sqlite3_vfs *pVf
1b160 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 29 s, int microsec)
1b170 7b 0a 20 20 6f 73 53 6c 65 65 70 28 28 6d 69 63 {. osSleep((mic
1b180 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29 rosec+999)/1000)
1b190 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d ;. UNUSED_PARAM
1b1a0 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 ETER(pVfs);. re
1b1b0 74 75 72 6e 20 28 28 6d 69 63 72 6f 73 65 63 2b turn ((microsec+
1b1c0 39 39 39 29 2f 31 30 30 30 29 2a 31 30 30 30 3b 999)/1000)*1000;
1b1d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f .}../*.** The fo
1b1e0 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 llowing variable
1b1f0 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f , if set to a no
1b200 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 n-zero value, is
1b210 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a interpreted as.
1b220 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 ** the number of
1b230 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 seconds since 1
1b240 39 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20 970 and is used
1b250 74 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c to set the resul
1b260 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f t of.** sqlite3O
1b270 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64 sCurrentTime() d
1b280 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a uring testing..*
1b290 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f /.#ifdef SQLITE_
1b2a0 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 TEST.int sqlite3
1b2b0 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 _current_time =
1b2c0 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 0; /* Fake syst
1b2d0 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e em time in secon
1b2e0 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a ds since 1970. *
1b2f0 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 /.#endif../*.**
1b300 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 Find the current
1b310 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 time (in Univer
1b320 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 sal Coordinated
1b330 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e Time). Write in
1b340 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 to *piNow.** the
1b350 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e current time an
1b360 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 d date as a Juli
1b370 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69 an Day number ti
1b380 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 mes 86_400_000.
1b390 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 In.** other wor
1b3a0 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a ds, write into *
1b3b0 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 piNow the number
1b3c0 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 of milliseconds
1b3d0 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 since the Julia
1b3e0 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f n.** epoch of no
1b3f0 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20 on in Greenwich
1b400 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 on November 24,
1b410 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69 4714 B.C accordi
1b420 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f ng to the.** pro
1b430 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e leptic Gregorian
1b440 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a calendar..**.**
1b450 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 On success, ret
1b460 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 urn SQLITE_OK.
1b470 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 Return SQLITE_ER
1b480 52 4f 52 20 69 66 20 74 68 65 20 74 69 6d 65 20 ROR if the time
1b490 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e and date .** can
1b4a0 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f not be found..*/
1b4b0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 .static int winC
1b4c0 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 urrentTimeInt64(
1b4d0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 sqlite3_vfs *pVf
1b4e0 73 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 s, sqlite3_int64
1b4f0 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46 *piNow){. /* F
1b500 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74 75 72 ILETIME structur
1b510 65 20 69 73 20 61 20 36 34 2d 62 69 74 20 76 61 e is a 64-bit va
1b520 6c 75 65 20 72 65 70 72 65 73 65 6e 74 69 6e 67 lue representing
1b530 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a the number of .
1b540 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65 63 100-nanosec
1b550 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73 20 73 69 ond intervals si
1b560 6e 63 65 20 4a 61 6e 75 61 72 79 20 31 2c 20 31 nce January 1, 1
1b570 36 30 31 20 28 3d 20 4a 44 20 32 33 30 35 38 31 601 (= JD 230581
1b580 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20 20 46 49 3.5). . */. FI
1b590 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 73 74 61 LETIME ft;. sta
1b5a0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 tic const sqlite
1b5b0 33 5f 69 6e 74 36 34 20 77 69 6e 46 69 6c 65 74 3_int64 winFilet
1b5c0 69 6d 65 45 70 6f 63 68 20 3d 20 32 33 30 35 38 imeEpoch = 23058
1b5d0 31 33 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 135*(sqlite3_int
1b5e0 36 34 29 38 36 34 30 30 30 30 3b 0a 23 69 66 64 64)8640000;.#ifd
1b5f0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 ef SQLITE_TEST.
1b600 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 static const sq
1b610 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 lite3_int64 unix
1b620 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35 Epoch = 24405875
1b630 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 *(sqlite3_int64)
1b640 38 36 34 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 8640000;.#endif.
1b650 20 20 2f 2a 20 32 5e 33 32 20 2d 20 74 6f 20 61 /* 2^32 - to a
1b660 76 6f 69 64 20 75 73 65 20 6f 66 20 4c 4c 20 61 void use of LL a
1b670 6e 64 20 77 61 72 6e 69 6e 67 73 20 69 6e 20 67 nd warnings in g
1b680 63 63 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 cc */. static c
1b690 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 onst sqlite3_int
1b6a0 36 34 20 6d 61 78 33 32 42 69 74 56 61 6c 75 65 64 max32BitValue
1b6b0 20 3d 20 0a 20 20 20 20 20 20 28 73 71 6c 69 74 = . (sqlit
1b6c0 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 e3_int64)2000000
1b6d0 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f 69 000 + (sqlite3_i
1b6e0 6e 74 36 34 29 32 30 30 30 30 30 30 30 30 30 20 nt64)2000000000
1b6f0 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 + (sqlite3_int64
1b700 29 32 39 34 39 36 37 32 39 36 3b 0a 0a 23 69 66 )294967296;..#if
1b710 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 SQLITE_OS_WINCE
1b720 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69 . SYSTEMTIME ti
1b730 6d 65 3b 0a 20 20 6f 73 47 65 74 53 79 73 74 65 me;. osGetSyste
1b740 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20 mTime(&time);.
1b750 2f 2a 20 69 66 20 53 79 73 74 65 6d 54 69 6d 65 /* if SystemTime
1b760 54 6f 46 69 6c 65 54 69 6d 65 28 29 20 66 61 69 ToFileTime() fai
1b770 6c 73 2c 20 69 74 20 72 65 74 75 72 6e 73 20 7a ls, it returns z
1b780 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21 6f ero. */. if (!o
1b790 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c sSystemTimeToFil
1b7a0 65 54 69 6d 65 28 26 74 69 6d 65 2c 26 66 74 29 eTime(&time,&ft)
1b7b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 ){. return SQ
1b7c0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a LITE_ERROR;. }.
1b7d0 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73 #else. osGetSys
1b7e0 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d temTimeAsFileTim
1b7f0 65 28 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66 e( &ft );.#endif
1b800 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e .. *piNow = win
1b810 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a FiletimeEpoch +.
1b820 20 20 20 20 20 20 20 20 20 20 20 20 28 28 28 28 ((((
1b830 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 sqlite3_int64)ft
1b840 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 29 .dwHighDateTime)
1b850 2a 6d 61 78 33 32 42 69 74 56 61 6c 75 65 29 20 *max32BitValue)
1b860 2b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 + .
1b870 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 (sqlite3_int64
1b880 29 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d )ft.dwLowDateTim
1b890 65 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 e)/(sqlite3_int6
1b8a0 34 29 31 30 30 30 30 3b 0a 0a 23 69 66 64 65 66 4)10000;..#ifdef
1b8b0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 SQLITE_TEST. i
1b8c0 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 f( sqlite3_curre
1b8d0 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a nt_time ){. *
1b8e0 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 piNow = 1000*(sq
1b8f0 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 lite3_int64)sqli
1b900 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 te3_current_time
1b910 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 + unixEpoch;.
1b920 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 }.#endif. UNUSE
1b930 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 D_PARAMETER(pVfs
1b940 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 );. return SQLI
1b950 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 TE_OK;.}../*.**
1b960 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 Find the current
1b970 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 time (in Univer
1b980 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 sal Coordinated
1b990 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 Time). Write th
1b9a0 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d e.** current tim
1b9b0 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 e and date as a
1b9c0 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 Julian Day numbe
1b9d0 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e r into *prNow an
1b9e0 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 d.** return 0.
1b9f0 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 Return 1 if the
1ba00 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 time and date ca
1ba10 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a nnot be found..*
1ba20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e /.static int win
1ba30 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 CurrentTime(sqli
1ba40 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 te3_vfs *pVfs, d
1ba50 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 ouble *prNow){.
1ba60 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 int rc;. sqlit
1ba70 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72 63 e3_int64 i;. rc
1ba80 20 3d 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d = winCurrentTim
1ba90 65 49 6e 74 36 34 28 70 56 66 73 2c 20 26 69 29 eInt64(pVfs, &i)
1baa0 3b 0a 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 ;. if( !rc ){.
1bab0 20 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 *prNow = i/86
1bac0 34 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 400000.0;. }.
1bad0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a return rc;.}../*
1bae0 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 .** The idea is
1baf0 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 that this functi
1bb00 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20 on works like a
1bb10 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a combination of.*
1bb20 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 * GetLastError()
1bb30 20 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73 61 and FormatMessa
1bb40 67 65 28 29 20 6f 6e 20 57 69 6e 64 6f 77 73 20 ge() on Windows
1bb50 28 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a (or errno and.**
1bb60 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e strerror_r() on
1bb70 20 55 6e 69 78 29 2e 20 41 66 74 65 72 20 61 6e Unix). After an
1bb80 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e error is return
1bb90 65 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 ed by an OS.** f
1bba0 75 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20 unction, SQLite
1bbb0 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 calls this funct
1bbc0 69 6f 6e 20 77 69 74 68 20 7a 42 75 66 20 70 6f ion with zBuf po
1bbd0 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 inting to.** a b
1bbe0 75 66 66 65 72 20 6f 66 20 6e 42 75 66 20 62 79 uffer of nBuf by
1bbf0 74 65 73 2e 20 54 68 65 20 4f 53 20 6c 61 79 65 tes. The OS laye
1bc00 72 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74 r should populat
1bc10 65 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 20 e the.** buffer
1bc20 77 69 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69 with a nul-termi
1bc30 6e 61 74 65 64 20 55 54 46 2d 38 20 65 6e 63 6f nated UTF-8 enco
1bc40 64 65 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 ded error messag
1bc50 65 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 e.** describing
1bc60 74 68 65 20 6c 61 73 74 20 49 4f 20 65 72 72 6f the last IO erro
1bc70 72 20 74 6f 20 68 61 76 65 20 6f 63 63 75 72 72 r to have occurr
1bc80 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 ed within the ca
1bc90 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e lling.** thread.
1bca0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 72 .**.** If the er
1bcb0 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 74 ror message is t
1bcc0 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20 74 68 65 oo large for the
1bcd0 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 supplied buffer
1bce0 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20 62 ,.** it should b
1bcf0 65 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65 e truncated. The
1bd00 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 return value of
1bd10 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a xGetLastError.*
1bd20 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 * is zero if the
1bd30 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 error message f
1bd40 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 its in the buffe
1bd50 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a r, or non-zero.*
1bd60 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 * otherwise (if
1bd70 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 the message was
1bd80 74 72 75 6e 63 61 74 65 64 29 2e 20 49 66 20 6e truncated). If n
1bd90 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 on-zero is retur
1bda0 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 ned,.** then it
1bdb0 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 is not necessary
1bdc0 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 to include the
1bdd0 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63 nul-terminator c
1bde0 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74 haracter.** in t
1bdf0 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 he output buffer
1be00 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 ..**.** Not supp
1be10 6c 79 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d lying an error m
1be20 65 73 73 61 67 65 20 77 69 6c 6c 20 68 61 76 65 essage will have
1be30 20 6e 6f 20 61 64 76 65 72 73 65 20 65 66 66 65 no adverse effe
1be40 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e ct.** on SQLite.
1be50 20 49 74 20 69 73 20 66 69 6e 65 20 74 6f 20 68 It is fine to h
1be60 61 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 ave an implement
1be70 61 74 69 6f 6e 20 74 68 61 74 20 6e 65 76 65 72 ation that never
1be80 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65 .** returns an e
1be90 72 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a rror message:.**
1bea0 0a 2a 2a 20 20 20 69 6e 74 20 78 47 65 74 4c 61 .** int xGetLa
1beb0 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f stError(sqlite3_
1bec0 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e vfs *pVfs, int n
1bed0 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 Buf, char *zBuf)
1bee0 7b 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 {.** assert(
1bef0 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a zBuf[0]=='\0');.
1bf00 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b ** return 0;
1bf10 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f .** }.**.** Ho
1bf20 77 65 76 65 72 20 69 66 20 61 6e 20 65 72 72 6f wever if an erro
1bf30 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 75 70 r message is sup
1bf40 70 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 plied, it will b
1bf50 65 20 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a e incorporated.*
1bf60 2a 20 62 79 20 73 71 6c 69 74 65 20 69 6e 74 6f * by sqlite into
1bf70 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 the error messa
1bf80 67 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 ge available to
1bf90 74 68 65 20 75 73 65 72 20 75 73 69 6e 67 0a 2a the user using.*
1bfa0 2a 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 * sqlite3_errmsg
1bfb0 28 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b (), possibly mak
1bfc0 69 6e 67 20 49 4f 20 65 72 72 6f 72 73 20 65 61 ing IO errors ea
1bfd0 73 69 65 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a sier to debug..*
1bfe0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e /.static int win
1bff0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c GetLastError(sql
1c000 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 ite3_vfs *pVfs,
1c010 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a int nBuf, char *
1c020 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f zBuf){. UNUSED_
1c030 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b PARAMETER(pVfs);
1c040 0a 20 20 72 65 74 75 72 6e 20 67 65 74 4c 61 73 . return getLas
1c050 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c tErrorMsg(osGetL
1c060 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 66 astError(), nBuf
1c070 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a , zBuf);.}../*.*
1c080 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 * Initialize and
1c090 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 deinitialize th
1c0a0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 e operating syst
1c0b0 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f em interface..*/
1c0c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f .int sqlite3_os_
1c0d0 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 init(void){. st
1c0e0 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 atic sqlite3_vfs
1c0f0 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20 winVfs = {.
1c100 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3,
1c110 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e /* iVersion
1c120 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 */. sizeof(w
1c130 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 inFile), /*
1c140 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 szOsFile */.
1c150 4d 41 58 5f 50 41 54 48 2c 20 20 20 20 20 20 20 MAX_PATH,
1c160 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61 /* mxPathna
1c170 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 me */. 0,
1c180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1c190 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 * pNext */. "
1c1a0 77 69 6e 33 32 22 2c 20 20 20 20 20 20 20 20 20 win32",
1c1b0 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a /* zName */.
1c1c0 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 0,
1c1d0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 /* pApp
1c1e0 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f Data */. winO
1c1f0 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 pen,
1c200 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 /* xOpen */.
1c210 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 winDelete,
1c220 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 /* xDelete
1c230 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73 */. winAcces
1c240 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 s, /*
1c250 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 xAccess */. w
1c260 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 inFullPathname,
1c270 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 /* xFullPath
1c280 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 name */. winD
1c290 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 lOpen,
1c2a0 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 /* xDlOpen */.
1c2b0 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 winDlError,
1c2c0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 /* xDlEr
1c2d0 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c ror */. winDl
1c2e0 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 Sym,
1c2f0 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 /* xDlSym */.
1c300 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 winDlClose,
1c310 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 /* xDlClos
1c320 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 e */. winRand
1c330 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a omness, /*
1c340 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a xRandomness */.
1c350 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 winSleep,
1c360 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 /* xSle
1c370 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 ep */. winCur
1c380 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f rentTime, /
1c390 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a * xCurrentTime *
1c3a0 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74 /. winGetLast
1c3b0 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47 Error, /* xG
1c3c0 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 etLastError */.
1c3d0 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d winCurrentTim
1c3e0 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 eInt64, /* xCurr
1c3f0 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a entTimeInt64 */.
1c400 20 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d winSetSystem
1c410 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74 Call, /* xSet
1c420 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 SystemCall */.
1c430 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 winGetSystemCa
1c440 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79 ll, /* xGetSy
1c450 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 stemCall */.
1c460 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c winNextSystemCal
1c470 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 l, /* xNextSys
1c480 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a temCall */. };.
1c490 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63 68 65 . /* Double-che
1c4a0 63 6b 20 74 68 61 74 20 74 68 65 20 61 53 79 73 ck that the aSys
1c4b0 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68 61 73 call[] array has
1c4c0 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 been constructe
1c4d0 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 d. ** correctly
1c4e0 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b 62 . See ticket [b
1c4f0 62 33 61 38 36 65 38 39 30 63 38 65 39 36 61 62 b3a86e890c8e96ab
1c500 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 41 ] */. assert( A
1c510 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c rraySize(aSyscal
1c520 6c 29 3d 3d 36 30 20 29 3b 0a 0a 23 69 66 6e 64 l)==60 );..#ifnd
1c530 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 ef SQLITE_OMIT_W
1c540 41 4c 0a 20 20 2f 2a 20 67 65 74 20 6d 65 6d 6f AL. /* get memo
1c550 72 79 20 6d 61 70 20 61 6c 6c 6f 63 61 74 69 6f ry map allocatio
1c560 6e 20 67 72 61 6e 75 6c 61 72 69 74 79 20 2a 2f n granularity */
1c570 0a 20 20 6d 65 6d 73 65 74 28 26 77 69 6e 53 79 . memset(&winSy
1c580 73 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 sInfo, 0, sizeof
1c590 28 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a (SYSTEM_INFO));.
1c5a0 20 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66 osGetSystemInf
1c5b0 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a o(&winSysInfo);.
1c5c0 20 20 61 73 73 65 72 74 28 77 69 6e 53 79 73 49 assert(winSysI
1c5d0 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e nfo.dwAllocation
1c5e0 47 72 61 6e 75 6c 61 72 69 74 79 20 3e 20 30 29 Granularity > 0)
1c5f0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 ;.#endif.. sqli
1c600 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 te3_vfs_register
1c610 28 26 77 69 6e 56 66 73 2c 20 31 29 3b 0a 20 20 (&winVfs, 1);.
1c620 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
1c630 3b 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 ; .}..int sqlite
1c640 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 3_os_end(void){
1c650 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 . return SQLITE
1c660 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f _OK;.}..#endif /
1c670 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 * SQLITE_OS_WIN
1c680 2a 2f 0a */.