/ Hex Artifact Content
Login

Artifact 8710c0068f3386a73a37f8ad242b92c7580464df:


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 21 64 65  stem..*/.#if !de
02e0: 66 69 6e 65 64 28 4f 53 5f 55 4e 49 58 29 20 26  fined(OS_UNIX) &
02f0: 26 20 21 64 65 66 69 6e 65 64 28 4f 53 5f 4f 54  & !defined(OS_OT
0300: 48 45 52 29 0a 23 20 64 65 66 69 6e 65 20 4f 53  HER).# define OS
0310: 5f 4f 54 48 45 52 20 30 0a 23 20 69 66 6e 64 65  _OTHER 0.# ifnde
0320: 66 20 4f 53 5f 57 49 4e 0a 23 20 20 20 69 66 20  f OS_WIN.#   if 
0330: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20  defined(_WIN32) 
0340: 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32  || defined(WIN32
0350: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 43  ) || defined(__C
0360: 59 47 57 49 4e 5f 5f 29 20 7c 7c 20 64 65 66 69  YGWIN__) || defi
0370: 6e 65 64 28 5f 5f 4d 49 4e 47 57 33 32 5f 5f 29  ned(__MINGW32__)
0380: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 42 4f   || defined(__BO
0390: 52 4c 41 4e 44 43 5f 5f 29 0a 23 20 20 20 20 20  RLANDC__).#     
03a0: 64 65 66 69 6e 65 20 4f 53 5f 57 49 4e 20 31 0a  define OS_WIN 1.
03b0: 23 20 20 20 20 20 64 65 66 69 6e 65 20 4f 53 5f  #     define OS_
03c0: 55 4e 49 58 20 30 0a 23 20 20 20 65 6c 73 65 0a  UNIX 0.#   else.
03d0: 23 20 20 20 20 20 64 65 66 69 6e 65 20 4f 53 5f  #     define OS_
03e0: 57 49 4e 20 30 0a 23 20 20 20 20 20 64 65 66 69  WIN 0.#     defi
03f0: 6e 65 20 4f 53 5f 55 4e 49 58 20 31 0a 23 20 20  ne OS_UNIX 1.#  
0400: 65 6e 64 69 66 0a 23 20 65 6c 73 65 0a 23 20 20  endif.# else.#  
0410: 64 65 66 69 6e 65 20 4f 53 5f 55 4e 49 58 20 30  define OS_UNIX 0
0420: 0a 23 20 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23  .# endif.#else.#
0430: 20 69 66 6e 64 65 66 20 4f 53 5f 57 49 4e 0a 23   ifndef OS_WIN.#
0440: 20 20 64 65 66 69 6e 65 20 4f 53 5f 57 49 4e 20    define OS_WIN 
0450: 30 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  0.# endif.#endif
0460: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  .../*.** Define 
0470: 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65  the maximum size
0480: 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   of a temporary 
0490: 66 69 6c 65 6e 61 6d 65 0a 2a 2f 0a 23 69 66 20  filename.*/.#if 
04a0: 4f 53 5f 57 49 4e 0a 23 20 69 6e 63 6c 75 64 65  OS_WIN.# include
04b0: 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a 23 20 64   <windows.h>.# d
04c0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 45 4d  efine SQLITE_TEM
04d0: 50 4e 41 4d 45 5f 53 49 5a 45 20 28 4d 41 58 5f  PNAME_SIZE (MAX_
04e0: 50 41 54 48 2b 35 30 29 0a 23 65 6c 73 65 0a 23  PATH+50).#else.#
04f0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54   define SQLITE_T
0500: 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 32 30 30  EMPNAME_SIZE 200
0510: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 49 66 20 74  .#endif../* If t
0520: 68 65 20 53 45 54 5f 46 55 4c 4c 53 59 4e 43 20  he SET_FULLSYNC 
0530: 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 64 65 66  macro is not def
0540: 69 6e 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e  ined above, then
0550: 20 6d 61 6b 65 20 69 74 0a 2a 2a 20 61 20 6e 6f   make it.** a no
0560: 2d 6f 70 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  -op.*/.#ifndef S
0570: 45 54 5f 46 55 4c 4c 53 59 4e 43 0a 23 20 64 65  ET_FULLSYNC.# de
0580: 66 69 6e 65 20 53 45 54 5f 46 55 4c 4c 53 59 4e  fine SET_FULLSYN
0590: 43 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 2f  C(x,y).#endif../
05a0: 2a 0a 2a 2a 20 54 65 6d 70 6f 72 61 72 79 20 66  *.** Temporary f
05b0: 69 6c 65 73 20 61 72 65 20 6e 61 6d 65 64 20 73  iles are named s
05c0: 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 69  tarting with thi
05d0: 73 20 70 72 65 66 69 78 20 66 6f 6c 6c 6f 77 65  s prefix followe
05e0: 64 20 62 79 20 31 36 20 72 61 6e 64 6f 6d 0a 2a  d by 16 random.*
05f0: 2a 20 61 6c 70 68 61 6e 75 6d 65 72 69 63 20 63  * alphanumeric c
0600: 68 61 72 61 63 74 65 72 73 2c 20 61 6e 64 20 6e  haracters, and n
0610: 6f 20 66 69 6c 65 20 65 78 74 65 6e 73 69 6f 6e  o file extension
0620: 2e 20 54 68 65 79 20 61 72 65 20 73 74 6f 72 65  . They are store
0630: 64 20 69 6e 20 74 68 65 0a 2a 2a 20 4f 53 27 73  d in the.** OS's
0640: 20 73 74 61 6e 64 61 72 64 20 74 65 6d 70 6f 72   standard tempor
0650: 61 72 79 20 66 69 6c 65 20 64 69 72 65 63 74 6f  ary file directo
0660: 72 79 2c 20 61 6e 64 20 61 72 65 20 64 65 6c 65  ry, and are dele
0670: 74 65 64 20 70 72 69 6f 72 20 74 6f 20 65 78 69  ted prior to exi
0680: 74 2e 0a 2a 2a 20 49 66 20 73 71 6c 69 74 65 20  t..** If sqlite 
0690: 69 73 20 62 65 69 6e 67 20 65 6d 62 65 64 64 65  is being embedde
06a0: 64 20 69 6e 20 61 6e 6f 74 68 65 72 20 70 72 6f  d in another pro
06b0: 67 72 61 6d 2c 20 79 6f 75 20 6d 61 79 20 77 69  gram, you may wi
06c0: 73 68 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  sh to change the
06d0: 0a 2a 2a 20 70 72 65 66 69 78 20 74 6f 20 72 65  .** prefix to re
06e0: 66 6c 65 63 74 20 79 6f 75 72 20 70 72 6f 67 72  flect your progr
06f0: 61 6d 27 73 20 6e 61 6d 65 2c 20 73 6f 20 74 68  am's name, so th
0700: 61 74 20 69 66 20 79 6f 75 72 20 70 72 6f 67 72  at if your progr
0710: 61 6d 20 65 78 69 74 73 0a 2a 2a 20 70 72 65 6d  am exits.** prem
0720: 61 74 75 72 65 6c 79 2c 20 6f 6c 64 20 74 65 6d  aturely, old tem
0730: 70 6f 72 61 72 79 20 66 69 6c 65 73 20 63 61 6e  porary files can
0740: 20 62 65 20 65 61 73 69 6c 79 20 69 64 65 6e 74   be easily ident
0750: 69 66 69 65 64 2e 20 54 68 69 73 20 63 61 6e 20  ified. This can 
0760: 62 65 20 64 6f 6e 65 0a 2a 2a 20 75 73 69 6e 67  be done.** using
0770: 20 2d 44 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45   -DTEMP_FILE_PRE
0780: 46 49 58 3d 6d 79 70 72 65 66 69 78 5f 20 6f 6e  FIX=myprefix_ on
0790: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63 6f   the compiler co
07a0: 6d 6d 61 6e 64 20 6c 69 6e 65 2e 0a 2a 2f 0a 23  mmand line..*/.#
07b0: 69 66 6e 64 65 66 20 54 45 4d 50 5f 46 49 4c 45  ifndef TEMP_FILE
07c0: 5f 50 52 45 46 49 58 0a 23 20 64 65 66 69 6e 65  _PREFIX.# define
07d0: 20 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49   TEMP_FILE_PREFI
07e0: 58 20 22 73 71 6c 69 74 65 5f 22 0a 23 65 6e 64  X "sqlite_".#end
07f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65  if../*.** Define
0800: 20 74 68 65 20 69 6e 74 65 72 66 61 63 65 73 20   the interfaces 
0810: 66 6f 72 20 55 6e 69 78 20 61 6e 64 20 66 6f 72  for Unix and for
0820: 20 57 69 6e 64 6f 77 73 2e 0a 2a 2f 0a 23 69 66   Windows..*/.#if
0830: 20 4f 53 5f 55 4e 49 58 0a 23 64 65 66 69 6e 65   OS_UNIX.#define
0840: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
0850: 61 64 57 72 69 74 65 20 20 20 20 20 20 73 71 6c  adWrite      sql
0860: 69 74 65 33 55 6e 69 78 4f 70 65 6e 52 65 61 64  ite3UnixOpenRead
0870: 57 72 69 74 65 0a 23 64 65 66 69 6e 65 20 73 71  Write.#define sq
0880: 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75  lite3OsOpenExclu
0890: 73 69 76 65 20 20 20 20 20 20 73 71 6c 69 74 65  sive      sqlite
08a0: 33 55 6e 69 78 4f 70 65 6e 45 78 63 6c 75 73 69  3UnixOpenExclusi
08b0: 76 65 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  ve.#define sqlit
08c0: 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79  e3OsOpenReadOnly
08d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 55 6e         sqlite3Un
08e0: 69 78 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 0a 23  ixOpenReadOnly.#
08f0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 4f 73  define sqlite3Os
0900: 44 65 6c 65 74 65 20 20 20 20 20 20 20 20 20 20  Delete          
0910: 20 20 20 73 71 6c 69 74 65 33 55 6e 69 78 44 65     sqlite3UnixDe
0920: 6c 65 74 65 0a 23 64 65 66 69 6e 65 20 73 71 6c  lete.#define sql
0930: 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73  ite3OsFileExists
0940: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
0950: 55 6e 69 78 46 69 6c 65 45 78 69 73 74 73 0a 23  UnixFileExists.#
0960: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 4f 73  define sqlite3Os
0970: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 20 20 20  FullPathname    
0980: 20 20 20 73 71 6c 69 74 65 33 55 6e 69 78 46 75     sqlite3UnixFu
0990: 6c 6c 50 61 74 68 6e 61 6d 65 0a 23 64 65 66 69  llPathname.#defi
09a0: 6e 65 20 73 71 6c 69 74 65 33 4f 73 49 73 44 69  ne sqlite3OsIsDi
09b0: 72 57 72 69 74 61 62 6c 65 20 20 20 20 20 20 73  rWritable      s
09c0: 71 6c 69 74 65 33 55 6e 69 78 49 73 44 69 72 57  qlite3UnixIsDirW
09d0: 72 69 74 61 62 6c 65 0a 23 64 65 66 69 6e 65 20  ritable.#define 
09e0: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 44 69 72  sqlite3OsSyncDir
09f0: 65 63 74 6f 72 79 20 20 20 20 20 20 73 71 6c 69  ectory      sqli
0a00: 74 65 33 55 6e 69 78 53 79 6e 63 44 69 72 65 63  te3UnixSyncDirec
0a10: 74 6f 72 79 0a 23 64 65 66 69 6e 65 20 73 71 6c  tory.#define sql
0a20: 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61  ite3OsTempFileNa
0a30: 6d 65 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  me       sqlite3
0a40: 55 6e 69 78 54 65 6d 70 46 69 6c 65 4e 61 6d 65  UnixTempFileName
0a50: 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  .#define sqlite3
0a60: 4f 73 52 61 6e 64 6f 6d 53 65 65 64 20 20 20 20  OsRandomSeed    
0a70: 20 20 20 20 20 73 71 6c 69 74 65 33 55 6e 69 78       sqlite3Unix
0a80: 52 61 6e 64 6f 6d 53 65 65 64 0a 23 64 65 66 69  RandomSeed.#defi
0a90: 6e 65 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  ne sqlite3OsSlee
0aa0: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  p              s
0ab0: 71 6c 69 74 65 33 55 6e 69 78 53 6c 65 65 70 0a  qlite3UnixSleep.
0ac0: 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 4f  #define sqlite3O
0ad0: 73 43 75 72 72 65 6e 74 54 69 6d 65 20 20 20 20  sCurrentTime    
0ae0: 20 20 20 20 73 71 6c 69 74 65 33 55 6e 69 78 43      sqlite3UnixC
0af0: 75 72 72 65 6e 74 54 69 6d 65 0a 23 64 65 66 69  urrentTime.#defi
0b00: 6e 65 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65  ne sqlite3OsEnte
0b10: 72 4d 75 74 65 78 20 20 20 20 20 20 20 20 20 73  rMutex         s
0b20: 71 6c 69 74 65 33 55 6e 69 78 45 6e 74 65 72 4d  qlite3UnixEnterM
0b30: 75 74 65 78 0a 23 64 65 66 69 6e 65 20 73 71 6c  utex.#define sql
0b40: 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78  ite3OsLeaveMutex
0b50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
0b60: 55 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 0a 23  UnixLeaveMutex.#
0b70: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 4f 73  define sqlite3Os
0b80: 49 6e 4d 75 74 65 78 20 20 20 20 20 20 20 20 20  InMutex         
0b90: 20 20 20 73 71 6c 69 74 65 33 55 6e 69 78 49 6e     sqlite3UnixIn
0ba0: 4d 75 74 65 78 0a 23 64 65 66 69 6e 65 20 73 71  Mutex.#define sq
0bb0: 6c 69 74 65 33 4f 73 54 68 72 65 61 64 53 70 65  lite3OsThreadSpe
0bc0: 63 69 66 69 63 44 61 74 61 20 73 71 6c 69 74 65  cificData sqlite
0bd0: 33 55 6e 69 78 54 68 72 65 61 64 53 70 65 63 69  3UnixThreadSpeci
0be0: 66 69 63 44 61 74 61 0a 23 64 65 66 69 6e 65 20  ficData.#define 
0bf0: 73 71 6c 69 74 65 33 4f 73 4d 61 6c 6c 6f 63 20  sqlite3OsMalloc 
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
0c10: 74 65 33 47 65 6e 65 72 69 63 4d 61 6c 6c 6f 63  te3GenericMalloc
0c20: 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  .#define sqlite3
0c30: 4f 73 52 65 61 6c 6c 6f 63 20 20 20 20 20 20 20  OsRealloc       
0c40: 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65       sqlite3Gene
0c50: 72 69 63 52 65 61 6c 6c 6f 63 0a 23 64 65 66 69  ricRealloc.#defi
0c60: 6e 65 20 73 71 6c 69 74 65 33 4f 73 46 72 65 65  ne sqlite3OsFree
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
0c80: 71 6c 69 74 65 33 47 65 6e 65 72 69 63 46 72 65  qlite3GenericFre
0c90: 65 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  e.#define sqlite
0ca0: 33 4f 73 41 6c 6c 6f 63 61 74 69 6f 6e 53 69 7a  3OsAllocationSiz
0cb0: 65 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e  e     sqlite3Gen
0cc0: 65 72 69 63 41 6c 6c 6f 63 61 74 69 6f 6e 53 69  ericAllocationSi
0cd0: 7a 65 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  ze.#endif.#if OS
0ce0: 5f 57 49 4e 0a 23 64 65 66 69 6e 65 20 73 71 6c  _WIN.#define sql
0cf0: 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72  ite3OsOpenReadWr
0d00: 69 74 65 20 20 20 20 20 20 73 71 6c 69 74 65 33  ite      sqlite3
0d10: 57 69 6e 4f 70 65 6e 52 65 61 64 57 72 69 74 65  WinOpenReadWrite
0d20: 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  .#define sqlite3
0d30: 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 20  OsOpenExclusive 
0d40: 20 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 4f       sqlite3WinO
0d50: 70 65 6e 45 78 63 6c 75 73 69 76 65 0a 23 64 65  penExclusive.#de
0d60: 66 69 6e 65 20 73 71 6c 69 74 65 33 4f 73 4f 70  fine sqlite3OsOp
0d70: 65 6e 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20  enReadOnly      
0d80: 20 73 71 6c 69 74 65 33 57 69 6e 4f 70 65 6e 52   sqlite3WinOpenR
0d90: 65 61 64 4f 6e 6c 79 0a 23 64 65 66 69 6e 65 20  eadOnly.#define 
0da0: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 20  sqlite3OsDelete 
0db0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
0dc0: 74 65 33 57 69 6e 44 65 6c 65 74 65 0a 23 64 65  te3WinDelete.#de
0dd0: 66 69 6e 65 20 73 71 6c 69 74 65 33 4f 73 46 69  fine sqlite3OsFi
0de0: 6c 65 45 78 69 73 74 73 20 20 20 20 20 20 20 20  leExists        
0df0: 20 73 71 6c 69 74 65 33 57 69 6e 46 69 6c 65 45   sqlite3WinFileE
0e00: 78 69 73 74 73 0a 23 64 65 66 69 6e 65 20 73 71  xists.#define sq
0e10: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
0e20: 61 6d 65 20 20 20 20 20 20 20 73 71 6c 69 74 65  ame       sqlite
0e30: 33 57 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  3WinFullPathname
0e40: 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  .#define sqlite3
0e50: 4f 73 49 73 44 69 72 57 72 69 74 61 62 6c 65 20  OsIsDirWritable 
0e60: 20 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 49       sqlite3WinI
0e70: 73 44 69 72 57 72 69 74 61 62 6c 65 0a 23 64 65  sDirWritable.#de
0e80: 66 69 6e 65 20 73 71 6c 69 74 65 33 4f 73 53 79  fine sqlite3OsSy
0e90: 6e 63 44 69 72 65 63 74 6f 72 79 20 20 20 20 20  ncDirectory     
0ea0: 20 73 71 6c 69 74 65 33 57 69 6e 53 79 6e 63 44   sqlite3WinSyncD
0eb0: 69 72 65 63 74 6f 72 79 0a 23 64 65 66 69 6e 65  irectory.#define
0ec0: 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69   sqlite3OsTempFi
0ed0: 6c 65 4e 61 6d 65 20 20 20 20 20 20 20 73 71 6c  leName       sql
0ee0: 69 74 65 33 57 69 6e 54 65 6d 70 46 69 6c 65 4e  ite3WinTempFileN
0ef0: 61 6d 65 0a 23 64 65 66 69 6e 65 20 73 71 6c 69  ame.#define sqli
0f00: 74 65 33 4f 73 52 61 6e 64 6f 6d 53 65 65 64 20  te3OsRandomSeed 
0f10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
0f20: 69 6e 52 61 6e 64 6f 6d 53 65 65 64 0a 23 64 65  inRandomSeed.#de
0f30: 66 69 6e 65 20 73 71 6c 69 74 65 33 4f 73 53 6c  fine sqlite3OsSl
0f40: 65 65 70 20 20 20 20 20 20 20 20 20 20 20 20 20  eep             
0f50: 20 73 71 6c 69 74 65 33 57 69 6e 53 6c 65 65 70   sqlite3WinSleep
0f60: 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  .#define sqlite3
0f70: 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 20 20 20  OsCurrentTime   
0f80: 20 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 43       sqlite3WinC
0f90: 75 72 72 65 6e 74 54 69 6d 65 0a 23 64 65 66 69  urrentTime.#defi
0fa0: 6e 65 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65  ne sqlite3OsEnte
0fb0: 72 4d 75 74 65 78 20 20 20 20 20 20 20 20 20 73  rMutex         s
0fc0: 71 6c 69 74 65 33 57 69 6e 45 6e 74 65 72 4d 75  qlite3WinEnterMu
0fd0: 74 65 78 0a 23 64 65 66 69 6e 65 20 73 71 6c 69  tex.#define sqli
0fe0: 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 20  te3OsLeaveMutex 
0ff0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
1000: 69 6e 4c 65 61 76 65 4d 75 74 65 78 0a 23 64 65  inLeaveMutex.#de
1010: 66 69 6e 65 20 73 71 6c 69 74 65 33 4f 73 49 6e  fine sqlite3OsIn
1020: 4d 75 74 65 78 20 20 20 20 20 20 20 20 20 20 20  Mutex           
1030: 20 73 71 6c 69 74 65 33 57 69 6e 49 6e 4d 75 74   sqlite3WinInMut
1040: 65 78 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  ex.#define sqlit
1050: 65 33 4f 73 54 68 72 65 61 64 53 70 65 63 69 66  e3OsThreadSpecif
1060: 69 63 44 61 74 61 20 73 71 6c 69 74 65 33 57 69  icData sqlite3Wi
1070: 6e 54 68 72 65 61 64 53 70 65 63 69 66 69 63 44  nThreadSpecificD
1080: 61 74 61 0a 23 64 65 66 69 6e 65 20 73 71 6c 69  ata.#define sqli
1090: 74 65 33 4f 73 4d 61 6c 6c 6f 63 20 20 20 20 20  te3OsMalloc     
10a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
10b0: 65 6e 65 72 69 63 4d 61 6c 6c 6f 63 0a 23 64 65  enericMalloc.#de
10c0: 66 69 6e 65 20 73 71 6c 69 74 65 33 4f 73 52 65  fine sqlite3OsRe
10d0: 61 6c 6c 6f 63 20 20 20 20 20 20 20 20 20 20 20  alloc           
10e0: 20 73 71 6c 69 74 65 33 47 65 6e 65 72 69 63 52   sqlite3GenericR
10f0: 65 61 6c 6c 6f 63 0a 23 64 65 66 69 6e 65 20 73  ealloc.#define s
1100: 71 6c 69 74 65 33 4f 73 46 72 65 65 20 20 20 20  qlite3OsFree    
1110: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1120: 65 33 47 65 6e 65 72 69 63 46 72 65 65 0a 23 64  e3GenericFree.#d
1130: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 4f 73 41  efine sqlite3OsA
1140: 6c 6c 6f 63 61 74 69 6f 6e 53 69 7a 65 20 20 20  llocationSize   
1150: 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 69 63    sqlite3Generic
1160: 41 6c 6c 6f 63 61 74 69 6f 6e 53 69 7a 65 0a 23  AllocationSize.#
1170: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
1180: 75 73 69 6e 67 20 61 6e 20 61 6c 74 65 72 6e 61  using an alterna
1190: 74 69 76 65 20 4f 53 20 69 6e 74 65 72 66 61 63  tive OS interfac
11a0: 65 2c 20 74 68 65 6e 20 77 65 20 6d 75 73 74 20  e, then we must 
11b0: 68 61 76 65 20 61 6e 20 22 6f 73 5f 6f 74 68 65  have an "os_othe
11c0: 72 2e 68 22 0a 2a 2a 20 68 65 61 64 65 72 20 66  r.h".** header f
11d0: 69 6c 65 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  ile available fo
11e0: 72 20 74 68 61 74 20 69 6e 74 65 72 66 61 63 65  r that interface
11f0: 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 20 74 68  .  Presumably th
1200: 65 20 22 6f 73 5f 6f 74 68 65 72 2e 68 22 0a 2a  e "os_other.h".*
1210: 2a 20 68 65 61 64 65 72 20 66 69 6c 65 20 63 6f  * header file co
1220: 6e 74 61 69 6e 73 20 23 64 65 66 69 6e 65 73 20  ntains #defines 
1230: 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 6f 73 65  similar to those
1240: 20 61 62 6f 76 65 2e 0a 2a 2f 0a 23 69 66 20 4f   above..*/.#if O
1250: 53 5f 4f 54 48 45 52 0a 23 20 69 6e 63 6c 75 64  S_OTHER.# includ
1260: 65 20 22 6f 73 5f 6f 74 68 65 72 2e 68 22 0a 23  e "os_other.h".#
1270: 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 46  endif..../*.** F
1280: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
1290: 6f 6e 73 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ons.*/.typedef s
12a0: 74 72 75 63 74 20 4f 73 46 69 6c 65 20 4f 73 46  truct OsFile OsF
12b0: 69 6c 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ile;.typedef str
12c0: 75 63 74 20 49 6f 4d 65 74 68 6f 64 20 49 6f 4d  uct IoMethod IoM
12d0: 65 74 68 6f 64 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  ethod;../*.** An
12e0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
12f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
1300: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 70 6f  ture contains po
1310: 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 0a 2a 2a  inters to all.**
1320: 20 6d 65 74 68 6f 64 73 20 6f 6e 20 61 6e 20 4f   methods on an O
1330: 73 46 69 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f  sFile object..*/
1340: 0a 73 74 72 75 63 74 20 49 6f 4d 65 74 68 6f 64  .struct IoMethod
1350: 20 7b 0a 20 20 69 6e 74 20 28 2a 78 43 6c 6f 73   {.  int (*xClos
1360: 65 29 28 4f 73 46 69 6c 65 2a 2a 29 3b 0a 20 20  e)(OsFile**);.  
1370: 69 6e 74 20 28 2a 78 4f 70 65 6e 44 69 72 65 63  int (*xOpenDirec
1380: 74 6f 72 79 29 28 4f 73 46 69 6c 65 2a 2c 20 63  tory)(OsFile*, c
1390: 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 69  onst char*);.  i
13a0: 6e 74 20 28 2a 78 52 65 61 64 29 28 4f 73 46 69  nt (*xRead)(OsFi
13b0: 6c 65 2a 2c 20 76 6f 69 64 2a 2c 20 69 6e 74 20  le*, void*, int 
13c0: 61 6d 74 29 3b 0a 20 20 69 6e 74 20 28 2a 78 57  amt);.  int (*xW
13d0: 72 69 74 65 29 28 4f 73 46 69 6c 65 2a 2c 20 63  rite)(OsFile*, c
13e0: 6f 6e 73 74 20 76 6f 69 64 2a 2c 20 69 6e 74 20  onst void*, int 
13f0: 61 6d 74 29 3b 0a 20 20 69 6e 74 20 28 2a 78 53  amt);.  int (*xS
1400: 65 65 6b 29 28 4f 73 46 69 6c 65 2a 2c 20 69 36  eek)(OsFile*, i6
1410: 34 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 6e 74  4 offset);.  int
1420: 20 28 2a 78 54 72 75 6e 63 61 74 65 29 28 4f 73   (*xTruncate)(Os
1430: 46 69 6c 65 2a 2c 20 69 36 34 20 73 69 7a 65 29  File*, i64 size)
1440: 3b 0a 20 20 69 6e 74 20 28 2a 78 53 79 6e 63 29  ;.  int (*xSync)
1450: 28 4f 73 46 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a  (OsFile*, int);.
1460: 20 20 76 6f 69 64 20 28 2a 78 53 65 74 46 75 6c    void (*xSetFul
1470: 6c 53 79 6e 63 29 28 4f 73 46 69 6c 65 20 2a 69  lSync)(OsFile *i
1480: 64 2c 20 69 6e 74 20 73 65 74 74 69 6e 67 29 3b  d, int setting);
1490: 0a 20 20 69 6e 74 20 28 2a 78 46 69 6c 65 48 61  .  int (*xFileHa
14a0: 6e 64 6c 65 29 28 4f 73 46 69 6c 65 20 2a 69 64  ndle)(OsFile *id
14b0: 29 3b 0a 20 20 69 6e 74 20 28 2a 78 46 69 6c 65  );.  int (*xFile
14c0: 53 69 7a 65 29 28 4f 73 46 69 6c 65 2a 2c 20 69  Size)(OsFile*, i
14d0: 36 34 20 2a 70 53 69 7a 65 29 3b 0a 20 20 69 6e  64 *pSize);.  in
14e0: 74 20 28 2a 78 4c 6f 63 6b 29 28 4f 73 46 69 6c  t (*xLock)(OsFil
14f0: 65 2a 2c 20 69 6e 74 29 3b 0a 20 20 69 6e 74 20  e*, int);.  int 
1500: 28 2a 78 55 6e 6c 6f 63 6b 29 28 4f 73 46 69 6c  (*xUnlock)(OsFil
1510: 65 2a 2c 20 69 6e 74 29 3b 0a 20 20 69 6e 74 20  e*, int);.  int 
1520: 28 2a 78 4c 6f 63 6b 53 74 61 74 65 29 28 4f 73  (*xLockState)(Os
1530: 46 69 6c 65 20 2a 69 64 29 3b 0a 20 20 69 6e 74  File *id);.  int
1540: 20 28 2a 78 43 68 65 63 6b 52 65 73 65 72 76 65   (*xCheckReserve
1550: 64 4c 6f 63 6b 29 28 4f 73 46 69 6c 65 20 2a 69  dLock)(OsFile *i
1560: 64 29 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  d);.};../*.** Th
1570: 65 20 4f 73 46 69 6c 65 20 6f 62 6a 65 63 74 20  e OsFile object 
1580: 64 65 73 63 72 69 62 65 73 20 61 6e 20 6f 70 65  describes an ope
1590: 6e 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 61  n disk file in a
15a0: 6e 20 4f 53 2d 64 65 70 65 6e 64 65 6e 74 20 77  n OS-dependent w
15b0: 61 79 2e 0a 2a 2a 20 54 68 65 20 76 65 72 73 69  ay..** The versi
15c0: 6f 6e 20 6f 66 20 4f 73 46 69 6c 65 20 64 65 66  on of OsFile def
15d0: 69 6e 65 64 20 68 65 72 65 20 69 73 20 61 20 67  ined here is a g
15e0: 65 6e 65 72 69 63 20 76 65 72 73 69 6f 6e 2e 20  eneric version. 
15f0: 20 45 61 63 68 20 4f 53 0a 2a 2a 20 69 6d 70 6c   Each OS.** impl
1600: 65 6d 65 6e 74 61 74 69 6f 6e 20 64 65 66 69 6e  ementation defin
1610: 65 73 20 69 74 73 20 6f 77 6e 20 73 75 62 63 6c  es its own subcl
1620: 61 73 73 20 6f 66 20 74 68 69 73 20 73 74 72 75  ass of this stru
1630: 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61  cture that conta
1640: 69 6e 73 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 61  ins.** additiona
1650: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65  l information ne
1660: 65 64 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 66  eded to handle f
1670: 69 6c 65 20 49 2f 4f 2e 20 20 42 75 74 20 74 68  ile I/O.  But th
1680: 65 20 70 4d 65 74 68 6f 64 0a 2a 2a 20 65 6e 74  e pMethod.** ent
1690: 72 79 20 28 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ry (pointing to 
16a0: 74 68 65 20 76 69 72 74 75 61 6c 20 66 75 6e 63  the virtual func
16b0: 74 69 6f 6e 20 74 61 62 6c 65 29 20 61 6c 77 61  tion table) alwa
16c0: 79 73 20 6f 63 63 75 72 73 20 66 69 72 73 74 0a  ys occurs first.
16d0: 2a 2a 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  ** so that we ca
16e0: 6e 20 61 6c 77 61 79 73 20 66 69 6e 64 20 74 68  n always find th
16f0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65  e appropriate me
1700: 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  thods..*/.struct
1710: 20 4f 73 46 69 6c 65 20 7b 0a 20 20 49 6f 4d 65   OsFile {.  IoMe
1720: 74 68 6f 64 20 63 6f 6e 73 74 20 2a 70 4d 65 74  thod const *pMet
1730: 68 6f 64 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  hod;.};../*.** T
1740: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c  he following val
1750: 75 65 73 20 6d 61 79 20 62 65 20 70 61 73 73 65  ues may be passe
1760: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
1770: 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20 73  argument to.** s
1780: 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20  qlite3OsLock(). 
1790: 54 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b  The various lock
17a0: 73 20 65 78 68 69 62 69 74 20 74 68 65 20 66 6f  s exhibit the fo
17b0: 6c 6c 6f 77 69 6e 67 20 73 65 6d 61 6e 74 69 63  llowing semantic
17c0: 73 3a 0a 2a 2a 0a 2a 2a 20 53 48 41 52 45 44 3a  s:.**.** SHARED:
17d0: 20 20 20 20 41 6e 79 20 6e 75 6d 62 65 72 20 6f      Any number o
17e0: 66 20 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20  f processes may 
17f0: 68 6f 6c 64 20 61 20 53 48 41 52 45 44 20 6c 6f  hold a SHARED lo
1800: 63 6b 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c  ck simultaneousl
1810: 79 2e 0a 2a 2a 20 52 45 53 45 52 56 45 44 3a 20  y..** RESERVED: 
1820: 20 41 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73   A single proces
1830: 73 20 6d 61 79 20 68 6f 6c 64 20 61 20 52 45 53  s may hold a RES
1840: 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 61 20  ERVED lock on a 
1850: 66 69 6c 65 20 61 74 0a 2a 2a 20 20 20 20 20 20  file at.**      
1860: 20 20 20 20 20 20 61 6e 79 20 74 69 6d 65 2e 20        any time. 
1870: 4f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  Other processes 
1880: 6d 61 79 20 68 6f 6c 64 20 61 6e 64 20 6f 62 74  may hold and obt
1890: 61 69 6e 20 6e 65 77 20 53 48 41 52 45 44 20 6c  ain new SHARED l
18a0: 6f 63 6b 73 2e 0a 2a 2a 20 50 45 4e 44 49 4e 47  ocks..** PENDING
18b0: 3a 20 20 20 41 20 73 69 6e 67 6c 65 20 70 72 6f  :   A single pro
18c0: 63 65 73 73 20 6d 61 79 20 68 6f 6c 64 20 61 20  cess may hold a 
18d0: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 6e 20  PENDING lock on 
18e0: 61 20 66 69 6c 65 20 61 74 0a 2a 2a 20 20 20 20  a file at.**    
18f0: 20 20 20 20 20 20 20 20 61 6e 79 20 6f 6e 65 20          any one 
1900: 74 69 6d 65 2e 20 45 78 69 73 74 69 6e 67 20 53  time. Existing S
1910: 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20  HARED locks may 
1920: 70 65 72 73 69 73 74 2c 20 62 75 74 20 6e 6f 20  persist, but no 
1930: 6e 65 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  new.**          
1940: 20 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d    SHARED locks m
1950: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 62  ay be obtained b
1960: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  y other processe
1970: 73 2e 0a 2a 2a 20 45 58 43 4c 55 53 49 56 45 3a  s..** EXCLUSIVE:
1980: 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   An EXCLUSIVE lo
1990: 63 6b 20 70 72 65 63 6c 75 64 65 73 20 61 6c 6c  ck precludes all
19a0: 20 6f 74 68 65 72 20 6c 6f 63 6b 73 2e 0a 2a 2a   other locks..**
19b0: 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  .** PENDING_LOCK
19c0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 61 73 73   may not be pass
19d0: 65 64 20 64 69 72 65 63 74 6c 79 20 74 6f 20 73  ed directly to s
19e0: 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20  qlite3OsLock(). 
19f0: 49 6e 73 74 65 61 64 2c 20 61 0a 2a 2a 20 70 72  Instead, a.** pr
1a00: 6f 63 65 73 73 20 74 68 61 74 20 72 65 71 75 65  ocess that reque
1a10: 73 74 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45  sts an EXCLUSIVE
1a20: 20 6c 6f 63 6b 20 6d 61 79 20 61 63 74 75 61 6c   lock may actual
1a30: 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44  ly obtain a PEND
1a40: 49 4e 47 0a 2a 2a 20 6c 6f 63 6b 2e 20 54 68 69  ING.** lock. Thi
1a50: 73 20 63 61 6e 20 62 65 20 75 70 67 72 61 64 65  s can be upgrade
1a60: 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56  d to an EXCLUSIV
1a70: 45 20 6c 6f 63 6b 20 62 79 20 61 20 73 75 62 73  E lock by a subs
1a80: 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 2a  equent call to.*
1a90: 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  * sqlite3OsLock(
1aa0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4f  )..*/.#define NO
1ab0: 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 30 0a  _LOCK         0.
1ac0: 23 64 65 66 69 6e 65 20 53 48 41 52 45 44 5f 4c  #define SHARED_L
1ad0: 4f 43 4b 20 20 20 20 20 31 0a 23 64 65 66 69 6e  OCK     1.#defin
1ae0: 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  e RESERVED_LOCK 
1af0: 20 20 32 0a 23 64 65 66 69 6e 65 20 50 45 4e 44    2.#define PEND
1b00: 49 4e 47 5f 4c 4f 43 4b 20 20 20 20 33 0a 23 64  ING_LOCK    3.#d
1b10: 65 66 69 6e 65 20 45 58 43 4c 55 53 49 56 45 5f  efine EXCLUSIVE_
1b20: 4c 4f 43 4b 20 20 34 0a 0a 2f 2a 0a 2a 2a 20 46  LOCK  4../*.** F
1b30: 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 4e 6f 74 65  ile Locking Note
1b40: 73 3a 20 20 28 4d 6f 73 74 6c 79 20 61 62 6f 75  s:  (Mostly abou
1b50: 74 20 77 69 6e 64 6f 77 73 20 62 75 74 20 61 6c  t windows but al
1b60: 73 6f 20 73 6f 6d 65 20 69 6e 66 6f 20 66 6f 72  so some info for
1b70: 20 55 6e 69 78 29 0a 2a 2a 0a 2a 2a 20 57 65 20   Unix).**.** We 
1b80: 63 61 6e 6e 6f 74 20 75 73 65 20 4c 6f 63 6b 46  cannot use LockF
1b90: 69 6c 65 45 78 28 29 20 6f 72 20 55 6e 6c 6f 63  ileEx() or Unloc
1ba0: 6b 46 69 6c 65 45 78 28 29 20 6f 6e 20 57 69 6e  kFileEx() on Win
1bb0: 39 35 2f 39 38 2f 4d 45 20 62 65 63 61 75 73 65  95/98/ME because
1bc0: 0a 2a 2a 20 74 68 6f 73 65 20 66 75 6e 63 74 69  .** those functi
1bd0: 6f 6e 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69  ons are not avai
1be0: 6c 61 62 6c 65 2e 20 20 53 6f 20 77 65 20 75 73  lable.  So we us
1bf0: 65 20 6f 6e 6c 79 20 4c 6f 63 6b 46 69 6c 65 28  e only LockFile(
1c00: 29 20 61 6e 64 0a 2a 2a 20 55 6e 6c 6f 63 6b 46  ) and.** UnlockF
1c10: 69 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63  ile()..**.** Loc
1c20: 6b 46 69 6c 65 28 29 20 70 72 65 76 65 6e 74 73  kFile() prevents
1c30: 20 6e 6f 74 20 6a 75 73 74 20 77 72 69 74 69 6e   not just writin
1c40: 67 20 62 75 74 20 61 6c 73 6f 20 72 65 61 64 69  g but also readi
1c50: 6e 67 20 62 79 20 6f 74 68 65 72 20 70 72 6f 63  ng by other proc
1c60: 65 73 73 65 73 2e 0a 2a 2a 20 41 20 53 48 41 52  esses..** A SHAR
1c70: 45 44 5f 4c 4f 43 4b 20 69 73 20 6f 62 74 61 69  ED_LOCK is obtai
1c80: 6e 65 64 20 62 79 20 6c 6f 63 6b 69 6e 67 20 61  ned by locking a
1c90: 20 73 69 6e 67 6c 65 20 72 61 6e 64 6f 6d 6c 79   single randomly
1ca0: 2d 63 68 6f 73 65 6e 20 0a 2a 2a 20 62 79 74 65  -chosen .** byte
1cb0: 20 6f 75 74 20 6f 66 20 61 20 73 70 65 63 69 66   out of a specif
1cc0: 69 63 20 72 61 6e 67 65 20 6f 66 20 62 79 74 65  ic range of byte
1cd0: 73 2e 20 54 68 65 20 6c 6f 63 6b 20 62 79 74 65  s. The lock byte
1ce0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 61 74 20   is obtained at 
1cf0: 0a 2a 2a 20 72 61 6e 64 6f 6d 20 73 6f 20 74 77  .** random so tw
1d00: 6f 20 73 65 70 61 72 61 74 65 20 72 65 61 64 65  o separate reade
1d10: 72 73 20 63 61 6e 20 70 72 6f 62 61 62 6c 79 20  rs can probably 
1d20: 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 20  access the file 
1d30: 61 74 20 74 68 65 20 0a 2a 2a 20 73 61 6d 65 20  at the .** same 
1d40: 74 69 6d 65 2c 20 75 6e 6c 65 73 73 20 74 68 65  time, unless the
1d50: 79 20 61 72 65 20 75 6e 6c 75 63 6b 79 20 61 6e  y are unlucky an
1d60: 64 20 63 68 6f 6f 73 65 20 74 68 65 20 73 61 6d  d choose the sam
1d70: 65 20 6c 6f 63 6b 20 62 79 74 65 2e 0a 2a 2a 20  e lock byte..** 
1d80: 41 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  An EXCLUSIVE_LOC
1d90: 4b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 62 79  K is obtained by
1da0: 20 6c 6f 63 6b 69 6e 67 20 61 6c 6c 20 62 79 74   locking all byt
1db0: 65 73 20 69 6e 20 74 68 65 20 72 61 6e 67 65 2e  es in the range.
1dc0: 0a 2a 2a 20 54 68 65 72 65 20 63 61 6e 20 6f 6e  .** There can on
1dd0: 6c 79 20 62 65 20 6f 6e 65 20 77 72 69 74 65 72  ly be one writer
1de0: 2e 20 20 41 20 52 45 53 45 52 56 45 44 5f 4c 4f  .  A RESERVED_LO
1df0: 43 4b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 62  CK is obtained b
1e00: 79 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 61 20 73  y locking.** a s
1e10: 69 6e 67 6c 65 20 62 79 74 65 20 6f 66 20 74 68  ingle byte of th
1e20: 65 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 64  e file that is d
1e30: 65 73 69 67 6e 61 74 65 64 20 61 73 20 74 68 65  esignated as the
1e40: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 62   reserved lock b
1e50: 79 74 65 2e 0a 2a 2a 20 41 20 50 45 4e 44 49 4e  yte..** A PENDIN
1e60: 47 5f 4c 4f 43 4b 20 69 73 20 6f 62 74 61 69 6e  G_LOCK is obtain
1e70: 65 64 20 62 79 20 6c 6f 63 6b 69 6e 67 20 61 20  ed by locking a 
1e80: 64 65 73 69 67 6e 61 74 65 64 20 62 79 74 65 20  designated byte 
1e90: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 0a 2a  different from.*
1ea0: 2a 20 74 68 65 20 52 45 53 45 52 56 45 44 5f 4c  * the RESERVED_L
1eb0: 4f 43 4b 20 62 79 74 65 2e 0a 2a 2a 0a 2a 2a 20  OCK byte..**.** 
1ec0: 4f 6e 20 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73  On WinNT/2K/XP s
1ed0: 79 73 74 65 6d 73 2c 20 4c 6f 63 6b 46 69 6c 65  ystems, LockFile
1ee0: 45 78 28 29 20 61 6e 64 20 55 6e 6c 6f 63 6b 46  Ex() and UnlockF
1ef0: 69 6c 65 45 78 28 29 20 61 72 65 20 61 76 61 69  ileEx() are avai
1f00: 6c 61 62 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20  lable,.** which 
1f10: 6d 65 61 6e 73 20 77 65 20 63 61 6e 20 75 73 65  means we can use
1f20: 20 72 65 61 64 65 72 2f 77 72 69 74 65 72 20 6c   reader/writer l
1f30: 6f 63 6b 73 2e 20 20 57 68 65 6e 20 72 65 61 64  ocks.  When read
1f40: 65 72 2f 77 72 69 74 65 72 20 6c 6f 63 6b 73 0a  er/writer locks.
1f50: 2a 2a 20 61 72 65 20 75 73 65 64 2c 20 74 68 65  ** are used, the
1f60: 20 6c 6f 63 6b 20 69 73 20 70 6c 61 63 65 64 20   lock is placed 
1f70: 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 61 6e 67  on the same rang
1f80: 65 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20  e of bytes that 
1f90: 69 73 20 75 73 65 64 0a 2a 2a 20 66 6f 72 20 70  is used.** for p
1fa0: 72 6f 62 61 62 69 6c 69 73 74 69 63 20 6c 6f 63  robabilistic loc
1fb0: 6b 69 6e 67 20 69 6e 20 57 69 6e 39 35 2f 39 38  king in Win95/98
1fc0: 2f 4d 45 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  /ME.  Hence, the
1fd0: 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 0a   locking scheme.
1fe0: 2a 2a 20 77 69 6c 6c 20 73 75 70 70 6f 72 74 20  ** will support 
1ff0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 57 69 6e 39  two or more Win9
2000: 35 20 72 65 61 64 65 72 73 20 6f 72 20 74 77 6f  5 readers or two
2010: 20 6f 72 20 6d 6f 72 65 20 57 69 6e 4e 54 20 72   or more WinNT r
2020: 65 61 64 65 72 73 2e 0a 2a 2a 20 42 75 74 20 61  eaders..** But a
2030: 20 73 69 6e 67 6c 65 20 57 69 6e 39 35 20 72 65   single Win95 re
2040: 61 64 65 72 20 77 69 6c 6c 20 6c 6f 63 6b 20 6f  ader will lock o
2050: 75 74 20 61 6c 6c 20 57 69 6e 4e 54 20 72 65 61  ut all WinNT rea
2060: 64 65 72 73 20 61 6e 64 20 61 20 73 69 6e 67 6c  ders and a singl
2070: 65 0a 2a 2a 20 57 69 6e 4e 54 20 72 65 61 64 65  e.** WinNT reade
2080: 72 20 77 69 6c 6c 20 6c 6f 63 6b 20 6f 75 74 20  r will lock out 
2090: 61 6c 6c 20 6f 74 68 65 72 20 57 69 6e 39 35 20  all other Win95 
20a0: 72 65 61 64 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54  readers..**.** T
20b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 23 64 65  he following #de
20c0: 66 69 6e 65 73 20 73 70 65 63 69 66 79 20 74 68  fines specify th
20d0: 65 20 72 61 6e 67 65 20 6f 66 20 62 79 74 65 73  e range of bytes
20e0: 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
20f0: 67 2e 0a 2a 2a 20 53 48 41 52 45 44 5f 53 49 5a  g..** SHARED_SIZ
2100: 45 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  E is the number 
2110: 6f 66 20 62 79 74 65 73 20 61 76 61 69 6c 61 62  of bytes availab
2120: 6c 65 20 69 6e 20 74 68 65 20 70 6f 6f 6c 20 66  le in the pool f
2130: 72 6f 6d 20 77 68 69 63 68 0a 2a 2a 20 61 20 72  rom which.** a r
2140: 61 6e 64 6f 6d 20 62 79 74 65 20 69 73 20 73 65  andom byte is se
2150: 6c 65 63 74 65 64 20 66 6f 72 20 61 20 73 68 61  lected for a sha
2160: 72 65 64 20 6c 6f 63 6b 2e 20 20 54 68 65 20 70  red lock.  The p
2170: 6f 6f 6c 20 6f 66 20 62 79 74 65 73 20 66 6f 72  ool of bytes for
2180: 0a 2a 2a 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  .** shared locks
2190: 20 62 65 67 69 6e 73 20 61 74 20 53 48 41 52 45   begins at SHARE
21a0: 44 5f 46 49 52 53 54 2e 20 0a 2a 2a 0a 2a 2a 20  D_FIRST. .**.** 
21b0: 54 68 65 73 65 20 23 64 65 66 69 6e 65 73 20 61  These #defines a
21c0: 72 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  re available in 
21d0: 73 71 6c 69 74 65 5f 61 75 78 2e 68 20 73 6f 20  sqlite_aux.h so 
21e0: 74 68 61 74 20 61 64 61 70 74 6f 72 73 20 66 6f  that adaptors fo
21f0: 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6e 67 20  r.** connecting 
2200: 53 51 4c 69 74 65 20 74 6f 20 6f 74 68 65 72 20  SQLite to other 
2210: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
2220: 73 20 63 61 6e 20 75 73 65 20 74 68 65 20 73 61  s can use the sa
2230: 6d 65 20 62 79 74 65 0a 2a 2a 20 72 61 6e 67 65  me byte.** range
2240: 73 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 2e 20 20  s for locking.  
2250: 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74  In particular, t
2260: 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20  he same locking 
2270: 73 74 72 61 74 65 67 79 20 61 6e 64 0a 2a 2a 20  strategy and.** 
2280: 62 79 74 65 20 72 61 6e 67 65 73 20 61 72 65 20  byte ranges are 
2290: 75 73 65 64 20 66 6f 72 20 55 6e 69 78 2e 20 20  used for Unix.  
22a0: 54 68 69 73 20 6c 65 61 76 65 73 20 6f 70 65 6e  This leaves open
22b0: 20 74 68 65 20 70 6f 73 73 69 62 6c 69 74 79 20   the possiblity 
22c0: 6f 66 20 68 61 76 69 6e 67 0a 2a 2a 20 63 6c 69  of having.** cli
22d0: 65 6e 74 73 20 6f 6e 20 77 69 6e 39 35 2c 20 77  ents on win95, w
22e0: 69 6e 4e 54 2c 20 61 6e 64 20 75 6e 69 78 20 61  inNT, and unix a
22f0: 6c 6c 20 74 61 6c 6b 69 6e 67 20 74 6f 20 74 68  ll talking to th
2300: 65 20 73 61 6d 65 20 73 68 61 72 65 64 20 66 69  e same shared fi
2310: 6c 65 0a 2a 2a 20 61 6e 64 20 61 6c 6c 20 6c 6f  le.** and all lo
2320: 63 6b 69 6e 67 20 63 6f 72 72 65 63 74 6c 79 2e  cking correctly.
2330: 20 20 54 6f 20 64 6f 20 73 6f 20 77 6f 75 6c 64    To do so would
2340: 20 72 65 71 75 69 72 65 20 74 68 61 74 20 73 61   require that sa
2350: 6d 62 61 20 28 6f 72 20 77 68 61 74 65 76 65 72  mba (or whatever
2360: 0a 2a 2a 20 74 6f 6f 6c 20 69 73 20 62 65 69 6e  .** tool is bein
2370: 67 20 75 73 65 64 20 66 6f 72 20 66 69 6c 65 20  g used for file 
2380: 73 68 61 72 69 6e 67 29 20 69 6d 70 6c 65 6d 65  sharing) impleme
2390: 6e 74 73 20 6c 6f 63 6b 73 20 63 6f 72 72 65 63  nts locks correc
23a0: 74 6c 79 20 62 65 74 77 65 65 6e 0a 2a 2a 20 77  tly between.** w
23b0: 69 6e 64 6f 77 73 20 61 6e 64 20 75 6e 69 78 2e  indows and unix.
23c0: 20 20 49 27 6d 20 67 75 65 73 73 69 6e 67 20 74    I'm guessing t
23d0: 68 61 74 20 69 73 6e 27 74 20 6c 69 6b 65 6c 79  hat isn't likely
23e0: 20 74 6f 20 68 61 70 70 65 6e 2c 20 62 75 74 20   to happen, but 
23f0: 62 79 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  by.** using the 
2400: 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e  same locking ran
2410: 67 65 20 77 65 20 61 72 65 20 61 74 20 6c 65 61  ge we are at lea
2420: 73 74 20 6f 70 65 6e 20 74 6f 20 74 68 65 20 70  st open to the p
2430: 6f 73 73 69 62 69 6c 69 74 79 2e 0a 2a 2a 0a 2a  ossibility..**.*
2440: 2a 20 4c 6f 63 6b 69 6e 67 20 69 6e 20 77 69 6e  * Locking in win
2450: 64 6f 77 73 20 69 73 20 6d 61 6e 64 69 74 6f 72  dows is manditor
2460: 79 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65 61  y.  For this rea
2470: 73 6f 6e 2c 20 77 65 20 63 61 6e 6e 6f 74 20 73  son, we cannot s
2480: 74 6f 72 65 0a 2a 2a 20 61 63 74 75 61 6c 20 64  tore.** actual d
2490: 61 74 61 20 69 6e 20 74 68 65 20 62 79 74 65 73  ata in the bytes
24a0: 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
24b0: 67 2e 20 20 54 68 65 20 70 61 67 65 72 20 6e 65  g.  The pager ne
24c0: 76 65 72 20 61 6c 6c 6f 63 61 74 65 73 0a 2a 2a  ver allocates.**
24d0: 20 74 68 65 20 70 61 67 65 73 20 69 6e 76 6f 6c   the pages invol
24e0: 76 65 64 20 69 6e 20 6c 6f 63 6b 69 6e 67 20 74  ved in locking t
24f0: 68 65 72 65 66 6f 72 65 2e 20 20 53 48 41 52 45  herefore.  SHARE
2500: 44 5f 53 49 5a 45 20 69 73 20 73 65 6c 65 63 74  D_SIZE is select
2510: 65 64 20 73 6f 0a 2a 2a 20 74 68 61 74 20 61 6c  ed so.** that al
2520: 6c 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 66 69 74  l locks will fit
2530: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 70 61 67   on a single pag
2540: 65 20 65 76 65 6e 20 61 74 20 74 68 65 20 6d 69  e even at the mi
2550: 6e 69 6d 75 6d 20 70 61 67 65 20 73 69 7a 65 2e  nimum page size.
2560: 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  .** PENDING_BYTE
2570: 20 64 65 66 69 6e 65 73 20 74 68 65 20 62 65 67   defines the beg
2580: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f  inning of the lo
2590: 63 6b 73 2e 20 20 42 79 20 64 65 66 61 75 6c 74  cks.  By default
25a0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a 2a 2a   PENDING_BYTE.**
25b0: 20 69 73 20 73 65 74 20 68 69 67 68 20 73 6f 20   is set high so 
25c0: 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 68 61  that we don't ha
25d0: 76 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ve to allocate a
25e0: 6e 20 75 6e 75 73 65 64 20 70 61 67 65 20 65 78  n unused page ex
25f0: 63 65 70 74 0a 2a 2a 20 66 6f 72 20 76 65 72 79  cept.** for very
2600: 20 6c 61 72 67 65 20 64 61 74 61 62 61 73 65 73   large databases
2610: 2e 20 20 42 75 74 20 6f 6e 65 20 73 68 6f 75 6c  .  But one shoul
2620: 64 20 74 65 73 74 20 74 68 65 20 70 61 67 65 20  d test the page 
2630: 73 6b 69 70 70 69 6e 67 20 6c 6f 67 69 63 20 0a  skipping logic .
2640: 2a 2a 20 62 79 20 73 65 74 74 69 6e 67 20 50 45  ** by setting PE
2650: 4e 44 49 4e 47 5f 42 59 54 45 20 6c 6f 77 20 61  NDING_BYTE low a
2660: 6e 64 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 65  nd running the e
2670: 6e 74 69 72 65 20 72 65 67 72 65 73 73 69 6f 6e  ntire regression
2680: 20 73 75 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 43 68   suite..**.** Ch
2690: 61 6e 67 69 6e 67 20 74 68 65 20 76 61 6c 75 65  anging the value
26a0: 20 6f 66 20 50 45 4e 44 49 4e 47 5f 42 59 54 45   of PENDING_BYTE
26b0: 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 73 75   results in a su
26c0: 62 74 6c 79 20 69 6e 63 6f 6d 70 61 74 69 62 6c  btly incompatibl
26d0: 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 6d 61 74  e.** file format
26e0: 2e 20 20 44 65 70 65 6e 64 69 6e 67 20 6f 6e 20  .  Depending on 
26f0: 68 6f 77 20 69 74 20 69 73 20 63 68 61 6e 67 65  how it is change
2700: 64 2c 20 79 6f 75 20 6d 69 67 68 74 20 6e 6f 74  d, you might not
2710: 20 6e 6f 74 69 63 65 0a 2a 2a 20 74 68 65 20 69   notice.** the i
2720: 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 72  ncompatibility r
2730: 69 67 68 74 20 61 77 61 79 2c 20 65 76 65 6e 20  ight away, even 
2740: 72 75 6e 6e 69 6e 67 20 61 20 66 75 6c 6c 20 72  running a full r
2750: 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74 2e 0a  egression test..
2760: 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 6c  ** The default l
2770: 6f 63 61 74 69 6f 6e 20 6f 66 20 50 45 4e 44 49  ocation of PENDI
2780: 4e 47 5f 42 59 54 45 20 69 73 20 74 68 65 20 66  NG_BYTE is the f
2790: 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
27a0: 68 65 0a 2a 2a 20 31 47 42 20 62 6f 75 6e 64 61  he.** 1GB bounda
27b0: 72 79 2e 0a 2a 2a 0a 2a 2f 0a 23 69 66 6e 64 65  ry..**.*/.#ifnde
27c0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 23 64  f SQLITE_TEST.#d
27d0: 65 66 69 6e 65 20 50 45 4e 44 49 4e 47 5f 42 59  efine PENDING_BY
27e0: 54 45 20 20 20 20 20 20 30 78 34 30 30 30 30 30  TE      0x400000
27f0: 30 30 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74  00  /* First byt
2800: 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62  e past the 1GB b
2810: 6f 75 6e 64 61 72 79 20 2a 2f 0a 23 65 6c 73 65  oundary */.#else
2820: 0a 65 78 74 65 72 6e 20 75 6e 73 69 67 6e 65 64  .extern unsigned
2830: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 65 6e   int sqlite3_pen
2840: 64 69 6e 67 5f 62 79 74 65 3b 0a 23 64 65 66 69  ding_byte;.#defi
2850: 6e 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  ne PENDING_BYTE 
2860: 73 71 6c 69 74 65 33 5f 70 65 6e 64 69 6e 67 5f  sqlite3_pending_
2870: 62 79 74 65 0a 23 65 6e 64 69 66 0a 0a 23 64 65  byte.#endif..#de
2880: 66 69 6e 65 20 52 45 53 45 52 56 45 44 5f 42 59  fine RESERVED_BY
2890: 54 45 20 20 20 20 20 28 50 45 4e 44 49 4e 47 5f  TE     (PENDING_
28a0: 42 59 54 45 2b 31 29 0a 23 64 65 66 69 6e 65 20  BYTE+1).#define 
28b0: 53 48 41 52 45 44 5f 46 49 52 53 54 20 20 20 20  SHARED_FIRST    
28c0: 20 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b    (PENDING_BYTE+
28d0: 32 29 0a 23 64 65 66 69 6e 65 20 53 48 41 52 45  2).#define SHARE
28e0: 44 5f 53 49 5a 45 20 20 20 20 20 20 20 35 31 30  D_SIZE       510
28f0: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 74 6f 74 79 70  ../*.** Prototyp
2900: 65 73 20 66 6f 72 20 6f 70 65 72 61 74 69 6e 67  es for operating
2910: 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63   system interfac
2920: 65 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2f 0a 69  e routines..*/.i
2930: 6e 74 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  nt sqlite3OsClos
2940: 65 28 4f 73 46 69 6c 65 2a 2a 29 3b 0a 69 6e 74  e(OsFile**);.int
2950: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69   sqlite3OsOpenDi
2960: 72 65 63 74 6f 72 79 28 4f 73 46 69 6c 65 2a 2c  rectory(OsFile*,
2970: 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 69   const char*);.i
2980: 6e 74 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64  nt sqlite3OsRead
2990: 28 4f 73 46 69 6c 65 2a 2c 20 76 6f 69 64 2a 2c  (OsFile*, void*,
29a0: 20 69 6e 74 20 61 6d 74 29 3b 0a 69 6e 74 20 73   int amt);.int s
29b0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 4f 73  qlite3OsWrite(Os
29c0: 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 76 6f 69  File*, const voi
29d0: 64 2a 2c 20 69 6e 74 20 61 6d 74 29 3b 0a 69 6e  d*, int amt);.in
29e0: 74 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  t sqlite3OsSeek(
29f0: 4f 73 46 69 6c 65 2a 2c 20 69 36 34 20 6f 66 66  OsFile*, i64 off
2a00: 73 65 74 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  set);.int sqlite
2a10: 33 4f 73 54 72 75 6e 63 61 74 65 28 4f 73 46 69  3OsTruncate(OsFi
2a20: 6c 65 2a 2c 20 69 36 34 20 73 69 7a 65 29 3b 0a  le*, i64 size);.
2a30: 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  int sqlite3OsSyn
2a40: 63 28 4f 73 46 69 6c 65 2a 2c 20 69 6e 74 29 3b  c(OsFile*, int);
2a50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 73 53  .void sqlite3OsS
2a60: 65 74 46 75 6c 6c 53 79 6e 63 28 4f 73 46 69 6c  etFullSync(OsFil
2a70: 65 20 2a 69 64 2c 20 69 6e 74 20 73 65 74 74 69  e *id, int setti
2a80: 6e 67 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  ng);.int sqlite3
2a90: 4f 73 46 69 6c 65 48 61 6e 64 6c 65 28 4f 73 46  OsFileHandle(OsF
2aa0: 69 6c 65 20 2a 69 64 29 3b 0a 69 6e 74 20 73 71  ile *id);.int sq
2ab0: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
2ac0: 4f 73 46 69 6c 65 2a 2c 20 69 36 34 20 2a 70 53  OsFile*, i64 *pS
2ad0: 69 7a 65 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  ize);.int sqlite
2ae0: 33 4f 73 4c 6f 63 6b 28 4f 73 46 69 6c 65 2a 2c  3OsLock(OsFile*,
2af0: 20 69 6e 74 29 3b 0a 69 6e 74 20 73 71 6c 69 74   int);.int sqlit
2b00: 65 33 4f 73 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c  e3OsUnlock(OsFil
2b10: 65 2a 2c 20 69 6e 74 29 3b 0a 69 6e 74 20 73 71  e*, int);.int sq
2b20: 6c 69 74 65 33 4f 73 4c 6f 63 6b 53 74 61 74 65  lite3OsLockState
2b30: 28 4f 73 46 69 6c 65 20 2a 69 64 29 3b 0a 69 6e  (OsFile *id);.in
2b40: 74 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  t sqlite3OsCheck
2b50: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 4f 73 46  ReservedLock(OsF
2b60: 69 6c 65 20 2a 69 64 29 3b 0a 69 6e 74 20 73 71  ile *id);.int sq
2b70: 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57  lite3OsOpenReadW
2b80: 72 69 74 65 28 63 6f 6e 73 74 20 63 68 61 72 2a  rite(const char*
2b90: 2c 20 4f 73 46 69 6c 65 2a 2a 2c 20 69 6e 74 2a  , OsFile**, int*
2ba0: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73  );.int sqlite3Os
2bb0: 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 63 6f  OpenExclusive(co
2bc0: 6e 73 74 20 63 68 61 72 2a 2c 20 4f 73 46 69 6c  nst char*, OsFil
2bd0: 65 2a 2a 2c 20 69 6e 74 29 3b 0a 69 6e 74 20 73  e**, int);.int s
2be0: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
2bf0: 4f 6e 6c 79 28 63 6f 6e 73 74 20 63 68 61 72 2a  Only(const char*
2c00: 2c 20 4f 73 46 69 6c 65 2a 2a 29 3b 0a 69 6e 74  , OsFile**);.int
2c10: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
2c20: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 69  (const char*);.i
2c30: 6e 74 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  nt sqlite3OsFile
2c40: 45 78 69 73 74 73 28 63 6f 6e 73 74 20 63 68 61  Exists(const cha
2c50: 72 2a 29 3b 0a 63 68 61 72 20 2a 73 71 6c 69 74  r*);.char *sqlit
2c60: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
2c70: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 69  (const char*);.i
2c80: 6e 74 20 73 71 6c 69 74 65 33 4f 73 49 73 44 69  nt sqlite3OsIsDi
2c90: 72 57 72 69 74 61 62 6c 65 28 63 68 61 72 2a 29  rWritable(char*)
2ca0: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 53  ;.int sqlite3OsS
2cb0: 79 6e 63 44 69 72 65 63 74 6f 72 79 28 63 6f 6e  yncDirectory(con
2cc0: 73 74 20 63 68 61 72 2a 29 3b 0a 69 6e 74 20 73  st char*);.int s
2cd0: 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65  qlite3OsTempFile
2ce0: 4e 61 6d 65 28 63 68 61 72 2a 29 3b 0a 69 6e 74  Name(char*);.int
2cf0: 20 73 71 6c 69 74 65 33 4f 73 52 61 6e 64 6f 6d   sqlite3OsRandom
2d00: 53 65 65 64 28 63 68 61 72 2a 29 3b 0a 69 6e 74  Seed(char*);.int
2d10: 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28   sqlite3OsSleep(
2d20: 69 6e 74 20 6d 73 29 3b 0a 69 6e 74 20 73 71 6c  int ms);.int sql
2d30: 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d  ite3OsCurrentTim
2d40: 65 28 64 6f 75 62 6c 65 2a 29 3b 0a 76 6f 69 64  e(double*);.void
2d50: 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d   sqlite3OsEnterM
2d60: 75 74 65 78 28 76 6f 69 64 29 3b 0a 76 6f 69 64  utex(void);.void
2d70: 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d   sqlite3OsLeaveM
2d80: 75 74 65 78 28 76 6f 69 64 29 3b 0a 69 6e 74 20  utex(void);.int 
2d90: 73 71 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65 78  sqlite3OsInMutex
2da0: 28 76 6f 69 64 29 3b 0a 76 6f 69 64 20 2a 73 71  (void);.void *sq
2db0: 6c 69 74 65 33 4f 73 54 68 72 65 61 64 53 70 65  lite3OsThreadSpe
2dc0: 63 69 66 69 63 44 61 74 61 28 69 6e 74 29 3b 0a  cificData(int);.
2dd0: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 4f 73 4d  void *sqlite3OsM
2de0: 61 6c 6c 6f 63 28 69 6e 74 29 3b 0a 76 6f 69 64  alloc(int);.void
2df0: 20 2a 73 71 6c 69 74 65 33 4f 73 52 65 61 6c 6c   *sqlite3OsReall
2e00: 6f 63 28 76 6f 69 64 20 2a 2c 20 69 6e 74 29 3b  oc(void *, int);
2e10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 73 46  .void sqlite3OsF
2e20: 72 65 65 28 76 6f 69 64 20 2a 29 3b 0a 69 6e 74  ree(void *);.int
2e30: 20 73 71 6c 69 74 65 33 4f 73 41 6c 6c 6f 63 61   sqlite3OsAlloca
2e40: 74 69 6f 6e 53 69 7a 65 28 76 6f 69 64 20 2a 29  tionSize(void *)
2e50: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  ;../*.** If the 
2e60: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 45  SQLITE_ENABLE_RE
2e70: 44 45 46 5f 49 4f 20 6d 61 63 72 6f 20 69 73 20  DEF_IO macro is 
2e80: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68  defined, then th
2e90: 65 20 4f 53 2d 6c 61 79 65 72 0a 2a 2a 20 69 6e  e OS-layer.** in
2ea0: 74 65 72 66 61 63 65 20 72 6f 75 74 69 6e 65 73  terface routines
2eb0: 20 61 72 65 20 6e 6f 74 20 63 61 6c 6c 65 64 20   are not called 
2ec0: 64 69 72 65 63 74 6c 79 20 62 75 74 20 61 72 65  directly but are
2ed0: 20 69 6e 76 6f 6b 65 64 20 75 73 69 6e 67 0a 2a   invoked using.*
2ee0: 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 75  * pointers to fu
2ef0: 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 61  nctions.  This a
2f00: 6c 6c 6f 77 73 20 74 68 65 20 69 6d 70 6c 65 6d  llows the implem
2f10: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 76 61 72 69  entation of vari
2f20: 6f 75 73 0a 2a 2a 20 4f 53 2d 6c 61 79 65 72 20  ous.** OS-layer 
2f30: 69 6e 74 65 72 66 61 63 65 20 72 6f 75 74 69 6e  interface routin
2f40: 65 73 20 74 6f 20 62 65 20 6d 6f 64 69 66 69 65  es to be modifie
2f50: 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 20 20  d at run-time.  
2f60: 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f 62 73  There are.** obs
2f70: 63 75 72 65 20 62 75 74 20 6c 65 67 69 74 69 6d  cure but legitim
2f80: 61 74 65 20 72 65 61 73 6f 6e 73 20 66 6f 72 20  ate reasons for 
2f90: 77 61 6e 74 69 6e 67 20 74 6f 20 64 6f 20 74 68  wanting to do th
2fa0: 69 73 2e 20 20 42 75 74 20 66 6f 72 0a 2a 2a 20  is.  But for.** 
2fb0: 6d 6f 73 74 20 75 73 65 72 73 2c 20 61 20 64 69  most users, a di
2fc0: 72 65 63 74 20 63 61 6c 6c 20 74 6f 20 74 68 65  rect call to the
2fd0: 20 75 6e 64 65 72 6c 79 69 6e 67 20 69 6e 74 65   underlying inte
2fe0: 72 66 61 63 65 20 69 73 20 70 72 65 66 65 72 61  rface is prefera
2ff0: 62 6c 65 0a 2a 2a 20 73 6f 20 74 68 65 20 74 68  ble.** so the th
3000: 65 20 72 65 64 65 66 69 6e 61 62 6c 65 20 49 2f  e redefinable I/
3010: 4f 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74  O interface is t
3020: 75 72 6e 65 64 20 6f 66 66 20 62 79 20 64 65 66  urned off by def
3030: 61 75 6c 74 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ault..*/.#ifdef 
3040: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 45  SQLITE_ENABLE_RE
3050: 44 45 46 5f 49 4f 0a 0a 2f 2a 0a 2a 2a 20 57 68  DEF_IO../*.** Wh
3060: 65 6e 20 72 65 64 65 66 69 6e 61 62 6c 65 20 49  en redefinable I
3070: 2f 4f 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61  /O is enabled, a
3080: 20 73 69 6e 67 6c 65 20 67 6c 6f 62 61 6c 20 69   single global i
3090: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 0a 2a  nstance of the.*
30a0: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  * following stru
30b0: 63 74 75 72 65 20 68 6f 6c 64 73 20 70 6f 69 6e  cture holds poin
30c0: 74 65 72 73 20 74 6f 20 74 68 65 20 72 6f 75 74  ters to the rout
30d0: 69 6e 65 73 20 74 68 61 74 20 53 51 4c 69 74 65  ines that SQLite
30e0: 20 0a 2a 2a 20 75 73 65 73 20 74 6f 20 74 61 6c   .** uses to tal
30f0: 6b 20 77 69 74 68 20 74 68 65 20 75 6e 64 65 72  k with the under
3100: 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20  lying operating 
3110: 73 79 73 74 65 6d 2e 20 20 4d 6f 64 69 66 79 20  system.  Modify 
3120: 74 68 69 73 0a 2a 2a 20 73 74 72 75 63 74 75 72  this.** structur
3130: 65 20 28 62 65 66 6f 72 65 20 75 73 69 6e 67 20  e (before using 
3140: 61 6e 79 20 53 51 4c 69 74 65 20 41 50 49 21 29  any SQLite API!)
3150: 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 70   to accomodate p
3160: 65 72 63 75 6c 69 61 72 0a 2a 2a 20 6f 70 65 72  erculiar.** oper
3170: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74  ating system int
3180: 65 72 66 61 63 65 73 20 6f 72 20 62 65 68 61 76  erfaces or behav
3190: 69 6f 72 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  iors..*/.struct 
31a0: 73 71 6c 69 74 65 33 4f 73 56 74 62 6c 20 7b 0a  sqlite3OsVtbl {.
31b0: 20 20 69 6e 74 20 28 2a 78 4f 70 65 6e 52 65 61    int (*xOpenRea
31c0: 64 57 72 69 74 65 29 28 63 6f 6e 73 74 20 63 68  dWrite)(const ch
31d0: 61 72 2a 2c 20 4f 73 46 69 6c 65 2a 2a 2c 20 69  ar*, OsFile**, i
31e0: 6e 74 2a 29 3b 0a 20 20 69 6e 74 20 28 2a 78 4f  nt*);.  int (*xO
31f0: 70 65 6e 45 78 63 6c 75 73 69 76 65 29 28 63 6f  penExclusive)(co
3200: 6e 73 74 20 63 68 61 72 2a 2c 20 4f 73 46 69 6c  nst char*, OsFil
3210: 65 2a 2a 2c 20 69 6e 74 29 3b 0a 20 20 69 6e 74  e**, int);.  int
3220: 20 28 2a 78 4f 70 65 6e 52 65 61 64 4f 6e 6c 79   (*xOpenReadOnly
3230: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 4f  )(const char*, O
3240: 73 46 69 6c 65 2a 2a 29 3b 0a 0a 20 20 69 6e 74  sFile**);..  int
3250: 20 28 2a 78 44 65 6c 65 74 65 29 28 63 6f 6e 73   (*xDelete)(cons
3260: 74 20 63 68 61 72 2a 29 3b 0a 20 20 69 6e 74 20  t char*);.  int 
3270: 28 2a 78 46 69 6c 65 45 78 69 73 74 73 29 28 63  (*xFileExists)(c
3280: 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 63  onst char*);.  c
3290: 68 61 72 20 2a 28 2a 78 46 75 6c 6c 50 61 74 68  har *(*xFullPath
32a0: 6e 61 6d 65 29 28 63 6f 6e 73 74 20 63 68 61 72  name)(const char
32b0: 2a 29 3b 0a 20 20 69 6e 74 20 28 2a 78 49 73 44  *);.  int (*xIsD
32c0: 69 72 57 72 69 74 61 62 6c 65 29 28 63 68 61 72  irWritable)(char
32d0: 2a 29 3b 0a 20 20 69 6e 74 20 28 2a 78 53 79 6e  *);.  int (*xSyn
32e0: 63 44 69 72 65 63 74 6f 72 79 29 28 63 6f 6e 73  cDirectory)(cons
32f0: 74 20 63 68 61 72 2a 29 3b 0a 20 20 69 6e 74 20  t char*);.  int 
3300: 28 2a 78 54 65 6d 70 46 69 6c 65 4e 61 6d 65 29  (*xTempFileName)
3310: 28 63 68 61 72 2a 29 3b 0a 0a 20 20 69 6e 74 20  (char*);..  int 
3320: 28 2a 78 52 61 6e 64 6f 6d 53 65 65 64 29 28 63  (*xRandomSeed)(c
3330: 68 61 72 2a 29 3b 0a 20 20 69 6e 74 20 28 2a 78  har*);.  int (*x
3340: 53 6c 65 65 70 29 28 69 6e 74 20 6d 73 29 3b 0a  Sleep)(int ms);.
3350: 20 20 69 6e 74 20 28 2a 78 43 75 72 72 65 6e 74    int (*xCurrent
3360: 54 69 6d 65 29 28 64 6f 75 62 6c 65 2a 29 3b 0a  Time)(double*);.
3370: 0a 20 20 76 6f 69 64 20 28 2a 78 45 6e 74 65 72  .  void (*xEnter
3380: 4d 75 74 65 78 29 28 76 6f 69 64 29 3b 0a 20 20  Mutex)(void);.  
3390: 76 6f 69 64 20 28 2a 78 4c 65 61 76 65 4d 75 74  void (*xLeaveMut
33a0: 65 78 29 28 76 6f 69 64 29 3b 0a 20 20 69 6e 74  ex)(void);.  int
33b0: 20 28 2a 78 49 6e 4d 75 74 65 78 29 28 76 6f 69   (*xInMutex)(voi
33c0: 64 29 3b 0a 20 20 76 6f 69 64 20 2a 28 2a 78 54  d);.  void *(*xT
33d0: 68 72 65 61 64 53 70 65 63 69 66 69 63 44 61 74  hreadSpecificDat
33e0: 61 29 28 69 6e 74 29 3b 0a 0a 20 20 76 6f 69 64  a)(int);..  void
33f0: 20 2a 28 2a 78 4d 61 6c 6c 6f 63 29 28 69 6e 74   *(*xMalloc)(int
3400: 29 3b 0a 20 20 76 6f 69 64 20 2a 28 2a 78 52 65  );.  void *(*xRe
3410: 61 6c 6c 6f 63 29 28 76 6f 69 64 20 2a 2c 20 69  alloc)(void *, i
3420: 6e 74 29 3b 0a 20 20 76 6f 69 64 20 28 2a 78 46  nt);.  void (*xF
3430: 72 65 65 29 28 76 6f 69 64 20 2a 29 3b 0a 20 20  ree)(void *);.  
3440: 69 6e 74 20 28 2a 78 41 6c 6c 6f 63 61 74 69 6f  int (*xAllocatio
3450: 6e 53 69 7a 65 29 28 76 6f 69 64 20 2a 29 3b 0a  nSize)(void *);.
3460: 7d 3b 0a 0a 2f 2a 20 4d 61 63 72 6f 20 75 73 65  };../* Macro use
3470: 64 20 74 6f 20 63 6f 6d 6d 65 6e 74 20 6f 75 74  d to comment out
3480: 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 64   routines that d
3490: 6f 20 6e 6f 74 20 65 78 69 73 74 73 20 77 68 65  o not exists whe
34a0: 6e 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  n there is.** no
34b0: 20 64 69 73 6b 20 49 2f 4f 20 0a 2a 2f 0a 23 69   disk I/O .*/.#i
34c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
34d0: 5f 44 49 53 4b 49 4f 0a 23 20 64 65 66 69 6e 65  _DISKIO.# define
34e0: 20 49 46 5f 44 49 53 4b 49 4f 28 58 29 20 20 30   IF_DISKIO(X)  0
34f0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
3500: 49 46 5f 44 49 53 4b 49 4f 28 58 29 20 20 58 0a  IF_DISKIO(X)  X.
3510: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 5f  #endif..#ifdef _
3520: 53 51 4c 49 54 45 5f 4f 53 5f 43 5f 0a 20 20 2f  SQLITE_OS_C_.  /
3530: 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 73 2e 63 20  *.  ** The os.c 
3540: 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  file implements 
3550: 74 68 65 20 67 6c 6f 62 61 6c 20 76 69 72 74 75  the global virtu
3560: 61 6c 20 66 75 6e 63 74 69 6f 6e 20 74 61 62 6c  al function tabl
3570: 65 2e 0a 20 20 2a 2f 0a 20 20 73 74 72 75 63 74  e..  */.  struct
3580: 20 73 71 6c 69 74 65 33 4f 73 56 74 62 6c 20 73   sqlite3OsVtbl s
3590: 71 6c 69 74 65 33 4f 73 20 3d 20 7b 0a 20 20 20  qlite3Os = {.   
35a0: 20 49 46 5f 44 49 53 4b 49 4f 28 20 73 71 6c 69   IF_DISKIO( sqli
35b0: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69  te3OsOpenReadWri
35c0: 74 65 20 29 2c 0a 20 20 20 20 49 46 5f 44 49 53  te ),.    IF_DIS
35d0: 4b 49 4f 28 20 73 71 6c 69 74 65 33 4f 73 4f 70  KIO( sqlite3OsOp
35e0: 65 6e 45 78 63 6c 75 73 69 76 65 20 29 2c 0a 20  enExclusive ),. 
35f0: 20 20 20 49 46 5f 44 49 53 4b 49 4f 28 20 73 71     IF_DISKIO( sq
3600: 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f  lite3OsOpenReadO
3610: 6e 6c 79 20 29 2c 0a 20 20 20 20 49 46 5f 44 49  nly ),.    IF_DI
3620: 53 4b 49 4f 28 20 73 71 6c 69 74 65 33 4f 73 44  SKIO( sqlite3OsD
3630: 65 6c 65 74 65 20 29 2c 0a 20 20 20 20 49 46 5f  elete ),.    IF_
3640: 44 49 53 4b 49 4f 28 20 73 71 6c 69 74 65 33 4f  DISKIO( sqlite3O
3650: 73 46 69 6c 65 45 78 69 73 74 73 20 29 2c 0a 20  sFileExists ),. 
3660: 20 20 20 49 46 5f 44 49 53 4b 49 4f 28 20 73 71     IF_DISKIO( sq
3670: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
3680: 61 6d 65 20 29 2c 0a 20 20 20 20 49 46 5f 44 49  ame ),.    IF_DI
3690: 53 4b 49 4f 28 20 73 71 6c 69 74 65 33 4f 73 49  SKIO( sqlite3OsI
36a0: 73 44 69 72 57 72 69 74 61 62 6c 65 20 29 2c 0a  sDirWritable ),.
36b0: 20 20 20 20 49 46 5f 44 49 53 4b 49 4f 28 20 73      IF_DISKIO( s
36c0: 71 6c 69 74 65 33 4f 73 53 79 6e 63 44 69 72 65  qlite3OsSyncDire
36d0: 63 74 6f 72 79 20 29 2c 0a 20 20 20 20 49 46 5f  ctory ),.    IF_
36e0: 44 49 53 4b 49 4f 28 20 73 71 6c 69 74 65 33 4f  DISKIO( sqlite3O
36f0: 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 20 29 2c  sTempFileName ),
3700: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 52 61  .    sqlite3OsRa
3710: 6e 64 6f 6d 53 65 65 64 2c 0a 20 20 20 20 73 71  ndomSeed,.    sq
3720: 6c 69 74 65 33 4f 73 53 6c 65 65 70 2c 0a 20 20  lite3OsSleep,.  
3730: 20 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65    sqlite3OsCurre
3740: 6e 74 54 69 6d 65 2c 0a 20 20 20 20 73 71 6c 69  ntTime,.    sqli
3750: 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 2c  te3OsEnterMutex,
3760: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c 65  .    sqlite3OsLe
3770: 61 76 65 4d 75 74 65 78 2c 0a 20 20 20 20 73 71  aveMutex,.    sq
3780: 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65 78 2c 0a  lite3OsInMutex,.
3790: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 54 68 72      sqlite3OsThr
37a0: 65 61 64 53 70 65 63 69 66 69 63 44 61 74 61 2c  eadSpecificData,
37b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4d 61  .    sqlite3OsMa
37c0: 6c 6c 6f 63 2c 0a 20 20 20 20 73 71 6c 69 74 65  lloc,.    sqlite
37d0: 33 4f 73 52 65 61 6c 6c 6f 63 2c 0a 20 20 20 20  3OsRealloc,.    
37e0: 73 71 6c 69 74 65 33 4f 73 46 72 65 65 2c 0a 20  sqlite3OsFree,. 
37f0: 20 20 20 73 71 6c 69 74 65 33 4f 73 41 6c 6c 6f     sqlite3OsAllo
3800: 63 61 74 69 6f 6e 53 69 7a 65 0a 20 20 7d 3b 0a  cationSize.  };.
3810: 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20  #else.  /*.  ** 
3820: 46 69 6c 65 73 20 6f 74 68 65 72 20 74 68 61 6e  Files other than
3830: 20 6f 73 2e 63 20 6a 75 73 74 20 72 65 66 65 72   os.c just refer
3840: 65 6e 63 65 20 74 68 65 20 67 6c 6f 62 61 6c 20  ence the global 
3850: 76 69 72 74 75 61 6c 20 66 75 6e 63 74 69 6f 6e  virtual function
3860: 20 74 61 62 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20   table. .  */.  
3870: 65 78 74 65 72 6e 20 73 74 72 75 63 74 20 73 71  extern struct sq
3880: 6c 69 74 65 33 4f 73 56 74 62 6c 20 73 71 6c 69  lite3OsVtbl sqli
3890: 74 65 33 4f 73 3b 0a 23 65 6e 64 69 66 20 2f 2a  te3Os;.#endif /*
38a0: 20 5f 53 51 4c 49 54 45 5f 4f 53 5f 43 5f 20 2a   _SQLITE_OS_C_ *
38b0: 2f 0a 0a 0a 2f 2a 20 54 68 69 73 20 61 64 64 69  /.../* This addi
38c0: 74 69 6f 6e 61 6c 20 41 50 49 20 72 6f 75 74 69  tional API routi
38d0: 6e 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ne is available 
38e0: 77 69 74 68 20 72 65 64 65 66 69 6e 61 62 6c 65  with redefinable
38f0: 20 49 2f 4f 20 2a 2f 0a 73 74 72 75 63 74 20 73   I/O */.struct s
3900: 71 6c 69 74 65 33 4f 73 56 74 62 6c 20 2a 73 71  qlite3OsVtbl *sq
3910: 6c 69 74 65 33 5f 6f 73 5f 73 77 69 74 63 68 28  lite3_os_switch(
3920: 76 6f 69 64 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 52  void);.../*.** R
3930: 65 64 65 66 69 6e 65 20 74 68 65 20 4f 53 20 69  edefine the OS i
3940: 6e 74 65 72 66 61 63 65 20 74 6f 20 67 6f 20 74  nterface to go t
3950: 68 72 6f 75 67 68 20 74 68 65 20 76 69 72 74 75  hrough the virtu
3960: 61 6c 20 66 75 6e 63 74 69 6f 6e 20 74 61 62 6c  al function tabl
3970: 65 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  e.** rather than
3980: 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
3990: 73 20 64 69 72 65 63 74 6c 79 2e 0a 2a 2f 0a 23  s directly..*/.#
39a0: 75 6e 64 65 66 20 73 71 6c 69 74 65 33 4f 73 4f  undef sqlite3OsO
39b0: 70 65 6e 52 65 61 64 57 72 69 74 65 0a 23 75 6e  penReadWrite.#un
39c0: 64 65 66 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  def sqlite3OsOpe
39d0: 6e 45 78 63 6c 75 73 69 76 65 0a 23 75 6e 64 65  nExclusive.#unde
39e0: 66 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  f sqlite3OsOpenR
39f0: 65 61 64 4f 6e 6c 79 0a 23 75 6e 64 65 66 20 73  eadOnly.#undef s
3a00: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 0a 23  qlite3OsDelete.#
3a10: 75 6e 64 65 66 20 73 71 6c 69 74 65 33 4f 73 46  undef sqlite3OsF
3a20: 69 6c 65 45 78 69 73 74 73 0a 23 75 6e 64 65 66  ileExists.#undef
3a30: 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
3a40: 74 68 6e 61 6d 65 0a 23 75 6e 64 65 66 20 73 71  thname.#undef sq
3a50: 6c 69 74 65 33 4f 73 49 73 44 69 72 57 72 69 74  lite3OsIsDirWrit
3a60: 61 62 6c 65 0a 23 75 6e 64 65 66 20 73 71 6c 69  able.#undef sqli
3a70: 74 65 33 4f 73 53 79 6e 63 44 69 72 65 63 74 6f  te3OsSyncDirecto
3a80: 72 79 0a 23 75 6e 64 65 66 20 73 71 6c 69 74 65  ry.#undef sqlite
3a90: 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 0a  3OsTempFileName.
3aa0: 23 75 6e 64 65 66 20 73 71 6c 69 74 65 33 4f 73  #undef sqlite3Os
3ab0: 52 61 6e 64 6f 6d 53 65 65 64 0a 23 75 6e 64 65  RandomSeed.#unde
3ac0: 66 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70  f sqlite3OsSleep
3ad0: 0a 23 75 6e 64 65 66 20 73 71 6c 69 74 65 33 4f  .#undef sqlite3O
3ae0: 73 43 75 72 72 65 6e 74 54 69 6d 65 0a 23 75 6e  sCurrentTime.#un
3af0: 64 65 66 20 73 71 6c 69 74 65 33 4f 73 45 6e 74  def sqlite3OsEnt
3b00: 65 72 4d 75 74 65 78 0a 23 75 6e 64 65 66 20 73  erMutex.#undef s
3b10: 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74  qlite3OsLeaveMut
3b20: 65 78 0a 23 75 6e 64 65 66 20 73 71 6c 69 74 65  ex.#undef sqlite
3b30: 33 4f 73 49 6e 4d 75 74 65 78 0a 23 75 6e 64 65  3OsInMutex.#unde
3b40: 66 20 73 71 6c 69 74 65 33 4f 73 54 68 72 65 61  f sqlite3OsThrea
3b50: 64 53 70 65 63 69 66 69 63 44 61 74 61 0a 23 75  dSpecificData.#u
3b60: 6e 64 65 66 20 73 71 6c 69 74 65 33 4f 73 4d 61  ndef sqlite3OsMa
3b70: 6c 6c 6f 63 0a 23 75 6e 64 65 66 20 73 71 6c 69  lloc.#undef sqli
3b80: 74 65 33 4f 73 52 65 61 6c 6c 6f 63 0a 23 75 6e  te3OsRealloc.#un
3b90: 64 65 66 20 73 71 6c 69 74 65 33 4f 73 46 72 65  def sqlite3OsFre
3ba0: 65 0a 23 75 6e 64 65 66 20 73 71 6c 69 74 65 33  e.#undef sqlite3
3bb0: 4f 73 41 6c 6c 6f 63 61 74 69 6f 6e 53 69 7a 65  OsAllocationSize
3bc0: 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  .#define sqlite3
3bd0: 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 20  OsOpenReadWrite 
3be0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 2e 78       sqlite3Os.x
3bf0: 4f 70 65 6e 52 65 61 64 57 72 69 74 65 0a 23 64  OpenReadWrite.#d
3c00: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 4f 73 4f  efine sqlite3OsO
3c10: 70 65 6e 45 78 63 6c 75 73 69 76 65 20 20 20 20  penExclusive    
3c20: 20 20 73 71 6c 69 74 65 33 4f 73 2e 78 4f 70 65    sqlite3Os.xOpe
3c30: 6e 45 78 63 6c 75 73 69 76 65 0a 23 64 65 66 69  nExclusive.#defi
3c40: 6e 65 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  ne sqlite3OsOpen
3c50: 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20 20 73  ReadOnly       s
3c60: 71 6c 69 74 65 33 4f 73 2e 78 4f 70 65 6e 52 65  qlite3Os.xOpenRe
3c70: 61 64 4f 6e 6c 79 0a 23 64 65 66 69 6e 65 20 73  adOnly.#define s
3c80: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 20 20  qlite3OsDelete  
3c90: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
3ca0: 65 33 4f 73 2e 78 44 65 6c 65 74 65 0a 23 64 65  e3Os.xDelete.#de
3cb0: 66 69 6e 65 20 73 71 6c 69 74 65 33 4f 73 46 69  fine sqlite3OsFi
3cc0: 6c 65 45 78 69 73 74 73 20 20 20 20 20 20 20 20  leExists        
3cd0: 20 73 71 6c 69 74 65 33 4f 73 2e 78 46 69 6c 65   sqlite3Os.xFile
3ce0: 45 78 69 73 74 73 0a 23 64 65 66 69 6e 65 20 73  Exists.#define s
3cf0: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
3d00: 6e 61 6d 65 20 20 20 20 20 20 20 73 71 6c 69 74  name       sqlit
3d10: 65 33 4f 73 2e 78 46 75 6c 6c 50 61 74 68 6e 61  e3Os.xFullPathna
3d20: 6d 65 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  me.#define sqlit
3d30: 65 33 4f 73 49 73 44 69 72 57 72 69 74 61 62 6c  e3OsIsDirWritabl
3d40: 65 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  e      sqlite3Os
3d50: 2e 78 49 73 44 69 72 57 72 69 74 61 62 6c 65 0a  .xIsDirWritable.
3d60: 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 4f  #define sqlite3O
3d70: 73 53 79 6e 63 44 69 72 65 63 74 6f 72 79 20 20  sSyncDirectory  
3d80: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 2e 78 53      sqlite3Os.xS
3d90: 79 6e 63 44 69 72 65 63 74 6f 72 79 0a 23 64 65  yncDirectory.#de
3da0: 66 69 6e 65 20 73 71 6c 69 74 65 33 4f 73 54 65  fine sqlite3OsTe
3db0: 6d 70 46 69 6c 65 4e 61 6d 65 20 20 20 20 20 20  mpFileName      
3dc0: 20 73 71 6c 69 74 65 33 4f 73 2e 78 54 65 6d 70   sqlite3Os.xTemp
3dd0: 46 69 6c 65 4e 61 6d 65 0a 23 64 65 66 69 6e 65  FileName.#define
3de0: 20 73 71 6c 69 74 65 33 4f 73 52 61 6e 64 6f 6d   sqlite3OsRandom
3df0: 53 65 65 64 20 20 20 20 20 20 20 20 20 73 71 6c  Seed         sql
3e00: 69 74 65 33 4f 73 2e 78 52 61 6e 64 6f 6d 53 65  ite3Os.xRandomSe
3e10: 65 64 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  ed.#define sqlit
3e20: 65 33 4f 73 53 6c 65 65 70 20 20 20 20 20 20 20  e3OsSleep       
3e30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
3e40: 2e 78 53 6c 65 65 70 0a 23 64 65 66 69 6e 65 20  .xSleep.#define 
3e50: 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74  sqlite3OsCurrent
3e60: 54 69 6d 65 20 20 20 20 20 20 20 20 73 71 6c 69  Time        sqli
3e70: 74 65 33 4f 73 2e 78 43 75 72 72 65 6e 74 54 69  te3Os.xCurrentTi
3e80: 6d 65 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  me.#define sqlit
3e90: 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 20 20  e3OsEnterMutex  
3ea0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
3eb0: 2e 78 45 6e 74 65 72 4d 75 74 65 78 0a 23 64 65  .xEnterMutex.#de
3ec0: 66 69 6e 65 20 73 71 6c 69 74 65 33 4f 73 4c 65  fine sqlite3OsLe
3ed0: 61 76 65 4d 75 74 65 78 20 20 20 20 20 20 20 20  aveMutex        
3ee0: 20 73 71 6c 69 74 65 33 4f 73 2e 78 4c 65 61 76   sqlite3Os.xLeav
3ef0: 65 4d 75 74 65 78 0a 23 64 65 66 69 6e 65 20 73  eMutex.#define s
3f00: 71 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65 78 20  qlite3OsInMutex 
3f10: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
3f20: 65 33 4f 73 2e 78 49 6e 4d 75 74 65 78 0a 23 64  e3Os.xInMutex.#d
3f30: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 4f 73 54  efine sqlite3OsT
3f40: 68 72 65 61 64 53 70 65 63 69 66 69 63 44 61 74  hreadSpecificDat
3f50: 61 20 73 71 6c 69 74 65 33 4f 73 2e 78 54 68 72  a sqlite3Os.xThr
3f60: 65 61 64 53 70 65 63 69 66 69 63 44 61 74 61 0a  eadSpecificData.
3f70: 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 4f  #define sqlite3O
3f80: 73 4d 61 6c 6c 6f 63 20 20 20 20 20 20 20 20 20  sMalloc         
3f90: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 2e 78 4d      sqlite3Os.xM
3fa0: 61 6c 6c 6f 63 0a 23 64 65 66 69 6e 65 20 73 71  alloc.#define sq
3fb0: 6c 69 74 65 33 4f 73 52 65 61 6c 6c 6f 63 20 20  lite3OsRealloc  
3fc0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
3fd0: 33 4f 73 2e 78 52 65 61 6c 6c 6f 63 0a 23 64 65  3Os.xRealloc.#de
3fe0: 66 69 6e 65 20 73 71 6c 69 74 65 33 4f 73 46 72  fine sqlite3OsFr
3ff0: 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ee              
4000: 20 73 71 6c 69 74 65 33 4f 73 2e 78 46 72 65 65   sqlite3Os.xFree
4010: 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  .#define sqlite3
4020: 4f 73 41 6c 6c 6f 63 61 74 69 6f 6e 53 69 7a 65  OsAllocationSize
4030: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 2e 78       sqlite3Os.x
4040: 41 6c 6c 6f 63 61 74 69 6f 6e 53 69 7a 65 0a 0a  AllocationSize..
4050: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
4060: 5f 45 4e 41 42 4c 45 5f 52 45 44 45 46 5f 49 4f  _ENABLE_REDEF_IO
4070: 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 5f   */..#endif /* _
4080: 53 51 4c 49 54 45 5f 4f 53 5f 48 5f 20 2a 2f 0a  SQLITE_OS_H_ */.