/ Hex Artifact Content
Login

Artifact e54a81bc851724ad17206bfcb4a474f9481f9fc0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 36 0a 2a 2a 0a 2a 2a 20 54 68  mber 16.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
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 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
0180: 2a 20 54 68 69 73 20 68 65 61 64 65 72 20 66 69  * This header fi
0190: 6c 65 20 28 74 6f 67 65 74 68 65 72 20 77 69 74  le (together wit
01a0: 68 20 69 73 20 63 6f 6d 70 61 6e 69 6f 6e 20 43  h is companion C
01b0: 20 73 6f 75 72 63 65 2d 63 6f 64 65 20 66 69 6c   source-code fil
01c0: 65 0a 2a 2a 20 22 6f 73 2e 63 22 29 20 61 74 74  e.** "os.c") att
01d0: 65 6d 70 74 20 74 6f 20 61 62 73 74 72 61 63 74  empt to abstract
01e0: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
01f0: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
0200: 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 20   so that.** the 
0210: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20 77  SQLite library w
0220: 69 6c 6c 20 77 6f 72 6b 20 6f 6e 20 62 6f 74 68  ill work on both
0230: 20 50 4f 53 49 58 20 61 6e 64 20 77 69 6e 64 6f   POSIX and windo
0240: 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23  ws systems..*/.#
0250: 69 66 6e 64 65 66 20 5f 53 51 4c 49 54 45 5f 4f  ifndef _SQLITE_O
0260: 53 5f 48 5f 0a 23 64 65 66 69 6e 65 20 5f 53 51  S_H_.#define _SQ
0270: 4c 49 54 45 5f 4f 53 5f 48 5f 0a 0a 2f 2a 0a 2a  LITE_OS_H_../*.*
0280: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 69 66 20  * Figure out if 
0290: 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
02a0: 69 74 68 20 55 6e 69 78 2c 20 57 69 6e 64 6f 77  ith Unix, Window
02b0: 73 2c 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  s, or some other
02c0: 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79  .** operating sy
02d0: 73 74 65 6d 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  stem..*/.#if def
02e0: 69 6e 65 64 28 4f 53 5f 4f 54 48 45 52 29 0a 23  ined(OS_OTHER).#
02f0: 20 69 66 20 4f 53 5f 4f 54 48 45 52 3d 3d 31 0a   if OS_OTHER==1.
0300: 23 20 20 20 75 6e 64 65 66 20 4f 53 5f 55 4e 49  #   undef OS_UNI
0310: 58 0a 23 20 20 20 64 65 66 69 6e 65 20 4f 53 5f  X.#   define OS_
0320: 55 4e 49 58 20 30 0a 23 20 20 20 75 6e 64 65 66  UNIX 0.#   undef
0330: 20 4f 53 5f 57 49 4e 0a 23 20 20 20 64 65 66 69   OS_WIN.#   defi
0340: 6e 65 20 4f 53 5f 57 49 4e 20 30 0a 23 20 20 20  ne OS_WIN 0.#   
0350: 75 6e 64 65 66 20 4f 53 5f 4f 53 32 0a 23 20 20  undef OS_OS2.#  
0360: 20 64 65 66 69 6e 65 20 4f 53 5f 4f 53 32 20 30   define OS_OS2 0
0370: 0a 23 20 65 6c 73 65 0a 23 20 20 20 75 6e 64 65  .# else.#   unde
0380: 66 20 4f 53 5f 4f 54 48 45 52 0a 23 20 65 6e 64  f OS_OTHER.# end
0390: 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  if.#endif.#if !d
03a0: 65 66 69 6e 65 64 28 4f 53 5f 55 4e 49 58 29 20  efined(OS_UNIX) 
03b0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 53 5f 4f  && !defined(OS_O
03c0: 54 48 45 52 29 0a 23 20 64 65 66 69 6e 65 20 4f  THER).# define O
03d0: 53 5f 4f 54 48 45 52 20 30 0a 23 20 69 66 6e 64  S_OTHER 0.# ifnd
03e0: 65 66 20 4f 53 5f 57 49 4e 0a 23 20 20 20 69 66  ef OS_WIN.#   if
03f0: 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29   defined(_WIN32)
0400: 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33   || defined(WIN3
0410: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  2) || defined(__
0420: 43 59 47 57 49 4e 5f 5f 29 20 7c 7c 20 64 65 66  CYGWIN__) || def
0430: 69 6e 65 64 28 5f 5f 4d 49 4e 47 57 33 32 5f 5f  ined(__MINGW32__
0440: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 42  ) || defined(__B
0450: 4f 52 4c 41 4e 44 43 5f 5f 29 0a 23 20 20 20 20  ORLANDC__).#    
0460: 20 64 65 66 69 6e 65 20 4f 53 5f 57 49 4e 20 31   define OS_WIN 1
0470: 0a 23 20 20 20 20 20 64 65 66 69 6e 65 20 4f 53  .#     define OS
0480: 5f 55 4e 49 58 20 30 0a 23 20 20 20 20 20 64 65  _UNIX 0.#     de
0490: 66 69 6e 65 20 4f 53 5f 4f 53 32 20 30 0a 23 20  fine OS_OS2 0.# 
04a0: 20 20 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f    elif defined(_
04b0: 5f 45 4d 58 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  _EMX__) || defin
04c0: 65 64 28 5f 4f 53 32 29 20 7c 7c 20 64 65 66 69  ed(_OS2) || defi
04d0: 6e 65 64 28 4f 53 32 29 20 7c 7c 20 64 65 66 69  ned(OS2) || defi
04e0: 6e 65 64 28 5f 4f 53 32 5f 29 20 7c 7c 20 64 65  ned(_OS2_) || de
04f0: 66 69 6e 65 64 28 5f 5f 4f 53 32 5f 5f 29 0a 23  fined(__OS2__).#
0500: 20 20 20 20 20 64 65 66 69 6e 65 20 4f 53 5f 57       define OS_W
0510: 49 4e 20 30 0a 23 20 20 20 20 20 64 65 66 69 6e  IN 0.#     defin
0520: 65 20 4f 53 5f 55 4e 49 58 20 30 0a 23 20 20 20  e OS_UNIX 0.#   
0530: 20 20 64 65 66 69 6e 65 20 4f 53 5f 4f 53 32 20    define OS_OS2 
0540: 31 0a 23 20 20 20 65 6c 73 65 0a 23 20 20 20 20  1.#   else.#    
0550: 20 64 65 66 69 6e 65 20 4f 53 5f 57 49 4e 20 30   define OS_WIN 0
0560: 0a 23 20 20 20 20 20 64 65 66 69 6e 65 20 4f 53  .#     define OS
0570: 5f 55 4e 49 58 20 31 0a 23 20 20 20 20 20 64 65  _UNIX 1.#     de
0580: 66 69 6e 65 20 4f 53 5f 4f 53 32 20 30 0a 23 20  fine OS_OS2 0.# 
0590: 20 65 6e 64 69 66 0a 23 20 65 6c 73 65 0a 23 20   endif.# else.# 
05a0: 20 64 65 66 69 6e 65 20 4f 53 5f 55 4e 49 58 20   define OS_UNIX 
05b0: 30 0a 23 20 20 64 65 66 69 6e 65 20 4f 53 5f 4f  0.#  define OS_O
05c0: 53 32 20 30 0a 23 20 65 6e 64 69 66 0a 23 65 6c  S2 0.# endif.#el
05d0: 73 65 0a 23 20 69 66 6e 64 65 66 20 4f 53 5f 57  se.# ifndef OS_W
05e0: 49 4e 0a 23 20 20 64 65 66 69 6e 65 20 4f 53 5f  IN.#  define OS_
05f0: 57 49 4e 20 30 0a 23 20 65 6e 64 69 66 0a 23 65  WIN 0.# endif.#e
0600: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  ndif.../*.** Def
0610: 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ine the maximum 
0620: 73 69 7a 65 20 6f 66 20 61 20 74 65 6d 70 6f 72  size of a tempor
0630: 61 72 79 20 66 69 6c 65 6e 61 6d 65 0a 2a 2f 0a  ary filename.*/.
0640: 23 69 66 20 4f 53 5f 57 49 4e 0a 23 20 69 6e 63  #if OS_WIN.# inc
0650: 6c 75 64 65 20 3c 77 69 6e 64 6f 77 73 2e 68 3e  lude <windows.h>
0660: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
0670: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 28  _TEMPNAME_SIZE (
0680: 4d 41 58 5f 50 41 54 48 2b 35 30 29 0a 23 65 6c  MAX_PATH+50).#el
0690: 69 66 20 4f 53 5f 4f 53 32 0a 23 20 69 66 20 28  if OS_OS2.# if (
06a0: 5f 5f 47 4e 55 43 5f 5f 20 3e 20 33 20 7c 7c 20  __GNUC__ > 3 || 
06b0: 5f 5f 47 4e 55 43 5f 5f 20 3d 3d 20 33 20 26 26  __GNUC__ == 3 &&
06c0: 20 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 20   __GNUC_MINOR__ 
06d0: 3e 3d 20 33 29 20 26 26 20 64 65 66 69 6e 65 64  >= 3) && defined
06e0: 28 4f 53 32 5f 48 49 47 48 5f 4d 45 4d 4f 52 59  (OS2_HIGH_MEMORY
06f0: 29 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 6f 73  ).#  include <os
0700: 32 73 61 66 65 2e 68 3e 20 2f 2a 20 68 61 73 20  2safe.h> /* has 
0710: 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 62  to be included b
0720: 65 66 6f 72 65 20 6f 73 32 2e 68 20 66 6f 72 20  efore os2.h for 
0730: 6c 69 6e 6b 69 6e 67 20 74 6f 20 77 6f 72 6b 20  linking to work 
0740: 2a 2f 0a 23 20 65 6e 64 69 66 0a 23 20 64 65 66  */.# endif.# def
0750: 69 6e 65 20 49 4e 43 4c 5f 44 4f 53 44 41 54 45  ine INCL_DOSDATE
0760: 54 49 4d 45 0a 23 20 64 65 66 69 6e 65 20 49 4e  TIME.# define IN
0770: 43 4c 5f 44 4f 53 46 49 4c 45 4d 47 52 0a 23 20  CL_DOSFILEMGR.# 
0780: 64 65 66 69 6e 65 20 49 4e 43 4c 5f 44 4f 53 45  define INCL_DOSE
0790: 52 52 4f 52 53 0a 23 20 64 65 66 69 6e 65 20 49  RRORS.# define I
07a0: 4e 43 4c 5f 44 4f 53 4d 49 53 43 0a 23 20 64 65  NCL_DOSMISC.# de
07b0: 66 69 6e 65 20 49 4e 43 4c 5f 44 4f 53 50 52 4f  fine INCL_DOSPRO
07c0: 43 45 53 53 0a 23 20 64 65 66 69 6e 65 20 49 4e  CESS.# define IN
07d0: 43 4c 5f 44 4f 53 4d 4f 44 55 4c 45 4d 47 52 0a  CL_DOSMODULEMGR.
07e0: 23 20 69 6e 63 6c 75 64 65 20 3c 6f 73 32 2e 68  # include <os2.h
07f0: 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  >.# define SQLIT
0800: 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20  E_TEMPNAME_SIZE 
0810: 28 43 43 48 4d 41 58 50 41 54 48 43 4f 4d 50 29  (CCHMAXPATHCOMP)
0820: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
0830: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
0840: 53 49 5a 45 20 32 30 30 0a 23 65 6e 64 69 66 0a  SIZE 200.#endif.
0850: 0a 2f 2a 20 49 66 20 74 68 65 20 53 45 54 5f 46  ./* If the SET_F
0860: 55 4c 4c 53 59 4e 43 20 6d 61 63 72 6f 20 69 73  ULLSYNC macro is
0870: 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 61 62 6f   not defined abo
0880: 76 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 69 74  ve, then make it
0890: 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 0a 2a 2f 0a 23  .** a no-op.*/.#
08a0: 69 66 6e 64 65 66 20 53 45 54 5f 46 55 4c 4c 53  ifndef SET_FULLS
08b0: 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 53 45 54  YNC.# define SET
08c0: 5f 46 55 4c 4c 53 59 4e 43 28 78 2c 79 29 0a 23  _FULLSYNC(x,y).#
08d0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
08e0: 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20 6f 66   default size of
08f0: 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72 0a 2a   a disk sector.*
0900: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
0910: 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f  _DEFAULT_SECTOR_
0920: 53 49 5a 45 0a 23 20 64 65 66 69 6e 65 20 53 51  SIZE.# define SQ
0930: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43  LITE_DEFAULT_SEC
0940: 54 4f 52 5f 53 49 5a 45 20 35 31 32 0a 23 65 6e  TOR_SIZE 512.#en
0950: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 6d 70 6f  dif../*.** Tempo
0960: 72 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 6e  rary files are n
0970: 61 6d 65 64 20 73 74 61 72 74 69 6e 67 20 77 69  amed starting wi
0980: 74 68 20 74 68 69 73 20 70 72 65 66 69 78 20 66  th this prefix f
0990: 6f 6c 6c 6f 77 65 64 20 62 79 20 31 36 20 72 61  ollowed by 16 ra
09a0: 6e 64 6f 6d 0a 2a 2a 20 61 6c 70 68 61 6e 75 6d  ndom.** alphanum
09b0: 65 72 69 63 20 63 68 61 72 61 63 74 65 72 73 2c  eric characters,
09c0: 20 61 6e 64 20 6e 6f 20 66 69 6c 65 20 65 78 74   and no file ext
09d0: 65 6e 73 69 6f 6e 2e 20 54 68 65 79 20 61 72 65  ension. They are
09e0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a   stored in the.*
09f0: 2a 20 4f 53 27 73 20 73 74 61 6e 64 61 72 64 20  * OS's standard 
0a00: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 64  temporary file d
0a10: 69 72 65 63 74 6f 72 79 2c 20 61 6e 64 20 61 72  irectory, and ar
0a20: 65 20 64 65 6c 65 74 65 64 20 70 72 69 6f 72 20  e deleted prior 
0a30: 74 6f 20 65 78 69 74 2e 0a 2a 2a 20 49 66 20 73  to exit..** If s
0a40: 71 6c 69 74 65 20 69 73 20 62 65 69 6e 67 20 65  qlite is being e
0a50: 6d 62 65 64 64 65 64 20 69 6e 20 61 6e 6f 74 68  mbedded in anoth
0a60: 65 72 20 70 72 6f 67 72 61 6d 2c 20 79 6f 75 20  er program, you 
0a70: 6d 61 79 20 77 69 73 68 20 74 6f 20 63 68 61 6e  may wish to chan
0a80: 67 65 20 74 68 65 0a 2a 2a 20 70 72 65 66 69 78  ge the.** prefix
0a90: 20 74 6f 20 72 65 66 6c 65 63 74 20 79 6f 75 72   to reflect your
0aa0: 20 70 72 6f 67 72 61 6d 27 73 20 6e 61 6d 65 2c   program's name,
0ab0: 20 73 6f 20 74 68 61 74 20 69 66 20 79 6f 75 72   so that if your
0ac0: 20 70 72 6f 67 72 61 6d 20 65 78 69 74 73 0a 2a   program exits.*
0ad0: 2a 20 70 72 65 6d 61 74 75 72 65 6c 79 2c 20 6f  * prematurely, o
0ae0: 6c 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ld temporary fil
0af0: 65 73 20 63 61 6e 20 62 65 20 65 61 73 69 6c 79  es can be easily
0b00: 20 69 64 65 6e 74 69 66 69 65 64 2e 20 54 68 69   identified. Thi
0b10: 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 0a 2a 2a  s can be done.**
0b20: 20 75 73 69 6e 67 20 2d 44 54 45 4d 50 5f 46 49   using -DTEMP_FI
0b30: 4c 45 5f 50 52 45 46 49 58 3d 6d 79 70 72 65 66  LE_PREFIX=mypref
0b40: 69 78 5f 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69  ix_ on the compi
0b50: 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  ler command line
0b60: 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 36 2d 31 30 2d  ..**.** 2006-10-
0b70: 33 31 3a 20 20 54 68 65 20 64 65 66 61 75 6c 74  31:  The default
0b80: 20 70 72 65 66 69 78 20 75 73 65 64 20 74 6f 20   prefix used to 
0b90: 62 65 20 22 73 71 6c 69 74 65 5f 22 2e 20 20 42  be "sqlite_".  B
0ba0: 75 74 20 74 68 65 6e 0a 2a 2a 20 4d 63 61 66 65  ut then.** Mcafe
0bb0: 65 20 73 74 61 72 74 65 64 20 75 73 69 6e 67 20  e started using 
0bc0: 53 51 4c 69 74 65 20 69 6e 20 74 68 65 69 72 20  SQLite in their 
0bd0: 61 6e 74 69 2d 76 69 72 75 73 20 70 72 6f 64 75  anti-virus produ
0be0: 63 74 20 61 6e 64 20 69 74 0a 2a 2a 20 73 74 61  ct and it.** sta
0bf0: 72 74 65 64 20 70 75 74 74 69 6e 67 20 66 69 6c  rted putting fil
0c00: 65 73 20 77 69 74 68 20 74 68 65 20 22 73 71 6c  es with the "sql
0c10: 69 74 65 22 20 6e 61 6d 65 20 69 6e 20 74 68 65  ite" name in the
0c20: 20 63 3a 2f 74 65 6d 70 20 66 6f 6c 64 65 72 2e   c:/temp folder.
0c30: 0a 2a 2a 20 54 68 69 73 20 61 6e 6e 6f 79 65 64  .** This annoyed
0c40: 20 6d 61 6e 79 20 77 69 6e 64 6f 77 73 20 75 73   many windows us
0c50: 65 72 73 2e 20 20 54 68 6f 73 65 20 75 73 65 72  ers.  Those user
0c60: 73 20 77 6f 75 6c 64 20 74 68 65 6e 20 64 6f 20  s would then do 
0c70: 61 20 0a 2a 2a 20 47 6f 6f 67 6c 65 20 73 65 61  a .** Google sea
0c80: 72 63 68 20 66 6f 72 20 22 73 71 6c 69 74 65 22  rch for "sqlite"
0c90: 2c 20 66 69 6e 64 20 74 68 65 20 74 65 6c 65 70  , find the telep
0ca0: 68 6f 6e 65 20 6e 75 6d 62 65 72 73 20 6f 66 20  hone numbers of 
0cb0: 74 68 65 0a 2a 2a 20 64 65 76 65 6c 6f 70 65 72  the.** developer
0cc0: 73 20 61 6e 64 20 63 61 6c 6c 20 74 6f 20 77 61  s and call to wa
0cd0: 6b 65 20 74 68 65 6d 20 75 70 20 61 74 20 6e 69  ke them up at ni
0ce0: 67 68 74 20 61 6e 64 20 63 6f 6d 70 6c 61 69 6e  ght and complain
0cf0: 2e 0a 2a 2a 20 46 6f 72 20 74 68 69 73 20 72 65  ..** For this re
0d00: 61 73 6f 6e 2c 20 74 68 65 20 64 65 66 61 75 6c  ason, the defaul
0d10: 74 20 6e 61 6d 65 20 70 72 65 66 69 78 20 69 73  t name prefix is
0d20: 20 63 68 61 6e 67 65 64 20 74 6f 20 62 65 20 22   changed to be "
0d30: 73 71 6c 69 74 65 22 20 0a 2a 2a 20 73 70 65 6c  sqlite" .** spel
0d40: 6c 65 64 20 62 61 63 6b 77 61 72 64 73 2e 20 20  led backwards.  
0d50: 53 6f 20 74 68 65 20 74 65 6d 70 20 66 69 6c 65  So the temp file
0d60: 73 20 61 72 65 20 73 74 69 6c 6c 20 69 64 65 6e  s are still iden
0d70: 74 69 66 69 65 64 2c 20 62 75 74 0a 2a 2a 20 61  tified, but.** a
0d80: 6e 79 62 6f 64 79 20 73 6d 61 72 74 20 65 6e 6f  nybody smart eno
0d90: 75 67 68 20 74 6f 20 66 69 67 75 72 65 20 6f 75  ugh to figure ou
0da0: 74 20 74 68 65 20 63 6f 64 65 20 69 73 20 61 6c  t the code is al
0db0: 73 6f 20 6c 69 6b 65 6c 79 20 73 6d 61 72 74 0a  so likely smart.
0dc0: 2a 2a 20 65 6e 6f 75 67 68 20 74 6f 20 6b 6e 6f  ** enough to kno
0dd0: 77 20 74 68 61 74 20 63 61 6c 6c 69 6e 67 20 74  w that calling t
0de0: 68 65 20 64 65 76 65 6c 6f 70 65 72 20 77 69 6c  he developer wil
0df0: 6c 20 6e 6f 74 20 68 65 6c 70 20 67 65 74 20 72  l not help get r
0e00: 69 64 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c  id.** of the fil
0e10: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 54 45  e..*/.#ifndef TE
0e20: 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 0a 23  MP_FILE_PREFIX.#
0e30: 20 64 65 66 69 6e 65 20 54 45 4d 50 5f 46 49 4c   define TEMP_FIL
0e40: 45 5f 50 52 45 46 49 58 20 22 65 74 69 6c 71 73  E_PREFIX "etilqs
0e50: 5f 22 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 30  _".#endif..#if 0
0e60: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 74  ../*.** Define t
0e70: 68 65 20 69 6e 74 65 72 66 61 63 65 73 20 66 6f  he interfaces fo
0e80: 72 20 55 6e 69 78 2c 20 57 69 6e 64 6f 77 73 2c  r Unix, Windows,
0e90: 20 61 6e 64 20 4f 53 2f 32 2e 0a 2a 2f 0a 23 69   and OS/2..*/.#i
0ea0: 66 20 4f 53 5f 55 4e 49 58 0a 23 64 65 66 69 6e  f OS_UNIX.#defin
0eb0: 65 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  e sqlite3OsOpenR
0ec0: 65 61 64 57 72 69 74 65 20 20 20 20 20 20 73 71  eadWrite      sq
0ed0: 6c 69 74 65 33 55 6e 69 78 4f 70 65 6e 52 65 61  lite3UnixOpenRea
0ee0: 64 57 72 69 74 65 0a 23 64 65 66 69 6e 65 20 73  dWrite.#define s
0ef0: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c  qlite3OsOpenExcl
0f00: 75 73 69 76 65 20 20 20 20 20 20 73 71 6c 69 74  usive      sqlit
0f10: 65 33 55 6e 69 78 4f 70 65 6e 45 78 63 6c 75 73  e3UnixOpenExclus
0f20: 69 76 65 0a 23 64 65 66 69 6e 65 20 73 71 6c 69  ive.#define sqli
0f30: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
0f40: 79 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 55  y       sqlite3U
0f50: 6e 69 78 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 0a  nixOpenReadOnly.
0f60: 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 4f  #define sqlite3O
0f70: 73 44 65 6c 65 74 65 20 20 20 20 20 20 20 20 20  sDelete         
0f80: 20 20 20 20 73 71 6c 69 74 65 33 55 6e 69 78 44      sqlite3UnixD
0f90: 65 6c 65 74 65 0a 23 64 65 66 69 6e 65 20 73 71  elete.#define sq
0fa0: 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
0fb0: 73 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  s         sqlite
0fc0: 33 55 6e 69 78 46 69 6c 65 45 78 69 73 74 73 0a  3UnixFileExists.
0fd0: 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 4f  #define sqlite3O
0fe0: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 20 20  sFullPathname   
0ff0: 20 20 20 20 73 71 6c 69 74 65 33 55 6e 69 78 46      sqlite3UnixF
1000: 75 6c 6c 50 61 74 68 6e 61 6d 65 0a 23 64 65 66  ullPathname.#def
1010: 69 6e 65 20 73 71 6c 69 74 65 33 4f 73 49 73 44  ine sqlite3OsIsD
1020: 69 72 57 72 69 74 61 62 6c 65 20 20 20 20 20 20  irWritable      
1030: 73 71 6c 69 74 65 33 55 6e 69 78 49 73 44 69 72  sqlite3UnixIsDir
1040: 57 72 69 74 61 62 6c 65 0a 23 64 65 66 69 6e 65  Writable.#define
1050: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 44 69   sqlite3OsSyncDi
1060: 72 65 63 74 6f 72 79 20 20 20 20 20 20 73 71 6c  rectory      sql
1070: 69 74 65 33 55 6e 69 78 53 79 6e 63 44 69 72 65  ite3UnixSyncDire
1080: 63 74 6f 72 79 0a 23 64 65 66 69 6e 65 20 73 71  ctory.#define sq
1090: 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e  lite3OsTempFileN
10a0: 61 6d 65 20 20 20 20 20 20 20 73 71 6c 69 74 65  ame       sqlite
10b0: 33 55 6e 69 78 54 65 6d 70 46 69 6c 65 4e 61 6d  3UnixTempFileNam
10c0: 65 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  e.#define sqlite
10d0: 33 4f 73 52 61 6e 64 6f 6d 53 65 65 64 20 20 20  3OsRandomSeed   
10e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 55 6e 69        sqlite3Uni
10f0: 78 52 61 6e 64 6f 6d 53 65 65 64 0a 23 64 65 66  xRandomSeed.#def
1100: 69 6e 65 20 73 71 6c 69 74 65 33 4f 73 53 6c 65  ine sqlite3OsSle
1110: 65 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ep              
1120: 73 71 6c 69 74 65 33 55 6e 69 78 53 6c 65 65 70  sqlite3UnixSleep
1130: 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  .#define sqlite3
1140: 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 20 20 20  OsCurrentTime   
1150: 20 20 20 20 20 73 71 6c 69 74 65 33 55 6e 69 78       sqlite3Unix
1160: 43 75 72 72 65 6e 74 54 69 6d 65 0a 23 64 65 66  CurrentTime.#def
1170: 69 6e 65 20 73 71 6c 69 74 65 33 4f 73 45 6e 74  ine sqlite3OsEnt
1180: 65 72 4d 75 74 65 78 20 20 20 20 20 20 20 20 20  erMutex         
1190: 73 71 6c 69 74 65 33 55 6e 69 78 45 6e 74 65 72  sqlite3UnixEnter
11a0: 4d 75 74 65 78 0a 23 64 65 66 69 6e 65 20 73 71  Mutex.#define sq
11b0: 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65  lite3OsLeaveMute
11c0: 78 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  x         sqlite
11d0: 33 55 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 0a  3UnixLeaveMutex.
11e0: 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 4f  #define sqlite3O
11f0: 73 49 6e 4d 75 74 65 78 20 20 20 20 20 20 20 20  sInMutex        
1200: 20 20 20 20 73 71 6c 69 74 65 33 55 6e 69 78 49      sqlite3UnixI
1210: 6e 4d 75 74 65 78 0a 23 64 65 66 69 6e 65 20 73  nMutex.#define s
1220: 71 6c 69 74 65 33 4f 73 54 68 72 65 61 64 53 70  qlite3OsThreadSp
1230: 65 63 69 66 69 63 44 61 74 61 20 73 71 6c 69 74  ecificData sqlit
1240: 65 33 55 6e 69 78 54 68 72 65 61 64 53 70 65 63  e3UnixThreadSpec
1250: 69 66 69 63 44 61 74 61 0a 23 64 65 66 69 6e 65  ificData.#define
1260: 20 73 71 6c 69 74 65 33 4f 73 4d 61 6c 6c 6f 63   sqlite3OsMalloc
1270: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1280: 69 74 65 33 47 65 6e 65 72 69 63 4d 61 6c 6c 6f  ite3GenericMallo
1290: 63 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  c.#define sqlite
12a0: 33 4f 73 52 65 61 6c 6c 6f 63 20 20 20 20 20 20  3OsRealloc      
12b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e        sqlite3Gen
12c0: 65 72 69 63 52 65 61 6c 6c 6f 63 0a 23 64 65 66  ericRealloc.#def
12d0: 69 6e 65 20 73 71 6c 69 74 65 33 4f 73 46 72 65  ine sqlite3OsFre
12e0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
12f0: 73 71 6c 69 74 65 33 47 65 6e 65 72 69 63 46 72  sqlite3GenericFr
1300: 65 65 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  ee.#define sqlit
1310: 65 33 4f 73 41 6c 6c 6f 63 61 74 69 6f 6e 53 69  e3OsAllocationSi
1320: 7a 65 20 20 20 20 20 73 71 6c 69 74 65 33 47 65  ze     sqlite3Ge
1330: 6e 65 72 69 63 41 6c 6c 6f 63 61 74 69 6f 6e 53  nericAllocationS
1340: 69 7a 65 0a 23 64 65 66 69 6e 65 20 73 71 6c 69  ize.#define sqli
1350: 74 65 33 4f 73 44 6c 6f 70 65 6e 20 20 20 20 20  te3OsDlopen     
1360: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 55          sqlite3U
1370: 6e 69 78 44 6c 6f 70 65 6e 0a 23 64 65 66 69 6e  nixDlopen.#defin
1380: 65 20 73 71 6c 69 74 65 33 4f 73 44 6c 73 79 6d  e sqlite3OsDlsym
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
13a0: 6c 69 74 65 33 55 6e 69 78 44 6c 73 79 6d 0a 23  lite3UnixDlsym.#
13b0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 4f 73  define sqlite3Os
13c0: 44 6c 63 6c 6f 73 65 20 20 20 20 20 20 20 20 20  Dlclose         
13d0: 20 20 20 73 71 6c 69 74 65 33 55 6e 69 78 44 6c     sqlite3UnixDl
13e0: 63 6c 6f 73 65 0a 23 65 6e 64 69 66 0a 23 69 66  close.#endif.#if
13f0: 20 4f 53 5f 57 49 4e 0a 23 64 65 66 69 6e 65 20   OS_WIN.#define 
1400: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
1410: 64 57 72 69 74 65 20 20 20 20 20 20 73 71 6c 69  dWrite      sqli
1420: 74 65 33 57 69 6e 4f 70 65 6e 52 65 61 64 57 72  te3WinOpenReadWr
1430: 69 74 65 0a 23 64 65 66 69 6e 65 20 73 71 6c 69  ite.#define sqli
1440: 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  te3OsOpenExclusi
1450: 76 65 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  ve      sqlite3W
1460: 69 6e 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 0a  inOpenExclusive.
1470: 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 4f  #define sqlite3O
1480: 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 20 20 20  sOpenReadOnly   
1490: 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 4f 70      sqlite3WinOp
14a0: 65 6e 52 65 61 64 4f 6e 6c 79 0a 23 64 65 66 69  enReadOnly.#defi
14b0: 6e 65 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65  ne sqlite3OsDele
14c0: 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 73  te             s
14d0: 71 6c 69 74 65 33 57 69 6e 44 65 6c 65 74 65 0a  qlite3WinDelete.
14e0: 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 4f  #define sqlite3O
14f0: 73 46 69 6c 65 45 78 69 73 74 73 20 20 20 20 20  sFileExists     
1500: 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 46 69      sqlite3WinFi
1510: 6c 65 45 78 69 73 74 73 0a 23 64 65 66 69 6e 65  leExists.#define
1520: 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
1530: 74 68 6e 61 6d 65 20 20 20 20 20 20 20 73 71 6c  thname       sql
1540: 69 74 65 33 57 69 6e 46 75 6c 6c 50 61 74 68 6e  ite3WinFullPathn
1550: 61 6d 65 0a 23 64 65 66 69 6e 65 20 73 71 6c 69  ame.#define sqli
1560: 74 65 33 4f 73 49 73 44 69 72 57 72 69 74 61 62  te3OsIsDirWritab
1570: 6c 65 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  le      sqlite3W
1580: 69 6e 49 73 44 69 72 57 72 69 74 61 62 6c 65 0a  inIsDirWritable.
1590: 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 4f  #define sqlite3O
15a0: 73 53 79 6e 63 44 69 72 65 63 74 6f 72 79 20 20  sSyncDirectory  
15b0: 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 53 79      sqlite3WinSy
15c0: 6e 63 44 69 72 65 63 74 6f 72 79 0a 23 64 65 66  ncDirectory.#def
15d0: 69 6e 65 20 73 71 6c 69 74 65 33 4f 73 54 65 6d  ine sqlite3OsTem
15e0: 70 46 69 6c 65 4e 61 6d 65 20 20 20 20 20 20 20  pFileName       
15f0: 73 71 6c 69 74 65 33 57 69 6e 54 65 6d 70 46 69  sqlite3WinTempFi
1600: 6c 65 4e 61 6d 65 0a 23 64 65 66 69 6e 65 20 73  leName.#define s
1610: 71 6c 69 74 65 33 4f 73 52 61 6e 64 6f 6d 53 65  qlite3OsRandomSe
1620: 65 64 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ed         sqlit
1630: 65 33 57 69 6e 52 61 6e 64 6f 6d 53 65 65 64 0a  e3WinRandomSeed.
1640: 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 4f  #define sqlite3O
1650: 73 53 6c 65 65 70 20 20 20 20 20 20 20 20 20 20  sSleep          
1660: 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 53 6c      sqlite3WinSl
1670: 65 65 70 0a 23 64 65 66 69 6e 65 20 73 71 6c 69  eep.#define sqli
1680: 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65  te3OsCurrentTime
1690: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
16a0: 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 0a 23 64  inCurrentTime.#d
16b0: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 4f 73 45  efine sqlite3OsE
16c0: 6e 74 65 72 4d 75 74 65 78 20 20 20 20 20 20 20  nterMutex       
16d0: 20 20 73 71 6c 69 74 65 33 57 69 6e 45 6e 74 65    sqlite3WinEnte
16e0: 72 4d 75 74 65 78 0a 23 64 65 66 69 6e 65 20 73  rMutex.#define s
16f0: 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74  qlite3OsLeaveMut
1700: 65 78 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ex         sqlit
1710: 65 33 57 69 6e 4c 65 61 76 65 4d 75 74 65 78 0a  e3WinLeaveMutex.
1720: 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 4f  #define sqlite3O
1730: 73 49 6e 4d 75 74 65 78 20 20 20 20 20 20 20 20  sInMutex        
1740: 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 49 6e      sqlite3WinIn
1750: 4d 75 74 65 78 0a 23 64 65 66 69 6e 65 20 73 71  Mutex.#define sq
1760: 6c 69 74 65 33 4f 73 54 68 72 65 61 64 53 70 65  lite3OsThreadSpe
1770: 63 69 66 69 63 44 61 74 61 20 73 71 6c 69 74 65  cificData sqlite
1780: 33 57 69 6e 54 68 72 65 61 64 53 70 65 63 69 66  3WinThreadSpecif
1790: 69 63 44 61 74 61 0a 23 64 65 66 69 6e 65 20 73  icData.#define s
17a0: 71 6c 69 74 65 33 4f 73 4d 61 6c 6c 6f 63 20 20  qlite3OsMalloc  
17b0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
17c0: 65 33 47 65 6e 65 72 69 63 4d 61 6c 6c 6f 63 0a  e3GenericMalloc.
17d0: 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 4f  #define sqlite3O
17e0: 73 52 65 61 6c 6c 6f 63 20 20 20 20 20 20 20 20  sRealloc        
17f0: 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72      sqlite3Gener
1800: 69 63 52 65 61 6c 6c 6f 63 0a 23 64 65 66 69 6e  icRealloc.#defin
1810: 65 20 73 71 6c 69 74 65 33 4f 73 46 72 65 65 20  e sqlite3OsFree 
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1830: 6c 69 74 65 33 47 65 6e 65 72 69 63 46 72 65 65  lite3GenericFree
1840: 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  .#define sqlite3
1850: 4f 73 41 6c 6c 6f 63 61 74 69 6f 6e 53 69 7a 65  OsAllocationSize
1860: 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65       sqlite3Gene
1870: 72 69 63 41 6c 6c 6f 63 61 74 69 6f 6e 53 69 7a  ricAllocationSiz
1880: 65 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  e.#define sqlite
1890: 33 4f 73 44 6c 6f 70 65 6e 20 20 20 20 20 20 20  3OsDlopen       
18a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e        sqlite3Win
18b0: 44 6c 6f 70 65 6e 0a 23 64 65 66 69 6e 65 20 73  Dlopen.#define s
18c0: 71 6c 69 74 65 33 4f 73 44 6c 73 79 6d 20 20 20  qlite3OsDlsym   
18d0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
18e0: 65 33 57 69 6e 44 6c 73 79 6d 0a 23 64 65 66 69  e3WinDlsym.#defi
18f0: 6e 65 20 73 71 6c 69 74 65 33 4f 73 44 6c 63 6c  ne sqlite3OsDlcl
1900: 6f 73 65 20 20 20 20 20 20 20 20 20 20 20 20 73  ose            s
1910: 71 6c 69 74 65 33 57 69 6e 44 6c 63 6c 6f 73 65  qlite3WinDlclose
1920: 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 4f  .#endif.#if OS_O
1930: 53 32 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  S2.#define sqlit
1940: 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74  e3OsOpenReadWrit
1950: 65 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  e      sqlite3Os
1960: 32 4f 70 65 6e 52 65 61 64 57 72 69 74 65 0a 23  2OpenReadWrite.#
1970: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 4f 73  define sqlite3Os
1980: 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 20 20 20  OpenExclusive   
1990: 20 20 20 73 71 6c 69 74 65 33 4f 73 32 4f 70 65     sqlite3Os2Ope
19a0: 6e 45 78 63 6c 75 73 69 76 65 0a 23 64 65 66 69  nExclusive.#defi
19b0: 6e 65 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  ne sqlite3OsOpen
19c0: 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20 20 73  ReadOnly       s
19d0: 71 6c 69 74 65 33 4f 73 32 4f 70 65 6e 52 65 61  qlite3Os2OpenRea
19e0: 64 4f 6e 6c 79 0a 23 64 65 66 69 6e 65 20 73 71  dOnly.#define sq
19f0: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 20 20 20  lite3OsDelete   
1a00: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1a10: 33 4f 73 32 44 65 6c 65 74 65 0a 23 64 65 66 69  3Os2Delete.#defi
1a20: 6e 65 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  ne sqlite3OsFile
1a30: 45 78 69 73 74 73 20 20 20 20 20 20 20 20 20 73  Exists         s
1a40: 71 6c 69 74 65 33 4f 73 32 46 69 6c 65 45 78 69  qlite3Os2FileExi
1a50: 73 74 73 0a 23 64 65 66 69 6e 65 20 73 71 6c 69  sts.#define sqli
1a60: 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
1a70: 65 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  e       sqlite3O
1a80: 73 32 46 75 6c 6c 50 61 74 68 6e 61 6d 65 0a 23  s2FullPathname.#
1a90: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 4f 73  define sqlite3Os
1aa0: 49 73 44 69 72 57 72 69 74 61 62 6c 65 20 20 20  IsDirWritable   
1ab0: 20 20 20 73 71 6c 69 74 65 33 4f 73 32 49 73 44     sqlite3Os2IsD
1ac0: 69 72 57 72 69 74 61 62 6c 65 0a 23 64 65 66 69  irWritable.#defi
1ad0: 6e 65 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63  ne sqlite3OsSync
1ae0: 44 69 72 65 63 74 6f 72 79 20 20 20 20 20 20 73  Directory      s
1af0: 71 6c 69 74 65 33 4f 73 32 53 79 6e 63 44 69 72  qlite3Os2SyncDir
1b00: 65 63 74 6f 72 79 0a 23 64 65 66 69 6e 65 20 73  ectory.#define s
1b10: 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65  qlite3OsTempFile
1b20: 4e 61 6d 65 20 20 20 20 20 20 20 73 71 6c 69 74  Name       sqlit
1b30: 65 33 4f 73 32 54 65 6d 70 46 69 6c 65 4e 61 6d  e3Os2TempFileNam
1b40: 65 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  e.#define sqlite
1b50: 33 4f 73 52 61 6e 64 6f 6d 53 65 65 64 20 20 20  3OsRandomSeed   
1b60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 32        sqlite3Os2
1b70: 52 61 6e 64 6f 6d 53 65 65 64 0a 23 64 65 66 69  RandomSeed.#defi
1b80: 6e 65 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  ne sqlite3OsSlee
1b90: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  p              s
1ba0: 71 6c 69 74 65 33 4f 73 32 53 6c 65 65 70 0a 23  qlite3Os2Sleep.#
1bb0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 4f 73  define sqlite3Os
1bc0: 43 75 72 72 65 6e 74 54 69 6d 65 20 20 20 20 20  CurrentTime     
1bd0: 20 20 20 73 71 6c 69 74 65 33 4f 73 32 43 75 72     sqlite3Os2Cur
1be0: 72 65 6e 74 54 69 6d 65 0a 23 64 65 66 69 6e 65  rentTime.#define
1bf0: 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d   sqlite3OsEnterM
1c00: 75 74 65 78 20 20 20 20 20 20 20 20 20 73 71 6c  utex         sql
1c10: 69 74 65 33 4f 73 32 45 6e 74 65 72 4d 75 74 65  ite3Os2EnterMute
1c20: 78 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  x.#define sqlite
1c30: 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 20 20 20  3OsLeaveMutex   
1c40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 32        sqlite3Os2
1c50: 4c 65 61 76 65 4d 75 74 65 78 0a 23 64 65 66 69  LeaveMutex.#defi
1c60: 6e 65 20 73 71 6c 69 74 65 33 4f 73 49 6e 4d 75  ne sqlite3OsInMu
1c70: 74 65 78 20 20 20 20 20 20 20 20 20 20 20 20 73  tex            s
1c80: 71 6c 69 74 65 33 4f 73 32 49 6e 4d 75 74 65 78  qlite3Os2InMutex
1c90: 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  .#define sqlite3
1ca0: 4f 73 54 68 72 65 61 64 53 70 65 63 69 66 69 63  OsThreadSpecific
1cb0: 44 61 74 61 20 73 71 6c 69 74 65 33 4f 73 32 54  Data sqlite3Os2T
1cc0: 68 72 65 61 64 53 70 65 63 69 66 69 63 44 61 74  hreadSpecificDat
1cd0: 61 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  a.#define sqlite
1ce0: 33 4f 73 4d 61 6c 6c 6f 63 20 20 20 20 20 20 20  3OsMalloc       
1cf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e        sqlite3Gen
1d00: 65 72 69 63 4d 61 6c 6c 6f 63 0a 23 64 65 66 69  ericMalloc.#defi
1d10: 6e 65 20 73 71 6c 69 74 65 33 4f 73 52 65 61 6c  ne sqlite3OsReal
1d20: 6c 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 73  loc            s
1d30: 71 6c 69 74 65 33 47 65 6e 65 72 69 63 52 65 61  qlite3GenericRea
1d40: 6c 6c 6f 63 0a 23 64 65 66 69 6e 65 20 73 71 6c  lloc.#define sql
1d50: 69 74 65 33 4f 73 46 72 65 65 20 20 20 20 20 20  ite3OsFree      
1d60: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1d70: 47 65 6e 65 72 69 63 46 72 65 65 0a 23 64 65 66  GenericFree.#def
1d80: 69 6e 65 20 73 71 6c 69 74 65 33 4f 73 41 6c 6c  ine sqlite3OsAll
1d90: 6f 63 61 74 69 6f 6e 53 69 7a 65 20 20 20 20 20  ocationSize     
1da0: 73 71 6c 69 74 65 33 47 65 6e 65 72 69 63 41 6c  sqlite3GenericAl
1db0: 6c 6f 63 61 74 69 6f 6e 53 69 7a 65 0a 23 64 65  locationSize.#de
1dc0: 66 69 6e 65 20 73 71 6c 69 74 65 33 4f 73 44 6c  fine sqlite3OsDl
1dd0: 6f 70 65 6e 20 20 20 20 20 20 20 20 20 20 20 20  open            
1de0: 20 73 71 6c 69 74 65 33 4f 73 32 44 6c 6f 70 65   sqlite3Os2Dlope
1df0: 6e 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  n.#define sqlite
1e00: 33 4f 73 44 6c 73 79 6d 20 20 20 20 20 20 20 20  3OsDlsym        
1e10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 32        sqlite3Os2
1e20: 44 6c 73 79 6d 0a 23 64 65 66 69 6e 65 20 73 71  Dlsym.#define sq
1e30: 6c 69 74 65 33 4f 73 44 6c 63 6c 6f 73 65 20 20  lite3OsDlclose  
1e40: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e50: 33 4f 73 32 44 6c 63 6c 6f 73 65 0a 23 65 6e 64  3Os2Dlclose.#end
1e60: 69 66 0a 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a  if..#endif..../*
1e70: 0a 2a 2a 20 49 66 20 75 73 69 6e 67 20 61 6e 20  .** If using an 
1e80: 61 6c 74 65 72 6e 61 74 69 76 65 20 4f 53 20 69  alternative OS i
1e90: 6e 74 65 72 66 61 63 65 2c 20 74 68 65 6e 20 77  nterface, then w
1ea0: 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 22  e must have an "
1eb0: 6f 73 5f 6f 74 68 65 72 2e 68 22 0a 2a 2a 20 68  os_other.h".** h
1ec0: 65 61 64 65 72 20 66 69 6c 65 20 61 76 61 69 6c  eader file avail
1ed0: 61 62 6c 65 20 66 6f 72 20 74 68 61 74 20 69 6e  able for that in
1ee0: 74 65 72 66 61 63 65 2e 20 20 50 72 65 73 75 6d  terface.  Presum
1ef0: 61 62 6c 79 20 74 68 65 20 22 6f 73 5f 6f 74 68  ably the "os_oth
1f00: 65 72 2e 68 22 0a 2a 2a 20 68 65 61 64 65 72 20  er.h".** header 
1f10: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 23 64  file contains #d
1f20: 65 66 69 6e 65 73 20 73 69 6d 69 6c 61 72 20 74  efines similar t
1f30: 6f 20 74 68 6f 73 65 20 61 62 6f 76 65 2e 0a 2a  o those above..*
1f40: 2f 0a 23 69 66 20 4f 53 5f 4f 54 48 45 52 0a 23  /.#if OS_OTHER.#
1f50: 20 69 6e 63 6c 75 64 65 20 22 6f 73 5f 6f 74 68   include "os_oth
1f60: 65 72 2e 68 22 0a 23 65 6e 64 69 66 0a 0a 0a 0a  er.h".#endif....
1f70: 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65  /*.** Forward de
1f80: 63 6c 61 72 61 74 69 6f 6e 73 0a 2a 2f 0a 74 79  clarations.*/.ty
1f90: 70 65 64 65 66 20 73 74 72 75 63 74 20 4f 73 46  pedef struct OsF
1fa0: 69 6c 65 20 4f 73 46 69 6c 65 3b 0a 74 79 70 65  ile OsFile;.type
1fb0: 64 65 66 20 73 74 72 75 63 74 20 49 6f 4d 65 74  def struct IoMet
1fc0: 68 6f 64 20 49 6f 4d 65 74 68 6f 64 3b 0a 0a 2f  hod IoMethod;../
1fd0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
1fe0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1ff0: 67 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  g structure cont
2000: 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f  ains pointers to
2010: 20 61 6c 6c 0a 2a 2a 20 6d 65 74 68 6f 64 73 20   all.** methods 
2020: 6f 6e 20 61 6e 20 4f 73 46 69 6c 65 20 6f 62 6a  on an OsFile obj
2030: 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 49  ect..*/.struct I
2040: 6f 4d 65 74 68 6f 64 20 7b 0a 20 20 69 6e 74 20  oMethod {.  int 
2050: 28 2a 78 43 6c 6f 73 65 29 28 4f 73 46 69 6c 65  (*xClose)(OsFile
2060: 2a 2a 29 3b 0a 20 20 69 6e 74 20 28 2a 78 4f 70  **);.  int (*xOp
2070: 65 6e 44 69 72 65 63 74 6f 72 79 29 28 4f 73 46  enDirectory)(OsF
2080: 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  ile*, const char
2090: 2a 29 3b 0a 20 20 69 6e 74 20 28 2a 78 52 65 61  *);.  int (*xRea
20a0: 64 29 28 4f 73 46 69 6c 65 2a 2c 20 76 6f 69 64  d)(OsFile*, void
20b0: 2a 2c 20 69 6e 74 20 61 6d 74 29 3b 0a 20 20 69  *, int amt);.  i
20c0: 6e 74 20 28 2a 78 57 72 69 74 65 29 28 4f 73 46  nt (*xWrite)(OsF
20d0: 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 76 6f 69 64  ile*, const void
20e0: 2a 2c 20 69 6e 74 20 61 6d 74 29 3b 0a 20 20 69  *, int amt);.  i
20f0: 6e 74 20 28 2a 78 53 65 65 6b 29 28 4f 73 46 69  nt (*xSeek)(OsFi
2100: 6c 65 2a 2c 20 69 36 34 20 6f 66 66 73 65 74 29  le*, i64 offset)
2110: 3b 0a 20 20 69 6e 74 20 28 2a 78 54 72 75 6e 63  ;.  int (*xTrunc
2120: 61 74 65 29 28 4f 73 46 69 6c 65 2a 2c 20 69 36  ate)(OsFile*, i6
2130: 34 20 73 69 7a 65 29 3b 0a 20 20 69 6e 74 20 28  4 size);.  int (
2140: 2a 78 53 79 6e 63 29 28 4f 73 46 69 6c 65 2a 2c  *xSync)(OsFile*,
2150: 20 69 6e 74 29 3b 0a 20 20 76 6f 69 64 20 28 2a   int);.  void (*
2160: 78 53 65 74 46 75 6c 6c 53 79 6e 63 29 28 4f 73  xSetFullSync)(Os
2170: 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 73 65  File *id, int se
2180: 74 74 69 6e 67 29 3b 0a 20 20 69 6e 74 20 28 2a  tting);.  int (*
2190: 78 46 69 6c 65 48 61 6e 64 6c 65 29 28 4f 73 46  xFileHandle)(OsF
21a0: 69 6c 65 20 2a 69 64 29 3b 0a 20 20 69 6e 74 20  ile *id);.  int 
21b0: 28 2a 78 46 69 6c 65 53 69 7a 65 29 28 4f 73 46  (*xFileSize)(OsF
21c0: 69 6c 65 2a 2c 20 69 36 34 20 2a 70 53 69 7a 65  ile*, i64 *pSize
21d0: 29 3b 0a 20 20 69 6e 74 20 28 2a 78 4c 6f 63 6b  );.  int (*xLock
21e0: 29 28 4f 73 46 69 6c 65 2a 2c 20 69 6e 74 29 3b  )(OsFile*, int);
21f0: 0a 20 20 69 6e 74 20 28 2a 78 55 6e 6c 6f 63 6b  .  int (*xUnlock
2200: 29 28 4f 73 46 69 6c 65 2a 2c 20 69 6e 74 29 3b  )(OsFile*, int);
2210: 0a 20 20 69 6e 74 20 28 2a 78 4c 6f 63 6b 53 74  .  int (*xLockSt
2220: 61 74 65 29 28 4f 73 46 69 6c 65 20 2a 69 64 29  ate)(OsFile *id)
2230: 3b 0a 20 20 69 6e 74 20 28 2a 78 43 68 65 63 6b  ;.  int (*xCheck
2240: 52 65 73 65 72 76 65 64 4c 6f 63 6b 29 28 4f 73  ReservedLock)(Os
2250: 46 69 6c 65 20 2a 69 64 29 3b 0a 20 20 69 6e 74  File *id);.  int
2260: 20 28 2a 78 53 65 63 74 6f 72 53 69 7a 65 29 28   (*xSectorSize)(
2270: 4f 73 46 69 6c 65 20 2a 69 64 29 3b 0a 7d 3b 0a  OsFile *id);.};.
2280: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 4f 73 46 69 6c  ./*.** The OsFil
2290: 65 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62  e object describ
22a0: 65 73 20 61 6e 20 6f 70 65 6e 20 64 69 73 6b 20  es an open disk 
22b0: 66 69 6c 65 20 69 6e 20 61 6e 20 4f 53 2d 64 65  file in an OS-de
22c0: 70 65 6e 64 65 6e 74 20 77 61 79 2e 0a 2a 2a 20  pendent way..** 
22d0: 54 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 4f  The version of O
22e0: 73 46 69 6c 65 20 64 65 66 69 6e 65 64 20 68 65  sFile defined he
22f0: 72 65 20 69 73 20 61 20 67 65 6e 65 72 69 63 20  re is a generic 
2300: 76 65 72 73 69 6f 6e 2e 20 20 45 61 63 68 20 4f  version.  Each O
2310: 53 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  S.** implementat
2320: 69 6f 6e 20 64 65 66 69 6e 65 73 20 69 74 73 20  ion defines its 
2330: 6f 77 6e 20 73 75 62 63 6c 61 73 73 20 6f 66 20  own subclass of 
2340: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 74  this structure t
2350: 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  hat contains.** 
2360: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
2370: 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f  mation needed to
2380: 20 68 61 6e 64 6c 65 20 66 69 6c 65 20 49 2f 4f   handle file I/O
2390: 2e 20 20 42 75 74 20 74 68 65 20 70 4d 65 74 68  .  But the pMeth
23a0: 6f 64 0a 2a 2a 20 65 6e 74 72 79 20 28 70 6f 69  od.** entry (poi
23b0: 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 76 69 72  nting to the vir
23c0: 74 75 61 6c 20 66 75 6e 63 74 69 6f 6e 20 74 61  tual function ta
23d0: 62 6c 65 29 20 61 6c 77 61 79 73 20 6f 63 63 75  ble) always occu
23e0: 72 73 20 66 69 72 73 74 0a 2a 2a 20 73 6f 20 74  rs first.** so t
23f0: 68 61 74 20 77 65 20 63 61 6e 20 61 6c 77 61 79  hat we can alway
2400: 73 20 66 69 6e 64 20 74 68 65 20 61 70 70 72 6f  s find the appro
2410: 70 72 69 61 74 65 20 6d 65 74 68 6f 64 73 2e 0a  priate methods..
2420: 2a 2f 0a 73 74 72 75 63 74 20 4f 73 46 69 6c 65  */.struct OsFile
2430: 20 7b 0a 20 20 49 6f 4d 65 74 68 6f 64 20 63 6f   {.  IoMethod co
2440: 6e 73 74 20 2a 70 4d 65 74 68 6f 64 3b 0a 7d 3b  nst *pMethod;.};
2450: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
2460: 6f 77 69 6e 67 20 76 61 6c 75 65 73 20 6d 61 79  owing values may
2470: 20 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68   be passed as th
2480: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2490: 74 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 4f  t to.** sqlite3O
24a0: 73 4c 6f 63 6b 28 29 2e 20 54 68 65 20 76 61 72  sLock(). The var
24b0: 69 6f 75 73 20 6c 6f 63 6b 73 20 65 78 68 69 62  ious locks exhib
24c0: 69 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  it the following
24d0: 20 73 65 6d 61 6e 74 69 63 73 3a 0a 2a 2a 0a 2a   semantics:.**.*
24e0: 2a 20 53 48 41 52 45 44 3a 20 20 20 20 41 6e 79  * SHARED:    Any
24f0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 72 6f 63 65   number of proce
2500: 73 73 65 73 20 6d 61 79 20 68 6f 6c 64 20 61 20  sses may hold a 
2510: 53 48 41 52 45 44 20 6c 6f 63 6b 20 73 69 6d 75  SHARED lock simu
2520: 6c 74 61 6e 65 6f 75 73 6c 79 2e 0a 2a 2a 20 52  ltaneously..** R
2530: 45 53 45 52 56 45 44 3a 20 20 41 20 73 69 6e 67  ESERVED:  A sing
2540: 6c 65 20 70 72 6f 63 65 73 73 20 6d 61 79 20 68  le process may h
2550: 6f 6c 64 20 61 20 52 45 53 45 52 56 45 44 20 6c  old a RESERVED l
2560: 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65 20 61 74  ock on a file at
2570: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 61  .**            a
2580: 6e 79 20 74 69 6d 65 2e 20 4f 74 68 65 72 20 70  ny time. Other p
2590: 72 6f 63 65 73 73 65 73 20 6d 61 79 20 68 6f 6c  rocesses may hol
25a0: 64 20 61 6e 64 20 6f 62 74 61 69 6e 20 6e 65 77  d and obtain new
25b0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 2e 0a 2a   SHARED locks..*
25c0: 2a 20 50 45 4e 44 49 4e 47 3a 20 20 20 41 20 73  * PENDING:   A s
25d0: 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 6d 61  ingle process ma
25e0: 79 20 68 6f 6c 64 20 61 20 50 45 4e 44 49 4e 47  y hold a PENDING
25f0: 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65 20   lock on a file 
2600: 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
2610: 20 61 6e 79 20 6f 6e 65 20 74 69 6d 65 2e 20 45   any one time. E
2620: 78 69 73 74 69 6e 67 20 53 48 41 52 45 44 20 6c  xisting SHARED l
2630: 6f 63 6b 73 20 6d 61 79 20 70 65 72 73 69 73 74  ocks may persist
2640: 2c 20 62 75 74 20 6e 6f 20 6e 65 77 0a 2a 2a 20  , but no new.** 
2650: 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
2660: 44 20 6c 6f 63 6b 73 20 6d 61 79 20 62 65 20 6f  D locks may be o
2670: 62 74 61 69 6e 65 64 20 62 79 20 6f 74 68 65 72  btained by other
2680: 20 70 72 6f 63 65 73 73 65 73 2e 0a 2a 2a 20 45   processes..** E
2690: 58 43 4c 55 53 49 56 45 3a 20 41 6e 20 45 58 43  XCLUSIVE: An EXC
26a0: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 70 72 65 63  LUSIVE lock prec
26b0: 6c 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20  ludes all other 
26c0: 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 50 45 4e  locks..**.** PEN
26d0: 44 49 4e 47 5f 4c 4f 43 4b 20 6d 61 79 20 6e 6f  DING_LOCK may no
26e0: 74 20 62 65 20 70 61 73 73 65 64 20 64 69 72 65  t be passed dire
26f0: 63 74 6c 79 20 74 6f 20 73 71 6c 69 74 65 33 4f  ctly to sqlite3O
2700: 73 4c 6f 63 6b 28 29 2e 20 49 6e 73 74 65 61 64  sLock(). Instead
2710: 2c 20 61 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74  , a.** process t
2720: 68 61 74 20 72 65 71 75 65 73 74 73 20 61 6e 20  hat requests an 
2730: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6d  EXCLUSIVE lock m
2740: 61 79 20 61 63 74 75 61 6c 6c 79 20 6f 62 74 61  ay actually obta
2750: 69 6e 20 61 20 50 45 4e 44 49 4e 47 0a 2a 2a 20  in a PENDING.** 
2760: 6c 6f 63 6b 2e 20 54 68 69 73 20 63 61 6e 20 62  lock. This can b
2770: 65 20 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e  e upgraded to an
2780: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2790: 62 79 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  by a subsequent 
27a0: 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  call to.** sqlit
27b0: 65 33 4f 73 4c 6f 63 6b 28 29 2e 0a 2a 2f 0a 23  e3OsLock()..*/.#
27c0: 64 65 66 69 6e 65 20 4e 4f 5f 4c 4f 43 4b 20 20  define NO_LOCK  
27d0: 20 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65         0.#define
27e0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20   SHARED_LOCK    
27f0: 20 31 0a 23 64 65 66 69 6e 65 20 52 45 53 45 52   1.#define RESER
2800: 56 45 44 5f 4c 4f 43 4b 20 20 20 32 0a 23 64 65  VED_LOCK   2.#de
2810: 66 69 6e 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  fine PENDING_LOC
2820: 4b 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 45  K    3.#define E
2830: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 34  XCLUSIVE_LOCK  4
2840: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 65 20 4c 6f 63  ../*.** File Loc
2850: 6b 69 6e 67 20 4e 6f 74 65 73 3a 20 20 28 4d 6f  king Notes:  (Mo
2860: 73 74 6c 79 20 61 62 6f 75 74 20 77 69 6e 64 6f  stly about windo
2870: 77 73 20 62 75 74 20 61 6c 73 6f 20 73 6f 6d 65  ws but also some
2880: 20 69 6e 66 6f 20 66 6f 72 20 55 6e 69 78 29 0a   info for Unix).
2890: 2a 2a 0a 2a 2a 20 57 65 20 63 61 6e 6e 6f 74 20  **.** We cannot 
28a0: 75 73 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29  use LockFileEx()
28b0: 20 6f 72 20 55 6e 6c 6f 63 6b 46 69 6c 65 45 78   or UnlockFileEx
28c0: 28 29 20 6f 6e 20 57 69 6e 39 35 2f 39 38 2f 4d  () on Win95/98/M
28d0: 45 20 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 6f  E because.** tho
28e0: 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  se functions are
28f0: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
2900: 20 53 6f 20 77 65 20 75 73 65 20 6f 6e 6c 79 20   So we use only 
2910: 4c 6f 63 6b 46 69 6c 65 28 29 20 61 6e 64 0a 2a  LockFile() and.*
2920: 2a 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 29 2e 0a  * UnlockFile()..
2930: 2a 2a 0a 2a 2a 20 4c 6f 63 6b 46 69 6c 65 28 29  **.** LockFile()
2940: 20 70 72 65 76 65 6e 74 73 20 6e 6f 74 20 6a 75   prevents not ju
2950: 73 74 20 77 72 69 74 69 6e 67 20 62 75 74 20 61  st writing but a
2960: 6c 73 6f 20 72 65 61 64 69 6e 67 20 62 79 20 6f  lso reading by o
2970: 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2e 0a  ther processes..
2980: 2a 2a 20 41 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ** A SHARED_LOCK
2990: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20   is obtained by 
29a0: 6c 6f 63 6b 69 6e 67 20 61 20 73 69 6e 67 6c 65  locking a single
29b0: 20 72 61 6e 64 6f 6d 6c 79 2d 63 68 6f 73 65 6e   randomly-chosen
29c0: 20 0a 2a 2a 20 62 79 74 65 20 6f 75 74 20 6f 66   .** byte out of
29d0: 20 61 20 73 70 65 63 69 66 69 63 20 72 61 6e 67   a specific rang
29e0: 65 20 6f 66 20 62 79 74 65 73 2e 20 54 68 65 20  e of bytes. The 
29f0: 6c 6f 63 6b 20 62 79 74 65 20 69 73 20 6f 62 74  lock byte is obt
2a00: 61 69 6e 65 64 20 61 74 20 0a 2a 2a 20 72 61 6e  ained at .** ran
2a10: 64 6f 6d 20 73 6f 20 74 77 6f 20 73 65 70 61 72  dom so two separ
2a20: 61 74 65 20 72 65 61 64 65 72 73 20 63 61 6e 20  ate readers can 
2a30: 70 72 6f 62 61 62 6c 79 20 61 63 63 65 73 73 20  probably access 
2a40: 74 68 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  the file at the 
2a50: 0a 2a 2a 20 73 61 6d 65 20 74 69 6d 65 2c 20 75  .** same time, u
2a60: 6e 6c 65 73 73 20 74 68 65 79 20 61 72 65 20 75  nless they are u
2a70: 6e 6c 75 63 6b 79 20 61 6e 64 20 63 68 6f 6f 73  nlucky and choos
2a80: 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 20  e the same lock 
2a90: 62 79 74 65 2e 0a 2a 2a 20 41 6e 20 45 58 43 4c  byte..** An EXCL
2aa0: 55 53 49 56 45 5f 4c 4f 43 4b 20 69 73 20 6f 62  USIVE_LOCK is ob
2ab0: 74 61 69 6e 65 64 20 62 79 20 6c 6f 63 6b 69 6e  tained by lockin
2ac0: 67 20 61 6c 6c 20 62 79 74 65 73 20 69 6e 20 74  g all bytes in t
2ad0: 68 65 20 72 61 6e 67 65 2e 0a 2a 2a 20 54 68 65  he range..** The
2ae0: 72 65 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 6f  re can only be o
2af0: 6e 65 20 77 72 69 74 65 72 2e 20 20 41 20 52 45  ne writer.  A RE
2b00: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 69 73 20 6f  SERVED_LOCK is o
2b10: 62 74 61 69 6e 65 64 20 62 79 20 6c 6f 63 6b 69  btained by locki
2b20: 6e 67 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 62  ng.** a single b
2b30: 79 74 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  yte of the file 
2b40: 74 68 61 74 20 69 73 20 64 65 73 69 67 6e 61 74  that is designat
2b50: 65 64 20 61 73 20 74 68 65 20 72 65 73 65 72 76  ed as the reserv
2b60: 65 64 20 6c 6f 63 6b 20 62 79 74 65 2e 0a 2a 2a  ed lock byte..**
2b70: 20 41 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20   A PENDING_LOCK 
2b80: 69 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20 6c  is obtained by l
2b90: 6f 63 6b 69 6e 67 20 61 20 64 65 73 69 67 6e 61  ocking a designa
2ba0: 74 65 64 20 62 79 74 65 20 64 69 66 66 65 72 65  ted byte differe
2bb0: 6e 74 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 52  nt from.** the R
2bc0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 62 79 74  ESERVED_LOCK byt
2bd0: 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 57 69 6e 4e  e..**.** On WinN
2be0: 54 2f 32 4b 2f 58 50 20 73 79 73 74 65 6d 73 2c  T/2K/XP systems,
2bf0: 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 61 6e   LockFileEx() an
2c00: 64 20 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 29  d UnlockFileEx()
2c10: 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 0a   are available,.
2c20: 2a 2a 20 77 68 69 63 68 20 6d 65 61 6e 73 20 77  ** which means w
2c30: 65 20 63 61 6e 20 75 73 65 20 72 65 61 64 65 72  e can use reader
2c40: 2f 77 72 69 74 65 72 20 6c 6f 63 6b 73 2e 20 20  /writer locks.  
2c50: 57 68 65 6e 20 72 65 61 64 65 72 2f 77 72 69 74  When reader/writ
2c60: 65 72 20 6c 6f 63 6b 73 0a 2a 2a 20 61 72 65 20  er locks.** are 
2c70: 75 73 65 64 2c 20 74 68 65 20 6c 6f 63 6b 20 69  used, the lock i
2c80: 73 20 70 6c 61 63 65 64 20 6f 6e 20 74 68 65 20  s placed on the 
2c90: 73 61 6d 65 20 72 61 6e 67 65 20 6f 66 20 62 79  same range of by
2ca0: 74 65 73 20 74 68 61 74 20 69 73 20 75 73 65 64  tes that is used
2cb0: 0a 2a 2a 20 66 6f 72 20 70 72 6f 62 61 62 69 6c  .** for probabil
2cc0: 69 73 74 69 63 20 6c 6f 63 6b 69 6e 67 20 69 6e  istic locking in
2cd0: 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 48   Win95/98/ME.  H
2ce0: 65 6e 63 65 2c 20 74 68 65 20 6c 6f 63 6b 69 6e  ence, the lockin
2cf0: 67 20 73 63 68 65 6d 65 0a 2a 2a 20 77 69 6c 6c  g scheme.** will
2d00: 20 73 75 70 70 6f 72 74 20 74 77 6f 20 6f 72 20   support two or 
2d10: 6d 6f 72 65 20 57 69 6e 39 35 20 72 65 61 64 65  more Win95 reade
2d20: 72 73 20 6f 72 20 74 77 6f 20 6f 72 20 6d 6f 72  rs or two or mor
2d30: 65 20 57 69 6e 4e 54 20 72 65 61 64 65 72 73 2e  e WinNT readers.
2d40: 0a 2a 2a 20 42 75 74 20 61 20 73 69 6e 67 6c 65  .** But a single
2d50: 20 57 69 6e 39 35 20 72 65 61 64 65 72 20 77 69   Win95 reader wi
2d60: 6c 6c 20 6c 6f 63 6b 20 6f 75 74 20 61 6c 6c 20  ll lock out all 
2d70: 57 69 6e 4e 54 20 72 65 61 64 65 72 73 20 61 6e  WinNT readers an
2d80: 64 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 57 69  d a single.** Wi
2d90: 6e 4e 54 20 72 65 61 64 65 72 20 77 69 6c 6c 20  nNT reader will 
2da0: 6c 6f 63 6b 20 6f 75 74 20 61 6c 6c 20 6f 74 68  lock out all oth
2db0: 65 72 20 57 69 6e 39 35 20 72 65 61 64 65 72 73  er Win95 readers
2dc0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
2dd0: 6f 77 69 6e 67 20 23 64 65 66 69 6e 65 73 20 73  owing #defines s
2de0: 70 65 63 69 66 79 20 74 68 65 20 72 61 6e 67 65  pecify the range
2df0: 20 6f 66 20 62 79 74 65 73 20 75 73 65 64 20 66   of bytes used f
2e00: 6f 72 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 20 53  or locking..** S
2e10: 48 41 52 45 44 5f 53 49 5a 45 20 69 73 20 74 68  HARED_SIZE is th
2e20: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
2e30: 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  s available in t
2e40: 68 65 20 70 6f 6f 6c 20 66 72 6f 6d 20 77 68 69  he pool from whi
2e50: 63 68 0a 2a 2a 20 61 20 72 61 6e 64 6f 6d 20 62  ch.** a random b
2e60: 79 74 65 20 69 73 20 73 65 6c 65 63 74 65 64 20  yte is selected 
2e70: 66 6f 72 20 61 20 73 68 61 72 65 64 20 6c 6f 63  for a shared loc
2e80: 6b 2e 20 20 54 68 65 20 70 6f 6f 6c 20 6f 66 20  k.  The pool of 
2e90: 62 79 74 65 73 20 66 6f 72 0a 2a 2a 20 73 68 61  bytes for.** sha
2ea0: 72 65 64 20 6c 6f 63 6b 73 20 62 65 67 69 6e 73  red locks begins
2eb0: 20 61 74 20 53 48 41 52 45 44 5f 46 49 52 53 54   at SHARED_FIRST
2ec0: 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 23  . .**.** These #
2ed0: 64 65 66 69 6e 65 73 20 61 72 65 20 61 76 61 69  defines are avai
2ee0: 6c 61 62 6c 65 20 69 6e 20 73 71 6c 69 74 65 5f  lable in sqlite_
2ef0: 61 75 78 2e 68 20 73 6f 20 74 68 61 74 20 61 64  aux.h so that ad
2f00: 61 70 74 6f 72 73 20 66 6f 72 0a 2a 2a 20 63 6f  aptors for.** co
2f10: 6e 6e 65 63 74 69 6e 67 20 53 51 4c 69 74 65 20  nnecting SQLite 
2f20: 74 6f 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69  to other operati
2f30: 6e 67 20 73 79 73 74 65 6d 73 20 63 61 6e 20 75  ng systems can u
2f40: 73 65 20 74 68 65 20 73 61 6d 65 20 62 79 74 65  se the same byte
2f50: 0a 2a 2a 20 72 61 6e 67 65 73 20 66 6f 72 20 6c  .** ranges for l
2f60: 6f 63 6b 69 6e 67 2e 20 20 49 6e 20 70 61 72 74  ocking.  In part
2f70: 69 63 75 6c 61 72 2c 20 74 68 65 20 73 61 6d 65  icular, the same
2f80: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
2f90: 79 20 61 6e 64 0a 2a 2a 20 62 79 74 65 20 72 61  y and.** byte ra
2fa0: 6e 67 65 73 20 61 72 65 20 75 73 65 64 20 66 6f  nges are used fo
2fb0: 72 20 55 6e 69 78 2e 20 20 54 68 69 73 20 6c 65  r Unix.  This le
2fc0: 61 76 65 73 20 6f 70 65 6e 20 74 68 65 20 70 6f  aves open the po
2fd0: 73 73 69 62 6c 69 74 79 20 6f 66 20 68 61 76 69  ssiblity of havi
2fe0: 6e 67 0a 2a 2a 20 63 6c 69 65 6e 74 73 20 6f 6e  ng.** clients on
2ff0: 20 77 69 6e 39 35 2c 20 77 69 6e 4e 54 2c 20 61   win95, winNT, a
3000: 6e 64 20 75 6e 69 78 20 61 6c 6c 20 74 61 6c 6b  nd unix all talk
3010: 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ing to the same 
3020: 73 68 61 72 65 64 20 66 69 6c 65 0a 2a 2a 20 61  shared file.** a
3030: 6e 64 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 63  nd all locking c
3040: 6f 72 72 65 63 74 6c 79 2e 20 20 54 6f 20 64 6f  orrectly.  To do
3050: 20 73 6f 20 77 6f 75 6c 64 20 72 65 71 75 69 72   so would requir
3060: 65 20 74 68 61 74 20 73 61 6d 62 61 20 28 6f 72  e that samba (or
3070: 20 77 68 61 74 65 76 65 72 0a 2a 2a 20 74 6f 6f   whatever.** too
3080: 6c 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20  l is being used 
3090: 66 6f 72 20 66 69 6c 65 20 73 68 61 72 69 6e 67  for file sharing
30a0: 29 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6c 6f 63  ) implements loc
30b0: 6b 73 20 63 6f 72 72 65 63 74 6c 79 20 62 65 74  ks correctly bet
30c0: 77 65 65 6e 0a 2a 2a 20 77 69 6e 64 6f 77 73 20  ween.** windows 
30d0: 61 6e 64 20 75 6e 69 78 2e 20 20 49 27 6d 20 67  and unix.  I'm g
30e0: 75 65 73 73 69 6e 67 20 74 68 61 74 20 69 73 6e  uessing that isn
30f0: 27 74 20 6c 69 6b 65 6c 79 20 74 6f 20 68 61 70  't likely to hap
3100: 70 65 6e 2c 20 62 75 74 20 62 79 0a 2a 2a 20 75  pen, but by.** u
3110: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 6c 6f  sing the same lo
3120: 63 6b 69 6e 67 20 72 61 6e 67 65 20 77 65 20 61  cking range we a
3130: 72 65 20 61 74 20 6c 65 61 73 74 20 6f 70 65 6e  re at least open
3140: 20 74 6f 20 74 68 65 20 70 6f 73 73 69 62 69 6c   to the possibil
3150: 69 74 79 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 69  ity..**.** Locki
3160: 6e 67 20 69 6e 20 77 69 6e 64 6f 77 73 20 69 73  ng in windows is
3170: 20 6d 61 6e 64 69 74 6f 72 79 2e 20 20 46 6f 72   manditory.  For
3180: 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 77 65   this reason, we
3190: 20 63 61 6e 6e 6f 74 20 73 74 6f 72 65 0a 2a 2a   cannot store.**
31a0: 20 61 63 74 75 61 6c 20 64 61 74 61 20 69 6e 20   actual data in 
31b0: 74 68 65 20 62 79 74 65 73 20 75 73 65 64 20 66  the bytes used f
31c0: 6f 72 20 6c 6f 63 6b 69 6e 67 2e 20 20 54 68 65  or locking.  The
31d0: 20 70 61 67 65 72 20 6e 65 76 65 72 20 61 6c 6c   pager never all
31e0: 6f 63 61 74 65 73 0a 2a 2a 20 74 68 65 20 70 61  ocates.** the pa
31f0: 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  ges involved in 
3200: 6c 6f 63 6b 69 6e 67 20 74 68 65 72 65 66 6f 72  locking therefor
3210: 65 2e 20 20 53 48 41 52 45 44 5f 53 49 5a 45 20  e.  SHARED_SIZE 
3220: 69 73 20 73 65 6c 65 63 74 65 64 20 73 6f 0a 2a  is selected so.*
3230: 2a 20 74 68 61 74 20 61 6c 6c 20 6c 6f 63 6b 73  * that all locks
3240: 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 61 20 73   will fit on a s
3250: 69 6e 67 6c 65 20 70 61 67 65 20 65 76 65 6e 20  ingle page even 
3260: 61 74 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 70  at the minimum p
3270: 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 50 45 4e  age size..** PEN
3280: 44 49 4e 47 5f 42 59 54 45 20 64 65 66 69 6e 65  DING_BYTE define
3290: 73 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  s the beginning 
32a0: 6f 66 20 74 68 65 20 6c 6f 63 6b 73 2e 20 20 42  of the locks.  B
32b0: 79 20 64 65 66 61 75 6c 74 20 50 45 4e 44 49 4e  y default PENDIN
32c0: 47 5f 42 59 54 45 0a 2a 2a 20 69 73 20 73 65 74  G_BYTE.** is set
32d0: 20 68 69 67 68 20 73 6f 20 74 68 61 74 20 77 65   high so that we
32e0: 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20 61   don't have to a
32f0: 6c 6c 6f 63 61 74 65 20 61 6e 20 75 6e 75 73 65  llocate an unuse
3300: 64 20 70 61 67 65 20 65 78 63 65 70 74 0a 2a 2a  d page except.**
3310: 20 66 6f 72 20 76 65 72 79 20 6c 61 72 67 65 20   for very large 
3320: 64 61 74 61 62 61 73 65 73 2e 20 20 42 75 74 20  databases.  But 
3330: 6f 6e 65 20 73 68 6f 75 6c 64 20 74 65 73 74 20  one should test 
3340: 74 68 65 20 70 61 67 65 20 73 6b 69 70 70 69 6e  the page skippin
3350: 67 20 6c 6f 67 69 63 20 0a 2a 2a 20 62 79 20 73  g logic .** by s
3360: 65 74 74 69 6e 67 20 50 45 4e 44 49 4e 47 5f 42  etting PENDING_B
3370: 59 54 45 20 6c 6f 77 20 61 6e 64 20 72 75 6e 6e  YTE low and runn
3380: 69 6e 67 20 74 68 65 20 65 6e 74 69 72 65 20 72  ing the entire r
3390: 65 67 72 65 73 73 69 6f 6e 20 73 75 69 74 65 2e  egression suite.
33a0: 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20  .**.** Changing 
33b0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 45 4e  the value of PEN
33c0: 44 49 4e 47 5f 42 59 54 45 20 72 65 73 75 6c 74  DING_BYTE result
33d0: 73 20 69 6e 20 61 20 73 75 62 74 6c 79 20 69 6e  s in a subtly in
33e0: 63 6f 6d 70 61 74 69 62 6c 65 0a 2a 2a 20 66 69  compatible.** fi
33f0: 6c 65 20 66 6f 72 6d 61 74 2e 20 20 44 65 70 65  le format.  Depe
3400: 6e 64 69 6e 67 20 6f 6e 20 68 6f 77 20 69 74 20  nding on how it 
3410: 69 73 20 63 68 61 6e 67 65 64 2c 20 79 6f 75 20  is changed, you 
3420: 6d 69 67 68 74 20 6e 6f 74 20 6e 6f 74 69 63 65  might not notice
3430: 0a 2a 2a 20 74 68 65 20 69 6e 63 6f 6d 70 61 74  .** the incompat
3440: 69 62 69 6c 69 74 79 20 72 69 67 68 74 20 61 77  ibility right aw
3450: 61 79 2c 20 65 76 65 6e 20 72 75 6e 6e 69 6e 67  ay, even running
3460: 20 61 20 66 75 6c 6c 20 72 65 67 72 65 73 73 69   a full regressi
3470: 6f 6e 20 74 65 73 74 2e 0a 2a 2a 20 54 68 65 20  on test..** The 
3480: 64 65 66 61 75 6c 74 20 6c 6f 63 61 74 69 6f 6e  default location
3490: 20 6f 66 20 50 45 4e 44 49 4e 47 5f 42 59 54 45   of PENDING_BYTE
34a0: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 62 79   is the first by
34b0: 74 65 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 31  te past the.** 1
34c0: 47 42 20 62 6f 75 6e 64 61 72 79 2e 0a 2a 2a 0a  GB boundary..**.
34d0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
34e0: 45 5f 54 45 53 54 0a 23 64 65 66 69 6e 65 20 50  E_TEST.#define P
34f0: 45 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20 20  ENDING_BYTE     
3500: 20 30 78 34 30 30 30 30 30 30 30 20 20 2f 2a 20   0x40000000  /* 
3510: 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
3520: 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79  the 1GB boundary
3530: 20 2a 2f 0a 23 65 6c 73 65 0a 65 78 74 65 72 6e   */.#else.extern
3540: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 73 71   unsigned int sq
3550: 6c 69 74 65 33 5f 70 65 6e 64 69 6e 67 5f 62 79  lite3_pending_by
3560: 74 65 3b 0a 23 64 65 66 69 6e 65 20 50 45 4e 44  te;.#define PEND
3570: 49 4e 47 5f 42 59 54 45 20 73 71 6c 69 74 65 33  ING_BYTE sqlite3
3580: 5f 70 65 6e 64 69 6e 67 5f 62 79 74 65 0a 23 65  _pending_byte.#e
3590: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 52 45  ndif..#define RE
35a0: 53 45 52 56 45 44 5f 42 59 54 45 20 20 20 20 20  SERVED_BYTE     
35b0: 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 29  (PENDING_BYTE+1)
35c0: 0a 23 64 65 66 69 6e 65 20 53 48 41 52 45 44 5f  .#define SHARED_
35d0: 46 49 52 53 54 20 20 20 20 20 20 28 50 45 4e 44  FIRST      (PEND
35e0: 49 4e 47 5f 42 59 54 45 2b 32 29 0a 23 64 65 66  ING_BYTE+2).#def
35f0: 69 6e 65 20 53 48 41 52 45 44 5f 53 49 5a 45 20  ine SHARED_SIZE 
3600: 20 20 20 20 20 20 35 31 30 0a 0a 2f 2a 20 0a 2a        510../* .*
3610: 2a 20 46 75 6e 63 74 69 6f 6e 73 20 66 6f 72 20  * Functions for 
3620: 61 63 63 65 73 73 69 6e 67 20 73 71 6c 69 74 65  accessing sqlite
3630: 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 0a  3_file methods .
3640: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73  */.int sqlite3Os
3650: 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
3660: 6c 65 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  le*);.int sqlite
3670: 33 4f 73 52 65 61 64 28 73 71 6c 69 74 65 33 5f  3OsRead(sqlite3_
3680: 66 69 6c 65 2a 2c 20 76 6f 69 64 2a 2c 20 69 6e  file*, void*, in
3690: 74 20 61 6d 74 2c 20 69 36 34 20 6f 66 66 73 65  t amt, i64 offse
36a0: 74 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f  t);.int sqlite3O
36b0: 73 57 72 69 74 65 28 73 71 6c 69 74 65 33 5f 66  sWrite(sqlite3_f
36c0: 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 76 6f 69 64  ile*, const void
36d0: 2a 2c 20 69 6e 74 20 61 6d 74 2c 20 69 36 34 20  *, int amt, i64 
36e0: 6f 66 66 73 65 74 29 3b 0a 69 6e 74 20 73 71 6c  offset);.int sql
36f0: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 73  ite3OsTruncate(s
3700: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 36  qlite3_file*, i6
3710: 34 20 73 69 7a 65 29 3b 0a 69 6e 74 20 73 71 6c  4 size);.int sql
3720: 69 74 65 33 4f 73 53 79 6e 63 28 73 71 6c 69 74  ite3OsSync(sqlit
3730: 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a  e3_file*, int);.
3740: 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  int sqlite3OsFil
3750: 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  eSize(sqlite3_fi
3760: 6c 65 2a 2c 20 69 36 34 20 2a 70 53 69 7a 65 29  le*, i64 *pSize)
3770: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 4c  ;.int sqlite3OsL
3780: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
3790: 2a 2c 20 69 6e 74 29 3b 0a 69 6e 74 20 73 71 6c  *, int);.int sql
37a0: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 73 71 6c  ite3OsUnlock(sql
37b0: 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29  ite3_file*, int)
37c0: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 42  ;.int sqlite3OsB
37d0: 72 65 61 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  reakLock(sqlite3
37e0: 5f 66 69 6c 65 2a 29 3b 0a 69 6e 74 20 73 71 6c  _file*);.int sql
37f0: 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
3800: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
3810: 66 69 6c 65 20 2a 69 64 29 3b 0a 69 6e 74 20 73  file *id);.int s
3820: 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
3830: 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
3840: 2a 69 64 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  *id);.int sqlite
3850: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
3860: 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33  eristics(sqlite3
3870: 5f 66 69 6c 65 20 2a 69 64 29 3b 0a 0a 2f 2a 20  _file *id);../* 
3880: 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 73 20 66 6f  .** Functions fo
3890: 72 20 61 63 63 65 73 73 69 6e 67 20 73 71 6c 69  r accessing sqli
38a0: 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20  te3_vfs methods 
38b0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f  .*/.int sqlite3O
38c0: 73 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  sOpen(sqlite3_vf
38d0: 73 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  s *, const char 
38e0: 2a 2c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  *, sqlite3_file*
38f0: 2c 20 69 6e 74 2c 20 69 6e 74 20 2a 29 3b 0a 69  , int, int *);.i
3900: 6e 74 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65  nt sqlite3OsDele
3910: 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  te(sqlite3_vfs *
3920: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b  , const char *);
3930: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 41 63  .int sqlite3OsAc
3940: 63 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73  cess(sqlite3_vfs
3950: 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   *, const char *
3960: 2c 20 69 6e 74 29 3b 0a 69 6e 74 20 73 71 6c 69  , int);.int sqli
3970: 74 65 33 4f 73 47 65 74 54 65 6d 70 4e 61 6d 65  te3OsGetTempName
3980: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 20  (sqlite3_vfs *, 
3990: 63 68 61 72 20 2a 29 3b 0a 69 6e 74 20 73 71 6c  char *);.int sql
39a0: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
39b0: 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  me(sqlite3_vfs *
39c0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20  , const char *, 
39d0: 63 68 61 72 20 2a 29 3b 0a 76 6f 69 64 20 2a 73  char *);.void *s
39e0: 71 6c 69 74 65 33 4f 73 44 6c 4f 70 65 6e 28 73  qlite3OsDlOpen(s
39f0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 20 63 6f  qlite3_vfs *, co
3a00: 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 76 6f 69  nst char *);.voi
3a10: 64 20 73 71 6c 69 74 65 33 4f 73 44 6c 45 72 72  d sqlite3OsDlErr
3a20: 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
3a30: 2c 20 69 6e 74 2c 20 63 68 61 72 20 2a 29 3b 0a  , int, char *);.
3a40: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 4f 73 44  void *sqlite3OsD
3a50: 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73  lSym(sqlite3_vfs
3a60: 20 2a 2c 20 76 6f 69 64 20 2a 2c 20 63 6f 6e 73   *, void *, cons
3a70: 74 20 63 68 61 72 20 2a 29 3b 0a 76 6f 69 64 20  t char *);.void 
3a80: 73 71 6c 69 74 65 33 4f 73 44 6c 43 6c 6f 73 65  sqlite3OsDlClose
3a90: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 20  (sqlite3_vfs *, 
3aa0: 76 6f 69 64 20 2a 29 3b 0a 69 6e 74 20 73 71 6c  void *);.int sql
3ab0: 69 74 65 33 4f 73 52 61 6e 64 6f 6d 6e 65 73 73  ite3OsRandomness
3ac0: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 20  (sqlite3_vfs *, 
3ad0: 69 6e 74 2c 20 63 68 61 72 20 2a 29 3b 0a 69 6e  int, char *);.in
3ae0: 74 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70  t sqlite3OsSleep
3af0: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 20  (sqlite3_vfs *, 
3b00: 69 6e 74 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  int);.int sqlite
3b10: 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 73  3OsCurrentTime(s
3b20: 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 20 64 6f  qlite3_vfs *, do
3b30: 75 62 6c 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43  uble*);../*.** C
3b40: 6f 6e 76 65 6e 69 65 6e 63 65 20 66 75 6e 63 74  onvenience funct
3b50: 69 6f 6e 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67  ions for opening
3b60: 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 66 69 6c   and closing fil
3b70: 65 73 20 75 73 69 6e 67 20 0a 2a 2a 20 73 71 6c  es using .** sql
3b80: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 74 6f  ite3_malloc() to
3b90: 20 6f 62 74 61 69 6e 20 73 70 61 63 65 20 66 6f   obtain space fo
3ba0: 72 20 74 68 65 20 66 69 6c 65 2d 68 61 6e 64 6c  r the file-handl
3bb0: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
3bc0: 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  int sqlite3OsOpe
3bd0: 6e 4d 61 6c 6c 6f 63 28 73 71 6c 69 74 65 33 5f  nMalloc(sqlite3_
3be0: 76 66 73 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61  vfs *, const cha
3bf0: 72 20 2a 2c 20 73 71 6c 69 74 65 33 5f 66 69 6c  r *, sqlite3_fil
3c00: 65 20 2a 2a 2c 20 69 6e 74 29 3b 20 0a 69 6e 74  e **, int); .int
3c10: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
3c20: 72 65 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ree(sqlite3_file
3c30: 20 2a 29 3b 0a 0a 23 69 66 20 30 0a 69 6e 74 20   *);..#if 0.int 
3c40: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
3c50: 64 57 72 69 74 65 28 63 6f 6e 73 74 20 63 68 61  dWrite(const cha
3c60: 72 2a 2c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  r*, sqlite3_file
3c70: 2a 2a 2c 20 69 6e 74 2a 29 3b 0a 69 6e 74 20 73  **, int*);.int s
3c80: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c  qlite3OsOpenExcl
3c90: 75 73 69 76 65 28 63 6f 6e 73 74 20 63 68 61 72  usive(const char
3ca0: 2a 2c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  *, sqlite3_file*
3cb0: 2a 2c 20 69 6e 74 29 3b 0a 69 6e 74 20 73 71 6c  *, int);.int sql
3cc0: 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e  ite3OsOpenReadOn
3cd0: 6c 79 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20  ly(const char*, 
3ce0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29 3b  sqlite3_file**);
3cf0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 44 65  .int sqlite3OsDe
3d00: 6c 65 74 65 28 63 6f 6e 73 74 20 63 68 61 72 2a  lete(const char*
3d10: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73  );.int sqlite3Os
3d20: 46 69 6c 65 45 78 69 73 74 73 28 63 6f 6e 73 74  FileExists(const
3d30: 20 63 68 61 72 2a 29 3b 0a 63 68 61 72 20 2a 73   char*);.char *s
3d40: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
3d50: 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 2a  name(const char*
3d60: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73  );.int sqlite3Os
3d70: 49 73 44 69 72 57 72 69 74 61 62 6c 65 28 63 68  IsDirWritable(ch
3d80: 61 72 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  ar*);.int sqlite
3d90: 33 4f 73 53 79 6e 63 44 69 72 65 63 74 6f 72 79  3OsSyncDirectory
3da0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 69  (const char*);.i
3db0: 6e 74 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70  nt sqlite3OsTemp
3dc0: 46 69 6c 65 4e 61 6d 65 28 63 68 61 72 2a 29 3b  FileName(char*);
3dd0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 52 61  .int sqlite3OsRa
3de0: 6e 64 6f 6d 53 65 65 64 28 63 68 61 72 2a 29 3b  ndomSeed(char*);
3df0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 53 6c  .int sqlite3OsSl
3e00: 65 65 70 28 69 6e 74 20 6d 73 29 3b 0a 69 6e 74  eep(int ms);.int
3e10: 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e   sqlite3OsCurren
3e20: 74 54 69 6d 65 28 64 6f 75 62 6c 65 2a 29 3b 0a  tTime(double*);.
3e30: 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 73 45 6e  void sqlite3OsEn
3e40: 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 3b 0a  terMutex(void);.
3e50: 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 73 4c 65  void sqlite3OsLe
3e60: 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29 3b 0a  aveMutex(void);.
3e70: 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 49 6e 4d  int sqlite3OsInM
3e80: 75 74 65 78 28 69 6e 74 29 3b 0a 54 68 72 65 61  utex(int);.Threa
3e90: 64 44 61 74 61 20 2a 73 71 6c 69 74 65 33 4f 73  dData *sqlite3Os
3ea0: 54 68 72 65 61 64 53 70 65 63 69 66 69 63 44 61  ThreadSpecificDa
3eb0: 74 61 28 69 6e 74 29 3b 0a 76 6f 69 64 20 2a 73  ta(int);.void *s
3ec0: 71 6c 69 74 65 33 4f 73 4d 61 6c 6c 6f 63 28 69  qlite3OsMalloc(i
3ed0: 6e 74 29 3b 0a 76 6f 69 64 20 2a 73 71 6c 69 74  nt);.void *sqlit
3ee0: 65 33 4f 73 52 65 61 6c 6c 6f 63 28 76 6f 69 64  e3OsRealloc(void
3ef0: 20 2a 2c 20 69 6e 74 29 3b 0a 76 6f 69 64 20 73   *, int);.void s
3f00: 71 6c 69 74 65 33 4f 73 46 72 65 65 28 76 6f 69  qlite3OsFree(voi
3f10: 64 20 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  d *);.int sqlite
3f20: 33 4f 73 41 6c 6c 6f 63 61 74 69 6f 6e 53 69 7a  3OsAllocationSiz
3f30: 65 28 76 6f 69 64 20 2a 29 3b 0a 76 6f 69 64 20  e(void *);.void 
3f40: 2a 73 71 6c 69 74 65 33 4f 73 44 6c 6f 70 65 6e  *sqlite3OsDlopen
3f50: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 76  (const char*);.v
3f60: 6f 69 64 20 2a 73 71 6c 69 74 65 33 4f 73 44 6c  oid *sqlite3OsDl
3f70: 73 79 6d 28 76 6f 69 64 2a 2c 20 63 6f 6e 73 74  sym(void*, const
3f80: 20 63 68 61 72 2a 29 3b 0a 69 6e 74 20 73 71 6c   char*);.int sql
3f90: 69 74 65 33 4f 73 44 6c 63 6c 6f 73 65 28 76 6f  ite3OsDlclose(vo
3fa0: 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  id*);.#endif..#i
3fb0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
3fc0: 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65  _TEST) || define
3fd0: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
3fe0: 20 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 46    int sqlite3OsF
3ff0: 69 6c 65 48 61 6e 64 6c 65 28 73 71 6c 69 74 65  ileHandle(sqlite
4000: 33 5f 66 69 6c 65 20 2a 69 64 29 3b 0a 20 20 69  3_file *id);.  i
4010: 6e 74 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  nt sqlite3OsLock
4020: 53 74 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69  State(sqlite3_fi
4030: 6c 65 20 2a 69 64 29 3b 0a 23 65 6e 64 69 66 0a  le *id);.#endif.
4040: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51  ./*.** If the SQ
4050: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 45 44 45  LITE_ENABLE_REDE
4060: 46 5f 49 4f 20 6d 61 63 72 6f 20 69 73 20 64 65  F_IO macro is de
4070: 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 20  fined, then the 
4080: 4f 53 2d 6c 61 79 65 72 0a 2a 2a 20 69 6e 74 65  OS-layer.** inte
4090: 72 66 61 63 65 20 72 6f 75 74 69 6e 65 73 20 61  rface routines a
40a0: 72 65 20 6e 6f 74 20 63 61 6c 6c 65 64 20 64 69  re not called di
40b0: 72 65 63 74 6c 79 20 62 75 74 20 61 72 65 20 69  rectly but are i
40c0: 6e 76 6f 6b 65 64 20 75 73 69 6e 67 0a 2a 2a 20  nvoked using.** 
40d0: 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 75 6e 63  pointers to func
40e0: 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 6c 6c  tions.  This all
40f0: 6f 77 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ows the implemen
4100: 74 61 74 69 6f 6e 20 6f 66 20 76 61 72 69 6f 75  tation of variou
4110: 73 0a 2a 2a 20 4f 53 2d 6c 61 79 65 72 20 69 6e  s.** OS-layer in
4120: 74 65 72 66 61 63 65 20 72 6f 75 74 69 6e 65 73  terface routines
4130: 20 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 20   to be modified 
4140: 61 74 20 72 75 6e 2d 74 69 6d 65 2e 20 20 54 68  at run-time.  Th
4150: 65 72 65 20 61 72 65 0a 2a 2a 20 6f 62 73 63 75  ere are.** obscu
4160: 72 65 20 62 75 74 20 6c 65 67 69 74 69 6d 61 74  re but legitimat
4170: 65 20 72 65 61 73 6f 6e 73 20 66 6f 72 20 77 61  e reasons for wa
4180: 6e 74 69 6e 67 20 74 6f 20 64 6f 20 74 68 69 73  nting to do this
4190: 2e 20 20 42 75 74 20 66 6f 72 0a 2a 2a 20 6d 6f  .  But for.** mo
41a0: 73 74 20 75 73 65 72 73 2c 20 61 20 64 69 72 65  st users, a dire
41b0: 63 74 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 75  ct call to the u
41c0: 6e 64 65 72 6c 79 69 6e 67 20 69 6e 74 65 72 66  nderlying interf
41d0: 61 63 65 20 69 73 20 70 72 65 66 65 72 61 62 6c  ace is preferabl
41e0: 65 0a 2a 2a 20 73 6f 20 74 68 65 20 74 68 65 20  e.** so the the 
41f0: 72 65 64 65 66 69 6e 61 62 6c 65 20 49 2f 4f 20  redefinable I/O 
4200: 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 75 72  interface is tur
4210: 6e 65 64 20 6f 66 66 20 62 79 20 64 65 66 61 75  ned off by defau
4220: 6c 74 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  lt..*/.#ifdef SQ
4230: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 45 44 45  LITE_ENABLE_REDE
4240: 46 5f 49 4f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  F_IO../*.** When
4250: 20 72 65 64 65 66 69 6e 61 62 6c 65 20 49 2f 4f   redefinable I/O
4260: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 20 73   is enabled, a s
4270: 69 6e 67 6c 65 20 67 6c 6f 62 61 6c 20 69 6e 73  ingle global ins
4280: 74 61 6e 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20  tance of the.** 
4290: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
42a0: 75 72 65 20 68 6f 6c 64 73 20 70 6f 69 6e 74 65  ure holds pointe
42b0: 72 73 20 74 6f 20 74 68 65 20 72 6f 75 74 69 6e  rs to the routin
42c0: 65 73 20 74 68 61 74 20 53 51 4c 69 74 65 20 0a  es that SQLite .
42d0: 2a 2a 20 75 73 65 73 20 74 6f 20 74 61 6c 6b 20  ** uses to talk 
42e0: 77 69 74 68 20 74 68 65 20 75 6e 64 65 72 6c 79  with the underly
42f0: 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ing operating sy
4300: 73 74 65 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68  stem.  Modify th
4310: 69 73 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  is.** structure 
4320: 28 62 65 66 6f 72 65 20 75 73 69 6e 67 20 61 6e  (before using an
4330: 79 20 53 51 4c 69 74 65 20 41 50 49 21 29 20 74  y SQLite API!) t
4340: 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 70 65 72  o accomodate per
4350: 63 75 6c 69 61 72 0a 2a 2a 20 6f 70 65 72 61 74  culiar.** operat
4360: 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72  ing system inter
4370: 66 61 63 65 73 20 6f 72 20 62 65 68 61 76 69 6f  faces or behavio
4380: 72 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 71  rs..*/.struct sq
4390: 6c 69 74 65 33 4f 73 56 74 62 6c 20 7b 0a 20 20  lite3OsVtbl {.  
43a0: 69 6e 74 20 28 2a 78 4f 70 65 6e 52 65 61 64 57  int (*xOpenReadW
43b0: 72 69 74 65 29 28 63 6f 6e 73 74 20 63 68 61 72  rite)(const char
43c0: 2a 2c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  *, sqlite3_file*
43d0: 2a 2c 20 69 6e 74 2a 29 3b 0a 20 20 69 6e 74 20  *, int*);.  int 
43e0: 28 2a 78 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  (*xOpenExclusive
43f0: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 73  )(const char*, s
4400: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 2c 20 69  qlite3_file**, i
4410: 6e 74 29 3b 0a 20 20 69 6e 74 20 28 2a 78 4f 70  nt);.  int (*xOp
4420: 65 6e 52 65 61 64 4f 6e 6c 79 29 28 63 6f 6e 73  enReadOnly)(cons
4430: 74 20 63 68 61 72 2a 2c 20 73 71 6c 69 74 65 33  t char*, sqlite3
4440: 5f 66 69 6c 65 2a 2a 29 3b 0a 0a 20 20 69 6e 74  _file**);..  int
4450: 20 28 2a 78 44 65 6c 65 74 65 29 28 63 6f 6e 73   (*xDelete)(cons
4460: 74 20 63 68 61 72 2a 29 3b 0a 20 20 69 6e 74 20  t char*);.  int 
4470: 28 2a 78 46 69 6c 65 45 78 69 73 74 73 29 28 63  (*xFileExists)(c
4480: 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 63  onst char*);.  c
4490: 68 61 72 20 2a 28 2a 78 46 75 6c 6c 50 61 74 68  har *(*xFullPath
44a0: 6e 61 6d 65 29 28 63 6f 6e 73 74 20 63 68 61 72  name)(const char
44b0: 2a 29 3b 0a 20 20 69 6e 74 20 28 2a 78 49 73 44  *);.  int (*xIsD
44c0: 69 72 57 72 69 74 61 62 6c 65 29 28 63 68 61 72  irWritable)(char
44d0: 2a 29 3b 0a 20 20 69 6e 74 20 28 2a 78 53 79 6e  *);.  int (*xSyn
44e0: 63 44 69 72 65 63 74 6f 72 79 29 28 63 6f 6e 73  cDirectory)(cons
44f0: 74 20 63 68 61 72 2a 29 3b 0a 20 20 69 6e 74 20  t char*);.  int 
4500: 28 2a 78 54 65 6d 70 46 69 6c 65 4e 61 6d 65 29  (*xTempFileName)
4510: 28 63 68 61 72 2a 29 3b 0a 0a 20 20 69 6e 74 20  (char*);..  int 
4520: 28 2a 78 52 61 6e 64 6f 6d 53 65 65 64 29 28 63  (*xRandomSeed)(c
4530: 68 61 72 2a 29 3b 0a 20 20 69 6e 74 20 28 2a 78  har*);.  int (*x
4540: 53 6c 65 65 70 29 28 69 6e 74 20 6d 73 29 3b 0a  Sleep)(int ms);.
4550: 20 20 69 6e 74 20 28 2a 78 43 75 72 72 65 6e 74    int (*xCurrent
4560: 54 69 6d 65 29 28 64 6f 75 62 6c 65 2a 29 3b 0a  Time)(double*);.
4570: 0a 20 20 76 6f 69 64 20 28 2a 78 45 6e 74 65 72  .  void (*xEnter
4580: 4d 75 74 65 78 29 28 76 6f 69 64 29 3b 0a 20 20  Mutex)(void);.  
4590: 76 6f 69 64 20 28 2a 78 4c 65 61 76 65 4d 75 74  void (*xLeaveMut
45a0: 65 78 29 28 76 6f 69 64 29 3b 0a 20 20 69 6e 74  ex)(void);.  int
45b0: 20 28 2a 78 49 6e 4d 75 74 65 78 29 28 69 6e 74   (*xInMutex)(int
45c0: 29 3b 0a 20 20 54 68 72 65 61 64 44 61 74 61 20  );.  ThreadData 
45d0: 2a 28 2a 78 54 68 72 65 61 64 53 70 65 63 69 66  *(*xThreadSpecif
45e0: 69 63 44 61 74 61 29 28 69 6e 74 29 3b 0a 0a 20  icData)(int);.. 
45f0: 20 76 6f 69 64 20 2a 28 2a 78 4d 61 6c 6c 6f 63   void *(*xMalloc
4600: 29 28 69 6e 74 29 3b 0a 20 20 76 6f 69 64 20 2a  )(int);.  void *
4610: 28 2a 78 52 65 61 6c 6c 6f 63 29 28 76 6f 69 64  (*xRealloc)(void
4620: 20 2a 2c 20 69 6e 74 29 3b 0a 20 20 76 6f 69 64   *, int);.  void
4630: 20 28 2a 78 46 72 65 65 29 28 76 6f 69 64 20 2a   (*xFree)(void *
4640: 29 3b 0a 20 20 69 6e 74 20 28 2a 78 41 6c 6c 6f  );.  int (*xAllo
4650: 63 61 74 69 6f 6e 53 69 7a 65 29 28 76 6f 69 64  cationSize)(void
4660: 20 2a 29 3b 0a 0a 20 20 76 6f 69 64 20 2a 28 2a   *);..  void *(*
4670: 78 44 6c 6f 70 65 6e 29 28 63 6f 6e 73 74 20 63  xDlopen)(const c
4680: 68 61 72 2a 29 3b 0a 20 20 76 6f 69 64 20 2a 28  har*);.  void *(
4690: 2a 78 44 6c 73 79 6d 29 28 76 6f 69 64 2a 2c 20  *xDlsym)(void*, 
46a0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20  const char*);.  
46b0: 69 6e 74 20 28 2a 78 44 6c 63 6c 6f 73 65 29 28  int (*xDlclose)(
46c0: 76 6f 69 64 2a 29 3b 0a 7d 3b 0a 0a 2f 2a 20 4d  void*);.};../* M
46d0: 61 63 72 6f 20 75 73 65 64 20 74 6f 20 63 6f 6d  acro used to com
46e0: 6d 65 6e 74 20 6f 75 74 20 72 6f 75 74 69 6e 65  ment out routine
46f0: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 65 78  s that do not ex
4700: 69 73 74 73 20 77 68 65 6e 20 74 68 65 72 65 20  ists when there 
4710: 69 73 0a 2a 2a 20 6e 6f 20 64 69 73 6b 20 49 2f  is.** no disk I/
4720: 4f 20 6f 72 20 65 78 74 65 6e 73 69 6f 6e 20 6c  O or extension l
4730: 6f 61 64 69 6e 67 0a 2a 2f 0a 23 69 66 64 65 66  oading.*/.#ifdef
4740: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
4750: 4b 49 4f 0a 23 20 64 65 66 69 6e 65 20 49 46 5f  KIO.# define IF_
4760: 44 49 53 4b 49 4f 28 58 29 20 20 30 0a 23 65 6c  DISKIO(X)  0.#el
4770: 73 65 0a 23 20 64 65 66 69 6e 65 20 49 46 5f 44  se.# define IF_D
4780: 49 53 4b 49 4f 28 58 29 20 20 58 0a 23 65 6e 64  ISKIO(X)  X.#end
4790: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
47a0: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
47b0: 53 49 4f 4e 0a 23 20 64 65 66 69 6e 65 20 49 46  SION.# define IF
47c0: 5f 44 4c 4f 50 45 4e 28 58 29 20 20 30 0a 23 65  _DLOPEN(X)  0.#e
47d0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 49 46 5f  lse.# define IF_
47e0: 44 4c 4f 50 45 4e 28 58 29 20 20 58 0a 23 65 6e  DLOPEN(X)  X.#en
47f0: 64 69 66 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65  dif...#if define
4800: 64 28 5f 53 51 4c 49 54 45 5f 4f 53 5f 43 5f 29  d(_SQLITE_OS_C_)
4810: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
4820: 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 29  TE_AMALGAMATION)
4830: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 6f  .  /*.  ** The o
4840: 73 2e 63 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65  s.c file impleme
4850: 6e 74 73 20 74 68 65 20 67 6c 6f 62 61 6c 20 76  nts the global v
4860: 69 72 74 75 61 6c 20 66 75 6e 63 74 69 6f 6e 20  irtual function 
4870: 74 61 62 6c 65 2e 0a 20 20 2a 2a 20 57 65 20 68  table..  ** We h
4880: 61 76 65 20 74 6f 20 70 75 74 20 74 68 69 73 20  ave to put this 
4890: 66 69 6c 65 20 68 65 72 65 20 62 65 63 61 75 73  file here becaus
48a0: 65 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 65  e the initialize
48b0: 72 73 0a 20 20 2a 2a 20 28 65 78 3a 20 73 71 6c  rs.  ** (ex: sql
48c0: 69 74 65 33 4f 73 52 61 6e 64 6f 6d 53 65 65 64  ite3OsRandomSeed
48d0: 29 20 61 72 65 20 6d 61 63 72 6f 73 20 74 68 61  ) are macros tha
48e0: 74 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 62  t are about to b
48f0: 65 0a 20 20 2a 2a 20 72 65 64 65 66 69 6e 65 64  e.  ** redefined
4900: 2e 0a 20 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ..  */.  struct 
4910: 73 71 6c 69 74 65 33 4f 73 56 74 62 6c 20 73 71  sqlite3OsVtbl sq
4920: 6c 69 74 65 33 4f 73 20 3d 20 7b 0a 20 20 20 20  lite3Os = {.    
4930: 49 46 5f 44 49 53 4b 49 4f 28 20 73 71 6c 69 74  IF_DISKIO( sqlit
4940: 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74  e3OsOpenReadWrit
4950: 65 20 29 2c 0a 20 20 20 20 49 46 5f 44 49 53 4b  e ),.    IF_DISK
4960: 49 4f 28 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  IO( sqlite3OsOpe
4970: 6e 45 78 63 6c 75 73 69 76 65 20 29 2c 0a 20 20  nExclusive ),.  
4980: 20 20 49 46 5f 44 49 53 4b 49 4f 28 20 73 71 6c    IF_DISKIO( sql
4990: 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e  ite3OsOpenReadOn
49a0: 6c 79 20 29 2c 0a 20 20 20 20 49 46 5f 44 49 53  ly ),.    IF_DIS
49b0: 4b 49 4f 28 20 73 71 6c 69 74 65 33 4f 73 44 65  KIO( sqlite3OsDe
49c0: 6c 65 74 65 20 29 2c 0a 20 20 20 20 49 46 5f 44  lete ),.    IF_D
49d0: 49 53 4b 49 4f 28 20 73 71 6c 69 74 65 33 4f 73  ISKIO( sqlite3Os
49e0: 46 69 6c 65 45 78 69 73 74 73 20 29 2c 0a 20 20  FileExists ),.  
49f0: 20 20 49 46 5f 44 49 53 4b 49 4f 28 20 73 71 6c    IF_DISKIO( sql
4a00: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
4a10: 6d 65 20 29 2c 0a 20 20 20 20 49 46 5f 44 49 53  me ),.    IF_DIS
4a20: 4b 49 4f 28 20 73 71 6c 69 74 65 33 4f 73 49 73  KIO( sqlite3OsIs
4a30: 44 69 72 57 72 69 74 61 62 6c 65 20 29 2c 0a 20  DirWritable ),. 
4a40: 20 20 20 49 46 5f 44 49 53 4b 49 4f 28 20 73 71     IF_DISKIO( sq
4a50: 6c 69 74 65 33 4f 73 53 79 6e 63 44 69 72 65 63  lite3OsSyncDirec
4a60: 74 6f 72 79 20 29 2c 0a 20 20 20 20 49 46 5f 44  tory ),.    IF_D
4a70: 49 53 4b 49 4f 28 20 73 71 6c 69 74 65 33 4f 73  ISKIO( sqlite3Os
4a80: 54 65 6d 70 46 69 6c 65 4e 61 6d 65 20 29 2c 0a  TempFileName ),.
4a90: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 52 61 6e      sqlite3OsRan
4aa0: 64 6f 6d 53 65 65 64 2c 0a 20 20 20 20 73 71 6c  domSeed,.    sql
4ab0: 69 74 65 33 4f 73 53 6c 65 65 70 2c 0a 20 20 20  ite3OsSleep,.   
4ac0: 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e   sqlite3OsCurren
4ad0: 74 54 69 6d 65 2c 0a 20 20 20 20 73 71 6c 69 74  tTime,.    sqlit
4ae0: 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 2c 0a  e3OsEnterMutex,.
4af0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61      sqlite3OsLea
4b00: 76 65 4d 75 74 65 78 2c 0a 20 20 20 20 73 71 6c  veMutex,.    sql
4b10: 69 74 65 33 4f 73 49 6e 4d 75 74 65 78 2c 0a 20  ite3OsInMutex,. 
4b20: 20 20 20 30 2c 0a 20 20 20 20 73 71 6c 69 74 65     0,.    sqlite
4b30: 33 4f 73 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 73  3OsMalloc,.    s
4b40: 71 6c 69 74 65 33 4f 73 52 65 61 6c 6c 6f 63 2c  qlite3OsRealloc,
4b50: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 72  .    sqlite3OsFr
4b60: 65 65 2c 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  ee,.    sqlite3O
4b70: 73 41 6c 6c 6f 63 61 74 69 6f 6e 53 69 7a 65 2c  sAllocationSize,
4b80: 0a 20 20 20 20 49 46 5f 44 4c 4f 50 45 4e 28 20  .    IF_DLOPEN( 
4b90: 73 71 6c 69 74 65 33 4f 73 44 6c 6f 70 65 6e 20  sqlite3OsDlopen 
4ba0: 29 2c 0a 20 20 20 20 49 46 5f 44 4c 4f 50 45 4e  ),.    IF_DLOPEN
4bb0: 28 20 73 71 6c 69 74 65 33 4f 73 44 6c 73 79 6d  ( sqlite3OsDlsym
4bc0: 20 29 2c 0a 20 20 20 20 49 46 5f 44 4c 4f 50 45   ),.    IF_DLOPE
4bd0: 4e 28 20 73 71 6c 69 74 65 33 4f 73 44 6c 63 6c  N( sqlite3OsDlcl
4be0: 6f 73 65 20 29 2c 0a 20 20 7d 3b 0a 23 65 6c 73  ose ),.  };.#els
4bf0: 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6c 65  e.  /*.  ** File
4c00: 73 20 6f 74 68 65 72 20 74 68 61 6e 20 6f 73 2e  s other than os.
4c10: 63 20 6a 75 73 74 20 72 65 66 65 72 65 6e 63 65  c just reference
4c20: 20 74 68 65 20 67 6c 6f 62 61 6c 20 76 69 72 74   the global virt
4c30: 75 61 6c 20 66 75 6e 63 74 69 6f 6e 20 74 61 62  ual function tab
4c40: 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 65 78 74 65  le. .  */.  exte
4c50: 72 6e 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  rn struct sqlite
4c60: 33 4f 73 56 74 62 6c 20 73 71 6c 69 74 65 33 4f  3OsVtbl sqlite3O
4c70: 73 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 53 51  s;.#endif /* _SQ
4c80: 4c 49 54 45 5f 4f 53 5f 43 5f 20 2a 2f 0a 0a 0a  LITE_OS_C_ */...
4c90: 2f 2a 20 54 68 69 73 20 61 64 64 69 74 69 6f 6e  /* This addition
4ca0: 61 6c 20 41 50 49 20 72 6f 75 74 69 6e 65 20 69  al API routine i
4cb0: 73 20 61 76 61 69 6c 61 62 6c 65 20 77 69 74 68  s available with
4cc0: 20 72 65 64 65 66 69 6e 61 62 6c 65 20 49 2f 4f   redefinable I/O
4cd0: 20 2a 2f 0a 73 74 72 75 63 74 20 73 71 6c 69 74   */.struct sqlit
4ce0: 65 33 4f 73 56 74 62 6c 20 2a 73 71 6c 69 74 65  e3OsVtbl *sqlite
4cf0: 33 5f 6f 73 5f 73 77 69 74 63 68 28 76 6f 69 64  3_os_switch(void
4d00: 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 64 65 66  );.../*.** Redef
4d10: 69 6e 65 20 74 68 65 20 4f 53 20 69 6e 74 65 72  ine the OS inter
4d20: 66 61 63 65 20 74 6f 20 67 6f 20 74 68 72 6f 75  face to go throu
4d30: 67 68 20 74 68 65 20 76 69 72 74 75 61 6c 20 66  gh the virtual f
4d40: 75 6e 63 74 69 6f 6e 20 74 61 62 6c 65 0a 2a 2a  unction table.**
4d50: 20 72 61 74 68 65 72 20 74 68 61 6e 20 63 61 6c   rather than cal
4d60: 6c 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 64 69  ling routines di
4d70: 72 65 63 74 6c 79 2e 0a 2a 2f 0a 23 75 6e 64 65  rectly..*/.#unde
4d80: 66 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  f sqlite3OsOpenR
4d90: 65 61 64 57 72 69 74 65 0a 23 75 6e 64 65 66 20  eadWrite.#undef 
4da0: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
4db0: 6c 75 73 69 76 65 0a 23 75 6e 64 65 66 20 73 71  lusive.#undef sq
4dc0: 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f  lite3OsOpenReadO
4dd0: 6e 6c 79 0a 23 75 6e 64 65 66 20 73 71 6c 69 74  nly.#undef sqlit
4de0: 65 33 4f 73 44 65 6c 65 74 65 0a 23 75 6e 64 65  e3OsDelete.#unde
4df0: 66 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45  f sqlite3OsFileE
4e00: 78 69 73 74 73 0a 23 75 6e 64 65 66 20 73 71 6c  xists.#undef sql
4e10: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
4e20: 6d 65 0a 23 75 6e 64 65 66 20 73 71 6c 69 74 65  me.#undef sqlite
4e30: 33 4f 73 49 73 44 69 72 57 72 69 74 61 62 6c 65  3OsIsDirWritable
4e40: 0a 23 75 6e 64 65 66 20 73 71 6c 69 74 65 33 4f  .#undef sqlite3O
4e50: 73 53 79 6e 63 44 69 72 65 63 74 6f 72 79 0a 23  sSyncDirectory.#
4e60: 75 6e 64 65 66 20 73 71 6c 69 74 65 33 4f 73 54  undef sqlite3OsT
4e70: 65 6d 70 46 69 6c 65 4e 61 6d 65 0a 23 75 6e 64  empFileName.#und
4e80: 65 66 20 73 71 6c 69 74 65 33 4f 73 52 61 6e 64  ef sqlite3OsRand
4e90: 6f 6d 53 65 65 64 0a 23 75 6e 64 65 66 20 73 71  omSeed.#undef sq
4ea0: 6c 69 74 65 33 4f 73 53 6c 65 65 70 0a 23 75 6e  lite3OsSleep.#un
4eb0: 64 65 66 20 73 71 6c 69 74 65 33 4f 73 43 75 72  def sqlite3OsCur
4ec0: 72 65 6e 74 54 69 6d 65 0a 23 75 6e 64 65 66 20  rentTime.#undef 
4ed0: 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75  sqlite3OsEnterMu
4ee0: 74 65 78 0a 23 75 6e 64 65 66 20 73 71 6c 69 74  tex.#undef sqlit
4ef0: 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 0a 23  e3OsLeaveMutex.#
4f00: 75 6e 64 65 66 20 73 71 6c 69 74 65 33 4f 73 49  undef sqlite3OsI
4f10: 6e 4d 75 74 65 78 0a 23 75 6e 64 65 66 20 73 71  nMutex.#undef sq
4f20: 6c 69 74 65 33 4f 73 54 68 72 65 61 64 53 70 65  lite3OsThreadSpe
4f30: 63 69 66 69 63 44 61 74 61 0a 23 75 6e 64 65 66  cificData.#undef
4f40: 20 73 71 6c 69 74 65 33 4f 73 4d 61 6c 6c 6f 63   sqlite3OsMalloc
4f50: 0a 23 75 6e 64 65 66 20 73 71 6c 69 74 65 33 4f  .#undef sqlite3O
4f60: 73 52 65 61 6c 6c 6f 63 0a 23 75 6e 64 65 66 20  sRealloc.#undef 
4f70: 73 71 6c 69 74 65 33 4f 73 46 72 65 65 0a 23 75  sqlite3OsFree.#u
4f80: 6e 64 65 66 20 73 71 6c 69 74 65 33 4f 73 41 6c  ndef sqlite3OsAl
4f90: 6c 6f 63 61 74 69 6f 6e 53 69 7a 65 0a 23 64 65  locationSize.#de
4fa0: 66 69 6e 65 20 73 71 6c 69 74 65 33 4f 73 4f 70  fine sqlite3OsOp
4fb0: 65 6e 52 65 61 64 57 72 69 74 65 20 20 20 20 20  enReadWrite     
4fc0: 20 73 71 6c 69 74 65 33 4f 73 2e 78 4f 70 65 6e   sqlite3Os.xOpen
4fd0: 52 65 61 64 57 72 69 74 65 0a 23 64 65 66 69 6e  ReadWrite.#defin
4fe0: 65 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45  e sqlite3OsOpenE
4ff0: 78 63 6c 75 73 69 76 65 20 20 20 20 20 20 73 71  xclusive      sq
5000: 6c 69 74 65 33 4f 73 2e 78 4f 70 65 6e 45 78 63  lite3Os.xOpenExc
5010: 6c 75 73 69 76 65 0a 23 64 65 66 69 6e 65 20 73  lusive.#define s
5020: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
5030: 4f 6e 6c 79 20 20 20 20 20 20 20 73 71 6c 69 74  Only       sqlit
5040: 65 33 4f 73 2e 78 4f 70 65 6e 52 65 61 64 4f 6e  e3Os.xOpenReadOn
5050: 6c 79 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  ly.#define sqlit
5060: 65 33 4f 73 44 65 6c 65 74 65 20 20 20 20 20 20  e3OsDelete      
5070: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
5080: 2e 78 44 65 6c 65 74 65 0a 23 64 65 66 69 6e 65  .xDelete.#define
5090: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78   sqlite3OsFileEx
50a0: 69 73 74 73 20 20 20 20 20 20 20 20 20 73 71 6c  ists         sql
50b0: 69 74 65 33 4f 73 2e 78 46 69 6c 65 45 78 69 73  ite3Os.xFileExis
50c0: 74 73 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  ts.#define sqlit
50d0: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
50e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
50f0: 2e 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 0a 23  .xFullPathname.#
5100: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 4f 73  define sqlite3Os
5110: 49 73 44 69 72 57 72 69 74 61 62 6c 65 20 20 20  IsDirWritable   
5120: 20 20 20 73 71 6c 69 74 65 33 4f 73 2e 78 49 73     sqlite3Os.xIs
5130: 44 69 72 57 72 69 74 61 62 6c 65 0a 23 64 65 66  DirWritable.#def
5140: 69 6e 65 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  ine sqlite3OsSyn
5150: 63 44 69 72 65 63 74 6f 72 79 20 20 20 20 20 20  cDirectory      
5160: 73 71 6c 69 74 65 33 4f 73 2e 78 53 79 6e 63 44  sqlite3Os.xSyncD
5170: 69 72 65 63 74 6f 72 79 0a 23 64 65 66 69 6e 65  irectory.#define
5180: 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69   sqlite3OsTempFi
5190: 6c 65 4e 61 6d 65 20 20 20 20 20 20 20 73 71 6c  leName       sql
51a0: 69 74 65 33 4f 73 2e 78 54 65 6d 70 46 69 6c 65  ite3Os.xTempFile
51b0: 4e 61 6d 65 0a 23 64 65 66 69 6e 65 20 73 71 6c  Name.#define sql
51c0: 69 74 65 33 4f 73 52 61 6e 64 6f 6d 53 65 65 64  ite3OsRandomSeed
51d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
51e0: 4f 73 2e 78 52 61 6e 64 6f 6d 53 65 65 64 0a 23  Os.xRandomSeed.#
51f0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 4f 73  define sqlite3Os
5200: 53 6c 65 65 70 20 20 20 20 20 20 20 20 20 20 20  Sleep           
5210: 20 20 20 73 71 6c 69 74 65 33 4f 73 2e 78 53 6c     sqlite3Os.xSl
5220: 65 65 70 0a 23 64 65 66 69 6e 65 20 73 71 6c 69  eep.#define sqli
5230: 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65  te3OsCurrentTime
5240: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
5250: 73 2e 78 43 75 72 72 65 6e 74 54 69 6d 65 0a 23  s.xCurrentTime.#
5260: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 4f 73  define sqlite3Os
5270: 45 6e 74 65 72 4d 75 74 65 78 20 20 20 20 20 20  EnterMutex      
5280: 20 20 20 73 71 6c 69 74 65 33 4f 73 2e 78 45 6e     sqlite3Os.xEn
5290: 74 65 72 4d 75 74 65 78 0a 23 64 65 66 69 6e 65  terMutex.#define
52a0: 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d   sqlite3OsLeaveM
52b0: 75 74 65 78 20 20 20 20 20 20 20 20 20 73 71 6c  utex         sql
52c0: 69 74 65 33 4f 73 2e 78 4c 65 61 76 65 4d 75 74  ite3Os.xLeaveMut
52d0: 65 78 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  ex.#define sqlit
52e0: 65 33 4f 73 49 6e 4d 75 74 65 78 20 20 20 20 20  e3OsInMutex     
52f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
5300: 2e 78 49 6e 4d 75 74 65 78 0a 23 64 65 66 69 6e  .xInMutex.#defin
5310: 65 20 73 71 6c 69 74 65 33 4f 73 54 68 72 65 61  e sqlite3OsThrea
5320: 64 53 70 65 63 69 66 69 63 44 61 74 61 20 73 71  dSpecificData sq
5330: 6c 69 74 65 33 4f 73 2e 78 54 68 72 65 61 64 53  lite3Os.xThreadS
5340: 70 65 63 69 66 69 63 44 61 74 61 0a 23 64 65 66  pecificData.#def
5350: 69 6e 65 20 73 71 6c 69 74 65 33 4f 73 4d 61 6c  ine sqlite3OsMal
5360: 6c 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  loc             
5370: 73 71 6c 69 74 65 33 4f 73 2e 78 4d 61 6c 6c 6f  sqlite3Os.xMallo
5380: 63 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  c.#define sqlite
5390: 33 4f 73 52 65 61 6c 6c 6f 63 20 20 20 20 20 20  3OsRealloc      
53a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 2e        sqlite3Os.
53b0: 78 52 65 61 6c 6c 6f 63 0a 23 64 65 66 69 6e 65  xRealloc.#define
53c0: 20 73 71 6c 69 74 65 33 4f 73 46 72 65 65 20 20   sqlite3OsFree  
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
53e0: 69 74 65 33 4f 73 2e 78 46 72 65 65 0a 23 64 65  ite3Os.xFree.#de
53f0: 66 69 6e 65 20 73 71 6c 69 74 65 33 4f 73 41 6c  fine sqlite3OsAl
5400: 6c 6f 63 61 74 69 6f 6e 53 69 7a 65 20 20 20 20  locationSize    
5410: 20 73 71 6c 69 74 65 33 4f 73 2e 78 41 6c 6c 6f   sqlite3Os.xAllo
5420: 63 61 74 69 6f 6e 53 69 7a 65 0a 0a 23 65 6e 64  cationSize..#end
5430: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
5440: 42 4c 45 5f 52 45 44 45 46 5f 49 4f 20 2a 2f 0a  BLE_REDEF_IO */.
5450: 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 53 51 4c 49  .#endif /* _SQLI
5460: 54 45 5f 4f 53 5f 48 5f 20 2a 2f 0a              TE_OS_H_ */.